From 5aca2ba20f2d41d46dcce051a996f8baa25a6e0d Mon Sep 17 00:00:00 2001 From: Andrey Stepanov Date: Sat, 7 Dec 2024 23:25:41 +0500 Subject: [PATCH 1/2] Change techage to submodule --- .gitmodules | 3 + techage | 1 + techage/.test/sink.lua | 112 -- techage/.test/testblock.lua | 43 - techage/LICENSE.txt | 662 ------- techage/README.md | 408 ----- techage/_config.yml | 1 - techage/api.md | 225 --- techage/basic_machines/autocrafter.lua | 556 ------ techage/basic_machines/blackhole.lua | 89 - techage/basic_machines/chest.lua | 463 ----- techage/basic_machines/concentrator.lua | 154 -- techage/basic_machines/consumer.lua | 314 ---- techage/basic_machines/distributor.lua | 683 ------- techage/basic_machines/electronic_fab.lua | 314 ---- techage/basic_machines/forceload.lua | 340 ---- techage/basic_machines/foreign_nodes.lua | 159 -- techage/basic_machines/gravelrinser.lua | 341 ---- techage/basic_machines/gravelsieve.lua | 287 --- techage/basic_machines/grinder.lua | 435 ----- techage/basic_machines/itemsource.lua | 106 -- techage/basic_machines/liquidsampler.lua | 228 --- techage/basic_machines/mods_support.lua | 131 -- techage/basic_machines/pusher.lua | 438 ----- techage/basic_machines/quarry.lua | 457 ----- techage/basic_machines/recipeblock.lua | 243 --- techage/basic_machines/recycler.lua | 358 ---- techage/basic_machines/source.lua | 265 --- techage/basic_machines/ta4_chest.lua | 715 -------- techage/basic_machines/ta4_injector.lua | 331 ---- techage/basic_machines/ta5_chest.lua | 248 --- techage/basis/assemble.lua | 242 --- techage/basis/boiler_lib.lua | 150 -- techage/basis/command.lua | 691 ------- techage/basis/conf_inv.lua | 118 -- techage/basis/counting.lua | 71 - techage/basis/fake_player.lua | 117 -- techage/basis/firebox_lib.lua | 150 -- techage/basis/fly_lib.lua | 955 ---------- techage/basis/formspec_update.lua | 52 - techage/basis/fuel_lib.lua | 197 -- techage/basis/gravel_lib.lua | 102 -- techage/basis/hyperloop.lua | 240 --- techage/basis/laser_lib.lua | 146 -- techage/basis/legacy.lua | 25 - techage/basis/lib.lua | 633 ------- techage/basis/liquid_lib.lua | 278 --- techage/basis/manual.lua | 91 - techage/basis/mark.lua | 98 - techage/basis/mark2.lua | 128 -- techage/basis/mark_lib.lua | 130 -- techage/basis/node_states.lua | 561 ------ techage/basis/node_store.lua | 183 -- techage/basis/nodedata_meta.lua | 103 -- techage/basis/nodedata_sqlite.lua | 123 -- techage/basis/numbers_sqlite.lua | 142 -- techage/basis/numbers_storage.lua | 98 - techage/basis/oggfiles.lua | 103 -- techage/basis/pack_lib.lua | 88 - techage/basis/recipe_lib.lua | 292 --- techage/basis/shared_inv.lua | 74 - techage/basis/shared_tank.lua | 116 -- techage/basis/submenu.lua | 318 ---- techage/basis/teleport.lua | 167 -- techage/basis/tube_wall_entry.lua | 57 - techage/basis/tubes.lua | 148 -- techage/basis/tubes_ta4.lua | 120 -- techage/basis/windturbine_lib.lua | 86 - techage/beduino/kv_store.lua | 60 - techage/carts/chest_cart.lua | 181 -- techage/carts/tank_cart.lua | 176 -- techage/chemistry/ta4_doser.lua | 394 ---- techage/chemistry/ta4_liquid_filter.lua | 209 --- techage/chemistry/ta4_reactor.lua | 226 --- techage/chemistry/ta4_stand.lua | 209 --- techage/coal_power_station/boiler_base.lua | 67 - techage/coal_power_station/boiler_top.lua | 110 -- techage/coal_power_station/cooler.lua | 133 -- techage/coal_power_station/firebox.lua | 231 --- techage/coal_power_station/generator.lua | 276 --- techage/coal_power_station/oilfirebox.lua | 156 -- techage/coal_power_station/turbine.lua | 182 -- techage/collider/cooler.lua | 89 - techage/collider/detector.lua | 448 ----- techage/collider/inlets.lua | 375 ---- techage/collider/magnet.lua | 333 ---- techage/collider/vacuumtube.lua | 130 -- techage/collider/worker.lua | 208 --- techage/digtron/battery.lua | 175 -- techage/doc/guide.lua | 279 --- techage/doc/items.lua | 234 --- techage/doc/manual_DE.lua | 132 -- techage/doc/manual_EN.lua | 144 -- techage/doc/manual_RU.lua | 144 -- techage/doc/manual_pt-BR.lua | 152 -- techage/doc/manual_ta1_DE.lua | 172 -- techage/doc/manual_ta1_EN.lua | 170 -- techage/doc/manual_ta1_RU.lua | 170 -- techage/doc/manual_ta1_pt-BR.lua | 153 -- techage/doc/manual_ta2_DE.lua | 308 ---- techage/doc/manual_ta2_EN.lua | 308 ---- techage/doc/manual_ta2_RU.lua | 308 ---- techage/doc/manual_ta2_pt-BR.lua | 306 ---- techage/doc/manual_ta3_DE.lua | 934 ---------- techage/doc/manual_ta3_EN.lua | 931 ---------- techage/doc/manual_ta3_RU.lua | 931 ---------- techage/doc/manual_ta3_pt-BR.lua | 942 ---------- techage/doc/manual_ta4_DE.lua | 1052 ----------- techage/doc/manual_ta4_EN.lua | 1054 ----------- techage/doc/manual_ta4_RU.lua | 1054 ----------- techage/doc/manual_ta4_pt-BR.lua | 1054 ----------- techage/doc/manual_ta5_DE.lua | 219 --- techage/doc/manual_ta5_EN.lua | 214 --- techage/doc/manual_ta5_RU.lua | 214 --- techage/doc/manual_ta5_pt-BR.lua | 214 --- techage/doc/plans.lua | 608 ------- techage/energy_storage/generator.lua | 130 -- techage/energy_storage/heatexchanger1.lua | 101 -- techage/energy_storage/heatexchanger2.lua | 436 ----- techage/energy_storage/heatexchanger3.lua | 102 -- techage/energy_storage/inlet.lua | 196 -- techage/energy_storage/nodes.lua | 36 - techage/energy_storage/turbine.lua | 165 -- techage/fermenter/gasflare.lua | 182 -- techage/furnace/booster.lua | 199 -- techage/furnace/cooking.lua | 228 --- techage/furnace/firebox.lua | 226 --- techage/furnace/furnace_top.lua | 339 ---- techage/furnace/heater.lua | 136 -- techage/furnace/recipes.lua | 170 -- techage/fusion_reactor/controller.lua | 288 --- techage/fusion_reactor/gas_pipe.lua | 331 ---- techage/fusion_reactor/generator.lua | 278 --- techage/fusion_reactor/heatexchanger1.lua | 109 -- techage/fusion_reactor/heatexchanger2.lua | 426 ----- techage/fusion_reactor/heatexchanger3.lua | 106 -- techage/fusion_reactor/magnet.lua | 271 --- techage/fusion_reactor/shell.lua | 63 - techage/fusion_reactor/ta5_pump.lua | 224 --- techage/fusion_reactor/turbine.lua | 170 -- techage/hydrogen/electrolyzer.lua | 370 ---- techage/hydrogen/fuelcell.lua | 350 ---- techage/hydrogen/fuelcellstack.lua | 33 - techage/i18n.py | 459 ----- techage/icta_controller/action.lua | 107 -- techage/icta_controller/battery.lua | 187 -- techage/icta_controller/commands.lua | 958 ---------- techage/icta_controller/condition.lua | 84 - techage/icta_controller/controller.lua | 472 ----- techage/icta_controller/display.lua | 304 ---- techage/icta_controller/edit.lua | 40 - techage/icta_controller/formspec.lua | 243 --- techage/icta_controller/signaltower.lua | 158 -- techage/icta_controller/submenu.lua | 213 --- techage/images/chemical_reactor.png | Bin 137189 -> 0 bytes techage/images/distillation_tower.png | Bin 142093 -> 0 bytes techage/images/drilling_tower.png | Bin 129781 -> 0 bytes techage/images/fusion_reactor.png | Bin 69025 -> 0 bytes techage/images/melting_furnace.png | Bin 57241 -> 0 bytes techage/images/solar_plant.png | Bin 190445 -> 0 bytes techage/images/steam_engine.png | Bin 120981 -> 0 bytes techage/images/tank_cart.png | Bin 60997 -> 0 bytes techage/images/thermal_energy_storage.png | Bin 129983 -> 0 bytes techage/images/watermill.png | Bin 175997 -> 0 bytes techage/images/wind_plant.png | Bin 144306 -> 0 bytes techage/init.lua | 430 ----- techage/iron_age/charcoalpile.lua | 227 --- techage/iron_age/coalburner.lua | 248 --- techage/iron_age/gravelsieve.lua | 212 --- techage/iron_age/hammer.lua | 246 --- techage/iron_age/hopper.lua | 92 - techage/iron_age/lighter.lua | 89 - techage/iron_age/main.lua | 28 - techage/iron_age/meltingpot.lua | 517 ------ techage/iron_age/meridium.lua | 125 -- techage/iron_age/recipes.lua | 237 --- techage/iron_age/tools.lua | 102 -- techage/items/aluminium.lua | 128 -- techage/items/baborium.lua | 51 - techage/items/barrel.lua | 114 -- techage/items/basalt.lua | 203 --- techage/items/bauxit.lua | 68 - techage/items/cement.lua | 70 - techage/items/ceramic.lua | 84 - techage/items/cracking.lua | 109 -- techage/items/electronic.lua | 102 -- techage/items/epoxy.lua | 45 - techage/items/filling.lua | 14 - techage/items/hydrogen.lua | 43 - techage/items/lye.lua | 44 - techage/items/moreblocks.lua | 99 - techage/items/oil.lua | 136 -- techage/items/petroleum.lua | 173 -- techage/items/plastic.lua | 35 - techage/items/powder.lua | 90 - techage/items/redstone.lua | 70 - techage/items/registered_nodes.lua | 75 - techage/items/salt.lua | 50 - techage/items/silicon.lua | 45 - techage/items/steelmat.lua | 29 - techage/items/usmium.lua | 28 - techage/lamps/ceilinglamp.lua | 66 - techage/lamps/growlight.lua | 224 --- techage/lamps/industriallamp1.lua | 66 - techage/lamps/industriallamp2.lua | 68 - techage/lamps/industriallamp3.lua | 64 - techage/lamps/industriallamp4.lua | 64 - techage/lamps/lampholder.lua | 115 -- techage/lamps/lib.lua | 183 -- techage/lamps/lightblock.lua | 65 - techage/lamps/simplelamp.lua | 53 - techage/lamps/streetlamp.lua | 70 - techage/lamps/streetlamp2.lua | 128 -- techage/liquids/filler.lua | 159 -- techage/liquids/liquid_pipe.lua | 205 --- techage/liquids/pipe_wall_entry.lua | 57 - techage/liquids/pump.lua | 420 ----- techage/liquids/silo.lua | 358 ---- techage/liquids/ta5_tank.lua | 111 -- techage/liquids/tank.lua | 298 --- techage/liquids/valve.lua | 176 -- techage/liquids/waterinlet.lua | 109 -- techage/liquids/waterpump.lua | 167 -- techage/locale/techage.de.tr | 1582 ---------------- techage/locale/techage.fr.tr | 1602 ----------------- techage/locale/techage.ru.tr | 1576 ---------------- techage/locale/template.txt | 1579 ---------------- techage/logic/button.lua | 516 ------ techage/logic/button_2x.lua | 307 ---- techage/logic/button_4x.lua | 363 ---- techage/logic/cart_detector.lua | 182 -- techage/logic/charge_detector.lua | 232 --- techage/logic/collector.lua | 225 --- techage/logic/command_converter.lua | 182 -- techage/logic/detector.lua | 394 ---- techage/logic/flipflop.lua | 147 -- techage/logic/gaze_sensor.lua | 244 --- techage/logic/lib.lua | 110 -- techage/logic/light_detector.lua | 189 -- techage/logic/logic_block.lua | 435 ----- techage/logic/lua_logic.lua | 264 --- techage/logic/mba_detector.lua | 116 -- techage/logic/mesecons_converter.lua | 199 -- techage/logic/node_detector.lua | 407 ----- techage/logic/player_detector.lua | 382 ---- techage/logic/programmer.lua | 100 - techage/logic/repeater.lua | 132 -- techage/logic/sequencer.lua | 309 ---- techage/logic/sequencer2.lua | 367 ---- techage/logic/signallamp.lua | 238 --- techage/logic/signallamp_2x.lua | 164 -- techage/logic/signallamp_4x.lua | 195 -- techage/logic/terminal.lua | 448 ----- techage/logic/timer.lua | 209 --- techage/lua_controller/commands.lua | 250 --- techage/lua_controller/controller.lua | 679 ------- techage/lua_controller/sensorchest.lua | 276 --- techage/lua_controller/server.lua | 325 ---- techage/lua_controller/terminal.lua | 261 --- techage/manuals/QSG.md | 105 -- techage/manuals/description.md | 49 - techage/manuals/manual_DE.md | 124 -- techage/manuals/manual_EN.md | 138 -- techage/manuals/manual_RU.md | 137 -- techage/manuals/manual_pt-BR.md | 110 -- techage/manuals/manual_ta1_DE.md | 159 -- techage/manuals/manual_ta1_EN.md | 158 -- techage/manuals/manual_ta1_pt-BR.md | 119 -- techage/manuals/manual_ta2_DE.md | 295 --- techage/manuals/manual_ta2_EN.md | 295 --- techage/manuals/manual_ta2_pt-BR.md | 284 --- techage/manuals/manual_ta3_DE.md | 912 ---------- techage/manuals/manual_ta3_EN.md | 904 ---------- techage/manuals/manual_ta3_pt-BR.md | 890 --------- techage/manuals/manual_ta4_DE.md | 1024 ----------- techage/manuals/manual_ta4_EN.md | 1017 ----------- techage/manuals/manual_ta4_pt-BR.md | 1017 ----------- techage/manuals/manual_ta5_DE.md | 177 -- techage/manuals/manual_ta5_EN.md | 177 -- techage/manuals/manual_ta5_pt-BR.md | 177 -- techage/manuals/markdown_to_lua.py | 271 --- techage/manuals/ta4_icta_controller_DE.md | 112 -- techage/manuals/ta4_icta_controller_DE.pdf | Bin 90505 -> 0 bytes techage/manuals/ta4_icta_controller_EN.md | 108 -- techage/manuals/ta4_lua_controller_EN.md | 760 -------- techage/manuals/ta4_lua_controller_EN.pdf | Bin 405494 -> 0 bytes techage/manuals/ta_kvstore.md | 78 - techage/manuals/toc_DE.md | 260 --- techage/manuals/toc_EN.md | 261 --- techage/mod.conf | 5 - techage/models/size.py | 9 - techage/models/techage_cylinder_07.obj | 124 -- techage/models/techage_cylinder_09.obj | 124 -- techage/models/techage_cylinder_12.obj | 124 -- techage/models/techage_cylinder_12h.obj | 124 -- techage/models/techage_cylinder_14.obj | 124 -- techage/models/techage_rotor.b3d | Bin 9983 -> 0 bytes techage/move_controller/doorblock.lua | 108 -- techage/move_controller/doorcontroller.lua | 147 -- techage/move_controller/doorcontroller2.lua | 636 ------- techage/move_controller/flycontroller.lua | 271 --- techage/move_controller/gateblock.lua | 94 - techage/move_controller/movecontroller.lua | 335 ---- techage/move_controller/soundblock.lua | 149 -- techage/move_controller/turncontroller.lua | 207 --- techage/oil/distiller.lua | 269 --- techage/oil/drillbox.lua | 319 ---- techage/oil/explore.lua | 350 ---- techage/oil/gasflare.lua | 182 -- techage/oil/pumpjack.lua | 259 --- techage/oil/reboiler.lua | 272 --- techage/oil/tower.lua | 286 --- techage/power/drive_axle.lua | 194 -- techage/power/electric_cable.lua | 193 -- techage/power/formspecs.lua | 321 ---- techage/power/gearbox.lua | 146 -- techage/power/junctionbox.lua | 66 - techage/power/power_line.lua | 370 ---- techage/power/power_terminal.lua | 15 - techage/power/power_terminal2.lua | 342 ---- techage/power/powerswitch.lua | 303 ---- techage/power/powerswitchbox.lua | 148 -- techage/power/powerswitchbox_legacy.lua | 71 - techage/power/protection.lua | 71 - techage/power/steam_pipe.lua | 116 -- techage/power/ta4_cable.lua | 189 -- techage/power/ta4_cable_wall_entry.lua | 57 - techage/recipe_checker.lua | 39 - techage/screenshot.png | Bin 334873 -> 0 bytes techage/settingtypes.txt | 43 - techage/solar/inverter.lua | 266 --- techage/solar/minicell.lua | 171 -- techage/solar/solarcell.lua | 293 --- techage/sounds/techage_booster.ogg | Bin 16776 -> 0 bytes techage/sounds/techage_button.ogg | Bin 5825 -> 0 bytes techage/sounds/techage_explore.ogg | Bin 7275 -> 0 bytes techage/sounds/techage_gasflare.ogg | Bin 15113 -> 0 bytes techage/sounds/techage_generator.ogg | Bin 13969 -> 0 bytes techage/sounds/techage_hum.ogg | Bin 11397 -> 0 bytes techage/sounds/techage_mill.ogg | Bin 26619 -> 0 bytes techage/sounds/techage_oildrill.ogg | Bin 8599 -> 0 bytes techage/sounds/techage_quarry.ogg | Bin 12389 -> 0 bytes techage/sounds/techage_reactor.ogg | Bin 8799 -> 0 bytes techage/sounds/techage_reboiler.ogg | Bin 11682 -> 0 bytes techage/sounds/techage_steamengine.ogg | Bin 12427 -> 0 bytes techage/sounds/techage_tool1.ogg | Bin 7190 -> 0 bytes techage/sounds/techage_tool2.ogg | Bin 7678 -> 0 bytes techage/sounds/techage_turbine.ogg | Bin 9526 -> 0 bytes techage/sounds/techage_valve.ogg | Bin 6871 -> 0 bytes techage/sounds/techage_watermill.ogg | Bin 18269 -> 0 bytes techage/steam_engine/boiler.lua | 139 -- techage/steam_engine/cylinder.lua | 176 -- techage/steam_engine/firebox.lua | 172 -- techage/steam_engine/flywheel.lua | 238 --- techage/ta1_watermill/mill.lua | 178 -- techage/ta1_watermill/millboard.lua | 91 - techage/ta1_watermill/sluice.lua | 195 -- techage/ta1_watermill/ta1_axle.lua | 176 -- techage/ta1_watermill/watermill.lua | 319 ---- techage/ta2_energy_storage/ta2_clutch.lua | 128 -- techage/ta2_energy_storage/ta2_rope.lua | 85 - .../ta2_energy_storage/ta2_weight_chest.lua | 137 -- techage/ta2_energy_storage/ta2_winch.lua | 225 --- techage/ta3_power/akkubox.lua | 214 --- techage/ta3_power/axle2power.lua | 202 --- techage/ta3_power/power2axle.lua | 186 -- techage/ta3_power/tiny_generator.lua | 400 ---- techage/ta4_power/electricmeter.lua | 255 --- techage/ta4_power/laser.lua | 168 -- techage/ta4_power/transformer.lua | 211 --- techage/teleport/teleport_pipe.lua | 198 -- techage/teleport/teleport_tube.lua | 190 -- techage/textures/generate.py | 40 - techage/textures/techage_aichip.png | Bin 272 -> 0 bytes techage/textures/techage_aluminum_inv.png | Bin 1226 -> 0 bytes techage/textures/techage_appl_arrow.png | Bin 122 -> 0 bytes techage/textures/techage_appl_arrow2.png | Bin 116 -> 0 bytes techage/textures/techage_appl_arrow3.png | Bin 112 -> 0 bytes techage/textures/techage_appl_arrowXL.png | Bin 154 -> 0 bytes techage/textures/techage_appl_arrow_white.png | Bin 151 -> 0 bytes techage/textures/techage_appl_autocrafter.png | Bin 139 -> 0 bytes .../textures/techage_appl_autocrafter4.png | Bin 217 -> 0 bytes techage/textures/techage_appl_blackhole.png | Bin 135 -> 0 bytes techage/textures/techage_appl_button.png | Bin 152 -> 0 bytes .../textures/techage_appl_cartdetector.png | Bin 161 -> 0 bytes .../textures/techage_appl_cartdetector_on.png | Bin 165 -> 0 bytes .../textures/techage_appl_chest_back_ta3.png | Bin 164 -> 0 bytes .../textures/techage_appl_chest_back_ta4.png | Bin 167 -> 0 bytes .../textures/techage_appl_chest_front_ta3.png | Bin 229 -> 0 bytes .../textures/techage_appl_chest_front_ta4.png | Bin 259 -> 0 bytes techage/textures/techage_appl_clutch.png | Bin 201 -> 0 bytes techage/textures/techage_appl_clutch_on.png | Bin 165 -> 0 bytes techage/textures/techage_appl_color_top.png | Bin 164 -> 0 bytes techage/textures/techage_appl_color_top4.png | Bin 183 -> 0 bytes .../techage_appl_command_converter.png | Bin 151 -> 0 bytes .../techage_appl_command_converter_on.png | Bin 151 -> 0 bytes techage/textures/techage_appl_compressor.png | Bin 263 -> 0 bytes techage/textures/techage_appl_compressor4.png | Bin 456 -> 0 bytes techage/textures/techage_appl_cooler.png | Bin 313 -> 0 bytes techage/textures/techage_appl_cooler4.png | Bin 624 -> 0 bytes techage/textures/techage_appl_ctrl_unit.png | Bin 208 -> 0 bytes techage/textures/techage_appl_ctrl_unit4.png | Bin 210 -> 0 bytes techage/textures/techage_appl_defect.png | Bin 235 -> 0 bytes techage/textures/techage_appl_detector.png | Bin 194 -> 0 bytes techage/textures/techage_appl_detector_on.png | Bin 194 -> 0 bytes techage/textures/techage_appl_distri.png | Bin 471 -> 0 bytes techage/textures/techage_appl_distri4.png | Bin 1134 -> 0 bytes techage/textures/techage_appl_distri_blue.png | Bin 191 -> 0 bytes .../textures/techage_appl_distri_green.png | Bin 191 -> 0 bytes techage/textures/techage_appl_distri_red.png | Bin 191 -> 0 bytes .../textures/techage_appl_distri_yellow.png | Bin 191 -> 0 bytes .../textures/techage_appl_doorcontroller.png | Bin 182 -> 0 bytes .../techage_appl_electric_gen_front.png | Bin 225 -> 0 bytes .../techage_appl_electric_gen_front4.png | Bin 278 -> 0 bytes .../techage_appl_electric_gen_side.png | Bin 194 -> 0 bytes .../techage_appl_electric_gen_top.png | Bin 154 -> 0 bytes .../textures/techage_appl_electrolyzer.png | Bin 202 -> 0 bytes .../textures/techage_appl_electrolyzer4.png | Bin 224 -> 0 bytes .../textures/techage_appl_electronic_fab.png | Bin 170 -> 0 bytes .../textures/techage_appl_electronic_fab4.png | Bin 199 -> 0 bytes techage/textures/techage_appl_explosive.png | Bin 141 -> 0 bytes techage/textures/techage_appl_filler.png | Bin 385 -> 0 bytes techage/textures/techage_appl_filler4.png | Bin 743 -> 0 bytes techage/textures/techage_appl_firehole.png | Bin 178 -> 0 bytes techage/textures/techage_appl_firehole4.png | Bin 405 -> 0 bytes techage/textures/techage_appl_flipflop.png | Bin 126 -> 0 bytes techage/textures/techage_appl_flipflop_on.png | Bin 126 -> 0 bytes techage/textures/techage_appl_forceload.png | Bin 638 -> 0 bytes techage/textures/techage_appl_fuelcell.png | Bin 138 -> 0 bytes techage/textures/techage_appl_fuelcell4.png | Bin 154 -> 0 bytes techage/textures/techage_appl_funnel.png | Bin 179 -> 0 bytes techage/textures/techage_appl_funnel_top.png | Bin 149 -> 0 bytes techage/textures/techage_appl_furnace.png | Bin 275 -> 0 bytes techage/textures/techage_appl_gaze_sensor.png | Bin 137 -> 0 bytes .../textures/techage_appl_gaze_sensor_on.png | Bin 137 -> 0 bytes techage/textures/techage_appl_generator.png | Bin 211 -> 0 bytes techage/textures/techage_appl_generator4.png | Bin 487 -> 0 bytes .../textures/techage_appl_generator_red.png | Bin 297 -> 0 bytes .../textures/techage_appl_generator_red4.png | Bin 815 -> 0 bytes techage/textures/techage_appl_grinder.png | Bin 984 -> 0 bytes techage/textures/techage_appl_grinder2.png | Bin 387 -> 0 bytes techage/textures/techage_appl_grinder4.png | Bin 2090 -> 0 bytes techage/textures/techage_appl_heater.png | Bin 159 -> 0 bytes techage/textures/techage_appl_heater_on.png | Bin 197 -> 0 bytes .../textures/techage_appl_hole_electric.png | Bin 178 -> 0 bytes techage/textures/techage_appl_hole_pipe.png | Bin 166 -> 0 bytes .../textures/techage_appl_hole_ta5_pipe1.png | Bin 134 -> 0 bytes .../textures/techage_appl_hole_ta5_pipe2.png | Bin 134 -> 0 bytes techage/textures/techage_appl_hole_tube.png | Bin 165 -> 0 bytes techage/textures/techage_appl_hopper.png | Bin 138 -> 0 bytes .../textures/techage_appl_hopper_right.png | Bin 148 -> 0 bytes techage/textures/techage_appl_hopper_top.png | Bin 182 -> 0 bytes techage/textures/techage_appl_injector.png | Bin 155 -> 0 bytes techage/textures/techage_appl_injector14.png | Bin 209 -> 0 bytes techage/textures/techage_appl_inp.png | Bin 187 -> 0 bytes techage/textures/techage_appl_inverter.png | Bin 168 -> 0 bytes techage/textures/techage_appl_inverterDC.png | Bin 159 -> 0 bytes techage/textures/techage_appl_laser.png | Bin 567 -> 0 bytes techage/textures/techage_appl_laser_hole.png | Bin 134 -> 0 bytes .../textures/techage_appl_lightdetector.png | Bin 1957 -> 0 bytes .../techage_appl_lightdetector_on.png | Bin 2250 -> 0 bytes .../textures/techage_appl_liquid_hopper.png | Bin 227 -> 0 bytes .../textures/techage_appl_liquidsampler.png | Bin 175 -> 0 bytes techage/textures/techage_appl_logic.png | Bin 162 -> 0 bytes .../techage_appl_mesecons_converter.png | Bin 243 -> 0 bytes techage/textures/techage_appl_meter.png | Bin 178 -> 0 bytes .../textures/techage_appl_movecontroller.png | Bin 133 -> 0 bytes .../textures/techage_appl_nodedetector.png | Bin 203 -> 0 bytes .../textures/techage_appl_nodedetector_on.png | Bin 203 -> 0 bytes techage/textures/techage_appl_oildrill.png | Bin 164 -> 0 bytes techage/textures/techage_appl_oilexplorer.png | Bin 235 -> 0 bytes .../textures/techage_appl_oilexplorer_top.png | Bin 147 -> 0 bytes .../techage_appl_oilexplorer_top4.png | Bin 240 -> 0 bytes techage/textures/techage_appl_open.png | Bin 235 -> 0 bytes techage/textures/techage_appl_outp.png | Bin 192 -> 0 bytes techage/textures/techage_appl_plasma.png | Bin 135 -> 0 bytes techage/textures/techage_appl_plasma4.png | Bin 617 -> 0 bytes .../textures/techage_appl_playerdetector.png | Bin 157 -> 0 bytes .../techage_appl_playerdetector_on.png | Bin 186 -> 0 bytes techage/textures/techage_appl_pump.png | Bin 154 -> 0 bytes techage/textures/techage_appl_pump8.png | Bin 229 -> 0 bytes techage/textures/techage_appl_pump_up.png | Bin 158 -> 0 bytes techage/textures/techage_appl_pump_up8.png | Bin 194 -> 0 bytes techage/textures/techage_appl_pumpjack.png | Bin 164 -> 0 bytes techage/textures/techage_appl_pumpjack14.png | Bin 321 -> 0 bytes techage/textures/techage_appl_pusher.png | Bin 158 -> 0 bytes techage/textures/techage_appl_pusher14.png | Bin 491 -> 0 bytes techage/textures/techage_appl_quarry.png | Bin 187 -> 0 bytes techage/textures/techage_appl_reboiler.png | Bin 183 -> 0 bytes techage/textures/techage_appl_reboiler4.png | Bin 303 -> 0 bytes techage/textures/techage_appl_recipeblock.png | Bin 144 -> 0 bytes techage/textures/techage_appl_recycler.png | Bin 565 -> 0 bytes techage/textures/techage_appl_repeater.png | Bin 194 -> 0 bytes techage/textures/techage_appl_ribsB.png | Bin 157 -> 0 bytes techage/textures/techage_appl_ribsM.png | Bin 170 -> 0 bytes techage/textures/techage_appl_ribsT.png | Bin 155 -> 0 bytes techage/textures/techage_appl_rinser.png | Bin 209 -> 0 bytes techage/textures/techage_appl_rinser4_top.png | Bin 931 -> 0 bytes techage/textures/techage_appl_rinser_top.png | Bin 261 -> 0 bytes techage/textures/techage_appl_sensor.png | Bin 597 -> 0 bytes techage/textures/techage_appl_sequencer.png | Bin 196 -> 0 bytes techage/textures/techage_appl_sieve.png | Bin 222 -> 0 bytes techage/textures/techage_appl_sieve4_top.png | Bin 942 -> 0 bytes techage/textures/techage_appl_sieve_top.png | Bin 150 -> 0 bytes techage/textures/techage_appl_silo.png | Bin 190 -> 0 bytes techage/textures/techage_appl_sound.png | Bin 146 -> 0 bytes techage/textures/techage_appl_source.png | Bin 181 -> 0 bytes techage/textures/techage_appl_switch_inv.png | Bin 216 -> 0 bytes techage/textures/techage_appl_switch_off.png | Bin 381 -> 0 bytes techage/textures/techage_appl_switch_on.png | Bin 370 -> 0 bytes techage/textures/techage_appl_ta4_cable.png | Bin 143 -> 0 bytes techage/textures/techage_appl_tank.png | Bin 205 -> 0 bytes techage/textures/techage_appl_tele_pipe.png | Bin 138 -> 0 bytes techage/textures/techage_appl_tele_tube.png | Bin 175 -> 0 bytes techage/textures/techage_appl_teleport.png | Bin 163 -> 0 bytes techage/textures/techage_appl_tes_core.png | Bin 154 -> 0 bytes techage/textures/techage_appl_tes_turb.png | Bin 148 -> 0 bytes techage/textures/techage_appl_timer.png | Bin 214 -> 0 bytes techage/textures/techage_appl_trafo.png | Bin 129 -> 0 bytes techage/textures/techage_appl_turbine.png | Bin 237 -> 0 bytes techage/textures/techage_appl_turbine4.png | Bin 373 -> 0 bytes techage/textures/techage_appl_turn.png | Bin 149 -> 0 bytes techage/textures/techage_appl_warehouse.png | Bin 146 -> 0 bytes techage/textures/techage_appl_winch.png | Bin 161 -> 0 bytes techage/textures/techage_appl_winch_hole.png | Bin 105 -> 0 bytes techage/textures/techage_ash.png | Bin 186 -> 0 bytes techage/textures/techage_ash_side.png | Bin 152 -> 0 bytes techage/textures/techage_axle.png | Bin 317 -> 0 bytes techage/textures/techage_axle4.png | Bin 364 -> 0 bytes techage/textures/techage_axle4R.png | Bin 410 -> 0 bytes techage/textures/techage_axleR.png | Bin 370 -> 0 bytes techage/textures/techage_axle_bearing.png | Bin 154 -> 0 bytes .../textures/techage_axle_bearing_front.png | Bin 127 -> 0 bytes techage/textures/techage_axle_clutch.png | Bin 187 -> 0 bytes techage/textures/techage_axle_clutch4.png | Bin 296 -> 0 bytes techage/textures/techage_axle_gearbox.png | Bin 320 -> 0 bytes techage/textures/techage_axle_gearbox4.png | Bin 573 -> 0 bytes techage/textures/techage_baborium.png | Bin 189 -> 0 bytes techage/textures/techage_baborium_ingot.png | Bin 171 -> 0 bytes techage/textures/techage_baborium_lump.png | Bin 341 -> 0 bytes techage/textures/techage_barrel_inv.png | Bin 281 -> 0 bytes techage/textures/techage_basalt_glass.png | Bin 358 -> 0 bytes techage/textures/techage_basalt_glass2.png | Bin 405 -> 0 bytes techage/textures/techage_basalt_glass3.png | Bin 358 -> 0 bytes techage/textures/techage_battery_green.png | Bin 182 -> 0 bytes .../textures/techage_battery_inventory.png | Bin 163 -> 0 bytes techage/textures/techage_battery_red.png | Bin 194 -> 0 bytes techage/textures/techage_bauxit_overlay.png | Bin 129 -> 0 bytes techage/textures/techage_bitumen_inv.png | Bin 246 -> 0 bytes techage/textures/techage_boiler.png | Bin 576 -> 0 bytes techage/textures/techage_boiler2.png | Bin 624 -> 0 bytes techage/textures/techage_box_back.png | Bin 395 -> 0 bytes techage/textures/techage_box_front.png | Bin 486 -> 0 bytes techage/textures/techage_box_side.png | Bin 493 -> 0 bytes techage/textures/techage_bucket_oil.png | Bin 184 -> 0 bytes techage/textures/techage_button_off.png | Bin 147 -> 0 bytes techage/textures/techage_button_on.png | Bin 147 -> 0 bytes techage/textures/techage_cable_palette.png | Bin 134 -> 0 bytes techage/textures/techage_canister_filling.png | Bin 139 -> 0 bytes techage/textures/techage_canister_frame.png | Bin 219 -> 0 bytes techage/textures/techage_carbon_fiber.png | Bin 135 -> 0 bytes techage/textures/techage_ceilinglamp.png | Bin 213 -> 0 bytes .../textures/techage_ceilinglamp_bottom.png | Bin 226 -> 0 bytes techage/textures/techage_ceilinglamp_top.png | Bin 137 -> 0 bytes techage/textures/techage_ceramic_material.png | Bin 1068 -> 0 bytes techage/textures/techage_ceramic_turbine.png | Bin 752 -> 0 bytes techage/textures/techage_charcoal.png | Bin 557 -> 0 bytes techage/textures/techage_charcoal_burn.png | Bin 940 -> 0 bytes .../textures/techage_charge_detector_inv.png | Bin 248 -> 0 bytes .../textures/techage_charge_detector_off.png | Bin 175 -> 0 bytes .../textures/techage_charge_detector_on.png | Bin 176 -> 0 bytes .../textures/techage_chest_cart_bottom.png | Bin 210 -> 0 bytes techage/textures/techage_chest_cart_front.png | Bin 262 -> 0 bytes techage/textures/techage_chest_cart_side.png | Bin 279 -> 0 bytes techage/textures/techage_chest_cart_top.png | Bin 248 -> 0 bytes techage/textures/techage_clutch_clutch.png | Bin 184 -> 0 bytes techage/textures/techage_coal_boiler.png | Bin 451 -> 0 bytes techage/textures/techage_coal_boiler4.png | Bin 479 -> 0 bytes .../techage_coal_boiler_fire_hole.png | Bin 192 -> 0 bytes techage/textures/techage_coal_boiler_hole.png | Bin 122 -> 0 bytes techage/textures/techage_coal_boiler_inv.png | Bin 1748 -> 0 bytes .../techage_coal_boiler_mesh_base.png | Bin 1331 -> 0 bytes .../textures/techage_coal_boiler_mesh_top.png | Bin 1337 -> 0 bytes .../techage_collider_detector_appl.png | Bin 135 -> 0 bytes .../techage_collider_detector_banner.png | Bin 124 -> 0 bytes .../techage_collider_detector_core.png | Bin 490 -> 0 bytes techage/textures/techage_collider_magnet.png | Bin 168 -> 0 bytes .../textures/techage_collider_magnet_appl.png | Bin 153 -> 0 bytes .../textures/techage_collider_magnet_sign.png | Bin 138 -> 0 bytes .../textures/techage_collider_magnet_tube.png | Bin 123 -> 0 bytes techage/textures/techage_collider_plan.png | Bin 585 -> 0 bytes techage/textures/techage_collider_plan2.png | Bin 22883 -> 0 bytes techage/textures/techage_collider_tube.png | Bin 223 -> 0 bytes .../textures/techage_collider_tube_open.png | Bin 289 -> 0 bytes techage/textures/techage_color16.png | Bin 83 -> 0 bytes .../textures/techage_compressed_gravel.png | Bin 455 -> 0 bytes techage/textures/techage_concrete.png | Bin 191 -> 0 bytes techage/textures/techage_concrete4.png | Bin 364 -> 0 bytes techage/textures/techage_constr_plan.png | Bin 359 -> 0 bytes techage/textures/techage_constr_plan_br.png | Bin 5133 -> 0 bytes techage/textures/techage_constr_plan_de.png | Bin 1011 -> 0 bytes techage/textures/techage_constr_plan_en.png | Bin 725 -> 0 bytes techage/textures/techage_constr_plan_inv.png | Bin 325 -> 0 bytes .../textures/techage_constr_plan_inv_br.png | Bin 4680 -> 0 bytes .../textures/techage_constr_plan_inv_de.png | Bin 546 -> 0 bytes .../textures/techage_constr_plan_inv_en.png | Bin 582 -> 0 bytes .../textures/techage_constr_plan_inv_ru.png | Bin 559 -> 0 bytes techage/textures/techage_constr_plan_ru.png | Bin 1019 -> 0 bytes techage/textures/techage_cooler.png | Bin 263 -> 0 bytes techage/textures/techage_cube_mark.png | Bin 195 -> 0 bytes techage/textures/techage_cylinder.png | Bin 180 -> 0 bytes techage/textures/techage_cylinder4.png | Bin 353 -> 0 bytes techage/textures/techage_display.png | Bin 127 -> 0 bytes techage/textures/techage_displayXL.png | Bin 130 -> 0 bytes .../textures/techage_display_inventory.png | Bin 220 -> 0 bytes .../textures/techage_display_inventoryXL.png | Bin 208 -> 0 bytes techage/textures/techage_distiller1.png | Bin 3911 -> 0 bytes techage/textures/techage_distiller2.png | Bin 3431 -> 0 bytes techage/textures/techage_distiller3.png | Bin 3488 -> 0 bytes techage/textures/techage_distiller4.png | Bin 4064 -> 0 bytes techage/textures/techage_distiller_inv.png | Bin 1056 -> 0 bytes techage/textures/techage_electric_button.png | Bin 122 -> 0 bytes .../textures/techage_electric_button_off.png | Bin 113 -> 0 bytes .../textures/techage_electric_button_on.png | Bin 113 -> 0 bytes techage/textures/techage_electric_cable.png | Bin 226 -> 0 bytes .../textures/techage_electric_cable_end.png | Bin 123 -> 0 bytes .../textures/techage_electric_cable_inv.png | Bin 177 -> 0 bytes .../textures/techage_electric_junction.png | Bin 306 -> 0 bytes techage/textures/techage_electric_plug.png | Bin 143 -> 0 bytes techage/textures/techage_electric_switch.png | Bin 188 -> 0 bytes .../textures/techage_electric_switch_off.png | Bin 195 -> 0 bytes techage/textures/techage_electric_trowel.png | Bin 277 -> 0 bytes techage/textures/techage_end_wrench.png | Bin 751 -> 0 bytes techage/textures/techage_fc_stack_inv.png | Bin 154 -> 0 bytes techage/textures/techage_fermenter_foil.png | Bin 113 -> 0 bytes techage/textures/techage_filling4_ta2.png | Bin 324 -> 0 bytes techage/textures/techage_filling4_ta3.png | Bin 588 -> 0 bytes techage/textures/techage_filling4_ta4.png | Bin 233 -> 0 bytes techage/textures/techage_filling8_ta2.png | Bin 331 -> 0 bytes techage/textures/techage_filling8_ta3.png | Bin 573 -> 0 bytes techage/textures/techage_filling8_ta4.png | Bin 219 -> 0 bytes techage/textures/techage_filling_metal.png | Bin 275 -> 0 bytes techage/textures/techage_filling_ta2.png | Bin 301 -> 0 bytes techage/textures/techage_filling_ta3.png | Bin 515 -> 0 bytes techage/textures/techage_filling_ta4.png | Bin 351 -> 0 bytes techage/textures/techage_filter_inv.png | Bin 181 -> 0 bytes techage/textures/techage_firebox.png | Bin 609 -> 0 bytes techage/textures/techage_firebox4.png | Bin 718 -> 0 bytes techage/textures/techage_flame.png | Bin 201 -> 0 bytes techage/textures/techage_flame_animated.png | Bin 644 -> 0 bytes techage/textures/techage_flywheel.png | Bin 1621 -> 0 bytes techage/textures/techage_flywheel8.png | Bin 5162 -> 0 bytes techage/textures/techage_form_add_arrow.png | Bin 161 -> 0 bytes techage/textures/techage_form_arrow.png | Bin 198 -> 0 bytes techage/textures/techage_form_arrow_bg.png | Bin 180 -> 0 bytes techage/textures/techage_form_arrow_fg.png | Bin 180 -> 0 bytes techage/textures/techage_form_gear_bg.png | Bin 407 -> 0 bytes techage/textures/techage_form_get_arrow.png | Bin 162 -> 0 bytes techage/textures/techage_form_grey.png | Bin 113 -> 0 bytes techage/textures/techage_form_input.png | Bin 185 -> 0 bytes techage/textures/techage_form_input_arrow.png | Bin 170 -> 0 bytes techage/textures/techage_form_inventory.png | Bin 160 -> 0 bytes techage/textures/techage_form_level_bg.png | Bin 151 -> 0 bytes .../textures/techage_form_level_charge.png | Bin 172 -> 0 bytes techage/textures/techage_form_level_fg.png | Bin 151 -> 0 bytes techage/textures/techage_form_level_off.png | Bin 159 -> 0 bytes .../textures/techage_form_level_red_fg.png | Bin 157 -> 0 bytes .../textures/techage_form_level_unload.png | Bin 172 -> 0 bytes techage/textures/techage_form_mask.png | Bin 97 -> 0 bytes .../textures/techage_form_output_arrow.png | Bin 170 -> 0 bytes techage/textures/techage_form_tank.png | Bin 406 -> 0 bytes techage/textures/techage_form_temp_bg.png | Bin 264 -> 0 bytes techage/textures/techage_form_temp_fg.png | Bin 262 -> 0 bytes techage/textures/techage_formspec_bg.png | Bin 84 -> 0 bytes techage/textures/techage_frame14_ta2.png | Bin 431 -> 0 bytes techage/textures/techage_frame14_ta3.png | Bin 426 -> 0 bytes techage/textures/techage_frame14_ta4.png | Bin 214 -> 0 bytes techage/textures/techage_frame14_ta4_hp.png | Bin 214 -> 0 bytes techage/textures/techage_frame4_ta2.png | Bin 407 -> 0 bytes techage/textures/techage_frame4_ta2_top.png | Bin 407 -> 0 bytes techage/textures/techage_frame4_ta3.png | Bin 380 -> 0 bytes techage/textures/techage_frame4_ta3_top.png | Bin 380 -> 0 bytes techage/textures/techage_frame4_ta4.png | Bin 180 -> 0 bytes techage/textures/techage_frame4_ta4_hp.png | Bin 180 -> 0 bytes techage/textures/techage_frame4_ta4_top.png | Bin 188 -> 0 bytes .../textures/techage_frame4_ta4_top_hp.png | Bin 159 -> 0 bytes techage/textures/techage_frame4_ta5.png | Bin 185 -> 0 bytes techage/textures/techage_frame8_ta2.png | Bin 410 -> 0 bytes techage/textures/techage_frame8_ta3.png | Bin 411 -> 0 bytes techage/textures/techage_frame8_ta4.png | Bin 199 -> 0 bytes techage/textures/techage_frame8_ta4_hp.png | Bin 199 -> 0 bytes techage/textures/techage_frame8_ta5.png | Bin 204 -> 0 bytes techage/textures/techage_frameB_ta4.png | Bin 140 -> 0 bytes techage/textures/techage_frameM_ta4.png | Bin 141 -> 0 bytes techage/textures/techage_frameT_ta4.png | Bin 160 -> 0 bytes techage/textures/techage_frameT_ta5.png | Bin 157 -> 0 bytes techage/textures/techage_frame_small_ta3.png | Bin 357 -> 0 bytes techage/textures/techage_frame_ta2.png | Bin 402 -> 0 bytes techage/textures/techage_frame_ta2_bottom.png | Bin 336 -> 0 bytes techage/textures/techage_frame_ta2_top.png | Bin 327 -> 0 bytes techage/textures/techage_frame_ta3.png | Bin 377 -> 0 bytes techage/textures/techage_frame_ta3_bottom.png | Bin 331 -> 0 bytes techage/textures/techage_frame_ta3_top.png | Bin 377 -> 0 bytes techage/textures/techage_frame_ta4.png | Bin 162 -> 0 bytes techage/textures/techage_frame_ta4_bottom.png | Bin 111 -> 0 bytes techage/textures/techage_frame_ta4_hp.png | Bin 162 -> 0 bytes techage/textures/techage_frame_ta4_top.png | Bin 141 -> 0 bytes techage/textures/techage_frame_ta4_top_hp.png | Bin 141 -> 0 bytes techage/textures/techage_frame_ta5.png | Bin 167 -> 0 bytes techage/textures/techage_frame_ta5_top.png | Bin 146 -> 0 bytes techage/textures/techage_frame_waterpump.png | Bin 286 -> 0 bytes .../textures/techage_frame_waterpump_top.png | Bin 254 -> 0 bytes techage/textures/techage_framexl_ta3.png | Bin 269 -> 0 bytes techage/textures/techage_framexl_ta3_top.png | Bin 270 -> 0 bytes techage/textures/techage_furnace_ceramic.png | Bin 643 -> 0 bytes techage/textures/techage_fusion_reactor.png | Bin 30940 -> 0 bytes .../textures/techage_gas_cylinder_large.png | Bin 281 -> 0 bytes .../textures/techage_gas_cylinder_small.png | Bin 329 -> 0 bytes techage/textures/techage_gas_inv.png | Bin 514 -> 0 bytes techage/textures/techage_gasflare.png | Bin 333 -> 0 bytes techage/textures/techage_gaspipe.png | Bin 199 -> 0 bytes techage/textures/techage_gaspipe_hole.png | Bin 233 -> 0 bytes techage/textures/techage_gaspipe_hole2.png | Bin 288 -> 0 bytes techage/textures/techage_gaspipe_junction.png | Bin 400 -> 0 bytes techage/textures/techage_gaspipe_knee.png | Bin 253 -> 0 bytes techage/textures/techage_gaspipe_knee2.png | Bin 277 -> 0 bytes .../textures/techage_gaspipe_valve_closed.png | Bin 163 -> 0 bytes .../textures/techage_gaspipe_valve_hole.png | Bin 134 -> 0 bytes .../textures/techage_gaspipe_valve_open.png | Bin 134 -> 0 bytes techage/textures/techage_gate.png | Bin 425 -> 0 bytes techage/textures/techage_gravel4.png | Bin 280 -> 0 bytes techage/textures/techage_growlight_back.png | Bin 150 -> 0 bytes techage/textures/techage_growlight_off.png | Bin 141 -> 0 bytes techage/textures/techage_growlight_on.png | Bin 143 -> 0 bytes techage/textures/techage_growlight_side.png | Bin 125 -> 0 bytes .../textures/techage_heat_exchanger_inv.png | Bin 592 -> 0 bytes techage/textures/techage_hole_ta4.png | Bin 159 -> 0 bytes techage/textures/techage_hopper.png | Bin 1763 -> 0 bytes techage/textures/techage_hydrogen_inv.png | Bin 317 -> 0 bytes techage/textures/techage_industlight4_on.png | Bin 144 -> 0 bytes techage/textures/techage_industriallamp1.png | Bin 246 -> 0 bytes .../textures/techage_industriallamp1_on.png | Bin 229 -> 0 bytes techage/textures/techage_industriallamp2.png | Bin 208 -> 0 bytes .../textures/techage_industriallamp2_on.png | Bin 180 -> 0 bytes techage/textures/techage_industriallamp3.png | Bin 171 -> 0 bytes .../textures/techage_industriallamp3_on.png | Bin 170 -> 0 bytes .../textures/techage_industriallamp_inv1.png | Bin 408 -> 0 bytes .../textures/techage_industriallamp_inv2.png | Bin 636 -> 0 bytes .../textures/techage_industriallamp_inv3.png | Bin 633 -> 0 bytes techage/textures/techage_inv_blue.png | Bin 113 -> 0 bytes techage/textures/techage_inv_button_error.png | Bin 340 -> 0 bytes .../textures/techage_inv_button_nopower.png | Bin 418 -> 0 bytes techage/textures/techage_inv_button_off.png | Bin 456 -> 0 bytes techage/textures/techage_inv_button_on.png | Bin 380 -> 0 bytes .../textures/techage_inv_button_standby.png | Bin 359 -> 0 bytes .../textures/techage_inv_button_warning.png | Bin 300 -> 0 bytes techage/textures/techage_inv_green.png | Bin 113 -> 0 bytes techage/textures/techage_inv_invisible.png | Bin 115 -> 0 bytes techage/textures/techage_inv_powerT2.png | Bin 320 -> 0 bytes techage/textures/techage_inv_powerT3.png | Bin 188 -> 0 bytes techage/textures/techage_inv_red.png | Bin 113 -> 0 bytes techage/textures/techage_inv_wrench.png | Bin 172 -> 0 bytes techage/textures/techage_inv_yellow.png | Bin 113 -> 0 bytes techage/textures/techage_invisible_inv.png | Bin 304 -> 0 bytes techage/textures/techage_iron_ingot.png | Bin 191 -> 0 bytes techage/textures/techage_isobutane_inv.png | Bin 430 -> 0 bytes techage/textures/techage_junglewood.png | Bin 151 -> 0 bytes techage/textures/techage_junglewood_top.png | Bin 110 -> 0 bytes techage/textures/techage_laser.png | Bin 116 -> 0 bytes techage/textures/techage_leds.png | Bin 3705 -> 0 bytes techage/textures/techage_lighter.png | Bin 762 -> 0 bytes techage/textures/techage_lighter_burn.png | Bin 793 -> 0 bytes techage/textures/techage_liquid1_inv.png | Bin 166 -> 0 bytes techage/textures/techage_liquid2_inv.png | Bin 246 -> 0 bytes .../textures/techage_liquid_filter_filler.png | Bin 183 -> 0 bytes .../techage_liquid_filter_filler_bottom.png | Bin 234 -> 0 bytes techage/textures/techage_liquidsampler.png | Bin 301 -> 0 bytes techage/textures/techage_liquidsampler4.png | Bin 563 -> 0 bytes techage/textures/techage_lua_controller.png | Bin 288 -> 0 bytes .../techage_lua_controller_inventory.png | Bin 410 -> 0 bytes techage/textures/techage_lua_server_back.png | Bin 183 -> 0 bytes techage/textures/techage_lua_server_front.png | Bin 166 -> 0 bytes techage/textures/techage_lua_server_side.png | Bin 166 -> 0 bytes techage/textures/techage_lua_server_top.png | Bin 135 -> 0 bytes techage/textures/techage_magnet_hole.png | Bin 109 -> 0 bytes techage/textures/techage_meltingpot.png | Bin 188 -> 0 bytes .../techage_meltingpot_top_active.png | Bin 551 -> 0 bytes techage/textures/techage_meridium_ingot.png | Bin 185 -> 0 bytes techage/textures/techage_meridiumaxe.png | Bin 157 -> 0 bytes techage/textures/techage_meridiumpick.png | Bin 181 -> 0 bytes techage/textures/techage_meridiumshovel.png | Bin 181 -> 0 bytes techage/textures/techage_meridiumsword.png | Bin 170 -> 0 bytes techage/textures/techage_mill_base.png | Bin 394 -> 0 bytes techage/textures/techage_mill_front.png | Bin 146 -> 0 bytes techage/textures/techage_mill_inv.png | Bin 737 -> 0 bytes techage/textures/techage_mill_side.png | Bin 305 -> 0 bytes techage/textures/techage_oil.png | Bin 155 -> 0 bytes techage/textures/techage_oil_animated.png | Bin 457 -> 0 bytes techage/textures/techage_oil_boiler_inv.png | Bin 1606 -> 0 bytes techage/textures/techage_oil_drill.png | Bin 349 -> 0 bytes techage/textures/techage_oil_drillbit.png | Bin 139 -> 0 bytes techage/textures/techage_oil_drillbit_inv.png | Bin 184 -> 0 bytes techage/textures/techage_oil_tower1.png | Bin 329 -> 0 bytes techage/textures/techage_oil_tower2.png | Bin 313 -> 0 bytes techage/textures/techage_oil_tower3.png | Bin 258 -> 0 bytes techage/textures/techage_oil_tower4.png | Bin 211 -> 0 bytes techage/textures/techage_oil_tower_inv.png | Bin 7348 -> 0 bytes techage/textures/techage_oil_tower_top.png | Bin 219 -> 0 bytes techage/textures/techage_palette256.png | Bin 133 -> 0 bytes techage/textures/techage_pipe_wrench.png | Bin 261 -> 0 bytes techage/textures/techage_plasma.png | Bin 865 -> 0 bytes techage/textures/techage_powder_inv.png | Bin 734 -> 0 bytes techage/textures/techage_power_line.png | Bin 188 -> 0 bytes techage/textures/techage_power_line_inv.png | Bin 563 -> 0 bytes techage/textures/techage_power_pole.png | Bin 168 -> 0 bytes techage/textures/techage_power_pole_top.png | Bin 220 -> 0 bytes techage/textures/techage_power_reduction.png | Bin 909 -> 0 bytes .../textures/techage_power_terminal_back.png | Bin 123 -> 0 bytes .../textures/techage_power_terminal_front.png | Bin 286 -> 0 bytes .../textures/techage_power_terminal_side.png | Bin 166 -> 0 bytes .../textures/techage_power_terminal_top.png | Bin 126 -> 0 bytes techage/textures/techage_programmer.png | Bin 750 -> 0 bytes techage/textures/techage_programmer_wield.png | Bin 558 -> 0 bytes techage/textures/techage_quarry_left.png | Bin 149 -> 0 bytes techage/textures/techage_quarry_left14.png | Bin 378 -> 0 bytes techage/textures/techage_rack_and_pinion.png | Bin 145 -> 0 bytes techage/textures/techage_ramchip.png | Bin 592 -> 0 bytes .../textures/techage_reactor_filler_plan.png | Bin 350 -> 0 bytes .../textures/techage_reactor_filler_side.png | Bin 187 -> 0 bytes .../textures/techage_reactor_filler_top.png | Bin 246 -> 0 bytes techage/textures/techage_reactor_inv.png | Bin 5789 -> 0 bytes techage/textures/techage_reactor_plan.png | Bin 362 -> 0 bytes techage/textures/techage_reactor_shell.png | Bin 497 -> 0 bytes techage/textures/techage_reactor_side.png | Bin 3172 -> 0 bytes .../textures/techage_reactor_stand_back.png | Bin 390 -> 0 bytes .../textures/techage_reactor_stand_bottom.png | Bin 321 -> 0 bytes .../textures/techage_reactor_stand_front.png | Bin 353 -> 0 bytes .../textures/techage_reactor_stand_side.png | Bin 269 -> 0 bytes .../textures/techage_reactor_stand_top.png | Bin 344 -> 0 bytes techage/textures/techage_repairkit.png | Bin 545 -> 0 bytes techage/textures/techage_rope.png | Bin 97 -> 0 bytes techage/textures/techage_rope_inv.png | Bin 122 -> 0 bytes techage/textures/techage_rotor.png | Bin 134 -> 0 bytes techage/textures/techage_rotor_blade.png | Bin 1054 -> 0 bytes techage/textures/techage_rotor_blades.png | Bin 719 -> 0 bytes techage/textures/techage_rotor_lamp_off.png | Bin 195 -> 0 bytes techage/textures/techage_rotor_lamp_on.png | Bin 224 -> 0 bytes techage/textures/techage_rotor_top.png | Bin 200 -> 0 bytes techage/textures/techage_round_ceramic.png | Bin 435 -> 0 bytes techage/textures/techage_screwdriver.png | Bin 290 -> 0 bytes techage/textures/techage_server2_back.png | Bin 272 -> 0 bytes techage/textures/techage_server2_front.png | Bin 269 -> 0 bytes techage/textures/techage_server2_side.png | Bin 231 -> 0 bytes techage/textures/techage_server2_top.png | Bin 169 -> 0 bytes techage/textures/techage_server_back.png | Bin 183 -> 0 bytes techage/textures/techage_server_front.png | Bin 166 -> 0 bytes techage/textures/techage_server_side.png | Bin 166 -> 0 bytes techage/textures/techage_server_top.png | Bin 135 -> 0 bytes techage/textures/techage_sieve_gravel_ta1.png | Bin 529 -> 0 bytes techage/textures/techage_sieve_sieve_ta1.png | Bin 369 -> 0 bytes techage/textures/techage_sieve_top_ta1.png | Bin 296 -> 0 bytes techage/textures/techage_signal_lamp.png | Bin 247 -> 0 bytes techage/textures/techage_signallamp2.png | Bin 94 -> 0 bytes techage/textures/techage_signaltower.png | Bin 222 -> 0 bytes .../textures/techage_signaltower_amber.png | Bin 212 -> 0 bytes .../textures/techage_signaltower_green.png | Bin 195 -> 0 bytes techage/textures/techage_signaltower_red.png | Bin 210 -> 0 bytes techage/textures/techage_signaltower_top.png | Bin 135 -> 0 bytes techage/textures/techage_silicon_wafer.png | Bin 1559 -> 0 bytes techage/textures/techage_sluice1_inv.png | Bin 607 -> 0 bytes techage/textures/techage_sluice2_inv.png | Bin 835 -> 0 bytes .../techage_smart_button_inventory.png | Bin 236 -> 0 bytes techage/textures/techage_smart_button_off.png | Bin 274 -> 0 bytes techage/textures/techage_smart_button_on.png | Bin 268 -> 0 bytes techage/textures/techage_smartline.png | Bin 213 -> 0 bytes .../textures/techage_smartline_button_2x.png | Bin 190 -> 0 bytes .../textures/techage_smartline_button_4x.png | Bin 180 -> 0 bytes .../techage_smartline_button_4x_on1.png | Bin 107 -> 0 bytes .../techage_smartline_button_4x_on2.png | Bin 107 -> 0 bytes .../techage_smartline_button_4x_on3.png | Bin 107 -> 0 bytes .../techage_smartline_button_4x_on4.png | Bin 107 -> 0 bytes .../textures/techage_smartline_button_inv.png | Bin 261 -> 0 bytes .../textures/techage_smartline_button_off.png | Bin 198 -> 0 bytes .../textures/techage_smartline_button_on.png | Bin 198 -> 0 bytes .../textures/techage_smartline_collector.png | Bin 249 -> 0 bytes .../techage_smartline_collector_inv.png | Bin 348 -> 0 bytes .../textures/techage_smartline_detector.png | Bin 206 -> 0 bytes .../techage_smartline_detector_inv.png | Bin 247 -> 0 bytes .../techage_smartline_detector_on.png | Bin 206 -> 0 bytes .../techage_smartline_mba_detector.png | Bin 408 -> 0 bytes .../techage_smartline_mba_detector_inv.png | Bin 669 -> 0 bytes .../textures/techage_smartline_signal_2x.png | Bin 175 -> 0 bytes .../textures/techage_smartline_signal_4x.png | Bin 162 -> 0 bytes .../techage_smartline_signal_amber1.png | Bin 108 -> 0 bytes .../techage_smartline_signal_amber2.png | Bin 108 -> 0 bytes .../techage_smartline_signal_amber3.png | Bin 108 -> 0 bytes .../techage_smartline_signal_amber4.png | Bin 108 -> 0 bytes .../techage_smartline_signal_green1.png | Bin 108 -> 0 bytes .../techage_smartline_signal_green2.png | Bin 108 -> 0 bytes .../techage_smartline_signal_green3.png | Bin 108 -> 0 bytes .../techage_smartline_signal_green4.png | Bin 108 -> 0 bytes .../techage_smartline_signal_off1.png | Bin 108 -> 0 bytes .../techage_smartline_signal_off2.png | Bin 108 -> 0 bytes .../techage_smartline_signal_off3.png | Bin 108 -> 0 bytes .../techage_smartline_signal_off4.png | Bin 108 -> 0 bytes .../techage_smartline_signal_red1.png | Bin 108 -> 0 bytes .../techage_smartline_signal_red2.png | Bin 108 -> 0 bytes .../techage_smartline_signal_red3.png | Bin 108 -> 0 bytes .../techage_smartline_signal_red4.png | Bin 108 -> 0 bytes techage/textures/techage_smoke.png | Bin 255 -> 0 bytes .../techage_solar_cell_mini_bottom.png | Bin 208 -> 0 bytes .../textures/techage_solar_cell_mini_side.png | Bin 115 -> 0 bytes .../textures/techage_solar_cell_mini_top.png | Bin 134 -> 0 bytes .../textures/techage_solar_module_bottom.png | Bin 124 -> 0 bytes techage/textures/techage_solar_module_inv.png | Bin 1625 -> 0 bytes techage/textures/techage_solar_module_top.png | Bin 118 -> 0 bytes techage/textures/techage_steam_hole.png | Bin 171 -> 0 bytes techage/textures/techage_steam_hole2.png | Bin 158 -> 0 bytes techage/textures/techage_steam_knee.png | Bin 229 -> 0 bytes techage/textures/techage_steam_knee2.png | Bin 169 -> 0 bytes techage/textures/techage_steam_pipe.png | Bin 189 -> 0 bytes techage/textures/techage_steel_tiles.png | Bin 330 -> 0 bytes techage/textures/techage_steel_tiles_side.png | Bin 133 -> 0 bytes techage/textures/techage_steel_tiles_top.png | Bin 108 -> 0 bytes techage/textures/techage_steel_tiles_top2.png | Bin 141 -> 0 bytes techage/textures/techage_steel_tiles_top3.png | Bin 109 -> 0 bytes techage/textures/techage_steelmat.png | Bin 259 -> 0 bytes techage/textures/techage_streetlamp.png | Bin 165 -> 0 bytes .../textures/techage_streetlamp2_housing.png | Bin 200 -> 0 bytes .../techage_streetlamp2_housing_on.png | Bin 200 -> 0 bytes techage/textures/techage_streetlamp2_off.png | Bin 162 -> 0 bytes techage/textures/techage_streetlamp2_on.png | Bin 159 -> 0 bytes techage/textures/techage_streetlamp_off.png | Bin 288 -> 0 bytes techage/textures/techage_streetlamp_top.png | Bin 195 -> 0 bytes techage/textures/techage_symbol_liquid.png | Bin 186 -> 0 bytes techage/textures/techage_symbol_powder.png | Bin 203 -> 0 bytes techage/textures/techage_ta1.png | Bin 4594 -> 0 bytes techage/textures/techage_ta2.png | Bin 8758 -> 0 bytes techage/textures/techage_ta3.png | Bin 8447 -> 0 bytes techage/textures/techage_ta3b.png | Bin 3778 -> 0 bytes techage/textures/techage_ta4.png | Bin 3902 -> 0 bytes techage/textures/techage_ta4_cable.png | Bin 190 -> 0 bytes techage/textures/techage_ta4_cable_end.png | Bin 200 -> 0 bytes techage/textures/techage_ta4_cable_hole.png | Bin 115 -> 0 bytes techage/textures/techage_ta4_cable_inv.png | Bin 125 -> 0 bytes techage/textures/techage_ta4_controller.png | Bin 265 -> 0 bytes .../techage_ta4_controller_inventory.png | Bin 410 -> 0 bytes techage/textures/techage_ta4_filter.png | Bin 16984 -> 0 bytes .../textures/techage_ta4_junctionbox_side.png | Bin 183 -> 0 bytes .../textures/techage_ta4_junctionbox_top.png | Bin 200 -> 0 bytes techage/textures/techage_ta4_solar.png | Bin 7285 -> 0 bytes techage/textures/techage_ta4_streetlamp.png | Bin 769 -> 0 bytes techage/textures/techage_ta4_tes.png | Bin 7160 -> 0 bytes techage/textures/techage_ta4c.png | Bin 7606 -> 0 bytes techage/textures/techage_ta5_gaspipe.png | Bin 119 -> 0 bytes techage/textures/techage_ta5_gaspipeB.png | Bin 115 -> 0 bytes techage/textures/techage_ta5_gaspipe_hole.png | Bin 129 -> 0 bytes .../textures/techage_ta5_gaspipe_hole2.png | Bin 160 -> 0 bytes .../textures/techage_ta5_gaspipe_junction.png | Bin 243 -> 0 bytes techage/textures/techage_ta5_gaspipe_knee.png | Bin 163 -> 0 bytes .../textures/techage_ta5_gaspipe_knee2.png | Bin 151 -> 0 bytes techage/textures/techage_tank_cart_bottom.png | Bin 210 -> 0 bytes techage/textures/techage_tank_cart_front.png | Bin 256 -> 0 bytes techage/textures/techage_tank_cart_side.png | Bin 246 -> 0 bytes techage/textures/techage_tank_cart_top.png | Bin 198 -> 0 bytes techage/textures/techage_terminal1_bottom.png | Bin 113 -> 0 bytes techage/textures/techage_terminal1_front.png | Bin 186 -> 0 bytes techage/textures/techage_terminal1_side.png | Bin 147 -> 0 bytes techage/textures/techage_terminal1_top.png | Bin 200 -> 0 bytes techage/textures/techage_terminal2_back.png | Bin 144 -> 0 bytes techage/textures/techage_terminal2_front.png | Bin 224 -> 0 bytes techage/textures/techage_terminal2_side.png | Bin 135 -> 0 bytes techage/textures/techage_terminal2_top.png | Bin 191 -> 0 bytes techage/textures/techage_tes_inlet.png | Bin 183 -> 0 bytes .../textures/techage_tool_hammer_bronze.png | Bin 647 -> 0 bytes .../textures/techage_tool_hammer_diamond.png | Bin 628 -> 0 bytes .../textures/techage_tool_hammer_meridium.png | Bin 626 -> 0 bytes techage/textures/techage_tool_hammer_mese.png | Bin 639 -> 0 bytes .../textures/techage_tool_hammer_steel.png | Bin 627 -> 0 bytes .../textures/techage_tool_hammer_stone.png | Bin 826 -> 0 bytes techage/textures/techage_top_ta4.png | Bin 235 -> 0 bytes techage/textures/techage_trafo.png | Bin 130 -> 0 bytes techage/textures/techage_trowel.png | Bin 277 -> 0 bytes techage/textures/techage_tube_hole.png | Bin 194 -> 0 bytes techage/textures/techage_tube_hole2.png | Bin 278 -> 0 bytes techage/textures/techage_tube_junction.png | Bin 395 -> 0 bytes techage/textures/techage_tube_knee.png | Bin 373 -> 0 bytes techage/textures/techage_tube_knee2.png | Bin 324 -> 0 bytes techage/textures/techage_tube_tube.png | Bin 321 -> 0 bytes techage/textures/techage_tubeta4_hole2.png | Bin 233 -> 0 bytes techage/textures/techage_tubeta4_junction.png | Bin 404 -> 0 bytes techage/textures/techage_tubeta4_knee.png | Bin 323 -> 0 bytes techage/textures/techage_tubeta4_knee2.png | Bin 239 -> 0 bytes techage/textures/techage_tubeta4_tube.png | Bin 233 -> 0 bytes techage/textures/techage_usmium_nuggets.png | Bin 253 -> 0 bytes techage/textures/techage_vacuum_tube.png | Bin 311 -> 0 bytes techage/textures/techage_water_flowing.png | Bin 178 -> 0 bytes techage/textures/techage_watermill1_inv.png | Bin 139 -> 0 bytes techage/textures/techage_watermill2_inv.png | Bin 131 -> 0 bytes techage/textures/techage_watermill3_inv.png | Bin 120 -> 0 bytes techage/textures/techage_watermill4_inv.png | Bin 165 -> 0 bytes techage/textures/techage_weight_bottom.png | Bin 270 -> 0 bytes techage/textures/techage_weight_side.png | Bin 254 -> 0 bytes techage/textures/techage_wind_turbine_inv.png | Bin 1643 -> 0 bytes techage/textures/techage_wlanchip.png | Bin 878 -> 0 bytes techage/textures/techage_wood50.png | Bin 163 -> 0 bytes techage/tools/assembly_tool.lua | 198 -- techage/tools/end_wrench.lua | 244 --- techage/tools/pipe_wrench.lua | 41 - techage/tools/screwdriver.lua | 160 -- techage/tools/trowel.lua | 68 - techage/wind_turbine/pillar.lua | 44 - techage/wind_turbine/rotor.lua | 396 ---- techage/wind_turbine/signallamp.lua | 109 -- 1014 files changed, 4 insertions(+), 88661 deletions(-) create mode 100644 .gitmodules create mode 160000 techage delete mode 100644 techage/.test/sink.lua delete mode 100644 techage/.test/testblock.lua delete mode 100644 techage/LICENSE.txt delete mode 100644 techage/README.md delete mode 100644 techage/_config.yml delete mode 100644 techage/api.md delete mode 100644 techage/basic_machines/autocrafter.lua delete mode 100644 techage/basic_machines/blackhole.lua delete mode 100644 techage/basic_machines/chest.lua delete mode 100644 techage/basic_machines/concentrator.lua delete mode 100644 techage/basic_machines/consumer.lua delete mode 100644 techage/basic_machines/distributor.lua delete mode 100644 techage/basic_machines/electronic_fab.lua delete mode 100644 techage/basic_machines/forceload.lua delete mode 100644 techage/basic_machines/foreign_nodes.lua delete mode 100644 techage/basic_machines/gravelrinser.lua delete mode 100644 techage/basic_machines/gravelsieve.lua delete mode 100644 techage/basic_machines/grinder.lua delete mode 100644 techage/basic_machines/itemsource.lua delete mode 100644 techage/basic_machines/liquidsampler.lua delete mode 100644 techage/basic_machines/mods_support.lua delete mode 100644 techage/basic_machines/pusher.lua delete mode 100644 techage/basic_machines/quarry.lua delete mode 100644 techage/basic_machines/recipeblock.lua delete mode 100644 techage/basic_machines/recycler.lua delete mode 100644 techage/basic_machines/source.lua delete mode 100644 techage/basic_machines/ta4_chest.lua delete mode 100644 techage/basic_machines/ta4_injector.lua delete mode 100644 techage/basic_machines/ta5_chest.lua delete mode 100644 techage/basis/assemble.lua delete mode 100644 techage/basis/boiler_lib.lua delete mode 100644 techage/basis/command.lua delete mode 100644 techage/basis/conf_inv.lua delete mode 100644 techage/basis/counting.lua delete mode 100644 techage/basis/fake_player.lua delete mode 100644 techage/basis/firebox_lib.lua delete mode 100644 techage/basis/fly_lib.lua delete mode 100644 techage/basis/formspec_update.lua delete mode 100644 techage/basis/fuel_lib.lua delete mode 100644 techage/basis/gravel_lib.lua delete mode 100644 techage/basis/hyperloop.lua delete mode 100644 techage/basis/laser_lib.lua delete mode 100644 techage/basis/legacy.lua delete mode 100644 techage/basis/lib.lua delete mode 100644 techage/basis/liquid_lib.lua delete mode 100644 techage/basis/manual.lua delete mode 100644 techage/basis/mark.lua delete mode 100644 techage/basis/mark2.lua delete mode 100644 techage/basis/mark_lib.lua delete mode 100644 techage/basis/node_states.lua delete mode 100644 techage/basis/node_store.lua delete mode 100644 techage/basis/nodedata_meta.lua delete mode 100644 techage/basis/nodedata_sqlite.lua delete mode 100644 techage/basis/numbers_sqlite.lua delete mode 100644 techage/basis/numbers_storage.lua delete mode 100644 techage/basis/oggfiles.lua delete mode 100644 techage/basis/pack_lib.lua delete mode 100644 techage/basis/recipe_lib.lua delete mode 100644 techage/basis/shared_inv.lua delete mode 100644 techage/basis/shared_tank.lua delete mode 100644 techage/basis/submenu.lua delete mode 100644 techage/basis/teleport.lua delete mode 100644 techage/basis/tube_wall_entry.lua delete mode 100644 techage/basis/tubes.lua delete mode 100644 techage/basis/tubes_ta4.lua delete mode 100644 techage/basis/windturbine_lib.lua delete mode 100644 techage/beduino/kv_store.lua delete mode 100644 techage/carts/chest_cart.lua delete mode 100644 techage/carts/tank_cart.lua delete mode 100644 techage/chemistry/ta4_doser.lua delete mode 100644 techage/chemistry/ta4_liquid_filter.lua delete mode 100644 techage/chemistry/ta4_reactor.lua delete mode 100644 techage/chemistry/ta4_stand.lua delete mode 100644 techage/coal_power_station/boiler_base.lua delete mode 100644 techage/coal_power_station/boiler_top.lua delete mode 100644 techage/coal_power_station/cooler.lua delete mode 100644 techage/coal_power_station/firebox.lua delete mode 100644 techage/coal_power_station/generator.lua delete mode 100644 techage/coal_power_station/oilfirebox.lua delete mode 100644 techage/coal_power_station/turbine.lua delete mode 100644 techage/collider/cooler.lua delete mode 100644 techage/collider/detector.lua delete mode 100644 techage/collider/inlets.lua delete mode 100644 techage/collider/magnet.lua delete mode 100644 techage/collider/vacuumtube.lua delete mode 100644 techage/collider/worker.lua delete mode 100644 techage/digtron/battery.lua delete mode 100644 techage/doc/guide.lua delete mode 100644 techage/doc/items.lua delete mode 100644 techage/doc/manual_DE.lua delete mode 100644 techage/doc/manual_EN.lua delete mode 100644 techage/doc/manual_RU.lua delete mode 100644 techage/doc/manual_pt-BR.lua delete mode 100644 techage/doc/manual_ta1_DE.lua delete mode 100644 techage/doc/manual_ta1_EN.lua delete mode 100644 techage/doc/manual_ta1_RU.lua delete mode 100644 techage/doc/manual_ta1_pt-BR.lua delete mode 100644 techage/doc/manual_ta2_DE.lua delete mode 100644 techage/doc/manual_ta2_EN.lua delete mode 100644 techage/doc/manual_ta2_RU.lua delete mode 100644 techage/doc/manual_ta2_pt-BR.lua delete mode 100644 techage/doc/manual_ta3_DE.lua delete mode 100644 techage/doc/manual_ta3_EN.lua delete mode 100644 techage/doc/manual_ta3_RU.lua delete mode 100644 techage/doc/manual_ta3_pt-BR.lua delete mode 100644 techage/doc/manual_ta4_DE.lua delete mode 100644 techage/doc/manual_ta4_EN.lua delete mode 100644 techage/doc/manual_ta4_RU.lua delete mode 100644 techage/doc/manual_ta4_pt-BR.lua delete mode 100644 techage/doc/manual_ta5_DE.lua delete mode 100644 techage/doc/manual_ta5_EN.lua delete mode 100644 techage/doc/manual_ta5_RU.lua delete mode 100644 techage/doc/manual_ta5_pt-BR.lua delete mode 100644 techage/doc/plans.lua delete mode 100644 techage/energy_storage/generator.lua delete mode 100644 techage/energy_storage/heatexchanger1.lua delete mode 100644 techage/energy_storage/heatexchanger2.lua delete mode 100644 techage/energy_storage/heatexchanger3.lua delete mode 100644 techage/energy_storage/inlet.lua delete mode 100644 techage/energy_storage/nodes.lua delete mode 100644 techage/energy_storage/turbine.lua delete mode 100644 techage/fermenter/gasflare.lua delete mode 100644 techage/furnace/booster.lua delete mode 100644 techage/furnace/cooking.lua delete mode 100644 techage/furnace/firebox.lua delete mode 100644 techage/furnace/furnace_top.lua delete mode 100644 techage/furnace/heater.lua delete mode 100644 techage/furnace/recipes.lua delete mode 100644 techage/fusion_reactor/controller.lua delete mode 100644 techage/fusion_reactor/gas_pipe.lua delete mode 100644 techage/fusion_reactor/generator.lua delete mode 100644 techage/fusion_reactor/heatexchanger1.lua delete mode 100644 techage/fusion_reactor/heatexchanger2.lua delete mode 100644 techage/fusion_reactor/heatexchanger3.lua delete mode 100644 techage/fusion_reactor/magnet.lua delete mode 100644 techage/fusion_reactor/shell.lua delete mode 100644 techage/fusion_reactor/ta5_pump.lua delete mode 100644 techage/fusion_reactor/turbine.lua delete mode 100644 techage/hydrogen/electrolyzer.lua delete mode 100644 techage/hydrogen/fuelcell.lua delete mode 100644 techage/hydrogen/fuelcellstack.lua delete mode 100755 techage/i18n.py delete mode 100644 techage/icta_controller/action.lua delete mode 100644 techage/icta_controller/battery.lua delete mode 100644 techage/icta_controller/commands.lua delete mode 100644 techage/icta_controller/condition.lua delete mode 100644 techage/icta_controller/controller.lua delete mode 100644 techage/icta_controller/display.lua delete mode 100644 techage/icta_controller/edit.lua delete mode 100644 techage/icta_controller/formspec.lua delete mode 100644 techage/icta_controller/signaltower.lua delete mode 100644 techage/icta_controller/submenu.lua delete mode 100644 techage/images/chemical_reactor.png delete mode 100644 techage/images/distillation_tower.png delete mode 100644 techage/images/drilling_tower.png delete mode 100644 techage/images/fusion_reactor.png delete mode 100644 techage/images/melting_furnace.png delete mode 100644 techage/images/solar_plant.png delete mode 100644 techage/images/steam_engine.png delete mode 100644 techage/images/tank_cart.png delete mode 100644 techage/images/thermal_energy_storage.png delete mode 100644 techage/images/watermill.png delete mode 100644 techage/images/wind_plant.png delete mode 100644 techage/init.lua delete mode 100644 techage/iron_age/charcoalpile.lua delete mode 100644 techage/iron_age/coalburner.lua delete mode 100644 techage/iron_age/gravelsieve.lua delete mode 100644 techage/iron_age/hammer.lua delete mode 100644 techage/iron_age/hopper.lua delete mode 100644 techage/iron_age/lighter.lua delete mode 100644 techage/iron_age/main.lua delete mode 100644 techage/iron_age/meltingpot.lua delete mode 100644 techage/iron_age/meridium.lua delete mode 100644 techage/iron_age/recipes.lua delete mode 100644 techage/iron_age/tools.lua delete mode 100644 techage/items/aluminium.lua delete mode 100644 techage/items/baborium.lua delete mode 100644 techage/items/barrel.lua delete mode 100644 techage/items/basalt.lua delete mode 100644 techage/items/bauxit.lua delete mode 100644 techage/items/cement.lua delete mode 100644 techage/items/ceramic.lua delete mode 100644 techage/items/cracking.lua delete mode 100644 techage/items/electronic.lua delete mode 100644 techage/items/epoxy.lua delete mode 100644 techage/items/filling.lua delete mode 100644 techage/items/hydrogen.lua delete mode 100644 techage/items/lye.lua delete mode 100644 techage/items/moreblocks.lua delete mode 100644 techage/items/oil.lua delete mode 100644 techage/items/petroleum.lua delete mode 100644 techage/items/plastic.lua delete mode 100644 techage/items/powder.lua delete mode 100644 techage/items/redstone.lua delete mode 100644 techage/items/registered_nodes.lua delete mode 100644 techage/items/salt.lua delete mode 100644 techage/items/silicon.lua delete mode 100644 techage/items/steelmat.lua delete mode 100644 techage/items/usmium.lua delete mode 100644 techage/lamps/ceilinglamp.lua delete mode 100644 techage/lamps/growlight.lua delete mode 100644 techage/lamps/industriallamp1.lua delete mode 100644 techage/lamps/industriallamp2.lua delete mode 100644 techage/lamps/industriallamp3.lua delete mode 100644 techage/lamps/industriallamp4.lua delete mode 100644 techage/lamps/lampholder.lua delete mode 100644 techage/lamps/lib.lua delete mode 100644 techage/lamps/lightblock.lua delete mode 100644 techage/lamps/simplelamp.lua delete mode 100644 techage/lamps/streetlamp.lua delete mode 100644 techage/lamps/streetlamp2.lua delete mode 100644 techage/liquids/filler.lua delete mode 100644 techage/liquids/liquid_pipe.lua delete mode 100644 techage/liquids/pipe_wall_entry.lua delete mode 100644 techage/liquids/pump.lua delete mode 100644 techage/liquids/silo.lua delete mode 100644 techage/liquids/ta5_tank.lua delete mode 100644 techage/liquids/tank.lua delete mode 100644 techage/liquids/valve.lua delete mode 100644 techage/liquids/waterinlet.lua delete mode 100644 techage/liquids/waterpump.lua delete mode 100644 techage/locale/techage.de.tr delete mode 100644 techage/locale/techage.fr.tr delete mode 100644 techage/locale/techage.ru.tr delete mode 100644 techage/locale/template.txt delete mode 100644 techage/logic/button.lua delete mode 100644 techage/logic/button_2x.lua delete mode 100644 techage/logic/button_4x.lua delete mode 100644 techage/logic/cart_detector.lua delete mode 100644 techage/logic/charge_detector.lua delete mode 100644 techage/logic/collector.lua delete mode 100644 techage/logic/command_converter.lua delete mode 100644 techage/logic/detector.lua delete mode 100644 techage/logic/flipflop.lua delete mode 100644 techage/logic/gaze_sensor.lua delete mode 100644 techage/logic/lib.lua delete mode 100755 techage/logic/light_detector.lua delete mode 100644 techage/logic/logic_block.lua delete mode 100644 techage/logic/lua_logic.lua delete mode 100644 techage/logic/mba_detector.lua delete mode 100644 techage/logic/mesecons_converter.lua delete mode 100644 techage/logic/node_detector.lua delete mode 100644 techage/logic/player_detector.lua delete mode 100644 techage/logic/programmer.lua delete mode 100644 techage/logic/repeater.lua delete mode 100644 techage/logic/sequencer.lua delete mode 100644 techage/logic/sequencer2.lua delete mode 100644 techage/logic/signallamp.lua delete mode 100644 techage/logic/signallamp_2x.lua delete mode 100644 techage/logic/signallamp_4x.lua delete mode 100644 techage/logic/terminal.lua delete mode 100644 techage/logic/timer.lua delete mode 100644 techage/lua_controller/commands.lua delete mode 100644 techage/lua_controller/controller.lua delete mode 100644 techage/lua_controller/sensorchest.lua delete mode 100644 techage/lua_controller/server.lua delete mode 100644 techage/lua_controller/terminal.lua delete mode 100644 techage/manuals/QSG.md delete mode 100644 techage/manuals/description.md delete mode 100644 techage/manuals/manual_DE.md delete mode 100644 techage/manuals/manual_EN.md delete mode 100644 techage/manuals/manual_RU.md delete mode 100644 techage/manuals/manual_pt-BR.md delete mode 100644 techage/manuals/manual_ta1_DE.md delete mode 100644 techage/manuals/manual_ta1_EN.md delete mode 100644 techage/manuals/manual_ta1_pt-BR.md delete mode 100644 techage/manuals/manual_ta2_DE.md delete mode 100644 techage/manuals/manual_ta2_EN.md delete mode 100644 techage/manuals/manual_ta2_pt-BR.md delete mode 100644 techage/manuals/manual_ta3_DE.md delete mode 100644 techage/manuals/manual_ta3_EN.md delete mode 100644 techage/manuals/manual_ta3_pt-BR.md delete mode 100644 techage/manuals/manual_ta4_DE.md delete mode 100644 techage/manuals/manual_ta4_EN.md delete mode 100644 techage/manuals/manual_ta4_pt-BR.md delete mode 100644 techage/manuals/manual_ta5_DE.md delete mode 100644 techage/manuals/manual_ta5_EN.md delete mode 100644 techage/manuals/manual_ta5_pt-BR.md delete mode 100644 techage/manuals/markdown_to_lua.py delete mode 100644 techage/manuals/ta4_icta_controller_DE.md delete mode 100644 techage/manuals/ta4_icta_controller_DE.pdf delete mode 100644 techage/manuals/ta4_icta_controller_EN.md delete mode 100644 techage/manuals/ta4_lua_controller_EN.md delete mode 100644 techage/manuals/ta4_lua_controller_EN.pdf delete mode 100644 techage/manuals/ta_kvstore.md delete mode 100644 techage/manuals/toc_DE.md delete mode 100644 techage/manuals/toc_EN.md delete mode 100644 techage/mod.conf delete mode 100644 techage/models/size.py delete mode 100644 techage/models/techage_cylinder_07.obj delete mode 100644 techage/models/techage_cylinder_09.obj delete mode 100644 techage/models/techage_cylinder_12.obj delete mode 100644 techage/models/techage_cylinder_12h.obj delete mode 100644 techage/models/techage_cylinder_14.obj delete mode 100644 techage/models/techage_rotor.b3d delete mode 100644 techage/move_controller/doorblock.lua delete mode 100644 techage/move_controller/doorcontroller.lua delete mode 100644 techage/move_controller/doorcontroller2.lua delete mode 100644 techage/move_controller/flycontroller.lua delete mode 100644 techage/move_controller/gateblock.lua delete mode 100644 techage/move_controller/movecontroller.lua delete mode 100644 techage/move_controller/soundblock.lua delete mode 100644 techage/move_controller/turncontroller.lua delete mode 100644 techage/oil/distiller.lua delete mode 100644 techage/oil/drillbox.lua delete mode 100644 techage/oil/explore.lua delete mode 100644 techage/oil/gasflare.lua delete mode 100644 techage/oil/pumpjack.lua delete mode 100644 techage/oil/reboiler.lua delete mode 100644 techage/oil/tower.lua delete mode 100644 techage/power/drive_axle.lua delete mode 100644 techage/power/electric_cable.lua delete mode 100644 techage/power/formspecs.lua delete mode 100644 techage/power/gearbox.lua delete mode 100644 techage/power/junctionbox.lua delete mode 100644 techage/power/power_line.lua delete mode 100644 techage/power/power_terminal.lua delete mode 100644 techage/power/power_terminal2.lua delete mode 100644 techage/power/powerswitch.lua delete mode 100644 techage/power/powerswitchbox.lua delete mode 100644 techage/power/powerswitchbox_legacy.lua delete mode 100644 techage/power/protection.lua delete mode 100644 techage/power/steam_pipe.lua delete mode 100644 techage/power/ta4_cable.lua delete mode 100644 techage/power/ta4_cable_wall_entry.lua delete mode 100644 techage/recipe_checker.lua delete mode 100644 techage/screenshot.png delete mode 100644 techage/settingtypes.txt delete mode 100644 techage/solar/inverter.lua delete mode 100644 techage/solar/minicell.lua delete mode 100644 techage/solar/solarcell.lua delete mode 100644 techage/sounds/techage_booster.ogg delete mode 100644 techage/sounds/techage_button.ogg delete mode 100644 techage/sounds/techage_explore.ogg delete mode 100644 techage/sounds/techage_gasflare.ogg delete mode 100644 techage/sounds/techage_generator.ogg delete mode 100644 techage/sounds/techage_hum.ogg delete mode 100644 techage/sounds/techage_mill.ogg delete mode 100644 techage/sounds/techage_oildrill.ogg delete mode 100644 techage/sounds/techage_quarry.ogg delete mode 100644 techage/sounds/techage_reactor.ogg delete mode 100644 techage/sounds/techage_reboiler.ogg delete mode 100644 techage/sounds/techage_steamengine.ogg delete mode 100644 techage/sounds/techage_tool1.ogg delete mode 100644 techage/sounds/techage_tool2.ogg delete mode 100644 techage/sounds/techage_turbine.ogg delete mode 100644 techage/sounds/techage_valve.ogg delete mode 100644 techage/sounds/techage_watermill.ogg delete mode 100644 techage/steam_engine/boiler.lua delete mode 100644 techage/steam_engine/cylinder.lua delete mode 100644 techage/steam_engine/firebox.lua delete mode 100644 techage/steam_engine/flywheel.lua delete mode 100644 techage/ta1_watermill/mill.lua delete mode 100644 techage/ta1_watermill/millboard.lua delete mode 100644 techage/ta1_watermill/sluice.lua delete mode 100644 techage/ta1_watermill/ta1_axle.lua delete mode 100644 techage/ta1_watermill/watermill.lua delete mode 100644 techage/ta2_energy_storage/ta2_clutch.lua delete mode 100644 techage/ta2_energy_storage/ta2_rope.lua delete mode 100644 techage/ta2_energy_storage/ta2_weight_chest.lua delete mode 100644 techage/ta2_energy_storage/ta2_winch.lua delete mode 100644 techage/ta3_power/akkubox.lua delete mode 100644 techage/ta3_power/axle2power.lua delete mode 100644 techage/ta3_power/power2axle.lua delete mode 100644 techage/ta3_power/tiny_generator.lua delete mode 100644 techage/ta4_power/electricmeter.lua delete mode 100644 techage/ta4_power/laser.lua delete mode 100644 techage/ta4_power/transformer.lua delete mode 100644 techage/teleport/teleport_pipe.lua delete mode 100644 techage/teleport/teleport_tube.lua delete mode 100755 techage/textures/generate.py delete mode 100644 techage/textures/techage_aichip.png delete mode 100644 techage/textures/techage_aluminum_inv.png delete mode 100644 techage/textures/techage_appl_arrow.png delete mode 100644 techage/textures/techage_appl_arrow2.png delete mode 100644 techage/textures/techage_appl_arrow3.png delete mode 100644 techage/textures/techage_appl_arrowXL.png delete mode 100644 techage/textures/techage_appl_arrow_white.png delete mode 100644 techage/textures/techage_appl_autocrafter.png delete mode 100644 techage/textures/techage_appl_autocrafter4.png delete mode 100644 techage/textures/techage_appl_blackhole.png delete mode 100644 techage/textures/techage_appl_button.png delete mode 100644 techage/textures/techage_appl_cartdetector.png delete mode 100644 techage/textures/techage_appl_cartdetector_on.png delete mode 100644 techage/textures/techage_appl_chest_back_ta3.png delete mode 100644 techage/textures/techage_appl_chest_back_ta4.png delete mode 100644 techage/textures/techage_appl_chest_front_ta3.png delete mode 100644 techage/textures/techage_appl_chest_front_ta4.png delete mode 100644 techage/textures/techage_appl_clutch.png delete mode 100644 techage/textures/techage_appl_clutch_on.png delete mode 100644 techage/textures/techage_appl_color_top.png delete mode 100644 techage/textures/techage_appl_color_top4.png delete mode 100644 techage/textures/techage_appl_command_converter.png delete mode 100644 techage/textures/techage_appl_command_converter_on.png delete mode 100644 techage/textures/techage_appl_compressor.png delete mode 100644 techage/textures/techage_appl_compressor4.png delete mode 100644 techage/textures/techage_appl_cooler.png delete mode 100644 techage/textures/techage_appl_cooler4.png delete mode 100644 techage/textures/techage_appl_ctrl_unit.png delete mode 100644 techage/textures/techage_appl_ctrl_unit4.png delete mode 100644 techage/textures/techage_appl_defect.png delete mode 100644 techage/textures/techage_appl_detector.png delete mode 100644 techage/textures/techage_appl_detector_on.png delete mode 100644 techage/textures/techage_appl_distri.png delete mode 100644 techage/textures/techage_appl_distri4.png delete mode 100644 techage/textures/techage_appl_distri_blue.png delete mode 100644 techage/textures/techage_appl_distri_green.png delete mode 100644 techage/textures/techage_appl_distri_red.png delete mode 100644 techage/textures/techage_appl_distri_yellow.png delete mode 100644 techage/textures/techage_appl_doorcontroller.png delete mode 100644 techage/textures/techage_appl_electric_gen_front.png delete mode 100644 techage/textures/techage_appl_electric_gen_front4.png delete mode 100644 techage/textures/techage_appl_electric_gen_side.png delete mode 100644 techage/textures/techage_appl_electric_gen_top.png delete mode 100644 techage/textures/techage_appl_electrolyzer.png delete mode 100644 techage/textures/techage_appl_electrolyzer4.png delete mode 100644 techage/textures/techage_appl_electronic_fab.png delete mode 100644 techage/textures/techage_appl_electronic_fab4.png delete mode 100644 techage/textures/techage_appl_explosive.png delete mode 100644 techage/textures/techage_appl_filler.png delete mode 100644 techage/textures/techage_appl_filler4.png delete mode 100644 techage/textures/techage_appl_firehole.png delete mode 100644 techage/textures/techage_appl_firehole4.png delete mode 100644 techage/textures/techage_appl_flipflop.png delete mode 100644 techage/textures/techage_appl_flipflop_on.png delete mode 100644 techage/textures/techage_appl_forceload.png delete mode 100644 techage/textures/techage_appl_fuelcell.png delete mode 100644 techage/textures/techage_appl_fuelcell4.png delete mode 100644 techage/textures/techage_appl_funnel.png delete mode 100644 techage/textures/techage_appl_funnel_top.png delete mode 100644 techage/textures/techage_appl_furnace.png delete mode 100644 techage/textures/techage_appl_gaze_sensor.png delete mode 100644 techage/textures/techage_appl_gaze_sensor_on.png delete mode 100644 techage/textures/techage_appl_generator.png delete mode 100644 techage/textures/techage_appl_generator4.png delete mode 100644 techage/textures/techage_appl_generator_red.png delete mode 100644 techage/textures/techage_appl_generator_red4.png delete mode 100644 techage/textures/techage_appl_grinder.png delete mode 100644 techage/textures/techage_appl_grinder2.png delete mode 100644 techage/textures/techage_appl_grinder4.png delete mode 100644 techage/textures/techage_appl_heater.png delete mode 100644 techage/textures/techage_appl_heater_on.png delete mode 100644 techage/textures/techage_appl_hole_electric.png delete mode 100644 techage/textures/techage_appl_hole_pipe.png delete mode 100644 techage/textures/techage_appl_hole_ta5_pipe1.png delete mode 100644 techage/textures/techage_appl_hole_ta5_pipe2.png delete mode 100644 techage/textures/techage_appl_hole_tube.png delete mode 100644 techage/textures/techage_appl_hopper.png delete mode 100644 techage/textures/techage_appl_hopper_right.png delete mode 100644 techage/textures/techage_appl_hopper_top.png delete mode 100644 techage/textures/techage_appl_injector.png delete mode 100644 techage/textures/techage_appl_injector14.png delete mode 100644 techage/textures/techage_appl_inp.png delete mode 100644 techage/textures/techage_appl_inverter.png delete mode 100644 techage/textures/techage_appl_inverterDC.png delete mode 100644 techage/textures/techage_appl_laser.png delete mode 100644 techage/textures/techage_appl_laser_hole.png delete mode 100755 techage/textures/techage_appl_lightdetector.png delete mode 100755 techage/textures/techage_appl_lightdetector_on.png delete mode 100644 techage/textures/techage_appl_liquid_hopper.png delete mode 100644 techage/textures/techage_appl_liquidsampler.png delete mode 100644 techage/textures/techage_appl_logic.png delete mode 100644 techage/textures/techage_appl_mesecons_converter.png delete mode 100644 techage/textures/techage_appl_meter.png delete mode 100644 techage/textures/techage_appl_movecontroller.png delete mode 100644 techage/textures/techage_appl_nodedetector.png delete mode 100644 techage/textures/techage_appl_nodedetector_on.png delete mode 100644 techage/textures/techage_appl_oildrill.png delete mode 100644 techage/textures/techage_appl_oilexplorer.png delete mode 100644 techage/textures/techage_appl_oilexplorer_top.png delete mode 100644 techage/textures/techage_appl_oilexplorer_top4.png delete mode 100644 techage/textures/techage_appl_open.png delete mode 100644 techage/textures/techage_appl_outp.png delete mode 100644 techage/textures/techage_appl_plasma.png delete mode 100644 techage/textures/techage_appl_plasma4.png delete mode 100644 techage/textures/techage_appl_playerdetector.png delete mode 100644 techage/textures/techage_appl_playerdetector_on.png delete mode 100644 techage/textures/techage_appl_pump.png delete mode 100644 techage/textures/techage_appl_pump8.png delete mode 100644 techage/textures/techage_appl_pump_up.png delete mode 100644 techage/textures/techage_appl_pump_up8.png delete mode 100644 techage/textures/techage_appl_pumpjack.png delete mode 100644 techage/textures/techage_appl_pumpjack14.png delete mode 100644 techage/textures/techage_appl_pusher.png delete mode 100644 techage/textures/techage_appl_pusher14.png delete mode 100644 techage/textures/techage_appl_quarry.png delete mode 100644 techage/textures/techage_appl_reboiler.png delete mode 100644 techage/textures/techage_appl_reboiler4.png delete mode 100644 techage/textures/techage_appl_recipeblock.png delete mode 100644 techage/textures/techage_appl_recycler.png delete mode 100644 techage/textures/techage_appl_repeater.png delete mode 100644 techage/textures/techage_appl_ribsB.png delete mode 100644 techage/textures/techage_appl_ribsM.png delete mode 100644 techage/textures/techage_appl_ribsT.png delete mode 100644 techage/textures/techage_appl_rinser.png delete mode 100644 techage/textures/techage_appl_rinser4_top.png delete mode 100644 techage/textures/techage_appl_rinser_top.png delete mode 100644 techage/textures/techage_appl_sensor.png delete mode 100644 techage/textures/techage_appl_sequencer.png delete mode 100644 techage/textures/techage_appl_sieve.png delete mode 100644 techage/textures/techage_appl_sieve4_top.png delete mode 100644 techage/textures/techage_appl_sieve_top.png delete mode 100644 techage/textures/techage_appl_silo.png delete mode 100644 techage/textures/techage_appl_sound.png delete mode 100644 techage/textures/techage_appl_source.png delete mode 100644 techage/textures/techage_appl_switch_inv.png delete mode 100644 techage/textures/techage_appl_switch_off.png delete mode 100644 techage/textures/techage_appl_switch_on.png delete mode 100644 techage/textures/techage_appl_ta4_cable.png delete mode 100644 techage/textures/techage_appl_tank.png delete mode 100644 techage/textures/techage_appl_tele_pipe.png delete mode 100644 techage/textures/techage_appl_tele_tube.png delete mode 100644 techage/textures/techage_appl_teleport.png delete mode 100644 techage/textures/techage_appl_tes_core.png delete mode 100644 techage/textures/techage_appl_tes_turb.png delete mode 100644 techage/textures/techage_appl_timer.png delete mode 100644 techage/textures/techage_appl_trafo.png delete mode 100644 techage/textures/techage_appl_turbine.png delete mode 100644 techage/textures/techage_appl_turbine4.png delete mode 100644 techage/textures/techage_appl_turn.png delete mode 100644 techage/textures/techage_appl_warehouse.png delete mode 100644 techage/textures/techage_appl_winch.png delete mode 100644 techage/textures/techage_appl_winch_hole.png delete mode 100644 techage/textures/techage_ash.png delete mode 100644 techage/textures/techage_ash_side.png delete mode 100644 techage/textures/techage_axle.png delete mode 100644 techage/textures/techage_axle4.png delete mode 100644 techage/textures/techage_axle4R.png delete mode 100644 techage/textures/techage_axleR.png delete mode 100644 techage/textures/techage_axle_bearing.png delete mode 100644 techage/textures/techage_axle_bearing_front.png delete mode 100644 techage/textures/techage_axle_clutch.png delete mode 100644 techage/textures/techage_axle_clutch4.png delete mode 100644 techage/textures/techage_axle_gearbox.png delete mode 100644 techage/textures/techage_axle_gearbox4.png delete mode 100644 techage/textures/techage_baborium.png delete mode 100644 techage/textures/techage_baborium_ingot.png delete mode 100644 techage/textures/techage_baborium_lump.png delete mode 100644 techage/textures/techage_barrel_inv.png delete mode 100644 techage/textures/techage_basalt_glass.png delete mode 100644 techage/textures/techage_basalt_glass2.png delete mode 100644 techage/textures/techage_basalt_glass3.png delete mode 100644 techage/textures/techage_battery_green.png delete mode 100644 techage/textures/techage_battery_inventory.png delete mode 100644 techage/textures/techage_battery_red.png delete mode 100644 techage/textures/techage_bauxit_overlay.png delete mode 100644 techage/textures/techage_bitumen_inv.png delete mode 100644 techage/textures/techage_boiler.png delete mode 100644 techage/textures/techage_boiler2.png delete mode 100644 techage/textures/techage_box_back.png delete mode 100644 techage/textures/techage_box_front.png delete mode 100644 techage/textures/techage_box_side.png delete mode 100644 techage/textures/techage_bucket_oil.png delete mode 100644 techage/textures/techage_button_off.png delete mode 100644 techage/textures/techage_button_on.png delete mode 100644 techage/textures/techage_cable_palette.png delete mode 100644 techage/textures/techage_canister_filling.png delete mode 100644 techage/textures/techage_canister_frame.png delete mode 100644 techage/textures/techage_carbon_fiber.png delete mode 100644 techage/textures/techage_ceilinglamp.png delete mode 100644 techage/textures/techage_ceilinglamp_bottom.png delete mode 100644 techage/textures/techage_ceilinglamp_top.png delete mode 100644 techage/textures/techage_ceramic_material.png delete mode 100644 techage/textures/techage_ceramic_turbine.png delete mode 100644 techage/textures/techage_charcoal.png delete mode 100644 techage/textures/techage_charcoal_burn.png delete mode 100644 techage/textures/techage_charge_detector_inv.png delete mode 100644 techage/textures/techage_charge_detector_off.png delete mode 100644 techage/textures/techage_charge_detector_on.png delete mode 100644 techage/textures/techage_chest_cart_bottom.png delete mode 100644 techage/textures/techage_chest_cart_front.png delete mode 100644 techage/textures/techage_chest_cart_side.png delete mode 100644 techage/textures/techage_chest_cart_top.png delete mode 100644 techage/textures/techage_clutch_clutch.png delete mode 100644 techage/textures/techage_coal_boiler.png delete mode 100644 techage/textures/techage_coal_boiler4.png delete mode 100644 techage/textures/techage_coal_boiler_fire_hole.png delete mode 100644 techage/textures/techage_coal_boiler_hole.png delete mode 100644 techage/textures/techage_coal_boiler_inv.png delete mode 100644 techage/textures/techage_coal_boiler_mesh_base.png delete mode 100644 techage/textures/techage_coal_boiler_mesh_top.png delete mode 100644 techage/textures/techage_collider_detector_appl.png delete mode 100644 techage/textures/techage_collider_detector_banner.png delete mode 100644 techage/textures/techage_collider_detector_core.png delete mode 100644 techage/textures/techage_collider_magnet.png delete mode 100644 techage/textures/techage_collider_magnet_appl.png delete mode 100644 techage/textures/techage_collider_magnet_sign.png delete mode 100644 techage/textures/techage_collider_magnet_tube.png delete mode 100644 techage/textures/techage_collider_plan.png delete mode 100644 techage/textures/techage_collider_plan2.png delete mode 100644 techage/textures/techage_collider_tube.png delete mode 100644 techage/textures/techage_collider_tube_open.png delete mode 100644 techage/textures/techage_color16.png delete mode 100644 techage/textures/techage_compressed_gravel.png delete mode 100644 techage/textures/techage_concrete.png delete mode 100644 techage/textures/techage_concrete4.png delete mode 100644 techage/textures/techage_constr_plan.png delete mode 100644 techage/textures/techage_constr_plan_br.png delete mode 100644 techage/textures/techage_constr_plan_de.png delete mode 100644 techage/textures/techage_constr_plan_en.png delete mode 100644 techage/textures/techage_constr_plan_inv.png delete mode 100644 techage/textures/techage_constr_plan_inv_br.png delete mode 100644 techage/textures/techage_constr_plan_inv_de.png delete mode 100644 techage/textures/techage_constr_plan_inv_en.png delete mode 100644 techage/textures/techage_constr_plan_inv_ru.png delete mode 100644 techage/textures/techage_constr_plan_ru.png delete mode 100644 techage/textures/techage_cooler.png delete mode 100644 techage/textures/techage_cube_mark.png delete mode 100644 techage/textures/techage_cylinder.png delete mode 100644 techage/textures/techage_cylinder4.png delete mode 100644 techage/textures/techage_display.png delete mode 100644 techage/textures/techage_displayXL.png delete mode 100644 techage/textures/techage_display_inventory.png delete mode 100644 techage/textures/techage_display_inventoryXL.png delete mode 100644 techage/textures/techage_distiller1.png delete mode 100644 techage/textures/techage_distiller2.png delete mode 100644 techage/textures/techage_distiller3.png delete mode 100644 techage/textures/techage_distiller4.png delete mode 100644 techage/textures/techage_distiller_inv.png delete mode 100644 techage/textures/techage_electric_button.png delete mode 100644 techage/textures/techage_electric_button_off.png delete mode 100644 techage/textures/techage_electric_button_on.png delete mode 100644 techage/textures/techage_electric_cable.png delete mode 100644 techage/textures/techage_electric_cable_end.png delete mode 100644 techage/textures/techage_electric_cable_inv.png delete mode 100644 techage/textures/techage_electric_junction.png delete mode 100644 techage/textures/techage_electric_plug.png delete mode 100644 techage/textures/techage_electric_switch.png delete mode 100644 techage/textures/techage_electric_switch_off.png delete mode 100644 techage/textures/techage_electric_trowel.png delete mode 100644 techage/textures/techage_end_wrench.png delete mode 100644 techage/textures/techage_fc_stack_inv.png delete mode 100644 techage/textures/techage_fermenter_foil.png delete mode 100644 techage/textures/techage_filling4_ta2.png delete mode 100644 techage/textures/techage_filling4_ta3.png delete mode 100644 techage/textures/techage_filling4_ta4.png delete mode 100644 techage/textures/techage_filling8_ta2.png delete mode 100644 techage/textures/techage_filling8_ta3.png delete mode 100644 techage/textures/techage_filling8_ta4.png delete mode 100644 techage/textures/techage_filling_metal.png delete mode 100644 techage/textures/techage_filling_ta2.png delete mode 100644 techage/textures/techage_filling_ta3.png delete mode 100644 techage/textures/techage_filling_ta4.png delete mode 100644 techage/textures/techage_filter_inv.png delete mode 100644 techage/textures/techage_firebox.png delete mode 100644 techage/textures/techage_firebox4.png delete mode 100644 techage/textures/techage_flame.png delete mode 100644 techage/textures/techage_flame_animated.png delete mode 100644 techage/textures/techage_flywheel.png delete mode 100644 techage/textures/techage_flywheel8.png delete mode 100644 techage/textures/techage_form_add_arrow.png delete mode 100644 techage/textures/techage_form_arrow.png delete mode 100644 techage/textures/techage_form_arrow_bg.png delete mode 100644 techage/textures/techage_form_arrow_fg.png delete mode 100644 techage/textures/techage_form_gear_bg.png delete mode 100644 techage/textures/techage_form_get_arrow.png delete mode 100644 techage/textures/techage_form_grey.png delete mode 100644 techage/textures/techage_form_input.png delete mode 100644 techage/textures/techage_form_input_arrow.png delete mode 100644 techage/textures/techage_form_inventory.png delete mode 100644 techage/textures/techage_form_level_bg.png delete mode 100644 techage/textures/techage_form_level_charge.png delete mode 100644 techage/textures/techage_form_level_fg.png delete mode 100644 techage/textures/techage_form_level_off.png delete mode 100644 techage/textures/techage_form_level_red_fg.png delete mode 100644 techage/textures/techage_form_level_unload.png delete mode 100644 techage/textures/techage_form_mask.png delete mode 100644 techage/textures/techage_form_output_arrow.png delete mode 100644 techage/textures/techage_form_tank.png delete mode 100644 techage/textures/techage_form_temp_bg.png delete mode 100644 techage/textures/techage_form_temp_fg.png delete mode 100644 techage/textures/techage_formspec_bg.png delete mode 100644 techage/textures/techage_frame14_ta2.png delete mode 100644 techage/textures/techage_frame14_ta3.png delete mode 100644 techage/textures/techage_frame14_ta4.png delete mode 100644 techage/textures/techage_frame14_ta4_hp.png delete mode 100644 techage/textures/techage_frame4_ta2.png delete mode 100644 techage/textures/techage_frame4_ta2_top.png delete mode 100644 techage/textures/techage_frame4_ta3.png delete mode 100644 techage/textures/techage_frame4_ta3_top.png delete mode 100644 techage/textures/techage_frame4_ta4.png delete mode 100644 techage/textures/techage_frame4_ta4_hp.png delete mode 100644 techage/textures/techage_frame4_ta4_top.png delete mode 100644 techage/textures/techage_frame4_ta4_top_hp.png delete mode 100644 techage/textures/techage_frame4_ta5.png delete mode 100644 techage/textures/techage_frame8_ta2.png delete mode 100644 techage/textures/techage_frame8_ta3.png delete mode 100644 techage/textures/techage_frame8_ta4.png delete mode 100644 techage/textures/techage_frame8_ta4_hp.png delete mode 100644 techage/textures/techage_frame8_ta5.png delete mode 100644 techage/textures/techage_frameB_ta4.png delete mode 100644 techage/textures/techage_frameM_ta4.png delete mode 100644 techage/textures/techage_frameT_ta4.png delete mode 100644 techage/textures/techage_frameT_ta5.png delete mode 100644 techage/textures/techage_frame_small_ta3.png delete mode 100644 techage/textures/techage_frame_ta2.png delete mode 100644 techage/textures/techage_frame_ta2_bottom.png delete mode 100644 techage/textures/techage_frame_ta2_top.png delete mode 100644 techage/textures/techage_frame_ta3.png delete mode 100644 techage/textures/techage_frame_ta3_bottom.png delete mode 100644 techage/textures/techage_frame_ta3_top.png delete mode 100644 techage/textures/techage_frame_ta4.png delete mode 100644 techage/textures/techage_frame_ta4_bottom.png delete mode 100644 techage/textures/techage_frame_ta4_hp.png delete mode 100644 techage/textures/techage_frame_ta4_top.png delete mode 100644 techage/textures/techage_frame_ta4_top_hp.png delete mode 100644 techage/textures/techage_frame_ta5.png delete mode 100644 techage/textures/techage_frame_ta5_top.png delete mode 100644 techage/textures/techage_frame_waterpump.png delete mode 100644 techage/textures/techage_frame_waterpump_top.png delete mode 100644 techage/textures/techage_framexl_ta3.png delete mode 100644 techage/textures/techage_framexl_ta3_top.png delete mode 100644 techage/textures/techage_furnace_ceramic.png delete mode 100644 techage/textures/techage_fusion_reactor.png delete mode 100644 techage/textures/techage_gas_cylinder_large.png delete mode 100644 techage/textures/techage_gas_cylinder_small.png delete mode 100644 techage/textures/techage_gas_inv.png delete mode 100644 techage/textures/techage_gasflare.png delete mode 100644 techage/textures/techage_gaspipe.png delete mode 100644 techage/textures/techage_gaspipe_hole.png delete mode 100644 techage/textures/techage_gaspipe_hole2.png delete mode 100644 techage/textures/techage_gaspipe_junction.png delete mode 100644 techage/textures/techage_gaspipe_knee.png delete mode 100644 techage/textures/techage_gaspipe_knee2.png delete mode 100644 techage/textures/techage_gaspipe_valve_closed.png delete mode 100644 techage/textures/techage_gaspipe_valve_hole.png delete mode 100644 techage/textures/techage_gaspipe_valve_open.png delete mode 100644 techage/textures/techage_gate.png delete mode 100644 techage/textures/techage_gravel4.png delete mode 100644 techage/textures/techage_growlight_back.png delete mode 100644 techage/textures/techage_growlight_off.png delete mode 100644 techage/textures/techage_growlight_on.png delete mode 100644 techage/textures/techage_growlight_side.png delete mode 100644 techage/textures/techage_heat_exchanger_inv.png delete mode 100644 techage/textures/techage_hole_ta4.png delete mode 100644 techage/textures/techage_hopper.png delete mode 100644 techage/textures/techage_hydrogen_inv.png delete mode 100644 techage/textures/techage_industlight4_on.png delete mode 100644 techage/textures/techage_industriallamp1.png delete mode 100644 techage/textures/techage_industriallamp1_on.png delete mode 100644 techage/textures/techage_industriallamp2.png delete mode 100644 techage/textures/techage_industriallamp2_on.png delete mode 100644 techage/textures/techage_industriallamp3.png delete mode 100644 techage/textures/techage_industriallamp3_on.png delete mode 100644 techage/textures/techage_industriallamp_inv1.png delete mode 100644 techage/textures/techage_industriallamp_inv2.png delete mode 100644 techage/textures/techage_industriallamp_inv3.png delete mode 100644 techage/textures/techage_inv_blue.png delete mode 100644 techage/textures/techage_inv_button_error.png delete mode 100644 techage/textures/techage_inv_button_nopower.png delete mode 100644 techage/textures/techage_inv_button_off.png delete mode 100644 techage/textures/techage_inv_button_on.png delete mode 100644 techage/textures/techage_inv_button_standby.png delete mode 100644 techage/textures/techage_inv_button_warning.png delete mode 100644 techage/textures/techage_inv_green.png delete mode 100644 techage/textures/techage_inv_invisible.png delete mode 100644 techage/textures/techage_inv_powerT2.png delete mode 100644 techage/textures/techage_inv_powerT3.png delete mode 100644 techage/textures/techage_inv_red.png delete mode 100644 techage/textures/techage_inv_wrench.png delete mode 100644 techage/textures/techage_inv_yellow.png delete mode 100644 techage/textures/techage_invisible_inv.png delete mode 100644 techage/textures/techage_iron_ingot.png delete mode 100644 techage/textures/techage_isobutane_inv.png delete mode 100644 techage/textures/techage_junglewood.png delete mode 100644 techage/textures/techage_junglewood_top.png delete mode 100644 techage/textures/techage_laser.png delete mode 100644 techage/textures/techage_leds.png delete mode 100644 techage/textures/techage_lighter.png delete mode 100644 techage/textures/techage_lighter_burn.png delete mode 100644 techage/textures/techage_liquid1_inv.png delete mode 100644 techage/textures/techage_liquid2_inv.png delete mode 100644 techage/textures/techage_liquid_filter_filler.png delete mode 100644 techage/textures/techage_liquid_filter_filler_bottom.png delete mode 100644 techage/textures/techage_liquidsampler.png delete mode 100644 techage/textures/techage_liquidsampler4.png delete mode 100644 techage/textures/techage_lua_controller.png delete mode 100644 techage/textures/techage_lua_controller_inventory.png delete mode 100644 techage/textures/techage_lua_server_back.png delete mode 100644 techage/textures/techage_lua_server_front.png delete mode 100644 techage/textures/techage_lua_server_side.png delete mode 100644 techage/textures/techage_lua_server_top.png delete mode 100644 techage/textures/techage_magnet_hole.png delete mode 100644 techage/textures/techage_meltingpot.png delete mode 100644 techage/textures/techage_meltingpot_top_active.png delete mode 100644 techage/textures/techage_meridium_ingot.png delete mode 100644 techage/textures/techage_meridiumaxe.png delete mode 100644 techage/textures/techage_meridiumpick.png delete mode 100644 techage/textures/techage_meridiumshovel.png delete mode 100644 techage/textures/techage_meridiumsword.png delete mode 100644 techage/textures/techage_mill_base.png delete mode 100644 techage/textures/techage_mill_front.png delete mode 100644 techage/textures/techage_mill_inv.png delete mode 100644 techage/textures/techage_mill_side.png delete mode 100644 techage/textures/techage_oil.png delete mode 100644 techage/textures/techage_oil_animated.png delete mode 100644 techage/textures/techage_oil_boiler_inv.png delete mode 100644 techage/textures/techage_oil_drill.png delete mode 100644 techage/textures/techage_oil_drillbit.png delete mode 100644 techage/textures/techage_oil_drillbit_inv.png delete mode 100644 techage/textures/techage_oil_tower1.png delete mode 100644 techage/textures/techage_oil_tower2.png delete mode 100644 techage/textures/techage_oil_tower3.png delete mode 100644 techage/textures/techage_oil_tower4.png delete mode 100644 techage/textures/techage_oil_tower_inv.png delete mode 100644 techage/textures/techage_oil_tower_top.png delete mode 100644 techage/textures/techage_palette256.png delete mode 100644 techage/textures/techage_pipe_wrench.png delete mode 100644 techage/textures/techage_plasma.png delete mode 100644 techage/textures/techage_powder_inv.png delete mode 100644 techage/textures/techage_power_line.png delete mode 100644 techage/textures/techage_power_line_inv.png delete mode 100644 techage/textures/techage_power_pole.png delete mode 100644 techage/textures/techage_power_pole_top.png delete mode 100644 techage/textures/techage_power_reduction.png delete mode 100644 techage/textures/techage_power_terminal_back.png delete mode 100644 techage/textures/techage_power_terminal_front.png delete mode 100644 techage/textures/techage_power_terminal_side.png delete mode 100644 techage/textures/techage_power_terminal_top.png delete mode 100644 techage/textures/techage_programmer.png delete mode 100644 techage/textures/techage_programmer_wield.png delete mode 100644 techage/textures/techage_quarry_left.png delete mode 100644 techage/textures/techage_quarry_left14.png delete mode 100644 techage/textures/techage_rack_and_pinion.png delete mode 100644 techage/textures/techage_ramchip.png delete mode 100644 techage/textures/techage_reactor_filler_plan.png delete mode 100644 techage/textures/techage_reactor_filler_side.png delete mode 100644 techage/textures/techage_reactor_filler_top.png delete mode 100644 techage/textures/techage_reactor_inv.png delete mode 100644 techage/textures/techage_reactor_plan.png delete mode 100644 techage/textures/techage_reactor_shell.png delete mode 100644 techage/textures/techage_reactor_side.png delete mode 100644 techage/textures/techage_reactor_stand_back.png delete mode 100644 techage/textures/techage_reactor_stand_bottom.png delete mode 100644 techage/textures/techage_reactor_stand_front.png delete mode 100644 techage/textures/techage_reactor_stand_side.png delete mode 100644 techage/textures/techage_reactor_stand_top.png delete mode 100644 techage/textures/techage_repairkit.png delete mode 100644 techage/textures/techage_rope.png delete mode 100644 techage/textures/techage_rope_inv.png delete mode 100644 techage/textures/techage_rotor.png delete mode 100644 techage/textures/techage_rotor_blade.png delete mode 100644 techage/textures/techage_rotor_blades.png delete mode 100644 techage/textures/techage_rotor_lamp_off.png delete mode 100644 techage/textures/techage_rotor_lamp_on.png delete mode 100644 techage/textures/techage_rotor_top.png delete mode 100644 techage/textures/techage_round_ceramic.png delete mode 100644 techage/textures/techage_screwdriver.png delete mode 100644 techage/textures/techage_server2_back.png delete mode 100644 techage/textures/techage_server2_front.png delete mode 100644 techage/textures/techage_server2_side.png delete mode 100644 techage/textures/techage_server2_top.png delete mode 100644 techage/textures/techage_server_back.png delete mode 100644 techage/textures/techage_server_front.png delete mode 100644 techage/textures/techage_server_side.png delete mode 100644 techage/textures/techage_server_top.png delete mode 100644 techage/textures/techage_sieve_gravel_ta1.png delete mode 100644 techage/textures/techage_sieve_sieve_ta1.png delete mode 100644 techage/textures/techage_sieve_top_ta1.png delete mode 100644 techage/textures/techage_signal_lamp.png delete mode 100644 techage/textures/techage_signallamp2.png delete mode 100644 techage/textures/techage_signaltower.png delete mode 100644 techage/textures/techage_signaltower_amber.png delete mode 100644 techage/textures/techage_signaltower_green.png delete mode 100644 techage/textures/techage_signaltower_red.png delete mode 100644 techage/textures/techage_signaltower_top.png delete mode 100644 techage/textures/techage_silicon_wafer.png delete mode 100644 techage/textures/techage_sluice1_inv.png delete mode 100644 techage/textures/techage_sluice2_inv.png delete mode 100644 techage/textures/techage_smart_button_inventory.png delete mode 100644 techage/textures/techage_smart_button_off.png delete mode 100644 techage/textures/techage_smart_button_on.png delete mode 100644 techage/textures/techage_smartline.png delete mode 100644 techage/textures/techage_smartline_button_2x.png delete mode 100644 techage/textures/techage_smartline_button_4x.png delete mode 100644 techage/textures/techage_smartline_button_4x_on1.png delete mode 100644 techage/textures/techage_smartline_button_4x_on2.png delete mode 100644 techage/textures/techage_smartline_button_4x_on3.png delete mode 100644 techage/textures/techage_smartline_button_4x_on4.png delete mode 100644 techage/textures/techage_smartline_button_inv.png delete mode 100644 techage/textures/techage_smartline_button_off.png delete mode 100644 techage/textures/techage_smartline_button_on.png delete mode 100644 techage/textures/techage_smartline_collector.png delete mode 100644 techage/textures/techage_smartline_collector_inv.png delete mode 100644 techage/textures/techage_smartline_detector.png delete mode 100644 techage/textures/techage_smartline_detector_inv.png delete mode 100644 techage/textures/techage_smartline_detector_on.png delete mode 100644 techage/textures/techage_smartline_mba_detector.png delete mode 100644 techage/textures/techage_smartline_mba_detector_inv.png delete mode 100644 techage/textures/techage_smartline_signal_2x.png delete mode 100644 techage/textures/techage_smartline_signal_4x.png delete mode 100644 techage/textures/techage_smartline_signal_amber1.png delete mode 100644 techage/textures/techage_smartline_signal_amber2.png delete mode 100644 techage/textures/techage_smartline_signal_amber3.png delete mode 100644 techage/textures/techage_smartline_signal_amber4.png delete mode 100644 techage/textures/techage_smartline_signal_green1.png delete mode 100644 techage/textures/techage_smartline_signal_green2.png delete mode 100644 techage/textures/techage_smartline_signal_green3.png delete mode 100644 techage/textures/techage_smartline_signal_green4.png delete mode 100644 techage/textures/techage_smartline_signal_off1.png delete mode 100644 techage/textures/techage_smartline_signal_off2.png delete mode 100644 techage/textures/techage_smartline_signal_off3.png delete mode 100644 techage/textures/techage_smartline_signal_off4.png delete mode 100644 techage/textures/techage_smartline_signal_red1.png delete mode 100644 techage/textures/techage_smartline_signal_red2.png delete mode 100644 techage/textures/techage_smartline_signal_red3.png delete mode 100644 techage/textures/techage_smartline_signal_red4.png delete mode 100644 techage/textures/techage_smoke.png delete mode 100644 techage/textures/techage_solar_cell_mini_bottom.png delete mode 100644 techage/textures/techage_solar_cell_mini_side.png delete mode 100644 techage/textures/techage_solar_cell_mini_top.png delete mode 100644 techage/textures/techage_solar_module_bottom.png delete mode 100644 techage/textures/techage_solar_module_inv.png delete mode 100644 techage/textures/techage_solar_module_top.png delete mode 100644 techage/textures/techage_steam_hole.png delete mode 100644 techage/textures/techage_steam_hole2.png delete mode 100644 techage/textures/techage_steam_knee.png delete mode 100644 techage/textures/techage_steam_knee2.png delete mode 100644 techage/textures/techage_steam_pipe.png delete mode 100644 techage/textures/techage_steel_tiles.png delete mode 100644 techage/textures/techage_steel_tiles_side.png delete mode 100644 techage/textures/techage_steel_tiles_top.png delete mode 100644 techage/textures/techage_steel_tiles_top2.png delete mode 100644 techage/textures/techage_steel_tiles_top3.png delete mode 100644 techage/textures/techage_steelmat.png delete mode 100644 techage/textures/techage_streetlamp.png delete mode 100644 techage/textures/techage_streetlamp2_housing.png delete mode 100644 techage/textures/techage_streetlamp2_housing_on.png delete mode 100644 techage/textures/techage_streetlamp2_off.png delete mode 100644 techage/textures/techage_streetlamp2_on.png delete mode 100644 techage/textures/techage_streetlamp_off.png delete mode 100644 techage/textures/techage_streetlamp_top.png delete mode 100644 techage/textures/techage_symbol_liquid.png delete mode 100644 techage/textures/techage_symbol_powder.png delete mode 100644 techage/textures/techage_ta1.png delete mode 100644 techage/textures/techage_ta2.png delete mode 100644 techage/textures/techage_ta3.png delete mode 100644 techage/textures/techage_ta3b.png delete mode 100644 techage/textures/techage_ta4.png delete mode 100644 techage/textures/techage_ta4_cable.png delete mode 100644 techage/textures/techage_ta4_cable_end.png delete mode 100644 techage/textures/techage_ta4_cable_hole.png delete mode 100644 techage/textures/techage_ta4_cable_inv.png delete mode 100644 techage/textures/techage_ta4_controller.png delete mode 100644 techage/textures/techage_ta4_controller_inventory.png delete mode 100644 techage/textures/techage_ta4_filter.png delete mode 100644 techage/textures/techage_ta4_junctionbox_side.png delete mode 100644 techage/textures/techage_ta4_junctionbox_top.png delete mode 100644 techage/textures/techage_ta4_solar.png delete mode 100644 techage/textures/techage_ta4_streetlamp.png delete mode 100644 techage/textures/techage_ta4_tes.png delete mode 100644 techage/textures/techage_ta4c.png delete mode 100644 techage/textures/techage_ta5_gaspipe.png delete mode 100644 techage/textures/techage_ta5_gaspipeB.png delete mode 100644 techage/textures/techage_ta5_gaspipe_hole.png delete mode 100644 techage/textures/techage_ta5_gaspipe_hole2.png delete mode 100644 techage/textures/techage_ta5_gaspipe_junction.png delete mode 100644 techage/textures/techage_ta5_gaspipe_knee.png delete mode 100644 techage/textures/techage_ta5_gaspipe_knee2.png delete mode 100644 techage/textures/techage_tank_cart_bottom.png delete mode 100644 techage/textures/techage_tank_cart_front.png delete mode 100644 techage/textures/techage_tank_cart_side.png delete mode 100644 techage/textures/techage_tank_cart_top.png delete mode 100644 techage/textures/techage_terminal1_bottom.png delete mode 100644 techage/textures/techage_terminal1_front.png delete mode 100644 techage/textures/techage_terminal1_side.png delete mode 100644 techage/textures/techage_terminal1_top.png delete mode 100644 techage/textures/techage_terminal2_back.png delete mode 100644 techage/textures/techage_terminal2_front.png delete mode 100644 techage/textures/techage_terminal2_side.png delete mode 100644 techage/textures/techage_terminal2_top.png delete mode 100644 techage/textures/techage_tes_inlet.png delete mode 100644 techage/textures/techage_tool_hammer_bronze.png delete mode 100644 techage/textures/techage_tool_hammer_diamond.png delete mode 100644 techage/textures/techage_tool_hammer_meridium.png delete mode 100644 techage/textures/techage_tool_hammer_mese.png delete mode 100644 techage/textures/techage_tool_hammer_steel.png delete mode 100644 techage/textures/techage_tool_hammer_stone.png delete mode 100644 techage/textures/techage_top_ta4.png delete mode 100644 techage/textures/techage_trafo.png delete mode 100644 techage/textures/techage_trowel.png delete mode 100644 techage/textures/techage_tube_hole.png delete mode 100644 techage/textures/techage_tube_hole2.png delete mode 100644 techage/textures/techage_tube_junction.png delete mode 100644 techage/textures/techage_tube_knee.png delete mode 100644 techage/textures/techage_tube_knee2.png delete mode 100644 techage/textures/techage_tube_tube.png delete mode 100644 techage/textures/techage_tubeta4_hole2.png delete mode 100644 techage/textures/techage_tubeta4_junction.png delete mode 100644 techage/textures/techage_tubeta4_knee.png delete mode 100644 techage/textures/techage_tubeta4_knee2.png delete mode 100644 techage/textures/techage_tubeta4_tube.png delete mode 100644 techage/textures/techage_usmium_nuggets.png delete mode 100644 techage/textures/techage_vacuum_tube.png delete mode 100644 techage/textures/techage_water_flowing.png delete mode 100644 techage/textures/techage_watermill1_inv.png delete mode 100644 techage/textures/techage_watermill2_inv.png delete mode 100644 techage/textures/techage_watermill3_inv.png delete mode 100644 techage/textures/techage_watermill4_inv.png delete mode 100644 techage/textures/techage_weight_bottom.png delete mode 100644 techage/textures/techage_weight_side.png delete mode 100644 techage/textures/techage_wind_turbine_inv.png delete mode 100644 techage/textures/techage_wlanchip.png delete mode 100644 techage/textures/techage_wood50.png delete mode 100644 techage/tools/assembly_tool.lua delete mode 100644 techage/tools/end_wrench.lua delete mode 100644 techage/tools/pipe_wrench.lua delete mode 100644 techage/tools/screwdriver.lua delete mode 100644 techage/tools/trowel.lua delete mode 100644 techage/wind_turbine/pillar.lua delete mode 100644 techage/wind_turbine/rotor.lua delete mode 100644 techage/wind_turbine/signallamp.lua diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4c8f05f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "techage"] + path = techage + url = https://git.luanti.ru/MTSR/techage diff --git a/techage b/techage new file mode 160000 index 0000000..ce8b08d --- /dev/null +++ b/techage @@ -0,0 +1 @@ +Subproject commit ce8b08d2d7937a46e643da1eb745a8ac6bf4598f diff --git a/techage/.test/sink.lua b/techage/.test/sink.lua deleted file mode 100644 index 7d0c33a..0000000 --- a/techage/.test/sink.lua +++ /dev/null @@ -1,112 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - Demo for a electrical power consuming node - -]]-- - --- for lazy programmers -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local PWR_NEEDED = 5 -local CYCLE_TIME = 2 - -local Cable = techage.ElectricCable ---local Cable = techage.Axle -local power = networks.power - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - if not nvm.running and power.power_available(pos, Cable) then - nvm.running = true - swap_node(pos, "techage:sink_on") - M(pos):set_string("infotext", "on") - minetest.get_node_timer(pos):start(CYCLE_TIME) - else - nvm.running = false - swap_node(pos, "techage:sink") - M(pos):set_string("infotext", "off") - minetest.get_node_timer(pos):stop() - end -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - M(pos):set_string("infotext", "off") - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -minetest.register_node("techage:sink", { - description = "Sink", - tiles = {'techage_electric_button.png^[colorize:#000000:50'}, - - on_timer = function(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed == PWR_NEEDED then - swap_node(pos, "techage:sink_on") - M(pos):set_string("infotext", "on") - end - return true - end, - on_rightclick = on_rightclick, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype = "light", - light_source = 0, - paramtype2 = "facedir", - groups = {choppy = 2, cracky = 2, crumbly = 2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:sink_on", { - description = "Sink", - tiles = {'techage_electric_button.png'}, - - on_timer = function(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed < PWR_NEEDED then - swap_node(pos, "techage:sink") - M(pos):set_string("infotext", "off") - end - return true - end, - on_rightclick = on_rightclick, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype = "light", - light_source = minetest.LIGHT_MAX, - paramtype2 = "facedir", - diggable = false, - drop = "", - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:sink", "techage:sink_on"}, Cable, "con") diff --git a/techage/.test/testblock.lua b/techage/.test/testblock.lua deleted file mode 100644 index 7a78cf6..0000000 --- a/techage/.test/testblock.lua +++ /dev/null @@ -1,43 +0,0 @@ -local M = minetest.get_meta - -minetest.register_node("techage:testblock", { - description = "Testblock", - tiles = { - "techage_top_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - - after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - nvm.test_val = 1 - M(pos):set_int("test_val", 1) - M(pos):set_string("infotext", "Value = " .. 1) - end, -}) - -minetest.register_lbm({ - label = "Update testblock", - name = "techage:update_testblock", - - nodenames = { - "techage:testblock", - }, - - run_at_every_load = true, - - action = function(pos, node) - local nvm = techage.get_nvm(pos) - if M(pos):get_int("test_val") == nvm.test_val then - nvm.test_val = nvm.test_val + 1 - M(pos):set_int("test_val", nvm.test_val) - M(pos):set_string("infotext", "Value = " .. nvm.test_val) - else - minetest.log("error", "[techage] Memory error at " .. minetest.pos_to_string(pos)) - M(pos):set_string("infotext", "Error") - end - end, -}) - diff --git a/techage/LICENSE.txt b/techage/LICENSE.txt deleted file mode 100644 index a5be540..0000000 --- a/techage/LICENSE.txt +++ /dev/null @@ -1,662 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - TechAge, a mod to go through 5 tech ages in search of wealth and power. - Copyright (C) 2019-2023 Joachim Stolberg - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU AGPL, see -. - diff --git a/techage/README.md b/techage/README.md deleted file mode 100644 index d43c666..0000000 --- a/techage/README.md +++ /dev/null @@ -1,408 +0,0 @@ -# Tech Age [techage] (Minetest 5.4+) - -Tech Age, a mod to go through 5 tech ages in search of wealth and power. - -![screenshot](https://github.com/joe7575/techage/blob/master/screenshot.png) - - -Important facts: -- techage is not backwards compatible and cannot be installed on a server together with TechPack -- techage is significantly more extensive, since additional mods are integrated -- techage represents 5 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. - - Present (TA4) - Electricity from renewable energy sources such as sun and wind. - - Future (TA5) - Machines to overcome space and time, new sources of energy and other achievements. -- Since the levels build on each other, all ages have to be run through one after the other - -In contrast to TechPack, the resources are more limited and it is much more difficult to pass all levels. -(no endless ore generation by means of cobble generators) - -**Techage blocks store information outside of the block. This is for performance reasons. -If you move, place, or remove blocks with any tool, at best, only the information is lost. -In the worst case, the server crashes.** - -[Manuals](https://github.com/joe7575/techage/wiki) - - -### License -Copyright (C) 2019-2023 Joachim Stolberg -Code: Licensed under the GNU AGPL version 3 or later. See LICENSE.txt -Textures: CC BY-SA 3.0 - -The TA1 mill sound is from https://freesound.org/people/JustinBW/sounds/70200/ -The TA1 watermill sound is from https://freesound.org/people/bmoreno/sounds/164182/ - -Many thanks to Thomas-S, niklp09, and others for their contributions - - -### Dependencies -Required: default, doors, bucket, stairs, screwdriver, basic_materials, tubelib2, networks, minecart, lcdlib, safer_lua, doclib -Recommended: signs_bot, hyperloop, compost, techpack_stairway, autobahn -Optional: unified_inventory, wielded_light, unifieddyes, lua-mashal, lsqlite3, moreores, ethereal, mesecon - - -The mods `default`, `doors`, `bucket`, `stairs`, and `screwdriver` are part of Minetest Game. - -`basic_materials` will be found here: https://content.minetest.net/ - -The following mods in the newest version have to be downloaded directly from GitHub: -* [tubelib2](https://github.com/joe7575/tubelib2) -* [networks](https://github.com/joe7575/networks) -* [minecart](https://github.com/joe7575/minecart) -* [lcdlib](https://github.com/joe7575/lcdlib) -* [safer_lua](https://github.com/joe7575/safer_lua) -* [doclib](https://github.com/joe7575/doclib) - -It is highly recommended that you install the following mods, too: - -* [signs_bot](https://github.com/joe7575/signs_bot): For many automation tasks in TA3/TA4 like farming, mining, and item transportation -* [hyperloop](https://github.com/joe7575/Minetest-Hyperloop): Used as passenger transportation system in TA4 -* [compost](https://github.com/joe7575/compost): The garden soil is needed for the TA4 LED Grow Light based flower bed -* [techpack_stairway](https://github.com/joe7575/techpack_stairway): Ladders, stairways, and bridges for your machines -* [autobahn](https://github.com/joe7575/autobahn): Street blocks and slopes with stripes for faster traveling -* [ta4_jetpack](https://github.com/joe7575/ta4_jetpack): A Jetpack with hydrogen as fuel and TA4 recipe - -More recommended Techage related mods by other authors: - -* [ta4_addons](https://github.com/Thomas--S/ta4_addons) from Thomas--S: A Touchscreen for the Lua controller -* [ts_vehicles](https://github.com/Thomas--S/ts_vehicles) from Thomas--S: A mod to provide cars and other vehicles for Minetest. -* [ta_apiary](https://gitlab.com/lesya_minetest_mods/ta_apiary) from Olesya Sibidanova: TechAge Machines for beekeeping - -For large servers with many players, the following packages are recommended: - -* lua-mashal for faster serialization/deserialization of data -* lsqlite3 for storing node and network data - -The packages have to be installed via [luarocks](https://luarocks.org/): - - luarocks --lua-version 5.1 install lsqlite3 - luarocks --lua-version 5.1 install lua-marshal - -To enable these `unsafe` packages, add 'techage' and 'lua-marshal' -to the list of trusted mods in `minetest.conf`: - - secure.trusted_mods = techage,lua-marshal - -and add the following line to your `world.mt` or `minetest.conf`: - - techage_use_sqlite = true - -Available worlds will be converted to 'lsqlite3', but there is no way back, so: - -**Never disable 'lsqlite3' for a world that has already been used!** - -### History - -**2023-11-05 V1.18** - -- Add TA2 clutch -- TA5 Generator: Add generator menu -- TA4 Injector: Allow rotation with a screwdriver -- Escape equal sign in german translation (Niklp09) -- Autocrafter: Add Beduino command interface -- Autocrafter: Add flush command -- Fix converter stores mesecon signals (Niklp09) -- TA1 Gravel Sieve: Use proper player creative check (Niklp09) -- TA4 Chest: Add storesize command -- Improve Assembly Tool -- Furnace: Fix burn time issue -- Allow further types of cobblestone for the coalburner -- Fix water mill river water bug (alwayshopeless) -- Improve manual -- Further improvements - -**2023-08-25 V1.17** - -- Add support for doclib / remove techage internal doc support - **The mod doclib is a new hard depenency !** -- Fix LICENCSE file bug -- Add beduino support for TA3 repeater (realmicu) -- Add inv_name_prefix to `techage.register_consumer` (debiankaios) -- Add generator menu to TA5 generator (fusion reactor) -- Adapt mod to the new lcdlib mod -- Fix some bugs - -**2023-06-30 V1.16** - -- Add TA4 node detector -- Add wrench menu to TA3 button -- Add arrows to the pump bottom and allow to turn the pump with the Techage Screwdriver -- Fix bug with configurred TA4 chest and TA5 teleport tubes -- Add gaze sensor -- Many bugfixes and improvements - -**2023-05-05 V1.15** - -- Allow energy storage with up to 13x13x13 concrete blocks -- Allow registration of other buckets -- Add hyperloop chest only if the hyperloop mod is available -- Add missing 'minetest.formspec_escape' #131 -- Fix bug "Trouble with flycontroller #130" -- Add optional dependency on farming mod (orwell96) -- Fix forceload formspec receiver (Niklp09) - -**2023-04-16 V1.14** - -- Add file "api.md" -- Add API function `register_ore_for_gravelsieve` -- Add support for the game Asuna -- Merge pull request #124 from Niklp09/drops -- Fix keep node number issue -- Fix manual issue #123 - -**2023-04-10 V1.13** - -- Add "Teleport mode" to the ta5 fly controller - -**2023-04-01 V1.12** - -- Improve Transformer: - - add wrench menu for 'max. power passed through' - - Increase max. power passed through from 100 to 300 ku -- Improve Electricmeter: - - add wrench menu for 'max. power passed through' and 'power countdown' 2458 - - add commands to read the countdown value (Lua and Beduino controller) -- Improve TA3 Mesecons Converter: - - fix overload bug - - fix missing dominant 'on' issue -- Add version command to TA3/TA4 Terminal -- TA5 Hyperloop Chest: Disable inventory access on client side due to minetest core issues - -**2023-03-05 V1.11** - -- Reduce the number of necessary exp points for TA5 Hyperloop Chest, - TA5 Hyperloop Tank, and TA5 AI Chip II -- Fix possible kernel crashes with TA5 Hyperloop Chest and autocrafter -- Rework doorcontroller (menu changed) -- Increase tank cart storage size to 200 units -- Fix several paramtype/use_texture_alpha issues -- Add command 'load' to the TA4 power terminal -- Add beduino tank commands -- Fix power consumption bug for a stopped collider -- Fix electrolyzer formspec bug -- Add Rack and pinion node -- Expand ta4 sequencer wrench menu -- Accept mincart carts for the move controller -- movecontroller: Allow to move objects 'without' a move block -- Add empty_spool as fab output -- Fix doser goes blocked bug - -**2023-02-04 V1.10** -- Improve flycontroller -- Remove handover for movecontroller -- Rename "techage:signal_lamp" to "techage:color_lamp" -- Rename "techage:signal_lamp2" to "techage:color_lamp2" -- Add countdown mode to TA4 Detector -- Adapt to new beduino and minecart versions -- Improve manuals -- flycontroller/movecontroller: Allow moving blocks through unloaded areas -- playerdetector: Add wrench menu to configure search radius -- Default furnace: Don't use items filled from the top as fuel -- Many further improvements and bug fixes from joe7575 and Niklp09 - -**2022-09-03 V1.09** -- Change the way items are pushed -- Add "Flow Limiter" mode to TA4 pump and TA4 pusher - -**2022-06-06 V1.08** -- Native support for the mod Beduino added - -**2022-01-22 V1.07** -- TA5 fusion reactor added - -**2022-01-03 V1.06** -- TA5 teleport blocks added -- Many improvements - -**2021-12-25 V1.05** -- Support for the mod i3 added (thanks to ghaydn) -- TA5 enabled -- Many improvements - -**2021-12-12 V1.04** -- TA4 Collider added (experimental) -- move, turn, sound, and fly blocks added -- TA5 (future) introduced (TA4 is now the "present") - -**2021-10-24 V1.03** -- Add TA4 Sequencer for time controlled command sequences -- Add TA4 Move Controller for moving blocks -- Add techage command counting function to be able to limit the amount of commands/min. -- Pull request #67: Add switch mode for 4x Button (by realmicu) -- Pull request #69: Add option to keep assignment for TA4 Tank (by Thomas-S) - -**2021-09-18 V1.02** -- TA4 Chest: Fix items disappearing (PR #64 by Thomas--S) -- Add support for colored cables (PR #63 by Thomas--S) - -**2021-08-16 V1.01** -- Allow singleplayer to place lava on y>0. -- Logic block: allow to use output numbers for the expression -- Pull request #60: Allow to pause the sequencer with a TechAge command (by Thomas-S) -- Pull request #61: Allow sharing the button based on protection (by Thomas-S) -- Pull request #62: Allow picking TA3 Tiny Generator with fuel (by realmicu) -- Add TA1 watermill -- Fix TA4 LED Grow Light bug -- Fix grinder recipe bu - -**2021-07-23 V1.00** -- Change the way, power distribution works -- Add TA2 storage system -- Add TA4 Isolation Transformer -- Add TA4 Electric Meter -- Add new power terminal -- Many improvements on power producing/consuming nodes -- See Construction Board for some hints on moving to v1 - -**2021-05-14 V0.26** -- Add concentrator tubes -- Add ta4 cable wall entry -- Pull request #57: Distributor improvements (from Thomas-S) -- Add new power terminal commands -- Add new door controller -- Add laser beam nodes for energy transfer -- Add TA4 recycle machine -- Many improvements and bug fixes - -**2020-11-01 V0.25** -- Pull request #37: Trowel: Add protection support (from Thomas-S) -- Pull request #38: Charcoal Pile: Ignore "ignore" nodes (from Thomas-S) -- Autocrafter: Add register function for uncraftable items -- Fix bug: Tubes do not recognize when TA2 nodes are added/removed -- TA4 chest/tank: Add 'public' checkbox to allow public access -- Add nodes TA2 Power Generator and TA3 Electric Motor - -**2020-10-20 V0.24** -- Pull request #27: Liquid Tanks: Add protection support (from Thomas-S) -- Pull request #28: Quarry: Improve digging behaviour (from Thomas-S) -- Pull request #29: Distributor: Keep metadata (from Thomas-S) -- Pull request #30: TA4: Add Liquid Filter (from Thomas-S) -- Pull request #31: Fix chest crash (from Thomas-S) -- Pull request #32: Fix Filter Sink Bug (from Thomas-S) -- Pull request #33: Add TA4 High Performance Distributor (from Thomas-S) -- Pull request #34: Add TA4 High Performance Distributor to Hopper (from Thomas-S) -- Pull request #35: Fixed Gravel Sieve bug (from CosmicConveyor) -- Fix doorcontroller and ta4 doser bugs -- Add check for wind turbine areas -- Fix translation errors -- QSG: Add power consumptions and fix manual bug -- Add load command to the controller battery -- TA4 silo: Add load command -- silo/tank: Add second return value for load command -- Liquid Pumps: Fix issue with undetected pipe connection gaps -- Shrink PGN files -- Fix ta4 chest bugs -- Fix ta4 chest and ta3 firebox issues -- Remove repairkit recipe -- Switched to AGPL license -- API added for ingame manual - -**2020-09-13 V0.23** -- Pull request #26: Digtron Battery: Fix duplication bug (from Thomas-S) -- Improve ta4 sensor box -- Firebox: Add check for free space when placing the node -- Lua controller: Add 'get_gametime' function -- Pull request #27: Liquid Tanks: Add protection support (from Thomas-S) -- Fix pump issue (silo source items can disappear) -- Pull request #28: Quarry: Improve digging behaviour (from Thomas-S) -- Pull request #28: Battery: Store battery load as metadata (from Thomas-S) -- Pull request #29: Distributor: Keep item metadata (from Thomas-S) - -**2020-08-08 V0.22** -- Pull request #25: Growlight: Improve flower registration (from Thomas-S) -- Add tube support for digtron chests and protector:chest - -**2020-08-08 V0.21** -- Pull request #18: Add a simple Digtron battery (from Thomas-S) -- Pull request #23: Lua Controller: Fix $item_description() documentation and translation (from Thomas-S) -- Pull request #24: Distributor: improve fairness by using random spread (from realmicu) -- Bugfix: TA1 meridian hammer did not glow (from realmicu) -- Bugfix: power.power_available() did not check the network state - -**2020-07-31 V0.20** -- Pull request #21: Lua Controller: Allow to get itemstring and description of 8x2000 chest contents (from Thomas-S) -- Pull request #22: Trowel: Prevent hidden nodes from being dug (from Thomas-S) -- Improvement: TA3 Power Terminal: Outputs max needed power in addition -- Bugfix: Quarry: Shall not dig Techage Light Blocks - -**2020-07-24 V0.19** -- Pull request #19: Refactor ICTA to use functions instead of loadstring (from Thomas-S) -- State command added for cart-, node-, and player detectors - -**2020-07-21 V0.18** -- Pull request #13: Use Monospace Font for Code-Related Formspecs (from Thomas-S) -- Pull request #14: Don't allow to put items with meta or wear information into the 8x2000 chest (from Thomas-S) -- Pull request #15: Blackhole: Add support for liquids (from Thomas-S) -- Pull request #16: ICTA Controller: Add support for valves by adding on/off states (from Thomas-S) -- Bugfix: Digging Redstone gives an 'unknown block' -- ICTA Controller: Escape quotation marks for text outputs - -**2020-07-16 V0.17** -- TA4 Reactor recipe bugfix -- TA3 furnace power bugfix (response to the pull request #12 from Thomas-S) -- Manual bugfix (Thomas-S) -- Charcoal pile doesn't start smoking after beeing unloaded (issue #9 from Skamiz) - -**2020-07-06 V0.16** -- Oil cracking/hydrogenation recipes added -- Ethereal growlight bugfix -- Charcoal pile bugfix (issue #9) Thanks to Skamiz -- Quarry bugfix (pull request #10) Thanks to programmerjake - -**2020-07-02 V0.15** -- pipe valve added -- growlight bugfix -- further textures to gate/door blocks added -- cement recipe bugfix -- manual improvements - -**2020-06-29 V0.14** -- quarry sound bugfix -- grinder bugfix -- ore probability calculation changed -- lua-marshal deactivated (due to weird server crashes) -- alternative cement recipe added -- aluminum output increased -- reboiler cycle time increased to 16 s (from 6) -- many manual improvements - -**2020-06-19 V0.13** -- Mesecons Converter added - -**2020-06-17 V0.12** -- Ethereal support added -- manual correction -- tin ingot recipe bugfix - -**2020-06-14 V0.11** -- cart commands added for both controllers -- support for moreores added - -**2020-06-04 V0.10** -- minor changes and bugfixes - -**2020-05-31 V0.09** -- TA4 tubes upgraded, manuals updated - -**2020-05-22 V0.08** -- Support for 'lua-marshal' and 'lsqlite3' added - -**2020-04-26 V0.07** -- English translation added - -**2020-04-24 V0.06** -- TA4 injector added - -**2020-03-14 V0.05** -- TA4 Lua controller added - -**2020-02-29 V0.04** -- TA4 ICTA controller added - -**2019-09-28 V0.02** -- TA3 finished - -**2019-06-16 V0.01** -- First upload diff --git a/techage/_config.yml b/techage/_config.yml deleted file mode 100644 index b849713..0000000 --- a/techage/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-leap-day \ No newline at end of file diff --git a/techage/api.md b/techage/api.md deleted file mode 100644 index b48a349..0000000 --- a/techage/api.md +++ /dev/null @@ -1,225 +0,0 @@ -# Techage API Functions - -Techage API function to adapt/prepare techage for other mods/games. - - - -## Move/Fly Controller - -Register node names for nodes allowed to be moved by fly/move controllers. - -This is only necessary for undiggable/intelligent nodes with one of the following attributes: - -- ```drop = ""``` -- ```diggable = false``` -- ```after_dig_node ~= nil``` - -```lua -techage.register_simple_nodes(node_names, is_valid) -``` - -- `is_valid = true` - Add node to the list of simple nodes -- `is_valid = false` - Remove node from the list of simple nodes - -Example: - -```lua -techage.register_simple_nodes({"techage:power_lineS"}, true) -``` - -For door nodes used as sliding doors by means of the move controller, call in addition: - -```lua -techage.flylib.protect_door_from_being_opened(node_name) -``` - - - -## TA1 Hammer - -Register stone/gravel name pair for the hammer blow: - -```lua -techage.register_stone_gravel_pair(stone_name, gravel_name) -``` - -Example: - -```lua -techage.register_stone_gravel_pair("default:stone", "default:gravel") -``` - - - -## TA1 Melting Pot - -Register a pot recipe: - -```lua -techage.ironage_register_recipe(recipe) -``` - -Examples: - -```lua -techage.ironage_register_recipe({ - output = "default:obsidian", - recipe = {"default:cobble"}, - heat = 10, -- Corresponds to the tower height - time = 8, -- Cooking time in seconds -}) -techage.ironage_register_recipe({ - output = "default:bronze_ingot 4", - recipe = {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot", "default:tin_ingot"}, - heat = 4, -- Corresponds to the tower height - time = 8, -- Cooking time in seconds -}) -``` - - - -## TA2/TA3/TA4 Autocrafter - -Register any nodes/items that should not be crafted via the autocrafter. - -```lua -techage.register_uncraftable_items(item_name) -``` - - - -## TA2/TA3/TA4 Gravel Sieve - -Change the probability of ores or register new ores for sieving. - -```lua -techage.register_ore_for_gravelsieve(ore_name, probability) -``` - -Example: - -```lua -techage.register_ore_for_gravelsieve("default:iron_lump", 30) -``` - -Default values for MTG are: - -```lua --- higher value means less frequent occurrence -techage:baborium_lump 100000 -- hardly ever -default:mese_crystal 548 -- every 548th time -default:gold_lump 439 -default:tin_lump 60 -default:diamond 843 -default:copper_lump 145 -default:coal_lump 11 -default:iron_lump 15 -``` - - - -## TA2/TA3/TA4 Gravel Rinser - -Add a rinser recipe. - -```lua -techage.add_rinser_recipe(recipe) -``` - -Example: - -```lua -techage.add_rinser_recipe({input = "techage:sieved_gravel", output = "techage:usmium_nuggets", probability = 30}) -``` - - - -## TA2/TA3/TA4 Grinder - -Add a grinder recipe. - -```lua -techage.add_grinder_recipe(recipe, ta1_permitted) -``` - -Examples: - -```lua -echage.add_grinder_recipe({input = "default:cobble", output = "default:gravel"}) -techage.add_grinder_recipe({input = "default:sandstone", output = "default:sand 4"}) -``` - - - -## TA3/TA4 Electronic Fab, TA4 Doser - -Add recipes to an electronic fab or doser (chemical reactor): - - -```lua -techage.recipes.add(rtype, recipe) -``` - -`rtype` is one of: `ta2_electronic_fab` , `ta4_doser` - -A recipe look like: - -``` -{ - output = " ", -- units = 1..n - waste = " ", -- units = 1..n - input = { -- up to 4 items - " ", - " ", - }, -} -``` - -Examples: - -```lua -techage.recipes.add("ta2_electronic_fab", { - output = "techage:vacuum_tube 2", - waste = "basic_materials:empty_spool 1", - input = {"default:glass 1", "basic_materials:copper_wire 1", "basic_materials:plastic_sheet 1", "techage:usmium_nuggets 1"} -}) - -techage.recipes.add("ta4_doser", { - output = "techage:naphtha 1", - input = { - "techage:fueloil 1", - }, - catalyst = "techage:gibbsite_powder", -}) -``` - - - -## TA3 Furnace - -Register recipe: - -```lua -techage.furnace.register_recipe(recipe) -``` - -Example: - -```lua -techage.furnace.register_recipe({ - output = "default:bronze_ingot 4", - recipe = {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot", "default:tin_ingot"}, - time = 2, -- in seconds -}) -``` - - - -## Assembly Tool - -Disable a block from being removed by the assembly tool: - -```lua -techage.disable_block_for_assembly_tool(block_name) -``` - diff --git a/techage/basic_machines/autocrafter.lua b/techage/basic_machines/autocrafter.lua deleted file mode 100644 index dd34a16..0000000 --- a/techage/basic_machines/autocrafter.lua +++ /dev/null @@ -1,556 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - The autocrafter is derived from pipeworks: - Copyright (C) 2004 Sam Hocevar WTFPL - - TA2/TA3/TA4 Autocrafter - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local S = techage.S - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 4 - -local UncraftableItems = {} - --- Add all nodes/items which should not be crafted with the autocrafter -function techage.register_uncraftable_items(item_name) - UncraftableItems[item_name] = true -end - -local function formspec(self, pos, nvm) - return "size[8,9.2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;recipe;0,0;3,3;]".. - "image[2.9,1;1,1;techage_form_arrow.png]".. - "image[3.8,0;1,1;"..techage.get_power_image(pos, nvm).."]".. - "list[context;output;3.8,1;1,1;]".. - "image_button[3.8,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.8,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[context;src;0,3.2;8,2;]".. - "list[context;dst;5,0;3,3;]".. - "list[current_player;main;0,5.4;8,4;]" .. - "listring[current_player;main]".. - "listring[context;src]" .. - "listring[current_player;main]".. - "listring[context;dst]" .. - "listring[current_player;main]".. - default.get_hotbar_bg(0, 5.4) -end - -local function count_index(invlist) - local index = {} - for _, stack in pairs(invlist) do - if not stack:is_empty() then - local stack_name = stack:get_name() - index[stack_name] = (index[stack_name] or 0) + stack:get_count() - end - end - return index -end - -local function flush_input_inventory(pos) - local inv = M(pos):get_inventory() - if not inv:is_empty("src") then - for idx = 1, 16 do - local stack = inv:get_stack("src", idx) - if not inv:room_for_item("dst", stack) then - return false - end - inv:add_item("dst", stack) - inv:set_stack("src", idx, nil) - end - end - return true -end - --- caches some recipe data -local autocrafterCache = {} - -local function get_craft(pos, inventory, hash) - hash = hash or minetest.hash_node_position(pos) - local craft = autocrafterCache[hash] - if not craft then - local recipe = inventory:get_list("recipe") - local output, decremented_input = minetest.get_craft_result( - {method = "normal", width = 3, items = recipe}) - - -- check if registered item - if UncraftableItems[output.item:get_name()] then - output.item = ItemStack() - end - - craft = {recipe = recipe, consumption = count_index(recipe), - output = output, decremented_input = decremented_input} - autocrafterCache[hash] = craft - end - return craft -end - -local function autocraft(pos, crd, nvm, inv) - local craft = get_craft(pos, inv) - if not craft then - crd.State:idle(pos, nvm) - return - end - local output_item = craft.output.item - if output_item:get_name() == "" then - crd.State:idle(pos, nvm) - return - end - - -- check if we have enough room in dst - if not inv:room_for_item("dst", output_item) then - crd.State:blocked(pos, nvm) - return - end - local consumption = craft.consumption - local inv_index = count_index(inv:get_list("src")) - -- check if we have enough material available - for itemname, number in pairs(consumption) do - if (not inv_index[itemname]) or inv_index[itemname] < number then - crd.State:idle(pos, nvm) - return - end - end - -- consume material - for itemname, number in pairs(consumption) do - for i = 1, number do -- We have to do that since remove_item does not work if count > stack_max - inv:remove_item("src", ItemStack(itemname)) - end - end - - -- craft the result into the dst inventory and add any "replacements" as well - inv:add_item("dst", output_item) - for i = 1, 9 do - inv:add_item("dst", craft.decremented_input.items[i]) - end - - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) -end - - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - autocraft(pos, crd, nvm, inv) -end - --- note, that this function assumes allready being updated to virtual items --- and doesn't handle recipes with stacksizes > 1 -local function after_recipe_change(pos, inventory) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - -- if we emptied the grid, there's no point in keeping it running or cached - if inventory:is_empty("recipe") then - autocrafterCache[minetest.hash_node_position(pos)] = nil - inventory:set_stack("output", 1, "") - crd.State:stop(pos, nvm) - return - end - local recipe = inventory:get_list("recipe") - - local hash = minetest.hash_node_position(pos) - local craft = autocrafterCache[hash] - - if craft then - -- check if it changed - local cached_recipe = craft.recipe - for i = 1, 9 do - if recipe[i]:get_name() ~= cached_recipe[i]:get_name() then - autocrafterCache[hash] = nil -- invalidate recipe - craft = nil - break - end - end - end - - craft = craft or get_craft(pos, inventory, hash) - local output_item = craft.output.item - inventory:set_stack("output", 1, output_item) - crd.State:stop(pos, nvm) -end - --- clean out unknown items and groups, which would be handled like unknown items in the crafting grid --- if minetest supports query by group one day, this might replace them --- with a canonical version instead -local function normalize(item_list) - for i = 1, #item_list do - local name = item_list[i] - if not minetest.registered_items[name] then - item_list[i] = "" - end - end - return item_list -end - -local function get_input_from_recipeblock(pos, number, idx) - local own_num = M(pos):get_string("node_number") - local owner = M(pos):get_string("owner") - if techage.check_numbers(number, owner) then - local input = techage.send_single(own_num, number, "input", idx) - if input and type(input) == "string" then - return input - end - end -end - -local function on_output_change(pos, inventory, stack) - if not stack then - inventory:set_list("output", {}) - inventory:set_list("recipe", {}) - else - local input = minetest.get_craft_recipe(stack:get_name()) - if not input.items or input.type ~= "normal" then return end - local items, width = normalize(input.items), input.width - local item_idx, width_idx = 1, 1 - for i = 1, 9 do - if width_idx <= width then - inventory:set_stack("recipe", i, items[item_idx]) - item_idx = item_idx + 1 - else - inventory:set_stack("recipe", i, ItemStack("")) - end - width_idx = (width_idx < 3) and (width_idx + 1) or 1 - end - -- we'll set the output slot in after_recipe_change to the actual result of the new recipe - end - after_recipe_change(pos, inventory) -end - -local function determine_recipe_items(pos, input) - local num, idx - - if input and type(input) == "string" then -- Lua controller - -- Test if "." input - num, idx = unpack(string.split(input, ".", false, 1)) - elseif input and type(input) == "table" then -- Beduino - num = tostring(input[1] * 65536 + input[2]) - idx = tostring(input[3]) - end - - if num and idx then - input = get_input_from_recipeblock(pos, num, idx) - if input then - -- ",,..." input - local items = string.split(input, ",", true, 8) - if items and type(items) == "table" and next(items) then - return items - end - end - end -end - -local function on_new_recipe(pos, input) - local items = determine_recipe_items(pos, input) - local inv = M(pos):get_inventory() - if items then - for i = 1, 9 do - inv:set_stack("recipe", i, items[i]) - end - else - inv:set_list("recipe", {}) - end - local hash = minetest.hash_node_position(pos) - autocrafterCache[hash] = nil - local craft = get_craft(pos, inv, hash) - if craft.output and craft.output.item then - inv:set_stack("output", 1, craft.output.item) - else - inv:set_stack("output", 1, nil) - end -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if listname == "output" then - return 0 - end - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - local inv = M(pos):get_inventory() - if listname == "recipe" then - stack:set_count(1) - inv:set_stack(listname, index, stack) - after_recipe_change(pos, inv) - return 0 - elseif listname == "output" then - on_output_change(pos, inv, stack) - return 0 - elseif listname == "src" then - CRD(pos).State:start_if_standby(pos) - end - return stack:get_count() -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - if listname == "output" then - return 0 - end - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end --- upgrade_autocrafter(pos) - local inv = minetest.get_meta(pos):get_inventory() - if listname == "recipe" then - inv:set_stack(listname, index, ItemStack("")) - after_recipe_change(pos, inv) - return 0 - elseif listname == "output" then - on_output_change(pos, inv, nil) - return 0 - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if from_list == "output" or "to_list" == "output" then - return 0 - end - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - local inv = minetest.get_meta(pos):get_inventory() - local stack = inv:get_stack(from_list, from_index) - - if to_list == "output" then - on_output_change(pos, inv, stack) - return 0 - elseif from_list == "output" then - on_output_change(pos, inv, nil) - if to_list ~= "recipe" then - return 0 - end -- else fall through to recipe list handling - end - - if from_list == "recipe" or to_list == "recipe" then - if from_list == "recipe" then - inv:set_stack(from_list, from_index, ItemStack("")) - end - if to_list == "recipe" then - stack:set_count(1) - inv:set_stack(to_list, to_index, stack) - end - after_recipe_change(pos, inv) - return 0 - end - - return count -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_appl_autocrafter.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_autocrafter.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_autocrafter.png^techage_frame_ta#.png", -} -tiles.act = { - -- up, down, right, left, back, front - { - name = "techage_filling4_ta#.png^techage_appl_autocrafter4.png^techage_frame4_ta#_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.5, - }, - }, - "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", - { - name = "techage_filling4_ta#.png^techage_appl_autocrafter4.png^techage_frame4_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.5, - }, - }, - { - name = "techage_filling4_ta#.png^techage_appl_autocrafter4.png^techage_frame4_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.5, - }, - }, -} - -local INFO = [[Commands: 'state', 'recipe']] - -local tubing = { - on_inv_request = function(pos, in_dir, access_type) - if access_type == "push" then - local meta = minetest.get_meta(pos) - if meta:get_int("push_dir") == in_dir or in_dir == 5 then - return meta:get_inventory(), "src" - end - end - end, - 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(pos, inv, "dst", num) - end - end, - on_push_item = function(pos, in_dir, stack, idx) - 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() - --CRD(pos).State:start_if_standby(pos) -- would need power! - return techage.put_items(inv, "src", stack, idx) - 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, src, topic, payload) - if topic == "recipe" and CRD(pos).stage == 4 then - if payload and payload ~= "" then - on_new_recipe(pos, payload) - return true - else - local inv = M(pos):get_inventory() - return inv:get_stack("output", 1):get_name() - end - elseif topic == "flush" and CRD(pos).stage == 4 then - return flush_input_inventory(pos) - elseif topic == "info" and CRD(pos).stage == 4 then - return INFO - else - return CRD(pos).State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 10 and CRD(pos).stage == 4 then - on_new_recipe(pos, payload) - return 1, "" - elseif topic == 11 and CRD(pos).stage == 4 then - if flush_input_inventory(pos) then - return 1, "" - else - return 0, "" - end - end - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = - techage.register_consumer("autocrafter", S("Autocrafter"), tiles, { - drawtype = "normal", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size("src", 2*8) - inv:set_size("recipe", 3*3) - inv:set_size("dst", 3*3) - inv:set_size("output", 1) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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,2,4}, - power_consumption = {0,4,6,9}, - }, - {false, true, true, true}) -- TA2/TA3/TA4 - -minetest.register_craft({ - output = node_name_ta2, - recipe = { - {"group:wood", "default:diamond", "group:wood"}, - {"techage:tubeS", "basic_materials:gear_steel", "techage:tubeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:diamond", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "default:diamond", ""}, - {"", node_name_ta3, ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) - -local Cable = techage.ElectricCable -local power = networks.power - -techage.register_node_for_v1_transition({"techage:ta3_autocrafter_pas", "techage:ta4_autocrafter_pas"}, function(pos, node) - power.update_network(pos, nil, Cable) -end) diff --git a/techage/basic_machines/blackhole.lua b/techage/basic_machines/blackhole.lua deleted file mode 100644 index 3f397c0..0000000 --- a/techage/basic_machines/blackhole.lua +++ /dev/null @@ -1,89 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - All items and liquids disappear. - -]]-- - -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - -local function take_liquid(pos, indir, name, amount) - return 0, name -end - -local function put_liquid(pos, indir, name, amount) - return 0 -end - -local function peek_liquid(pos, indir) - return nil -end - -minetest.register_node("techage:blackhole", { - description = S("TechAge Black Hole"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_blackhole.png^techage_appl_hole_pipe.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_blackhole.png^techage_appl_inp.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_blackhole.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_blackhole.png", - }, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local node = minetest.get_node(pos) - meta:set_int("push_dir", techage.side_to_indir("L", node.param2)) - meta:set_string("infotext", S("TechAge Black Hole (let items and liquids disappear)")) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - end, - - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:blackhole", - recipe = { - {"group:wood", "", "group:wood"}, - {"techage:tubeS", "default:coal_lump", "techage:ta3_pipeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -techage.register_node({"techage:blackhole"}, { - on_pull_item = nil, -- not needed - on_unpull_item = nil, -- not needed - - on_push_item = function(pos, in_dir, stack) - local meta = minetest.get_meta(pos) - if meta:get_int("push_dir") == in_dir then - return true - end - end, -}) - -liquid.register_nodes({"techage:blackhole"}, - Pipe, "tank", {"R"}, { - capa = 9999999, - peek = peek_liquid, - put = put_liquid, - take = take_liquid, - } -) diff --git a/techage/basic_machines/chest.lua b/techage/basic_machines/chest.lua deleted file mode 100644 index ed7b58d..0000000 --- a/techage/basic_machines/chest.lua +++ /dev/null @@ -1,463 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3/TA4 Chest - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local TA4_INV_SIZE = 50 - -local MP = minetest.get_modpath(minetest.get_current_modname()) -local mConf = dofile(MP.."/basis/conf_inv.lua") - -local function allow_metadata_inventory_put(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 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 can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = minetest.get_meta(pos):get_inventory() - return inv:is_empty("main") -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -local function formspec2() - return "size[9,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;0.5,0;8,4;]".. - "list[current_player;main;0.5,4.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -minetest.register_node("techage:chest_ta2", { - description = S("TA2 Protected Chest"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_front_ta3.png", - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size('main', 32) - end, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", formspec2()) - end, - - techage_set_numbers = function(pos, numbers, player_name) - return techage.logic.set_numbers(pos, numbers, player_name, S("TA2 Protected Chest")) - end, - - can_dig = can_dig, - after_dig_node = after_dig_node, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -local function formspec3() - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;0,0;10,4;]".. - "list[current_player;main;1,4.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -minetest.register_node("techage:chest_ta3", { - description = S("TA3 Protected Chest"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_chest_back_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_chest_back_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_chest_back_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_chest_front_ta3.png", - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size('main', 40) - end, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local number = techage.add_node(pos, "techage:chest_ta3") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", formspec3()) - meta:set_string("infotext", S("TA3 Protected Chest").." "..number) - end, - - techage_set_numbers = function(pos, numbers, player_name) - return techage.logic.set_numbers(pos, numbers, player_name, S("TA3 Protected Chest")) - end, - - can_dig = can_dig, - after_dig_node = after_dig_node, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -techage.register_node({"techage:chest_ta2", "techage:chest_ta3"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "main" - end, - on_pull_item = function(pos, in_dir, num, item_name) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", 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, "main", 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, "main", stack) - end, - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_inv_state(inv, "main") - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return 0, {techage.get_inv_state_num(inv, "main")} - else - return 2, "" - end - end, -}) - - -local function formspec4(pos) - return "size[10,9]".. - "tabheader[0,0;tab;"..S("Inventory,Pre-Assignment,Config")..";1;;true]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;0,0;10,5;]".. - mConf.preassigned_stacks(pos, 10, 5).. - "list[current_player;main;1,5.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -local function formspec4_pre(pos) - return "size[10,9]".. - "tabheader[0,0;tab;"..S("Inventory,Pre-Assignment,Config")..";2;;true]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;conf;0,0;10,5;]".. - "list[current_player;main;1,5.3;8,4;]".. - "listring[context;conf]".. - "listring[current_player;main]" -end - -local function formspec4_cfg(pos) - local meta = minetest.get_meta(pos) - local label = meta:get_string("label") or "" - local public = dump((meta:get_int("public") or 0) == 1) - return "size[10,5]".. - "tabheader[0,0;tab;"..S("Inventory,Pre-Assignment,Config")..";3;;true]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.5,1;9,1;label;"..S("Node label:")..";"..label.."]" .. - "checkbox[1,2;public;"..S("Allow public access to the chest")..";"..public.."]".. - "button_exit[3.5,4;3,1;exit;"..S("Save").."]" -end - -local function ta4_allow_metadata_inventory_put(pos, listname, index, stack, player) - local public = M(pos):get_int("public") == 1 - if not public and minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - - if listname == "main" then - return stack:get_count() - else - return mConf.allow_conf_inv_put(pos, listname, index, stack, player) - end -end - -local function ta4_allow_metadata_inventory_take(pos, listname, index, stack, player) - local public = M(pos):get_int("public") == 1 - if not public and minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - - if listname == "main" then - return stack:get_count() - else - return mConf.allow_conf_inv_take(pos, listname, index, stack, player) - end -end - -local function ta4_allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local public = M(pos):get_int("public") == 1 - if not public and minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - - if from_list == "main" then - return count - else - return mConf.allow_conf_inv_move(pos, from_list, from_index, to_list, to_index, count, player) - end -end - -minetest.register_node("techage:chest_ta4", { - description = S("TA4 Protected Chest"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_front_ta4.png", - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size('main', 50) - inv:set_size('conf', 50) - end, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local number = techage.add_node(pos, "techage:chest_ta4") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", formspec4(pos)) - meta:set_string("infotext", S("TA4 Protected Chest").." "..number) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = minetest.get_meta(pos) - local mem = techage.get_mem(pos) - if fields.tab == "1" then - mem.filter = nil - meta:set_string("formspec", formspec4(pos)) - elseif fields.tab == "2" then - meta:set_string("formspec", formspec4_pre(pos)) - elseif fields.tab == "3" then - meta:set_string("formspec", formspec4_cfg(pos)) - elseif fields.quit == "true" then - mem.filter = nil - end - if fields.public then - meta:set_int("public", fields.public == "true" and 1 or 0) - end - if fields.exit then - local number = meta:get_string("node_number") - if fields.label ~= "" then - meta:set_string("infotext", minetest.formspec_escape(fields.label).." #"..number) - else - meta:set_string("infotext", S("TA4 Protected Chest").." "..number) - end - meta:set_string("label", fields.label) - meta:set_string("formspec", formspec4_cfg(pos)) - end - end, - - techage_set_numbers = function(pos, numbers, player_name) - return techage.logic.set_numbers(pos, numbers, player_name, S("TA4 Protected Chest")) - end, - - can_dig = can_dig, - after_dig_node = after_dig_node, - allow_metadata_inventory_put = ta4_allow_metadata_inventory_put, - allow_metadata_inventory_take = ta4_allow_metadata_inventory_take, - allow_metadata_inventory_move = ta4_allow_metadata_inventory_move, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -techage.register_node({"techage:chest_ta4"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "main" - end, - on_pull_item = function(pos, in_dir, num, item_name) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local mem = techage.get_mem(pos) - - mem.filter = mem.filter or mConf.item_filter(pos, TA4_INV_SIZE) - mem.chest_configured = mem.chest_configured or not inv:is_empty("conf") - - if inv:is_empty("main") then - return nil - end - - if item_name then - if mem.filter[item_name] or not mem.chest_configured then - local taken = inv:remove_item("main", {name = item_name, count = num}) - if taken:get_count() > 0 then - return taken - end - end - else -- no item given - if mem.chest_configured then - return mConf.take_item(pos, inv, "main", num, mem.filter["unconfigured"]) - else - return techage.get_items(pos, inv, "main", num) - end - end - end, - on_push_item = function(pos, in_dir, item, idx) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local mem = techage.get_mem(pos) - - mem.filter = mem.filter or mConf.item_filter(pos, TA4_INV_SIZE) - mem.chest_configured = mem.chest_configured or not inv:is_empty("conf") - - if mem.chest_configured then - local name = item:get_name() - local stacks = mem.filter[name] or mem.filter["unconfigured"] - return mConf.put_items(pos, inv, "main", item, stacks, idx) - else - return techage.put_items(inv, "main", item, idx) - end - end, - on_unpull_item = function(pos, in_dir, item) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local mem = techage.get_mem(pos) - - mem.filter = mem.filter or mConf.item_filter(pos, TA4_INV_SIZE) - mem.chest_configured = mem.chest_configured or not inv:is_empty("conf") - - if mem.chest_configured then - local name = item:get_name() - local stacks = mem.filter[name] or mem.filter["unconfigured"] - return mConf.put_items(pos, inv, "main", item, stacks) - else - return techage.put_items(inv, "main", item) - end - end, - - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_inv_state(inv, "main") - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return 0, {techage.get_inv_state_num(inv, "main")} - else - return 2, "" - end - end, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:chest_ta2", - recipe = {"default:chest", "techage:tubeS", "techage:iron_ingot"} -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:chest_ta2", - recipe = {"default:chest_locked", "techage:tubeS", "techage:iron_ingot"} -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:chest_ta2", - recipe = {"protector:chest", "techage:tubeS", "techage:iron_ingot"} -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:chest_ta3", - recipe = {"techage:chest_ta2", "default:chest"} -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:chest_ta4", - recipe = {"techage:chest_ta3", "default:chest"} -}) diff --git a/techage/basic_machines/concentrator.lua b/techage/basic_machines/concentrator.lua deleted file mode 100644 index 8dcb8c2..0000000 --- a/techage/basic_machines/concentrator.lua +++ /dev/null @@ -1,154 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Tube Concentrator - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Tube = techage.Tube - -local size = 2/8 -local Boxes = { - {{-size, -size, size, size, size, 0.5 }}, -- z+ - {{-size, -size, -size, 0.5, size, size}}, -- x+ - {{-size, -size, -0.5, size, size, size}}, -- z- - {{-0.5, -size, -size, size, size, size}}, -- x- - {{-size, -0.5, -size, size, size, size}}, -- y- - {{-size, -size, -size, size, 0.5, size}}, -- y+ -} - -local names = networks.register_junction("techage:concentrator", 2/8, Boxes, Tube, { - description = S("Tube Concentrator"), - tiles = { - "techage_tube_junction.png^techage_appl_arrow2.png^[transformR270", - "techage_tube_junction.png^techage_appl_arrow2.png^[transformR270", - "techage_tube_junction.png^techage_tube_hole.png", - "techage_tube_junction.png", - "techage_tube_junction.png^techage_appl_arrow2.png^[transformR90", - "techage_tube_junction.png^techage_appl_arrow2.png^[transformR270", - }, - paramtype2 = "facedir", -- important! - use_texture_alpha = techage.CLIP, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1}, - sounds = default.node_sound_defaults(), - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) - local name = "techage:concentrator"..networks.junction_type(pos, Tube, "R", node.param2) - minetest.swap_node(pos, {name = name, param2 = node.param2}) - M(pos):set_int("push_dir", techage.side_to_outdir("R", node.param2)) - Tube:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir1, tlib2, node) - local name = "techage:concentrator"..networks.junction_type(pos, Tube, "R", node.param2) - minetest.swap_node(pos, {name = name, param2 = node.param2}) - end, - ta_rotate_node = function(pos, node, new_param2) - Tube:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Tube:after_place_node(pos) - M(pos):set_int("push_dir", techage.side_to_outdir("R", new_param2)) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Tube:after_dig_node(pos) - end, -}, 27) - -for _, name in ipairs(names) do - Tube:set_valid_sides(name, {"B", "R", "F", "L", "D", "U"}) -end - -techage.register_node(names, { - on_push_item = function(pos, in_dir, stack) - local push_dir = M(pos):get_int("push_dir") - if networks.Flip[push_dir] ~= in_dir then - return techage.safe_push_items(pos, push_dir, stack) - else - return stack - end - end, - is_pusher = true, -- is a pulling/pushing node -}) - -names = networks.register_junction("techage:ta4_concentrator", 2/8, Boxes, Tube, { - description = S("TA4 Tube Concentrator"), - tiles = { - "techage_tubeta4_junction.png^techage_appl_arrow2.png^[transformR270", - "techage_tubeta4_junction.png^techage_appl_arrow2.png^[transformR270", - "techage_tubeta4_junction.png^techage_tube_hole.png", - "techage_tubeta4_junction.png", - "techage_tubeta4_junction.png^techage_appl_arrow2.png^[transformR90", - "techage_tubeta4_junction.png^techage_appl_arrow2.png^[transformR270", - }, - paramtype2 = "facedir", -- important! - use_texture_alpha = techage.CLIP, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1}, - sounds = default.node_sound_defaults(), - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) - local name = "techage:ta4_concentrator"..networks.junction_type(pos, Tube, "R", node.param2) - minetest.swap_node(pos, {name = name, param2 = node.param2}) - M(pos):set_int("push_dir", techage.side_to_outdir("R", node.param2)) - Tube:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir1, tlib2, node) - local name = "techage:ta4_concentrator"..networks.junction_type(pos, Tube, "R", node.param2) - minetest.swap_node(pos, {name = name, param2 = node.param2}) - end, - ta_rotate_node = function(pos, node, new_param2) - Tube:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Tube:after_place_node(pos) - M(pos):set_int("push_dir", techage.side_to_outdir("R", new_param2)) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Tube:after_dig_node(pos) - end, -}, 27) - -for _, name in ipairs(names) do - Tube:set_valid_sides(name, {"B", "R", "F", "L", "D", "U"}) -end - -techage.register_node(names, { - on_push_item = function(pos, in_dir, stack) - local push_dir = M(pos):get_int("push_dir") - if networks.Flip[push_dir] ~= in_dir then - return techage.safe_push_items(pos, push_dir, stack) - else - return stack - end - end, - is_pusher = true, -- is a pulling/pushing node -}) - - -minetest.register_craft({ - output = "techage:concentrator27", - recipe = { - {"", "techage:tubeS", ""}, - {"techage:tubeS", "", "techage:tubeS"}, - {"", "techage:tubeS", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_concentrator27", - recipe = { - {"", "techage:ta4_tubeS", ""}, - {"techage:ta4_tubeS", "", "techage:ta4_tubeS"}, - {"", "techage:ta4_tubeS", ""}, - }, -}) diff --git a/techage/basic_machines/consumer.lua b/techage/basic_machines/consumer.lua deleted file mode 100644 index f27836a..0000000 --- a/techage/basic_machines/consumer.lua +++ /dev/null @@ -1,314 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Consumer node basis functionality. - It handles: - - up to 4 stages of nodes (TA2/TA3/TA4/TA5) - - power consumption - - node state handling - - registration of passive and active nodes - - Tube connections are on left and right side (from left to right) - - Power connection are on front and back side (front or back) -]]-- - --- 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[techage.get_node_lvm(pos).name] or {}).consumer end -local CRDN = function(node) return (minetest.registered_nodes[node.name] or {}).consumer end - -local Tube = techage.Tube -local power = networks.power -local liquid = networks.liquid -local CYCLE_TIME = 2 - -local function get_keys(tbl) - local keys = {} - for k,v in pairs(tbl) do - keys[#keys + 1] = k - end - return keys -end - -local function has_power(pos, nvm, state) - local crd = CRD(pos) - return power.power_available(pos, crd.power_netw) -end - -local function start_node(pos, nvm, state) -end - -local function stop_node(pos, nvm, state) -end - -local function node_timer_pas(pos, elapsed) - local crd = CRD(pos) - local nvm = techage.get_nvm(pos) - - -- handle power consumption - if crd.power_netw and techage.needs_power(nvm) then - local consumed = power.consume_power(pos, crd.power_netw, nil, crd.power_consumption) - if consumed == crd.power_consumption then - crd.State:start(pos, nvm) - end - end - - -- call the node timer routine - if techage.is_operational(nvm) then - nvm.node_timer_call_cyle = (nvm.node_timer_call_cyle or 0) + 1 - if nvm.node_timer_call_cyle >= crd.call_cycle then - crd.node_timer(pos, crd.cycle_time) - nvm.node_timer_call_cyle = 0 - end - end - return crd.State:is_active(nvm) -end - -local function node_timer_act(pos, elapsed) - local crd = CRD(pos) - local nvm = techage.get_nvm(pos) - - -- handle power consumption - if crd.power_netw and techage.needs_power(nvm) then - local consumed = power.consume_power(pos, crd.power_netw, nil, crd.power_consumption) - if consumed < crd.power_consumption then - crd.State:nopower(pos, nvm) - end - end - - -- call the node timer routine - if techage.is_operational(nvm) then - nvm.node_timer_call_cyle = (nvm.node_timer_call_cyle or 0) + 1 - if nvm.node_timer_call_cyle >= crd.call_cycle then - crd.node_timer(pos, crd.cycle_time) - nvm.node_timer_call_cyle = 0 - end - end - return crd.State:is_active(nvm) -end - -local function prepare_tiles(tiles, stage, power_png) - local tbl = {} - for _,item in ipairs(tiles) do - if type(item) == "string" then - tbl[#tbl+1] = item:gsub("#", stage):gsub("{power}", power_png):gsub("@@", '#') - else - local temp = table.copy(item) - temp.name = temp.name:gsub("#", stage):gsub("{power}", power_png):gsub("@@", '#') - tbl[#tbl+1] = temp - end - end - return tbl -end - --- 'validStates' is optional and can be used to e.g. enable --- only one TA2 node {false, true, false, false} -function techage.register_consumer(base_name, inv_name, tiles, tNode, validStates, node_name_prefix, inv_name_prefix) - local names = {} - validStates = validStates or {true, true, true, true} - - node_name_prefix = node_name_prefix or "techage:ta" - if inv_name_prefix then - inv_name_prefix = inv_name_prefix.." " - else - inv_name_prefix = "" - end - - for stage = 2,5 do - local name_pas = node_name_prefix..stage.."_"..base_name.."_pas" - local name_act = node_name_prefix..stage.."_"..base_name.."_act" - local name_inv = inv_name_prefix.."TA"..stage.." "..inv_name - names[#names+1] = name_pas - - if validStates[stage] then - local power_network - local power_png = 'techage_axle_clutch.png' - local power_used = tNode.power_consumption ~= nil - local sides - -- power needed? - if power_used then - if stage > 2 then - power_network = techage.ElectricCable - power_png = 'techage_appl_hole_electric.png' - sides = get_keys(tNode.power_sides or {F=1, B=1, U=1, D=1}) - else - power_network = techage.Axle - power_png = 'techage_axle_clutch.png' - sides = get_keys(tNode.power_sides or {F=1, B=1, U=1, D=1}) - end - end - - local tState = techage.NodeStates:new({ - node_name_passive = name_pas, - node_name_active = name_act, - infotext_name = name_inv, - cycle_time = CYCLE_TIME, - standby_ticks = tNode.standby_ticks, - formspec_func = tNode.formspec, - on_state_change = tNode.on_state_change, - can_start = tNode.can_start, - quick_start = tNode.quick_start, - has_power = tNode.has_power or power_used and has_power or nil, - start_node = power_used and start_node or nil, - stop_node = power_used and stop_node or nil, - }) - - local tConsumer = { - stage = stage, - State = tState, - -- number of items to be processed per cycle - num_items = tNode.num_items and tNode.num_items[stage], - power_consumption = power_used and - tNode.power_consumption[stage] or 0, - node_timer = tNode.node_timer, - cycle_time = tNode.cycle_time, - call_cycle = tNode.cycle_time / 2, - power_netw = power_network, - } - - local after_place_node = function(pos, placer, itemstack, pointed_thing) - local crd = CRD(pos) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local node = minetest.get_node(pos) - meta:set_int("push_dir", techage.side_to_indir("L", node.param2)) - meta:set_int("pull_dir", techage.side_to_indir("R", node.param2)) - meta:set_string("owner", placer:get_player_name()) - -- Delete existing node number. Needed for Digtron compatibility. - if (meta:contains("node_number")) then - meta:set_string("node_number", "") - end - local number = techage.add_node(pos, name_pas, stage == 2) - if crd.power_netw then - crd.power_netw:after_place_node(pos) - end - if tNode.after_place_node then - tNode.after_place_node(pos, placer, itemstack, pointed_thing) - end - crd.State:node_init(pos, nvm, number) - end - - local after_dig_node = function(pos, oldnode, oldmetadata, digger) - if tNode.after_dig_node then - tNode.after_dig_node(pos, oldnode, oldmetadata, digger) - end - local crd = CRDN(oldnode) - if crd.power_netw then - crd.power_netw:after_dig_node(pos) - end - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end - - tNode.groups.not_in_creative_inventory = 0 - - local def_pas = { - description = name_inv, - tiles = prepare_tiles(tiles.pas, stage, power_png), - consumer = tConsumer, - drawtype = tNode.drawtype, - node_box = tNode.node_box, - selection_box = tNode.selection_box, - - can_dig = tNode.can_dig, - on_rotate = tNode.on_rotate or screwdriver.disallow, - on_timer = node_timer_pas, - on_receive_fields = tNode.on_receive_fields, - on_rightclick = tNode.on_rightclick, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - preserve_metadata = tNode.preserve_metadata, - allow_metadata_inventory_put = tNode.allow_metadata_inventory_put, - allow_metadata_inventory_move = tNode.allow_metadata_inventory_move, - allow_metadata_inventory_take = tNode.allow_metadata_inventory_take, - on_metadata_inventory_move = tNode.on_metadata_inventory_move, - on_metadata_inventory_put = tNode.on_metadata_inventory_put, - on_metadata_inventory_take = tNode.on_metadata_inventory_take, - ta_rotate_node = tNode.ta_rotate_node, - ta3_formspec = stage == 3 and tNode.ta3_formspec, - ta4_formspec = stage == 4 and tNode.ta4_formspec, - - paramtype = tNode.paramtype, - paramtype2 = "facedir", - drop = tNode.drop, - groups = table.copy(tNode.groups), - is_ground_content = false, - sounds = tNode.sounds, - } - - -- Copy custom properties (starting with an underscore) - for k,v in pairs(tNode) do - if string.sub(k, 1, 1) == "_" then - def_pas[k] = v - end - end - - minetest.register_node(name_pas, def_pas) - - tNode.groups.not_in_creative_inventory = 1 - - local def_act = { - description = name_inv, - tiles = prepare_tiles(tiles.act, stage, power_png), - consumer = tConsumer, - drawtype = tNode.drawtype, - node_box = tNode.node_box, - selection_box = tNode.selection_box, - - on_rotate = tNode.on_rotate or screwdriver.disallow, - on_timer = node_timer_act, - on_receive_fields = tNode.on_receive_fields, - on_rightclick = tNode.on_rightclick, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - allow_metadata_inventory_put = tNode.allow_metadata_inventory_put, - allow_metadata_inventory_move = tNode.allow_metadata_inventory_move, - allow_metadata_inventory_take = tNode.allow_metadata_inventory_take, - on_metadata_inventory_move = tNode.on_metadata_inventory_move, - on_metadata_inventory_put = tNode.on_metadata_inventory_put, - on_metadata_inventory_take = tNode.on_metadata_inventory_take, - ta_rotate_node = tNode.ta_rotate_node, - ta3_formspec = stage == 3 and tNode.ta3_formspec, - ta4_formspec = stage == 4 and tNode.ta4_formspec, - - paramtype = tNode.paramtype, - paramtype2 = "facedir", - drop = "", - diggable = false, - groups = table.copy(tNode.groups), - is_ground_content = false, - sounds = tNode.sounds, - } - - -- Copy custom properties (starting with an underscore) - for k,v in pairs(tNode) do - if string.sub(k, 1, 1) == "_" then - def_act[k] = v - end - end - - minetest.register_node(name_act, def_act) - - if power_used then - power.register_nodes({name_pas, name_act}, power_network, "con", sides) - end - techage.register_node({name_pas, name_act}, tNode.tubing) - - if tNode.tube_sides then - Tube:set_valid_sides(name_pas, get_keys(tNode.tube_sides)) - Tube:set_valid_sides(name_act, get_keys(tNode.tube_sides)) - end - end - end - return names[1], names[2], names[3], names[4] -end diff --git a/techage/basic_machines/distributor.lua b/techage/basic_machines/distributor.lua deleted file mode 100644 index fc644a1..0000000 --- a/techage/basic_machines/distributor.lua +++ /dev/null @@ -1,683 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3/TA4 Distributor - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local N = minetest.get_node --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end -local Tube = techage.Tube - -local S = techage.S - -local SRC_INV_SIZE = 8 - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 4 -local FILTER_ITEM_LIMIT_PER_STACK = 12 -local FILTER_ITEM_LIMIT = 36 - -local INFO = [[Turn port on/off or read its state: command = 'port', payload = red/green/blue/yellow{=on/off}]] - - ---local Side2Color = {B="red", L="green", F="blue", R="yellow"} -local SlotColors = {"red", "green", "blue", "yellow"} -local SlotNumbers = {red = 1, green = 2, blue = 3, yellow = 4} -local Num2Ascii = {"B", "L", "F", "R"} -local FilterCache = {} -- local cache for filter settings - -local function filter_settings(pos) - local meta = M(pos) - local param2 = techage.get_node_lvm(pos).param2 - local inv = meta:get_inventory() - local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} - local ItemFilter = {} -- { = {dir,...}] - local OpenPorts = {} -- {dir, ...} - local counter = 0 -- counts total item number in filter configuration - - -- collect all filter settings - for idx,slot in ipairs(SlotColors) do - if filter[idx] == true then - local side = Num2Ascii[idx] - local out_dir = techage.side_to_outdir(side, param2) - if inv:is_empty(slot) then - table.insert(OpenPorts, out_dir) - else - for idx2,stack in ipairs(inv:get_list(slot)) do - local name = stack:get_name() - if name ~= "" then - if not ItemFilter[name] then - ItemFilter[name] = {} - end - for _ = 1, math.min(FILTER_ITEM_LIMIT_PER_STACK, stack:get_count()) do - if counter > FILTER_ITEM_LIMIT then - break - end - table.insert(ItemFilter[name], out_dir) - counter = counter + 1 - end - end - end - end - end - end - - FilterCache[minetest.hash_node_position(pos)] = { - ItemFilter = ItemFilter, - OpenPorts = OpenPorts, - } -end - --- Return filter table and list of open ports. --- (see test data) -local function get_filter_settings(pos) --- local ItemFilter = { --- ["default:dirt"] = {1,2}, --- ["default:cobble"] = {4}, --- } --- local OpenPorts = {3} --- return ItemFilter, OpenPorts - - local hash = minetest.hash_node_position(pos) - if FilterCache[hash] == nil then - filter_settings(pos) - end - return FilterCache[hash].ItemFilter, FilterCache[hash].OpenPorts -end - -local function blocking_checkbox(pos, filter, is_hp) - local cnt = 0 - local _, open_ports = get_filter_settings(pos) - local fs_pos = is_hp and "0.25,5" or "3,3.9" - for _,val in ipairs(filter) do - if val then cnt = cnt + 1 end - end - if cnt > 1 and #open_ports > 0 then - local blocking = M(pos):get_int("blocking") == 1 and "true" or "false" - return "checkbox["..fs_pos..";blocking;"..S("blocking mode")..";"..blocking.."]".. - "tooltip["..fs_pos..";1,1;"..S("Block configured items for open ports")..";#0C3D32;#FFFFFF]" - else - M(pos):set_int("blocking", 0) -- disable blocking - end - return "" -end - -local function formspec(self, pos, nvm) - local filter = minetest.deserialize(M(pos):get_string("filter")) or {false,false,false,false} - local is_hp = nvm.high_performance == true - local blocking = blocking_checkbox(pos, filter, is_hp) - - if is_hp then - return "size[10.5,9.5]".. - "box[0.25,-0.1;9.6,1.1;#005500]".. - "label[0.6,0.2;"..S("Input").."]".. - "list[context;src;1.75,0;8,1;]".. - blocking.. - "image_button[0.25,5.8;1,1;"..self:get_state_button_image(nvm)..";state_button;]".. - "tooltip[0.25,5.8;1,1;"..self:get_state_tooltip(nvm).."]".. - "checkbox[0.25,1.2;filter1;On;"..dump(filter[1]).."]".. - "checkbox[0.25,2.2;filter2;On;"..dump(filter[2]).."]".. - "checkbox[0.25,3.2;filter3;On;"..dump(filter[3]).."]".. - "checkbox[0.25,4.2;filter4;On;"..dump(filter[4]).."]".. - "image[1.25,1.2;0.3,1;techage_inv_red.png]".. - "image[1.25,2.2;0.3,1;techage_inv_green.png]".. - "image[1.25,3.2;0.3,1;techage_inv_blue.png]".. - "image[1.25,4.2;0.3,1;techage_inv_yellow.png]".. - "list[context;red;1.75,1.2;8,1;]".. - "list[context;green;1.75,2.2;8,1;]".. - "list[context;blue;1.75,3.2;8,1;]".. - "list[context;yellow;1.75,4.2;8,1;]".. - "list[current_player;main;1.75,5.8;8,4;]".. - "listring[context;src]".. - "listring[current_player;main]".. - default.get_hotbar_bg(1.75,5.8) - else - return "size[10.5,8.5]".. - "list[context;src;0,0;2,4;]".. - blocking.. - "image[2,1.5;1,1;techage_form_arrow.png]".. - "image_button[0,4.8;1,1;"..self:get_state_button_image(nvm)..";state_button;]".. - "tooltip[0,4.8;1,1;"..self:get_state_tooltip(nvm).."]".. - "checkbox[3,0;filter1;On;"..dump(filter[1]).."]".. - "checkbox[3,1;filter2;On;"..dump(filter[2]).."]".. - "checkbox[3,2;filter3;On;"..dump(filter[3]).."]".. - "checkbox[3,3;filter4;On;"..dump(filter[4]).."]".. - "image[4,0;0.3,1;techage_inv_red.png]".. - "image[4,1;0.3,1;techage_inv_green.png]".. - "image[4,2;0.3,1;techage_inv_blue.png]".. - "image[4,3;0.3,1;techage_inv_yellow.png]".. - "list[context;red;4.5,0;6,1;]".. - "list[context;green;4.5,1;6,1;]".. - "list[context;blue;4.5,2;6,1;]".. - "list[context;yellow;4.5,3;6,1;]".. - "list[current_player;main;1.25,4.8;8,4;]".. - "listring[context;src]".. - "listring[current_player;main]".. - default.get_hotbar_bg(1.25,4.8) - end -end - -local function get_total_filter_items_number(pos, except_listname, except_index) - local inv = M(pos):get_inventory() - local total = 0 - for _, listname in ipairs(SlotColors) do - local list = inv:get_list(listname) - for idx, stack in ipairs(list) do - if not (listname == except_listname and idx == except_index) then - total = total + stack:get_count() - end - end - end - return total -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local inv = M(pos):get_inventory() - local list = inv:get_list(listname) - - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if listname == "src" then - CRD(pos).State:start_if_standby(pos) - return stack:get_count() - else - stack:add_item(list[index]) - local max_items_to_limit = FILTER_ITEM_LIMIT - get_total_filter_items_number(pos, listname, index) - stack:set_count(math.min(FILTER_ITEM_LIMIT_PER_STACK, stack:get_count(), max_items_to_limit)) - inv:set_stack(listname, index, stack) - return 0 - end - return 0 -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 - if listname == "src" then - return stack:get_count() - else - local inv = M(pos):get_inventory() - local list = inv:get_list(listname) - list[index]:take_item(stack:get_count()) - inv:set_stack(listname, index, list[index]) - return 0 - end -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - local inv = minetest.get_meta(pos):get_inventory() - local stack = inv:get_stack(from_list, from_index) - - if from_list == "src" and to_list ~= "src" then - stack:add_item(inv:get_stack(to_list, to_index)) - local max_items_to_limit = FILTER_ITEM_LIMIT - get_total_filter_items_number(pos, to_list, to_index) - stack:set_count(math.min(FILTER_ITEM_LIMIT_PER_STACK, stack:get_count(), max_items_to_limit)) - inv:set_stack(to_list, to_index, stack) - return 0 - elseif from_list ~= "src" and to_list == "src" then - inv:set_stack(from_list, from_index, nil) - return 0 - elseif from_list ~= "src" and to_list ~= "src" then - return math.min(stack:get_count(), FILTER_ITEM_LIMIT_PER_STACK - inv:get_stack(to_list, to_index):get_count()) - else - return stack:get_count() - end -end - -local function tubelib2_on_update2(pos, outdir, tlib2, node) - local is_ta4_tube = true - for dir = 1,4 do - for i, pos, node in Tube:get_tube_line(pos, dir) do - is_ta4_tube = is_ta4_tube and techage.TA4tubes[node.name] - end - end - - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - if CRD(pos).stage == 4 and not is_ta4_tube then - nvm.num_items = crd.num_items / 2 - else - nvm.num_items = crd.num_items - end -end - -local function shuffle(list) - for i = #list, 2, -1 do - local j = math.random(i) - list[i], list[j] = list[j], list[i] - end - return list -end - -local function push_item(pos, base_filter, itemstack, num_items, nvm) - local filter = shuffle(table.copy(base_filter)) - local idx = 1 - local num_pushed = 0 - local num_ports = #filter - local amount = math.floor(math.max((num_items + 1) / num_ports, 1)) - local num_of_trials = 0 - while num_pushed < num_items and num_of_trials <= 8 do - num_of_trials = num_of_trials + 1 - local push_dir = filter[idx] - local num_to_push = math.min(amount, num_items - num_pushed) - local leftover = techage.push_items(pos, push_dir, itemstack:peek_item(num_to_push)) - local pushed - if not leftover then - pushed = 0 - elseif leftover ~= true then - pushed = num_to_push - leftover:get_count() - else -- leftover == true - pushed = num_to_push - end - num_pushed = num_pushed + pushed - nvm.port_counter[push_dir] = (nvm.port_counter[push_dir] or 0) + pushed - -- filter start offset - idx = idx + 1 - if idx > num_ports then - idx = 1 - end - end - return num_pushed -end - --- move items to output slots -local function distributing(pos, inv, crd, nvm) - local item_filter, open_ports = get_filter_settings(pos) - local sum_num_pushed = 0 - local num_pushed = 0 - local blocking_mode = M(pos):get_int("blocking") == 1 - - -- start searching after last position - local offs = nvm.last_index or 1 - - for i = 1, SRC_INV_SIZE do - local idx = ((i + offs - 1) % 8) + 1 - local stack = inv:get_stack("src", idx) - local item_name = stack:get_name() - local num_items = stack:get_count() - local num_to_push = math.min((nvm.num_items or crd.num_items) - sum_num_pushed, num_items) - local stack_to_push = stack:peek_item(num_to_push) - local filter = item_filter[item_name] - num_pushed = 0 - - if filter and #filter > 0 then - -- Push items based on filter - num_pushed = push_item(pos, filter, stack_to_push, num_to_push, nvm) - elseif blocking_mode and #open_ports > 0 then - -- Push items based on open ports - num_pushed = push_item(pos, open_ports, stack_to_push, num_to_push, nvm) - end - if not blocking_mode and num_pushed == 0 and #open_ports > 0 then - -- Push items based on open ports - num_pushed = push_item(pos, open_ports, stack_to_push, num_to_push, nvm) - end - - sum_num_pushed = sum_num_pushed + num_pushed - stack:take_item(num_pushed) - inv:set_stack("src", idx, stack) - if sum_num_pushed >= (nvm.num_items or crd.num_items) then - nvm.last_index = idx - break - end - end - - if sum_num_pushed == 0 then - crd.State:blocked(pos, nvm) - else - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end -end - --- move items to the output slots -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.port_counter = nvm.port_counter or {} - local crd = CRD(pos) - local inv = M(pos):get_inventory() - if not inv:is_empty("src") then - distributing(pos, inv, crd, nvm) - else - crd.State:idle(pos, nvm) - end - return crd.State:is_active(nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local meta = M(pos) - local crd = CRD(pos) - local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} - if fields.filter1 ~= nil then - filter[1] = fields.filter1 == "true" - elseif fields.filter2 ~= nil then - filter[2] = fields.filter2 == "true" - elseif fields.filter3 ~= nil then - filter[3] = fields.filter3 == "true" - elseif fields.filter4 ~= nil then - filter[4] = fields.filter4 == "true" - elseif fields.blocking ~= nil then - meta:set_int("blocking", fields.blocking == "true" and 1 or 0) - end - meta:set_string("filter", minetest.serialize(filter)) - - filter_settings(pos) - - local nvm = techage.get_nvm(pos) - if fields.state_button ~= nil then - crd.State:state_button_event(pos, nvm, fields) - else - meta:set_string("formspec", formspec(crd.State, pos, nvm)) - end -end - --- techage command to turn on/off filter channels -local function change_filter_settings(pos, slot, val) - local meta = M(pos) - local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} - local num = SlotNumbers[slot] or 1 - if num >= 1 and num <= 4 then - filter[num] = val == "on" - end - meta:set_string("filter", minetest.serialize(filter)) - - local hash = minetest.hash_node_position(pos) - FilterCache[hash] = nil - - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - return true -end - --- techage command to read filter channel status (on/off) -local function read_filter_settings(pos, slot) - local filter = minetest.deserialize(M(pos):get_string("filter")) or {false,false,false,false} - return filter[SlotNumbers[slot]] and "on" or "off" -end - -local function get_payload_values(payload) - local color - local idx = 0 - local items = {ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack("")} - for s in payload:gmatch("[^%s]+") do --- white spaces - if not color then - if SlotNumbers[s] then - color = s - else - return "red", {} - end - else - idx = idx + 1 - if idx <= 6 then - items[idx] = ItemStack(s) - end - end - end - return color, items -end - -local function str_of_inv_items(pos, color) - color = SlotColors[color] or color - if SlotNumbers[color] then - local inv = M(pos):get_inventory() - local t = {} - for idx = 1, 6 do - local item = inv:get_stack(color, idx) - if item:get_count() > 0 then - t[#t + 1] = item:get_name() - end - end - return table.concat(t, " ") - end - return "" -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("src") -end - -local get_tiles = function(is_hp) - local variant = is_hp and "_hp" or "" - local tiles = {} - -- '#' will be replaced by the stage number - -- '{power}' will be replaced by the power PNG - tiles.pas = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_appl_distri.png^techage_frame_ta#_top"..variant..".png^techage_appl_color_top.png", - "techage_filling_ta#.png^techage_frame_ta#_top"..variant..".png^(techage_appl_color_top.png^[transformFY)", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_yellow.png", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_green.png", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_red.png", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_blue.png", - } - tiles.act = { - -- up, down, right, left, back, front - { - name = "techage_filling4_ta#.png^techage_appl_distri4.png^techage_frame4_ta#_top"..variant..".png^techage_appl_color_top4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 1.0, - }, - }, - "techage_filling_ta#.png^techage_frame_ta#_top"..variant..".png^(techage_appl_color_top.png^[transformFY)", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_yellow.png", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_green.png", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_red.png", - "techage_filling_ta#.png^techage_frame_ta#"..variant..".png^techage_appl_distri_blue.png", - } - return tiles -end - -local tubing = { - on_pull_item = function(pos, in_dir, num) - local inv = M(pos):get_inventory() - return techage.get_items(pos, inv, "src", num) - end, - on_push_item = function(pos, in_dir, stack) - CRD(pos).State:start_if_standby(pos) - local inv = M(pos):get_inventory() - return techage.put_items(inv, "src", stack) - end, - on_unpull_item = function(pos, in_dir, stack) - local inv = M(pos):get_inventory() - return techage.put_items(inv, "src", stack) - end, - on_recv_message = function(pos, src, topic, payload) - if topic == "info" then - return INFO - elseif topic == "port" then - -- "red"/"green"/"blue"/"yellow" = "on"/"off" - local slot, val = techage.ident_value(payload) - if val == "" then - return read_filter_settings(pos, slot) - else - return change_filter_settings(pos, slot, val) - end - elseif topic == "config" then - local color, items = get_payload_values(payload) - local inv = M(pos):get_inventory() - for idx,item in ipairs(items) do - inv:set_stack(color, idx, item) - end - local hash = minetest.hash_node_position(pos) - FilterCache[hash] = nil - return true - elseif topic == "get" then - return str_of_inv_items(pos, payload) - else - return CRD(pos).State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 4 then - local slot = SlotColors[payload[1]] - local state = payload[2] == 1 and "on" or "off" - change_filter_settings(pos, slot, state) - return 0 - elseif topic == 67 then - local color, items = get_payload_values(payload) - local inv = M(pos):get_inventory() - for idx,item in ipairs(items) do - inv:set_stack(color, idx, item) - end - local hash = minetest.hash_node_position(pos) - FilterCache[hash] = nil - return 0 - else - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 148 then - return 0, str_of_inv_items(pos, payload[1]) - else - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, -} - -local def = { - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer) - local meta = M(pos) - local filter = {false,false,false,false} - meta:set_string("filter", minetest.serialize(filter)) - local inv = meta:get_inventory() - inv:set_size('src', 8) - inv:set_size('yellow', 6) - inv:set_size('green', 6) - inv:set_size('red', 6) - inv:set_size('blue', 6) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - tubelib2_on_update2 = tubelib2_on_update2, - - on_metadata_inventory_move = function(pos, from_list, from_index, to_list) - if from_list ~= "src" or to_list ~= "src" then - filter_settings(pos) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - end - end, - on_metadata_inventory_put = function(pos, listname) - if listname ~= "src" then - filter_settings(pos) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - end - end, - on_metadata_inventory_take = function(pos, listname) - if listname ~= "src" then - filter_settings(pos) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - end - end, - - groups = {choppy=2, cracky=2, crumbly=2}, - sounds = default.node_sound_wood_defaults(), - num_items = {0,4,12,24}, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = techage.register_consumer( - "distributor", - S("Distributor"), - get_tiles(false), - def -) - -local hp_def = table.copy(def) - -hp_def.after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.high_performance = true - local filter = {false,false,false,false} - meta:set_string("filter", minetest.serialize(filter)) - local inv = meta:get_inventory() - inv:set_size('src', 8) - inv:set_size('yellow', 8) - inv:set_size('green', 8) - inv:set_size('red', 8) - inv:set_size('blue', 8) -end -hp_def.num_items = {0,0,0,36} - -local _, _, node_name_ta4_hp = techage.register_consumer( - "high_performance_distributor", S("High Performance Distributor"), - get_tiles(true), - hp_def, - {false, false, false, true} -) - -minetest.register_craft({ - output = node_name_ta2.." 2", - recipe = { - {"group:wood", "techage:iron_ingot", "group:wood"}, - {"techage:tubeS", "default:mese_crystal", "techage:tubeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "techage:iron_ingot", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "techage:iron_ingot", ""}, - {"", node_name_ta3, ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) - - -minetest.register_craft({ - output = node_name_ta4_hp, - recipe = { - {node_name_ta4, "default:copper_ingot"}, - {"default:mese_crystal_fragment", node_name_ta4}, - }, -}) diff --git a/techage/basic_machines/electronic_fab.lua b/techage/basic_machines/electronic_fab.lua deleted file mode 100644 index a668880..0000000 --- a/techage/basic_machines/electronic_fab.lua +++ /dev/null @@ -1,314 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3/TA4 Electronic Fab - -]]-- - --- for lazy programmers -local M = minetest.get_meta --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local S = techage.S -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 6 - -local recipes = techage.recipes - -local RecipeType = { - [2] = "ta2_electronic_fab", - [3] = "ta3_electronic_fab", - [4] = "ta4_electronic_fab", -} - -local function formspec(self, pos, nvm) - local rtype = RecipeType[CRD(pos).stage] - local owner = M(pos):get_string("owner") - return "size[8.4,8.4]".. - "list[context;src;0,0;2,4;]".. - recipes.formspec(2.2, 0, rtype, nvm, owner).. - "list[context;dst;6.4,0;2,4;]".. - "image_button[3.7,3.3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.7,3.3;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[current_player;main;0.2,4.5;8,4;]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - default.get_hotbar_bg(0.2, 4.5) -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 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 get_original_waste(inv, waste) - -- Waste has meta data, so we need to find the original waste item - for i = 1, 8 do - local stack = inv:get_stack("src", i) - if stack:get_count() == 1 then - if stack:get_name() == waste:get_name() then - return stack - end - end - end - return waste -end - -local function making(pos, crd, nvm, inv) - local owner = M(pos):get_string("owner") - local rtype = RecipeType[crd.stage] - local recipe = recipes.get(nvm, rtype, owner) - local output = ItemStack(recipe.output.name .. " " .. recipe.output.num) - local waste = recipe.waste and ItemStack(recipe.waste.name .. " " .. recipe.waste.num) - if inv:room_for_item("dst", output) and (not waste or inv:room_for_item("dst", waste)) then - for _,item in ipairs(recipe.input) do - local input = ItemStack(item.name.." "..item.num) - if not inv:contains_item("src", input) then - crd.State:idle(pos, nvm) - return - end - end - -- For some recipes, an item customized via metadata is used as a copy template. - -- This allows specially programmed items such as ROM chips to be produced. - -- The metadata of the copy template must be passed to the on_production function. - -- At the same time, the metadata of the copy template must not be lost when moving - -- as 'waste' to the output inventory. - local idef = minetest.registered_items[recipe.output.name] - if waste and idef and idef.on_production then - waste = get_original_waste(inv, waste) - local metadata = waste:get_meta():to_table().fields or {} - output = idef.on_production(output, metadata) - end - for _,item in ipairs(recipe.input) do - local input = ItemStack(item.name.." "..item.num) - inv:remove_item("src", input) - end - inv:add_item("dst", output) - if waste then - inv:add_item("dst", waste) - end - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return - end - crd.State:idle(pos, nvm) -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - if inv then - making(pos, crd, nvm, inv) - end -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - - if not nvm.running then - recipes.on_receive_fields(pos, formname, fields, player) - end - - crd.State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -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_electronic_fab.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_electronic_fab.png^techage_frame_ta#.png", -} -tiles.act = { - -- 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", - { - name = "techage_filling4_ta#.png^techage_appl_electronic_fab4.png^techage_frame4_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.5, - }, - }, - { - name = "techage_filling4_ta#.png^techage_appl_electronic_fab4.png^techage_frame4_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.5, - }, - }, -} - -local tubing = { - on_inv_request = function(pos, in_dir, access_type) - if access_type == "push" then - local meta = minetest.get_meta(pos) - if meta:get_int("push_dir") == in_dir or in_dir == 5 then - return meta:get_inventory(), "src" - end - end - end, - 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(pos, inv, "dst", num) - end - end, - on_push_item = function(pos, in_dir, stack, idx) - 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() - --CRD(pos).State:start_if_standby(pos) -- would need power! - return techage.put_items(inv, "src", stack, idx) - 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, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = - techage.register_consumer("electronic_fab", S("Electronic Fab"), tiles, { - drawtype = "normal", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size("src", 8) - inv:set_size("dst", 8) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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,8,12,12}, - }, - {false, true, true, true}) -- TA2/TA3/TA4 - -minetest.register_craft({ - output = node_name_ta2, - recipe = { - {"group:wood", "default:diamond", "group:wood"}, - {"techage:tubeS", "basic_materials:gear_steel", "techage:tubeS"}, - {"group:wood", "default:steel_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:diamond", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "default:diamond", ""}, - {"", node_name_ta3, ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) - -techage.recipes.register_craft_type("ta2_electronic_fab", { - description = S("TA2 Ele Fab"), - icon = 'techage_filling_ta2.png^techage_appl_electronic_fab.png^techage_frame_ta2.png', - width = 2, - height = 2, -}) -techage.recipes.register_craft_type("ta3_electronic_fab", { - description = S("TA3 Ele Fab"), - icon = 'techage_filling_ta3.png^techage_appl_electronic_fab.png^techage_frame_ta3.png', - width = 2, - height = 2, -}) -techage.recipes.register_craft_type("ta4_electronic_fab", { - description = S("TA4 Ele Fab"), - icon = 'techage_filling_ta4.png^techage_appl_electronic_fab.png^techage_frame_ta4.png', - width = 2, - height = 2, -}) diff --git a/techage/basic_machines/forceload.lua b/techage/basic_machines/forceload.lua deleted file mode 100644 index f095f8c..0000000 --- a/techage/basic_machines/forceload.lua +++ /dev/null @@ -1,340 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Forceload block - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S = techage.S - -local function calc_area(pos) - local xpos = (math.floor(pos.x / 16) * 16) - local ypos = (math.floor(pos.y / 16) * 16) - local zpos = (math.floor(pos.z / 16) * 16) - local pos1 = {x=xpos, y=ypos, z=zpos} - local pos2 = {x=xpos+15, y=ypos+15, z=zpos+15} - return pos1, pos2 -end - -local function in_list(list, x) - local pos1 = calc_area(x) - for _,v in ipairs(list) do - local pos2 = calc_area(v) - if vector.equals(pos1, pos2) then return true end - end - return false -end - -local function remove_list_elem(list, x) - local n = nil - for idx, v in ipairs(list) do - if vector.equals(v, x) then - n = idx - break - end - end - if n then - table.remove(list, n) - end - return list -end - -local function chat(player, text) - minetest.chat_send_player(player:get_player_name(), "[Techage] "..text) -end - -local function postload_area(pos) - minetest.log("warning", "[FLB] area "..P2S(pos).." not loaded!") - if not minetest.forceload_block(pos, true) then - minetest.after(60, postload_area, pos) - end -end - -local function add_pos(pos, player) - local meta = player:get_meta() - local lPos = minetest.deserialize(meta:get_string("techage_forceload_blocks")) or {} - if not in_list(lPos, pos) and (#lPos < techage.max_num_forceload_blocks or - minetest.global_exists("creative") and creative.is_enabled_for and - creative.is_enabled_for(player:get_player_name())) then - lPos[#lPos+1] = pos - local meta = player:get_meta() - meta:set_string("techage_forceload_blocks", minetest.serialize(lPos)) - return true - end - return false -end - -local function del_pos(pos, player) - local meta = player:get_meta() - local lPos = minetest.deserialize(meta:get_string("techage_forceload_blocks")) or {} - lPos = remove_list_elem(lPos, pos) - if next(lPos) then - meta:set_string("techage_forceload_blocks", minetest.serialize(lPos)) - else - meta:set_string("techage_forceload_blocks", "") - end -end - -local function get_pos_list(player) - local meta = player:get_meta() - return minetest.deserialize(meta:get_string("techage_forceload_blocks")) or {} -end - -local function set_pos_list(player, lPos) - local meta = player:get_meta() - if next(lPos) then - meta:set_string("techage_forceload_blocks", minetest.serialize(lPos)) - else - meta:set_string("techage_forceload_blocks", "") - end -end - -local function show_flbs(pos, name, range) - local pos1 = {x=pos.x-range, y=pos.y-range, z=pos.z-range} - local pos2 = {x=pos.x+range, y=pos.y+range, z=pos.z+range} - for _,npos in ipairs(minetest.find_nodes_in_area(pos1, pos2, {"techage:forceload", "techage:forceloadtile"})) do - local _pos1, _pos2 = calc_area(npos) - local owner = M(npos):get_string("owner") - techage.mark_region(name, _pos1, _pos2, owner .. " " .. P2S(npos)) - end -end - -local function get_data(pos, player) - local pos1, pos2 = calc_area(pos) - local meta = player:get_meta() - local num = #minetest.deserialize(meta:get_string("techage_forceload_blocks")) or 0 - local max = techage.max_num_forceload_blocks - return pos1, pos2, num, max -end - -local function formspec(name) - local player = minetest.get_player_by_name(name) - if player then - local lPos = get_pos_list(player) - local tRes = {} - tRes[#tRes+1] = "#" - tRes[#tRes+1] = S("Block at pos") - tRes[#tRes+1] = S("Area from") - tRes[#tRes+1] = S("Area to") - tRes[#tRes+1] = S("Status") - for idx,pos in ipairs(lPos) do - local pos1, pos2 = calc_area(pos) - tRes[#tRes+1] = idx - tRes[#tRes+1] = minetest.formspec_escape(P2S(pos)) - tRes[#tRes+1] = minetest.formspec_escape(P2S(pos1)) - tRes[#tRes+1] = minetest.formspec_escape(P2S(pos2)) - tRes[#tRes+1] = minetest.forceload_block(pos, true) and 'Loaded' or 'Unloaded' - end - return "size[9,9]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[0,0;"..S("List of your Forceload Blocks:").."]".. - "tablecolumns[text,width=1.8;text,width=12;text,width=12;text,width=12;text,width=12]".. - "table[0,0.6;8.8,8.4;output;"..table.concat(tRes, ",")..";1]" - end -end - -local function on_place(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - return minetest.rotate_and_place(itemstack, placer, pointed_thing) -end - -local function after_place_node(pos, placer, itemstack) - if add_pos(pos, placer) then - minetest.forceload_block(pos, true) - local pos1, pos2, num, max = get_data(pos, placer) - M(pos):set_string("infotext", "Area "..P2S(pos1).." to "..P2S(pos2).." "..S("loaded").."!\n".. - S("Punch the block to make the area visible.")) - chat(placer, "Area ("..num.."/"..max..") "..P2S(pos1).." to "..P2S(pos2).." "..S("loaded").."!") - techage.mark_region(placer:get_player_name(), pos1, pos2) - M(pos):set_string("owner", placer:get_player_name()) - else - chat(placer, S("Area already loaded or max. number of Forceload Blocks reached!")) - minetest.remove_node(pos) - return itemstack - end -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - local player = minetest.get_player_by_name(oldmetadata.fields.owner) - if player then - del_pos(pos, player) - end - minetest.forceload_free_block(pos, true) - techage.unmark_region(oldmetadata.fields.owner) -end - -local function on_rightclick(pos, node, clicker, itemstack, pointed_thing) - local owner = M(pos):get_string("owner") - local name = clicker:get_player_name() - if name == owner or minetest.check_player_privs(name, "server") then - local s = formspec(owner) - if s then - minetest.show_formspec(name, "techage:forceload", s) - end - end -end - -local function on_punch(pos, node, puncher, pointed_thing) - local pos1, pos2 = calc_area(pos) - techage.switch_region(puncher:get_player_name(), pos1, pos2) -end - -minetest.register_node("techage:forceload", { - description = S("Techage Forceload Block"), - tiles = { - -- up, down, right, left, back, front - 'techage_filling_ta2.png^techage_frame_ta2_top.png', - 'techage_filling_ta2.png^techage_frame_ta2_top.png', - { - name = "techage_filling_ta2.png^techage_frame_ta2_top.png^techage_appl_forceload.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.5, - }, - }, - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_rightclick = on_rightclick, - on_punch = on_punch, - - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = techage.CLIP, - groups = {choppy=2, cracky=2, crumbly=2, - digtron_protected = 1, - not_in_creative_inventory = techage.max_num_forceload_blocks == 0 and 1 or 0}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:forceloadtile", { - description = S("Techage Forceload Tile"), - tiles = { - -- up, down, right, left, back, front - { - name = "techage_filling_ta2.png^techage_frame_ta2_top.png^techage_appl_forceload.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.5, - }, - }, - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - --{-5/16, -7/16, -5/16, 5/16, -5/16, 5/16}, - {-4/16, -8/16, -4/16, 4/16, -15/32, 4/16}, - }, - }, - - on_place = on_place, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_rightclick = on_rightclick, - on_punch = on_punch, - - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - groups = {choppy=2, cracky=2, crumbly=2, - not_in_creative_inventory = techage.max_num_forceload_blocks == 0 and 1 or 0}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -if techage.max_num_forceload_blocks > 0 then - minetest.register_craft({ - output = "techage:forceload", - recipe = { - {"group:wood", "", "group:wood"}, - {"default:mese_crystal_fragment", "techage:usmium_nuggets", "default:mese_crystal_fragment"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, - }) - minetest.register_craft({ - type = "shapeless", - output = "techage:forceloadtile", - recipe = {"techage:forceload"}, - }) - minetest.register_craft({ - type = "shapeless", - output = "techage:forceload", - recipe = {"techage:forceloadtile"}, - }) -end - -minetest.register_on_joinplayer(function(player) - local lPos = {} - for _,pos in ipairs(get_pos_list(player)) do - local node = techage.get_node_lvm(pos) - if node.name == "techage:forceload" or node.name == "techage:forceloadtile" then - if not minetest.forceload_block(pos, true) then - minetest.after(60, postload_area, pos) - end - lPos[#lPos+1] = pos - end - end - set_pos_list(player, lPos) -end) - -minetest.register_on_leaveplayer(function(player) - for _,pos in ipairs(get_pos_list(player)) do - minetest.forceload_free_block(pos, true) - end -end) - - -minetest.register_chatcommand("forceload", { - params = "", - description = S("Show all forceload blocks in a 64x64x64 range"), - func = function(name, param) - local player = minetest.get_player_by_name(name) - if player then - local pos = player:get_pos() - pos = vector.round(pos) - show_flbs(pos, name, 64) - end - end, -}) - -minetest.register_chatcommand("forceload_verify", { - params = "", - description = "Checks each forceload block and returns a count of active/placed blocks", - func = function(name, param) - local player = minetest.get_player_by_name(name) - if player then - local loaded = {} - local wanted = get_pos_list(player) - for _,pos in ipairs(wanted) do - if minetest.forceload_block(pos, true) then - loaded[#loaded+1] = pos - end - end - minetest.chat_send_player(name, "Found "..#loaded.." out of ".. #wanted .. " force loads") - end - end, -}) diff --git a/techage/basic_machines/foreign_nodes.lua b/techage/basic_machines/foreign_nodes.lua deleted file mode 100644 index 9d909c7..0000000 --- a/techage/basic_machines/foreign_nodes.lua +++ /dev/null @@ -1,159 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Tube support for default chests and furnace - -]]-- - -local OwnerCache = { -} - --- Check if the chest is in the protected area of the owner -local function is_owner(pos, meta) - local owner = meta:get_string("owner") - local key = minetest.hash_node_position(pos) - -- If successfull, store info in cache - if OwnerCache[key] ~= owner then - if not minetest.is_protected(pos, owner) then - OwnerCache[key] = owner - end - end - return OwnerCache[key] == owner -end - - -techage.register_node({"default:chest", "default:chest_open"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "main" - end, - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", 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, "main", 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, "main", stack) - end, -}) - -techage.register_node({"default:chest_locked", "default:chest_locked_open"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - if is_owner(pos, meta) then - return meta:get_inventory(), "main" - end - end, - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - if is_owner(pos, meta) then - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", num) - end - 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, "main", 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, "main", stack) - end, -}) - -techage.register_node({"shop:shop"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - if is_owner(pos, meta) then - if access_type == "push" then - return meta:get_inventory(), "stock" - elseif access_type == "pull" then - return meta:get_inventory(), "register" - end - end - end, - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - if is_owner(pos, meta) then - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "register", num) - end - 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, "stock", 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, "register", stack) - end, -}) - -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() - return techage.get_items(pos, inv, "dst", num) - end, - on_push_item = function(pos, in_dir, stack) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - minetest.get_node_timer(pos):start(1.0) - if in_dir == 5 then - return techage.put_items(inv, "src", stack) - elseif minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then - return techage.put_items(inv, "fuel", stack) - else - return techage.put_items(inv, "src", stack) - end - 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, "dst", stack) - end, -}) - -techage.register_node({"mobs:beehive"}, { - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "beehive", num) - 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, "beehive", stack) - end, -}) - -techage.register_node({"xdecor:hive"}, { - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "honey", num) - 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, "honey", stack) - end, -}) diff --git a/techage/basic_machines/gravelrinser.lua b/techage/basic_machines/gravelrinser.lua deleted file mode 100644 index 4b9d3e4..0000000 --- a/techage/basic_machines/gravelrinser.lua +++ /dev/null @@ -1,341 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Gravel Rinser, washing sieved gravel to find more ores - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 4 - -local Probability = {} - -local function formspec(self, pos, nvm) - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;src;0,0;3,3;]".. - "item_image[0,0;1,1;default:gravel]".. - "image[0,0;1,1;techage_form_mask.png]".. - "image[3.5,0;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image[3.5,1;1,1;techage_form_arrow.png]".. - "image_button[3.5,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.5,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[context;dst;5,0;3,3;]".. - "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 - if listname == "src" then - CRD(pos).State:start_if_standby(pos) - return stack:get_count() - elseif listname == "dst" then - return 0 - end -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack(from_list, from_index) - return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - return stack:get_count() -end - - -local function get_water_level(pos) - local node = techage.get_node_lvm(pos) - if minetest.get_item_group(node.name, "water") > 0 then - local ndef = minetest.registered_nodes[node.name] - if ndef and ndef.liquidtype == "flowing" then - return node.param2 - end - end - return 99 -end - -local function determine_water_dir(pos) - local lvl = get_water_level(pos) - if lvl > get_water_level({x=pos.x+1, y=pos.y, z=pos.z}) then - return 2 - end - if lvl > get_water_level({x=pos.x-1, y=pos.y, z=pos.z}) then - return 4 - end - if lvl > get_water_level({x=pos.x, y=pos.y, z=pos.z+1}) then - return 1 - end - if lvl > get_water_level({x=pos.x, y=pos.y, z=pos.z-1}) then - return 3 - end - return 0 -end - -local function set_velocity(obj, pos, vel) - if obj then - obj:set_acceleration({x = 0, y = 0, z = 0}) - local p = obj:get_pos() - if p then - obj:set_pos({x=p.x, y=p.y-0.3, z=p.z}) - obj:set_velocity(vel) - end - end -end - -local function add_object(pos, name) - local dir = determine_water_dir(pos) - if dir > 0 then - local obj = minetest.add_item(pos, ItemStack(name)) - local vel = vector.multiply(tubelib2.Dir6dToVector[dir], 0.3) - minetest.after(0.3, set_velocity, obj, pos, vel) - end -end - -local function get_random_gravel_ore() - for ore, probability in pairs(Probability) do - if math.random(probability) == 1 then - return ore - end - end -end - -local function remove_objects(pos) - for _, object in pairs(minetest.get_objects_inside_radius(pos, 1)) do - local lua_entity = object:get_luaentity() - if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then - object:remove() - end - end -end - -local function washing(pos, crd, nvm, inv) - -- for testing purposes - if inv:contains_item("src", ItemStack("default:stick")) then - add_object({x=pos.x, y=pos.y+1, z=pos.z}, "default:stick") - inv:remove_item("src", ItemStack("default:stick")) - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return - end - - local src = ItemStack("techage:sieved_gravel") - local dst = ItemStack("default:sand") - if inv:contains_item("src", src) then - if not inv:room_for_item("dst", dst) then - crd.State:blocked(pos, nvm) - return - end - local ore = get_random_gravel_ore() - if ore then - add_object({x=pos.x, y=pos.y+1, z=pos.z}, ore) - end - inv:add_item("dst", dst) - inv:remove_item("src", src) - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return - else - crd.State:idle(pos, nvm) - return - end -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - washing(pos, crd, nvm, inv) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - -- up, down, right, left, back, front - "techage_appl_rinser_top.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_rinser.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_rinser.png^techage_frame_ta#.png", -} -tiles.act = { - -- up, down, right, left, back, front - { - name = "techage_appl_rinser4_top.png^techage_frame4_ta#_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - "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_rinser.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_rinser.png^techage_frame_ta#.png", -} - -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(pos, 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() - -- CRD(pos).State:start_if_standby(pos) -- would need power! - 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, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos) - remove_objects({x=pos.x, y=pos.y+1, z=pos.z}) - CRD(pos).State:on_node_load(pos) - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = - techage.register_consumer("rinser", S("Gravel Rinser"), tiles, { - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, 8/16, -6/16}, - {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, - { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - {-6/16, -8/16, -6/16, 6/16, 6/16, 6/16}, - {-6/16, 6/16, -1/16, 6/16, 8/16, 1/16}, - {-1/16, 6/16, -6/16, 1/16, 8/16, 6/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size('src', 9) - inv:set_size('dst', 9) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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,3,3,3}, - tube_sides = {L=1, R=1, U=1}, - }, - {false, true, true, false}) -- TA2/TA3 - -minetest.register_craft({ - output = node_name_ta2, - recipe = { - {"group:wood", "default:mese_crystal", "group:wood"}, - {"techage:tubeS", "techage:sieve", "techage:tubeS"}, - {"group:wood", "default:tin_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - - -techage.recipes.register_craft_type("rinsing", { - description = S("Rinsing"), - icon = "techage_appl_rinser_top.png^techage_frame_ta2_top.png", - width = 2, - height = 2, -}) - -function techage.add_rinser_recipe(recipe) - Probability[recipe.output] = recipe.probability - recipe.items = {recipe.input} - recipe.type = "rinsing" - techage.recipes.register_craft(recipe) -end - -techage.add_rinser_recipe({input="techage:sieved_gravel", output="techage:usmium_nuggets", probability=30}) -techage.add_rinser_recipe({input="techage:sieved_gravel", output="default:copper_lump", probability=15}) diff --git a/techage/basic_machines/gravelsieve.lua b/techage/basic_machines/gravelsieve.lua deleted file mode 100644 index 4bbe0ac..0000000 --- a/techage/basic_machines/gravelsieve.lua +++ /dev/null @@ -1,287 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3/TA4 Gravel Sieve, sieving gravel to find ores - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 4 - -local get_random_gravel_ore = techage.gravelsieve_get_random_gravel_ore -local get_random_basalt_ore = techage.gravelsieve_get_random_basalt_ore - - -local function formspec(self, pos, nvm) - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;src;0,0;3,3;]".. - "item_image[0,0;1,1;default:gravel]".. - "image[0,0;1,1;techage_form_mask.png]".. - "image[3.5,0;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image[3.5,1;1,1;techage_form_arrow.png]".. - "image_button[3.5,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.5,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[context;dst;5,0;3,3;]".. - "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 - if listname == "src" then - CRD(pos).State:start_if_standby(pos) - return stack:get_count() - elseif listname == "dst" then - return 0 - end -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local inv = M(pos):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 sieving(pos, crd, nvm, inv) - local src, dst - for i = 1, crd.num_items do - if inv:contains_item("src", ItemStack("techage:basalt_gravel")) then - dst, src = get_random_basalt_ore(), ItemStack("techage:basalt_gravel") - elseif inv:contains_item("src", ItemStack("default:gravel")) then - dst, src = get_random_gravel_ore(), ItemStack("default:gravel") - else - crd.State:idle(pos, nvm) - return - end - if not inv:room_for_item("dst", dst) then - crd.State:idle(pos, nvm) - return - end - inv:add_item("dst", dst) - inv:remove_item("src", src) - end - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - sieving(pos, crd, nvm, inv) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - -- up, down, right, left, back, front - "techage_appl_sieve_top.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_sieve.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_sieve.png^techage_frame_ta#.png", -} -tiles.act = { - -- up, down, right, left, back, front - { - name = "techage_appl_sieve4_top.png^techage_frame4_ta#_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - "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_sieve.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_sieve.png^techage_frame_ta#.png", -} - -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(pos, 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, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = - techage.register_consumer("gravelsieve", S("Gravel Sieve"), tiles, { - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, 8/16, -6/16}, - {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, - { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - {-6/16, -8/16, -6/16, 6/16, 4/16, 6/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size('src', 9) - inv:set_size('dst', 9) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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,2,4}, - power_consumption = {0,3,4,5}, - tube_sides = {L=1, R=1, U=1}, - }) - -minetest.register_craft({ - output = node_name_ta2, - recipe = { - {"group:wood", "default:mese_crystal", "group:wood"}, - {"techage:tubeS", "techage:sieve", "techage:tubeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta3, ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) - -techage.recipes.register_craft_type("ta2_gravelsieve", { - description = S("TA2 Gravel Sieve"), - icon = 'techage_sieve_sieve_ta1.png', - width = 1, - height = 1, -}) -techage.recipes.register_craft_type("ta3_gravelsieve", { - description = S("TA3 Gravel Sieve"), - icon = 'techage_filling_ta3.png^techage_appl_sieve.png^techage_frame_ta3.png', - width = 1, - height = 1, -}) -techage.recipes.register_craft_type("ta4_gravelsieve", { - description = S("TA4 Gravel Sieve"), - icon = 'techage_filling_ta4.png^techage_appl_sieve.png^techage_frame_ta4.png', - width = 1, - height = 1, -}) -techage.recipes.register_craft({ - output = "techage:sieved_basalt_gravel", - items = {"techage:basalt_gravel"}, - type = "ta2_gravelsieve", -}) -techage.recipes.register_craft({ - output = "techage:sieved_basalt_gravel", - items = {"techage:basalt_gravel"}, - type = "ta3_gravelsieve", -}) -techage.recipes.register_craft({ - output = "techage:sieved_basalt_gravel", - items = {"techage:basalt_gravel"}, - type = "ta4_gravelsieve", -}) diff --git a/techage/basic_machines/grinder.lua b/techage/basic_machines/grinder.lua deleted file mode 100644 index 4d390f4..0000000 --- a/techage/basic_machines/grinder.lua +++ /dev/null @@ -1,435 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3/TA4 Grinder, grinding Cobble/Basalt to Gravel - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer or {} end - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 4 - --- Grinder recipes TA1 -local RecipesTa1 = {} --- Grinder recipes TA2 - TA4 -local Recipes = {} - -local function formspec(self, pos, nvm) - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;src;0,0;3,3;]".. - "item_image[0,0;1,1;default:cobble]".. - "image[0,0;1,1;techage_form_mask.png]".. - "image[3.5,0;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image[3.5,1;1,1;techage_form_arrow.png]".. - "image_button[3.5,2;1,1;"..self:get_state_button_image(nvm)..";state_button;]".. - "tooltip[3.5,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[context;dst;5,0;3,3;]".. - "item_image[5,0;1,1;default:gravel]".. - "image[5,0;1,1;techage_form_mask.png]".. - "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 - if listname == "src" then - local state = CRD(pos).State - if state then - state:start_if_standby(pos) - end - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local inv = M(pos):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 - --- Grinder normaly handles 'num_items' per cycle. 'num_items' is node stage dependent. --- But if 'inp_num' > 1 (wheat recipes), use 'inp_num' and produce one output item. -local function src_to_dst(src_stack, idx, src_name, num_items, inp_num, inv, dst_name) - if inp_num > 1 then - local input = ItemStack(src_name) - input:set_count(inp_num) - local output = ItemStack(dst_name) - if inv:contains_item("src", input) and inv:room_for_item("dst", output) then - inv:remove_item("src", input) - inv:add_item("dst", output) - return true - end - else - local taken = src_stack:take_item(num_items) - local output = ItemStack(dst_name) - output:set_count(output:get_count() * taken:get_count()) - if inv:room_for_item("dst", output) then - inv:set_stack("src", idx, src_stack) - inv:add_item("dst", output) - return true - end - end - return false -end - -local function grinding(pos, crd, nvm, inv) - local blocked = false -- idle - for idx,stack in ipairs(inv:get_list("src")) do - if not stack:is_empty() then - local name = stack:get_name() - if Recipes[name] then - local recipe = Recipes[name] - if src_to_dst(stack, idx, name, crd.num_items, recipe.inp_num, inv, recipe.output) then - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return - else - blocked = true - end - else - crd.State:fault(pos, nvm) - return - end - end - end - if blocked then - crd.State:blocked(pos, nvm) - else - crd.State:idle(pos, nvm) - end -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - grinding(pos, crd, nvm, inv) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - -- up, down, right, left, back, front - "techage_appl_grinder.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_grinder2.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_grinder2.png^techage_frame_ta#.png", -} -tiles.act = { - -- up, down, right, left, back, front - { - name = "techage_appl_grinder4.png^techage_frame4_ta#_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 1.0, - }, - }, - "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_grinder2.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_grinder2.png^techage_frame_ta#.png", -} - -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(pos, 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() - --CRD(pos).State:start_if_standby(pos) -- would need power! - 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, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = - techage.register_consumer("grinder", S("Grinder"), tiles, { - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, 8/16, -6/16}, - {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, - { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - {-6/16, -8/16, -6/16, 6/16, 6/16, 6/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size('src', 9) - inv:set_size('dst', 9) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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,2,4}, - power_consumption = {0,4,6,9}, - tube_sides = {L=1, R=1, U=1}, - }) - -------------------------------------------------------------------------------- --- TA1 Mill (watermill) -------------------------------------------------------------------------------- -local formspecStr = "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;src;1,1;1,1;]".. - "item_image[1,1;1,1;farming:wheat]".. - "image[1,1;1,1;techage_form_mask.png]".. - "image[3.5,1;1,1;techage_form_arrow.png]".. - "list[context;dst;6,1;1,1;]".. - "item_image[6,1;1,1;farming:flour]".. - "image[6,1;1,1;techage_form_mask.png]".. - "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) - -local function node_timer(pos, elapsed) - if techage.ta1_mill_has_power(pos, 2) then - local inv = M(pos):get_inventory() - local stack = inv:get_stack("src", 1) - if not stack:is_empty() then - local name = stack:get_name() - if RecipesTa1[name] then - local recipe = RecipesTa1[name] - src_to_dst(stack, 1, name, 1, recipe.inp_num, inv, recipe.output) - end - end - end - return true -end - -minetest.register_node("techage:ta1_mill_base", { - description = S("TA1 Mill Base"), - tiles = { - "techage_mill_base.png", - "default_stone_brick.png", - }, - after_place_node = function(pos, placer) - M(pos):set_string("formspec", formspecStr) - local inv = M(pos):get_inventory() - inv:set_size('src', 1) - inv:set_size('dst', 1) - minetest.get_node_timer(pos):start(4) - end, - can_dig = can_dig, - on_timer = node_timer, - allow_metadata_inventory_put = allow_metadata_inventory_take, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2}, -}) - -techage.register_node({"techage:ta1_mill_base"}, { - on_node_load = function(pos, node) - minetest.get_node_timer(pos):start(4) - end, -}) - -minetest.register_craft({ - output = "techage:ta1_mill_base", - recipe = { - {"default:stonebrick", "", "default:stonebrick"}, - {"", "techage:iron_ingot", ""}, - {"default:stonebrick", "", "default:stonebrick"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta2, - recipe = { - {"group:wood", "default:mese_crystal", "group:wood"}, - {"techage:tubeS", "techage:hammer_steel", "techage:tubeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta3, ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) - -techage.recipes.register_craft_type("grinding", { - description = S("Grinding"), - icon = 'techage_appl_grinder.png', - width = 2, - height = 2, -}) -techage.recipes.register_craft_type("milling", { - description = S("Milling"), - icon = 'techage_mill_inv.png', - width = 2, - height = 2, -}) - -function techage.add_grinder_recipe(recipe, ta1_permitted) - local name, num = unpack(string.split(recipe.input, " ", false, 1)) - if minetest.registered_items[name] then - if ta1_permitted then - RecipesTa1[name] = {input = name,inp_num = tonumber(num) or 1, output = recipe.output} - - recipe.items = {recipe.input} - recipe.type = "milling" - techage.recipes.register_craft(table.copy(recipe)) - end - - Recipes[name] = {input = name,inp_num = tonumber(num) or 1, output = recipe.output} - - recipe.items = {recipe.input} - recipe.type = "grinding" - techage.recipes.register_craft(recipe) - end -end - - -techage.add_grinder_recipe({input="default:cobble", output="default:gravel"}) -techage.add_grinder_recipe({input="default:desert_cobble", output="default:gravel"}) -techage.add_grinder_recipe({input="default:mossycobble", output="default:gravel"}) -techage.add_grinder_recipe({input="default:gravel", output="default:sand"}) -techage.add_grinder_recipe({input="techage:sieved_gravel", output="default:sand"}) -techage.add_grinder_recipe({input="default:coral_skeleton", output="default:silver_sand"}) - -if minetest.global_exists("skytest") then - techage.add_grinder_recipe({input="default:desert_sand", output="skytest:dust"}) - techage.add_grinder_recipe({input="default:silver_sand", output="skytest:dust"}) - techage.add_grinder_recipe({input="default:sand", output="skytest:dust"}) -else - techage.add_grinder_recipe({input="default:desert_sand", output="default:clay"}) - techage.add_grinder_recipe({input="default:silver_sand", output="default:clay"}) - techage.add_grinder_recipe({input="default:sand", output="default:clay"}) -end - -techage.add_grinder_recipe({input="default:sandstone", output="default:sand 4"}) -techage.add_grinder_recipe({input="default:desert_sandstone", output="default:desert_sand 4"}) -techage.add_grinder_recipe({input="default:silver_sandstone", output="default:silver_sand 4"}) - -techage.add_grinder_recipe({input="default:tree", output="default:leaves 8"}) -techage.add_grinder_recipe({input="default:jungletree", output="default:jungleleaves 8"}) -techage.add_grinder_recipe({input="default:pine_tree", output="default:pine_needles 8"}) -techage.add_grinder_recipe({input="default:acacia_tree", output="default:acacia_leaves 8"}) -techage.add_grinder_recipe({input="default:aspen_tree", output="default:aspen_leaves 8"}) - -if minetest.global_exists("farming") then - techage.add_grinder_recipe({input="farming:wheat 3", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:seed_wheat 6", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:barley 3", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:seed_barley 6", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:rye 3", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:seed_rye 6", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:rice 3", output="farming:rice_flour"}, true) - techage.add_grinder_recipe({input="farming:seed_rice 6", output="farming:rice_flour"}, true) - techage.add_grinder_recipe({input="farming:oat 3", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:seed_oat 6", output="farming:flour"}, true) - techage.add_grinder_recipe({input="farming:seed_cotton 3", output="basic_materials:oil_extract"}, true) -end diff --git a/techage/basic_machines/itemsource.lua b/techage/basic_machines/itemsource.lua deleted file mode 100644 index cb93602..0000000 --- a/techage/basic_machines/itemsource.lua +++ /dev/null @@ -1,106 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Item Source Block -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local CYCLE_TIME = 30 - -local function formspec() - return "size[8,7.2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;3.5,0.8;1,1;]".. - "list[current_player;main;0,3.5;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -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 - - return stack:get_count() -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 - -minetest.register_node("techage:itemsource", { - description = "Techage Item Source", - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_outp.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_nodedetector.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_nodedetector.png^techage_frame_ta3.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local node = minetest.get_node(pos) - meta:set_int("push_dir", techage.side_to_outdir("R", node.param2)) - local inv = meta:get_inventory() - inv:set_size('main', 1) - minetest.get_node_timer(pos):start(CYCLE_TIME) - meta:set_string("infotext", "Techage Item Source") - meta:set_string("formspec", formspec()) - end, - - on_timer = function(pos, elapsed) - local meta = M(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack('main', 1) - if stack:get_count() > 0 then - local push_dir = meta:get_int("push_dir") - local leftover = techage.push_items(pos, push_dir, stack) - local pushed - if not leftover then - pushed = 0 - elseif leftover ~= true then - pushed = stack:get_count() - leftover:get_count() - else -- leftover == true - pushed = stack:get_count() - end - meta:set_int("counter", pushed) - meta:set_string("infotext", "Techage Item Source: "..pushed) - end - return true - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - is_ground_content = false, - drop = "", - groups = {crumbly = 3, cracky = 3, snappy = 3}, - sounds = default.node_sound_glass_defaults(), -}) - -techage.register_node({"techage:itemsource"}, { - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) diff --git a/techage/basic_machines/liquidsampler.lua b/techage/basic_machines/liquidsampler.lua deleted file mode 100644 index 1218822..0000000 --- a/techage/basic_machines/liquidsampler.lua +++ /dev/null @@ -1,228 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3 Bucket based Liquid Sampler - -]]-- - --- for lazy programmers -local M = minetest.get_meta --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local S = techage.S - -local STANDBY_TICKS = 2 -local COUNTDOWN_TICKS = 3 -local CYCLE_TIME = 8 - -local function formspec(self, pos, nvm) - return "size[9,8.5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;src;0,0;1,4;]".. - "image[0,0;1,1;bucket.png]".. - "image[1,0;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image[1,1.5;1,1;techage_form_arrow.png]".. - "image_button[1,3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[1,3;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[context;dst;2,0;7,4;]".. - "list[current_player;main;0.5,4.5;8,4;]".. - "listring[current_player;main]".. - "listring[context;src]" .. - "listring[current_player;main]".. - "listring[context;dst]" .. - "listring[current_player;main]" -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if listname == "src" then - CRD(pos).State:start_if_standby(pos) - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local inv = M(pos):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 is_water(pos) - local node = minetest.get_node(pos) - local liquiddef = bucket.liquids[node.name] - if liquiddef ~= nil and liquiddef.itemname ~= nil and node.name == liquiddef.source then - return true - end -end - -local function can_start(pos, nvm, state) - local water_pos = minetest.string_to_pos(M(pos):get_string("water_pos")) - if not is_water(water_pos) then - return S("no usable water") - end - return true -end - -local function sample_liquid(pos, crd, nvm, inv) - if inv:room_for_item("dst", {name = "bucket:bucket_water"}) and - inv:contains_item("src", {name = "bucket:bucket_empty"}) then - inv:remove_item("src", {name = "bucket:bucket_empty"}) - inv:add_item("dst", {name = "bucket:bucket_water"}) - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - else - crd.State:idle(pos, nvm) - end -end - -local function keep_running(pos, elapsed) - --if tubelib.data_not_corrupted(pos) then - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - sample_liquid(pos, crd, nvm, inv) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^{power}^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_liquidsampler.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_liquidsampler.png^techage_frame_ta#.png", -} -tiles.act = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^{power}^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", - { - name = "techage_filling4_ta#.png^techage_liquidsampler4.png^techage_frame4_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 1.0, - }, - }, - "techage_filling_ta#.png^techage_appl_liquidsampler.png^techage_frame_ta#.png", -} - -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(pos, 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 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, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, -} - -local node_name_ta2, node_name_ta3, _ = - techage.register_consumer("liquidsampler", S("Liquid Sampler"), tiles, { - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - can_start = can_start, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size("src", 4) - inv:set_size("dst", 28) - local water_pos = techage.get_pos(pos, "B") - M(pos):set_string("water_pos", minetest.pos_to_string(water_pos)) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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,2,4}, - power_consumption = {0,3,5,8}, - power_sides = {U=1}, - }, - {false, true, true, false}) -- TA2/A3 - -minetest.register_craft({ - output = node_name_ta2, - recipe = { - {"group:wood", "default:mese_crystal", "group:wood"}, - {"techage:tubeS", "bucket:bucket_empty", "techage:tubeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) diff --git a/techage/basic_machines/mods_support.lua b/techage/basic_machines/mods_support.lua deleted file mode 100644 index 1508479..0000000 --- a/techage/basic_machines/mods_support.lua +++ /dev/null @@ -1,131 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Tube support for digtron and protector chests - -]]-- - - --- for lazy programmers -local M = minetest.get_meta - -local CacheForFuelNodeNames = {} - -local function is_fuel(stack) - local name = stack:get_name() - if CacheForFuelNodeNames[name] then - return true - end - if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then - CacheForFuelNodeNames[name] = true - end - return CacheForFuelNodeNames[name] -end - ------------------------------------------------------------------------------- --- digtron ------------------------------------------------------------------------------- - -techage.register_node({"digtron:inventory"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "main" - end, - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", 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, "main", 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, "main", stack) - end, -}) - -techage.register_node({"digtron:fuelstore"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "fuel" - end, - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, 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, -}) - -techage.register_node({"digtron:combined_storage"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "main" - end, - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", num) - end, - on_push_item = function(pos, side, stack) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - minetest.get_node_timer(pos):start(1.0) - if is_fuel(stack) then - return techage.put_items(inv, "fuel", stack) - else - return techage.put_items(inv, "main", stack) - end - end, - on_unpull_item = function(pos, side, stack) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.put_items(inv, "main", stack) - end, -}) - ------------------------------------------------------------------------------- --- protector ------------------------------------------------------------------------------- - -techage.register_node({"protector:chest"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "main" - end, - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", 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, "main", 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, "main", stack) - end, -}) diff --git a/techage/basic_machines/pusher.lua b/techage/basic_machines/pusher.lua deleted file mode 100644 index 4f2c3fb..0000000 --- a/techage/basic_machines/pusher.lua +++ /dev/null @@ -1,438 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3/TA4 Pusher - Nodes for push/pull operation of StackItems from chests or other - inventory/server nodes to tubes or other inventory/server nodes. - - +--------+ - / /| - +--------+ | - IN (L) -->| |X--> OUT (R) - | PUSHER | + - | |/ - +--------+ - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end -local Tube = techage.Tube - -local STANDBY_TICKS = 2 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 2 - -local WRENCH_MENU = { - { - type = "number", - name = "limit", - label = S("Number of items"), - tooltip = S("Number of items that are allowed to be pushed"), - default = "0", - }, -} - -local function ta4_formspec(self, pos, nvm) - if CRD(pos).stage == 4 then -- TA4 node? - return "size[8,7.2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[3,-0.1;"..minetest.colorize("#000000", S("Pusher")).."]".. - techage.question_mark_help(7.5, S("Optionally configure\nthe pusher with one item")).. - techage.wrench_image(7.4, -0.05) .. - "list[context;main;3.5,0.8;1,1;]".. - "image_button[3.5,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.5,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[current_player;main;0,3.5;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" - end -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 nvm = techage.get_nvm(pos) - if CRD(pos).State:get_state(nvm) ~= techage.STOPPED then - return 0 - end - - local inv = M(pos):get_inventory() - local list = inv:get_list(listname) - if list[index]:get_count() == 0 then - stack:set_count(1) - inv:set_stack(listname, index, stack) - return 0 - end - return 0 -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 - - local nvm = techage.get_nvm(pos) - if CRD(pos).State:get_state(nvm) ~= techage.STOPPED then - return 0 - end - - local inv = M(pos):get_inventory() - inv:set_stack(listname, index, nil) - return 0 -end - -local function set_limit(pos, nvm, val) - val = tonumber(val) or 0 - if val > 0 then - nvm.limit = val - nvm.num_items = 0 - M(pos):set_int("limit", val) - else - nvm.limit = nil - nvm.num_items = nil - M(pos):set_string("limit", "") - end -end - --- Function returns the number of pushed items -local function push(pos, crd, meta, nvm, pull_dir, push_dir, num) - local items = techage.pull_items(pos, pull_dir, num, nvm.item_name) - if items ~= nil then - local taken = items:get_count() - local leftover = techage.push_items(pos, push_dir, items) - if not leftover then - -- place item back - techage.unpull_items(pos, pull_dir, items) - crd.State:blocked(pos, nvm) - return 0 - elseif leftover ~= true then - -- place item back - taken = taken - leftover:get_count() - techage.unpull_items(pos, pull_dir, leftover) - crd.State:blocked(pos, nvm) - return taken - end - return taken - end - crd.State:idle(pos, nvm) - return 0 -end - -local function pushing(pos, crd, meta, nvm) - local pull_dir = meta:get_int("pull_dir") - local push_dir = meta:get_int("push_dir") - - if not nvm.limit then - local num = nvm.item_count or nvm.num_items or crd.num_items - num = push(pos, crd, meta, nvm, pull_dir, push_dir, num) - if num > 0 then - if nvm.item_count then - nvm.item_count = nvm.item_count - num - if nvm.item_count <= 0 then - crd.State:stop(pos, nvm) - nvm.item_count = nil - end - end - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - elseif nvm.num_items < nvm.limit then - local num = math.min(crd.num_items, nvm.limit - nvm.num_items) - num = push(pos, crd, meta, nvm, pull_dir, push_dir, num) - if num > 0 then - nvm.num_items = nvm.num_items + num - if nvm.num_items >= nvm.limit then - crd.State:stop(pos, nvm) - else - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - end - end -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - pushing(pos, crd, M(pos), nvm) - crd.State:is_active(nvm) -end - -local function on_rightclick(pos, node, clicker) - if CRD(pos).stage ~= 4 then -- Not TA4 node? - local nvm = techage.get_nvm(pos) - if not minetest.is_protected(pos, clicker:get_player_name()) then - if CRD(pos).State:get_state(nvm) == techage.STOPPED then - CRD(pos).State:start(pos, nvm) - else - CRD(pos).State:stop(pos, nvm) - end - end - end -end - -local function on_receive_fields(pos, formname, fields, player) - if CRD(pos).stage == 4 then -- TA4 node? - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", ta4_formspec(CRD(pos).State, pos, nvm)) - end -end - -local function tubelib2_on_update2(pos, outdir, tlib2, node) - local pull_dir = M(pos):get_int("pull_dir") - local push_dir = M(pos):get_int("push_dir") - local is_ta4_tube = true - - for i, pos, node in Tube:get_tube_line(pos, pull_dir) do - is_ta4_tube = is_ta4_tube and techage.TA4tubes[node.name] - end - for i, pos, node in Tube:get_tube_line(pos, push_dir) do - is_ta4_tube = is_ta4_tube and techage.TA4tubes[node.name] - end - - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - if CRD(pos).stage == 4 and not is_ta4_tube then - nvm.num_items = crd.num_items / 2 - else - nvm.num_items = crd.num_items - end -end - -local function can_start(pos, nvm, state) - if CRD(pos).stage == 4 then -- TA4 node? - local inv = M(pos):get_inventory() - local name = inv:get_stack("main", 1):get_name() - if name ~= "" then - nvm.item_name = name - else - nvm.item_name = nil - end - else - nvm.item_name = nil - end - return true -end - -local function ta_after_formspec(pos, fields, playername) - local nvm = techage.get_nvm(pos) - set_limit(pos, nvm, fields.limit) -end - -local function on_state_change(pos, old_state, new_state) - if old_state == techage.STOPPED and new_state == techage.RUNNING then - local nvm = techage.get_nvm(pos) - set_limit(pos, nvm, M(pos):get_int("limit")) - end -end - -local function config_item(pos, payload) - if type(payload) == "string" then - if payload == "" then - local inv = M(pos):get_inventory() - inv:set_stack("main", 1, nil) - return 0 - else - local name, count = unpack(payload:split(" ")) - if name and (minetest.registered_nodes[name] or minetest.registered_items[name] - or minetest.registered_craftitems[name]) then - count = tonumber(count) or 1 - local inv = M(pos):get_inventory() - inv:set_stack("main", 1, {name = name, count = 1}) - return count - end - end - end - return 0 -end - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png", - "techage_filling_ta#.png^techage_frame_ta#_bottom.png^techage_appl_arrow.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_appl_pusher.png^[transformR180]^techage_frame_ta#.png", - "techage_appl_pusher.png^techage_frame_ta#.png", -} -tiles.act = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png", - "techage_filling_ta#.png^techage_frame_ta#_bottom.png^techage_appl_arrow.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", - { - name = "techage_appl_pusher14.png^[transformR180]^techage_frame14_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - { - name = "techage_appl_pusher14.png^techage_frame14_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, -} - -local tubing = { - -- push item through the pusher in opposit direction - on_push_item = function(pos, in_dir, stack) - return in_dir == M(pos):get_int("pull_dir") and techage.safe_push_items(pos, in_dir, stack) - end, - is_pusher = true, -- is a pulling/pushing node - - on_recv_message = function(pos, src, topic, payload) - if topic == "pull" then -- Deprecated command, use config/limit/start instead - local nvm = techage.get_nvm(pos) - CRD(pos).State:stop(pos, nvm) - nvm.item_count = math.min(config_item(pos, payload), 12) - nvm.rmt_num = src - CRD(pos).State:start(pos, nvm) - return true - elseif topic == "config" then -- Set item type - local nvm = techage.get_nvm(pos) - CRD(pos).State:stop(pos, nvm) - config_item(pos, payload) - return true - elseif topic == "limit" then -- Set push limit - local nvm = techage.get_nvm(pos) - CRD(pos).State:stop(pos, nvm) - set_limit(pos, nvm, payload) - return true - elseif topic == "count" then -- Get number of push items - local nvm = techage.get_nvm(pos) - return nvm.num_items or 0 - else - return CRD(pos).State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 65 then -- Set item type - local nvm = techage.get_nvm(pos) - CRD(pos).State:stop(pos, nvm) - config_item(pos, payload) - return 0 - elseif topic == 68 or topic == 20 then -- Set push limit - local nvm = techage.get_nvm(pos) - CRD(pos).State:stop(pos, nvm) - set_limit(pos, nvm, payload[1]) - return 0 - else - local nvm = techage.get_nvm(pos) - if nvm.limit then - nvm.num_items = 0 - end - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 150 then -- Get number of pushed items - local nvm = techage.get_nvm(pos) - return 0, {nvm.num_items or 0} - else - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = - techage.register_consumer("pusher", S("Pusher"), tiles, { - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = ta4_formspec, - tubing = tubing, - can_start = can_start, - on_state_change = on_state_change, - after_place_node = function(pos, placer) - local meta = M(pos) - local node = minetest.get_node(pos) - meta:set_int("pull_dir", techage.side_to_outdir("L", node.param2)) - meta:set_int("push_dir", techage.side_to_outdir("R", node.param2)) - if CRD(pos).stage == 4 then -- TA4 node? - local inv = M(pos):get_inventory() - inv:set_size('main', 1) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", ta4_formspec(CRD(pos).State, pos, nvm)) - end - end, - ta_rotate_node = function(pos, node, new_param2) - Tube:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Tube:after_place_node(pos) - local meta = M(pos) - meta:set_int("pull_dir", techage.side_to_outdir("L", new_param2)) - meta:set_int("push_dir", techage.side_to_outdir("R", new_param2)) - end, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_rightclick = on_rightclick, - on_receive_fields = on_receive_fields, - node_timer = keep_running, - on_rotate = screwdriver.disallow, - tubelib2_on_update2 = tubelib2_on_update2, - ta4_formspec = WRENCH_MENU, - ta_after_formspec = ta_after_formspec, - - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - num_items = {0,2,6,12}, - tube_sides = {L=1, R=1}, - }) - -minetest.register_craft({ - output = node_name_ta2.." 2", - recipe = { - {"group:wood", "wool:dark_green", "group:wood"}, - {"techage:tubeS", "default:mese_crystal", "techage:tubeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "techage:iron_ingot", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "techage:iron_ingot", ""}, - {"", node_name_ta3, ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) diff --git a/techage/basic_machines/quarry.lua b/techage/basic_machines/quarry.lua deleted file mode 100644 index 41df119..0000000 --- a/techage/basic_machines/quarry.lua +++ /dev/null @@ -1,457 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Quarry machine to dig stones and other ground blocks. - - The Quarry digs a hole (default) 5x5 blocks large and up to 80 blocks deep. - It starts at the given level (0 is same level as the quarry block, - 1 is one level higher and so on)) and goes down to the given depth number. - It digs one block every 4 seconds. - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local S = techage.S - -local CYCLE_TIME = 4 -local STANDBY_TICKS = 4 -local COUNTDOWN_TICKS = 4 - -local Side2Facedir = {F=0, R=1, B=2, L=3, D=4, U=5} -local Depth2Idx = {[1]=1 ,[2]=2, [3]=3, [5]=4, [7]=5, [10]=6, [15]=7, [20]=8, [25]=9, [40]=10, [60]=11, [80]=12} -local Holesize2Idx = {["3x3"] = 1, ["5x5"] = 2, ["7x7"] = 3, ["9x9"] = 4, ["11x11"] = 5} -local Holesize2Diameter = {["3x3"] = 3, ["5x5"] = 5, ["7x7"] = 7, ["9x9"] = 9, ["11x11"] = 11} -local Level2Idx = {[2]=1, [1]=2, [0]=3, [-1]=4, [-2]=5, [-3]=6, - [-5]=7, [-10]=8, [-15]=9, [-20]=10} - -local function formspec(self, pos, nvm) - local tooltip = S("Start level = 0\nmeans the same level\nas the quarry is placed") - local level_idx = Level2Idx[nvm.start_level or 1] or 2 - local depth_idx = Depth2Idx[nvm.quarry_depth or 1] or 1 - local hsize_idx = Holesize2Idx[nvm.hole_size or "5x5"] or 2 - local level = nvm.level or "-" - local hsize_list = "5x5" - if CRD(pos).stage == 4 then - hsize_list = "3x3,5x5,7x7,9x9,11x11" - elseif CRD(pos).stage == 3 then - hsize_list = "3x3,5x5,7x7" - end - local depth_list = "1,2,3,5,7,10,15,20,25,40,60,80" - if CRD(pos).stage == 3 then - depth_list = "1,2,3,5,7,10,15,20,25,40" - elseif CRD(pos).stage == 2 then - depth_list = "1,2,3,5,7,10,15,20" - end - - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[3.5,-0.1;"..minetest.colorize( "#000000", S("Quarry")).."]".. - techage.question_mark_help(8, tooltip).. - "dropdown[0,0.8;1.5;level;2,1,0,-1,-2,-3,-5,-10,-15,-20;"..level_idx.."]".. - "label[1.6,0.9;"..S("Start level").."]".. - "dropdown[0,1.8;1.5;depth;"..depth_list..";"..depth_idx.."]".. - "label[1.6,1.9;"..S("Digging depth").." ("..level..")]".. - "dropdown[0,2.8;1.5;hole_size;"..hsize_list..";"..hsize_idx.."]".. - "label[1.6,2.9;"..S("Hole size").."]".. - "list[context;main;5,0.8;3,3;]".. - "image[4,0.8;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image_button[4,2.8;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[4,2.8;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[current_player;main;0,4.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_quarry", { - pos = pos, - gain = 1.5, - max_hear_distance = 15, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function on_node_state_change(pos, old_state, new_state) - local mem = techage.get_mem(pos) - local owner = M(pos):get_string("owner") - mem.co = nil - techage.unmark_position(owner) - if new_state == techage.RUNNING then - play_sound(pos) - else - stop_sound(pos) - end -end - -local function get_pos(pos, facedir, side, steps) - facedir = (facedir + Side2Facedir[side]) % 4 - local dir = vector.multiply(minetest.facedir_to_dir(facedir), steps or 1) - return vector.add(pos, dir) -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 - return stack:get_count() -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - return stack:get_count() -end - - -local function get_quarry_pos(pos, xoffs, zoffs) - return {x = pos.x + xoffs - 1, y = pos.y, z = pos.z + zoffs - 1} -end - --- pos is the quarry pos -local function get_corner_positions(pos, facedir, hole_diameter) - local _pos = get_pos(pos, facedir, "L") - local pos1 = get_pos(_pos, facedir, "F", math.floor((hole_diameter - 1) / 2)) - local pos2 = get_pos(_pos, facedir, "B", math.floor((hole_diameter - 1) / 2)) - pos2 = get_pos(pos2, facedir, "L", hole_diameter - 1) - if pos1.x > pos2.x then pos1.x, pos2.x = pos2.x, pos1.x end - if pos1.y > pos2.y then pos1.y, pos2.y = pos2.y, pos1.y end - if pos1.z > pos2.z then pos1.z, pos2.z = pos2.z, pos1.z end - return pos1, pos2 -end - -local function is_air_level(pos1, pos2, hole_diameter) - return #minetest.find_nodes_in_area(pos1, pos2, {"air"}) == hole_diameter * hole_diameter -end - -local function mark_area(pos1, pos2, owner) - pos1.y = pos1.y + 0.2 - techage.mark_cube(owner, pos1, pos2, "quarry", "#FF0000", 20) - pos1.y = pos1.y - 0.2 -end - -local function quarry_task(pos, crd, nvm) - nvm.start_level = nvm.start_level or 0 - nvm.quarry_depth = nvm.quarry_depth or 1 - nvm.hole_diameter = nvm.hole_diameter or 5 - local y_first = pos.y + nvm.start_level - local y_last = y_first - nvm.quarry_depth + 1 - local facedir = minetest.get_node(pos).param2 - local owner = M(pos):get_string("owner") - local fake_player = techage.Fake_player:new() - fake_player.get_pos = function (...) - return pos - end - fake_player.get_inventory = function(...) - return M(pos):get_inventory() - end - - local add_to_inv = function(itemstacks) - local at_least_one_added = false - local inv = M(pos):get_inventory() - if #itemstacks == 0 then - return true - end - for _,stack in ipairs(itemstacks) do - if inv:room_for_item("main", stack) then - inv:add_item("main", stack) - at_least_one_added = true - elseif at_least_one_added then - minetest.add_item({x=pos.x,y=pos.y+1,z=pos.z}, stack) - end - end - return at_least_one_added - end - - local pos1, pos2 = get_corner_positions(pos, facedir, nvm.hole_diameter) - nvm.level = 1 - for y_curr = y_first, y_last, -1 do - pos1.y = y_curr - pos2.y = y_curr - - -- Restarting the server can detach the coroutine data. - -- Therefore, read nvm again. - nvm = techage.get_nvm(pos) - nvm.level = y_first - y_curr - - if minetest.is_area_protected(pos1, pos2, owner, 5) then - crd.State:fault(pos, nvm, S("area is protected")) - return - end - - if not is_air_level(pos1, pos2, nvm.hole_diameter) then - mark_area(pos1, pos2, owner) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - coroutine.yield() - - for zoffs = 1, nvm.hole_diameter do - for xoffs = 1, nvm.hole_diameter do - local qpos = get_quarry_pos(pos1, xoffs, zoffs) - local dig_state = techage.dig_like_player(qpos, fake_player, add_to_inv) - - if dig_state == techage.dig_states.INV_FULL then - crd.State:blocked(pos, nvm, S("inventory full")) - coroutine.yield() - elseif dig_state == techage.dig_states.DUG then - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - coroutine.yield() - end - end - end - techage.unmark_position(owner) - end - end - crd.State:stop(pos, nvm, S("finished")) -end - -local function keep_running(pos, elapsed) - local mem = techage.get_mem(pos) - if not mem.co then - mem.co = coroutine.create(quarry_task) - end - - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local _, err = coroutine.resume(mem.co, pos, crd, nvm) - if err then - minetest.log("error", "[TA4 Quarry Coroutine Error] at pos " .. minetest.pos_to_string(pos) .. " " .. err) - end - - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) - end - if nvm.techage_state ~= techage.RUNNING then - stop_sound(pos) - end -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("main") -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - - if fields.depth then - if tonumber(fields.depth) ~= nvm.quarry_depth then - nvm.quarry_depth = tonumber(fields.depth) - if CRD(pos).stage == 2 then - nvm.quarry_depth = math.min(nvm.quarry_depth, 20) - elseif CRD(pos).stage == 3 then - nvm.quarry_depth = math.min(nvm.quarry_depth, 40) - end - mem.co = nil - CRD(pos).State:stop(pos, nvm) - end - end - - if fields.level then - if tonumber(fields.level) ~= nvm.start_level then - nvm.start_level = tonumber(fields.level) - mem.co = nil - CRD(pos).State:stop(pos, nvm) - end - end - - if fields.hole_size then - if CRD(pos).stage == 4 then - if fields.hole_size ~= nvm.hole_size then - nvm.hole_size = fields.hole_size - nvm.hole_diameter = Holesize2Diameter[fields.hole_size or "5x5"] or 5 - mem.co = nil - CRD(pos).State:stop(pos, nvm) - end - elseif CRD(pos).stage == 3 then - if fields.hole_size ~= nvm.hole_size then - nvm.hole_size = fields.hole_size - nvm.hole_diameter = Holesize2Diameter[fields.hole_size or "7x7"] or 7 - mem.co = nil - CRD(pos).State:stop(pos, nvm) - end - else - nvm.hole_size = "5x5" - nvm.hole_diameter = 5 - end - end - - CRD(pos).State:state_button_event(pos, nvm, fields) -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_quarry_left.png", - "techage_filling_ta#.png^techage_appl_quarry.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_quarry.png^techage_frame_ta#.png", -} -tiles.act = { - -- 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", - { - name = "techage_frame14_ta#.png^techage_quarry_left14.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - "techage_filling_ta#.png^techage_appl_quarry.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_quarry.png^techage_frame_ta#.png", -} - -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(pos, inv, "main", 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() - --CRD(pos).State:start_if_standby(pos) -- would need power! - return techage.put_items(inv, "main", 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, "main", stack) - end - end, - on_recv_message = function(pos, src, topic, payload) - if topic == "depth" then - local nvm = techage.get_nvm(pos) - return nvm.level or 0 - else - return CRD(pos).State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 133 then -- Quarry Depth - local nvm = techage.get_nvm(pos) - return 0, {nvm.level or 0} - else - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - local nvm = techage.get_nvm(pos) - if nvm.techage_state == techage.RUNNING then - stop_sound(pos) - play_sound(pos) - end - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = - techage.register_consumer("quarry", S("Quarry"), tiles, { - drawtype = "normal", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - on_state_change = on_node_state_change, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - local nvm = techage.get_nvm(pos) - inv:set_size('main', 9) - M(pos):set_string("owner", placer:get_player_name()) - 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_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,12,14}, - } -) - -minetest.register_craft({ - output = node_name_ta2, - recipe = { - {"group:wood", "default:mese_crystal", "group:wood"}, - {"techage:tubeS", "default:pick_diamond", "techage:iron_ingot"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta2, ""}, - {"", "techage:vacuum_tube", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "default:mese_crystal", ""}, - {"", node_name_ta3, ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) diff --git a/techage/basic_machines/recipeblock.lua b/techage/basic_machines/recipeblock.lua deleted file mode 100644 index 37f39b4..0000000 --- a/techage/basic_machines/recipeblock.lua +++ /dev/null @@ -1,243 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Recipe Block for the TA4 Autocrafter -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local MAX_RECIPE = 10 - -local function recipes_formspec(x, y, idx) - return "container[" .. x .. "," .. y .. "]" .. - "background[0,0;8,3.2;techage_form_grey.png]" .. - "list[context;input;0.1,0.1;3,3;]" .. - "image[3,1.1;1,1;techage_form_arrow.png]" .. - "list[context;output;3.9,1.1;1,1;]" .. - "button[5.5,1.1;1,1;priv;<<]" .. - "button[6.5,1.1;1,1;next;>>]" .. - "label[5.5,0.5;"..S("Recipe") .. ": " .. idx .. "/" .. MAX_RECIPE .. "]" .. - "container_end[]" -end - -local function formspec(pos, nvm) - return "size[8,7.4]".. - recipes_formspec(0, 0, nvm.recipe_idx or 1) .. - "list[current_player;main;0,3.6;8,4;]" .. - "listring[current_player;main]".. - "listring[context;src]" .. - "listring[current_player;main]".. - "listring[context;dst]" .. - "listring[current_player;main]" -end - -local function determine_new_input(pos, inv) - local output = inv:get_stack("output", 1):get_name() - if output and output ~= "" then - local recipe = minetest.get_craft_recipe(output) - if recipe.items and recipe.type == "normal" then - for i = 1, 9 do - local name = recipe.items[i] - if name then - if minetest.registered_items[name] then - inv:set_stack("input", i, name) - end - end - end - inv:set_stack("output", 1, recipe.output) - end - else - for i = 1, 9 do - inv:set_stack("input", i, nil) - end - end -end - -local function determine_new_output(pos, inv) - local items = {} - for i = 1, 9 do - items[i] = inv:get_stack("input", i):get_name() - end - local input = { - method = "normal", - width = 3, - items = items, - } - local output, _ = minetest.get_craft_result(input) - inv:set_stack("output", 1, output.item) -end - -local function get_recipe(inv) - local items = {} - local last_idx = 0 - for i = 1, 9 do - local name = inv:get_stack("input", i):get_name() - if name ~= "" then - last_idx = i - end - items[i] = name - end - local input = table.concat(items, ",", 1, last_idx) - local stack = inv:get_stack("output", 1) - return { - input = input, - output = stack:get_name() .. " " .. stack:get_count() - } -end - -local function after_recipe_change(pos, inv, listname) - if listname == "input" then - determine_new_output(pos, inv) - else - determine_new_input(pos, inv) - end - local nvm = techage.get_nvm(pos) - nvm.recipes = nvm.recipes or {} - nvm.recipes[nvm.recipe_idx or 1] = get_recipe(inv) -end - -local function update_inventor(pos, inv, idx) - local nvm = techage.get_nvm(pos) - nvm.recipes = nvm.recipes or {} - local recipe = nvm.recipes[idx] - if recipe then - local items = string.split(recipe.input, ",", true) - for i = 1, 9 do - inv:set_stack("input", i, items[i] or "") - end - inv:set_stack("output", 1, recipe.output) - else - for i = 1, 9 do - inv:set_stack("input", i, nil) - end - inv:set_stack("output", 1, nil) - end -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 inv = M(pos):get_inventory() - local list = inv:get_list(listname) - stack:set_count(1) - inv:set_stack(listname, index, stack) - after_recipe_change(pos, inv, listname) - return 0 -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 - - local inv = M(pos):get_inventory() - inv:set_stack(listname, index, nil) - after_recipe_change(pos, inv, listname) - return 0 -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - - local inv = M(pos):get_inventory() - if from_list == to_list then - minetest.after(0.1, after_recipe_change, pos, inv, from_list) - return 1 - end - return 0 -end - -minetest.register_node("techage:ta4_recipeblock", { - description = S("TA4 Recipe Block"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_recipeblock.png", - }, - - on_construct = function(pos) - local inv = M(pos):get_inventory() - inv:set_size('input', 9) - inv:set_size('output', 1) - end, - - after_place_node = function(pos, placer, itemstack) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta4_chest") - M(pos):set_string("owner", placer:get_player_name()) - M(pos):set_string("node_number", number) - M(pos):set_string("formspec", formspec(pos, nvm)) - M(pos):set_string("infotext", S("TA4 Recipe Block") .. " " .. number) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - nvm.recipe_idx = nvm.recipe_idx or 1 - if fields.next == ">>" then - nvm.recipe_idx = techage.in_range(nvm.recipe_idx + 1, 1, MAX_RECIPE) - elseif fields.priv == "<<" then - nvm.recipe_idx = techage.in_range(nvm.recipe_idx - 1, 1, MAX_RECIPE) - end - local inv = M(pos):get_inventory() - update_inventor(pos, inv, nvm.recipe_idx or 1) - M(pos):set_string("formspec", formspec(pos, nvm)) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - allow_metadata_inventory_move = allow_metadata_inventory_move, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -techage.register_node({"techage:ta4_recipeblock"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "input" and payload and payload ~= "" then - nvm.recipes = nvm.recipes or {} - local recipe = nvm.recipes[tonumber(payload) or 1] - if recipe then - return recipe.input - end - else - return "unsupported" - end - end, -}) - -minetest.register_craft({ - output = "techage:ta4_recipeblock", - recipe = { - {"techage:ta4_carbon_fiber", "dye:blue", "techage:aluminum"}, - {"", "basic_materials:ic", ""}, - {"default:steel_ingot", "techage:ta4_wlanchip", "default:steel_ingot"}, - }, -}) diff --git a/techage/basic_machines/recycler.lua b/techage/basic_machines/recycler.lua deleted file mode 100644 index 1879d9e..0000000 --- a/techage/basic_machines/recycler.lua +++ /dev/null @@ -1,358 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Recycler, recycling techage machines - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 8 - -local Recipes = {} - -local SpecialItems = { - ["techage:sieved_gravel"] = "default:sand", - ["basic_materials:heating_element"] = "default:copper_ingot", - ["techage:ta4_wlanchip"] = "", - ["techage:basalt_cobble"] = "default:sand", - ["default:stone"] = "techage:sieved_gravel", - ["default:wood"] = "default:stick 5", - ["basic_materials:concrete_block"] = "techage:sieved_gravel", - ["dye:green"] = "", - ["dye:red"] = "", - ["dye:white"] = "", - ["dye:blue"] = "", - ["dye:brown"] = "", - ["dye:cyan"] = "", - ["dye:yellow"] = "", - ["dye:grey"] = "", - ["dye:orange"] = "", - ["dye:black"] = "", - ["techage:basalt_glass_thin"] = "", - ["group:stone"] = "techage:sieved_gravel", - --["basic_materials:plastic_sheet"] = "", - ["group:wood"] = "default:stick 5", - ["techage:basalt_glass"] = "", - ["default:junglewood"] = "default:stick 5", - ["techage:ta4_silicon_wafer"] = "", - ["default:cobble"] = "techage:sieved_gravel", - ["default:pick_diamond"] = "default:stick", - ["techage:hammer_steel"] = "default:stick", - ["default:paper"] = "", - ["stairs:slab_basalt_glass2"] = "", - ["techage:basalt_stone"] = "techage:sieved_gravel", - ["techage:ta4_ramchip"] = "", - ["protector:chest"] = "default:chest", - ["techage:ta4_rotor_blade"] = "", - ["techage:ta4_carbon_fiber"] = "", - ["techage:ta4_round_ceramic"] = "", - ["techage:ta4_furnace_ceramic"] = "", - ["techage:ta5_aichip"] = "", - ["techage:ta4_leds"] = "", -} - -local function formspec(self, pos, nvm) - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;src;0,0;3,3;]".. - --"item_image[0,0;1,1;default:cobble]".. - "image[0,0;1,1;techage_form_mask.png]".. - "image[3.5,0;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image[3.5,1;1,1;techage_form_arrow.png]".. - "image_button[3.5,2;1,1;"..self:get_state_button_image(nvm)..";state_button;]".. - "tooltip[3.5,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "list[context;dst;5,0;3,3;]".. - --"item_image[5,0;1,1;default:gravel]".. - "image[5,0;1,1;techage_form_mask.png]".. - "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 - if listname == "src" then - CRD(pos).State:start_if_standby(pos) - end - return stack:get_count() -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - local inv = M(pos):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 cook_reverse(stack, inv, idx, recipe) - -- check space - for _,item in ipairs(recipe.items) do - if not inv:room_for_item("dst", item) then - return false - end - end - -- take item - inv:remove_item("src", ItemStack(recipe.output)) - -- add items - for _,item in ipairs(recipe.items) do - inv:add_item("dst", item) - end - return true -end - -local function get_recipe(stack) - local name = stack:get_name() - local recipe = Recipes[name] - if recipe then - if stack:get_count() >= ItemStack(recipe.output):get_count() then - return recipe - end - end -end - -local function recycling(pos, crd, nvm, inv) - for idx,stack in ipairs(inv:get_list("src")) do - local recipe = not stack:is_empty() and get_recipe(stack) - if recipe then - if cook_reverse(stack, inv, idx, recipe) then - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - else - crd.State:blocked(pos, nvm) - end - return - end - end - crd.State:idle(pos, nvm) -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - recycling(pos, crd, nvm, inv) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - -- up, down, right, left, back, front - "techage_appl_grinder.png^[colorize:@@000000:100^techage_frame_ta#_top.png", - --"techage_appl_grinder.png^techage_frame_ta#_top.png^[multiply:#FF0000", - "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_recycler.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_recycler.png^techage_frame_ta#.png", -} -tiles.act = { - -- up, down, right, left, back, front - { - name = "techage_appl_grinder4.png^[colorize:@@000000:100^techage_frame4_ta#_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 1.0, - }, - }, - "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_recycler.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_appl_recycler.png^techage_frame_ta#.png", -} - -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(pos, 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() - --CRD(pos).State:start_if_standby(pos) -- would need power! - 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, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, -} - -local _, _, node_name_ta4 = - techage.register_consumer("recycler", S("Recycler"), tiles, { - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, 8/16, -6/16}, - {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, - { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - {-6/16, -8/16, -6/16, 6/16, 6/16, 6/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size('src', 9) - inv:set_size('dst', 9) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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,0,0,1}, - power_consumption = {0,0,0,16}, - }, - {false, false, false, true}) -- TA4 only - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "default:mese_crystal", ""}, - {"", "techage:ta4_grinder_pas", ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) - -------------------------------------------------------------------------------- --- Prepare recipes -------------------------------------------------------------------------------- --- Nodes from mods that can be recycled -local ModNames = { - techage = true, - hyperloop = true, -} - -local function get_item_list(inputs) - local lst = {} - for _,input in pairs(inputs or {}) do - if SpecialItems[input] then - input = SpecialItems[input] - end - if input and input ~= "" then - if minetest.registered_nodes[input] or minetest.registered_items[input] then - table.insert(lst, input) - end - end - end - return lst -end - -local function get_special_recipe(name) - if SpecialItems[name] then - return { - output = name, - items = {SpecialItems[name]} - } - end -end - -local function collect_recipes() - local add = function(name, ndef) - local _, _, mod, _ = string.find(name, "([%w_]+):([%w_]+)") - local recipe = get_special_recipe(name) or - techage.recipes.get_recipe(name) or - minetest.get_craft_recipe(name) - local items = get_item_list(recipe.items) - - if ModNames[mod] - and ndef.groups.not_in_creative_inventory ~= 1 - and not ndef.tool_capabilities - and recipe.output - and next(items) then - local s = table.concat(items, ", ") - --print(string.format("%-36s {%s}", recipe.output, s)) - Recipes[name] = {output = recipe.output, items = items} - end - end - - for name, ndef in pairs(minetest.registered_nodes) do - add(name, ndef) - end - for name, ndef in pairs(minetest.registered_items) do - add(name, ndef) - end -end - -minetest.after(2, collect_recipes) diff --git a/techage/basic_machines/source.lua b/techage/basic_machines/source.lua deleted file mode 100644 index 0c12fb8..0000000 --- a/techage/basic_machines/source.lua +++ /dev/null @@ -1,265 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2/TA3 Power Test Source - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Axle = techage.Axle ---local Pipe = techage.SteamPipe -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local STANDBY_TICKS = 4 -local CYCLE_TIME = 2 -local PWR_PERF = 100 - -local function formspec(self, pos, nvm) - return techage.generator_formspec(self, pos, nvm, S("Power Source"), nvm.provided, PWR_PERF) -end - --- Axles texture animation -local function switch_axles(pos, on) - local outdir = M(pos):get_int("outdir") - Axle:switch_tube_line(pos, outdir, on and "on" or "off") -end - -local function start_node2(pos, nvm, state) - nvm.running = true - nvm.provided = 0 - local outdir = M(pos):get_int("outdir") - switch_axles(pos, true) - power.start_storage_calc(pos, Axle, outdir) -end - -local function stop_node2(pos, nvm, state) - nvm.running = false - nvm.provided = 0 - nvm.load = 0 - local outdir = M(pos):get_int("outdir") - switch_axles(pos, false) - power.start_storage_calc(pos, Axle, outdir) -end - -local function start_node3(pos, nvm, state) - local meta = M(pos) - nvm.running = true - nvm.provided = 0 - techage.evaluate_charge_termination(nvm, meta) - local outdir = meta:get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local function stop_node3(pos, nvm, state) - nvm.running = false - nvm.provided = 0 - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local State2 = techage.NodeStates:new({ - node_name_passive = "techage:t2_source", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - start_node = start_node2, - stop_node = stop_node2, -}) - -local State3 = techage.NodeStates:new({ - node_name_passive = "techage:t4_source", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - start_node = start_node3, - stop_node = stop_node3, -}) - -local function node_timer2(pos, elapsed) - --print("node_timer2") - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local outdir = meta:get_int("outdir") - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Axle, outdir, PWR_PERF, tp1, tp2) - nvm.load = power.get_storage_load(pos, Axle, outdir, PWR_PERF) - if techage.is_activeformspec(pos) then - meta:set_string("formspec", formspec(State2, pos, nvm)) - end - return true -end - -local function node_timer3(pos, elapsed) - --print("node_timer4") - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local outdir = M(pos):get_int("outdir") - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Cable, outdir, PWR_PERF, tp1, tp2) - nvm.load = power.get_storage_load(pos, Cable, outdir, PWR_PERF) - if techage.is_activeformspec(pos) then - meta:set_string("formspec", formspec(State3, pos, nvm)) - end - return true -end - -local function on_receive_fields2(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State2:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State2, pos, nvm)) -end - -local function on_receive_fields3(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State3:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State3, pos, nvm)) -end - -local function on_rightclick2(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State2, pos, nvm)) -end - -local function on_rightclick3(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State3, pos, nvm)) -end - -local function after_place_node2(pos) - local nvm = techage.get_nvm(pos) - State2:node_init(pos, nvm, "") - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - M(pos):set_string("formspec", formspec(State2, pos, nvm)) - Axle:after_place_node(pos) -end - -local function after_place_node3(pos) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:t4_source") - State3:node_init(pos, nvm, number) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - M(pos):set_string("formspec", formspec(State3, pos, nvm)) - Cable:after_place_node(pos) -end - -local function after_dig_node2(pos, oldnode) - Axle:after_dig_node(pos) - techage.del_mem(pos) -end - -local function after_dig_node3(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if nvm.running then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - -minetest.register_node("techage:t2_source", { - description = S("Axle Power Source"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2_top.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_axle_clutch.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_source.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_source.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_source.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - on_receive_fields = on_receive_fields2, - on_rightclick = on_rightclick2, - on_timer = node_timer2, - after_place_node = after_place_node2, - after_dig_node = after_dig_node2, - get_generator_data = get_generator_data, -}) - -minetest.register_node("techage:t4_source", { - description = S("Ele Power Source"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_hole_electric.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_source.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_source.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_source.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - on_receive_fields = on_receive_fields3, - on_rightclick = on_rightclick3, - on_timer = node_timer3, - after_place_node = after_place_node3, - after_dig_node = after_dig_node3, - get_generator_data = get_generator_data, - ta3_formspec = techage.generator_settings("ta3", PWR_PERF), -}) - -power.register_nodes({"techage:t2_source"}, Axle, "gen", {"R"}) -power.register_nodes({"techage:t4_source"}, Cable, "gen", {"R"}) - -techage.register_node({"techage:t4_source"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "delivered" then - return nvm.provided or 0 - else - return State3:on_receive_message(pos, topic, payload) - end - end, -}) - -control.register_nodes({"techage:t4_source"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("Ele Power Source"), - number = meta:get_string("node_number") or "", - running = nvm.running or false, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = meta:get_string("termpoint"), - } - end - return false - end, - } -) diff --git a/techage/basic_machines/ta4_chest.lua b/techage/basic_machines/ta4_chest.lua deleted file mode 100644 index 5e115cb..0000000 --- a/techage/basic_machines/ta4_chest.lua +++ /dev/null @@ -1,715 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 8x2000 Chest - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta -local S = techage.S - -local DESCRIPTION = S("TA4 8x2000 Chest") -local STACK_SIZE = 2000 - -local function gen_stack(inv, idx) - inv[idx] = {name = "", count = 0} - return inv[idx] -end - -local function gen_inv(nvm) - nvm.inventory = {} - for i = 1,8 do - gen_stack(nvm.inventory, i) - end - return nvm.inventory -end - -local function repair_inv(nvm) - nvm.inventory = nvm.inventory or {} - for i = 1,8 do - local item = nvm.inventory[i] - if not item or type(item) ~= "table" - or not item.name or type(item.name) ~= "string" or item.name == "" - or not item.count or type(item.count) ~= "number" or item.count < 1 - then - gen_stack(nvm.inventory, i) - end - end -end - -local function get_stack(nvm, idx) - nvm.inventory = nvm.inventory or {} - return nvm.inventory[idx] or gen_stack(nvm.inventory, idx) -end - -local function get_count(nvm, idx) - nvm.inventory = nvm.inventory or {} - if idx and idx > 0 then - return nvm.inventory[idx] and nvm.inventory[idx].count or 0 - else - local count = 0 - for _,item in ipairs(nvm.inventory) do - count = count + item.count or 0 - end - return count - end -end - -local function get_itemstring(nvm, idx) - if idx and idx > 0 then - nvm.inventory = nvm.inventory or {} - return nvm.inventory[idx] and nvm.inventory[idx].name or "" - end - return "" -end - -local function inv_empty(nvm) - for _,item in ipairs(nvm.inventory or {}) do - if item.count and item.count > 0 then - return false - end - end - return true -end - -local function inv_state(nvm) - local num = 0 - for _,item in ipairs(nvm.inventory or {}) do - if item.count and item.count > 0 then - num = num + 1 - end - end - if num == 0 then return "empty" end - if num == 8 then return "full" end - return "loaded" -end - -local function inv_state_num(nvm) - local num = 0 - for _,item in ipairs(nvm.inventory or {}) do - if item.count and item.count > 0 then - num = num + 1 - end - end - if num == 0 then return 0 end - if num == 8 then return 2 end - return 1 -end - -local function max_stacksize(item_name) - -- It is sufficient to use minetest.registered_items as all registration - -- functions (node, craftitems, tools) add the definitions there. - local ndef = minetest.registered_items[item_name] - -- Return 1 as fallback so that slots with unknown items can be emptied. - return ndef and ndef.stack_max or 1 -end - -local function get_stacksize(pos) - local size = M(pos):get_int("stacksize") - if size == 0 then - return STACK_SIZE - end - return size -end - --- Returns a boolean that indicates if an itemstack and nvmstack can be combined. --- The second return value is a string describing the reason. --- This function guarantees not to modify any of both stacks. -local function doesItemStackMatchNvmStack(itemstack, nvmstack) - if itemstack:get_count() == 0 or nvmstack.count == 0 then - return true, "Empty stack" - end - if nvmstack.name and nvmstack.name ~= "" and nvmstack.name ~= itemstack:get_name() then - return false, "Mismatching names" - end - - -- The following seems to be the most reliable approach to compare meta. - local nvm_meta = ItemStack():get_meta() - nvm_meta:from_table(minetest.deserialize(nvmstack.meta or "")) - if not nvm_meta:equals(itemstack:get_meta()) then - return false, "Mismatching meta" - end - if (nvmstack.wear or 0) ~= itemstack:get_wear() then - return false, "Mismatching wear" - end - return true, "Stacks match" -end - - --- Generic function for adding items to the 8x2000 Chest --- This function guarantees not to modify the itemstack. --- The number of items that were added to the chest is returned. -local function add_to_chest(pos, input_stack, idx) - local nvm = techage.get_nvm(pos) - local nvm_stack = get_stack(nvm, idx) - if input_stack:get_count() == 0 then - return 0 - end - if not doesItemStackMatchNvmStack(input_stack, nvm_stack) then - return 0 - end - local count = math.min(input_stack:get_count(), get_stacksize(pos) - (nvm_stack.count or 0)) - if nvm_stack.count == 0 then - nvm_stack.name = input_stack:get_name() - nvm_stack.meta = minetest.serialize(input_stack:get_meta():to_table()) - nvm_stack.wear = input_stack:get_wear() - end - nvm_stack.count = nvm_stack.count + count - return count -end - -local function stackOrNil(stack) - if stack and stack.get_count and stack:get_count() > 0 then - return stack - end - return nil -end - --- Generic function for taking items from the 8x2000 Chest --- output_stack is directly modified; but nil can also be supplied. --- The resulting output_stack is returned from the function. --- keep_assignment indicates if the meta information for this function should be considered (manual vs. tubes). -local function take_from_chest(pos, idx, output_stack, max_total_count, keep_assignment) - local nvm = techage.get_nvm(pos) - local nvm_stack = get_stack(nvm, idx) - output_stack = output_stack or ItemStack() - local assignment_count = keep_assignment and M(pos):get_int("assignment") == 1 and 1 or 0 - local count = math.min(nvm_stack.count - assignment_count, max_stacksize(nvm_stack.name) - output_stack:get_count()) - if max_total_count then - count = math.min(count, max_total_count - output_stack:get_count()) - end - if count < 1 then - return stackOrNil(output_stack) - end - if not doesItemStackMatchNvmStack(output_stack, nvm_stack) then - return stackOrNil(output_stack) - end - output_stack:add_item(ItemStack({ - name = nvm_stack.name, - count = count, - wear = nvm_stack.wear, - })) - output_stack:get_meta():from_table(minetest.deserialize(nvm_stack.meta or "")) - nvm_stack.count = nvm_stack.count - count - if nvm_stack.count == 0 then - gen_stack(nvm.inventory or {}, idx) - end - return stackOrNil(output_stack) -end - --- Function for adding items to the 8x2000 Chest via automation, e.g. pushers -local function tube_add_to_chest(pos, input_stack) - local nvm = techage.get_nvm(pos) - nvm.inventory = nvm.inventory or {} - - for idx = 1,8 do - input_stack:take_item(add_to_chest(pos, input_stack, idx)) - end - - if input_stack:get_count() > 0 then - return input_stack -- Not all items were added to chest - else - return true -- All items were added - end -end - --- Function for taking items from the 8x2000 Chest via automation, e.g. pushers -local function tube_take_from_chest(pos, item_name, count) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - nvm.inventory = nvm.inventory or {} - mem.startpos = mem.startpos or 1 - local prio = M(pos):get_int("priority") == 1 - local startpos = prio and 8 or mem.startpos - local endpos = prio and 1 or mem.startpos + 8 - local step = prio and -1 or 1 - local itemstack = ItemStack() - for idx = startpos,endpos,step do - idx = ((idx - 1) % 8) + 1 - local nvmstack = get_stack(nvm, idx) - if not item_name or item_name == nvmstack.name then - take_from_chest(pos, idx, itemstack, count - itemstack:get_count(), true) - if itemstack:get_count() == count then - mem.startpos = idx + 1 - return itemstack - end - end - mem.startpos = idx + 1 - end - return stackOrNil(itemstack) -end - --- Function for manually adding items to the 8x2000 Chest via the formspec -local function inv_add_to_chest(pos, idx) - local inv = M(pos):get_inventory() - local inv_stack = inv:get_stack("main", idx) - local count = add_to_chest(pos, inv_stack, idx) - inv_stack:set_count(inv_stack:get_count() - count) - inv:set_stack("main", idx, inv_stack) -end - --- Function for manually taking items from the 8x2000 Chest via the formspec -local function inv_take_from_chest(pos, idx) - local inv = M(pos):get_inventory() - local inv_stack = inv:get_stack("main", idx) - if inv_stack:get_count() > 0 then - return - end - local output_stack = take_from_chest(pos, idx) - if output_stack then - inv:set_stack("main", idx, output_stack) - end -end - -local function formspec_container(x, y, nvm, inv) - local tbl = {"container["..x..","..y.."]"} - for i = 1,8 do - local xpos = i - 1 - tbl[#tbl+1] = "box["..(xpos - 0.03)..",0;0.86,0.9;#808080]" - local stack = get_stack(nvm, i) - if stack.name ~= "" then - local itemstack = ItemStack({ - name = stack.name, - count = stack.count, - wear = stack.wear, - }) - local stack_meta_table = (minetest.deserialize(stack.meta) or {}).fields or {} - for _, key in ipairs({"description", "short_description", "color", "palette_index"}) do - if stack_meta_table[key] then - itemstack:get_meta():set_string(key, stack_meta_table[key]) - end - end - local itemname = itemstack:to_string() - --tbl[#tbl+1] = "item_image["..xpos..",1;1,1;"..itemname.."]" - tbl[#tbl+1] = techage.item_image(xpos, 0, itemname, stack.count) - end - if inv:get_stack("main", i):get_count() == 0 then - tbl[#tbl+1] = "image_button["..xpos..",1;1,1;techage_form_get_arrow.png;get"..i..";]" - else - tbl[#tbl+1] = "image_button["..xpos..",1;1,1;techage_form_add_arrow.png;add"..i..";]" - end - end - tbl[#tbl+1] = "list[context;main;0,2;8,1;]" - tbl[#tbl+1] = "container_end[]" - return table.concat(tbl, "") -end - -local function formspec(pos) - local nvm = techage.get_nvm(pos) - local inv = M(pos):get_inventory() - local size = get_stacksize(pos) - local assignment = M(pos):get_int("assignment") == 1 and "true" or "false" - local priority = M(pos):get_int("priority") == 1 and "true" or "false" - return "size[8,8.3]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - formspec_container(0, 0, nvm, inv).. - "button[0,3.5;3,1;unlock;"..S("Unlock").."]".. - "tooltip[0,3.5;3,1;"..S("Unlock connected chest\nif all slots are below 2000")..";#0C3D32;#FFFFFF]".. - "label[0,3;"..S("Size")..": 8x"..size.."]".. - "checkbox[4,3;assignment;"..S("keep assignment")..";"..assignment.."]".. - "tooltip[4,3;2,0.6;"..S("Never completely empty the slots\nwith the pusher to keep the item assignment")..";#0C3D32;#FFFFFF]".. - "checkbox[4,3.6;priority;"..S("right to left")..";"..priority.."]".. - "tooltip[4,3.6;2,0.6;"..S("Empty the slots always \nfrom right to left")..";#0C3D32;#FFFFFF]".. - "list[current_player;main;0,4.6;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -local function count_number_of_chests(pos) - local node = techage.get_node_lvm(pos) - local dir = techage.side_to_outdir("B", node.param2) - local pos1 = tubelib2.get_pos(pos, dir) - local param2 = node.param2 - local cnt = 1 - while cnt < 50 do - node = techage.get_node_lvm(pos1) - if node.name ~= "techage:ta4_chest_dummy" then - break - end - local meta = M(pos1) - if meta:contains("param2") and meta:get_int("param2") ~= param2 then - break - end - pos1 = tubelib2.get_pos(pos1, dir) - cnt = cnt + 1 - end - M(pos):set_int("stacksize", STACK_SIZE * cnt) -end - -local function dummy_chest_behind(pos, node) - local dir = techage.side_to_outdir("B", node.param2) - local pos1 = tubelib2.get_pos(pos, dir) - node = techage.get_node_lvm(pos1) - return node.name == "techage:ta4_chest_dummy" -end - -local function part_of_a_chain(pos, node) - local dir = techage.side_to_outdir("F", node.param2) - local pos1 = tubelib2.get_pos(pos, dir) - node = techage.get_node_lvm(pos1) - return node.name == "techage:ta4_chest_dummy" or node.name == "techage:ta4_chest" -end - -local function search_chest_in_front(pos, node) - local dir = techage.side_to_outdir("F", node.param2) - local pos1 = tubelib2.get_pos(pos, dir) - local param2 = node.param2 - local cnt = 1 - while cnt < 50 do - node = techage.get_node_lvm(pos1) - if node.name ~= "techage:ta4_chest_dummy" then - break - end - local meta = M(pos1) - if meta:contains("param2") and meta:get_int("param2") ~= param2 then - break - end - pos1 = tubelib2.get_pos(pos1, dir) - cnt = cnt + 1 - end - if node.name == "techage:ta4_chest" and node.param2 == param2 then - minetest.after(1, count_number_of_chests, pos1) - local nvm = techage.get_nvm(pos) - nvm.front_chest_pos = pos1 - return true - end - return false -end - -local function get_front_chest_pos(pos) - local nvm = techage.get_nvm(pos) - if nvm.front_chest_pos then - return nvm.front_chest_pos - end - - local node = techage.get_node_lvm(pos) - if search_chest_in_front(pos, node) then - return nvm.front_chest_pos - end - - return pos -end - -local function convert_to_chest_again(pos, node, player) - local dir = techage.side_to_outdir("B", node.param2) - local pos1 = tubelib2.get_pos(pos, dir) - local node1 = techage.get_node_lvm(pos1) - if minetest.is_protected(pos1, player:get_player_name()) then - return - end - if node1.name == "techage:ta4_chest_dummy" then - node1.name = "techage:ta4_chest" - minetest.swap_node(pos1, node1) - --M(pos1):set_int("disabled", 1) - local nvm = techage.get_nvm(pos1) - gen_inv(nvm) - local number = techage.add_node(pos1, "techage:ta4_chest") - M(pos1):set_string("owner", player:get_player_name()) - M(pos1):set_string("formspec", formspec(pos1)) - M(pos1):set_string("infotext", DESCRIPTION.." "..number) - end -end - -local function unlock_chests(pos, player) - local nvm = techage.get_nvm(pos) - for idx = 1,8 do - if get_count(nvm, idx) > STACK_SIZE then return end - end - local node = techage.get_node_lvm(pos) - convert_to_chest_again(pos, node, player) - M(pos):set_int("stacksize", STACK_SIZE) -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 - return stack:get_count() -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 allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - return count -end - -local function on_metadata_inventory_put(pos, listname, index, stack, player) - M(pos):set_string("formspec", formspec(pos)) - techage.set_activeformspec(pos, player) -end - -local function on_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - M(pos):set_string("formspec", formspec(pos)) - techage.set_activeformspec(pos, player) -end - -local function on_metadata_inventory_take(pos, listname, index, stack, player) - M(pos):set_string("formspec", formspec(pos)) - techage.set_activeformspec(pos, player) -end - -local function on_rightclick(pos, node, clicker) - if M(pos):get_int("disabled") ~= 1 then - local nvm = techage.get_nvm(pos) - repair_inv(nvm) - M(pos):set_string("formspec", formspec(pos)) - techage.set_activeformspec(pos, clicker) - end -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - for i = 1,8 do - if fields["get"..i] ~= nil then - inv_take_from_chest(pos, i) - break - elseif fields["add"..i] ~= nil then - inv_add_to_chest(pos, i) - break - end - end - if fields.unlock then - unlock_chests(pos, player) - end - if fields.assignment then - M(pos):set_int("assignment", fields.assignment == "true" and 1 or 0) - end - if fields.priority then - M(pos):set_int("priority", fields.priority == "true" and 1 or 0) - end - - M(pos):set_string("formspec", formspec(pos)) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = minetest.get_meta(pos):get_inventory() - local nvm = techage.get_nvm(pos) - return inv:is_empty("main") and inv_empty(nvm) -end - -local function on_rotate(pos, node, user, mode, new_param2) - if get_stacksize(pos) == STACK_SIZE then - return screwdriver.rotate_simple(pos, node, user, mode, new_param2) - else - return screwdriver.disallow(pos, node, user, mode, new_param2) - end -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - convert_to_chest_again(pos, oldnode, digger) -end - -minetest.register_node("techage:ta4_chest", { - description = DESCRIPTION, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_front_ta4.png^techage_appl_warehouse.png", - }, - - on_construct = function(pos) - local inv = M(pos):get_inventory() - inv:set_size('main', 8) - end, - - after_place_node = function(pos, placer) - local node = minetest.get_node(pos) - if dummy_chest_behind(pos, node) then - minetest.remove_node(pos) - return true - end - if search_chest_in_front(pos, node) then - node.name = "techage:ta4_chest_dummy" - minetest.swap_node(pos, node) - M(pos):set_int("param2", node.param2) - else - local nvm = techage.get_nvm(pos) - gen_inv(nvm) - local number = techage.add_node(pos, "techage:ta4_chest") - M(pos):set_string("owner", placer:get_player_name()) - M(pos):set_string("formspec", formspec(pos)) - M(pos):set_string("infotext", DESCRIPTION.." "..number) - end - end, - - techage_set_numbers = function(pos, numbers, player_name) - return techage.logic.set_numbers(pos, numbers, player_name, DESCRIPTION) - end, - - on_rotate = on_rotate, - on_rightclick = on_rightclick, - on_receive_fields = on_receive_fields, - can_dig = can_dig, - after_dig_node = after_dig_node, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - on_metadata_inventory_put = on_metadata_inventory_put, - on_metadata_inventory_move = on_metadata_inventory_move, - on_metadata_inventory_take = on_metadata_inventory_take, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta4_chest_dummy", { - description = DESCRIPTION, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_front_ta4.png^techage_appl_warehouse.png", - }, - - on_rightclick = function(pos, node, clicker) - end, - paramtype2 = "facedir", - diggable = false, - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -techage.register_node({"techage:ta4_chest"}, { - on_pull_item = function(pos, in_dir, num, item_name) - local res = tube_take_from_chest(pos, item_name, num) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(pos)) - end - return res - end, - on_push_item = function(pos, in_dir, stack) - local res = tube_add_to_chest(pos, stack) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(pos)) - end - return res - end, - on_unpull_item = function(pos, in_dir, stack) - local res = tube_add_to_chest(pos, stack) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(pos)) - end - return res - end, - - on_recv_message = function(pos, src, topic, payload) - if topic == "count" then - local nvm = techage.get_nvm(pos) - return get_count(nvm, tonumber(payload or 0) or 0) - elseif topic == "itemstring" then - local nvm = techage.get_nvm(pos) - return get_itemstring(nvm, tonumber(payload or 0) or 0) - elseif topic == "storesize" then - return get_stacksize(pos) - elseif topic == "state" then - local nvm = techage.get_nvm(pos) - return inv_state(nvm) - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 140 and payload[1] == 1 then -- Inventory Item Count - local nvm = techage.get_nvm(pos) - return 0, {get_count(nvm, tonumber(payload[2] or 0) or 0)} - elseif topic == 140 and payload[1] == 2 then -- Inventory Item Name - local nvm = techage.get_nvm(pos) - return 0, get_itemstring(nvm, tonumber(payload[2] or 0) or 0) - elseif topic == 140 and payload[1] == 3 then -- storesize - return 0, {get_stacksize(pos)} - elseif topic == 131 then -- Chest State - local nvm = techage.get_nvm(pos) - return 0, {inv_state_num(nvm)} - else - return 2, "" - end - end, -}) - -techage.register_node({"techage:ta4_chest_dummy"}, { - on_pull_item = function(pos, in_dir, num, item_name) - local fc_pos = get_front_chest_pos(pos) - local res = tube_take_from_chest(fc_pos, item_name, num) - if techage.is_activeformspec(fc_pos) then - M(fc_pos):set_string("formspec", formspec(fc_pos)) - end - return res - end, - on_push_item = function(pos, in_dir, stack) - local fc_pos = get_front_chest_pos(pos) - local res = tube_add_to_chest(fc_pos, stack) - if techage.is_activeformspec(fc_pos) then - M(fc_pos):set_string("formspec", formspec(fc_pos)) - end - return res - end, - on_unpull_item = function(pos, in_dir, stack) - local fc_pos = get_front_chest_pos(pos) - local res = tube_add_to_chest(fc_pos, stack) - if techage.is_activeformspec(fc_pos) then - M(fc_pos):set_string("formspec", formspec(fc_pos)) - end - return res - end -}) - -minetest.register_lbm({ - label = "Repair Dummy Chests", - name = "techage:chest_dummy", - nodenames = {"techage:ta4_chest_dummy"}, - run_at_every_load = true, - action = function(pos, node) - if not part_of_a_chain(pos, node) then - minetest.swap_node(pos, {name = "techage:ta4_chest", param2 = node.param2}) - end - end, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:ta4_chest", - recipe = {"techage:chest_ta4"} -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:chest_ta4", - recipe = {"techage:ta4_chest"} -}) diff --git a/techage/basic_machines/ta4_injector.lua b/techage/basic_machines/ta4_injector.lua deleted file mode 100644 index e6a7eac..0000000 --- a/techage/basic_machines/ta4_injector.lua +++ /dev/null @@ -1,331 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Injector - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end -local tooltip = S("Switch to pull mode \nto pull items out of inventory slots \naccording the injector configuration") -local Tube = techage.Tube - -local STANDBY_TICKS = 2 -local COUNTDOWN_TICKS = 3 -local CYCLE_TIME = 4 - -local function formspec(self, pos, nvm) - local pull_mode = dump(nvm.pull_mode or false) - return "size[8,7.2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[3,-0.1;"..minetest.colorize("#000000", S("Injector")).."]".. - techage.question_mark_help(8, S("Configure up to 8 items \nto be pushed by the injector")).. - "list[context;filter;0,0.8;8,1;]".. - "image_button[2,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[2,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "checkbox[3.5,1.9;pull_mode;"..S("pull mode")..";"..pull_mode.."]".. - "tooltip[3.5,1.9;2,0.8;"..tooltip..";#0C3D32;#FFFFFF]".. - "list[current_player;main;0,3.5;8,4;]".. - "listring[context;filter]".. - "listring[current_player;main]" -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 nvm = techage.get_nvm(pos) - if CRD(pos).State:get_state(nvm) ~= techage.STOPPED then - return 0 - end - - local inv = M(pos):get_inventory() - local list = inv:get_list(listname) - local cdr = CRD(pos) - if list[index]:get_count() < cdr.num_items then - local num = math.min(cdr.num_items - list[index]:get_count(), stack:get_count()) + list[index]:get_count() - stack:set_count(num) - inv:set_stack(listname, index, stack) - return 0 - end - return 0 -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 - - local nvm = techage.get_nvm(pos) - if CRD(pos).State:get_state(nvm) ~= techage.STOPPED then - return 0 - end - - local inv = M(pos):get_inventory() - inv:set_stack(listname, index, nil) - return 0 -end - -local function pull_items(pos, out_dir, idx, name, num) - local inv, listname = techage.get_inv_access(pos, out_dir, "pull") - if inv and listname then - if idx and idx ~= 0 then - local stack = inv:get_stack(listname, idx) - if stack and not stack:is_empty() and stack:get_name() == name then - local taken = stack:take_item(num) - inv:set_stack(listname, idx, stack) - return (taken:get_count() > 0) and taken or nil - end - else - local taken = inv:remove_item(listname, {name = name, count = num}) - return (taken:get_count() > 0) and taken or nil - end - else - return techage.pull_items(pos, out_dir, num, name) - end -end - -local function push_items(pos, out_dir, idx, items) - local inv, listname, callafter, dpos = techage.get_inv_access(pos, out_dir, "push") - if inv and listname then - if idx and idx ~= 0 then - local stack = inv:get_stack(listname, idx) - if stack:item_fits(items) then - stack:add_item(items) - inv:set_stack(listname, idx, stack) - if callafter then - callafter(dpos) - end - return true - end - else - if inv:room_for_item(listname, items) then - inv:add_item(listname, items) - if callafter then - callafter(dpos) - end - return true - end - end - return false - else - local taken = items:get_count() - local leftover = techage.push_items(pos, out_dir, items, idx) - if not leftover or leftover == false then - return false -- No items placed - elseif leftover ~= true then - -- One or more items placed? - if leftover:get_count() < taken then - -- place the rest back - local pull_dir = M(pos):get_int("pull_dir") - techage.unpull_items(pos, pull_dir, leftover) - return true -- Some items placed - end - return false -- No items placed - end - return true -- All items placed - end -end - -local function unpull_items(pos, out_dir, idx, items) - local inv, listname = techage.get_inv_access(pos, out_dir, "unpull") - if inv and listname then - if idx and idx ~= 0 then - local stack = inv:get_stack(listname, idx) - stack:add_item(items) - inv:set_stack(listname, idx, stack) - else - inv:add_item(listname, items) - end - else - techage.unpull_items(pos, out_dir, items) - end -end - -local function pushing(pos, crd, meta, nvm) - local pull_dir = meta:get_int("pull_dir") - local push_dir = meta:get_int("push_dir") - local inv = M(pos):get_inventory() - local filter = inv:get_list("filter") - local pushed = false - local pulled = false - - for idx, item in ipairs(filter) do - local name = item:get_name() - local num = math.min(item:get_count(), crd.num_items) - if name ~= "" and num > 0 then - local items = pull_items(pos, pull_dir, nvm.pull_mode and idx, name, num) - if items ~= nil then - pulled = true - if push_items(pos, push_dir, not nvm.pull_mode and idx, items) then - pushed = true - else -- place item back - unpull_items(pos, pull_dir, nvm.pull_mode and idx, items) - pulled = false - end - end - end - end - - if not pulled then - crd.State:idle(pos, nvm) - elseif not pushed then - crd.State:blocked(pos, nvm) - else - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - pushing(pos, crd, M(pos), nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - if fields.pull_mode then - nvm.pull_mode = fields.pull_mode == "true" - end - CRD(pos).State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) -end - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG -tiles.pas = { - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_arrow.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_appl_pusher.png^[transformR180]^techage_frame_ta#.png^techage_appl_injector.png", - "techage_appl_pusher.png^techage_frame_ta#.png^techage_appl_injector.png", -} -tiles.act = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_arrow.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", - { - name = "techage_appl_pusher14.png^[transformR180]^techage_frame14_ta#.png^techage_appl_injector14.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - { - name = "techage_appl_pusher14.png^techage_frame14_ta#.png^techage_appl_injector14.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, -} - -local tubing = { - -- push item through the injector in opposit direction - on_push_item = function(pos, in_dir, stack) - return in_dir == M(pos):get_int("pull_dir") and techage.safe_push_items(pos, in_dir, stack) - end, - is_pusher = true, -- is a pulling/pushing node - - on_recv_message = function(pos, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos) - CRD(pos).State:on_node_load(pos) - end, -} - -local _, node_name_ta3, node_name_ta4 = - techage.register_consumer("injector", S("Injector"), tiles, { - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - quick_start = node_timer, - after_place_node = function(pos, placer) - local meta = M(pos) - local node = minetest.get_node(pos) - meta:set_int("pull_dir", techage.side_to_outdir("L", node.param2)) - meta:set_int("push_dir", techage.side_to_outdir("R", node.param2)) - local inv = M(pos):get_inventory() - inv:set_size('filter', 8) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - end, - ta_rotate_node = function(pos, node, new_param2) - local nvm = techage.get_nvm(pos) - if CRD(pos).State:get_state(nvm) == techage.STOPPED then - Tube:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Tube:after_place_node(pos) - local meta = M(pos) - meta:set_int("pull_dir", techage.side_to_outdir("L", new_param2)) - meta:set_int("push_dir", techage.side_to_outdir("R", new_param2)) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - end - end, - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - allow_metadata_inventory_move = function() return 0 end, - on_receive_fields = on_receive_fields, - node_timer = node_timer, - on_rotate = screwdriver.disallow, - - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - num_items = {0,0,1,4}, - }, {false, false, true, true}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "default:steel_ingot", ""}, - {"", "techage:ta3_pusher_pas", ""}, - {"", "basic_materials:ic", ""}, - }, -}) - -minetest.register_craft({ - output = node_name_ta4, - recipe = { - {"", "techage:aluminum", ""}, - {"", "techage:ta4_pusher_pas", ""}, - {"", "basic_materials:ic", ""}, - }, -}) diff --git a/techage/basic_machines/ta5_chest.lua b/techage/basic_machines/ta5_chest.lua deleted file mode 100644 index d5c7046..0000000 --- a/techage/basic_machines/ta5_chest.lua +++ /dev/null @@ -1,248 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Hyperloop Chest - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local TA4_INV_SIZE = 32 -local EX_POINTS = 15 - -local hyperloop = techage.hyperloop -local remote_pos = techage.hyperloop.remote_pos -local shared_inv = techage.shared_inv -local menu = techage.menu - -local function formspec(pos) - local ndef = minetest.registered_nodes["techage:ta5_hl_chest"] - local status = M(pos):get_string("conn_status") - if hyperloop.is_server(pos) then - local title = ndef.description .. " " .. status - return "size[8,9]".. - "box[0,-0.1;7.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. - "list[context;main;0,1;8,4;]".. - "list[current_player;main;0,5.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" - elseif hyperloop.is_client(pos) then - local title = ndef.description .. " " .. status - return "size[8,9]".. - "box[0,-0.1;7.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. - "label[0.2,2;Inventory access on this node is disabled\ndue to minetest engine issues!]" .. - "list[current_player;main;0,5.3;8,4;]" - else - return menu.generate_formspec(pos, ndef, hyperloop.SUBMENU) - end -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if techage.hyperloop.is_client(pos) then - return 0 - end - shared_inv.before_inv_access(pos, listname) - local inv = minetest.get_inventory({type="node", pos=pos}) - if inv and inv:room_for_item(listname, stack) then - return stack:get_count() - end - return 0 -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 - if techage.hyperloop.is_client(pos) then - return 0 - end - shared_inv.before_inv_access(pos, listname) - local inv = minetest.get_inventory({type="node", pos=pos}) - if inv and inv:contains_item(listname, stack) then - 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) - if shared_inv.before_inv_access(pos, "main") then - return 0 - end - if techage.hyperloop.is_client(pos) then - return 0 - end - return count -end - -minetest.register_node("techage:ta5_hl_chest", { - description = S("TA5 Hyperloop Chest"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_chest_front_ta4.png", - }, - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size('main', 32) - local number = techage.add_node(pos, "techage:ta5_hl_chest") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", formspec(pos)) - meta:set_string("infotext", S("TA5 Hyperloop Chest").." "..number) - hyperloop.after_place_node(pos, placer, "chest") - end, - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - if techage.get_expoints(player) >= EX_POINTS then - if techage.menu.eval_input(pos, hyperloop.SUBMENU, fields) then - hyperloop.after_formspec(pos, fields) - shared_inv.on_rightclick(pos, player, "main") - M(pos):set_string("formspec", formspec(pos)) - end - end - end, - on_timer = shared_inv.node_timer, - on_rightclick = function(pos, node, clicker) - shared_inv.on_rightclick(pos, clicker, "main") - M(pos):set_string("formspec", formspec(pos)) - end, - can_dig = function(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - shared_inv.before_inv_access(pos, "main") - local inv = minetest.get_meta(pos):get_inventory() - return inv:is_empty("main") - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - hyperloop.after_dig_node(pos, oldnode, oldmetadata, digger) - techage.del_mem(pos) - end, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - allow_metadata_inventory_move = allow_metadata_inventory_move, - on_metadata_inventory_put = shared_inv.after_inv_access, - on_metadata_inventory_take = shared_inv.after_inv_access, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -techage.register_node({"techage:ta5_hl_chest"}, { - on_inv_request = function(pos, in_dir, access_type) - pos = remote_pos(pos) - if pos then - local meta = minetest.get_meta(pos) - if meta then - return meta:get_inventory(), "main" - end - end - end, - on_pull_item = function(pos, in_dir, num, item_name) - pos = remote_pos(pos) - if pos then - local meta = minetest.get_meta(pos) - if meta then - local inv = meta:get_inventory() - if inv then - return techage.get_items(pos, inv, "main", num) - end - end - end - return false - end, - on_push_item = function(pos, in_dir, stack) - if techage.hyperloop.is_paired(pos) then - pos = remote_pos(pos) - if pos then - local meta = minetest.get_meta(pos) - if meta then - local inv = meta:get_inventory() - if inv then - return techage.put_items(inv, "main", stack) - end - end - end - end - return false - end, - on_unpull_item = function(pos, in_dir, stack) - pos = remote_pos(pos) - if pos then - local meta = minetest.get_meta(pos) - if meta then - local inv = meta:get_inventory() - if inv then - return techage.put_items(inv, "main", stack) - end - end - end - return false - end, - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local meta = minetest.get_meta(pos) - if meta then - local inv = meta:get_inventory() - if inv then - return techage.get_inv_state(inv, "main") - end - end - return "error" - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then -- Chest State - local meta = minetest.get_meta(pos) - if meta then - local inv = meta:get_inventory() - if inv then - return 0, {techage.get_inv_state_num(inv, "main")} - end - end - else - return 2, "" - end - end, -}) - - -minetest.register_craft({ - type = "shapeless", - output = "techage:ta5_hl_chest", - recipe = {"techage:chest_ta4", "techage:ta5_aichip"} -}) - -minetest.register_on_mods_loaded(function() - if not minetest.global_exists("hyperloop") then - minetest.clear_craft({output = "techage:ta5_hl_chest"}) - end -end) diff --git a/techage/basis/assemble.lua b/techage/basis/assemble.lua deleted file mode 100644 index 8763d2d..0000000 --- a/techage/basis/assemble.lua +++ /dev/null @@ -1,242 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Assemble routines - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -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 nvm = techage.get_nvm(pos) - nvm.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 nvm = techage.get_nvm(pos) - nvm.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] - local pos1 = dest_pos(pos, param2, path, y) - if minetest.is_protected(pos1, player_name) then - minetest.chat_send_player(player_name, S("[TA] Area is protected!")) - return false - end - - local node = techage.get_node_lvm(pos1) - local ndef = minetest.registered_nodes[node.name] - if not ndef or not ndef.buildable_to and node.name ~= node_name then - minetest.chat_send_player(player_name, S("[TA] Not enough space!")) - return false - end - end - return true -end - - --- Two important flags: --- 1) nvm.assemble_locked is true while the object is being assembled/disassembled --- 2) nvm.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 nvm = techage.get_nvm(pos) - if nvm.assemble_locked then - return - end - local node = minetest.get_node(pos) - if check_space(pos, node.param2, AssemblyPlan, player_name) then - nvm.assemble_locked = true - build(pos, node.param2, AssemblyPlan, 1) - nvm.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 nvm = techage.get_nvm(pos) - if nvm.assemble_locked then - return - end - local node = minetest.get_node(pos) - nvm.assemble_locked = true - remove(pos, node.param2, AssemblyPlan, #AssemblyPlan) - nvm.assemble_build = false -end - --------------------------------------------------------------------------------- --- Assembly functions based on nodes from node inventory --------------------------------------------------------------------------------- -local function play_sound(pos, sound) - minetest.sound_play(sound, { - pos = pos, - gain = 1, - max_hear_distance = 10, - }) -end - -local function build_inv(pos, inv, param2, AssemblyPlan, player_name, 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) - if not minetest.is_protected(pos1, player_name) then - local node = minetest.get_node(pos1) - if techage.is_air_like(node.name) then - local stack = inv:remove_item("src", ItemStack(node_name)) - if stack:get_count() == 1 then - minetest.add_node(pos1, {name=node_name, param2=(param2 + fd_offs) % 4}) - play_sound(pos, "default_place_node_hard") - local ndef = minetest.registered_nodes[node_name] - if ndef and ndef.after_place_node then - local placer = minetest.get_player_by_name(player_name) - ndef.after_place_node(pos1, placer, ItemStack(node_name)) - end - end - end - end - minetest.after(0.5, build_inv, pos, inv, param2, AssemblyPlan, player_name, idx + 1) - else - local nvm = techage.get_nvm(pos) - nvm.assemble_locked = false - end -end - -local function remove_inv(pos, inv, param2, AssemblyPlan, player_name, 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) - if not minetest.is_protected(pos1, player_name) then - local stack = ItemStack(node_name) - if inv:room_for_item("src", stack) then - local node = minetest.get_node(pos1) - if node.name == node_name then - local meta = M(pos1):to_table() - minetest.remove_node(pos1) - inv:add_item("src", stack) - play_sound(pos, "default_dig_cracky") - local ndef = minetest.registered_nodes[node_name] - if ndef and ndef.after_dig_node then - local digger = minetest.get_player_by_name(player_name) - ndef.after_dig_node(pos1, node, meta, digger) - end - end - end - end - minetest.after(0.5, remove_inv, pos, inv, param2, AssemblyPlan, player_name, idx - 1) - else - local nvm = techage.get_nvm(pos) - nvm.assemble_locked = false - end -end - -function techage.assemble.build_inv(pos, inv, AssemblyPlan, player_name) - -- check protection - if minetest.is_protected(pos, player_name) then - return - end - local nvm = techage.get_nvm(pos) - if nvm.assemble_locked then - return - end - local node = minetest.get_node(pos) - nvm.assemble_locked = true - build_inv(pos, inv, node.param2, AssemblyPlan, player_name, 1) -end - -function techage.assemble.remove_inv(pos, inv, AssemblyPlan, player_name) - -- check protection - if minetest.is_protected(pos, player_name) then - return - end - local nvm = techage.get_nvm(pos) - if nvm.assemble_locked then - return - end - local node = minetest.get_node(pos) - nvm.assemble_locked = true - remove_inv(pos, inv, node.param2, AssemblyPlan, player_name, #AssemblyPlan) -end - -function techage.assemble.count_items(AssemblyPlan) - local t = {} - for _, item in ipairs(AssemblyPlan) do - local node_name = item[4] - local ndef = minetest.registered_nodes[node_name] - local name = ndef.description - if not t[name] then - t[name] = 1 - else - t[name] = t[name] + 1 - end - end - return t -end - --- Determine the destination position based on the given route --- param2, and a route table like : {0,3} --- 0 = forward, 1 = right, 2 = backward, 3 = left --- techage.assemble.get_pos(pos, param2, route, y_offs) -techage.assemble.get_pos = dest_pos diff --git a/techage/basis/boiler_lib.lua b/techage/basis/boiler_lib.lua deleted file mode 100644 index e1202fe..0000000 --- a/techage/basis/boiler_lib.lua +++ /dev/null @@ -1,150 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Boiler common functions - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local HEAT_STEP = 10 -local MAX_WATER = 10 -local BLOCKING_TIME = 0.3 -- 300ms - -techage.boiler = {} - -local IsWater = { - ["bucket:bucket_river_water"] = "bucket:bucket_empty", -} - -local IsBucket = {} - -local function node_description(name) - name = string.split(name, " ")[1] - local ndef = minetest.registered_nodes[name] or minetest.registered_items[name] or minetest.registered_craftitems[name] - if ndef and ndef.description then - return minetest.formspec_escape(ndef.description) - end - return "" -end - -local function item_image(x, y, itemname) - return "box["..x..","..y..";0.85,0.9;#808080]".. - "item_image["..x..","..y..";1,1;"..itemname.."]" -end - -function techage.boiler.formspec(pos, nvm) - local title = S("Water Boiler") - local temp = nvm.temperature or 20 - local ratio = nvm.power_ratio or 0 - local tooltip = S("To add water punch\nthe boiler\nwith a water bucket") - return "size[5,3]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;4.8,0.5;#c6e8ff]".. - "label[1.5,-0.1;"..minetest.colorize("#000000", title).."]".. - item_image(1, 1.5, "default:water_source "..(nvm.num_water or 0)).. - "tooltip[1,1.5;1,1;"..tooltip..";#0C3D32;#FFFFFF]".. - "image[3,1.0;1,2;techage_form_temp_bg.png^[lowpart:".. - temp..":techage_form_temp_fg.png]".. - "tooltip[3,1;1,2;"..S("water temperature")..";#0C3D32;#FFFFFF]" -end - -function techage.boiler.water_temperature(pos, nvm) - nvm.temperature = nvm.temperature or 20 - nvm.num_water = nvm.num_water or 0 - nvm.water_level = nvm.water_level or 0 - if nvm.fire_trigger then - nvm.temperature = math.min(nvm.temperature + HEAT_STEP, 100) - else - nvm.temperature = math.max(nvm.temperature - HEAT_STEP, 20) - end - nvm.fire_trigger = false - - if nvm.water_level == 0 then - if nvm.num_water > 0 then - nvm.num_water = nvm.num_water - 1 - nvm.water_level = 100 - else - nvm.temperature = 20 - end - end - return nvm.temperature -end - -function techage.boiler.on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", techage.boiler.formspec(pos, nvm)) -end - -function techage.boiler.can_dig(pos, player) - local nvm = techage.get_nvm(pos) - nvm.num_water = nvm.num_water or 0 - return nvm.num_water == 0 -end - -local function space_in_inventory(wielded_item, item_count, puncher) - -- check if holding more than 1 empty container - if item_count > 1 then - local inv = puncher:get_inventory() - local item = ItemStack({name=wielded_item, count = item_count - 1}) - if inv:room_for_item("main", item) then - inv:add_item("main", item) - return true - end - return false - end - return true -end - -function techage.boiler.on_punch(pos, node, puncher, pointed_thing) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.blocking_time = mem.blocking_time or 0 - if mem.blocking_time > techage.SystemTime then - return - end - - nvm.num_water = nvm.num_water or 0 - local wielded_item = puncher:get_wielded_item():get_name() - local item_count = puncher:get_wielded_item():get_count() - if IsWater[wielded_item] and nvm.num_water < MAX_WATER then - mem.blocking_time = techage.SystemTime + BLOCKING_TIME - nvm.num_water = nvm.num_water + 1 - puncher:set_wielded_item(ItemStack(IsWater[wielded_item])) - M(pos):set_string("formspec", techage.boiler.formspec(pos, nvm)) - elseif IsBucket[wielded_item] and nvm.num_water > 0 then - if item_count > 1 then - local inv = puncher:get_inventory() - local item = ItemStack(IsBucket[wielded_item]) - if inv:room_for_item("main", item) then - inv:add_item("main", item) - puncher:set_wielded_item({name=wielded_item, count = item_count - 1}) - mem.blocking_time = techage.SystemTime + BLOCKING_TIME - nvm.num_water = nvm.num_water - 1 - end - else - mem.blocking_time = techage.SystemTime + BLOCKING_TIME - nvm.num_water = nvm.num_water - 1 - puncher:set_wielded_item(ItemStack(IsBucket[wielded_item])) - end - M(pos):set_string("formspec", techage.boiler.formspec(pos, nvm)) - end -end - -function techage.register_water_bucket(empty_bucket, full_bucket) - IsWater[full_bucket] = empty_bucket - IsBucket[empty_bucket] = full_bucket -end diff --git a/techage/basis/command.lua b/techage/basis/command.lua deleted file mode 100644 index edc8af3..0000000 --- a/techage/basis/command.lua +++ /dev/null @@ -1,691 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Basis functions for inter-node communication - -]]-- - ---- 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 -local has_mesecons = minetest.global_exists("mesecon") - -local NodeInfoCache = {} -local NumbersToBeRecycled = {} -local MP = minetest.get_modpath("techage") -local techage_use_sqlite = minetest.settings:get_bool('techage_use_sqlite', false) - --- Localize functions to avoid table lookups (better performance) -local string_split = string.split -local NodeDef = techage.NodeDef -local Tube = techage.Tube -local is_cart_available = minecart.is_nodecart_available -local techage_counting_hit = techage.counting_hit -local tubelib2_side_to_dir = tubelib2.side_to_dir - -------------------------------------------------------------------- --- Database -------------------------------------------------------------------- -local backend -if techage_use_sqlite then - backend = dofile(MP .. "/basis/numbers_sqlite.lua") -else - backend = dofile(MP .. "/basis/numbers_storage.lua") -end - -local function update_nodeinfo(number) - local pos = backend.get_nodepos(number) - if pos then - NodeInfoCache[number] = {pos = pos, name = techage.get_node_lvm(pos).name} - return NodeInfoCache[number] - end -end - -local function delete_nodeinfo_entry(number) - if number and NodeInfoCache[number] then - number = next(NodeInfoCache, number) - if number then - NodeInfoCache[number] = nil - end - else - number = next(NodeInfoCache, nil) - end - return number -end - --- Keep the cache size small by deleting entries randomly -local function keep_small(number) - number = delete_nodeinfo_entry(number) - minetest.after(10, keep_small, number) -end - -keep_small() - -minetest.after(2, backend.delete_invalid_entries, NodeDef) - -------------------------------------------------------------------- --- 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 - --- Determine position related node number for addressing purposes -local function get_number(pos, new) - local meta = minetest.get_meta(pos) - if meta:contains("node_number") then - return meta:get_string("node_number") - end - -- generate new number - if new then - local num = backend.add_nodepos(pos) - meta:set_string("node_number", num) - return num - end -end - -local function not_protected(pos, placer_name, clicker_name) - local meta = minetest.get_meta(pos) - if meta then - if placer_name and not minetest.is_protected(pos, placer_name) then - if clicker_name == nil or placer_name == clicker_name then - return true - end - if not minetest.is_protected(pos, clicker_name) then - return true - end - end - end - return false -end - -local function register_lbm(name, nodenames) - minetest.register_lbm({ - label = "[TechAge] Node update", - name = name.."update", - nodenames = nodenames, - run_at_every_load = true, - action = function(pos, node) - if NodeDef[node.name] and NodeDef[node.name].on_node_load then - NodeDef[node.name].on_node_load(pos, node) - end - end - }) -end - -local SideToDir = {B=1, R=2, F=3, L=4, D=5, U=6} - -local function side_to_dir(side, param2) - return tubelib2_side_to_dir(side, param2) -end - -techage.side_to_outdir = side_to_dir - -function techage.side_to_indir(side, param2) - return tubelib2.Turn180Deg[side_to_dir(side, param2)] -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, 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, node.name -end - -local function item_handling_node(name) - local node_def = name and NodeDef[name] - if node_def then - return node_def.on_pull_item or node_def.on_push_item or node_def.is_pusher - end -end - -local function is_air_like(name) - local ndef = minetest.registered_nodes[name] - if ndef and ndef.buildable_to then - return true - end - return false -end - -techage.SystemTime = 0 -minetest.register_globalstep(function(dtime) - techage.SystemTime = techage.SystemTime + dtime -end) - --- used by TA1 hammer: dug_node[player_name] = pos -techage.dug_node = {} -minetest.register_on_dignode(function(pos, oldnode, digger) - if not digger then return end - -- store the position of the dug block for tools like the TA1 hammer - techage.dug_node[digger:get_player_name()] = pos -end) - -------------------------------------------------------------------- --- API helper functions -------------------------------------------------------------------- - --- Check if both strings are the same or one string starts with the other string. -function techage.string_compare(s1, s2) - if s1 and s2 then - local minLength = math.min(#s1, #s2) - return string.sub(s1, 1, minLength) == string.sub(s2, 1, minLength) - end -end - --- Function returns { pos, name } for the node referenced by number -function techage.get_node_info(dest_num) - return NodeInfoCache[dest_num] or update_nodeinfo(dest_num) -end - --- Function returns the node number from the given position or --- nil, if no node number for this position is assigned. -function techage.get_node_number(pos) - return get_number(pos) -end - -function techage.get_pos(pos, side) - local node = techage.get_node_lvm(pos) - local dir = nil - if node.name ~= "air" and node.name ~= "ignore" then - dir = side_to_dir(side, node.param2) - end - return tubelib2.get_pos(pos, dir) -end - --- Function is used for available nodes with lost numbers, only. -function techage.get_new_number(pos, name) - -- store position - return get_number(pos, true) -end - --- extract ident and value from strings like "ident=value" -function techage.ident_value(s) - local ident, value = unpack(string.split(s, "=", true, 1)) - return (ident or ""):trim(), (value or ""):trim() -end - -------------------------------------------------------------------- --- Node construction/destruction functions -------------------------------------------------------------------- - --- Add node to the techage lists. --- Function determines and returns the node position number, --- needed for message communication. --- If TA2 node, return '-' instead of a real number, because --- TA2 nodes should not support number based commands. -function techage.add_node(pos, name, is_ta2) - if item_handling_node(name) then - Tube:after_place_node(pos) - end - if is_ta2 then - return "-" - end - local key = minetest.hash_node_position(pos) - local num = NumbersToBeRecycled[key] - if num then - NodeInfoCache[num] = nil - backend.set_nodepos(num, pos) - NumbersToBeRecycled[key] = nil - return num - end - return get_number(pos, true) -end - --- Function removes the node from the techage lists. -function techage.remove_node(pos, oldnode, oldmetadata) - local number = oldmetadata and oldmetadata.fields and (oldmetadata.fields.node_number or oldmetadata.fields.number) - number = number or get_number(pos) - if number and tonumber(number) then - local key = minetest.hash_node_position(pos) - NumbersToBeRecycled[key] = number - NodeInfoCache[number] = nil - end - if oldnode and item_handling_node(oldnode.name) then - Tube:after_dig_node(pos) - end -end - --- Repairs the node number after it was erased by `backend.delete_invalid_entries` -function techage.repair_number(pos) - local number = techage.get_node_number(pos) - if number then - backend.set_nodepos(number, pos) - end -end - --- Like techage.add_node, but use the old number again -function techage.unpack_node(pos, name, number) - if item_handling_node(name) then - Tube:after_place_node(pos) - end - local key = minetest.hash_node_position(pos) - NumbersToBeRecycled[key] = nil - if number then - backend.set_nodepos(number, pos) - end -end - --- Like techage.remove_node but don't store the number for this position -function techage.pack_node(pos, oldnode, number) - if number then - NodeInfoCache[number] = nil - end - if oldnode and item_handling_node(oldnode.name) then - Tube:after_dig_node(pos) - end -end - -------------------------------------------------------------------- --- Used by the assembly tool -------------------------------------------------------------------- -function techage.pre_add_node(pos, number) - local key = minetest.hash_node_position(pos) - NumbersToBeRecycled[key] = number -end - -function techage.post_remove_node(pos) - local key = minetest.hash_node_position(pos) - NumbersToBeRecycled[key] = nil -end - -------------------------------------------------------------------- --- Node register function -------------------------------------------------------------------- - --- Register node for techage communication --- Call this function only at load time! --- Param names: List of node names like {"techage:pusher_off", "techage:pusher_on"} --- Param node_definition: A table according to: --- { --- on_inv_request = func(pos, in_dir, access_type) --- on_pull_item = func(pos, in_dir, num, (opt.) item_name), --- on_push_item = func(pos, in_dir, item), --- on_unpull_item = func(pos, in_dir, item), --- on_recv_message = func(pos, src, topic, payload), --- on_node_load = func(pos), -- LBM function --- on_transfer = func(pos, in_dir, topic, payload), --- } -function techage.register_node(names, node_definition) - -- store facedir table for all known node names - 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(names) - - for _,n in ipairs(names) do - techage.KnownNodes[n] = true - end - end - -- register LBM - if node_definition.on_node_load then - register_lbm(names[1], names) - end - - -- register mvps stopper - if has_mesecons then - for _, name in ipairs(names) do - mesecon.register_mvps_stopper(name) - end - end -end - -------------------------------------------------------------------- --- Send message functions -------------------------------------------------------------------- - -function techage.not_protected(number, placer_name, clicker_name) - local ninfo = NodeInfoCache[number] or update_nodeinfo(number) - if ninfo and ninfo.pos then - return not_protected(ninfo.pos, placer_name, clicker_name) - end - return false -end - --- Check the given number value. --- Returns true if the number is valid, point to real node and --- and the node is not protected for the given player_name. -function techage.check_number(number, placer_name) - if number then - if not techage.not_protected(number, placer_name, nil) then - return false - end - return true - end - return false -end - --- Check the given list of numbers. --- Returns true if number(s) is/are valid, point to real nodes and --- and the nodes are not protected for the given player_name. -function techage.check_numbers(numbers, placer_name) - if numbers then - for _,num in ipairs(string_split(numbers, " ")) do - if not techage.not_protected(num, placer_name, nil) then - return false - end - end - return true - end - return false -end - -function techage.send_multi(src, numbers, topic, payload) - --print("send_multi", src, numbers, topic) - for _,num in ipairs(string_split(numbers, " ")) do - local ninfo = NodeInfoCache[num] or update_nodeinfo(num) - if ninfo and ninfo.name and ninfo.pos then - local ndef = NodeDef[ninfo.name] - if ndef and ndef.on_recv_message then - techage_counting_hit() - ndef.on_recv_message(ninfo.pos, src, topic, payload) - end - end - end -end - -function techage.send_single(src, number, topic, payload) - --print("send_single", src, number, topic) - local ninfo = NodeInfoCache[number] or update_nodeinfo(number) - if ninfo and ninfo.name and ninfo.pos then - local ndef = NodeDef[ninfo.name] - if ndef and ndef.on_recv_message then - techage_counting_hit() - return ndef.on_recv_message(ninfo.pos, src, topic, payload) - end - end - 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 = techage.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), outdir - end - -- check node name - local name = techage.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 - -------------------------------------------------------------------- --- Beduino functions (see "bep-005_ta_cmnd.md") -------------------------------------------------------------------- -function techage.beduino_send_cmnd(src, number, topic, payload) - --print("beduino_send_cmnd", src, number, topic) - local ninfo = NodeInfoCache[number] or update_nodeinfo(number) - if ninfo and ninfo.name and ninfo.pos then - local ndef = NodeDef[ninfo.name] - if ndef and ndef.on_beduino_receive_cmnd then - techage_counting_hit() - return ndef.on_beduino_receive_cmnd(ninfo.pos, src, topic, payload or {}) - end - end - return 1, "" -end - -function techage.beduino_request_data(src, number, topic, payload) - --print("beduino_request_data", src, number, topic) - local ninfo = NodeInfoCache[number] or update_nodeinfo(number) - if ninfo and ninfo.name and ninfo.pos then - local ndef = NodeDef[ninfo.name] - if ndef and ndef.on_beduino_request_data then - techage_counting_hit() - return ndef.on_beduino_request_data(ninfo.pos, src, topic, payload or {}) - end - end - return 1, "" -end - -------------------------------------------------------------------- --- Client side Push/Pull item functions -------------------------------------------------------------------- - -function techage.get_inv_access(pos, out_dir, access_type) - local npos, in_dir, name = get_dest_node(pos, out_dir) - if npos and NodeDef[name] and NodeDef[name].on_inv_request then - return NodeDef[name].on_inv_request(npos, in_dir, access_type) - end -end - -function techage.pull_items(pos, out_dir, num, item_name) - local npos, in_dir, name = get_dest_node(pos, out_dir) - if npos and NodeDef[name] and NodeDef[name].on_pull_item then - return NodeDef[name].on_pull_item(npos, in_dir, num, item_name) - end -end - -function techage.push_items(pos, out_dir, stack, idx) - local npos, in_dir, name = get_dest_node(pos, out_dir) - if npos and NodeDef[name] and NodeDef[name].on_push_item then - return NodeDef[name].on_push_item(npos, in_dir, stack, idx) - elseif is_air_like(name) or is_cart_available(npos) then - minetest.add_item(npos, stack) - return true - end - return stack -end - --- Check for recursion and too long distances -local start_pos -function techage.safe_push_items(pos, out_dir, stack, idx) - local mem = techage.get_mem(pos) - if not mem.pushing then - if not start_pos then - start_pos = pos - mem.pushing = true - local res = techage.push_items(pos, out_dir, stack, idx) - mem.pushing = nil - start_pos = nil - return res - else - local npos, in_dir, name = get_dest_node(pos, out_dir) - if vector.distance(start_pos, npos) < (Tube.max_tube_length or 100) then - mem.pushing = true - local res = techage.push_items(pos, out_dir, stack, idx) - mem.pushing = nil - return res - end - end - end - return stack -end - -function techage.unpull_items(pos, out_dir, stack) - local npos, in_dir, name = get_dest_node(pos, out_dir) - if npos and NodeDef[name] and NodeDef[name].on_unpull_item then - return NodeDef[name].on_unpull_item(npos, in_dir, stack) - end - return false -end - -------------------------------------------------------------------- --- Server side helper functions -------------------------------------------------------------------- - --- Get the given number of items from the inv. The position within the list --- is incremented each time so that different item stacks will be considered. --- Returns nil if ItemList is empty. -function techage.get_items(pos, inv, listname, num) - if inv:is_empty(listname) then - return nil - end - local size = inv:get_size(listname) - local mem = techage.get_mem(pos) - mem.ta_startpos = mem.ta_startpos or 0 - for idx = mem.ta_startpos, mem.ta_startpos+size do - idx = (idx % size) + 1 - local items = inv:get_stack(listname, idx) - if items:get_count() > 0 then - local taken = items:take_item(num) - inv:set_stack(listname, idx, items) - mem.ta_startpos = idx - return taken - end - end - return nil -end - --- Put the given stack into the given ItemList/inventory. --- Function returns: --- - true, if all items are moved --- - false, if no item is moved --- - leftover, if less than all items are moved --- (true/false is the legacy mode and can't be removed) -function techage.put_items(inv, listname, item, idx) - local leftover - if idx and inv and idx <= inv:get_size(listname) then - local stack = inv:get_stack(listname, idx) - leftover = stack:add_item(item) - inv:set_stack(listname, idx, stack) - elseif inv then - leftover = inv:add_item(listname, item) - else - return false - end - - local cnt = leftover:get_count() - if cnt == item:get_count() then - return false - elseif cnt == 0 then - return true - else - return leftover - end - -end - --- Return "full", "loaded", or "empty" depending --- on the inventory load. --- Full is returned, when no empty stack is available. -function techage.get_inv_state(inv, listname) - local state - if inv:is_empty(listname) then - state = "empty" - else - local list = inv:get_list(listname) - state = "full" - for _, item in ipairs(list) do - if item:is_empty() then - return "loaded" - end - end - end - return state -end - --- Beduino variant -function techage.get_inv_state_num(inv, listname) - local state - if inv:is_empty(listname) then - state = 0 - else - local list = inv:get_list(listname) - state = 2 - for _, item in ipairs(list) do - if item:is_empty() then - return 1 - end - end - end - return state -end - -minetest.register_chatcommand("ta_send", { - description = minetest.formspec_escape( - "Send a techage command to the block with the number given: /ta_send []"), - func = function(name, param) - local num, cmnd, payload = param:match('^([0-9]+)%s+(%w+)%s*(.*)$') - - if num and cmnd then - if techage.not_protected(num, name) then - local resp = techage.send_single("0", num, cmnd, payload) - if type(resp) == "string" then - return true, resp - else - return true, dump(resp) - end - else - return false, "Destination block is protected" - end - end - return false, "Syntax: /ta_send []" - end -}) - -minetest.register_chatcommand("expoints", { - privs = { - server = true - }, - func = function(name, param) - local player_name, points = param:match("^(%S+)%s*(%d*)$") - if player_name then - local player = minetest.get_player_by_name(player_name) - if player then - if points and points ~= "" then - if techage.set_expoints(player, tonumber(points)) then - return true, "The player "..player_name.." now has "..points.." experience points." - end - else - points = techage.get_expoints(player) - return true, "The player "..player_name.." has "..points.." experience points." - end - else - return false, "Unknown player "..player_name - end - end - return false, "Syntax error! Syntax: /expoints []" - end -}) - -minetest.register_chatcommand("my_expoints", { - func = function(name, param) - local player = minetest.get_player_by_name(name) - if player then - local points = techage.get_expoints(player) - if points then - return true, "You have "..points.." experience points." - end - end - end -}) diff --git a/techage/basis/conf_inv.lua b/techage/basis/conf_inv.lua deleted file mode 100644 index d738a69..0000000 --- a/techage/basis/conf_inv.lua +++ /dev/null @@ -1,118 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Configured inventory lib - Assuming the inventory has the name "conf" - Otherwise the name has to be provided as argument - -]]-- - -local StackName = ... or "conf" - --- for lazy programmers -local M = minetest.get_meta - -local inv_lib = {} - -function inv_lib.preassigned_stacks(pos, xsize, ysize) - local inv = M(pos):get_inventory() - local tbl = {} - for idx = 1, xsize * ysize do - local item_name = inv:get_stack(StackName, idx):get_name() - if item_name ~= "" then - local x = (idx - 1) % xsize - local y = math.floor((idx - 1) / xsize) - tbl[#tbl+1] = "item_image["..x..","..y..";1,1;"..item_name.."]" - end - end - return table.concat(tbl, "") -end - -function inv_lib.item_filter(pos, size) - local inv = M(pos):get_inventory() - local filter = {} - for idx = 1, size do - local item_name = inv:get_stack(StackName, idx):get_name() - if item_name == "" then item_name = "unconfigured" end - if not filter[item_name] then - filter[item_name] = {} - end - table.insert(filter[item_name], idx) - end - return filter -end - -function inv_lib.allow_conf_inv_put(pos, listname, index, stack, player) - local inv = M(pos):get_inventory() - local list = inv:get_list(listname) - - if list[index]:get_count() == 0 then - stack:set_count(1) - inv:set_stack(listname, index, stack) - return 0 - end - return 0 -end - -function inv_lib.allow_conf_inv_take(pos, listname, index, stack, player) - local inv = M(pos):get_inventory() - inv:set_stack(listname, index, nil) - return 0 -end - -function inv_lib.allow_conf_inv_move(pos, from_list, from_index, to_list, to_index, count, player) - local inv = minetest.get_meta(pos):get_inventory() - local stack = inv:get_stack(to_list, to_index) - - if stack:get_count() == 0 then - return 1 - else - return 0 - end -end - -function inv_lib.put_items(pos, inv, listname, item, stacks, idx) - local name = item:get_name() - local count = item:get_count() - for _, i in ipairs(stacks or {}) do - if not idx or idx == i then - local stack = inv:get_stack(listname, i) - local leftover = stack:add_item({name = name, count = count}) - count = leftover:get_count() - inv:set_stack(listname, i, stack) - if count == 0 then - return true - end - end - end - if count > 0 then - return ItemStack({name = name, count = count}) - end - return false -end - -function inv_lib.take_item(pos, inv, listname, num, stacks) - local mem = techage.get_mem(pos) - mem.ta_startpos = mem.ta_startpos or 1 - local size = #(stacks or {}) - for i = 1, size do - local idx = stacks[((i + mem.ta_startpos) % size) + 1] - local stack = inv:get_stack(listname, idx) - local taken = stack:take_item(num) - if taken:get_count() > 0 then - inv:set_stack(listname, idx, stack) - mem.ta_startpos = mem.ta_startpos + i - return taken - end - end -end - - -return inv_lib diff --git a/techage/basis/counting.lua b/techage/basis/counting.lua deleted file mode 100644 index dd00a5e..0000000 --- a/techage/basis/counting.lua +++ /dev/null @@ -1,71 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Count techage commands player related - -]]-- - -local PlayerName -local PlayerPoints = {} -local LastPlayerPoints = {} -local S = techage.S - -local MAX_POINTS = tonumber(minetest.settings:get("techage_command_limit")) or 1200 - -function techage.counting_start(player_name) - PlayerName = player_name - PlayerPoints[PlayerName] = PlayerPoints[PlayerName] or 0 -end - -function techage.counting_stop() - PlayerName = nil -end - -function techage.counting_hit() - if PlayerName then - PlayerPoints[PlayerName] = PlayerPoints[PlayerName] + 1 - end -end - -function techage.counting_add(player_name, points) - PlayerPoints[player_name] = (PlayerPoints[player_name] or 0) + points -end - -local function output() - for name, val in pairs(PlayerPoints) do - if val > MAX_POINTS then - local obj = minetest.get_player_by_name(name) - if obj then - minetest.chat_send_player(name, - S("[techage] The limit for 'number of commands per minute' has been exceeded.") .. - " " .. string.format(MAX_POINTS .. " " .. S("is allowed. Current value is") .. " " .. val)); - minetest.log("action", "[techage] " .. name .. - " exceeds the limit for commands per minute. value = " .. val) - local factor = 100 / (obj:get_armor_groups().fleshy or 100) - obj:punch(obj, 1.0, {full_punch_interval=1.0, damage_groups = {fleshy=factor * 5}}) - end - end - end - LastPlayerPoints = table.copy(PlayerPoints) - PlayerPoints = {} - minetest.after(60, output) -end - -minetest.after(60, output) - - -minetest.register_chatcommand("ta_limit", { - description = "Get your current techage command limit value", - func = function(name) - local num = LastPlayerPoints[name] or 0 - return true, S("Your current value is") .. " " .. num .. " " .. S("per minute") .. ". " .. - MAX_POINTS .. " " .. S("is allowed") - end -}) diff --git a/techage/basis/fake_player.lua b/techage/basis/fake_player.lua deleted file mode 100644 index 3526762..0000000 --- a/techage/basis/fake_player.lua +++ /dev/null @@ -1,117 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - Copyright (C) 2020 Thomas S. - - AGPL v3 - See LICENSE.txt for more information - - Fake Player - -]]-- - --- Map method names to their return values -local methods = { - get_pos = { x = 0, y = 0, z = 0 }, - set_pos = nil, - moveto = nil, - punch = nil, - right_click = nil, - get_hp = 20, - set_hp = nil, - get_inventory = nil, - get_wield_list = "", - get_wield_index = 0, - get_wielded_item = ItemStack(), - set_wielded_item = true, - set_armor_groups = nil, - get_armor_groups = {}, - set_animation = nil, - get_animation = {}, - set_animation_frame_speed = nil, - set_attach = nil, - get_attach = nil, - set_detach = nil, - get_bone_position = {}, - set_properties = nil, - get_properties = {}, - is_player = false, - get_nametag_attributes = {}, - set_nametag_attributes = nil, - get_player_name = "", - get_player_velocity = nil, - add_player_velocity = nil, - get_look_dir = vector.new(0, 0, 1), - get_look_vertical = 0, - get_look_horizontal = 0, - set_look_vertical = nil, - set_look_horizontal = nil, - get_look_pitch = 0, - get_look_yaw = 0, - set_look_pitch = nil, - set_look_yaw = nil, - get_breath = 10, - set_breath = nil, - set_fov = nil, - get_fov = 0, - set_attribute = nil, - get_attribute = nil, - get_meta = nil, - set_inventory_formspec = nil, - get_inventory_formspec = "", - set_formspec_prepend = nil, - get_formspec_prepend = "", - get_player_control = {}, - get_player_control_bits = 0, - set_physics_override = nil, - get_physics_override = {}, - hud_add = 0, - hud_remove = nil, - hud_change = nil, - hud_get = {}, - hud_set_flags = nil, - hud_get_flags = {}, - hud_set_hotbar_itemcount = nil, - hud_get_hotbar_itemcount = 8, - hud_set_hotbar_image = nil, - hud_get_hotbar_image = "", - hud_set_hotbar_selected_image = nil, - hud_get_hotbar_selected_image = "", - set_sky = nil, - get_sky = {}, - get_sky_color = {}, - set_sun = nil, - get_sun = {}, - set_moon = nil, - get_moon = {}, - set_stars = nil, - get_stars = {}, - set_clouds = nil, - get_clouds = {}, - override_day_night_ratio = nil, - get_day_night_ratio = nil, - set_local_animation = nil, - get_local_animation = {}, - set_eye_offset = nil, - get_eye_offset = {}, - send_mapblock = nil, -} - -techage.Fake_player = {} -techage.Fake_player.__index = techage.Fake_player - -function techage.Fake_player:new() - local fake_player = {} - setmetatable(fake_player, techage.Fake_player) - return fake_player -end - - -for method_name, return_value in pairs(methods) do - techage.Fake_player[method_name] = function(self, ...) - return return_value - end -end diff --git a/techage/basis/firebox_lib.lua b/techage/basis/firebox_lib.lua deleted file mode 100644 index 8d8e5e7..0000000 --- a/techage/basis/firebox_lib.lua +++ /dev/null @@ -1,150 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Firebox basic functions - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -techage.firebox = {} - -techage.firebox.Burntime = { - ["techage:charcoal"] = 1, -- will be replaced by burntime - ["default:coal_lump"] = 1, - ["default:coalblock"] = 1, - ["techage:oil_source"] = 1, - ["techage:gas"] = 1, - ["techage:gasoline"] = 1, - ["techage:naphtha"] = 1, - ["techage:fueloil"] = 1, -} - -techage.firebox.ValidOilFuels = { - ["techage:gasoline"] = 1, -- category - ["techage:naphtha"] = 2, - ["techage:fueloil"] = 3, - ["techage:oil_source"] = 4, -} - - -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 - end -end -minetest.register_on_mods_loaded(determine_burntimes) - -function techage.firebox.formspec(nvm) - local fuel_percent = 0 - if nvm.running then - fuel_percent = ((nvm.burn_cycles or 1) * 100) / (nvm.burn_cycles_total or 1) - end - return "size[8,6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[3,-0.1;"..minetest.colorize( "#000000", S("Firebox")).."]".. - "list[current_name;fuel;3,1;1,1;]".. - "image[4,1;1,1;default_furnace_fire_bg.png^[lowpart:".. - fuel_percent..":default_furnace_fire_fg.png]".. - "list[current_player;main;0,2.3;8,4;]".. - "listring[current_name;fuel]".. - "listring[current_player;main]".. - default.get_hotbar_bg(0, 2.3) -end - -function techage.firebox.can_dig(pos, player) - local inv = M(pos):get_inventory() - return inv:is_empty("fuel") -end - -function techage.firebox.allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if techage.firebox.Burntime[stack:get_name()] then - return stack:get_count() - end - return 0 -end - -function techage.firebox.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 - -function techage.firebox.on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", techage.firebox.formspec(nvm)) -end - -function techage.firebox.swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -function techage.firebox.get_fuel(pos) - local inv = M(pos):get_inventory() - local items = inv:get_stack("fuel", 1) - if items:get_count() > 0 then - local taken = items:take_item(1) - inv:set_stack("fuel", 1, items) - return taken - end -end - -function techage.firebox.has_fuel(pos) - local inv = M(pos):get_inventory() - local items = inv:get_stack("fuel", 1) - return items:get_count() > 0 -end - -function techage.firebox.is_free_position(pos, player_name) - local pos2 = techage.get_pos(pos, 'F') - if minetest.is_protected(pos2, player_name) then - minetest.chat_send_player(player_name, S("[TA] Area is protected!")) - return false - end - local node = techage.get_node_lvm(pos2) - local ndef = minetest.registered_nodes[node.name] - if not ndef or not ndef.buildable_to then - minetest.chat_send_player(player_name, S("[TA] Not enough space!")) - return false - end - return true -end - -function techage.firebox.set_firehole(pos, on) - local param2 = techage.get_node_lvm(pos).param2 - local pos2 = techage.get_pos(pos, 'F') - if on == true then - minetest.swap_node(pos2, {name="techage:coalfirehole_on", param2 = param2}) - elseif on == false then - minetest.swap_node(pos2, {name="techage:coalfirehole", param2 = param2}) - else - local node = techage.get_node_lvm(pos2) - if node.name == "techage:coalfirehole" or node.name == "techage:coalfirehole_on" then - minetest.swap_node(pos2, {name="air"}) - end - end -end diff --git a/techage/basis/fly_lib.lua b/techage/basis/fly_lib.lua deleted file mode 100644 index b3babb6..0000000 --- a/techage/basis/fly_lib.lua +++ /dev/null @@ -1,955 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Block fly/move library - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local S = techage.S - -local flylib = {} - -local function lvect_add_vec(lvect1, offs) - if not lvect1 or not offs then return end - - local lvect2 = {} - for _, v in ipairs(lvect1) do - lvect2[#lvect2 + 1] = vector.add(v, offs) - end - return lvect2 -end - --- yaw in radiant -local function rotate(v, yaw) - local sinyaw = math.sin(yaw) - local cosyaw = math.cos(yaw) - return {x = v.x * cosyaw - v.z * sinyaw, y = v.y, z = v.x * sinyaw + v.z * cosyaw} -end - --- playername is needed for carts, to attach the player to the cart entity -local function set_node(item, playername) - local dest_pos = item.dest_pos - local name = item.name or "air" - local param2 = item.param2 or 0 - local nvm = techage.get_nvm(item.base_pos) - local node = techage.get_node_lvm(dest_pos) - local ndef1 = minetest.registered_nodes[name] - local ndef2 = minetest.registered_nodes[node.name] - - nvm.running = false - M(item.base_pos):set_string("status", S("Stopped")) - if ndef1 and ndef2 then - if minecart.is_cart(name) and (minecart.is_rail(dest_pos, node.name) or minecart.is_cart(name)) then - local player = playername and minetest.get_player_by_name(playername) - minecart.place_and_start_cart(dest_pos, {name = name, param2 = param2}, item.cartdef, player) - return - elseif ndef2.buildable_to then - local meta = M(dest_pos) - if name ~= "techage:moveblock" then - minetest.set_node(dest_pos, {name=name, param2=param2}) - meta:from_table(item.metadata or {}) - meta:set_string("ta_move_block", "") - meta:set_int("ta_door_locked", 1) - end - return - end - local meta = M(dest_pos) - if not meta:contains("ta_move_block") then - meta:set_string("ta_move_block", minetest.serialize({name=name, param2=param2})) - return - end - elseif ndef1 then - if name ~= "techage:moveblock" then - minetest.add_item(dest_pos, ItemStack(name)) - end - end -end - -------------------------------------------------------------------------------- --- Entity monitoring -------------------------------------------------------------------------------- -local queue = {} -local first = 0 -local last = -1 - -local function push(item) - last = last + 1 - queue[last] = item -end - -local function pop() - if first > last then return end - local item = queue[first] - queue[first] = nil -- to allow garbage collection - first = first + 1 - return item -end - -local function monitoring() - local num = last - first + 1 - for _ = 1, num do - local item = pop() - if item.ttl >= techage.SystemTime then - -- still valud - push(item) - elseif item.ttl ~= 0 then - set_node(item) - end - end - minetest.after(1, monitoring) -end -minetest.after(1, monitoring) - -minetest.register_on_shutdown(function() - local num = last - first + 1 - for _ = 1, num do - local item = pop() - if item.ttl ~= 0 then - set_node(item) - end - end -end) - -local function monitoring_add_entity(item) - item.ttl = techage.SystemTime + 1 - push(item) -end - -local function monitoring_del_entity(item) - -- Mark as timed out - item.ttl = 0 -end - -local function monitoring_trigger_entity(item) - item.ttl = techage.SystemTime + 1 -end - -------------------------------------------------------------------------------- --- to_path function for the fly/move path -------------------------------------------------------------------------------- - -local function strsplit(text) - text = text:gsub("\r\n", "\n") - text = text:gsub("\r", "\n") - return string.split(text, "\n", true) -end - -local function trim(s) - return (s:gsub("^%s*(.-)%s*$", "%1")) -end - -function flylib.distance(v) - return math.abs(v.x) + math.abs(v.y) + math.abs(v.z) -end - -function flylib.to_vector(s, max_dist) - local x,y,z = unpack(string.split(s, ",")) - x = tonumber(x) or 0 - y = tonumber(y) or 0 - z = tonumber(z) or 0 - if x and y and z then - if not max_dist or (math.abs(x) + math.abs(y) + math.abs(z)) <= max_dist then - return {x = x, y = y, z = z} - end - end -end - -function flylib.to_path(s, max_dist) - local tPath - local dist = 0 - - for _, line in ipairs(strsplit(s or "")) do - line = trim(line) - line = string.split(line, "--", true, 1)[1] or "" - if line ~= "" then - local v = flylib.to_vector(line) - if v then - dist = dist + flylib.distance(v) - if not max_dist or dist <= max_dist then - tPath = tPath or {} - tPath[#tPath + 1] = v - else - return tPath, S("Error: Max. length of the flight route exceeded by @1 blocks !!", dist - max_dist) - end - else - return tPath, S("Error: Invalid path !!") - end - end - end - return tPath -end - -local function next_path_pos(pos, lpath, idx) - local offs = lpath[idx] - if offs then - return vector.add(pos, offs) - end -end - -local function reverse_path(lpath) - local lres = {} - for i = #lpath, 1, -1 do - lres[#lres + 1] = vector.multiply(lpath[i], -1) - end - return lres -end - -local function dest_offset(lpath) - local offs = {x=0, y=0, z=0} - for i = 1,#lpath do - offs = vector.add(offs, lpath[i]) - end - return offs -end - -------------------------------------------------------------------------------- --- Protect the doors from being opened by hand -------------------------------------------------------------------------------- -local function new_on_rightclick(old_on_rightclick) - return function(pos, node, clicker, itemstack, pointed_thing) - if M(pos):contains("ta_door_locked") then - return itemstack - end - if old_on_rightclick then - return old_on_rightclick(pos, node, clicker, itemstack, pointed_thing) - else - return itemstack - end - end -end - -function flylib.protect_door_from_being_opened(name) - -- Change on_rightclick function. - local ndef = minetest.registered_nodes[name] - if ndef then - local old_on_rightclick = ndef.on_rightclick - minetest.override_item(ndef.name, { - on_rightclick = new_on_rightclick(old_on_rightclick) - }) - end -end - -------------------------------------------------------------------------------- --- Entity / Move / Attach / Detach -------------------------------------------------------------------------------- -local MIN_SPEED = 0.4 -local MAX_SPEED = 8 -local CORNER_SPEED = 4 - -local function calc_speed(v) - return math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z) -end - --- Only the ID ist stored, not the object -local function get_object_id(object) - for id, entity in pairs(minetest.luaentities) do - if entity.object == object then - return id - end - end -end - --- determine exact position of attached entities -local function obj_pos(obj) - local _, _, pos = obj:get_attach() - if pos then - pos = vector.divide(pos, 29) - return vector.add(obj:get_pos(), pos) - end -end - --- Check access conflicts with other mods -local function lock_player(player) - local meta = player:get_meta() - if meta:get_int("player_physics_locked") == 0 then - meta:set_int("player_physics_locked", 1) - meta:set_string("player_physics_locked_by", "ta_flylib") - return true - end - return false -end - -local function unlock_player(player) - local meta = player:get_meta() - if meta:get_int("player_physics_locked") == 1 then - if meta:get_string("player_physics_locked_by") == "ta_flylib" then - meta:set_int("player_physics_locked", 0) - meta:set_string("player_physics_locked_by", "") - return true - end - end - return false -end - -local function detach_player(player) - local pos = obj_pos(player) - if pos then - player:set_detach() - player:set_properties({visual_size = {x=1, y=1}}) - player:set_pos(pos) - end - -- TODO: move to save position -end - --- Attach player/mob to given parent object (block) -local function attach_single_object(parent, obj, distance) - local self = parent:get_luaentity() - local res = obj:get_attach() - if not res then -- not already attached - local yaw - if obj:is_player() then - yaw = obj:get_look_horizontal() - else - yaw = obj:get_rotation().y - end - -- store for later use - local offs = table.copy(distance) - -- Calc entity rotation, which is relative to the parent's rotation - local rot = parent:get_rotation() - if self.param2 >= 20 then - distance = rotate(distance, 2 * math.pi - rot.y) - distance.y = -distance.y - distance.x = -distance.x - rot.y = rot.y - yaw - elseif self.param2 < 4 then - distance = rotate(distance, 2 * math.pi - rot.y) - rot.y = rot.y - yaw - end - distance = vector.multiply(distance, 29) - obj:set_attach(parent, "", distance, vector.multiply(rot, 180 / math.pi)) - obj:set_properties({visual_size = {x=2.9, y=2.9}}) - if obj:is_player() then - if lock_player(obj) then - table.insert(self.players, {name = obj:get_player_name(), offs = offs}) - end - else - table.insert(self.entities, {objID = get_object_id(obj), offs = offs}) - end - end -end - --- Attach all objects around to the parent object --- offs is the search/attach position offset --- distance (optional) is the attach distance to the center of the entity -local function attach_objects(pos, offs, parent, yoffs, distance) - local pos1 = vector.add(pos, offs) - for _, obj in pairs(minetest.get_objects_inside_radius(pos1, 0.9)) do - -- keep relative object position - distance = distance or vector.subtract(obj:get_pos(), pos) - local entity = obj:get_luaentity() - if entity then - local mod = entity.name:gmatch("(.-):")() - if techage.RegisteredMobsMods[mod] then - distance.y = distance.y + yoffs - attach_single_object(parent, obj, distance) - end - elseif obj:is_player() then - attach_single_object(parent, obj, distance) - end - end -end - --- Detach all attached objects from the parent object -local function detach_objects(pos, self) - for _, item in ipairs(self.entities or {}) do - local entity = minetest.luaentities[item.objID] - if entity then - local obj = entity.object - obj:set_detach() - obj:set_properties({visual_size = {x=1, y=1}}) - local pos1 = vector.add(pos, item.offs) - pos1.y = pos1.y - (self.yoffs or 0) - obj:set_pos(pos1) - end - end - for _, item in ipairs(self.players or {}) do - local obj = minetest.get_player_by_name(item.name) - if obj then - obj:set_detach() - obj:set_properties({visual_size = {x=1, y=1}}) - local pos1 = vector.add(pos, item.offs) - pos1.y = pos1.y + 0.1 - obj:set_pos(pos1) - unlock_player(obj) - end - end - self.entities = {} - self.players = {} -end - -local function entity_to_node(pos, obj) - local self = obj:get_luaentity() - if self and self.item then - local playername = self.players and self.players[1] and self.players[1].name - detach_objects(pos, self) - monitoring_del_entity(self.item) - minetest.after(0.1, obj.remove, obj) - set_node(self.item, playername) - end -end - --- Create a node entitiy. --- * base_pos is controller block related --- * start_pos and dest_pos are entity positions -local function node_to_entity(base_pos, start_pos, dest_pos) - local meta = M(start_pos) - local node, metadata, cartdef - - node = techage.get_node_lvm(start_pos) - if minecart.is_cart(node.name) then - cartdef = minecart.remove_cart(start_pos) - elseif meta:contains("ta_move_block") then - -- Move-block stored as metadata - node = minetest.deserialize(meta:get_string("ta_move_block")) - metadata = {} - meta:set_string("ta_move_block", "") - meta:set_string("ta_block_locked", "true") - elseif not meta:contains("ta_block_locked") then - -- Block with other metadata - node = techage.get_node_lvm(start_pos) - metadata = meta:to_table() - minetest.after(0.1, minetest.remove_node, start_pos) - else - return - end - local obj = minetest.add_entity(start_pos, "techage:move_item") - if obj then - local self = obj:get_luaentity() - local rot = techage.facedir_to_rotation(node.param2) - obj:set_rotation(rot) - obj:set_properties({wield_item=node.name}) - obj:set_armor_groups({immortal=1}) - - -- To be able to revert to node - self.param2 = node.param2 - self.item = { - name = node.name, - param2 = node.param2, - metadata = metadata or {}, - dest_pos = dest_pos, - base_pos = base_pos, - cartdef = cartdef, - } - monitoring_add_entity(self.item) - - -- Prepare for attachments - self.players = {} - self.entities = {} - -- Prepare for path walk - self.path_idx = 1 - return obj, self.item.cartdef ~= nil - end -end - --- move block direction -local function determine_dir(pos1, pos2) - local vdist = vector.subtract(pos2, pos1) - local ndist = vector.length(vdist) - if ndist > 0 then - return vector.divide(vdist, ndist) - end - return {x=0, y=0, z=0} -end - -local function move_entity(obj, next_pos, dir, is_corner) - local self = obj:get_luaentity() - self.next_pos = next_pos - self.dir = dir - if is_corner then - local vel = vector.multiply(dir, math.min(CORNER_SPEED, self.max_speed)) - obj:set_velocity(vel) - end - local acc = vector.multiply(dir, self.max_speed / 2) - obj:set_acceleration(acc) -end - -local function moveon_entity(obj, self, pos1) - local pos2 = next_path_pos(pos1, self.lmove, self.path_idx) - if pos2 then - self.path_idx = self.path_idx + 1 - local dir = determine_dir(pos1, pos2) - move_entity(obj, pos2, dir, true) - return true - end -end - -minetest.register_entity("techage:move_item", { - initial_properties = { - pointable = true, - makes_footstep_sound = true, - static_save = false, - collide_with_objects = false, - physical = false, - visual = "wielditem", - wield_item = "default:dirt", - visual_size = {x=0.67, y=0.67, z=0.67}, - selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - }, - - on_step = function(self, dtime, moveresult) - local stop_obj = function(obj, self) - local next_pos = self.next_pos - obj:move_to(self.next_pos, true) - obj:set_acceleration({x=0, y=0, z=0}) - obj:set_velocity({x=0, y=0, z=0}) - self.next_pos = nil - self.old_dist = nil - return next_pos - end - - if self.next_pos then - local obj = self.object - local pos = obj:get_pos() - local dist = vector.distance(pos, self.next_pos) - local speed = calc_speed(obj:get_velocity()) - self.old_dist = self.old_dist or dist - - if self.lmove and self.lmove[self.path_idx] then - local min_dist = math.min(1, self.max_speed / 8) - if dist < min_dist or dist > self.old_dist then - -- change of direction - local next_pos = stop_obj(obj, self) - if not moveon_entity(obj, self, next_pos) then - minetest.after(0.5, entity_to_node, next_pos, obj) - end - return - end - elseif dist < 0.05 or dist > self.old_dist then - -- Landing - local next_pos = stop_obj(obj, self) - local dest_pos = self.item.dest_pos or next_pos - minetest.after(0.5, entity_to_node, dest_pos, obj) - return - end - - self.old_dist = dist - - -- Braking or limit max speed - if speed > (dist * 2) or speed > self.max_speed then - speed = math.min(speed, math.max(dist * 2, MIN_SPEED)) - local vel = vector.multiply(self.dir,speed) - obj:set_velocity(vel) - obj:set_acceleration({x=0, y=0, z=0}) - end - - monitoring_trigger_entity(self.item) - end - end, -}) - -local function is_valid_dest(pos) - local node = techage.get_node_lvm(pos) - if techage.is_air_like(node.name) then - return true - end - if minecart.is_rail(pos, node.name) or minecart.is_cart(node.name) then - return true - end - if not M(pos):contains("ta_move_block") then - return true - end - return false -end - -local function is_simple_node(pos) - local node = techage.get_node_lvm(pos) - if not minecart.is_rail(pos, node.name) then - local ndef = minetest.registered_nodes[node.name] - return node.name ~= "air" and techage.can_dig_node(node.name, ndef) or minecart.is_cart(node.name) - end -end - --- Move node from 'pos1' to the destination, calculated by means of 'lmove' --- * pos and meta are controller block related --- * lmove is the movement as a list of `moves` --- * height is move block height as value between 0 and 1 and used to calculate the offset --- for the attached object (player). -local function move_node(pos, meta, pos1, lmove, max_speed, height) - local pos2 = next_path_pos(pos1, lmove, 1) - local offs = dest_offset(lmove) - local dest_pos = vector.add(pos1, offs) - -- optional for non-player objects - local yoffs = meta:get_float("offset") - - if pos2 then - local dir = determine_dir(pos1, pos2) - local obj, is_cart = node_to_entity(pos, pos1, dest_pos) - - if obj then - if is_cart then - attach_objects(pos1, 0, obj, yoffs, {x = 0, y = -0.4, z = 0}) - else - local offs = {x=0, y=height or 1, z=0} - attach_objects(pos1, offs, obj, yoffs) - if dir.y == 0 then - if (dir.x ~= 0 and dir.z == 0) or (dir.x == 0 and dir.z ~= 0) then - attach_objects(pos1, dir, obj, yoffs) - end - end - end - local self = obj:get_luaentity() - self.path_idx = 2 - self.lmove = lmove - self.max_speed = max_speed - self.yoffs = yoffs - move_entity(obj, pos2, dir) - return true - else - return false - end - end -end - --- --- Default Move Mode --- - --- Move the nodes from nvm.lpos1 to nvm.lpos2 --- * nvm.lpos1 is a list of nodes --- * lmove is the movement as a list of `moves` --- * pos, meta, and nvm are controller block related ---- height is move block height as value between 0 and 1 and used to calculate the offset --- for the attached object (player). -local function multi_move_nodes(pos, meta, nvm, lmove, max_speed, height, move2to1) - local owner = meta:get_string("owner") - techage.counting_add(owner, #lmove, #nvm.lpos1 * #lmove) - - for idx = 1, #nvm.lpos1 do - local pos1 = nvm.lpos1[idx] - local pos2 = nvm.lpos2[idx] - --print("multi_move_nodes", idx, P2S(pos1), P2S(pos2)) - - if move2to1 then - pos1, pos2 = pos2, pos1 - end - - if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then - if is_simple_node(pos1) and is_valid_dest(pos2) then - if move_node(pos, meta, pos1, lmove, max_speed, height) == false then - meta:set_string("status", S("No valid node at the start position")) - return false - end - else - if not is_simple_node(pos1) then - meta:set_string("status", S("No valid node at the start position")) - minetest.chat_send_player(owner, " [techage] " .. S("No valid node at the start position") .. " at " .. P2S(pos1)) - else - meta:set_string("status", S("No valid destination position")) - minetest.chat_send_player(owner, " [techage] " .. S("No valid destination position") .. " at " .. P2S(pos2)) - end - return false - end - else - if minetest.is_protected(pos1, owner) then - meta:set_string("status", S("Start position is protected")) - minetest.chat_send_player(owner, " [techage] " .. S("Start position is protected") .. " at " .. P2S(pos1)) - else - meta:set_string("status", S("Destination position is protected")) - minetest.chat_send_player(owner, " [techage] " .. S("Destination position is protected") .. " at " .. P2S(pos2)) - end - return false - end - end - meta:set_string("status", S("Running")) - return true -end - --- Move the nodes from lpos1 to lpos2. --- * lpos1 is a list of nodes --- * lpos2 = lpos1 + move --- * pos and meta are controller block related --- * height is move block height as value between 0 and 1 and used to calculate the offset --- for the attached object (player). -local function move_nodes(pos, meta, lpos1, move, max_speed, height) - local owner = meta:get_string("owner") - lpos1 = lpos1 or {} - techage.counting_add(owner, #lpos1) - - local lpos2 = {} - for idx = 1, #lpos1 do - - local pos1 = lpos1[idx] - local pos2 = vector.add(lpos1[idx], move) - lpos2[idx] = pos2 - - if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then - if is_simple_node(pos1) and is_valid_dest(pos2) then - move_node(pos, meta, pos1, {move}, max_speed, height) - else - if not is_simple_node(pos1) then - meta:set_string("status", S("No valid node at the start position")) - minetest.chat_send_player(owner, " [techage] " .. S("No valid node at the start position") .. " at " .. P2S(pos1)) - else - meta:set_string("status", S("No valid destination position")) - minetest.chat_send_player(owner, " [techage] " .. S("No valid destination position") .. " at " .. P2S(pos2)) - end - return false, lpos1 - end - else - if minetest.is_protected(pos1, owner) then - meta:set_string("status", S("Start position is protected")) - minetest.chat_send_player(owner, " [techage] " .. S("Start position is protected") .. " at " .. P2S(pos1)) - else - meta:set_string("status", S("Destination position is protected")) - minetest.chat_send_player(owner, " [techage] " .. S("Destination position is protected") .. " at " .. P2S(pos2)) - end - return false, lpos1 - end - end - - meta:set_string("status", S("Running")) - return true, lpos2 -end - --- --- Teleport Mode --- -local function is_player_available(lpos1) - if #lpos1 == 1 then - for _, obj in pairs(minetest.get_objects_inside_radius(lpos1[1], 0.9)) do - if obj:is_player() then - return true - end - end - end -end - -local function teleport(base_pos, pos1, pos2, meta, owner, lmove, max_speed) - if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then - local node1 = techage.get_node_lvm(pos1) - local node2 = techage.get_node_lvm(pos2) - if techage.is_air_like(node1.name) and techage.is_air_like(node2.name) then - minetest.swap_node(pos1, {name = "techage:moveblock", param2 = 0}) - if move_node(base_pos, meta, pos1, lmove, max_speed, 0) == false then - meta:set_string("status", S("No valid start position")) - return false - end - else - if not techage.is_air_like(node1.name) then - meta:set_string("status", S("No valid start position")) - minetest.chat_send_player(owner, " [techage] " .. S("No valid start position") .. " at " .. P2S(pos1)) - else - meta:set_string("status", S("No valid destination position")) - minetest.chat_send_player(owner, " [techage] " .. S("No valid destination position") .. " at " .. P2S(pos2)) - end - return false - end - else - if minetest.is_protected(pos1, owner) then - meta:set_string("status", S("Start position is protected")) - minetest.chat_send_player(owner, " [techage] " .. S("Start position is protected") .. " at " .. P2S(pos1)) - else - meta:set_string("status", S("Destination position is protected")) - minetest.chat_send_player(owner, " [techage] " .. S("Destination position is protected") .. " at " .. P2S(pos2)) - end - return false - end - meta:set_string("status", S("Running")) - return true -end - --- Move the player from nvm.lpos1 to nvm.lpos2 --- * nvm.lpos1 is a list of length one(!) with the not to be moved block below the player --- * lmove is the movement as a list of `moves` --- * pos, meta, and nvm are controller block related -local function multi_teleport_player(base_pos, meta, nvm, lmove, max_speed, move2to1) - local owner = meta:get_string("owner") - techage.counting_add(owner, #lmove, #nvm.lpos1 * #lmove) - - local pos1 = vector.add(nvm.lpos1[1], {x=0, y=1, z=0}) - local pos2 = vector.add(nvm.lpos2[1], {x=0, y=1, z=0}) - - if move2to1 then - pos1, pos2 = pos2, pos1 - end - - return teleport(base_pos, pos1, pos2, meta, owner, lmove, max_speed) -end - --- Move the player from lpos1 to lpos2. --- * lpos1 is a list of length one(!) with the not to be moved block below the player --- * lpos2 = lpos1 + move --- * pos and meta are controller block related -local function teleport_player(base_pos, meta, lpos1, move, max_speed) - local owner = meta:get_string("owner") - lpos1 = lpos1 or {} - techage.counting_add(owner, #lpos1) - - local pos1 = vector.add(lpos1[1], {x=0, y=1, z=0}) - local pos2 = vector.add(pos1, move) - - return teleport(base_pos, pos1, pos2, meta, owner, {move}, max_speed), nil -end - --------------------------------------------------------------------------------------- --- API --------------------------------------------------------------------------------------- - --- move2to1 is the direction and is true for 'from pos2 to pos1' --- Move path and other data is stored as meta data of pos -function flylib.move_to_other_pos(pos, move2to1) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local lmove, err = flylib.to_path(meta:get_string("path")) or {} - local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED - local height = meta:contains("height") and meta:get_float("height") or 1 - local teleport_mode = meta:get_string("teleport_mode") == "enable" - - if err or nvm.running then return false end - - height = techage.in_range(height, 0, 1) - max_speed = techage.in_range(max_speed, MIN_SPEED, MAX_SPEED) - nvm.lpos1 = nvm.lpos1 or {} - - local offs = dest_offset(lmove) - if move2to1 then - lmove = reverse_path(lmove) - end - -- calc destination positions - nvm.lpos2 = lvect_add_vec(nvm.lpos1, offs) - local lpos = move2to1 and nvm.lpos2 or nvm.lpos1 - - if teleport_mode and is_player_available(lpos) then - nvm.running = multi_teleport_player(pos, meta, nvm, lmove, max_speed, move2to1) - elseif not teleport_mode then - nvm.running = multi_move_nodes(pos, meta, nvm, lmove, max_speed, height, move2to1) - end - nvm.moveBA = nvm.running and not move2to1 - return nvm.running -end - --- `move` the movement as a vector -function flylib.move_to(pos, move) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local height = techage.in_range(meta:contains("height") and meta:get_float("height") or 1, 0, 1) - local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED - local teleport_mode = meta:get_string("teleport_mode") == "enable" - - if nvm.running then return false end - - -- TODO: Not working so far. There is no known 'nvm.lastpos' as start pos. - --if teleport_mode and is_player_available(nvm.lpos1) then - -- nvm.running, nvm.lastpos = teleport_player(pos, meta, nvm.lastpos or nvm.lpos1, move, max_speed) - --elseif not teleport_mode then - nvm.running, nvm.lastpos = move_nodes(pos, meta, nvm.lastpos or nvm.lpos1, move, max_speed, height) - --end - return nvm.running -end - -function flylib.reset_move(pos) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local height = techage.in_range(meta:contains("height") and meta:get_float("height") or 1, 0, 1) - local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED - - if nvm.running then return false end - if meta:get_string("teleport_mode") == "enable" then return false end - - if nvm.lpos1 and nvm.lpos1[1] then - local move = vector.subtract(nvm.lpos1[1], (nvm.lastpos or nvm.lpos1)[1]) - - nvm.running, nvm.lastpos = move_nodes(pos, meta, nvm.lastpos or nvm.lpos1, move, max_speed, height) - return nvm.running - end - return false -end - --- pos is the controller block pos --- lpos is a list of node positions to be moved --- rot is one of "l", "r", "2l", "2r" -function flylib.rotate_nodes(pos, lpos, rot) - local meta = M(pos) - local owner = meta:get_string("owner") - -- cpos is the center pos - local cpos = meta:contains("center") and flylib.to_vector(meta:get_string("center")) - local lpos2 = techage.rotate_around_center(lpos, rot, cpos) - local param2 - local nodes2 = {} - - techage.counting_add(owner, #lpos * 2) - - for i, pos1 in ipairs(lpos) do - local node = techage.get_node_lvm(pos1) - if rot == "l" then - param2 = techage.param2_turn_right(node.param2) - elseif rot == "r" then - param2 = techage.param2_turn_left(node.param2) - else - param2 = techage.param2_turn_right(techage.param2_turn_right(node.param2)) - end - if not minetest.is_protected(pos1, owner) and is_simple_node(pos1) then - minetest.remove_node(pos1) - nodes2[#nodes2 + 1] = {pos = lpos2[i], name = node.name, param2 = param2} - end - end - for _,item in ipairs(nodes2) do - if not minetest.is_protected(item.pos, owner) and is_valid_dest(item.pos) then - minetest.add_node(item.pos, {name = item.name, param2 = item.param2}) - end - end - return lpos2 -end - -function flylib.exchange_node(pos, name, param2) - local meta = M(pos) - local move_block - - -- consider stored "objects" - if meta:contains("ta_move_block") then - move_block = meta:get_string("ta_move_block") - end - - minetest.swap_node(pos, {name = name, param2 = param2}) - - if move_block then - meta:set_string("ta_move_block", move_block) - end -end - -function flylib.remove_node(pos) - local meta = M(pos) - local move_block - - -- consider stored "objects" - if meta:contains("ta_move_block") then - move_block = meta:get_string("ta_move_block") - end - - minetest.remove_node(pos) - - if move_block then - local node = minetest.deserialize(move_block) - minetest.add_node(pos, node) - meta:set_string("ta_move_block", "") - end -end - -minetest.register_on_joinplayer(function(player) - unlock_player(player) -end) - -minetest.register_on_leaveplayer(function(player) - if unlock_player(player) then - detach_player(player) - end -end) - -minetest.register_on_dieplayer(function(player) - if unlock_player(player) then - detach_player(player) - end -end) - -techage.flylib = flylib diff --git a/techage/basis/formspec_update.lua b/techage/basis/formspec_update.lua deleted file mode 100644 index 9696c2f..0000000 --- a/techage/basis/formspec_update.lua +++ /dev/null @@ -1,52 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Keep only one formspec active per player - -]]-- - -local P2S = minetest.pos_to_string - -local ActiveFormspecs = {} -local ActivePlayer = {} - - -function techage.is_activeformspec(pos) - return ActiveFormspecs[P2S(pos)] -end - -function techage.set_activeformspec(pos, player) - local name = player and player:get_player_name() - if name then - if ActivePlayer[name] then - ActiveFormspecs[ActivePlayer[name]] = nil - end - ActivePlayer[name] = P2S(pos) - ActiveFormspecs[P2S(pos)] = true - end -end - -function techage.reset_activeformspec(pos, player) - local name = player and player:get_player_name() - if name then - if ActivePlayer[name] then - ActiveFormspecs[ActivePlayer[name]] = nil - ActivePlayer[name] = nil - end - end -end - -minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - if ActivePlayer[name] then - ActiveFormspecs[ActivePlayer[name]] = nil - ActivePlayer[name] = nil - end -end) diff --git a/techage/basis/fuel_lib.lua b/techage/basis/fuel_lib.lua deleted file mode 100644 index 0a60d3b..0000000 --- a/techage/basis/fuel_lib.lua +++ /dev/null @@ -1,197 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Oil fuel burning lib - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid -local ValidOilFuels = techage.firebox.ValidOilFuels -local Burntime = techage.firebox.Burntime - -techage.fuel = {} - -local CAPACITY = 50 -local BLOCKING_TIME = 0.3 -- 300ms - -techage.fuel.CAPACITY = CAPACITY - --- fuel burning categories (equal or better than...) -techage.fuel.BT_BITUMEN = 5 -techage.fuel.BT_OIL = 4 -techage.fuel.BT_FUELOIL = 3 -techage.fuel.BT_NAPHTHA = 2 -techage.fuel.BT_GASOLINE = 1 - - -function techage.fuel.fuel_container(x, y, nvm) - local itemname = "" - if nvm.liquid and nvm.liquid.name and nvm.liquid.amount and nvm.liquid.amount > 0 then - itemname = nvm.liquid.name.." "..nvm.liquid.amount - end - local fuel_percent = 0 - if nvm.running or techage.is_running(nvm) then - fuel_percent = ((nvm.burn_cycles or 1) * 100) / (nvm.burn_cycles_total or 1) - end - return "container["..x..","..y.."]".. - "box[0,0;1.05,2.1;#000000]".. - "image[0.1,0.1;1,1;default_furnace_fire_bg.png^[lowpart:".. - fuel_percent..":default_furnace_fire_fg.png]".. - techage.item_image(0.1, 1.1, itemname).. - "container_end[]" -end - -local function help(x, y) - local tooltip = S("To add fuel punch\nthis block\nwith a fuel container") - return "label["..x..","..y..";"..minetest.colorize("#000000", minetest.formspec_escape("[?]")).."]".. - "tooltip["..x..","..y..";0.5,0.5;"..tooltip..";#0C3D32;#FFFFFF]" -end - -function techage.fuel.formspec(nvm) - local title = S("Fuel Menu") - return "size[4,3]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;3.8,0.5;#c6e8ff]".. - "label[1,-0.1;"..minetest.colorize("#000000", title).."]".. - help(3.4, -0.1).. - techage.fuel.fuel_container(1.5, 1, nvm) -end - -function techage.fuel.can_dig(pos, player) - if not player or minetest.is_protected(pos, player:get_player_name()) then - return false - end - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - local inv = M(pos):get_inventory() - return not inv or inv:is_empty("fuel") and nvm.liquid.amount == 0 -end - -function techage.fuel.on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", techage.fuel.formspec(nvm)) -end - --- name is the fuel item name -function techage.fuel.burntime(name) - if ValidOilFuels[name] then - return Burntime[name] or 0.01 -- not zero ! - end - return 0.01 -- not zero ! -end - --- equal or better than the given category (see 'techage.fuel.BT_BITUMEN,...') -function techage.fuel.valid_fuel(name, category) - return ValidOilFuels[name] and ValidOilFuels[name] <= category -end - -function techage.fuel.on_punch(pos, node, puncher, pointed_thing) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.blocking_time = mem.blocking_time or 0 - if mem.blocking_time > techage.SystemTime then - return - end - - local wielded_item = puncher:get_wielded_item():get_name() - local item_count = puncher:get_wielded_item():get_count() - local new_item = techage.liquid.fill_on_punch(nvm, wielded_item, item_count, puncher) - if new_item then - puncher:set_wielded_item(new_item) - M(pos):set_string("formspec", techage.fuel.formspec(pos, nvm)) - mem.blocking_time = techage.SystemTime + BLOCKING_TIME - return - end - - local ldef = techage.liquid.get_liquid_def(wielded_item) - if ldef and ValidOilFuels[ldef.inv_item] then - local lqd = (minetest.registered_nodes[node.name] or {}).liquid - if not lqd.fuel_cat or ValidOilFuels[ldef.inv_item] <= lqd.fuel_cat then - local new_item = techage.liquid.empty_on_punch(pos, nvm, wielded_item, item_count) - if new_item then - puncher:set_wielded_item(new_item) - M(pos):set_string("formspec", techage.fuel.formspec(pos, nvm)) - mem.blocking_time = techage.SystemTime + BLOCKING_TIME - end - end - end -end - -function techage.fuel.get_fuel(nvm) - if nvm.liquid and nvm.liquid.name and nvm.liquid.amount then - if nvm.liquid.amount > 0 then - nvm.liquid.amount = nvm.liquid.amount - 1 - return nvm.liquid.name - end - nvm.liquid.name = nil - end - return nil -end - -function techage.fuel.has_fuel(nvm) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - return nvm.liquid.amount > 0 -end - -function techage.fuel.get_fuel_amount(nvm) - if nvm.liquid and nvm.liquid.amount then - return nvm.liquid.amount - end - return 0 -end - -function techage.fuel.get_liquid_table(valid_fuel, capacity, start_firebox) - return { - capa = capacity, - fuel_cat = valid_fuel, - peek = function(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - if techage.fuel.valid_fuel(name, valid_fuel) then - local nvm = techage.get_nvm(pos) - local res = liquid.srv_put(nvm, name, amount, capacity) - start_firebox(pos, nvm) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.fuel.formspec(nvm)) - end - return res - end - return amount - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - amount, name = liquid.srv_take(nvm, name, amount) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.fuel.formspec(nvm)) - end - return amount, name - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, capacity) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.fuel.formspec(nvm)) - end - return leftover - end - } -end diff --git a/techage/basis/gravel_lib.lua b/techage/basis/gravel_lib.lua deleted file mode 100644 index 5afb383..0000000 --- a/techage/basis/gravel_lib.lua +++ /dev/null @@ -1,102 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Gravel Sieve basis functions - -]]-- - --- Increase the probability over the natural occurrence -local PROBABILITY_FACTOR = 2 - --- Ore probability table (1/n) -local ore_probability = { -} - -local ProbabilityCorrections = { - ["default:tin_lump"] = 0.3, -- extensively used - ["default:coal_lump"] = 0.2, -- extensively used - ["default:iron_lump"] = 0.5, -- extensively used - ["techage:baborium_lump"] = 99999, -- mining required -} - --- collect all registered ores and calculate the probability -local function add_ores() - for _,item in pairs(minetest.registered_ores) do - if not ore_probability[item.ore] and minetest.registered_nodes[item.ore] then - local drop = minetest.registered_nodes[item.ore].drop - if type(drop) == "string" - and drop ~= item.ore - and drop ~= "" - and item.ore_type == "scatter" - and item.wherein == "default:stone" - and item.clust_scarcity ~= nil and item.clust_scarcity > 0 - and item.clust_num_ores ~= nil and item.clust_num_ores > 0 - and item.y_max ~= nil and item.y_min ~= nil then - local factor = 0.5 - if item.y_max < -250 then - factor = -250 / item.y_max - end - local probability = (techage.ore_rarity / PROBABILITY_FACTOR) * item.clust_scarcity / - (item.clust_num_ores * factor) - -- lower value means higher probability - ore_probability[drop] = math.min(ore_probability[drop] or 100000, probability) - end - end - end - -- some corrections - for key, correction in pairs(ProbabilityCorrections) do - if ore_probability[key] then - ore_probability[key] = ore_probability[key] * correction - -- consider upper and lower level - ore_probability[key] = techage.in_range(ore_probability[key], 10, 100000) - end - end - local overall_probability = 0.0 - for name,probability in pairs(ore_probability) do - minetest.log("info", string.format("[techage] %-32s %u", name, probability)) - overall_probability = overall_probability + 1.0/probability - end - minetest.log("info", string.format("[techage] Overall probability %g", overall_probability)) -end - -minetest.register_on_mods_loaded(add_ores) - --- --- Change the probability of ores or register new ores for sieving --- -function techage.register_ore_for_gravelsieve(ore_name, probability) - ore_probability[ore_name] = probability -end - --- determine ore based on the calculated probability -function techage.gravelsieve_get_random_gravel_ore() - for ore, probability in pairs(ore_probability) do - if math.random(probability) == 1 then - return ItemStack(ore) - end - end - if math.random(2) == 1 then - return ItemStack("default:gravel") - else - return ItemStack("techage:sieved_gravel") - end -end - -function techage.gravelsieve_get_random_basalt_ore() - if math.random(40) == 1 then - return ItemStack("default:coal_lump") - elseif math.random(40) == 1 then - return ItemStack("default:iron_lump") - elseif math.random(2) == 1 then - return ItemStack("techage:basalt_gravel") - else - return ItemStack("techage:sieved_basalt_gravel") - end -end diff --git a/techage/basis/hyperloop.lua b/techage/basis/hyperloop.lua deleted file mode 100644 index 32e7b0a..0000000 --- a/techage/basis/hyperloop.lua +++ /dev/null @@ -1,240 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - For chests and tanks with hyperloop support - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local N = techage.get_node_lvm -local S = techage.S - --- Will be initialized when mods are loaded -local Stations = nil -local Tube = nil -local HYPERLOOP = nil - -techage.hyperloop = {} - ---[[ - - tStations["(x,y,z)"] = { - conn = {dir = "(200,0,20)", ...}, - name = , -- chest/tank - owner = "singleplayer", - conn_name = , - single = true/nil, - } - -]]-- - -minetest.register_on_mods_loaded(function() - if minetest.global_exists("hyperloop") then - Stations = hyperloop.Stations - Tube = hyperloop.Tube - HYPERLOOP = true - Tube:add_secondary_node_names({"techage:ta5_hl_chest", "techage:ta5_hl_tank"}) - end -end) - -local function get_remote_pos(pos, rmt_name) - local owner = M(pos):get_string("owner") - for key,item in pairs(Stations:get_node_table(pos)) do - if item.owner == owner and item.conn_name == rmt_name then - return S2P(key) - end - end -end - -local function get_free_server_list(pos, owner) - if Stations and Stations.get_node_table then - local tbl = {M(pos):get_string("remote_name")} - for key,item in pairs(Stations:get_node_table(pos) or {}) do - if item.single and item.owner == owner then - if M(pos):get_string("node_type") == M(S2P(key)):get_string("node_type") then - tbl[#tbl+1] = item.conn_name - end - end - end - tbl[#tbl+1] = "" - return tbl - end - return {} -end - -local function on_lose_connection(pos, node_type) - local name = techage.get_node_lvm(pos).name - local ndef = minetest.registered_nodes[name] - if ndef and ndef.on_lose_connection then - ndef.on_lose_connection(pos, node_type) - end -end - -local function on_dropdown(pos) - if pos then - local owner = M(pos):get_string("owner") - return table.concat(get_free_server_list(pos, owner), ",") or "" - end - return "" -end - -local function update_node_data(pos, state, conn_name, remote_name, rmt_pos) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if state == "server_connected" then - Stations:update(pos, {conn_name=conn_name, single="nil"}) - meta:set_string("status", "server") - meta:set_string("conn_name", conn_name) - meta:set_string("remote_name", "") - meta:set_string("conn_status", S("connected to") .. " " .. P2S(rmt_pos)) - nvm.rmt_pos = rmt_pos - elseif state == "client_connected" then - Stations:update(pos, {conn_name="nil", single="nil"}) - meta:set_string("status", "client") - meta:set_string("conn_name", "") - meta:set_string("remote_name", remote_name) - meta:set_string("conn_status", S("connected to") .. " " .. P2S(rmt_pos)) - nvm.rmt_pos = rmt_pos - elseif state == "server_not_connected" then - Stations:update(pos, {conn_name=conn_name, single=true}) - meta:set_string("status", "server") - meta:set_string("conn_name", conn_name) - meta:set_string("remote_name", "") - meta:set_string("conn_status", S("not connected")) - nvm.rmt_pos = nil - on_lose_connection(pos, "server") - elseif state == "client_not_connected" then - Stations:update(pos, {conn_name="nil", single=nil}) - meta:set_string("status", "not connected") - meta:set_string("conn_name", "") - meta:set_string("remote_name", "") - meta:set_string("conn_status", S("not connected")) - nvm.rmt_pos = nil - on_lose_connection(pos, "client") - end -end - -techage.hyperloop.SUBMENU = { - { - type = "label", - label = S("Enter a block name or select an existing one"), - tooltip = "", - name = "l1", - }, - { - type = "ascii", - name = "conn_name", - label = S("Block name"), - tooltip = S("Connection name for this block"), - default = "", - }, - { - type = "dropdown", - choices = "", - on_dropdown = on_dropdown, - name = "remote_name", - label = S("Remote name"), - tooltip = S("Connection name of the remote block"), - }, -} - -function techage.hyperloop.is_client(pos) - if HYPERLOOP then - local nvm = techage.get_nvm(pos) - if Stations:get(nvm.rmt_pos) then - if M(pos):get_string("status") == "client" then - return true - end - end - end -end - -function techage.hyperloop.is_server(pos) - if HYPERLOOP then - if M(pos):get_string("status") == "server" then - return true - end - end -end - -function techage.hyperloop.is_paired(pos) - if HYPERLOOP then - local nvm = techage.get_nvm(pos) - if Stations:get(nvm.rmt_pos) then - if M(pos):get_string("status") ~= "not connected" then - return true - end - end - end -end - -function techage.hyperloop.remote_pos(pos) - if HYPERLOOP then - local nvm = techage.get_nvm(pos) - if Stations:get(nvm.rmt_pos) then - if M(pos):contains("remote_name") then - return nvm.rmt_pos or pos - end - end - end - return pos -end - -function techage.hyperloop.after_place_node(pos, placer, node_type) - if HYPERLOOP then - Stations:set(pos, node_type, {owner=placer:get_player_name()}) - M(pos):set_string("node_type", node_type) - Tube:after_place_node(pos) - end -end - -function techage.hyperloop.after_dig_node(pos, oldnode, oldmetadata, digger) - if HYPERLOOP then - local conn_name = oldmetadata.fields.conn_name - local remote_name = oldmetadata.fields.remote_name - local loc_pos, rmt_pos = pos, techage.get_nvm(pos).rmt_pos - - -- Close connections - if remote_name and rmt_pos then -- Connected client - update_node_data(rmt_pos, "server_not_connected", remote_name, "") - elseif conn_name and rmt_pos then -- Connected server - update_node_data(rmt_pos, "client_not_connected", "", conn_name) - end - - Tube:after_dig_node(pos) - Stations:delete(pos) - end -end - -function techage.hyperloop.after_formspec(pos, fields) - if HYPERLOOP and fields.save or fields.key_enter_field then - local meta = M(pos) - local conn_name = meta:get_string("conn_name") - local remote_name = meta:get_string("remote_name") - local status = meta:contains("status") and meta:get_string("status") or "not connected" - local loc_pos, rmt_pos = pos, techage.get_nvm(pos).rmt_pos - - if status == "not connected" then - if fields.remote_name ~= "" then -- Client - local rmt_pos = get_remote_pos(pos, fields.remote_name) - if rmt_pos then - update_node_data(loc_pos, "client_connected", "", fields.remote_name, rmt_pos) - update_node_data(rmt_pos, "server_connected", fields.remote_name, "", loc_pos) - end - elseif fields.conn_name ~= "" then -- Server - update_node_data(loc_pos, "server_not_connected", fields.conn_name, "") - end - end - end -end diff --git a/techage/basis/laser_lib.lua b/techage/basis/laser_lib.lua deleted file mode 100644 index 135fe61..0000000 --- a/techage/basis/laser_lib.lua +++ /dev/null @@ -1,146 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - Laser basis functions - -]]-- - -local Entities = {} -local SIZES = {1, 2, 3, 6, 12, 24, 48} -- for laser entities -local GAP_MIN = 1 -- between 2 blocks -local GAP_MAX = 2 * 48 -- between 2 blocks - --- Return the area (pos1,pos2) for a destination node -local function get_pos_range(pos, dir) - local pos1 = vector.add(pos, vector.multiply(dir, GAP_MIN + 1)) -- min - local pos2 = vector.add(pos, vector.multiply(dir, GAP_MAX + 1)) -- max - return pos1, pos2 -end - --- Return first pos after start pos and the destination pos -local function get_positions(pos, mem, dir) - local pos1 = vector.add(pos, dir) -- start pos - local _, pos2 = get_pos_range(pos, dir) -- last pos - local _, pos3 = minetest.line_of_sight(pos1, pos2) - pos3 = pos3 or pos2 -- destination node pos - if not mem.peer_node_pos or not vector.equals(pos3, mem.peer_node_pos) then - mem.peer_node_pos = pos3 - local dist = vector.distance(pos1, pos3) - if dist > GAP_MIN and dist <= GAP_MAX then - return true, pos1, pos3 -- new values - else - return false -- invalid values - end - end - return true -- no new values -end - --- return for both laser entities the pos and length -local function get_laser_length_and_pos(pos1, pos2, dir) - local dist = vector.distance(pos1, pos2) - - for _, size in ipairs(SIZES) do - if dist <= (size * 2) then - pos1 = vector.add (pos1, vector.multiply(dir, (size / 2) - 0.5)) - pos2 = vector.subtract(pos2, vector.multiply(dir, (size / 2) + 0.5)) - return size, pos1, pos2 - end - end -end - -local function del_laser(pos) - local key = minetest.hash_node_position(pos) - local items = Entities[key] - if items then - local laser1, laser2 = items[1], items[2] - laser1:remove() - laser2:remove() - Entities[key] = nil - end - return key -end - -local function add_laser(pos, pos1, pos2, size, param2) - local key = del_laser(pos) - - local laser1 = minetest.add_entity(pos1, "techage:laser" .. size) - if laser1 then - local yaw = math.pi / 2 * (param2 + 1) - laser1:set_rotation({x = 0, y = yaw, z = 0}) - end - - local laser2 = minetest.add_entity(pos2, "techage:laser" .. size) - if laser2 then - param2 = (param2 + 2) % 4 -- flip dir - local yaw = math.pi / 2 * (param2 + 1) - laser2:set_rotation({x = 0, y = yaw, z = 0}) - end - - Entities[key] = {laser1, laser2} -end - -for _, size in ipairs(SIZES) do - minetest.register_entity("techage:laser" .. size, { - initial_properties = { - visual = "cube", - textures = { - "techage_laser.png", - "techage_laser.png", - "techage_laser.png", - "techage_laser.png", - "techage_laser.png", - "techage_laser.png", - }, - use_texture_alpha = true, - physical = false, - collide_with_objects = false, - pointable = false, - static_save = false, - visual_size = {x = size, y = 0.05, z = 0.05}, - glow = 14, - shaded = true, - }, - }) -end - -------------------------------------------------------------------------------- --- API functions -------------------------------------------------------------------------------- --- if force is not true, do not redraw the laser if nothing has changed -function techage.renew_laser(pos, force) - local mem = techage.get_mem(pos) - if force then - mem.peer_node_pos = nil - mem.param2 = nil - end - mem.param2 = mem.param2 or minetest.get_node(pos).param2 - local dir = minetest.facedir_to_dir(mem.param2) - local res, pos1, pos2 = get_positions(pos, mem, dir) - if pos1 then - local size, pos3, pos4 = get_laser_length_and_pos(pos1, pos2, dir) - if size then - add_laser(pos, pos3, pos4, size, mem.param2) - return res, pos1, pos2 - end - end - return res -end - -function techage.add_laser(pos, pos1, pos2) - local dir = vector.direction(pos1, pos2) - local param2 = minetest.dir_to_facedir(dir) - local size, pos3, pos4 = get_laser_length_and_pos(pos1, pos2, dir) - if size then - add_laser(pos, pos3, pos4, size, param2) - end -end - --- techage.del_laser(pos) -techage.del_laser = del_laser diff --git a/techage/basis/legacy.lua b/techage/basis/legacy.lua deleted file mode 100644 index 18d25a1..0000000 --- a/techage/basis/legacy.lua +++ /dev/null @@ -1,25 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - For the transition from v0.26 to v1.0 - -]]-- - -function techage.register_node_for_v1_transition(nodenames, on_node_load) - minetest.register_lbm({ - label = "[TechAge] V1 transition", - name = nodenames[1].."transition", - nodenames = nodenames, - run_at_every_load = false, - action = function(pos, node) - on_node_load(pos, node) - end - }) -end diff --git a/techage/basis/lib.lua b/techage/basis/lib.lua deleted file mode 100644 index 7eb89b8..0000000 --- a/techage/basis/lib.lua +++ /dev/null @@ -1,633 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Helper functions - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - --- Input data to generate the Param2ToDir table -local Input = { - 8,9,10,11, -- 1 - 16,17,18,19, -- 2 - 4,5,6,7, -- 3 - 12,13,14,15, -- 4 - 0,1,2,3, -- 5 - 20,21,22,23, -- 6 -} - --- Input data to turn a "facedir" block to the right/left -local ROTATION = { - {5,14,11,16}, -- x+ - {7,12,9,18}, -- x- - {0,1,2,3}, -- y+ - {22,21,20,23}, -- y- - {6,15,8,17}, -- z+ - {4,13,10,19}, -- z- -} - -local FACEDIR_TO_ROT = {[0] = - {x=0.000000, y=0.000000, z=0.000000}, - {x=0.000000, y=4.712389, z=0.000000}, - {x=0.000000, y=3.141593, z=0.000000}, - {x=0.000000, y=1.570796, z=0.000000}, - {x=4.712389, y=0.000000, z=0.000000}, - {x=3.141593, y=1.570796, z=1.570796}, - {x=1.570796, y=4.712389, z=4.712389}, - {x=3.141593, y=4.712389, z=4.712389}, - {x=1.570796, y=0.000000, z=0.000000}, - {x=0.000000, y=4.712389, z=1.570796}, - {x=4.712389, y=1.570796, z=4.712389}, - {x=0.000000, y=1.570796, z=4.712389}, - {x=0.000000, y=0.000000, z=1.570796}, - {x=4.712389, y=0.000000, z=1.570796}, - {x=0.000000, y=3.141593, z=4.712389}, - {x=1.570796, y=3.141593, z=4.712389}, - {x=0.000000, y=0.000000, z=4.712389}, - {x=1.570796, y=0.000000, z=4.712389}, - {x=0.000000, y=3.141593, z=1.570796}, - {x=4.712389, y=0.000000, z=4.712389}, - {x=0.000000, y=0.000000, z=3.141593}, - {x=0.000000, y=1.570796, z=3.141593}, - {x=0.000000, y=3.141593, z=3.141593}, - {x=0.000000, y=4.712389, z=3.141593}, -} - -local RotationViaYAxis = {} - -for _,row in ipairs(ROTATION) do - for i = 1,4 do - local val = row[i] - local left = row[i == 1 and 4 or i - 1] - local right = row[i == 4 and 1 or i + 1] - RotationViaYAxis[val] = {left, right} - end -end - -function techage.facedir_to_rotation(facedir) - return FACEDIR_TO_ROT[facedir] or FACEDIR_TO_ROT[0] -end - -function techage.param2_turn_left(param2) - return (RotationViaYAxis[param2] or RotationViaYAxis[0])[2] -end - -function techage.param2_turn_right(param2) - return (RotationViaYAxis[param2] or RotationViaYAxis[0])[1] -end - --- Roll a block in north direction (south is vice versa) -local RollNorth = { - {0,4,22,8}, - {1,5,23,9}, - {2,6,20,10}, - {3,7,21,11}, - {12,13,14,15}, - {16,19,18,17}, -} --- Roll a block in east direction (west is vice versa) -local RollEast = { - {0,12,20,16}, - {1,13,21,17}, - {2,14,22,18}, - {3,15,23,19}, - {4,7,6,5}, - {8,9,10,11}, -} - --- Generate a table for all facedir and param2 values: --- TurnUp[facedir][param2] = new_param2 -local TurnUp = {[0] = {}, {}, {}, {}} - -for i = 1,6 do - for j = 1,4 do - local idx = RollNorth[i][j] - TurnUp[0][idx] = RollNorth[i][j == 4 and 1 or j + 1] -- north - TurnUp[2][idx] = RollNorth[i][j == 1 and 4 or j - 1] -- south - - idx = RollEast[i][j] - TurnUp[1][idx] = RollEast[i][j == 4 and 1 or j + 1] -- east - TurnUp[3][idx] = RollEast[i][j == 1 and 4 or j - 1] -- west - end -end - --- facedir is from the players (0..3) --- param2 is from the node (0..23) -function techage.param2_turn_up(facedir, param2) - return TurnUp[facedir % 4][param2 % 24] -end - - -------------------------------------------------------------------------------- --- Rotate nodes around the center -------------------------------------------------------------------------------- -function techage.positions_center(lpos) - local c = {x=0, y=0, z=0} - for _,v in ipairs(lpos) do - c = vector.add(c, v) - end - c = vector.divide(c, #lpos) - c = vector.round(c) - c.y = 0 - return c -end - -function techage.rotate_around_axis(v, c, turn) - local dx, dz = v.x - c.x, v.z - c.z - if turn == "l" then - return { - x = c.x - dz, - y = v.y, - z = c.z + dx, - } - elseif turn == "r" then - return { - x = c.x + dz, - y = v.y, - z = c.z - dx, - } - elseif turn == "" then - return v - else -- turn 180 degree - return { - x = c.x - dx, - y = v.y, - z = c.z - dz, - } - end -end - --- Function returns a list ẃith the new node positions --- turn is one of "l", "r", "2l", "2r" --- cpos is the center pos (optional) -function techage.rotate_around_center(nodes1, turn, cpos) - cpos = cpos or techage.positions_center(nodes1) - local nodes2 = {} - for _,pos in ipairs(nodes1) do - nodes2[#nodes2 + 1] = techage.rotate_around_axis(pos, cpos, turn) - end - return nodes2 -end - - -------------------------------------------------------------------------------- --- Helper functions -------------------------------------------------------------------------------- --- allowed for digging -local SimpleNodes = {} - --- translation from param2 to dir (out of the node upwards) -local Param2Dir = {} -for idx,val in ipairs(Input) do - Param2Dir[val] = math.floor((idx - 1) / 4) + 1 -end - --- used by lamps and power switches -function techage.determine_node_bottom_as_dir(node) - return tubelib2.Turn180Deg[Param2Dir[node.param2] or 1] -end - -function techage.determine_node_top_as_dir(node) - return Param2Dir[node.param2] or 1 -end - --- rotation rules (screwdriver) for wallmounted "facedir" nodes -function techage.rotate_wallmounted(param2) - local offs = math.floor(param2 / 4) * 4 - local rot = ((param2 % 4) + 1) % 4 - return offs + rot -end - -function techage.in_range(val, min, max) - val = tonumber(val) - if val < min then return min end - if val > max then return max end - return val -end - -function techage.one_of(val, selection) - for _,v in ipairs(selection) do - if val == v then return val end - end - return selection[1] -end - -function techage.index(list, x) - for idx, v in pairs(list) do - if v == x then return idx end - end - return nil -end - -function techage.in_list(list, x) - for idx, v in pairs(list) do - if v == x then return true end - end - return false -end - -function techage.add_to_set(set, x) - if not techage.index(set, x) then - table.insert(set, x) - end -end - --- techage.tbl_filter({"a", "b", "c", "d"}, function(v, k, t) return v >= "c" end) --> {"c","d"} -techage.tbl_filter = function(t, filterIter) - local out = {} - - for k, v in pairs(t) do - if filterIter(v, k, t) then out[k] = v end - end - - return out -end - -function techage.get_node_lvm(pos) - local node = minetest.get_node_or_nil(pos) - if node then - return node - end - local vm = minetest.get_voxel_manip() - local MinEdge, MaxEdge = vm:read_from_map(pos, pos) - local data = vm:get_data() - local param2_data = vm:get_param2_data() - local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) - local idx = area:indexp(pos) - if data[idx] and param2_data[idx] then - return { - name = minetest.get_name_from_content_id(data[idx]), - param2 = param2_data[idx] - } - end - return {name="ignore", param2=0} -end - -function techage.is_air_like(name) - local ndef = minetest.registered_nodes[name] - if ndef and ndef.buildable_to then - return true - end - return false -end - --- returns true, if node can be dug, otherwise false -function techage.can_dig_node(name, ndef) - if not ndef then return false end - if SimpleNodes[name] ~= nil then - return SimpleNodes[name] - end - - if ndef.groups and ndef.groups.techage_door == 1 then - SimpleNodes[name] = true - return true - end - if name == "ignore" then - SimpleNodes[name] = false - return false - end - if name == "air" then - SimpleNodes[name] = true - return true - end - if ndef.buildable_to == true then - SimpleNodes[name] = true - return true - end - -- don't remove nodes with some intelligence or undiggable nodes - if ndef.drop == "" then - SimpleNodes[name] = false - return false - end - if ndef.diggable == false then - SimpleNodes[name] = false - return false - end - if ndef.after_dig_node then - SimpleNodes[name] = false - return false - end - -- add it to the white list - SimpleNodes[name] = true - return true -end - --- Simple nodes -function techage.register_simple_nodes(node_names, is_valid) - if is_valid == nil then is_valid = true end - for _,name in ipairs(node_names or {}) do - SimpleNodes[name] = is_valid - end -end - -techage.dig_states = { - NOT_DIGGABLE = 1, - INV_FULL = 2, - DUG = 3 -} - --- Digs a node like a player would by utilizing a fake player object. --- add_to_inv(itemstacks) is a method that should try to add the dropped stacks to an appropriate inventory. --- The node will only be dug, if add_to_inv(itemstacks) returns true. -function techage.dig_like_player(pos, fake_player, add_to_inv) - local node = techage.get_node_lvm(pos) - local ndef = minetest.registered_nodes[node.name] - if not ndef or ndef.diggable == false or (ndef.can_dig and not ndef.can_dig(pos, fake_player)) then - return techage.dig_states.NOT_DIGGABLE - end - local drop_as_strings = minetest.get_node_drops(node) - local drop_as_stacks = {} - for _,itemstring in ipairs(drop_as_strings) do - drop_as_stacks[#drop_as_stacks+1] = ItemStack(itemstring) - end - local meta = M(pos) - if ndef.preserve_metadata then - ndef.preserve_metadata(pos, node, meta, drop_as_stacks) - end - - if add_to_inv(drop_as_stacks) then - local oldmeta = meta:to_table() - minetest.remove_node(pos) - - if ndef.after_dig_node then - ndef.after_dig_node(pos, node, oldmeta, fake_player) - end - return techage.dig_states.DUG - end - return techage.dig_states.INV_FULL -end - -local function handle_drop(drop) - -- To keep it simple, return only the item with the lowest rarity - if drop.items then - local rarity = 9999 - local name - for idx,item in ipairs(drop.items) do - if item.rarity and item.rarity < rarity then - rarity = item.rarity - name = item.items[1] -- take always the first item - else - return item.items[1] -- take always the first item - end - end - return name - end - return false -end - --- returns the node name, if node can be dropped, otherwise nil -function techage.dropped_node(node, ndef) - if node.name == "air" then return end - --if ndef.buildable_to == true then return end - if not ndef.diggable then return end - if ndef.drop == "" then return end - if type(ndef.drop) == "table" then - return handle_drop(ndef.drop) - end - return ndef.drop or node.name -end - --- needed for windmill plants -local function determine_ocean_ids() - techage.OceanIdTbl = {} - for name, _ in pairs(minetest.registered_biomes) do - if string.find(name, "ocean") then - local id = minetest.get_biome_id(name) - --print(id, name) - techage.OceanIdTbl[id] = true - end - end -end - -determine_ocean_ids() - --- check if natural water is on given position (water placed by player has param2 = 1) -function techage.is_ocean(pos) - if pos.y > 1 then return false end - local node = techage.get_node_lvm(pos) - if node.name ~= "default:water_source" then return false end - if node.param2 == 1 then return false end - return true -end - -function techage.item_image(x, y, itemname, count) - local name, size = unpack(string.split(itemname, " ")) - size = count and count or size - size = tonumber(size) or 1 - local label = "" - local text = minetest.formspec_escape(ItemStack(itemname):get_description()) - local tooltip = "tooltip["..x..","..y..";1,1;"..text..";#0C3D32;#FFFFFF]" - - if minetest.registered_tools[name] and size > 1 then - local offs = 0 - if size < 10 then - offs = 0.65 - elseif size < 100 then - offs = 0.5 - elseif size < 1000 then - offs = 0.35 - else - offs = 0.2 - end - label = "label["..(x + offs)..","..(y + 0.45)..";"..tostring(size).."]" - end - - return "box["..x..","..y..";0.85,0.9;#808080]".. - "item_image["..x..","..y..";1,1;"..itemname.."]".. - tooltip.. - label -end - -function techage.item_image_small(x, y, itemname, tooltip_prefix) - local name = unpack(string.split(itemname, " ")) - local tooltip = "" - local ndef = minetest.registered_nodes[name] or minetest.registered_items[name] or minetest.registered_craftitems[name] - - if ndef and ndef.description then - local text = minetest.formspec_escape(ndef.description) - tooltip = "tooltip["..x..","..y..";0.8,0.8;"..tooltip_prefix..": "..text..";#0C3D32;#FFFFFF]" - end - - return "box["..x..","..y..";0.65,0.7;#808080]".. - "item_image["..x..","..y..";0.8,0.8;"..name.."]".. - tooltip -end - -function techage.vector_dump(posses) - local t = {} - for _,pos in ipairs(posses) do - t[#t + 1] = minetest.pos_to_string(pos) - end - return table.concat(t, " ") -end - --- title bar help (width is the fornmspec width) -function techage.question_mark_help(width, tooltip) - local x = width- 0.6 - return "label["..x..",-0.1;"..minetest.colorize("#000000", minetest.formspec_escape("[?]")).."]".. - "tooltip["..x..",-0.1;0.5,0.5;"..tooltip..";#0C3D32;#FFFFFF]" -end - -function techage.wrench_tooltip(x, y) - local tooltip = S("Block has an\nadditional wrench menu") - return "image["..x.."," .. y .. ";0.5,0.5;techage_inv_wrench.png]" .. - "tooltip["..x..","..y..";0.5,0.5;"..tooltip..";#0C3D32;#FFFFFF]" -end - -techage.RegisteredMobsMods = {} - --- Register mobs mods for the move/fly controllers -function techage.register_mobs_mods(mod) - techage.RegisteredMobsMods[mod] = true -end - -function techage.beduino_signed_var(val) - val = val or 0 - return val >= 32768 and val - 0x10000 or val -end - -------------------------------------------------------------------------------- --- Terminal history buffer -------------------------------------------------------------------------------- -local BUFFER_DEPTH = 10 - -function techage.historybuffer_add(pos, s) - local mem = techage.get_mem(pos) - mem.hisbuf = mem.hisbuf or {} - - if #s > 2 then - table.insert(mem.hisbuf, s) - if #mem.hisbuf > BUFFER_DEPTH then - table.remove(mem.hisbuf, 1) - end - mem.hisbuf_idx = #mem.hisbuf + 1 - end -end - -function techage.historybuffer_priv(pos) - local mem = techage.get_mem(pos) - mem.hisbuf = mem.hisbuf or {} - mem.hisbuf_idx = mem.hisbuf_idx or 1 - - mem.hisbuf_idx = math.max(1, mem.hisbuf_idx - 1) - return mem.hisbuf[mem.hisbuf_idx] -end - -function techage.historybuffer_next(pos) - local mem = techage.get_mem(pos) - mem.hisbuf = mem.hisbuf or {} - mem.hisbuf_idx = mem.hisbuf_idx or 1 - - mem.hisbuf_idx = math.min(#mem.hisbuf, mem.hisbuf_idx + 1) - return mem.hisbuf[mem.hisbuf_idx] -end - -------------------------------------------------------------------------------- --- Player TA5 Experience Points -------------------------------------------------------------------------------- -function techage.get_expoints(player) - if player and player.get_meta then - local meta = player:get_meta() - if meta then - return meta:get_int("techage_ex_points") - end - end -end - --- Can only be used from one collider -function techage.add_expoint(player, number) - if player and player.get_meta then - local meta = player:get_meta() - if meta then - if not meta:contains("techage_collider_number") then - meta:set_string("techage_collider_number", number) - end - if meta:get_string("techage_collider_number") == number then - meta:set_int("techage_ex_points", meta:get_int("techage_ex_points") + 1) - return true - else - minetest.chat_send_player(player:get_player_name(), "[techage] More than one collider is not allowed!") - return false - end - end - end -end - --- Delete number with: `//lua minetest.get_player_by_name(""):get_meta():set_string("techage_collider_number", "")` - -function techage.on_remove_collider(player) - if player and player.get_meta then - local meta = player:get_meta() - if meta then - meta:set_string("techage_collider_number", "") - end - end -end - -function techage.set_expoints(player, ex_points) - if player and player.get_meta then - local meta = player:get_meta() - if meta then - meta:set_int("techage_ex_points", ex_points) - return true - end - end -end - -------------------------------------------------------------------------------- --- Scheduler for a table-based, cyclic call of functions -------------------------------------------------------------------------------- -local TABLE_SIZE = 256 -techage.scheduler = {} - -local function add_to_table(tbl, i, func) - while i < TABLE_SIZE do - if not tbl[i] then - tbl[i] = func - return i + 1 - end - i = i + 1 - end - return i -end - -function techage.scheduler.init(pos) - local mem = techage.get_mem(pos) - mem.sched_idx = 0 -end - --- tFunc : (empty) table of functions --- call_rate : (2,4,8,16,32,64 or 128) --- offset : 0-128 --- func : function to be called -function techage.scheduler.register(tFunc, call_rate, offset, func) - local i= 0 - while i < TABLE_SIZE do - if (i % call_rate) == offset then - i = add_to_table(tFunc, i, func) - else - i = i + 1 - end - end - return tFunc -end - --- tFunc : table of functions --- default : default function (optional) --- Returns a function to be called be the callee -function techage.scheduler.get(pos, tFunc, default) - local mem = techage.get_mem(pos) - mem.sched_idx = ((mem.sched_idx or 0) + 1) % TABLE_SIZE - return tFunc[mem.sched_idx] or default or function() end -end diff --git a/techage/basis/liquid_lib.lua b/techage/basis/liquid_lib.lua deleted file mode 100644 index 9df0975..0000000 --- a/techage/basis/liquid_lib.lua +++ /dev/null @@ -1,278 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Liquid lib - -]]-- - -local M = minetest.get_meta -local S = techage.S -local P2S = minetest.pos_to_string -local LQD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).liquid end - -local BLOCKING_TIME = 0.3 -- 300ms - -techage.liquid = {} -local LiquidDef = {} -local IsLiquid = {} -local ContainerDef = {} - -local function help(x, y) - local tooltip = S("To add liquids punch\nthe tank\nwith a liquid container") - return "label["..x..","..y..";"..minetest.colorize("#000000", minetest.formspec_escape("[?]")).."]".. - "tooltip["..x..","..y..";0.5,0.5;"..tooltip..";#0C3D32;#FFFFFF]" -end - -function techage.liquid.formspec(pos, nvm, title) - title = title or S("Liquid Tank") - local itemname = "techage:liquid" - if nvm.liquid and nvm.liquid.amount and nvm.liquid.amount > 0 and nvm.liquid.name then - itemname = nvm.liquid.name.." "..nvm.liquid.amount - end - local name = minetest.get_node(pos).name - if name == "techage:ta4_tank" then - local meta = M(pos) - local public = dump((meta:get_int("public") or 0) == 1) - local keep_assignment = dump((meta:get_int("keep_assignment") or 0) == 1) - return "size[8,3.5]".. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[0.2,-0.1;"..minetest.colorize("#000000", title).."]".. - help(7.4, -0.1).. - techage.item_image(3.5, 1, itemname).. - "checkbox[0.1,2.5;public;"..S("Allow public access to the tank")..";"..public.."]".. - "checkbox[0.1,3;keep_assignment;"..S("keep assignment")..";"..keep_assignment.."]" - else - return "size[8,2]".. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[0.2,-0.1;"..minetest.colorize("#000000", title).."]".. - help(7.4, -0.1).. - techage.item_image(3.5, 1, itemname) - end -end - -function techage.liquid.is_empty(pos) - local nvm = techage.get_nvm(pos) - return not nvm.liquid or (nvm.liquid.amount or 0) <= 0 -end - -techage.liquid.recv_message = { - on_recv_message = function(pos, src, topic, payload) - if topic == "load" then - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - return techage.power.percent(LQD(pos).capa, nvm.liquid.amount), nvm.liquid.amount - elseif topic == "size" then - return LQD(pos).capa - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 128 then - return 0, techage.get_node_lvm(pos).name - elseif topic == 134 then - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - if payload[1] == 1 then - local value = techage.power.percent(LQD(pos).capa, nvm.liquid.amount) - return 0, {math.floor(value + 0.5)} - else - return 0, {nvm.liquid.amount} - end - else - return 2, "" - end - end, -} - --- like: register_liquid("techage:ta3_barrel_oil", "techage:ta3_barrel_empty", 10, "techage:oil") -function techage.register_liquid(full_container, empty_container, container_size, inv_item) - LiquidDef[full_container] = {container = empty_container, size = container_size, inv_item = inv_item} - ContainerDef[empty_container] = ContainerDef[empty_container] or {} - ContainerDef[empty_container][inv_item] = full_container - IsLiquid[inv_item] = true - if inv_item == "techage:water" and container_size == 1 then - techage.register_water_bucket(empty_container, full_container) - end -end - -local function get_liquid_def(full_container) - return LiquidDef[full_container] -end - -local function get_container_def(container_name) - return ContainerDef[container_name] -end - -local function is_container_empty(container_name) - return ContainerDef[container_name] -end - -local function get_full_container(empty_container, inv_item) - return ContainerDef[empty_container] and ContainerDef[empty_container][inv_item] -end - --- used by filler -local function fill_container(pos, inv, empty_container) - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - local full_container = get_full_container(empty_container, nvm.liquid.name) - if empty_container and full_container then - local ldef = get_liquid_def(full_container) - if ldef and nvm.liquid.amount - ldef.size >= 0 then - if inv:room_for_item("dst", {name = full_container}) then - inv:add_item("dst", {name = full_container}) - nvm.liquid.amount = nvm.liquid.amount - ldef.size - if nvm.liquid.amount == 0 then - nvm.liquid.name = nil - end - return true - end - end - end - -- undo - inv:add_item("src", {name = empty_container}) - return false -end - --- used by filler -local function empty_container(pos, inv, full_container) - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - local ndef_lqd = LQD(pos) - local tank_size = (ndef_lqd and ndef_lqd.capa) or 0 - local ldef = get_liquid_def(full_container) - if ldef and (not nvm.liquid.name or ldef.inv_item == nvm.liquid.name) then - if nvm.liquid.amount + ldef.size <= tank_size then - if inv:room_for_item("dst", {name = ldef.container}) then - inv:add_item("dst", {name = ldef.container}) - nvm.liquid.amount = nvm.liquid.amount + ldef.size - nvm.liquid.name = ldef.inv_item - return true - end - end - end - -- undo - inv:add_item("src", {name = full_container}) - return false -end - --- check if the wielded empty container can be replaced by a full --- container and added to the players inventory -local function fill_on_punch(nvm, empty_container, item_count, puncher) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - local full_container = get_full_container(empty_container, nvm.liquid.name) - if empty_container and full_container then - local item = {name = full_container} - local ldef = get_liquid_def(full_container) - if ldef and nvm.liquid.amount - ldef.size >= 0 then - if item_count > 1 then -- can't be simply replaced? - -- check for extra free space - local inv = puncher:get_inventory() - if inv:room_for_item("main", {name = full_container}) then - -- add full container and return - -- the empty once - 1 - inv:add_item("main", {name = full_container}) - item = {name = empty_container, count = item_count - 1} - else - return -- no free space - end - end - nvm.liquid.amount = nvm.liquid.amount - ldef.size - if nvm.liquid.amount == 0 then - nvm.liquid.name = nil - end - return item -- to be added to the players inv. - end - elseif nvm.liquid.name and not IsLiquid[nvm.liquid.name] then - if empty_container == "" then - local count = math.max(nvm.liquid.amount, 99) - local name = nvm.liquid.name - nvm.liquid.amount = nvm.liquid.amount - count - if nvm.liquid.amount == 0 then - nvm.liquid.name = nil - end - return {name = name, count = count} - end - end -end - -local function legacy_items(full_container, item_count) - if full_container == "techage:isobutane" then - return {container = "", size = item_count, inv_item = full_container} - elseif full_container == "techage:oil_source" then - return {container = "", size = item_count, inv_item = full_container} - end -end - --- check if the wielded full container can be emptied into the tank -local function empty_on_punch(pos, nvm, full_container, item_count) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - local lqd_def = get_liquid_def(full_container) or legacy_items(full_container, item_count) - local ndef_lqd = LQD(pos) - if lqd_def and ndef_lqd then - local tank_size = ndef_lqd.capa or 0 - if not nvm.liquid.name or lqd_def.inv_item == nvm.liquid.name then - if nvm.liquid.amount + lqd_def.size <= tank_size then - nvm.liquid.amount = nvm.liquid.amount + lqd_def.size - nvm.liquid.name = lqd_def.inv_item - return {name = lqd_def.container} - end - end - end -end - -function techage.liquid.on_punch(pos, node, puncher, pointed_thing) - local public = M(pos):get_int("public") == 1 - if not public and minetest.is_protected(pos, puncher:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.blocking_time = mem.blocking_time or 0 - if mem.blocking_time > techage.SystemTime then - return - end - - local wielded_item = puncher:get_wielded_item():get_name() - local item_count = puncher:get_wielded_item():get_count() - local new_item = fill_on_punch(nvm, wielded_item, item_count, puncher) - or empty_on_punch(pos, nvm, wielded_item, item_count) - if new_item then - puncher:set_wielded_item(new_item) - M(pos):set_string("formspec", techage.fuel.formspec(pos, nvm)) - mem.blocking_time = techage.SystemTime + BLOCKING_TIME - return - end -end - -function techage.liquid.get_liquid_amount(nvm) - if nvm.liquid and nvm.liquid.amount then - return nvm.liquid.amount - end - return 0 -end - -techage.liquid.get_liquid_def = get_liquid_def -techage.liquid.get_container_def = get_container_def -techage.liquid.is_container_empty = is_container_empty -techage.liquid.get_full_container = get_full_container -techage.liquid.fill_container = fill_container -techage.liquid.empty_container = empty_container -techage.liquid.fill_on_punch = fill_on_punch -techage.liquid.empty_on_punch = empty_on_punch diff --git a/techage/basis/manual.lua b/techage/basis/manual.lua deleted file mode 100644 index d8e599c..0000000 --- a/techage/basis/manual.lua +++ /dev/null @@ -1,91 +0,0 @@ -techage.manual_DE = {} - -techage.manual_DE.aTitel = { - "1,SaferLua Controller with Periphery", - "2,SaferLua Controller", - "3,Central Server", - "3,SaferLua Controller Terminal", -} - -techage.manual_DE.aText = { - "", - - "The SaferLua Controller is a small computer programmable in Lua to control your machinery.\n".. - - "In contrast to the SmartLine Controller this controller allows to implement larger and smarter control and monitoring tasks.\n".. - - "\n".. - - "The controller can be programmed in SaferLua a subset of Lua for safe and secure Lua programs the Minetest server.\n".. - - "\n", - - "The Server node can be placed everywhere. It can also be used for communication purposes between several Controllers.\n".. - - "The Server has a form to enter valid usernames for server access.\n".. - - "\n".. - - "The controller has a menu form with the following tabs:\n".. - - "\n".. - - " - the 'init' tab for the initialization code block\n".. - - " - the 'func' tab for the Lua functions\n".. - - " - the 'loop' tab for the main code block\n".. - - " - the 'outp' tab for debugging outputs via '$print()'\n".. - - " - the 'notes' tab for your code snippets or other notes\n".. - - " - the 'help' tab with information to the available commands\n".. - - "\n".. - - "\n".. - - "The controller needs battery power to work.\n".. - - "\n", - - "The Terminal is used to send command strings to the controller.\n".. - - "In turn\\, the controller can send text strings to the terminal.\n".. - - "The Terminal has a help system for internal commands. Its supports the following commands:\n".. - - "\n".. - - " - 'clear' = clear the screen\n".. - - " - 'help' = output this message\n".. - - " - 'pub' = switch terminal to public use (everybody can enter commands)\n".. - - " - 'priv' = switch terminal to private use (only the owner can enter commands)\n".. - - " - 'send on/off' = send on/off event to e. g. lamps (for testing purposes)\n".. - - " - 'msg ' = send a text message to another Controller (for testing purposes)\n".. - - "\n".. - - "\n", - -} - -techage.manual_DE.aItemName = { - "", - "", - "", - "", -} - -techage.manual_DE.aPlanTable = { - "", - "", - "", - "", -} diff --git a/techage/basis/mark.lua b/techage/basis/mark.lua deleted file mode 100644 index 8058b1f..0000000 --- a/techage/basis/mark.lua +++ /dev/null @@ -1,98 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - mark.lua: - -]]-- - -local marker_region = {} - -function techage.unmark_region(name) - if marker_region[name] ~= nil then --marker already exists - --wip: make the area stay loaded somehow - for _, entity in ipairs(marker_region[name]) do - entity:remove() - end - marker_region[name] = nil - end -end - -function techage.mark_region(name, pos1, pos2, owner, secs) - - if not name or not pos1 or not pos2 then return end - - techage.unmark_region(name) - - local thickness = 0.2 - local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 - local markers = {} - - --XY plane markers - for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do - local marker = minetest.add_entity({x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z}, "techage:region_cube") - if marker ~= nil then - marker:set_properties({ - visual_size={x=sizex * 2, y=sizey * 2}, - --collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness}, - collisionbox = {0,0,0, 0,0,0}, - }) - if owner then - marker:set_nametag_attributes({text = owner}) - end - marker:get_luaentity().player_name = name - table.insert(markers, marker) - end - end - - --YZ plane markers - for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do - local marker = minetest.add_entity({x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5}, "techage:region_cube") - if marker ~= nil then - marker:set_properties({ - visual_size={x=sizez * 2, y=sizey * 2}, - --collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez}, - collisionbox = {0,0,0, 0,0,0}, - }) - marker:set_yaw(math.pi / 2) - marker:get_luaentity().player_name = name - table.insert(markers, marker) - end - end - - marker_region[name] = markers - minetest.after(secs or 20, techage.unmark_region, name) -end - -function techage.switch_region(name, pos1, pos2) - if marker_region[name] ~= nil then --marker already exists - techage.unmark_region(name) - else - techage.mark_region(name, pos1, pos2) - end -end - -minetest.register_entity(":techage:region_cube", { - initial_properties = { - visual = "upright_sprite", - textures = {"techage_cube_mark.png"}, - use_texture_alpha = true, - physical = false, - glow = 12, - }, - on_step = function(self, dtime) - if marker_region[self.player_name] == nil then - self.object:remove() - return - end - end, - on_punch = function(self, hitter) - techage.unmark_region(self.player_name) - end, -}) diff --git a/techage/basis/mark2.lua b/techage/basis/mark2.lua deleted file mode 100644 index ab1124e..0000000 --- a/techage/basis/mark2.lua +++ /dev/null @@ -1,128 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - mark.lua: - -]]-- - -local marker_region = {} - -function techage.unmark_position(name) - if marker_region[name] ~= nil then --marker already exists - --wip: make the area stay loaded somehow - for _, entity in ipairs(marker_region[name]) do - entity:remove() - end - marker_region[name] = nil - end -end - -function techage.mark_position(name, pos, nametag, color, time) - local marker = minetest.add_entity(pos, "techage:position_cube") - if marker ~= nil then - marker:set_nametag_attributes({color = color, text = nametag}) - marker:get_luaentity().player_name = name - if not marker_region[name] then - marker_region[name] = {} - end - marker_region[name][#marker_region[name] + 1] = marker - end - minetest.after(time or 30, techage.unmark_position, name) -end - -function techage.mark_cube(name, pos1, pos2, nametag, color, time) - local new_x = pos1.x + ((pos2.x - pos1.x) / 2) - local new_y = pos1.y + ((pos2.y - pos1.y) / 2) - local new_z = pos1.z + ((pos2.z - pos1.z) / 2) - local size_x = math.abs(pos1.x - pos2.x) + 1 - local size_y = math.abs(pos1.y - pos2.y) + 1 - local size_z = math.abs(pos1.z - pos2.z) + 1 - - local marker = minetest.add_entity( - {x = new_x, y = new_y, z = new_z}, "techage:position_cube") - if marker ~= nil then - marker:set_nametag_attributes({color = color, text = nametag, visual_size = {x = size_x, y = size_y, z = size_z}}) - marker:get_luaentity().player_name = name - marker:set_properties({visual_size = {x = size_x, y = size_y, z = size_z}}) - if not marker_region[name] then - marker_region[name] = {} - end - marker_region[name][#marker_region[name] + 1] = marker - end - minetest.after(time or 30, techage.unmark_position, name) -end - -minetest.register_entity(":techage:position_cube", { - initial_properties = { - visual = "cube", - textures = { - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - }, - use_texture_alpha = true, - physical = false, - visual_size = {x = 1.1, y = 1.1}, - collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, - glow = 8, - }, - on_step = function(self, dtime) - if marker_region[self.player_name] == nil then - self.object:remove() - return - end - end, - on_punch = function(self, hitter) - techage.unmark_position(self.player_name) - end, -}) - -function techage.mark_side(name, pos, dir, nametag, color, time) - local v = vector.multiply(tubelib2.Dir6dToVector[dir or 0], 0.7) - local pos2 = vector.add(pos, v) - - local marker = minetest.add_entity(pos2, "techage:position_side") - if marker ~= nil then - marker:set_nametag_attributes({color = color, text = nametag}) - marker:get_luaentity().player_name = name - if dir == 2 or dir == 4 then - marker:setyaw(math.pi / 2) - end - - if not marker_region[name] then - marker_region[name] = {} - end - marker_region[name][#marker_region[name] + 1] = marker - end - minetest.after(time or 30, techage.unmark_position, name) -end - -minetest.register_entity(":techage:position_side", { - initial_properties = { - visual = "upright_sprite", - textures = {"techage_side_mark.png"}, - physical = false, - visual_size = {x = 1.1, y = 1.1, z = 1.1}, - collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, - glow = 12, - }, - on_step = function(self, dtime) - if marker_region[self.player_name] == nil then - self.object:remove() - return - end - end, - on_punch = function(self, hitter) - techage.unmark_position(self.player_name) - end, -}) diff --git a/techage/basis/mark_lib.lua b/techage/basis/mark_lib.lua deleted file mode 100644 index 40dee56..0000000 --- a/techage/basis/mark_lib.lua +++ /dev/null @@ -1,130 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Block marker lib for door/move/fly controller - -]]-- - -local MAX_NUM = 128 -local marker = {} - -local MarkedNodes = {} -- t[player] = {{entity, pos},...} -local MaxNumber = {} -local CurrentPos -- to mark punched entities - -local function unmark_position(name, pos) - pos = vector.round(pos) - for idx,item in ipairs(MarkedNodes[name] or {}) do - if vector.equals(pos, item.pos) then - item.entity:remove() - table.remove(MarkedNodes[name], idx) - CurrentPos = pos - return - end - end -end - -function marker.unmark_all(name) - for _,item in ipairs(MarkedNodes[name] or {}) do - item.entity:remove() - end - MarkedNodes[name] = nil -end - -local function mark_position(name, pos) - pos = vector.round(pos) - if not CurrentPos or not vector.equals(pos, CurrentPos) then -- entity not punched? - if #MarkedNodes[name] < MaxNumber[name] then - local entity = minetest.add_entity(pos, "techage:block_marker") - if entity ~= nil then - entity:get_luaentity().player_name = name - table.insert(MarkedNodes[name], {pos = pos, entity = entity}) - end - CurrentPos = nil - return true - end - end - CurrentPos = nil -end - -function marker.get_poslist(name) - local idx = 0 - local lst = {} - for _,item in ipairs(MarkedNodes[name] or {}) do - table.insert(lst, item.pos) - idx = idx + 1 - if idx >= MAX_NUM then break end - end - return lst -end - -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - if puncher and puncher:is_player() then - local name = puncher:get_player_name() - - if not MarkedNodes[name] then - return - end - - mark_position(name, pointed_thing.under) - end -end) - -function marker.start(name, max_num) - MaxNumber[name] = max_num or 99 - MarkedNodes[name] = {} -end - -function marker.stop(name) - MarkedNodes[name] = nil - MaxNumber[name] = nil -end - -minetest.register_on_leaveplayer(function(ObjectRef, timed_out) - if ObjectRef and ObjectRef:is_player() then - local name = ObjectRef:get_player_name() - marker.unmark_all(name) - end -end) - - -minetest.register_entity(":techage:block_marker", { - initial_properties = { - visual = "cube", - textures = { - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - }, - physical = false, - visual_size = {x=1.1, y=1.1}, - collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, - glow = 8, - }, - on_step = function(self, dtime) - self.ttl = (self.ttl or 2400) - 1 - if self.ttl <= 0 then - local pos = self.object:get_pos() - unmark_position(self.player_name, pos) - end - end, - on_punch = function(self, hitter) - local pos = self.object:get_pos() - local name = hitter:get_player_name() - if name == self.player_name then - unmark_position(name, pos) - end - end, -}) - -return marker diff --git a/techage/basis/node_states.lua b/techage/basis/node_states.lua deleted file mode 100644 index ac7373f..0000000 --- a/techage/basis/node_states.lua +++ /dev/null @@ -1,561 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - A state model/class for TechAge nodes. - -]]-- - - ---[[ - -Node states: - - +-----------------------------------+ +------------+ - | | | | - | V V | - | +---------+ | - | | | | - | +---------| STOPPED | | - | | | | | - | button | +---------+ | - | | ^ | - button | V | button | - | +---------+ | | button - | +--------->| |---------+ | - | | power | RUNNING | | - | | +------| |---------+ | - | | | +---------+ | | - | | | ^ | | | - | | | | | | | - | | V | V V | - | +---------+ +----------+ +---------+ | - | | | | | | | | - +---| NOPOWER | | STANDBY/ | | FAULT |----------+ - | | | BLOCKED | | | - +---------+ +----------+ +---------+ - - - | cycle time operational needs power - +---------+------------+-------------+------------- - | RUNNING normal yes yes - | BLOCKED long yes no - | STANDBY long yes no - | NOPOWER long no no - | FAULT none no no - | STOPPED none no no - -Node nvm data: - "techage_state" - node state, like "RUNNING" - "techage_countdown" - countdown to standby mode -]]-- - --- 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 -local N = techage.get_node_lvm - -local MAX_CYCLE_TIME = 20 - --- --- TechAge machine states --- - -techage.RUNNING = 1 -- in normal operation/turned on -techage.BLOCKED = 2 -- a pushing node is blocked due to a full destination inventory -techage.STANDBY = 3 -- nothing to do (e.g. no input items), or node (world) not loaded -techage.NOPOWER = 4 -- only for power consuming nodes, no operation -techage.FAULT = 5 -- any fault state (e.g. wrong source items), which can be fixed by the player -techage.STOPPED = 6 -- not operational/turned off -techage.UNLOADED = 7 -- Map block unloaded -techage.INACTIVE = 8 -- Map block loaded but node is not actively working - -techage.StatesImg = { - "techage_inv_button_on.png", - "techage_inv_button_warning.png", - "techage_inv_button_standby.png", - "techage_inv_button_nopower.png", - "techage_inv_button_error.png", - "techage_inv_button_off.png", -} - -local function error(pos, msg) - minetest.log("error", "[TA states] "..msg.." at "..S(pos).." "..N(pos).name) -end - --- Return state button image for the node inventory -function techage.state_button(state) - if state and state < 7 and state > 0 then - return techage.StatesImg[state] - end - return "techage_inv_button_off.png" -end - -function techage.get_power_image(pos, nvm) - local node = techage.get_node_lvm(pos) - local s = "3" -- electrical power - if string.find(node.name, "techage:ta2") then - s = "2" -- axles power - end - return "techage_inv_powerT"..s..".png" -end - --- State string based on button states -techage.StateStrings = {"running", "blocked", "standby", "nopower", "fault", "stopped"} - --- --- Local States --- -local RUNNING = techage.RUNNING -local BLOCKED = techage.BLOCKED -local STANDBY = techage.STANDBY -local NOPOWER = techage.NOPOWER -local FAULT = techage.FAULT -local STOPPED = techage.STOPPED - - --- --- NodeStates Class Functions --- -techage.NodeStates = {} -local NodeStates = techage.NodeStates - -local function can_start(pos, nvm) - --if false, node goes in FAULT - return true -end - -local function has_power(pos, nvm) - --if false, node goes in NOPOWER - return true -end - -local function swap_node(pos, new_name, old_name) - local node = techage.get_node_lvm(pos) - if node.name == new_name then - return - end - if node.name == old_name then - node.name = new_name - minetest.swap_node(pos, node) - end -end - --- true if node_timer should be executed -function techage.is_operational(nvm) - local state = nvm.techage_state or STOPPED - return state < NOPOWER -end - -function techage.is_running(nvm) - return (nvm.techage_state or STOPPED) == RUNNING -end - --- consumes power -function techage.needs_power(nvm) - local state = nvm.techage_state or STOPPED - return state == RUNNING or state == NOPOWER -end - --- consumes power -function techage.needs_power2(state) - state = state or STOPPED - return state == RUNNING or state == NOPOWER -end - -function techage.get_state_string(nvm) - return techage.StateStrings[nvm.techage_state or STOPPED] -end - -function NodeStates:new(attr) - local o = { - -- mandatory - cycle_time = attr.cycle_time, -- for running state - standby_ticks = attr.standby_ticks, -- for standby state - -- optional - countdown_ticks = attr.countdown_ticks or 1, - node_name_passive = attr.node_name_passive, - node_name_active = attr.node_name_active, - infotext_name = attr.infotext_name, - has_power = attr.has_power or has_power, - can_start = attr.can_start or can_start, - start_node = attr.start_node, - stop_node = attr.stop_node, - formspec_func = attr.formspec_func, - on_state_change = attr.on_state_change, - quick_start = attr.quick_start, - } - setmetatable(o, self) - self.__index = self - return o -end - -function NodeStates:node_init(pos, nvm, number) - nvm.techage_state = STOPPED - M(pos):set_string("node_number", number) - if self.infotext_name then - M(pos):set_string("infotext", self.infotext_name.." "..number..": stopped") - end - if self.formspec_func then - M(pos):set_string("formspec", self.formspec_func(self, pos, nvm)) - end -end - --- to be used to re-start the timer outside of node_timer() -local function start_timer_delayed(pos, cycle_time) - local t = minetest.get_node_timer(pos) - t:stop() - if cycle_time > 0.9 then - minetest.after(0.1, t.start, t, cycle_time) - else - error(pos, "invalid cycle_time") - end -end - -function NodeStates:stop(pos, nvm) - local state = nvm.techage_state or STOPPED - nvm.techage_state = STOPPED - if self.stop_node then - self.stop_node(pos, nvm, state) - end - if self.node_name_passive then - swap_node(pos, self.node_name_passive, self.node_name_active) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": stopped") - end - if self.formspec_func then - nvm.ta_state_tooltip = "stopped" - M(pos):set_string("formspec", self.formspec_func(self, pos, nvm)) - end - if self.on_state_change then - self.on_state_change(pos, state, STOPPED) - end - if minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):stop() - end - return true -end - -function NodeStates:start(pos, nvm) - local state = nvm.techage_state or STOPPED - if state ~= RUNNING and state ~= FAULT then - local res = self.can_start(pos, nvm, state) - if res ~= true then - self:fault(pos, nvm, res) - return false - end - if not self.has_power(pos, nvm, state) then - self:nopower(pos, nvm) - return false - end - nvm.techage_state = RUNNING - if self.start_node then - self.start_node(pos, nvm, state) - end - nvm.techage_countdown = self.countdown_ticks - if self.node_name_active then - swap_node(pos, self.node_name_active, self.node_name_passive) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": running") - end - if self.formspec_func then - nvm.ta_state_tooltip = "running" - M(pos):set_string("formspec", self.formspec_func(self, pos, nvm)) - end - if minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):stop() - end - if self.on_state_change then - self.on_state_change(pos, state, RUNNING) - end - start_timer_delayed(pos, self.cycle_time) - - if self.quick_start and state == STOPPED then - self.quick_start(pos, 0) - end - self:trigger_state(pos, nvm) - return true - end - return false -end - -function NodeStates:standby(pos, nvm, err_string) - local state = nvm.techage_state or STOPPED - if state == RUNNING or state == BLOCKED then - nvm.techage_state = STANDBY - if self.node_name_passive then - swap_node(pos, self.node_name_passive, self.node_name_active) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": "..(err_string or "standby")) - end - if self.formspec_func then - nvm.ta_state_tooltip = err_string or "standby" - M(pos):set_string("formspec", self.formspec_func(self, pos, nvm)) - end - if self.on_state_change then - self.on_state_change(pos, state, STANDBY) - end - start_timer_delayed(pos, self.cycle_time * self.standby_ticks) - return true - end - return false -end - --- special case of standby for pushing nodes -function NodeStates:blocked(pos, nvm, err_string) - local state = nvm.techage_state or STOPPED - if state == RUNNING then - nvm.techage_state = BLOCKED - if self.node_name_passive then - swap_node(pos, self.node_name_passive, self.node_name_active) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": "..(err_string or "blocked")) - end - if self.formspec_func then - nvm.ta_state_tooltip = err_string or "blocked" - M(pos):set_string("formspec", self.formspec_func(self, pos, nvm)) - end - if self.on_state_change then - self.on_state_change(pos, state, BLOCKED) - end - start_timer_delayed(pos, self.cycle_time * self.standby_ticks) - return true - end - return false -end - -function NodeStates:nopower(pos, nvm, err_string) - local state = nvm.techage_state or RUNNING - if state ~= NOPOWER then - nvm.techage_state = NOPOWER - if self.node_name_passive then - swap_node(pos, self.node_name_passive, self.node_name_active) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": "..(err_string or "no power")) - end - if self.formspec_func then - nvm.ta_state_tooltip = err_string or "no power" - M(pos):set_string("formspec", self.formspec_func(self, pos, nvm)) - end - if self.on_state_change then - self.on_state_change(pos, state, NOPOWER) - end - start_timer_delayed(pos, self.cycle_time * self.standby_ticks) - return true - end - return false -end - -function NodeStates:fault(pos, nvm, err_string) - local state = nvm.techage_state or STOPPED - err_string = err_string or "fault" - if state == RUNNING or state == STOPPED then - nvm.techage_state = FAULT - if self.node_name_passive then - swap_node(pos, self.node_name_passive, self.node_name_active) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": "..err_string) - end - if self.formspec_func then - nvm.ta_state_tooltip = err_string or "fault" - M(pos):set_string("formspec", self.formspec_func(self, pos, nvm)) - end - if self.on_state_change then - self.on_state_change(pos, state, FAULT) - end - minetest.get_node_timer(pos):stop() - return true - end - return false -end - -function NodeStates:get_state(nvm) - return nvm.techage_state or techage.STOPPED -end - --- keep the timer running? -function NodeStates:is_active(nvm) - local state = nvm.techage_state or STOPPED - return state < FAULT -end - -function NodeStates:start_if_standby(pos) - local nvm = techage.get_nvm(pos) - if nvm.techage_state == STANDBY then - self:start(pos, nvm) - end -end - --- To be called if node is idle. --- If countdown reaches zero, the node is set to STANDBY. -function NodeStates:idle(pos, nvm) - local countdown = (nvm.techage_countdown or 0) - 1 - nvm.techage_countdown = countdown - if countdown <= 0 then - self:standby(pos, nvm) - end -end - --- To be called after successful node action to raise the timer --- and keep the node in state RUNNING -function NodeStates:keep_running(pos, nvm, val) - -- set to RUNNING if not already done - if nvm.techage_state ~= RUNNING then - self:start(pos, nvm) - end - nvm.techage_countdown = val or 4 - nvm.last_active = minetest.get_gametime() -end - -function NodeStates:trigger_state(pos, nvm) - nvm.last_active = minetest.get_gametime() -end - --- Start/stop node based on button events. --- if function returns false, no button was pressed -function NodeStates:state_button_event(pos, nvm, fields) - if fields.state_button ~= nil then - local state = nvm.techage_state or STOPPED - if state == STOPPED or state == STANDBY or state == BLOCKED then - if not self:start(pos, nvm) and (state == STANDBY or state == BLOCKED) then - self:stop(pos, nvm) - end - elseif state == RUNNING or state == FAULT or state == NOPOWER then - self:stop(pos, nvm) - end - return true - end - return false -end - -function NodeStates:get_state_button_image(nvm) - local state = nvm.techage_state or STOPPED - return techage.state_button(state) -end - -function NodeStates:get_state_tooltip(nvm) - local tp = nvm.ta_state_tooltip or "" - return tp..";#0C3D32;#FFFFFF" -end - --- command interface -function NodeStates:on_receive_message(pos, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "on" then - self:start(pos, techage.get_nvm(pos)) - return true - elseif topic == "off" then - self:stop(pos, techage.get_nvm(pos)) - return true - elseif topic == "state" then - local node = minetest.get_node(pos) - if node.name == "ignore" then -- unloaded node? - return "unloaded" - elseif nvm.techage_state == RUNNING then - local ttl = (nvm.last_active or 0) + MAX_CYCLE_TIME - if ttl < minetest.get_gametime() then - return "inactive" - end - end - return techage.get_state_string(techage.get_nvm(pos)) - elseif topic == "fuel" then - return techage.fuel.get_fuel_amount(nvm) - elseif topic == "load" then - return techage.liquid.get_liquid_amount(nvm) - else - return "unsupported" - end -end - -function NodeStates:on_beduino_receive_cmnd(pos, topic, payload) - if topic == 1 then - if payload[1] == 0 then - self:stop(pos, techage.get_nvm(pos)) - return 0 - else - self:start(pos, techage.get_nvm(pos)) - return 0 - end - else - return 2 -- unknown or invalid topic - end -end - -function NodeStates:on_beduino_request_data(pos, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 128 then - return 0, techage.get_node_lvm(pos).name - elseif topic == 129 then - local node = minetest.get_node(pos) - if node.name == "ignore" then -- unloaded node? - return 0, {techage.UNLOADED} - elseif nvm.techage_state == RUNNING then - local ttl = (nvm.last_active or 0) + MAX_CYCLE_TIME - if ttl < minetest.get_gametime() then - return 0, {techage.INACTIVE} - end - end - return 0, {nvm.techage_state or STOPPED} - else - return 2, "" -- topic is unknown or invalid - end -end - -function NodeStates.get_beduino_state(pos) - local node = minetest.get_node(pos) - local nvm = techage.get_nvm(pos) - if node.name == "ignore" then -- unloaded node? - return 0, {techage.UNLOADED} - elseif nvm.techage_state == RUNNING then - local ttl = (nvm.last_active or 0) + MAX_CYCLE_TIME - if ttl < minetest.get_gametime() then - return 0, {techage.INACTIVE} - end - end - return 0, {nvm.techage_state or STOPPED} -end - --- restart timer -function NodeStates:on_node_load(pos) - local nvm = techage.get_nvm(pos) - local state = nvm.techage_state or STOPPED - if state == RUNNING then - minetest.get_node_timer(pos):start(self.cycle_time) - elseif state < FAULT then - minetest.get_node_timer(pos):start(self.cycle_time * self.standby_ticks) - end -end - -minetest.register_node("techage:defect_dummy", { - description = "Corrupted Node (to be replaced)", - tiles = { - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_defect.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_defect.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_defect.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_defect.png", - }, - drop = "", - groups = {cracky=2, crumbly=2, choppy=2, not_in_creative_inventory=1}, - is_ground_content = false, -}) diff --git a/techage/basis/node_store.lua b/techage/basis/node_store.lua deleted file mode 100644 index 9e823e2..0000000 --- a/techage/basis/node_store.lua +++ /dev/null @@ -1,183 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Data storage system for node related volatile and non-volatile data. - Non-volatile data is stored from time to time and at shutdown. - Volatile data is lost at every shutdown. - -]]-- - -local NvmStore = {} -- non-volatile data cache -local MemStore = {} -- volatile data cache - -local N = function(pos) print(minetest.pos_to_string(pos), minetest.get_node(pos).name) end - -------------------------------------------------------------------- --- Backend -------------------------------------------------------------------- -local MP = minetest.get_modpath("techage") -local techage_use_sqlite = minetest.settings:get_bool('techage_use_sqlite', false) -local backend - -if techage_use_sqlite then - backend = dofile(MP .. "/basis/nodedata_sqlite.lua") -else - backend = dofile(MP .. "/basis/nodedata_meta.lua") -end - --- return keys for mapblock and inner-mapblock addressing based on the node position -local function get_keys(pos) - local kx1, kx2 = math.floor(pos.x / 16) + 2048, pos.x % 16 - local ky1, ky2 = math.floor(pos.y / 16) + 2048, pos.y % 16 - local kz1, kz2 = math.floor(pos.z / 16) + 2048, pos.z % 16 - return kx1 * 4096 * 4096 + ky1 * 4096 + kz1, kx2 * 16 * 16 + ky2 * 16 + kz2 -end - -local function pos_from_key(key1, key2) - - local x1 = (math.floor(key1 / (4096 * 4096)) - 2048) * 16 - local y1 = ((math.floor(key1 / 4096) % 4096) - 2048) * 16 - local z1 = ((key1 % 4096) - 2048) * 16 - local x2 = math.floor(key2 / (16 * 16)) - local y2 = math.floor(key2 / 16) % 16 - local z2 = key2 % 16 - - return {x = x1 + x2, y = y1 + y2, z = z1 + z2} -end - -local function debug(key1, item) - --local pos1 = pos_from_key(key1, 0) - --local pos2 = {x = pos1.x + 15, y = pos1.y + 15, z = pos1.z + 15} - --techage.mark_region("mapblock", pos1, pos2, "singleplayer", 5) - - local cnt = 0 - for key2, tbl in pairs(item) do - if key2 ~= "in_use" then - cnt = cnt + 1 - --N(pos_from_key(key1, key2)) - end - end - print("mapblock", string.format("%09X", key1), cnt.." nodes") -end - - -------------------------------------------------------------------- --- Storage scheduler -------------------------------------------------------------------- -local CYCLE_TIME = 600 -- store data every 10 min -local JobQueue = {} -local first = 0 -local last = -1 -local SystemTime = 0 - -local function push(key) - last = last + 1 - JobQueue[last] = {key = key, time = SystemTime + CYCLE_TIME} -end - -local function pop() - if first > last then return end - local item = JobQueue[first] - if item.time <= SystemTime then - JobQueue[first] = nil -- to allow garbage collection - first = first + 1 - return item.key - end -end - --- check every 100 msec if any data has to be stored -minetest.register_globalstep(function(dtime) - SystemTime = SystemTime + dtime - local key = pop() - if key and NvmStore[key] then --- minetest.log("warning", --- string.format("[TA Storage] SystemTime = %.3f, #JobQueue = %d, in_use = %s", --- SystemTime, last - first, NvmStore[key].in_use)) - local t = minetest.get_us_time() - if NvmStore[key].in_use then - NvmStore[key].in_use = nil - backend.store_mapblock_data(key, NvmStore[key]) - push(key) - else - NvmStore[key] = nil -- remove unused data from cache - end - t = minetest.get_us_time() - t - if t > 20000 then - minetest.log("warning", "[TA Storage] duration = "..(t/1000.0).." ms") - end - end -end) - -------------------------------------------------------------------- --- Store/Restore NVM data -------------------------------------------------------------------- -NvmStore = backend.restore_at_startup() - -minetest.register_on_shutdown(function() - backend.freeze_at_shutdown(NvmStore) -end) - -------------------------------------------------------------------- --- API functions -------------------------------------------------------------------- --- Returns volatile node data as table -function techage.get_mem(pos) - local hash = minetest.hash_node_position(pos) - if not MemStore[hash] then - MemStore[hash] = {} - end - return MemStore[hash] -end - --- Returns non-volatile node data as table -function techage.get_nvm(pos) - local key1, key2 = get_keys(pos) - - if not NvmStore[key1] then - NvmStore[key1] = backend.get_mapblock_data(key1) - push(key1) - end - - local block = NvmStore[key1] - block.in_use = true - if not block[key2] then - block[key2] = backend.get_node_data(pos) - end - return block[key2] -end - --- Returns true/false -function techage.has_nvm(pos) - local key1, key2 = get_keys(pos) - - if not NvmStore[key1] then - NvmStore[key1] = backend.get_mapblock_data(key1) - push(key1) - end - - return NvmStore[key1][key2] ~= nil -end - -function techage.peek_nvm(pos) - local key1, key2 = get_keys(pos) - local block = NvmStore[key1] or {} - return block[key2] or {} -end - --- To be called when a node is removed -function techage.del_mem(pos) - local hash = minetest.hash_node_position(pos) - MemStore[hash] = nil - - local key1, key2 = get_keys(pos) - NvmStore[key1] = NvmStore[key1] or backend.get_mapblock_data(key1) - NvmStore[key1][key2] = nil - backend.store_mapblock_data(key1, NvmStore[key1]) -end diff --git a/techage/basis/nodedata_meta.lua b/techage/basis/nodedata_meta.lua deleted file mode 100644 index 7141a41..0000000 --- a/techage/basis/nodedata_meta.lua +++ /dev/null @@ -1,103 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Storage backend for node related data as node metadata - -]]-- - --- for lazy programmers -local M = minetest.get_meta - -local storage = techage.storage - -------------------------------------------------------------------- --- Marshaling -------------------------------------------------------------------- -local use_marshal = minetest.settings:get_bool('techage_use_marshal', false) -local MAR_MAGIC = 0x8e - --- default functions -local serialize = minetest.serialize -local deserialize = minetest.deserialize - -if use_marshal then - if not techage.IE then - error("Please add 'secure.trusted_mods = techage' to minetest.conf!") - end - local marshal = techage.IE.require("marshal") - if not marshal then - error("Please install marshal via 'luarocks install lua-marshal'") - end - - serialize = marshal.encode - - deserialize = function(s) - if s ~= "" then - if s:byte(1) == MAR_MAGIC then - return marshal.decode(s) - else - return minetest.deserialize(s) - end - end - end -end - -------------------------------------------------------------------- --- API functions -------------------------------------------------------------------- -local api = {} - -function api.get_mapblock_data(key) - return {} -end - -function api.store_mapblock_data(key, mapblock_data) - for key, item in pairs(mapblock_data) do - if key ~= "in_use" then - local pos = item and item._POS_ - if pos then - item._POS_ = nil - local data = serialize(item) - item._POS_ = pos - local meta = M(pos) - meta:set_string("ta_data", data) - meta:mark_as_private("ta_data") - end - end - end -end - -function api.get_node_data(pos) - local tbl = {} - local s = M(pos):get_string("ta_data") - - if s ~= "" then - tbl = deserialize(s) or {} - end - tbl._POS_ = table.copy(pos) - - return tbl -end - --- Meta data can't be written reliable at shutdown, --- so we have to store/restore the data differently -function api.freeze_at_shutdown(data) - storage:set_string("shutdown_nodedata", serialize(data)) -end - -function api.restore_at_startup() - local s = storage:get_string("shutdown_nodedata") - if s ~= "" then - return deserialize(s) or {} - end - return {} -end - -return api diff --git a/techage/basis/nodedata_sqlite.lua b/techage/basis/nodedata_sqlite.lua deleted file mode 100644 index 8540365..0000000 --- a/techage/basis/nodedata_sqlite.lua +++ /dev/null @@ -1,123 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Storage backend for node related data via sqlite database - -]]-- - --- for lazy programmers -local M = minetest.get_meta - -------------------------------------------------------------------- --- Database -------------------------------------------------------------------- -local MN = minetest.get_current_modname() -local WP = minetest.get_worldpath() -local use_marshal = minetest.settings:get_bool('techage_use_marshal', false) -local MAR_MAGIC = 0x8e - -if not techage.IE then - error("Please add 'secure.trusted_mods = techage' to minetest.conf!") -end - -local sqlite3 = techage.IE.require("lsqlite3") -local marshal = techage.IE.require("marshal") - -if not sqlite3 then - error("Please install sqlite3 via 'luarocks install lsqlite3'") -end -if not marshal then - error("Please install marshal via 'luarocks install lua-marshal'") -end - -local db = sqlite3.open(WP.."/techage_nodedata.sqlite") -local ROW = sqlite3.ROW - --- Prevent use of this db instance. -if sqlite3 then sqlite3 = nil end - -db:exec[[ - CREATE TABLE mapblocks(id INTEGER PRIMARY KEY, key INTEGER, data BLOB); - CREATE UNIQUE INDEX idx ON mapblocks(key); -]] - -local set = db:prepare("INSERT or REPLACE INTO mapblocks VALUES(NULL, ?, ?);") -local get = db:prepare("SELECT * FROM mapblocks WHERE key=?;") - -local function set_block(key, data) - set:reset() - set:bind(1, key) - set:bind_blob(2, data) - set:step() -end - -local function get_block(key) - get:reset() - get:bind(1, key) - if get:step() == ROW then - return get:get_value(2) - end -end - -------------------------------------------------------------------- --- API functions -------------------------------------------------------------------- -local api = {} - -function api.store_mapblock_data(key, mapblock_data) - if use_marshal and mapblock_data then - local data = marshal.encode(mapblock_data) - if data then - set_block(key, data) - end - else - set_block(key, minetest.serialize(mapblock_data)) - end -end - -function api.get_mapblock_data(key) - local s = get_block(key) - if s then - if s:byte(1) == MAR_MAGIC then - return marshal.decode(s) - else - return minetest.deserialize(s) - end - end - api.store_mapblock_data(key, {}) - return {} -end - -function api.get_node_data(pos) - -- legacy data available? - local s = M(pos):get_string("ta_data") - if s ~= "" then - M(pos):set_string("ta_data", "") - if s:byte(1) == MAR_MAGIC then - return marshal.decode(s) - else - return minetest.deserialize(s) - end - end - return {} -end - -function api.freeze_at_shutdown(data) - for key, item in pairs(data) do - api.store_mapblock_data(key, item) - end -end - -function api.restore_at_startup() - -- nothing to restore - return {} -end - -return api diff --git a/techage/basis/numbers_sqlite.lua b/techage/basis/numbers_sqlite.lua deleted file mode 100644 index f2f8be8..0000000 --- a/techage/basis/numbers_sqlite.lua +++ /dev/null @@ -1,142 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Storage backend for node number mapping via sqlite database - -]]-- - --- for lazy programmers -local M = minetest.get_meta - -local storage = techage.storage - -------------------------------------------------------------------- --- Database -------------------------------------------------------------------- -local MN = minetest.get_current_modname() -local WP = minetest.get_worldpath() -local MAR_MAGIC = 0x8e - -if not techage.IE then - error("Please add 'secure.trusted_mods = techage' to minetest.conf!") -end - -local sqlite3 = techage.IE.require("lsqlite3") -local marshal = techage.IE.require("marshal") - -if not sqlite3 then - error("Please install sqlite3 via 'luarocks install lsqlite3'") -end -if not marshal then - error("Please install marshal via 'luarocks install lua-marshal'") -end - -local db = sqlite3.open(WP.."/techage_numbers.sqlite") -local ROW = sqlite3.ROW - --- Prevent use of this db instance. -if sqlite3 then sqlite3 = nil end - -db:exec[[ - CREATE TABLE numbers(id INTEGER PRIMARY KEY, number INTEGER, x INTEGER, y INTEGER, z INTEGER); - CREATE UNIQUE INDEX idx ON numbers(number); -]] - -local set = db:prepare("INSERT or REPLACE INTO numbers VALUES(NULL, ?, ?, ?, ?);") -local get = db:prepare("SELECT * FROM numbers WHERE number=?;") - -local function set_block(number, pos) - set:reset() - set:bind(1, number) - set:bind(2, pos.x) - set:bind(3, pos.y) - set:bind(4, pos.z) - set:step() - return true -end - -local function get_block(number) - get:reset() - get:bind(1, number) - if get:step() == ROW then - return {x = get:get_value(2), y = get:get_value(3), z = get:get_value(4)} - end -end - -local function del_block(number) - db:exec("DELETE FROM numbers WHERE number="..number..";") -end - -------------------------------------------------------------------- --- Migration from mod storage -------------------------------------------------------------------- -local Version = storage:get_int("Version") or 0 -local NextNumber = 0 - -if Version == 0 then - Version = 4 -end -if Version == 3 then - Version = 4 - NextNumber = storage:get_int("NextNumber") - for i = 1, NextNumber do - local number = tostring(i) - if storage:contains(number) then - local pos = minetest.string_to_pos(storage:get_string(number)) - set_block(number, pos) - storage:set_string(number, "") - end - end -elseif Version == 4 then - NextNumber = storage:get_int("NextNumber") -else - error("[] Invalid version number for 'number to pos mapping' table!") -end - - -------------------------------------------------------------------- --- API functions -------------------------------------------------------------------- -local api = {} - -function api.get_nodepos(number) - return get_block(number) -end - -function api.set_nodepos(number, pos) - set_block(number, pos) -end - -function api.add_nodepos(pos) - local num = tostring(NextNumber) - NextNumber = NextNumber + 1 - storage:set_int("NextNumber", NextNumber) - set_block(num, pos) - return num -end - -function api.del_nodepos(number) - del_block(number) -end - --- delete invalid entries -function api.delete_invalid_entries(node_def) - minetest.log("info", "[TechAge] Data maintenance started") - for id, num, x, y, z in db:urows('SELECT * FROM numbers') do - local pos = {x = x, y = y, z = z} - local name = techage.get_node_lvm(pos).name - if not node_def[name] then - del_block(num) - end - end - minetest.log("info", "[TechAge] Data maintenance finished") -end - -return api diff --git a/techage/basis/numbers_storage.lua b/techage/basis/numbers_storage.lua deleted file mode 100644 index 02219b1..0000000 --- a/techage/basis/numbers_storage.lua +++ /dev/null @@ -1,98 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Storage backend for node number mapping via mod storage - -]]-- - -local backend = {} -local storage = techage.storage - --- legacy method -local function deserialize(s) - local tbl = {} - for line in s:gmatch("[^;]+") do - local num, spos = unpack(string.split(line, "=")) - tbl[num] = minetest.string_to_pos(spos) - end - return tbl -end - - -local Version = minetest.deserialize(storage:get_string("Version")) or 3 -local NextNumber = 0 - -if Version == 1 then - Version = 3 - local tbl = minetest.deserialize(storage:get_string("Number2Pos")) or {} - NextNumber = minetest.deserialize(storage:get_string("NextNumber")) or 1 - for num, pos in pairs(tbl) do - storage:set_string(num, minetest.pos_to_string(pos)) - end - storage:set_string("Number2Pos", "") -elseif Version == 2 then - Version = 3 - NextNumber = minetest.deserialize(storage:get_string("NextNumber")) or 1 - local tbl = deserialize(storage:get_string("Number2Pos")) - for num, pos in pairs(tbl) do - storage:set_string(num, minetest.pos_to_string(pos)) - end - storage:set_string("Number2Pos", "") -else - Version = 3 - NextNumber = storage:get_int("NextNumber") -end - -storage:set_int("NextNumber", NextNumber) -storage:set_int("Version", Version) - - -------------------------------------------------------------------- --- API functions -------------------------------------------------------------------- -function backend.get_nodepos(number) - return minetest.string_to_pos(storage:get_string(number)) -end - -function backend.set_nodepos(number, pos) - storage:set_string(number, minetest.pos_to_string(pos)) -end - -function backend.add_nodepos(pos) - local num = tostring(NextNumber) - NextNumber = NextNumber + 1 - storage:set_int("NextNumber", NextNumber) - storage:set_string(num, minetest.pos_to_string(pos)) - return num -end - -function backend.del_nodepos(number) - storage:set_string(number, "") -end - --- delete invalid entries -function backend.delete_invalid_entries(node_def) - minetest.log("info", "[TechAge] Data maintenance started") - for i = 1, NextNumber do - local number = tostring(i) - if storage:contains(number) then - local pos = backend.get_nodepos(number) - local name = techage.get_node_lvm(pos).name - if not node_def[name] then - backend.del_nodepos(number) - else - minetest.get_meta(pos):set_string("node_number", number) - end - end - end - minetest.log("info", "[TechAge] Data maintenance finished") -end - -return backend diff --git a/techage/basis/oggfiles.lua b/techage/basis/oggfiles.lua deleted file mode 100644 index ffe7c82..0000000 --- a/techage/basis/oggfiles.lua +++ /dev/null @@ -1,103 +0,0 @@ -techage.OggFileList = { - "autobahn_motor", -- ./mods/autobahn/sounds - "signs_bot_ping", -- ./mods/signs_bot/sounds - "signs_bot_go_away", -- ./mods/signs_bot/sounds - "signs_bot_step", -- ./mods/signs_bot/sounds - "signs_bot_pong", -- ./mods/signs_bot/sounds - "signs_bot_error", -- ./mods/signs_bot/sounds - "normal2", -- ./mods/hyperloop/sounds - "up2", -- ./mods/hyperloop/sounds - "down2", -- ./mods/hyperloop/sounds - "ele_norm", -- ./mods/hyperloop/sounds - "door", -- ./mods/hyperloop/sounds - "hyperloop_crowbar", -- ./mods/hyperloop/sounds - "ele_door", -- ./mods/hyperloop/sounds - "techage_watermill", -- ./mods/techage/sounds - "techage_button", -- ./mods/techage/sounds - "techage_steamengine", -- ./mods/techage/sounds - "techage_generator", -- ./mods/techage/sounds - "techage_gasflare", -- ./mods/techage/sounds - "techage_explore", -- ./mods/techage/sounds - "techage_mill", -- ./mods/techage/sounds - "techage_reactor", -- ./mods/techage/sounds - "techage_valve", -- ./mods/techage/sounds - "techage_oildrill", -- ./mods/techage/sounds - "techage_turbine", -- ./mods/techage/sounds - "techage_booster", -- ./mods/techage/sounds - "techage_quarry", -- ./mods/techage/sounds - "techage_reboiler", -- ./mods/techage/sounds - "jetpack_loop", -- ./mods/jetpack/sounds - "paperflip1", -- ./mods/unified_inventory/sounds - "teleport", -- ./mods/unified_inventory/sounds - "electricity", -- ./mods/unified_inventory/sounds - "owl", -- ./mods/unified_inventory/sounds - "click", -- ./mods/unified_inventory/sounds - "birds", -- ./mods/unified_inventory/sounds - "paperflip2", -- ./mods/unified_inventory/sounds - "dingdong", -- ./mods/unified_inventory/sounds - "trash", -- ./mods/unified_inventory/sounds - "trash_all", -- ./mods/unified_inventory/sounds - "ta4_jetpack", -- ./mods/ta4_jetpack/sounds - "ta4_jetpack_alarm", -- ./mods/ta4_jetpack/sounds - "ta4_jetpack_on", -- ./mods/ta4_jetpack/sounds - "player_damage", -- ./games/minetest_game/mods/player_api/sounds - "env_sounds_water", -- ./games/minetest_game/mods/env_sounds/sounds - "env_sounds_lava", -- ./games/minetest_game/mods/env_sounds/sounds - "doors_door_close", -- ./games/minetest_game/mods/doors/sounds - "doors_steel_door_close", -- ./games/minetest_game/mods/doors/sounds - "doors_door_open", -- ./games/minetest_game/mods/doors/sounds - "doors_fencegate_close", -- ./games/minetest_game/mods/doors/sounds - "doors_glass_door_close", -- ./games/minetest_game/mods/doors/sounds - "doors_fencegate_open", -- ./games/minetest_game/mods/doors/sounds - "doors_glass_door_open", -- ./games/minetest_game/mods/doors/sounds - "doors_steel_door_open", -- ./games/minetest_game/mods/doors/sounds - "fire_flint_and_steel", -- ./games/minetest_game/mods/fire/sounds - "fire_large", -- ./games/minetest_game/mods/fire/sounds - "fire_fire", -- ./games/minetest_game/mods/fire/sounds - "fire_extinguish_flame", -- ./games/minetest_game/mods/fire/sounds - "fire_small", -- ./games/minetest_game/mods/fire/sounds - "tnt_ignite", -- ./games/minetest_game/mods/tnt/sounds - "tnt_gunpowder_burning", -- ./games/minetest_game/mods/tnt/sounds - "tnt_explode", -- ./games/minetest_game/mods/tnt/sounds - "carts_cart_new", -- ./games/minetest_game/mods/carts/sounds - "carts_cart_moving", -- ./games/minetest_game/mods/carts/sounds - "xpanes_steel_bar_door_open", -- ./games/minetest_game/mods/xpanes/sounds - "xpanes_steel_bar_door_close", -- ./games/minetest_game/mods/xpanes/sounds - "default_break_glass", -- ./games/minetest_game/mods/default/sounds - "default_dig_dig_immediate", -- ./games/minetest_game/mods/default/sounds - "default_dig_cracky", -- ./games/minetest_game/mods/default/sounds - "default_dig_choppy", -- ./games/minetest_game/mods/default/sounds - "default_water_footstep", -- ./games/minetest_game/mods/default/sounds - "player_damage", -- ./games/minetest_game/mods/default/sounds - "default_gravel_footstep", -- ./games/minetest_game/mods/default/sounds - "default_dig_metal", -- ./games/minetest_game/mods/default/sounds - "default_gravel_dug", -- ./games/minetest_game/mods/default/sounds - "default_hard_footstep", -- ./games/minetest_game/mods/default/sounds - "default_sand_footstep", -- ./games/minetest_game/mods/default/sounds - "default_grass_footstep", -- ./games/minetest_game/mods/default/sounds - "default_chest_close", -- ./games/minetest_game/mods/default/sounds - "default_cool_lava", -- ./games/minetest_game/mods/default/sounds - "default_place_node_hard", -- ./games/minetest_game/mods/default/sounds - "default_ice_dug", -- ./games/minetest_game/mods/default/sounds - "default_dig_crumbly", -- ./games/minetest_game/mods/default/sounds - "default_tool_breaks", -- ./games/minetest_game/mods/default/sounds - "default_ice_footstep", -- ./games/minetest_game/mods/default/sounds - "default_dig_cracky", -- ./games/minetest_game/mods/default/sounds - "default_chest_open", -- ./games/minetest_game/mods/default/sounds - "default_gravel_dig", -- ./games/minetest_game/mods/default/sounds - "default_dig_oddly_breakable_by_hand", -- ./games/minetest_game/mods/default/sounds - "default_dug_metal", -- ./games/minetest_game/mods/default/sounds - "default_dirt_footstep", -- ./games/minetest_game/mods/default/sounds - "default_dig_choppy", -- ./games/minetest_game/mods/default/sounds - "default_glass_footstep", -- ./games/minetest_game/mods/default/sounds - "default_snow_footstep", -- ./games/minetest_game/mods/default/sounds - "default_place_node", -- ./games/minetest_game/mods/default/sounds - "default_dig_snappy", -- ./games/minetest_game/mods/default/sounds - "default_dug_node", -- ./games/minetest_game/mods/default/sounds - "default_metal_footstep", -- ./games/minetest_game/mods/default/sounds - "default_ice_dig", -- ./games/minetest_game/mods/default/sounds - "default_place_node_metal", -- ./games/minetest_game/mods/default/sounds - "default_wood_footstep", -- ./games/minetest_game/mods/default/sounds - "default_furnace_active", -- ./games/minetest_game/mods/default/sounds - "default_item_smoke", -- ./games/minetest_game/mods/default/sounds -} diff --git a/techage/basis/pack_lib.lua b/techage/basis/pack_lib.lua deleted file mode 100644 index 155cd3a..0000000 --- a/techage/basis/pack_lib.lua +++ /dev/null @@ -1,88 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2024 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Packing functions - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta - --- string/usercode conversion -local function usercode_to_string(tbl) - if tbl and tbl.inventory then - for list_name,list in pairs(tbl.inventory) do - for i,item in ipairs(list) do - tbl.inventory[list_name][i] = item:to_string() - end - end - end -end - -local function string_to_usercode(tbl) - if tbl and tbl.inventory then - for list_name,list in pairs(tbl.inventory) do - for i,item in ipairs(list) do - tbl.inventory[list_name][i] = ItemStack(item) - end - end - end -end - --- pack/unpack node nvm data -local function pack_nvm(pos) - if techage.has_nvm(pos) then - local s = minetest.serialize(techage.get_nvm(pos)) - techage.del_mem(pos) - return s - end -end - -local function unpack_nvm(pos, s) - if s and s ~= "" then - local tbl = minetest.deserialize(s) - local nvm = techage.get_nvm(pos) - for k,v in pairs(tbl) do - nvm.k = v - end - end -end - --- pack/unpack node metedata -local function pack_meta(pos) - local tbl = M(pos):to_table() or {} - usercode_to_string(tbl) - return minetest.serialize(tbl) -end - -local function unpack_meta(pos, s) - if s and s ~= "" then - local tbl = minetest.deserialize(s) or {} - string_to_usercode(tbl) - M(pos):from_table(tbl) - end -end - -------------------------------------------------------------------------------- --- preserve/restore API functions -------------------------------------------------------------------------------- - -function techage.preserve_nodedata(pos) - local smeta = pack_meta(pos) - local snvm = pack_nvm(pos) - return minetest.serialize({smeta = smeta, snvm = snvm}) -end - -function techage.restore_nodedata(pos, s) - local tbl = minetest.deserialize(s) or {} - unpack_nvm(pos, tbl.snvm) - unpack_meta(pos, tbl.smeta) -end diff --git a/techage/basis/recipe_lib.lua b/techage/basis/recipe_lib.lua deleted file mode 100644 index fc069b6..0000000 --- a/techage/basis/recipe_lib.lua +++ /dev/null @@ -1,292 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Recipe lib for formspecs - -]]-- - -local S = techage.S -local M = minetest.get_meta - -local Recipes = {} -- {rtype = {ouput = {....},...}} -local NormalizedRecipes = {} -- {output = "", items = {...}} - -local range = techage.in_range - -techage.recipes = {} - -local GROUP_ITEMS = { - stone = "default:cobble", - wood = "default:wood", - book = "default:book", - sand = "default:sand", - leaves = "default:leaves", - stick = "default:stick", - tree = "default:tree", - vessel = "vessels:glass_bottle", - wool = "wool:white", -} - - -local RECIPE = { - output = {name = "", num = 0}, - waste = {name = "", num = 0}, - input = { - {name = "", num =0}, - {name = "", num =0}, - {name = "", num =0}, - {name = "", num =0}, - }, - } - -local function filter_recipes_based_on_points(recipes, owner) - local ex_points = 0 - if owner then - local player = minetest.get_player_by_name(owner) - ex_points = techage.get_expoints(player) or 0 - end - - local tbl = {} - for _,item in ipairs(recipes) do - if ex_points >= (item.ex_points or 0) then - tbl[#tbl + 1] = item - end - end - return tbl -end - - --- Formspec -local function input_string(recipe) - local tbl = {} - for idx, item in ipairs(recipe.input) do - local x = ((idx-1) % 2) - local y = math.floor((idx-1) / 2) - tbl[idx] = techage.item_image(x, y, item.name.." "..item.num) - end - return table.concat(tbl, "") -end - -function techage.recipes.get(nvm, rtype, owner) - local recipes = Recipes[rtype] or {} - if owner then - recipes = filter_recipes_based_on_points(recipes, owner) - end - return recipes[nvm.recipe_idx or 1] or recipes[1] -end - --- Add 4 input/output/waste recipe --- { --- output = " ", -- units = 1..n --- waste = " ", -- units = 1..n --- input = { -- up to 4 items --- " ", --- " ", --- }, --- } -function techage.recipes.add(rtype, recipe) - if not Recipes[rtype] then - Recipes[rtype] = {} - end - - local name, num, output - local item = {input = {}} - for idx = 1,4 do - local inp = recipe.input[idx] or "" - name, num = unpack(string.split(inp, " ")) - item.input[idx] = {name = name or "", num = tonumber(num) or 0} - end - if recipe.waste then - name, num = unpack(string.split(recipe.waste, " ")) - else - name, num = "", "0" - end - item.waste = {name = name or "", num = tonumber(num) or 0} - name, num = unpack(string.split(recipe.output, " ")) - item.output = {name = name or "", num = tonumber(num) or 0} - item.catalyst = recipe.catalyst - item.ex_points = recipe.ex_points or 0 - Recipes[rtype][#Recipes[rtype]+1] = item - output = name - - techage.recipes.register_craft({ - output = recipe.output, - items = recipe.input, - type = rtype, - }) - NormalizedRecipes[output] = { - output = recipe.output, - items = recipe.input, - } -end - -function techage.recipes.formspec(x, y, rtype, nvm, owner) - local recipes = Recipes[rtype] or {} - recipes = filter_recipes_based_on_points(recipes, owner) - nvm.recipe_idx = range(nvm.recipe_idx or 1, 1, #recipes) - local idx = nvm.recipe_idx - local recipe = recipes[idx] or RECIPE - local output = recipe.output.name.." "..recipe.output.num - local waste = recipe.waste.name.." "..recipe.waste.num - local catalyst = recipe.catalyst and techage.item_image_small(2.05, 0, recipe.catalyst, S("Catalyst")) or "" - return "container["..x..","..y.."]".. - "background[0,0;4,3;techage_form_grey.png]".. - input_string(recipe).. - "image[2,0.7;1,1;techage_form_arrow.png]".. - catalyst.. - techage.item_image(2.95, 0, output).. - techage.item_image(2.95, 1, waste).. - "button[0,2;1,1;priv;<<]".. - "button[1,2;1,1;next;>>]".. - "label[1.9,2.2;"..S("Recipe")..": "..idx.."/"..#recipes.."]".. - "container_end[]" -end - -function techage.recipes.on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - - nvm.recipe_idx = nvm.recipe_idx or 1 - if not nvm.running then - if fields.next == ">>" then - nvm.recipe_idx = nvm.recipe_idx + 1 - return true - elseif fields.priv == "<<" then - nvm.recipe_idx = nvm.recipe_idx - 1 - return true - end - end -end - -function techage.recipes.get_recipe(name) - return NormalizedRecipes[name] -end - -function techage.recipes.set_recipe(pos, rtype, idx) - local nvm = techage.get_nvm(pos) - if not nvm.running then - local recipes = Recipes[rtype] or {} - idx = tonumber(idx) or 1 - nvm.recipe_idx = range(idx, 1, #recipes) - end -end - -function techage.recipes.get_default_group_item_name(item_name) - if item_name and item_name:sub(1, 6) == "group:" then - local default_name = GROUP_ITEMS[item_name:sub(7)] - if default_name then - return default_name - end - end - return item_name -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/techage/basis/shared_inv.lua b/techage/basis/shared_inv.lua deleted file mode 100644 index 2c5138b..0000000 --- a/techage/basis/shared_inv.lua +++ /dev/null @@ -1,74 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Library for shared inventories - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -techage.shared_inv = {} - -local hyperloop = techage.hyperloop -local remote_pos = techage.hyperloop.remote_pos - -local function copy_inventory_list(from_pos, to_pos, listname) - local inv1 = minetest.get_inventory({type="node", pos=from_pos}) - local inv2 = minetest.get_inventory({type="node", pos=to_pos}) - inv2:set_list(listname, inv1:get_list(listname)) -end - -function techage.shared_inv.node_timer(pos, elapsed) - local rmt_pos = remote_pos(pos) - if rmt_pos and techage.is_activeformspec(pos) then - copy_inventory_list(rmt_pos, pos, "main") - return true - end - return false -end - --- Synchronize the client inventory with the server one -function techage.shared_inv.before_inv_access(pos, listname) - if hyperloop.is_client(pos) then - local rmt_pos = remote_pos(pos) - if rmt_pos then - copy_inventory_list(rmt_pos, pos, listname) - return true - end - end - return false -end - --- Synchronize the client inventory with the server one -function techage.shared_inv.after_inv_access(pos, listname) - if hyperloop.is_client(pos) then - local rmt_pos = remote_pos(pos) - if rmt_pos then - copy_inventory_list(pos, rmt_pos, listname) - return true - end - end - return false -end - -function techage.shared_inv.on_rightclick(pos, clicker, listname) - if hyperloop.is_client(pos) then - local rmt_pos = remote_pos(pos) - if rmt_pos then - copy_inventory_list(rmt_pos, pos, listname) - techage.set_activeformspec(pos, clicker) - minetest.get_node_timer(pos):start(2) - end - end -end diff --git a/techage/basis/shared_tank.lua b/techage/basis/shared_tank.lua deleted file mode 100644 index 1e2f067..0000000 --- a/techage/basis/shared_tank.lua +++ /dev/null @@ -1,116 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Library for shared inventories - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local NDEF = function(pos) return minetest.registered_nodes[techage.get_node_lvm(pos).name] or {} end - -techage.shared_tank = {} - -local liquid = networks.liquid -local hyperloop = techage.hyperloop -local remote_pos = techage.hyperloop.remote_pos -local is_paired = techage.hyperloop.is_paired -local menu = techage.menu - -local function formspec(pos) - local ndef = NDEF(pos) - local status = M(pos):get_string("conn_status") - if hyperloop.is_client(pos) or hyperloop.is_server(pos) then - local title = ndef.description .. " " .. status - local nvm = techage.get_nvm(remote_pos(pos)) - return techage.liquid.formspec(pos, nvm, title) - else - return menu.generate_formspec(pos, ndef, hyperloop.SUBMENU) - end -end - -function techage.shared_tank.node_timer(pos) - if techage.is_activeformspec(pos) and is_paired(pos) then - M(pos):set_string("formspec", formspec(pos)) - return true - end - return false -end - -function techage.shared_tank.on_rightclick(pos, node, clicker) - --if hyperloop.is_client(pos) then - techage.set_activeformspec(pos, clicker) - minetest.get_node_timer(pos):start(2) - --end - M(pos):set_string("formspec", formspec(pos)) -end - -function techage.shared_tank.can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - pos = remote_pos(pos) - return techage.liquid.is_empty(pos) -end - -function techage.shared_tank.peek_liquid(pos, indir) - if is_paired(pos) then - pos = remote_pos(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end -end - -function techage.shared_tank.take_liquid(pos, indir, name, amount) - if is_paired(pos) then - pos = remote_pos(pos) - local nvm = techage.get_nvm(pos) - amount, name = liquid.srv_take(nvm, name, amount) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(pos)) - end - return amount, name - end - return 0, name -end - -function techage.shared_tank.put_liquid(pos, indir, name, amount) - if is_paired(pos) then - pos = remote_pos(pos) - -- check if it is not powder - local ndef = minetest.registered_craftitems[name] or {} - if not ndef.groups or ndef.groups.powder ~= 1 then - local nvm = techage.get_nvm(pos) - local ndef = NDEF(pos) - local leftover = liquid.srv_put(nvm, name, amount, ndef.liquid.capa) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(pos)) - end - return leftover - end - end - return amount -end - -function techage.shared_tank.untake_liquid(pos, indir, name, amount) - if is_paired(pos) then - pos = remote_pos(pos) - local nvm = techage.get_nvm(pos) - local ndef = NDEF(pos) - local leftover = liquid.srv_put(nvm, name, amount, ndef.liquid.capa) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(pos)) - end - return leftover - end - return amount -end - -techage.shared_tank.formspec = formspec diff --git a/techage/basis/submenu.lua b/techage/basis/submenu.lua deleted file mode 100644 index 46ce5da..0000000 --- a/techage/basis/submenu.lua +++ /dev/null @@ -1,318 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - A formspec control to generate formspec strings for machine settings and monitoring -]]-- - -local S = techage.S - -techage.menu = {} - -local function index(list, x) - for idx, v in ipairs(list or {}) do - if tostring(v) == x then return idx end - end - return nil -end - -local function allow_put(inv, listname, index, stack, player) - local list = inv:get_list(listname) - stack:set_count(1) - inv:set_stack(listname, index, stack) - return 0 -end - -local function allow_take(inv, listname, index, stack, player) - local list = inv:get_list(listname) - stack:set_count(0) - inv:set_stack(listname, index, stack) - return 0 -end - - --- generate the formspec string to be placed into a container frame -local function generate_formspec_substring(pos, meta, form_def, player_name) - local tbl = {} - local player_inv_needed = false - if meta and form_def then - local nvm = techage.get_nvm(pos) - - for i,elem in ipairs(form_def) do - local offs = (i - 1) * 0.9 - 0.2 - tbl[#tbl+1] = "label[0," .. offs .. ";" .. minetest.formspec_escape(elem.label) .. ":]" - tbl[#tbl+1] = "tooltip[0," .. offs .. ";4,1;" .. elem.tooltip .. "]" - if elem.type == "label" then - -- none - elseif elem.type == "number" then - local val = elem.default - if meta:contains(elem.name) then - val = meta:get_int(elem.name) - end - if nvm.running or techage.is_running(nvm) then - tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]" - else - tbl[#tbl+1] = "field[5," .. (offs+0.2) .. ";5.3,1;" .. elem.name .. ";;" .. val .. "]" - end - elseif elem.type == "numbers" then - local val = elem.default - if meta:contains(elem.name) then - val = meta:get_string(elem.name) - end - if nvm.running or techage.is_running(nvm) then - tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]" - else - tbl[#tbl+1] = "field[5," .. (offs+0.2) .. ";5.3,1;" .. elem.name .. ";;" .. val .. "]" - end - elseif elem.type == "float" then - local val = elem.default - if meta:contains(elem.name) then - val = tonumber(meta:get_string(elem.name)) or 0 - end - if nvm.running or techage.is_running(nvm) then - tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]" - else - tbl[#tbl+1] = "field[5," .. (offs+0.2) .. ";5.3,1;" .. elem.name .. ";;" .. val .. "]" - end - elseif elem.type == "ascii" then - local val = elem.default - if meta:contains(elem.name) then - val = meta:get_string(elem.name) - end - if nvm.running or techage.is_running(nvm) then - tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. minetest.formspec_escape(val) .. "]" - else - tbl[#tbl+1] = "field[5," .. (offs+0.2) .. ";5.3,1;" .. elem.name .. ";;" .. minetest.formspec_escape(val) .. "]" - end - elseif elem.type == "const" then - tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. elem.value .. "]" - elseif elem.type == "output" then - local val = nvm[elem.name] or meta:get_string(elem.name) or "" - if tonumber(val) then - val = techage.round(val) - end - tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]" - elseif elem.type == "dropdown" then - if nvm.running or techage.is_running(nvm) then - local val = elem.default or "" - if meta:contains(elem.name) then - val = meta:get_string(elem.name) or "" - end - tbl[#tbl+1] = "label[4.75," .. offs .. ";" .. val .. "]" - elseif elem.on_dropdown then -- block provides a specific list of choice elements - local val = elem.default - if meta:contains(elem.name) then - val = meta:get_string(elem.name) or "" - end - local choices = elem.on_dropdown(pos) - local l = choices:split(",") - local idx = index(l, val) or 1 - tbl[#tbl+1] = "dropdown[4.72," .. (offs) .. ";5.5,1.4;" .. elem.name .. ";" .. choices .. ";" .. idx .. "]" - else - local val = elem.default - if meta:contains(elem.name) then - val = meta:get_string(elem.name) or "" - end - local idx - if elem.values then - idx = index(elem.values, val) or 1 - else - local l = elem.choices:split(",") - idx = index(l, val) or 1 - end - tbl[#tbl+1] = "dropdown[4.72," .. (offs) .. ";5.5,1.4;" .. elem.name .. ";" .. elem.choices .. ";" .. idx .. "]" - end - elseif elem.type == "items" then -- inventory - if elem.size then - tbl[#tbl+1] = "list[detached:" .. minetest.formspec_escape(player_name) .. "_techage_wrench_menu;cfg;4.75," .. offs .. ";" .. elem.size .. ",1;]" - else - tbl[#tbl+1] = "list[detached:" .. minetest.formspec_escape(player_name) .. "_techage_wrench_menu;cfg;4.75," .. offs .. ";" .. elem.width .. "," .. elem.height .. ";]" - end - player_inv_needed = true - end - end - if nvm.running or techage.is_running(nvm) then - local offs = #form_def * 0.9 - 0.2 - tbl[#tbl+1] = "label[0," .. offs .. ";" .. S("Note: You can't change any values while the block is running!") .. "]" - end - end - - return player_inv_needed, table.concat(tbl, "") -end - -local function value_check(elem, value, player_name) - if elem.check then - return elem.check(value, player_name) - end - return value ~= nil -end - -local function evaluate_data(pos, meta, form_def, fields, player_name) - local res = true - - if meta and form_def then - local nvm = techage.get_nvm(pos) - if nvm.running or techage.is_running(nvm) then - return res - end - for idx,elem in ipairs(form_def) do - if elem.type == "number" then - if fields[elem.name] then - if fields[elem.name] == "" then - meta:set_string(elem.name, "") - elseif fields[elem.name]:find("^[%d ]+$") then - local val = tonumber(fields[elem.name]) - if value_check(elem, val, player_name) then - meta:set_int(elem.name, val) - --print("set_int", elem.name, val) - else - res = false - end - else - res = false - end - end - elseif elem.type == "numbers" then - if fields[elem.name] then - if fields[elem.name] == "" then - meta:set_string(elem.name, "") - elseif fields[elem.name]:find("^[%d ]+$") and - value_check(elem, fields[elem.name], player_name) then - meta:set_string(elem.name, fields[elem.name]) - else - res = false - end - end - elseif elem.type == "float" then - if fields[elem.name] == ""then - meta:set_string(elem.name, "") - elseif fields[elem.name] then - local val = tonumber(fields[elem.name]) - if val and value_check(elem, val, player_name) then - meta:set_string(elem.name, val) - else - res = false - end - end - elseif elem.type == "ascii" then - if fields[elem.name] == ""then - meta:set_string(elem.name, "") - elseif fields[elem.name] then - if value_check(elem, fields[elem.name], player_name) then - meta:set_string(elem.name, fields[elem.name]) - else - res = false - end - end - elseif elem.type == "dropdown" then - if fields[elem.name] ~= nil then - if elem.values then - local l = elem.choices:split(",") - local idx = index(l, fields[elem.name]) or 1 - local text = elem.values[idx] - meta:set_string(elem.name, text) - else - meta:set_string(elem.name, fields[elem.name]) - end - end - elseif elem.type == "items" and player_name then - local inv_name = minetest.formspec_escape(player_name) .. "_techage_wrench_menu" - local dinv = minetest.get_inventory({type = "detached", name = inv_name}) - local ninv = minetest.get_inventory({type = "node", pos = pos}) - if dinv and ninv then - for i = 1, ninv:get_size("cfg") do - ninv:set_stack("cfg", i, dinv:get_stack("cfg", i)) - end - end - end - end - end - return res -end - -function techage.menu.generate_formspec(pos, ndef, form_def, player_name) - local meta = minetest.get_meta(pos) - local number = techage.get_node_number(pos) or "-" - local mem = techage.get_mem(pos) - mem.star = ((mem.star or 0) + 1) % 2 - local star = mem.star == 1 and "*" or "" - if player_name then - local inv_name = minetest.formspec_escape(player_name) .. "_techage_wrench_menu" - minetest.create_detached_inventory(inv_name, { - allow_put = allow_put, - allow_take = allow_take}) - local dinv = minetest.get_inventory({type = "detached", name = inv_name}) - local ninv = minetest.get_inventory({type = "node", pos = pos}) - if dinv and ninv then - dinv:set_size('cfg', ninv:get_size("cfg")) - for i = 1, ninv:get_size("cfg") do - dinv:set_stack("cfg", i, ninv:get_stack("cfg", i)) - end - end - end - if meta and number and ndef and form_def then - local title = ndef.description .. " (" .. number .. ")" - local player_inv_needed, text = generate_formspec_substring(pos, meta, form_def, player_name) - local buttons - - if player_inv_needed then - buttons = "button[0.5,6.2;3,1;refresh;" .. S("Refresh") .. "]" .. - "button_exit[3.5,6.2;3,1;cancel;" .. S("Cancel") .. "]" .. - "button[6.5,6.2;3,1;save;" .. S("Save") .. "]" .. - "list[current_player;main;1,7.2;8,2;]" - else - buttons = "button[0.5,8.4;3,1;refresh;" .. S("Refresh") .. "]" .. - "button_exit[3.5,8.4;3,1;cancel;" .. S("Cancel") .. "]" .. - "button[6.5,8.4;3,1;save;" .. S("Save") .. "]" - end - - if #form_def > 8 then - local size = (#form_def * 10) - 60 - return "size[10,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "box[0,-0.1;9.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. - "label[9.5,-0.1;" .. minetest.colorize( "#000000", star) .. "]" .. - "scrollbaroptions[max=" .. size .. "]" .. - "scrollbar[9.4,0.6;0.4,7.7;vertical;wrenchmenu;]" .. - "scroll_container[0,1;12,9;wrenchmenu;vertical;]" .. - text .. - "scroll_container_end[]" .. - buttons - else - return "size[10,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "box[0,-0.1;9.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. - "label[9.5,-0.1;" .. minetest.colorize( "#000000", star) .. "]" .. - "container[0,1]" .. - text .. - "container_end[]" .. - buttons - end - end - return "" -end - -function techage.menu.eval_input(pos, form_def, fields, player_name) - if fields.save or fields.key_enter_field then - local meta = minetest.get_meta(pos) - evaluate_data(pos, meta, form_def, fields, player_name) - end - return fields.refresh or fields.save or fields.key_enter_field -end - -function techage.dropdown_index(sChoices, selected_value) - local l = sChoices:split(",") - return index(l, selected_value) or 1 -end diff --git a/techage/basis/teleport.lua b/techage/basis/teleport.lua deleted file mode 100644 index a9dd85b..0000000 --- a/techage/basis/teleport.lua +++ /dev/null @@ -1,167 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - For tupe/pipe blocks with teleport support - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local NDEF = function(pos) return minetest.registered_nodes[techage.get_node_lvm(pos).name] or {} end -local M = minetest.get_meta -local S = techage.S -local menu = techage.menu - -techage.teleport = {} - -local PairingList = {} -- {owner = {node_type = {channel = pos}}} - -local function get_pairing_table1(meta) - local owner = meta:get_string("owner") - local node_type = meta:get_string("tele_node_type") - PairingList[owner] = PairingList[owner] or {} - PairingList[owner][node_type] = PairingList[owner][node_type] or {} - return PairingList[owner][node_type] -end - -local function get_pairing_table2(oldmetadata) - local owner = oldmetadata.fields.owner - local node_type = oldmetadata.fields.tele_node_type - PairingList[owner] = PairingList[owner] or {} - PairingList[owner][node_type] = PairingList[owner][node_type] or {} - return PairingList[owner][node_type] -end - -local function get_free_server_list(pos) - local tbl = {""} - for name, pos in pairs(get_pairing_table1(M(pos))) do - table.insert(tbl, name) - end - return table.concat(tbl, ",") -end - -local TELE_MENU = { - { - type = "label", - label = S("Enter a block name or select an existing one"), - tooltip = "", - name = "l1", - }, - { - type = "ascii", - name = "conn_name", - label = S("Block name"), - tooltip = S("Connection name for this block"), - default = "", - }, - { - type = "dropdown", - choices = "", - on_dropdown = get_free_server_list, - name = "remote_name", - label = S("Remote name"), - tooltip = S("Connection name of the remote block"), - }, - { - type = "output", - label = S("Status"), - tooltip = S("Connection status"), - name = "status", - default = "", - }, -} - -function techage.teleport.formspec(pos) - local ndef = NDEF(pos) - return menu.generate_formspec(pos, ndef, TELE_MENU) -end - -local function store_connection(pos, peer_pos) - local meta = M(pos) - local status = S("connected to") .. " " .. P2S(peer_pos) - meta:set_string("tele_status", status) - meta:set_string("tele_peer_pos", P2S(peer_pos)) - meta:set_string("formspec", "") -end - -function techage.teleport.prepare_pairing(pos, node_type, status) - local meta = M(pos) - if node_type then - meta:set_string("tele_node_type", node_type) - end - status = status or S("not connected") - meta:set_string("tele_status", status) - meta:set_string("tele_peer_pos", "") - meta:set_string("formspec", techage.teleport.formspec(pos)) -end - -function techage.teleport.stop_pairing(pos, oldmetadata) - -- disconnect peer node - if oldmetadata and oldmetadata.fields then - if oldmetadata.fields.tele_peer_pos then - local peer_pos = S2P(oldmetadata.fields.tele_peer_pos) - local meta = M(peer_pos) - if meta:get_string("conn_name") ~= "" then -- Server - local tbl = get_pairing_table1(meta) - tbl[meta:get_string("conn_name")] = peer_pos - techage.teleport.prepare_pairing(peer_pos, nil, S("server not connected")) - else - techage.teleport.prepare_pairing(peer_pos) - end - elseif oldmetadata.fields.conn_name then - local tbl = get_pairing_table2(oldmetadata) - tbl[oldmetadata.fields.conn_name] = nil - end - end -end - -function techage.teleport.is_connected(pos) - return M(pos):get_string("tele_peer_pos") ~= "" -end - -function techage.teleport.get_remote_pos(pos) - local s = M(pos):get_string("tele_peer_pos") - if s ~= "" then - return S2P(s) - end -end - -function techage.teleport.after_formspec(pos, player, fields, max_dist, ex_points) - if techage.get_expoints(player) >= ex_points then - if techage.menu.eval_input(pos, TELE_MENU, fields) then - if not techage.teleport.is_connected(pos) then - local meta = M(pos) - if fields.remote_name ~= "" then -- Client - local tbl = get_pairing_table1(meta) - local peer_pos = tbl[fields.remote_name] - if peer_pos then - if vector.distance(pos, peer_pos) <= max_dist then - tbl[fields.remote_name] = nil - store_connection(pos, peer_pos) - store_connection(peer_pos, pos) - M(pos):set_string("status", S("Connected")) - else - M(pos):set_string("status", S("Distance > @1 blocks", max_dist)) - meta:set_string("formspec", techage.teleport.formspec(pos)) - end - end - elseif fields.conn_name ~= "" then -- Server - local tbl = get_pairing_table1(meta) - tbl[fields.conn_name] = pos - techage.teleport.prepare_pairing(pos, nil, S("server not connected")) - end - end - end - else - M(pos):set_string("status", S("Ex-points missing (@1 < @2)", techage.get_expoints(player), ex_points)) - M(pos):set_string("formspec", techage.teleport.formspec(pos)) - end -end diff --git a/techage/basis/tube_wall_entry.lua b/techage/basis/tube_wall_entry.lua deleted file mode 100644 index a2dab89..0000000 --- a/techage/basis/tube_wall_entry.lua +++ /dev/null @@ -1,57 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Tube wall entry - -]]-- - -local S = techage.S - -local Tube = techage.Tube - -minetest.register_node("techage:tube_wall_entry", { - description = S("Tube Wall Entry"), - tiles = { - -- up, down, right, left, back, front - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png^techage_tube_hole.png", - "basic_materials_concrete_block.png^techage_tube_hole.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Tube:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Tube:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - groups = {crumbly = 2, cracky = 2, snappy = 2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craft({ - output = "techage:tube_wall_entry", - recipe = { - {"", "techage:tubeS", ""}, - {"", "basic_materials:concrete_block", ""}, - {"", "",""}, - }, -}) diff --git a/techage/basis/tubes.lua b/techage/basis/tubes.lua deleted file mode 100644 index 177cb5e..0000000 --- a/techage/basis/tubes.lua +++ /dev/null @@ -1,148 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Tubes based on tubelib2 - -]]-- - -local S = techage.S - - --- used for registered nodes -techage.KnownNodes = { - ["techage:tubeS"] = true, - ["techage:tubeA"] = true, - ["techage:ta4_tubeS"] = true, - ["techage:ta4_tubeA"] = true, -} - - -local Tube = tubelib2.Tube:new({ - -- North, East, South, West, Down, Up - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = 200, - show_infotext = false, - primary_node_names = { - "techage:tubeS", "techage:tubeA", - "techage:ta4_tubeS", "techage:ta4_tubeA", - "techage:tube_wall_entry", - }, - after_place_tube = function(pos, param2, tube_type, num_tubes, tbl) - local name = minetest.get_node(pos).name - if name == "techage:tubeS" or name == "techage:tubeA" then - minetest.swap_node(pos, {name = "techage:tube"..tube_type, param2 = param2}) - elseif name == "techage:tube_wall_entry" then - minetest.swap_node(pos, {name = "techage:tube_wall_entry", param2 = param2}) - else - minetest.swap_node(pos, {name = "techage:ta4_tube"..tube_type, param2 = param2}) - end - end, -}) - -techage.Tube = Tube - -minetest.register_node("techage:tubeS", { - description = S("TechAge Tube"), - tiles = { -- Top, base, right, left, front, back - "techage_tube_tube.png^[transformR90", - "techage_tube_tube.png^[transformR90", - "techage_tube_tube.png", - "techage_tube_tube.png", - "techage_tube_hole.png", - "techage_tube_hole.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Tube:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Tube:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2/8, -2/8, -4/8, 2/8, 2/8, 4/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, - }, - collision_box = { - type = "fixed", - fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, - }, - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy=2, cracky=3}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:tubeA", { - description = S("TechAge Tube"), - tiles = { -- Top, base, right, left, front, back - "techage_tube_knee2.png", - "techage_tube_hole2.png^[transformR180", - "techage_tube_knee.png^[transformR270", - "techage_tube_knee.png", - "techage_tube_knee2.png", - "techage_tube_hole2.png", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Tube:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2/8, -4/8, -2/8, 2/8, 2/8, 2/8}, - {-2/8, -2/8, -4/8, 2/8, 2/8, -2/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = { -1/4, -1/2, -1/2, 1/4, 1/4, 1/4 }, - }, - collision_box = { - type = "fixed", - fixed = { -1/4, -1/2, -1/2, 1/4, 1/4, 1/4 }, - }, - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy=2, cracky=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - drop = "techage:tubeS", -}) - -minetest.register_craft({ - output = "techage:tubeS 4", - recipe = { - {"default:steel_ingot", "", "group:wood"}, - {"", "group:wood", ""}, - {"group:wood", "", "default:tin_ingot"}, - }, -}) diff --git a/techage/basis/tubes_ta4.lua b/techage/basis/tubes_ta4.lua deleted file mode 100644 index 6c06af2..0000000 --- a/techage/basis/tubes_ta4.lua +++ /dev/null @@ -1,120 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Tubes in TA4 design based on tubelib2 - -]]-- - -local Tube = techage.Tube -local S = techage.S - -minetest.register_node("techage:ta4_tubeS", { - description = S("TA4 Tube"), - tiles = { -- Top, base, right, left, front, back - "techage_tubeta4_tube.png^[transformR90", - "techage_tubeta4_tube.png^[transformR90", - "techage_tubeta4_tube.png", - "techage_tubeta4_tube.png", - "techage_tube_hole.png", - "techage_tube_hole.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Tube:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Tube:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2/8, -2/8, -4/8, 2/8, 2/8, 4/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, - }, - collision_box = { - type = "fixed", - fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, - }, - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy=2, cracky=3}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta4_tubeA", { - description = S("TA4 Tube"), - tiles = { -- Top, base, right, left, front, back - "techage_tubeta4_knee2.png", - "techage_tubeta4_hole2.png^[transformR180", - "techage_tubeta4_knee.png^[transformR270", - "techage_tubeta4_knee.png", - "techage_tubeta4_knee2.png", - "techage_tubeta4_hole2.png", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Tube:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2/8, -4/8, -2/8, 2/8, 2/8, 2/8}, - {-2/8, -2/8, -4/8, 2/8, 2/8, -2/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = { -1/4, -1/2, -1/2, 1/4, 1/4, 1/4 }, - }, - collision_box = { - type = "fixed", - fixed = { -1/4, -1/2, -1/2, 1/4, 1/4, 1/4 }, - }, - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy=2, cracky=3, not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta4_tubeS", -}) - -minetest.register_craft({ - output = "techage:ta4_tubeS 6", - recipe = { - {"dye:blue", "", "basic_materials:plastic_sheet"}, - {"", "basic_materials:plastic_sheet", ""}, - {"basic_materials:plastic_sheet", "", "techage:aluminum"}, - }, -}) - -techage.TA4tubes = { - ["techage:ta4_tubeS"] = true, - ["techage:ta4_tubeA"] = true, -} diff --git a/techage/basis/windturbine_lib.lua b/techage/basis/windturbine_lib.lua deleted file mode 100644 index bbd4397..0000000 --- a/techage/basis/windturbine_lib.lua +++ /dev/null @@ -1,86 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Wind turbine helper function - -]]-- - -local S = techage.S -local P = minetest.string_to_pos -local M = minetest.get_meta - -local OCEAN = "ocean" - -if minetest.global_exists("asuna") then - OCEAN = "below" -end - -local function chat_message(player_name, msg) - if player_name then - minetest.chat_send_player(player_name, S("[TA4 Wind Turbine]").." "..msg) - end - return false, msg -end - --- num_turbines is the mx number of valid wind turbines. In the case of a tool --- it should be 0, in case of the rotor: 1 -function techage.valid_place_for_windturbine(pos, player_name, num_turbines) - local pos1, pos2, num - - -- Check if occean (only for tool) - if num_turbines == 0 and pos.y ~= 1 then - return chat_message(player_name, S("This is not the surface of the ocean!")) - end - local node = minetest.get_node(pos) - if num_turbines == 0 and node.name ~= "default:water_source" then - return chat_message(player_name, S("This is no ocean water!")) - end - local data = minetest.get_biome_data({x=pos.x, y=-2, z=pos.z}) - if data then - local name = minetest.get_biome_name(data.biome) - if not string.find(name, OCEAN) then - return chat_message(player_name, S("This is a").." "..name.." "..S("biome and no ocean!")) - end - end - -- check the space over ocean - pos1 = {x=pos.x-20, y=2, z=pos.z-20} - pos2 = {x=pos.x+20, y=22, z=pos.z+20} - num = #minetest.find_nodes_in_area(pos1, pos2, {"air", "ignore"}) - if num < (41 * 41 * 21 * 0.9) then - techage.mark_region(player_name, pos1, pos2, "") - return chat_message(player_name, - S("Here is not enough wind\n(A free air space of 41x41x21 m is necessary)!")) - end - -- Check for water surface (occean) - pos1 = {x=pos.x-20, y=1, z=pos.z-20} - pos2 = {x=pos.x+20, y=1, z=pos.z+20} - num = #minetest.find_nodes_in_area(pos1, pos2, - {"default:water_source", "default:water_flowing", "ignore"}) - - if num < (41*41 * 0.8) then - techage.mark_region(player_name, pos1, pos2, "") - return chat_message(player_name, S("Here is not enough water (41x41 m)!")) - end - -- Check for next wind turbine - pos1 = {x=pos.x-13, y=2, z=pos.z-13} - pos2 = {x=pos.x+13, y=22, z=pos.z+13} - - num = #minetest.find_nodes_in_area(pos1, pos2, {"techage:ta4_wind_turbine"}) - if num > num_turbines then - techage.mark_region(player_name, pos1, pos2, "") - return chat_message(player_name, S("The next wind turbines is too close!")) - end - - if num_turbines == 0 then - chat_message(player_name, minetest.pos_to_string(pos).." ".. - S("is a suitable place for a wind turbine!")) - end - return true, "ok" -end diff --git a/techage/beduino/kv_store.lua b/techage/beduino/kv_store.lua deleted file mode 100644 index 9f565b7..0000000 --- a/techage/beduino/kv_store.lua +++ /dev/null @@ -1,60 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - K/V Store for the Beduino controller - -]]-- - -local COSTS = 400 - -local function ta_kv_init(cpu_pos, address, regA, regB, regC) - local nvm = techage.get_nvm(cpu_pos) - nvm.kv_store = {} - return 1, COSTS -end - -local function ta_kv_add(cpu_pos, address, regA, regB, regC) - local nvm = techage.get_nvm(cpu_pos) - local text = vm16.read_ascii(cpu_pos, regA, 32) - nvm.kv_store[text] = regB - return 1, COSTS -end - -local function ta_kv_get(cpu_pos, address, regA, regB, regC) - local nvm = techage.get_nvm(cpu_pos) - local text = vm16.read_ascii(cpu_pos, regA, 32) - return nvm.kv_store[text] or 0, COSTS -end - -local kvstore_c = [[ -// Initialize the key/value store -func ta_kv_init() { - return system(0x140, 0); -} - -// Add a key/value pair to the store -func ta_kv_add(key_str, value) { - return system(0x141, key_str, value); -} - -// Returns the value for the given key string -func ta_kv_get(key_str) { - return system(0x142, key_str); -} -]] - -minetest.register_on_mods_loaded(function() - if minetest.global_exists("beduino") and minetest.global_exists("vm16") then - beduino.lib.register_SystemHandler(0x140, ta_kv_init) - beduino.lib.register_SystemHandler(0x141, ta_kv_add) - beduino.lib.register_SystemHandler(0x142, ta_kv_get) - vm16.register_ro_file("beduino", "lib/ta_kvstore.c", kvstore_c) - end -end) diff --git a/techage/carts/chest_cart.lua b/techage/carts/chest_cart.lua deleted file mode 100644 index ff6da7d..0000000 --- a/techage/carts/chest_cart.lua +++ /dev/null @@ -1,181 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Chest Cart - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local MP = minetest.get_modpath("minecart") - -local Tube = techage.Tube - -local function on_rightclick(pos, node, clicker) - if clicker and clicker:is_player() then - if M(pos):get_int("userID") == 0 then - minecart.show_formspec(pos, clicker) - end - end -end - -local function formspec() - return "size[8,6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;3,0;2,2;]".. - "list[current_player;main;0,2.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - local owner = M(pos):get_string("owner") - if owner ~= "" and owner ~= player:get_player_name() then - return 0 - end - return stack:get_count() -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - local owner = M(pos):get_string("owner") - if owner ~= "" and owner ~= player:get_player_name() then - return 0 - end - return stack:get_count() -end - -minetest.register_node("techage:chest_cart", { - description = S("TA Chest Cart"), - tiles = { - -- up, down, right, left, back, front - "techage_chest_cart_top.png", - "techage_chest_cart_bottom.png", - "techage_chest_cart_side.png", - "techage_chest_cart_side.png", - "techage_chest_cart_front.png", - "techage_chest_cart_front.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-7/16, 3/16, -7/16, 7/16, 8/16, 7/16}, - {-8/16, -8/16, -8/16, 8/16, 3/16, 8/16}, - }, - }, - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2}, - node_placement_prediction = "", - diggable = false, - - on_place = minecart.on_nodecart_place, - on_punch = minecart.on_nodecart_punch, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_rightclick = on_rightclick, - - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size('main', 4) - if placer and placer:is_player() then - minecart.show_formspec(pos, placer) - else - M(pos):set_string("formspec", formspec()) - end - end, - - set_cargo = function(pos, data) - local inv = M(pos):get_inventory() - for idx, stack in ipairs(data) do - inv:set_stack("main", idx, stack) - end - end, - - get_cargo = function(pos) - local inv = M(pos):get_inventory() - local data = {} - for idx = 1, 4 do - local stack = inv:get_stack("main", idx) - data[idx] = {name = stack:get_name(), count = stack:get_count()} - end - return data - end, - - has_cargo = function(pos) - local inv = minetest.get_meta(pos):get_inventory() - return not inv:is_empty("main") - end -}) - -minecart.register_cart_entity("techage:chest_cart_entity", "techage:chest_cart", "chest", { - initial_properties = { - physical = false, - collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - visual = "wielditem", - textures = {"techage:chest_cart"}, - visual_size = {x=0.66, y=0.66, z=0.66}, - static_save = false, - }, -}) - -techage.register_node({"techage:chest_cart"}, { - on_pull_item = function(pos, in_dir, num, item_name) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", 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, "main", 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, "main", stack) - end, - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_inv_state(inv, "main") - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then -- Chest State - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return 0, {techage.get_inv_state_num(inv, "main")} - else - return 2, "" - end - end, -}) - -Tube:set_valid_sides("techage:chest_cart", {"L", "R", "F", "B"}) - -minetest.register_craft({ - output = "techage:chest_cart", - recipe = { - {"default:junglewood", "default:chest_locked", "default:junglewood"}, - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - }, -}) diff --git a/techage/carts/tank_cart.lua b/techage/carts/tank_cart.lua deleted file mode 100644 index 48796b4..0000000 --- a/techage/carts/tank_cart.lua +++ /dev/null @@ -1,176 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Tank Cart - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local Pipe = techage.LiquidPipe -local MP = minetest.get_modpath("minecart") - -local liquid = networks.liquid -local CAPACITY = 200 - -local function on_rightclick(pos, node, clicker) - if clicker and clicker:is_player() then - if M(pos):get_int("userID") == 0 then - minecart.show_formspec(pos, clicker) - else - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - minetest.get_node_timer(pos):start(2) - end - end -end - -local function node_timer(pos, elapsed) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - return true - end - return false -end - -local function peek_liquid(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) -end - -local function take_liquid(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - amount, name = liquid.srv_take(nvm, name, amount) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - end - return amount, name -end - -local function put_liquid(pos, indir, name, amount) - -- check if it is not powder - local ndef = minetest.registered_craftitems[name] or {} - if not ndef.groups or ndef.groups.powder ~= 1 then - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, CAPACITY) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - end - return leftover - end - return amount -end - -local function untake_liquid(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, CAPACITY) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - end - return leftover -end - -minetest.register_node("techage:tank_cart", { - description = S("TA Tank Cart"), - tiles = { - -- up, down, right, left, back, front - "techage_tank_cart_top.png", - "techage_tank_cart_bottom.png", - "techage_tank_cart_side.png", - "techage_tank_cart_side.png", - "techage_tank_cart_front.png", - "techage_tank_cart_front.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/16, 7/16, -3/16, 3/16, 8/16, 3/16}, - {-7/16, 3/16, -7/16, 7/16, 7/16, 7/16}, - {-8/16, -8/16, -8/16, 8/16, 3/16, 8/16}, - }, - }, - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2}, - node_placement_prediction = "", - diggable = false, - - on_place = minecart.on_nodecart_place, - on_punch = minecart.on_nodecart_punch, - - after_place_node = function(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - -- Delete the network between pump and cart - Pipe:after_dig_node(pos) - Pipe:after_place_node(pos) - end, - - set_cargo = function(pos, data) - local nvm = techage.get_nvm(pos) - nvm.liquid = data - end, - - get_cargo = function(pos) - local nvm = techage.get_nvm(pos) - local data = nvm.liquid - nvm.liquid = {} - return data - end, - - has_cargo = function(pos) - return not techage.liquid.is_empty(pos) - end, - - on_timer = node_timer, - on_rightclick = on_rightclick, -}) - -techage.register_node({"techage:tank_cart"}, techage.liquid.recv_message) - -liquid.register_nodes({"techage:tank_cart"}, - Pipe, "tank", {"U"}, { - capa = CAPACITY, - peek = peek_liquid, - put = put_liquid, - take = take_liquid, - untake = untake_liquid, - } -) - -minecart.register_cart_entity("techage:tank_cart_entity", "techage:tank_cart", "tank", { - initial_properties = { - physical = false, - collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - visual = "wielditem", - textures = {"techage:tank_cart"}, - visual_size = {x=0.66, y=0.66, z=0.66}, - static_save = false, - }, - only_dig_if_empty = 1, -}) - -minetest.register_craft({ - output = "techage:tank_cart", - recipe = { - {"default:junglewood", "techage:ta3_tank", "default:junglewood"}, - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - }, -}) diff --git a/techage/chemistry/ta4_doser.lua b/techage/chemistry/ta4_doser.lua deleted file mode 100644 index d2c05db..0000000 --- a/techage/chemistry/ta4_doser.lua +++ /dev/null @@ -1,394 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Doser - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid -local recipes = techage.recipes - -local Liquids = {} -- {hash(pos) = {name = outdir},...} - -local STANDBY_TICKS = 2 -local COUNTDOWN_TICKS = 3 -local CYCLE_TIME = 10 - -local function formspec(self, pos, nvm) - return "size[6,3.6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;5.8,0.5;#c6e8ff]".. - "label[2.5,-0.1;"..minetest.colorize( "#000000", S("Doser")).."]".. - recipes.formspec(0.1, 0.8, "ta4_doser", nvm).. - "image_button[5,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[5,2;1,1;"..self:get_state_tooltip(nvm).."]" -end - -local function get_liquids(pos) - local hash = minetest.hash_node_position(pos) - if Liquids[hash] then - return Liquids[hash] - end - -- determine the available input liquids - local tbl = {} - for outdir = 1,4 do - local name, num = liquid.peek(pos, Pipe, outdir) - if name then - tbl[name] = outdir - end - end - Liquids[hash] = tbl - return Liquids[hash] -end - -local function del_liquids(pos) - local hash = minetest.hash_node_position(pos) - Liquids[hash] = nil -end - --- if liquids are missing, update the cached liquid table -local function reload_liquids(pos) - local hash = minetest.hash_node_position(pos) - -- determine the available input liquids - local tbl = {} - for outdir = 1,4 do - local name, num = liquid.peek(pos, Pipe, outdir) - if name then - tbl[name] = outdir - end - end - Liquids[hash] = tbl - return Liquids[hash] -end - -local function reactor_cmnd(pos, cmnd, payload) - return techage.transfer( - pos, - 6, -- outdir - cmnd, -- topic - payload, -- payload - Pipe, -- network - {"techage:ta4_reactor_fillerpipe"}) -end - - -local function can_start(pos, nvm, state) - -- check reactor - local res = reactor_cmnd(pos, "check") - if not res then - return S("reactor defect") - end - res = reactor_cmnd(pos, "can_start") - if not res then - return S("reactor defect or no power") - end - local recipe = recipes.get(nvm, "ta4_doser") - if recipe.catalyst then - res = reactor_cmnd(pos, "catalyst") - if not res or res == "" then - return S("catalyst missing") - end - if res ~= recipe.catalyst then - return S("wrong catalyst") - end - end - return true -end - -local function start_node(pos, nvm, state) - reactor_cmnd(pos, "start") - del_liquids(pos) - nvm.running = true -end - -local function stop_node(pos, nvm, state) - reactor_cmnd(pos, "stop") - nvm.running = false -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta4_doser", - node_name_active = "techage:ta4_doser_on", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - infotext_name = "TA4 Doser", - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function untake(pos, taken) - for _,item in pairs(taken) do - liquid.untake(pos, Pipe, item.outdir, item.name, item.num) - end -end - -local function dosing(pos, nvm, elapsed) - -- trigger reactor (power) - if not reactor_cmnd(pos, "power") then - if not nvm.techage_countdown or nvm.techage_countdown < 3 then - reactor_cmnd(pos, "stop") - State:nopower(pos, nvm, S("reactor has no power")) - return - end - State:idle(pos, nvm) - return - end - -- available liquids - local liquids = get_liquids(pos) - local recipe = recipes.get(nvm, "ta4_doser") - if not liquids or not recipe then return end - -- check from time to time - nvm.check_cnt = (nvm.check_cnt or 0) + 1 - if nvm.check_cnt >= 4 then - nvm.check_cnt = 0 - local res = reactor_cmnd(pos, "check") - if not res then - State:fault(pos, nvm, S("reactor defect")) - reactor_cmnd(pos, "stop") - return - end - if recipe.catalyst then - res = reactor_cmnd(pos, "catalyst") - if not res then - State:fault(pos, nvm, S("catalyst missing")) - reactor_cmnd(pos, "stop") - return - end - if res ~= recipe.catalyst then - State:fault(pos, nvm, S("wrong catalyst")) - reactor_cmnd(pos, "stop") - return - end - end - end - - -- check leftover - local leftover - local mem = techage.get_mem(pos) - if mem.waste_leftover then - leftover = reactor_cmnd(pos, "waste", { - name = mem.waste_leftover.name, - amount = mem.waste_leftover.num}) or mem.waste_leftover.num - if leftover > 0 then - mem.waste_leftover.num = leftover - State:blocked(pos, nvm) - return - end - mem.waste_leftover = nil - end - if mem.output_leftover then - leftover = reactor_cmnd(pos, "output", { - name = mem.output_leftover.name, - amount = mem.output_leftover.num}) or mem.output_leftover.num - if leftover > 0 then - mem.output_leftover.num = leftover - State:blocked(pos, nvm) - return - end - mem.output_leftover = nil - end - - -- inputs - local taken = {} - mem.dbg_cycles = (mem.dbg_cycles or 0) - 1 - - for _,item in pairs(recipe.input) do - if item.name ~= "" then - local outdir = liquids[item.name] or reload_liquids(pos)[item.name] - if not outdir then - State:standby(pos, nvm) - reactor_cmnd(pos, "stop") - untake(pos, taken) - return - end - local num = liquid.take(pos, Pipe, outdir, item.name, item.num, mem.dbg_cycles > 0) - if num < item.num then - taken[#taken + 1] = {outdir = outdir, name = item.name, num = num} - State:standby(pos, nvm) - reactor_cmnd(pos, "stop") - untake(pos, taken) - return - end - taken[#taken + 1] = {outdir = outdir, name = item.name, num = item.num} - end - end - -- waste - if recipe.waste.name ~= "" then - leftover = reactor_cmnd(pos, "waste", { - name = recipe.waste.name, - amount = recipe.waste.num}) or recipe.waste.num - if leftover > 0 then - mem.waste_leftover = {name = recipe.waste.name, num = leftover} - mem.output_leftover = {name = recipe.output.name, num = recipe.output.num} - State:blocked(pos, nvm) - reactor_cmnd(pos, "stop") - return - end - end - -- output - leftover = reactor_cmnd(pos, "output", { - name = recipe.output.name, - amount = recipe.output.num}) or recipe.output.num - if leftover > 0 then - mem.output_leftover = {name = recipe.output.name, num = leftover} - State:blocked(pos, nvm) - reactor_cmnd(pos, "stop") - return - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - dosing(pos, nvm, elapsed) - return State:is_active(nvm) -end - -local function on_rightclick(pos) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - if not nvm.running then - if recipes.on_receive_fields(pos, formname, fields, player) then - local mem = techage.get_mem(pos) - mem.waste_leftover = nil - mem.output_leftover = nil - end - end - local mem = techage.get_mem(pos) - mem.dbg_cycles = 5 - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -minetest.register_node("techage:ta4_doser", { - description = S("TA4 Doser"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_pump_up.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta4_doser") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", formspec(State, pos, nvm)) - meta:set_string("infotext", S("TA4 Doser").." "..number) - State:node_init(pos, nvm, number) - Pipe:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir, tlib2, node) - liquid.update_network(pos, dir, tlib2, node) - del_liquids(pos) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - Pipe:after_dig_node(pos) - techage.del_mem(pos) - end, - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta4_doser_on", { - description = S("TA4 Doser"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - { - name = "techage_filling8_ta4.png^techage_frame8_ta4.png^techage_appl_pump_up8.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - }, - - tubelib2_on_update2 = function(pos, dir, tlib2, node) - liquid.update_network(pos, dir, tlib2, node) - del_liquids(pos) - end, - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - diggable = false, - groups = {not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta4_doser", "techage:ta4_doser_on"}, Pipe, "pump", nil, {}) - -techage.register_node({"techage:ta4_doser", "techage:ta4_doser_on"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "recipe" then - techage.recipes.set_recipe(pos, "ta4_doser", payload) - return true - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return State:on_beduino_request_data(pos, topic, payload) - end, -}) - -techage.recipes.register_craft_type("ta4_doser", { - description = S("TA4 Reactor"), - icon = 'techage_reactor_filler_plan.png', - width = 2, - height = 2, -}) - -minetest.register_craft({ - output = "techage:ta4_doser", - recipe = { - {"", "techage:ta3_pipeS", ""}, - {"techage:ta3_pipeS", "techage:t4_pump", "techage:ta3_pipeS"}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) diff --git a/techage/chemistry/ta4_liquid_filter.lua b/techage/chemistry/ta4_liquid_filter.lua deleted file mode 100644 index 988a1d5..0000000 --- a/techage/chemistry/ta4_liquid_filter.lua +++ /dev/null @@ -1,209 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - Copyright (C) 2020 Thomas S. - - AGPL v3 - See LICENSE.txt for more information - - TA4 Liquid Filter - -]]-- - --- For now, the Red Mud -> Lye/Desert Cobble recipe is hardcoded. --- If necessary, this can be adjusted later. - -local M = minetest.get_meta -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - --- Checks if the filter structure is ok and returns the amount of gravel -local function checkStructure(pos) - local pos1_outer = {x=pos.x-2,y=pos.y-7,z=pos.z-2} - local pos2_outer = {x=pos.x+2,y=pos.y,z=pos.z+2} - local pos1_inner = {x=pos.x-1,y=pos.y-1,z=pos.z-1} - local pos2_inner = {x=pos.x+1,y=pos.y-7,z=pos.z+1} - local pos1_top = {x=pos.x-1,y=pos.y,z=pos.z-1} - local pos2_top = {x=pos.x+1,y=pos.y,z=pos.z+1} - local pos1_bottom = {x=pos.x-2,y=pos.y-8,z=pos.z-2} - local pos2_bottom = {x=pos.x+2,y=pos.y-8,z=pos.z+2} - - - local gravel = minetest.find_nodes_in_area(pos1_inner, pos2_inner, {"default:gravel"}) - - local _, inner = minetest.find_nodes_in_area(pos1_inner, pos2_inner, { - "default:desert_cobble" - }) - if #gravel + (inner["default:desert_cobble"] or 0) ~= 63 then -- 7x3x3=63 - return false, gravel - end - - local _, outer = minetest.find_nodes_in_area(pos1_outer, pos2_outer, { - "basic_materials:concrete_block", - "default:obsidian_glass" - }) - - -- + 4x7=28 (corners) - -- + 5x5-3x3=16 (top ring) - -- ------------------------------ - -- = 44 (total concrete) - if outer["basic_materials:concrete_block"] ~= 44 then - return false, gravel - end - if outer["default:obsidian_glass"] ~= 84 then -- 4x7x3=84 - return false, gravel - end - - local _,top = minetest.find_nodes_in_area(pos1_top, pos2_top, {"air"}) - if top["air"] ~= 8 then - return false, gravel - end - - local _,bottom = minetest.find_nodes_in_area(pos1_bottom, pos2_bottom, { - "basic_materials:concrete_block", - "techage:ta3_pipe_wall_entry" - }) - if bottom["basic_materials:concrete_block"] ~= 22 or bottom["techage:ta3_pipe_wall_entry"] ~= 2 then - return false, gravel - end - - if minetest.get_node({x=pos.x,y=pos.y-8,z=pos.z}).name ~= "techage:ta4_liquid_filter_sink" then - return false, gravel - end - - return true, gravel -end - -minetest.register_node("techage:ta4_liquid_filter_filler", { - description = S("TA4 Liquid Filter Filler"), - tiles = { - -- up, down, right, left, back, front - "basic_materials_concrete_block.png^techage_gaspipe_hole.png", - "basic_materials_concrete_block.png^techage_liquid_filter_filler_bottom.png", - "basic_materials_concrete_block.png^techage_liquid_filter_filler.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-6/8, -0.5, -6/8, 6/8, -0.25, 6/8}, - {-7/16, -0.25, -7/16, 7/16, 0, 7/16}, - {-1/8, 0, -1/8, 1/8, 13/32, 1/8}, - {-2/8, 13/32, -2/8, 2/8, 0.5, 2/8}, - }, - }, - after_place_node = function(pos) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.del_mem(pos) - end, - - paramtype = "light", - paramtype2 = "facedir", - use_texture_alpha = techage.CLIP, - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta4_liquid_filter_filler"}, - Pipe, "tank", {"U"}, { - capa = 1, - peek = function(...) return nil end, - put = function(pos, indir, name, amount) - local structure_ok, gravel = checkStructure(pos) - if name ~= "techage:redmud" then - return amount - end - if not structure_ok then - return amount - end - if #gravel < 33 then - return amount - end - if math.random() < 0.5 then - local out_pos = {x=pos.x,y=pos.y-8,z=pos.z} - local leftover = liquid.put(out_pos, Pipe, networks.side_to_outdir(out_pos, "R"), "techage:lye", 1) - if leftover > 0 then - return amount - end - else - minetest.swap_node(gravel[math.random(#gravel)], {name = "default:desert_cobble"}) - end - return amount - 1 - end, - take = function(...) return 0 end, - untake = function(pos, outdir, name, amount, player_name) - return amount - end, - } -) - - -minetest.register_node("techage:ta4_liquid_filter_sink", { - description = S("TA4 Liquid Filter Sink"), - tiles = { - -- up, down, right, left, back, front - "basic_materials_concrete_block.png^techage_appl_arrow.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png^techage_appl_hole_pipe.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 3/16, 0.5}, - {-0.5, 3/16, -0.5, 0.5, 5/16, -0.25}, - {0.25, 3/16, -0.5, 0.5, 5/16, 0.5}, - {-0.5, 3/16, 0.25, 0.5, 5/16, 0.5}, - {-0.5, 3/16, -0.5, -0.25, 5/16, 0.5} - }, - }, - after_place_node = function(pos) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta4_liquid_filter_sink"}, - Pipe, "pump", {"R"}, {} -) - - -minetest.register_craft({ - output = 'techage:ta4_liquid_filter_filler', - recipe = { - {'', 'techage:ta3_pipeS', ''}, - {'basic_materials:concrete_block', 'basic_materials:concrete_block', 'basic_materials:concrete_block'}, - {'', 'default:steel_ingot', ''}, - } -}) - -minetest.register_craft({ - output = 'techage:ta4_liquid_filter_sink 2', - recipe = { - {'basic_materials:concrete_block', '', 'basic_materials:concrete_block'}, - {'basic_materials:concrete_block', 'techage:ta3_pipeS', 'techage:ta3_pipeS'}, - {'basic_materials:concrete_block', 'basic_materials:concrete_block', 'basic_materials:concrete_block'}, - } -}) diff --git a/techage/chemistry/ta4_reactor.lua b/techage/chemistry/ta4_reactor.lua deleted file mode 100644 index 6b2108d..0000000 --- a/techage/chemistry/ta4_reactor.lua +++ /dev/null @@ -1,226 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Reactor - -]]-- - -local S = techage.S -local M = minetest.get_meta -local Pipe = techage.LiquidPipe -local Cable = techage.ElectricCable -local liquid = networks.liquid - -minetest.register_node("techage:ta4_reactor_fillerpipe", { - description = S("TA4 Reactor Filler Pipe"), - tiles = { - -- up, down, right, left, back, front - "techage_reactor_filler_top.png", - "techage_reactor_filler_top.png", - "techage_reactor_filler_side.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2/8, 13/32, -2/8, 2/8, 4/8, 2/8}, - {-1/8, 0/8, -1/8, 1/8, 4/8, 1/8}, - {-5/16, 0/8, -5/16, 5/16, 2/8, 5/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-2/8, 0/8, -2/8, 2/8, 4/8, 2/8}, - }, - after_place_node = function(pos) - local pos1 = {x = pos.x, y = pos.y-1, z = pos.z} - if minetest.get_node(pos1).name == "air" then - local node = minetest.get_node(pos) - minetest.remove_node(pos) - minetest.set_node(pos1, node) - Pipe:after_place_node(pos1) - end - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -local function stand_cmnd(pos, cmnd, payload) - return techage.transfer( - {x = pos.x, y = pos.y-1, z = pos.z}, - 5, -- outdir - cmnd, -- topic - payload, -- payload - nil, -- network - {"techage:ta4_reactor_stand"}) -end - -local function base_waste(pos, payload) - local pos2 = {x = pos.x, y = pos.y-3, z = pos.z} - local outdir = M(pos2):get_int("outdir") - return liquid.put(pos2, Pipe, outdir, payload.name, payload.amount, payload.player_name) -end - --- controlled by the doser -techage.register_node({"techage:ta4_reactor_fillerpipe"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "check" then - local pos2,node = Pipe:get_node(pos, 5) - if not node or node.name ~= "techage:ta4_reactor" then - return false - end - pos2,node = Pipe:get_node(pos2, 5) - if not node or node.name ~= "techage:ta4_reactor_stand" then - return false - end - return true - elseif topic == "waste" then - return base_waste(pos, payload or {}) - elseif topic == "catalyst" then - local pos2,node = Pipe:get_node(pos, 5) - if not node or node.name ~= "techage:ta4_reactor" then - return - end - local inv = M(pos2):get_inventory() - local stack = inv:get_stack("main", 1) - return stack and stack:get_name() - else - return stand_cmnd(pos, topic, payload or {}) - end - end, -}) - -liquid.register_nodes({"techage:ta4_reactor_fillerpipe"}, Pipe, "tank", {"U"}, {}) - -local function formspec() - local title = S("TA4 Reactor") - return "size[8,6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[3,-0.1;"..minetest.colorize("#000000", title).."]".. - "label[4.5,1.2;"..S("Catalyst").."]".. - "list[context;main;3.5,1;1,1;]".. - "list[current_player;main;0,2.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -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 - return 1 -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 - -minetest.register_node("techage:ta4_reactor", { - description = S("TA4 Reactor"), - tiles = {"techage_reactor_side.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_12h.obj", - selection_box = { - type = "fixed", - fixed = {-1/2, -23/32, -1/2, 1/2, 32/32, 1/2}, - }, - collision_box = { - type = "fixed", - fixed = {-1/2, -23/32, -1/2, 1/2, 32/32, 1/2}, - }, - after_place_node = function(pos) - local inv = M(pos):get_inventory() - inv:set_size('main', 1) - M(pos):set_string("formspec", formspec()) - end, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -techage.register_node({"techage:ta4_reactor"}, { - on_inv_request = function(pos, in_dir, access_type) - local meta = minetest.get_meta(pos) - return meta:get_inventory(), "main" - end, - on_pull_item = function(pos, in_dir, num, item_name) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", 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, "main", 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, "main", stack) - end, -}) - -minetest.register_craft({ - output = 'techage:ta4_reactor', - recipe = { - {'default:steel_ingot', 'techage:ta3_pipeS', 'default:steel_ingot'}, - {'techage:iron_ingot', '', 'techage:iron_ingot'}, - {'default:steel_ingot', 'techage:ta3_pipeS', 'default:steel_ingot'}, - } -}) - -minetest.register_craft({ - output = 'techage:ta4_reactor_fillerpipe', - recipe = { - {'', '', ''}, - {'', 'techage:ta3_pipeS', ''}, - {'default:steel_ingot', 'basic_materials:motor', 'default:steel_ingot'}, - } -}) - -minetest.register_lbm({ - label = "Upgrade reactor", - name = "techage:update_reactor", - - nodenames = { - "techage:ta4_reactor", - }, - - run_at_every_load = true, - - action = function(pos, node) - local inv = M(pos):get_inventory() - inv:set_size('main', 1) - M(pos):set_string("formspec", formspec()) - end, -}) diff --git a/techage/chemistry/ta4_stand.lua b/techage/chemistry/ta4_stand.lua deleted file mode 100644 index efd429e..0000000 --- a/techage/chemistry/ta4_stand.lua +++ /dev/null @@ -1,209 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Reactor Stand and Base - -]]-- - -local S = techage.S -local M = minetest.get_meta -local Cable = techage.ElectricCable -local Pipe = techage.LiquidPipe -local power = networks.power -local liquid = networks.liquid - -local PWR_NEEDED = 8 -local CYCLE_TIME = 2 - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_reactor", { - pos = pos, - gain = 0.5, - max_hear_distance = 10, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function on_power(pos) - M(pos):set_string("infotext", S("on")) - play_sound(pos) - local nvm = techage.get_nvm(pos) - nvm.running = true -end - -local function on_nopower(pos) - M(pos):set_string("infotext", S("no power")) - stop_sound(pos) - local nvm = techage.get_nvm(pos) - nvm.running = false -end - -local function is_running(pos, nvm) - return nvm.running -end - -minetest.register_node("techage:ta4_reactor_stand", { - description = S("TA4 Reactor Stand"), - tiles = { - -- up, down, right, left, back, front - "techage_reactor_stand_top.png^[transformR90", - "techage_reactor_stand_bottom.png^[transformFY^[transformR270", - "techage_reactor_stand_front.png", - "techage_reactor_stand_back.png", - "techage_reactor_stand_side.png^[transformFX", - "techage_reactor_stand_side.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -8/16, 2/16, -8/16, 8/16, 4/16, 8/16 }, - - { -8/16, -8/16, -8/16, -6/16, 8/16, -6/16 }, - { 6/16, -8/16, -8/16, 8/16, 8/16, -6/16 }, - { -8/16, -8/16, 6/16, -6/16, 8/16, 8/16 }, - { 6/16, -8/16, 6/16, 8/16, 8/16, 8/16 }, - - {-1/8, -4/8, -1/8, 1/8, 4/8, 1/8}, - {-4/8, -1/8, -1/8, 4/8, 1/8, 1/8}, - {-4/8, -1/8, -3/8, -3/8, 1/8, 3/8}, - { 3/8, -1/8, -3/8, 4/8, 1/8, 3/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - - after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - M(pos):set_string("infotext", S("off")) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - on_timer = function(pos, elapsed) - local nvm = techage.get_nvm(pos) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if not nvm.running and consumed == PWR_NEEDED then - on_power(pos) - elseif nvm.running and consumed < PWR_NEEDED then - on_nopower(pos) - end - return true - end, - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - --- controlled by the fillerpipe -techage.register_node({"techage:ta4_reactor_stand"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "power" then - return nvm.running or power.power_available(pos, Cable) - elseif topic == "output" then - local outdir = M(pos):get_int("outdir") - return liquid.put(pos, Pipe, outdir, payload.name, payload.amount, payload.player_name) - elseif topic == "can_start" then - return power.power_available(pos, Cable) - elseif topic == "start" then - nvm.running = false - minetest.get_node_timer(pos):start(CYCLE_TIME) - M(pos):set_string("infotext", "...") - return true - elseif topic == "stop" then - nvm.has_power = false - stop_sound(pos) - minetest.get_node_timer(pos):stop() - M(pos):set_string("infotext", S("off")) - return true - end - end, - on_node_load = function(pos, node) - local nvm = techage.get_nvm(pos) - if nvm.has_power then - play_sound(pos) - end - end, -}) - -minetest.register_node("techage:ta4_reactor_base", { - description = S("TA4 Reactor Base"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_appl_arrowXL.png^techage_appl_hole_pipe.png^[transformR270", - "techage_concrete.png", - "techage_concrete.png^techage_appl_hole_pipe.png", - "techage_concrete.png", - "techage_concrete.png", - "techage_concrete.png", - }, - - after_place_node = function(pos, placer) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - end, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -liquid.register_nodes({"techage:ta4_reactor_base"}, Pipe, "pump", {"R"}, {}) -liquid.register_nodes({"techage:ta4_reactor_stand"}, Pipe, "pump", {"R"}, {}) -power.register_nodes({"techage:ta4_reactor_stand"}, Cable, "con", {"L"}) - -minetest.register_craft({ - output = 'techage:ta4_reactor_stand', - recipe = { - {'', 'dye:blue', ''}, - {'basic_materials:steel_bar', 'techage:ta3_pipeS', 'basic_materials:steel_bar'}, - {'basic_materials:steel_bar', '', 'basic_materials:steel_bar'}, - } -}) - -minetest.register_craft({ - output = 'techage:ta4_reactor_base', - recipe = { - {'basic_materials:concrete_block', '', ''}, - {'techage:ta3_pipeS', '', ''}, - {'', '', ''}, - } -}) diff --git a/techage/coal_power_station/boiler_base.lua b/techage/coal_power_station/boiler_base.lua deleted file mode 100644 index 73c37d5..0000000 --- a/techage/coal_power_station/boiler_base.lua +++ /dev/null @@ -1,67 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Coal Power Station Boiler Base - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.SteamPipe -local networks = techage.networks - -local function after_place_node(pos) - Pipe:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Pipe:after_dig_node(pos) -end - -minetest.register_node("techage:coalboiler_base", { - description = S("TA3 Boiler Base"), - tiles = {"techage_coal_boiler_mesh_base.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_12.obj", - selection_box = { - type = "fixed", - fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32}, - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype = "light", - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:coalboiler_base"}) - --- for logical communication -techage.register_node({"techage:coalboiler_base"}, { - on_transfer = function(pos, in_dir, topic, payload) - return true - end -}) - -minetest.register_craft({ - output = "techage:coalboiler_base", - recipe = { - {"default:stone", "", "default:stone"}, - {"techage:iron_ingot", "", "techage:iron_ingot"}, - {"default:stone", "default:stone", "default:stone"}, - }, -}) diff --git a/techage/coal_power_station/boiler_top.lua b/techage/coal_power_station/boiler_top.lua deleted file mode 100644 index 9ec177f..0000000 --- a/techage/coal_power_station/boiler_top.lua +++ /dev/null @@ -1,110 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Coal Power Station Boiler Top - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local CYCLE_TIME = 4 -local WATER_CONSUMPTION = 0.1 - -local Pipe = techage.SteamPipe -local boiler = techage.boiler - -local function steaming(pos, nvm, temp) - if temp >= 80 then - local wc = WATER_CONSUMPTION * (nvm.power_ratio or 1) - nvm.water_level = math.max((nvm.water_level or 0) - wc, 0) - end -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local temp = boiler.water_temperature(pos, nvm) - steaming(pos, nvm, temp) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", boiler.formspec(pos, nvm)) - end - return temp > 20 -end - -local function after_place_node(pos) - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name == "techage:coalboiler_base" then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", boiler.formspec(pos, nvm)) - Pipe:after_place_node(pos) - end -end - -local function after_dig_node(pos, oldnode) - Pipe:after_dig_node(pos) - techage.del_mem(pos) -end - -minetest.register_node("techage:coalboiler_top", { - description = S("TA3 Boiler Top"), - tiles = {"techage_coal_boiler_mesh_top.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_12.obj", - selection_box = { - type = "fixed", - fixed = {-13/32, -48/32, -13/32, 13/32, 16/32, 13/32}, - }, - - can_dig = boiler.can_dig, - on_timer = node_timer, - on_rightclick = boiler.on_rightclick, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_punch = boiler.on_punch, - - paramtype = "light", - paramtype2 = "facedir", - groups = {cracky=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:coalboiler_top"}) - - -techage.register_node({"techage:coalboiler_top"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "trigger" then - local nvm = techage.get_nvm(pos) - nvm.fire_trigger = true - if not minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):start(CYCLE_TIME) - end - if (nvm.temperature or 20) > 80 then - nvm.power_ratio = techage.transfer(pos, "F", "trigger", nil, Pipe, { - "techage:turbine", "techage:turbine_on"}) or 0 - return nvm.power_ratio - else - return 0 - end - end - end, -}) - -minetest.register_craft({ - output = "techage:coalboiler_top", - recipe = { - {"default:stone", "default:stone", "default:stone"}, - {"techage:iron_ingot", "", "techage:iron_ingot"}, - {"default:stone", "", "default:stone"}, - }, -}) diff --git a/techage/coal_power_station/cooler.lua b/techage/coal_power_station/cooler.lua deleted file mode 100644 index 31e9585..0000000 --- a/techage/coal_power_station/cooler.lua +++ /dev/null @@ -1,133 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Cooler - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.SteamPipe - -local function transfer(pos, in_dir, topic, payload) - return techage.transfer(pos, in_dir, topic, payload, Pipe, - {"techage:coalboiler_base"}) -end - -local function after_place_node(pos) - Pipe:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Pipe:after_dig_node(pos) - techage.del_mem(pos) -end - -minetest.register_node("techage:cooler", { - description = S("TA3 Cooler"), - tiles = { - -- up, down, right, left, back, front - { - name = "techage_filling4_ta3.png^techage_appl_cooler4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - { - name = "techage_filling4_ta3.png^techage_appl_cooler4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - --- legacy node -minetest.register_node("techage:cooler_on", { - description = S("TA3 Cooler"), - tiles = { - -- up, down, right, left, back, front - { - name = "techage_filling4_ta3.png^techage_appl_cooler4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - { - name = "techage_filling4_ta3.png^techage_appl_cooler4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - drop = "techage:cooler", - groups = {cracky=2, crumbly=2, choppy=2, not_in_creative_inventory=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:cooler", "techage:cooler_on"}) - --- for logical communication -techage.register_node({"techage:cooler", "techage:cooler_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - return transfer(pos, in_dir, topic, payload) - end -}) - -minetest.register_craft({ - output = "techage:cooler", - recipe = { - {"basic_materials:steel_bar", "default:wood", "basic_materials:steel_bar"}, - {"techage:steam_pipeS", "basic_materials:gear_steel", "techage:steam_pipeS"}, - {"basic_materials:steel_bar", "default:wood", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/coal_power_station/firebox.lua b/techage/coal_power_station/firebox.lua deleted file mode 100644 index e556883..0000000 --- a/techage/coal_power_station/firebox.lua +++ /dev/null @@ -1,231 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Coal Power Station Firebox - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local firebox = techage.firebox - -local CYCLE_TIME = 2 -local BURN_CYCLE_FACTOR = 0.5 - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local power = techage.transfer( - {x=pos.x, y=pos.y+2, z=pos.z}, - nil, -- outdir - "trigger", -- topic - nil, -- payload - nil, -- network - {"techage:coalboiler_top"} -- nodenames - ) - nvm.burn_cycles = (nvm.burn_cycles or 0) - math.max((power or 0.02), 0.02) - if nvm.burn_cycles <= 0 then - local taken = firebox.get_fuel(pos) - if taken then - nvm.burn_cycles = (firebox.Burntime[taken:get_name()] or 1) / CYCLE_TIME * BURN_CYCLE_FACTOR - nvm.burn_cycles_total = nvm.burn_cycles - else - nvm.running = false - firebox.set_firehole(pos, false) - M(pos):set_string("formspec", firebox.formspec(nvm)) - return false - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", firebox.formspec(nvm)) - end - return true -end - -local function start_firebox(pos, nvm) - if not nvm.running then - nvm.running = true - node_timer(pos, 0) - firebox.set_firehole(pos, true) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end -end - -minetest.register_node("techage:coalfirebox", { - description = S("TA3 Power Station Firebox"), - inventory_image = "techage_coal_boiler_inv.png", - tiles = {"techage_coal_boiler_mesh_top.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_12.obj", - selection_box = { - type = "fixed", - fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32}, - }, - - paramtype = "light", - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - - on_timer = node_timer, - can_dig = firebox.can_dig, - allow_metadata_inventory_put = firebox.allow_metadata_inventory_put, - allow_metadata_inventory_take = firebox.allow_metadata_inventory_take, - on_rightclick = firebox.on_rightclick, - - after_place_node = function(pos, placer) - if firebox.is_free_position(pos, placer:get_player_name()) then - techage.add_node(pos, "techage:coalfirebox", true) - local nvm = techage.get_nvm(pos) - nvm.running = false - nvm.burn_cycles = 0 - local meta = M(pos) - meta:set_string("formspec", firebox.formspec(nvm)) - local inv = meta:get_inventory() - inv:set_size('fuel', 1) - firebox.set_firehole(pos, false) - else - minetest.remove_node(pos) - return true - end - end, - - on_destruct = function(pos) - firebox.set_firehole(pos, nil) - end, - - on_metadata_inventory_put = function(pos, listname, index, stack, player) - local nvm = techage.get_nvm(pos) - start_firebox(pos, nvm) - M(pos):set_string("formspec", firebox.formspec(nvm)) - end, -}) - -minetest.register_node("techage:coalfirehole", { - description = S("TA3 Coal Power Station Firebox"), - tiles = { - -- up, down, right, left, back, front - "techage_coal_boiler.png", - "techage_coal_boiler.png", - "techage_coal_boiler.png", - "techage_coal_boiler.png", - "techage_coal_boiler.png", - "techage_coal_boiler.png^techage_appl_firehole.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-6/16, -6/16, 6/16, 6/16, 6/16, 12/16}, - }, - }, - - paramtype = "light", - paramtype2 = "facedir", - pointable = false, - diggable = false, - is_ground_content = false, - groups = {not_in_creative_inventory=1}, -}) - -minetest.register_node("techage:coalfirehole_on", { - description = S("TA3 Coal Power Station Firebox"), - tiles = { - -- up, down, right, left, back, front - "techage_coal_boiler.png^[colorize:black:80", - "techage_coal_boiler.png^[colorize:black:80", - "techage_coal_boiler.png^[colorize:black:80", - "techage_coal_boiler.png^[colorize:black:80", - "techage_coal_boiler.png^[colorize:black:80", - { - name = "techage_coal_boiler4.png^[colorize:black:80^techage_appl_firehole4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-6/16, -6/16, 6/16, 6/16, 6/16, 12/16}, - }, - }, - paramtype = "light", - paramtype2 = "facedir", - light_source = 8, - pointable = false, - diggable = false, - is_ground_content = false, - groups = {not_in_creative_inventory=1}, -}) - - -techage.register_node({"techage:coalfirebox"}, { - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "fuel", num) - end, - on_push_item = function(pos, in_dir, stack) - if firebox.Burntime[stack:get_name()] then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local nvm = techage.get_nvm(pos) - start_firebox(pos, nvm) - return techage.put_items(inv, "fuel", stack) - end - return false - 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, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - return nvm.running and "running" or "stopped" - elseif topic == "fuel" then - return techage.fuel.get_fuel_amount(nvm) - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 128 then - return 0, techage.get_node_lvm(pos).name - elseif topic == 129 then - return 0, {nvm.running and techage.RUNNING or techage.STOPPED} - elseif topic == 132 then - return 0, {techage.fuel.get_fuel_amount(nvm)} - else - return 2, "" - end - end, -}) - -minetest.register_craft({ - output = "techage:coalfirebox", - recipe = { - {'default:stone', 'default:stone', 'default:stone'}, - {'default:steel_ingot', '', 'default:steel_ingot'}, - {'default:stone', 'default:stone', 'default:stone'}, - }, -}) diff --git a/techage/coal_power_station/generator.lua b/techage/coal_power_station/generator.lua deleted file mode 100644 index 34a7e28..0000000 --- a/techage/coal_power_station/generator.lua +++ /dev/null @@ -1,276 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Power Station Generator - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local CYCLE_TIME = 2 -local STANDBY_TICKS = 4 -local COUNTDOWN_TICKS = 4 -local PWR_PERF = 80 - -local function formspec(self, pos, nvm) - return techage.generator_formspec(self, pos, nvm, S("Generator"), nvm.provided, PWR_PERF) -end - -local function transfer_turbine(pos, topic, payload) - return techage.transfer(pos, "L", topic, payload, nil, - {"techage:turbine", "techage:turbine_on"}) -end - -local function can_start(pos, nvm, state) - return (nvm.firebox_trigger or 0) > 0 -- by means of firebox -end - -local function has_fire(nvm) - nvm.firebox_trigger = (nvm.firebox_trigger or 0) - 1 - return nvm.firebox_trigger > 0 -end - -local function start_node(pos, nvm, state) - local meta = M(pos) - nvm.provided = 0 - local outdir = meta:get_int("outdir") - transfer_turbine(pos, "start") - power.start_storage_calc(pos, Cable, outdir) - techage.evaluate_charge_termination(nvm, meta) -end - -local function stop_node(pos, nvm, state) - nvm.provided = 0 - local outdir = M(pos):get_int("outdir") - transfer_turbine(pos, "stop") - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:generator", - node_name_active = "techage:generator_on", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - infotext_name = S("TA3 Generator"), - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local running = techage.is_running(nvm) - local fire = has_fire(nvm) - if running and not fire then - State:standby(pos, nvm) - stop_node(pos, nvm, State) - elseif not running and fire then - State:start(pos, nvm) - -- start_node() is called implicit - elseif running then - local meta = M(pos) - local outdir = meta:get_int("outdir") - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Cable, outdir, PWR_PERF, tp1, tp2) - local val = power.get_storage_load(pos, Cable, outdir, PWR_PERF) - if val > 0 then - nvm.load = val - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:generator") - State:node_init(pos, nvm, number) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - -minetest.register_node("techage:generator", { - description = S("TA3 Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_electric.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_open.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator.png^[transformFX]", - }, - - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_generator_data = get_generator_data, - ta3_formspec = techage.generator_settings("ta3", PWR_PERF), - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:generator_on", { - description = S("TA3 Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_electric.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_open.png^techage_frame_ta3.png", - { - name = "techage_filling4_ta3.png^techage_appl_generator4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - { - name = "techage_filling4_ta3.png^techage_appl_generator4.png^[transformFX]^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - }, - - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_generator_data = get_generator_data, - ta3_formspec = techage.generator_settings("ta3", PWR_PERF), - - drop = "", - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:generator", "techage:generator_on"}, Cable, "gen", {"R"}) - --- controlled by the turbine -techage.register_node({"techage:generator", "techage:generator_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "trigger" then - nvm.firebox_trigger = 3 - if techage.is_running(nvm) then - return math.max((nvm.provided or PWR_PERF) / PWR_PERF, 0.02) - else - return 0 - end - end - end, - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "delivered" then - return math.floor((nvm.provided or 0) + 0.5) - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 135 then -- Delivered Power - return 0, {math.floor((nvm.provided or 0) + 0.5)} - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, -}) - --- used by power terminal -control.register_nodes({"techage:generator", "techage:generator_on"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA3 Generator"), - number = meta:get_string("node_number") or "", - running = techage.is_running(nvm) or false, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = meta:get_string("termpoint"), - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:generator", - recipe = { - {"basic_materials:steel_bar", "dye:green", "default:wood"}, - {"", "basic_materials:gear_steel", "techage:electric_cableS"}, - {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/coal_power_station/oilfirebox.lua b/techage/coal_power_station/oilfirebox.lua deleted file mode 100644 index 7fd7ad2..0000000 --- a/techage/coal_power_station/oilfirebox.lua +++ /dev/null @@ -1,156 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Coal Power Station Firebox - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local firebox = techage.firebox -local fuel = techage.fuel -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - -local CYCLE_TIME = 2 -local BURN_CYCLE_FACTOR = 0.5 - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local power = techage.transfer( - {x=pos.x, y=pos.y+2, z=pos.z}, - nil, -- outdir - "trigger", -- topic - nil, -- payload - nil, -- network - {"techage:coalboiler_top"} -- nodenames - ) - nvm.burn_cycles = (nvm.burn_cycles or 0) - math.max((power or 0.02), 0.02) - if nvm.burn_cycles <= 0 then - local liq_name = fuel.get_fuel(nvm) - if liq_name then - nvm.burn_cycles = fuel.burntime(liq_name) / CYCLE_TIME * BURN_CYCLE_FACTOR - nvm.burn_cycles_total = nvm.burn_cycles - else - nvm.running = false - firebox.set_firehole(pos, false) - M(pos):set_string("formspec", fuel.formspec(nvm)) - return false - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", fuel.formspec(nvm)) - end - return true -end - -local function start_firebox(pos, nvm) - if not nvm.running and fuel.has_fuel(nvm) then - nvm.running = true - node_timer(pos, 0) - firebox.set_firehole(pos, true) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end -end - -minetest.register_node("techage:oilfirebox", { - description = S("TA3 Power Station Oil Burner"), - inventory_image = "techage_oil_boiler_inv.png", - tiles = {"techage_coal_boiler_mesh_top.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_12.obj", - selection_box = { - type = "fixed", - fixed = {-13/32, -16/32, -13/32, 13/32, 16/32, 13/32}, - }, - - paramtype = "light", - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - - on_timer = node_timer, - can_dig = fuel.can_dig, - on_rightclick = fuel.on_rightclick, - on_receive_fields = fuel.on_receive_fields, - - after_place_node = function(pos, placer) - if firebox.is_free_position(pos, placer:get_player_name()) then - techage.add_node(pos, "techage:oilfirebox", true) - local nvm = techage.get_nvm(pos) - nvm.running = false - nvm.burn_cycles = 0 - nvm.liquid = {} - nvm.liquid.amount = 0 - local meta = M(pos) - meta:set_string("formspec", fuel.formspec(nvm)) - local inv = meta:get_inventory() - firebox.set_firehole(pos, false) - else - minetest.remove_node(pos) - return true - end - end, - - on_destruct = function(pos) - firebox.set_firehole(pos, nil) - end, - - on_punch = function(pos, node, puncher, pointed_thing) - local nvm = techage.get_nvm(pos) - fuel.on_punch(pos, node, puncher, pointed_thing) - if nvm.liquid and nvm.liquid.amount and nvm.liquid.amount > 0 then - minetest.after(1, start_firebox, pos, nvm) - end - end, -}) - -liquid.register_nodes({"techage:oilfirebox"}, - Pipe, "tank", nil, fuel.get_liquid_table(fuel.BT_OIL, fuel.CAPACITY, start_firebox)) - - -techage.register_node({"techage:oilfirebox"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - return nvm.running and "running" or "stopped" - elseif topic == "fuel" then - return fuel.get_fuel_amount(nvm) - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 128 then - return 0, techage.get_node_lvm(pos).name - elseif topic == 129 then - return 0, {nvm.running and techage.RUNNING or techage.STOPPED} - elseif topic == 132 then - return 0, {fuel.get_fuel_amount(nvm)} - else - return 2, "" - end - end, -}) - -minetest.register_craft({ - output = "techage:oilfirebox", - recipe = { - {'', 'techage:coalfirebox', ''}, - {'', 'techage:ta3_barrel_empty', ''}, - {'', '', ''}, - }, -}) diff --git a/techage/coal_power_station/turbine.lua b/techage/coal_power_station/turbine.lua deleted file mode 100644 index 9f697d2..0000000 --- a/techage/coal_power_station/turbine.lua +++ /dev/null @@ -1,182 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Power Station Turbine - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.SteamPipe - -local function transfer_cooler(pos, topic, payload) - return techage.transfer(pos, 6, topic, payload, Pipe, - {"techage:cooler", "techage:cooler_on"}) -end - -local function transfer_generator(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, nil, - {"techage:generator", "techage:generator_on"}) -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_turbine", { - pos = pos, - gain = 1, - max_hear_distance = 15, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function after_place_node(pos) - Pipe:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - stop_sound(pos) - Pipe:after_dig_node(pos) - techage.del_mem(pos) -end - -local function tubelib2_on_update2(pos, outdir, tlib2, node) - swap_node(pos, "techage:turbine") - stop_sound(pos) -end - -minetest.register_node("techage:turbine", { - description = S("TA3 Turbine"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_open.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - "techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png^[transformFX", - "techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - tubelib2_on_update2 = tubelib2_on_update2, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:turbine_on", { - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_open.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", - { - name = "techage_filling4_ta3.png^techage_appl_turbine4.png^techage_frame4_ta3.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - { - name = "techage_filling4_ta3.png^techage_appl_turbine4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - }, - - tubelib2_on_update2 = tubelib2_on_update2, - - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:turbine", "techage:turbine_on"}) - -techage.register_node({"techage:turbine", "techage:turbine_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "trigger" then -- used by boiler - if not transfer_cooler(pos, topic, payload) then - return 0 - end - local power = transfer_generator(pos, topic, payload) - if not power or power <= 0 and nvm.running then - swap_node(pos, "techage:turbine") - stop_sound(pos) - nvm.running = false - return 0 - end - return power - elseif topic == "start" then -- used by generator - swap_node(pos, "techage:turbine_on") - play_sound(pos) - nvm.running = true - return true - elseif topic == "stop" then -- used by generator - swap_node(pos, "techage:turbine") - stop_sound(pos) - nvm.running = false - return true - end - end, - on_node_load = function(pos, node) - if node.name == "techage:turbine_on" then - play_sound(pos) - end - end, -}) - -minetest.register_craft({ - output = "techage:turbine", - recipe = { - {"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/techage/collider/cooler.lua b/techage/collider/cooler.lua deleted file mode 100644 index 435b58f..0000000 --- a/techage/collider/cooler.lua +++ /dev/null @@ -1,89 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Cooler as part of the Collider - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe - -minetest.register_node("techage:ta4_collider_cooler", { - description = S("TA4 Collider Cooler"), - tiles = { - -- up, down, right, left, back, front - { - name = "techage_appl_cooler4.png^techage_frame4_ta4_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - { - name = "techage_appl_cooler4.png^techage_frame4_ta4_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_cooler.png", - }, - paramtype2 = "facedir", - groups = {cracky = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - networks = { - pipe2 = {}, - }, - - after_place_node = function(pos, placer, itemstack) - Pipe:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - techage.del_mem(pos) - end, -}) - -Pipe:add_secondary_node_names({"techage:ta4_collider_cooler"}) -Pipe:set_valid_sides("techage:ta4_collider_cooler", {"R", "L"}) - -techage.register_node({"techage:ta4_collider_cooler"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "cooler" then - return true - else - return false - end - end, -}) - -minetest.register_craft({ - output = "techage:ta4_collider_cooler", - recipe = { - {'', 'dye:blue', ''}, - {'', 'techage:cooler', ''}, - {'', 'techage:aluminum', ''}, - }, -}) diff --git a/techage/collider/detector.lua b/techage/collider/detector.lua deleted file mode 100644 index df8f86d..0000000 --- a/techage/collider/detector.lua +++ /dev/null @@ -1,448 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Detector as part of the Collider - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local getpos = techage.assemble.get_pos - -local CYCLE_TIME = 2 -local TNO_MAGNETS = 22 -local IMPROBABILITY = 40 -- every 40 min --- one point per 40 min: check every 20 s => factor = 40 * 3 = 120 -IMPROBABILITY = (minetest.settings:get("techage_expoint_rate_in_min") or 40) * 3 - -local TIME_SLOTS = 10 -local Schedule = {[0] = - -- Route: 0 = forward, 1 = right, 2 = backward, 3 = left - -- Gas left/right - {name = "techage:ta4_collider_pipe_inlet", yoffs = 1, route = {3,3,3,2}, check = techage.gas_inlet_check}, - {name = "techage:ta4_collider_pipe_inlet", yoffs = 1, route = {1,1,1,2}, check = techage.gas_inlet_check}, - -- Power left/right - {name = "techage:ta4_collider_cable_inlet", yoffs = 2, route = {3,3,3}, check = techage.power_inlet_check}, - {name = "techage:ta4_collider_cable_inlet", yoffs = 2, route = {1,1,1}, check = techage.power_inlet_check}, - -- Cooler - {name = "techage:ta4_collider_pipe_inlet", yoffs = 0, route = {0}, check = techage.cooler_check}, - {name = "techage:ta4_collider_pipe_inlet", yoffs = 2, route = {0}, check = techage.cooler_check}, - -- Air outlet - {name = "techage:ta4_collider_pipe_outlet", yoffs = 2, route = {}, check = techage.air_outlet_check}, - -- All nodes - {name = "shell", yoffs = 0, route = {}, check = nil}, -} - -local function play_sound(pos) - minetest.sound_play("techage_hum", { - pos = pos, - gain = 0.5, - max_hear_distance = 10, - }) -end - -local function terminal_message(pos, msg) - local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num") - local own_num = M(pos):get_string("node_number") - - if term_num and own_num then - techage.send_single(own_num, term_num, "text", msg) - end -end - -local function experience_points(pos) - if math.random(IMPROBABILITY) == 1 then - local owner = M(pos):get_string("owner") - local own_num = M(pos):get_string("node_number") - local player = minetest.get_player_by_name(owner) - if player then - if techage.add_expoint(player, own_num) then - terminal_message(pos, "Experience point reached!") - end - end - end -end - -local function check_shell(pos, param2) - local pos1 = getpos(pos, param2, {3,3,3,2}, 0) - local pos2 = getpos(pos, param2, {1,1,1,0}, 2) - local _, tbl = minetest.find_nodes_in_area(pos1, pos2, {"techage:ta4_detector_magnet", "techage:ta4_colliderblock", "default:obsidian_glass"}) - if tbl["techage:ta4_detector_magnet"] < 16 then - return false, "Magnet missing" - elseif tbl["techage:ta4_colliderblock"] < 31 then - return false, "Steel block missing" - elseif tbl["default:obsidian_glass"] < 1 then - return false, "Obsidian glass missing" - end - return true -end - -local function check_state(pos) - -- Cyclically check all connections - local param2 = minetest.get_node(pos).param2 - local nvm = techage.get_nvm(pos) - nvm.ticks = (nvm.ticks or 0) + 1 - local idx = nvm.ticks % TIME_SLOTS - local item = Schedule[idx] - - if idx == 1 then - nvm.result = true - end - - if item then - if item.name == "shell" then - local res, err = check_shell(pos, param2) - if not res then - nvm.result = false - nvm.runnning = false - terminal_message(pos, (err or "unknown") .. "!!!") - return nvm.result - end - else - local pos2 = getpos(pos, param2, item.route, item.yoffs) - local nvm2 = techage.get_nvm(pos2) - local meta2 = M(pos2) - local node2 = minetest.get_node(pos2) - if item.name == node2.name then - local res, err = item.check(pos2, node2, meta2, nvm2) - --print("check_state", idx, res, err) - if not res then - nvm.result = false - nvm.runnning = false - terminal_message(pos, (err or "unknown") .. "!!!") - return nvm.result - end - else - nvm.result = false - nvm.runnning = false - terminal_message(pos, "Detector defect!!!") - end - end - elseif idx == #Schedule + 1 then - return nvm.result - end -end - -local function add_laser(pos) - local param2 = minetest.get_node(pos).param2 - local pos1 = getpos(pos, param2, {3,3}, 1) - local pos2 = getpos(pos, param2, {1,1,1}, 1) - techage.del_laser(pos) - techage.add_laser(pos, pos1, pos2) -end - -local function create_task(pos, task) - local mem = techage.get_mem(pos) - if not mem.co then - mem.co = coroutine.create(task) - end - - local _, err = coroutine.resume(mem.co, pos) - if err then - mem.co = nil - --print(err) - return - end - minetest.after(0.4, create_task, pos, task) -end - --- Call on_cyclic_check of all magents so that the magnets don't need a FLB. -local function magnets_on_cyclic_check(pos, nvm) - local ndef = minetest.registered_nodes["techage:ta4_magnet"] - for idx,pos2 in ipairs(nvm.magnet_positions or {}) do - local res = ndef.on_cyclic_check(pos2) - if res == -2 then - terminal_message(pos, "Magnet #" .. idx .. " defect!!!") - return false - elseif res == -1 then - terminal_message(pos, "Vacuum defect!!!") - techage.air_outlet_reset({x=pos.x, y=pos.y + 2, z=pos.z}) - return false - end - end - return true -end - --- Turn off all magnets so that they don't consume power -local function magnets_turn_off(pos, nvm) - local ndef = minetest.registered_nodes["techage:ta4_magnet"] - for idx,pos2 in ipairs(nvm.magnet_positions or {}) do - ndef.on_turn_off(pos2) - end -end - -local function cable_inlets_turn_on_off(pos, on) - local turn_on_off = function(pos, param2, item) - local pos2 = getpos(pos, param2, item.route, item.yoffs) - local node2 = minetest.get_node(pos2) - if item.name == node2.name then - local nvm = techage.get_nvm(pos2) - techage.power_inlet_turn_on_off(pos2, nvm, on) - end - end - - local param2 = minetest.get_node(pos).param2 - turn_on_off(pos, param2, Schedule[2]) - turn_on_off(pos, param2, Schedule[3]) -end - -minetest.register_node("techage:ta4_detector_core", { - description = S("TA4 Collider Detector Core"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png^techage_collider_detector_core.png", - "default_steel_block.png^techage_collider_detector_core.png", - "default_steel_block.png^techage_collider_detector_core.png", - "default_steel_block.png^techage_collider_detector_core.png", - }, - paramtype2 = "facedir", - groups = {cracky = 1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - - after_place_node = function(pos, placer, itemstack) - local nvm = techage.get_nvm(pos) - local meta = M(pos) - local own_num = techage.add_node(pos, "techage:ta4_detector_core") - meta:set_string("node_number", own_num) - meta:set_string("owner", placer:get_player_name()) - M({x=pos.x, y=pos.y - 1, z=pos.z}):set_string("infotext", S("TA4 Collider Detector") .. " " .. own_num) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_timer = function(pos, elapsed) - local nvm = techage.get_nvm(pos) - if nvm.running then - if not magnets_on_cyclic_check(pos, nvm) then - techage.del_laser(pos) - terminal_message(pos, "Detector stopped.") - magnets_turn_off(pos, nvm) - cable_inlets_turn_on_off(pos, false) - nvm.running = false - nvm.magnet_positions = nil - else - local res = check_state(pos) - if res == true then - experience_points(pos) - add_laser(pos) - if nvm.ticks <= TIME_SLOTS then -- only once - terminal_message(pos, "Detector running.") - end - elseif res == false then - techage.del_laser(pos) - magnets_turn_off(pos, nvm) - cable_inlets_turn_on_off(pos, false) - nvm.running = false - nvm.magnet_positions = nil - terminal_message(pos, "Detector stopped.") - end - if nvm.running then - play_sound(pos) - end - end - end - return true - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.on_remove_collider(digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, -}) - -local function check_expr(own_num, term_num, text, expr) - techage.send_single(own_num, term_num, "text", text .. "..." .. (expr and "ok" or "error!!!")) - return expr -end - -local function start_task(pos) - local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num") - local param2 = minetest.get_node(pos).param2 - local pos2 = getpos(pos, param2, {3,3,3}, 1) - local own_num = M(pos):get_string("node_number") - local nvm = techage.get_nvm(pos) - nvm.magnet_positions = {} - - if term_num and param2 and pos2 then - techage.send_single(own_num, term_num, "text", "#### Start ####") - - 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 - - coroutine.yield() - techage.send_single(own_num, term_num, "text", "- Check position of magnets...") - 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 - t[#t + 1] = resp - end - coroutine.yield() - end - nvm.magnet_positions = t - techage.send_single(own_num, term_num, "append", "ok") - cable_inlets_turn_on_off(pos, true) - - coroutine.yield() - techage.send_single(own_num, term_num, "text", "- Check magnets...") - -- The check will be performed by the timer, so wait 5 sec. - for i = 1,14 do - coroutine.yield() - end - if nvm.magnet_positions then - techage.send_single(own_num, term_num, "append", "ok") - else - nvm.locked = false - return - end - - coroutine.yield() - techage.send_single(own_num, term_num, "text", "- Check detector...") - for _,item in ipairs(Schedule)do - if item.name == "shell" then - local res, err = check_shell(pos, param2) - if not res then - techage.send_single(own_num, term_num, "append", err .. "!!!") - nvm.magnet_positions = nil - nvm.locked = false - cable_inlets_turn_on_off(pos, false) - return - end - else - local pos2 = getpos(pos, param2, item.route, item.yoffs) - local nvm2 = techage.get_nvm(pos2) - local meta2 = M(pos2) - local node2 = minetest.get_node(pos2) - if item.name == node2.name then - local res, err = item.check(pos2, node2, meta2, nvm2) - if not res then - techage.send_single(own_num, term_num, "append", err .. "!!!") - nvm.magnet_positions = nil - nvm.locked = false - cable_inlets_turn_on_off(pos, false) - return - end - else - techage.send_single(own_num, term_num, "append", "defect!!!") - nvm.magnet_positions = nil - nvm.locked = false - cable_inlets_turn_on_off(pos, false) - return - end - coroutine.yield() - end - end - techage.send_single(own_num, term_num, "append", "ok") - - coroutine.yield() - techage.send_single(own_num, term_num, "text", "Collider starting...") - nvm.ticks = 0 - nvm.running = true - end -end - -local function test_magnet(pos, payload) - local term_num = M(pos):contains("term_num") and M(pos):get_string("term_num") - local param2 = minetest.get_node(pos).param2 - local pos2 = getpos(pos, param2, {3,3,3}, 1) - local own_num = M(pos):get_string("node_number") - local magnet_num = tonumber(payload) - local res, err = techage.tube_inlet_command(pos2, "test", magnet_num) - if res then - techage.send_single(own_num, term_num, "text", "magnet #" .. magnet_num .. ": ok") - else - techage.send_single(own_num, term_num, "text", "magnet #" .. magnet_num .. ": " .. (err or "unknown error") .. "!!!") - end -end - -techage.register_node({"techage:ta4_detector_core"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "connect" then - 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 - magnets_turn_off(pos, nvm) - cable_inlets_turn_on_off(pos, false) - nvm.magnet_positions = nil - return "Detector stopped." - elseif topic == "status" then - if nvm.running == true then - return "running" - elseif nvm.result == false then - return "fault" - else - return "stopped" - end - elseif topic == "test"then - if payload and tonumber(payload) then - test_magnet(pos, payload) - return true - else - return "Invalid magnet number" - end - elseif topic == "points" then - local owner = M(pos):get_string("owner") - local player = minetest.get_player_by_name(owner) - if player then - local points = techage.get_expoints(player) - return "Ex. Points = " .. points - end - else - return "unsupported" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - - -minetest.register_craft({ - output = "techage:ta4_detector_core", - recipe = { - {'techage:aluminum', 'basic_materials:heating_element', 'default:steel_ingot'}, - {'default:diamond', 'techage:ta4_wlanchip', 'techage:electric_cableS'}, - {'default:steel_ingot', '', 'techage:aluminum'}, - }, -}) diff --git a/techage/collider/inlets.lua b/techage/collider/inlets.lua deleted file mode 100644 index c8ec7fa..0000000 --- a/techage/collider/inlets.lua +++ /dev/null @@ -1,375 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Tube/Pipe Inputs/Outputs as part of the Collider - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local PWR_NEEDED = 15 -local CYCLE_TIME = 2 -local GAS_CAPA = 20 -local AIR_CAPA = 1000 - -local VTube = techage.VTube -local Pipe = techage.LiquidPipe -local Cable = techage.ElectricCable -local power = networks.power -local liquid = networks.liquid - --------------------------------------------------------------------------------- --- Tube Input --------------------------------------------------------------------------------- -minetest.register_node("techage:ta4_collider_tube_inlet", { - description = S("TA4 Collider Tube Input"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png^techage_collider_tube_open.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-4/8, -4/8, -4/8, -1/8, 4/8, 4/8}, - { 1/8, -4/8, -4/8, 4/8, 4/8, 4/8}, - {-4/8, 1/8, -4/8, 4/8, 4/8, 4/8}, - {-4/8, -4/8, -4/8, 4/8, -1/8, 4/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-4/8, -4/8, -4/8, 4/8, 4/8, 4/8}, - }, - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - groups = {cracky = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - - after_place_node = function(pos, placer, itemstack) - VTube:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode) - VTube:after_dig_node(pos) - techage.del_mem(pos) - end, -}) - -VTube:add_secondary_node_names({"techage:ta4_collider_tube_inlet"}) -VTube:set_valid_sides("techage:ta4_collider_tube_inlet", {"F"}) - --- Called from the detector via tube ring -techage.register_node({"techage:ta4_collider_tube_inlet"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "distance" then - return pos - elseif topic == "enumerate" and payload then - return payload - 1 - elseif topic == "check" then - local nvm = techage.get_nvm(pos) - nvm.check_received = true - return true - end - end, -}) - --- Used by the detector to check the tube connection -function techage.tube_inlet_command(pos, command, payload) - if command == "distance" then - local pos2 = techage.transfer(pos, "F", command, payload, VTube, {"techage:ta4_magnet"}) - if type(pos2) == "table" then - local dist = math.abs(pos.x - pos2.x) + math.abs(pos.z - pos2.z) - if pos.y == pos2.y and dist == VTube.max_tube_length + 1 then - return true - end - return 0 - else - return pos2 - end - end - return techage.transfer(pos, "F", command, payload, VTube, {"techage:ta4_magnet"}) -end - -minetest.register_craft({ - output = "techage:ta4_collider_tube_inlet", - recipe = { - {'', '', ''}, - {'techage:ta4_vtubeS', 'techage:ta4_colliderblock', ''}, - {'', '', ''}, - }, -}) - --------------------------------------------------------------------------------- --- Pipe Input (gas) --------------------------------------------------------------------------------- -minetest.register_node("techage:ta4_collider_pipe_inlet", { - description = S("TA4 Collider Pipe Input"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png^techage_appl_hole_pipe.png", - }, - drawtype = "nodebox", - paramtype2 = "facedir", - groups = {cracky = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - networks = { - pipe2 = {}, - }, - - after_place_node = function(pos, placer, itemstack) - local nvm = techage.get_nvm(pos) - Pipe:after_place_node(pos) - nvm.liquid = {} - end, - - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - techage.del_mem(pos) - end, -}) - -liquid.register_nodes({"techage:ta4_collider_pipe_inlet"}, Pipe, "tank", {"F"}, { - capa = GAS_CAPA, - peek = function(pos, indir) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_put(nvm, name, amount, GAS_CAPA) - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_take(nvm, name, amount) - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - liquid.srv_put(nvm, name, amount, GAS_CAPA) - end, -}) - -techage.register_node({"techage:ta4_collider_pipe_inlet"}, { - on_transfer = function(pos, in_dir, topic, payload) - -- called from heatexchanger - if topic == "detector" then - local nvm = techage.get_nvm(pos) - nvm.detector_received = true - return true - end - end, -}) - --- Used by the detector to check for gas pressure -function techage.gas_inlet_check(pos, node, meta, nvm) - nvm.liquid = nvm.liquid or {} - if nvm.liquid.amount == GAS_CAPA and nvm.liquid.name == "techage:isobutane" then - return true - end - return false, "no gas" -end - --- Used by the detector to check for cooler connection -function techage.cooler_check(pos, node, meta, nvm) - if nvm.detector_received then - nvm.detector_received = nil - return true - end - return false, "Cooler defect" -end - -minetest.register_craft({ - output = "techage:ta4_collider_pipe_inlet", - recipe = { - {'', '', ''}, - {'techage:ta3_pipeS', 'techage:ta4_colliderblock', ''}, - {'', '', ''}, - }, -}) - - --------------------------------------------------------------------------------- --- Pipe Output (air) --------------------------------------------------------------------------------- -local function init_air(nvm) - nvm.liquid = { - amount = AIR_CAPA, - name = "air", - } - return nvm.liquid -end - -minetest.register_node("techage:ta4_collider_pipe_outlet", { - description = S("TA4 Collider Pipe Output"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png^techage_appl_hole_pipe.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - }, - drawtype = "nodebox", - paramtype2 = "facedir", - groups = {cracky = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - networks = { - pipe2 = {}, - }, - - after_place_node = function(pos, placer, itemstack) - local nvm = techage.get_nvm(pos) - init_air(nvm) - Pipe:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - techage.del_mem(pos) - end, -}) - -liquid.register_nodes({"techage:ta4_collider_pipe_outlet"}, Pipe, "tank", {"U"}, { - capa = AIR_CAPA, - peek = function(pos, indir) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_put(nvm, name, amount, AIR_CAPA) - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_take(nvm, name, amount) - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - liquid.srv_put(nvm, name, amount, AIR_CAPA) - end, -}) - --- Used by the detector to check the vacuum -function techage.air_outlet_check(pos, node, meta, nvm) - nvm.liquid = nvm.liquid or {} - if nvm.liquid.amount == 0 then - return true - end - return false, "no vacuum" -end - -function techage.air_outlet_reset(pos) - local nvm = techage.get_nvm(pos) - init_air(nvm) -end - -minetest.register_craft({ - output = "techage:ta4_collider_pipe_outlet", - recipe = { - {'', 'techage:ta3_pipeS', ''}, - {'', 'techage:ta4_colliderblock', ''}, - {'', '', ''}, - }, -}) - --------------------------------------------------------------------------------- --- Cable Input (power) --------------------------------------------------------------------------------- -minetest.register_node("techage:ta4_collider_cable_inlet", { - description = S("TA4 Collider Cable Input"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png^techage_appl_hole_electric.png", - }, - drawtype = "nodebox", - paramtype2 = "facedir", - groups = {cracky = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - networks = { - pipe2 = {}, - }, - - after_place_node = function(pos, placer, itemstack) - Cable:after_place_node(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_timer = function(pos, elapsed) - local nvm = techage.get_nvm(pos) - if nvm.running then - nvm.consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - else - nvm.consumed = 0 - end - return true - end, - - after_dig_node = function(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, -}) - --- Used by the detector to check for power -function techage.power_inlet_check(pos, node, meta, nvm) - if nvm.consumed == PWR_NEEDED then - return true - end - return false, "no power" -end - --- Used by the detector to turn on/off the node -function techage.power_inlet_turn_on_off(pos, nvm, on) - nvm.running = on -end - -power.register_nodes({"techage:ta4_collider_cable_inlet"}, Cable, "con", {"F"}) - -techage.register_node({"techage:ta4_collider_cable_inlet"}, { - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -minetest.register_craft({ - output = "techage:ta4_collider_cable_inlet", - recipe = { - {'', '', ''}, - {'techage:electric_cableS', 'techage:ta4_colliderblock', ''}, - {'', '', ''}, - }, -}) diff --git a/techage/collider/magnet.lua b/techage/collider/magnet.lua deleted file mode 100644 index 76e13ea..0000000 --- a/techage/collider/magnet.lua +++ /dev/null @@ -1,333 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Magnet as part of the Collider - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string - -local PWR_NEEDED = 5 -local CYCLE_TIME = 2 -local CAPACITY = 10 - -local Cable = techage.ElectricCable -local Pipe = techage.LiquidPipe -local VTube = techage.VTube -local power = networks.power -local liquid = networks.liquid - -local function is_junction(pos, side) - local node = techage.get_node_lvm(techage.get_pos(pos, side)) - return node and techage.string_compare(node.name, "techage:ta3_junction") -end - --- Turn the magnet to the right direction -local function handle_legacy_magnet(pos) - if M(pos):get_string("version") ~= "V2" then - if is_junction(pos, "B") and not is_junction(pos, "F") then - local node = techage.get_node_lvm(pos) - node.param2 = (node.param2 + 2) % 4 - minetest.swap_node(pos, node) - end - end - M(pos):set_string("version", "V2") -end - -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 = { - -- up, down, right, left, back, front - "techage_collider_magnet.png^techage_collider_magnet_appl.png", - "techage_collider_magnet.png^techage_collider_magnet_appl.png", - "techage_collider_magnet.png", - "techage_collider_magnet.png", - "techage_collider_magnet.png^techage_collider_magnet_appl.png", - "techage_collider_magnet.png^techage_collider_magnet_appl.png", - }, - paramtype2 = "facedir", - groups = {cracky = 1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta4_magnet", { - description = S("TA4 Collider Magnet"), - inventory_image = minetest.inventorycube( - "techage_collider_magnet.png^techage_appl_hole_electric.png", - "techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_appl_hole_pipe.png^techage_collider_magnet_sign.png", - "techage_collider_magnet.png^techage_collider_magnet_tube.png"), - tiles = { - -- up, down, right, left, back, front - "techage_collider_magnet.png^techage_appl_hole_electric.png", - "techage_collider_magnet.png", - "techage_collider_magnet.png^techage_collider_magnet_tube.png", - "techage_collider_magnet.png^techage_collider_magnet_tube.png", - "techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_collider_magnet_sign.png", - "techage_collider_magnet.png^techage_collider_magnet_appl.png^techage_appl_hole_pipe.png^techage_collider_magnet_sign.png", - }, - drawtype = "nodebox", - use_texture_alpha = techage.CLIP, - node_box = { - type = "fixed", - fixed = { - {-11/16, -11/16, -11/16, 11/16, 11/16, -2/16}, - {-11/16, -11/16, 2/16, 11/16, 11/16, 11/16}, - {-11/16, 2/16, -11/16, 11/16, 11/16, 11/16}, - {-11/16, -11/16, -11/16, 11/16, -2/16, 11/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-4/8, -4/8, -4/8, 4/8, 4/8, 4/8}, - }, - collision_box = { - type = "fixed", - fixed = {-11/16, -11/16, -11/16, 11/16, 11/16, 11/16}, - }, - wield_scale = {x = 0.8, y = 0.8, z = 0.8}, - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - groups = {cracky = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - - after_place_node = function(pos, placer, itemstack) - if pos.y > techage.collider_min_depth then - minetest.remove_node(pos) - minetest.add_item(pos, ItemStack("techage:ta4_magnet")) - return - end - local nvm = techage.get_nvm(pos) - nvm.liquid = {} - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - VTube:after_place_node(pos) - M(pos):set_string("infotext", S("TA4 Collider Magnet") .. " #0") - M(pos):set_string("version", "V2") - end, - - -- To be called by the detector - on_cyclic_check = function(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.consumed = power.consume_power(pos, Cable, 6, PWR_NEEDED) - if nvm.tube_damage then - nvm.tube_damage = nil - nvm.running = nil - return -1 - elseif nvm.liquid.amount == CAPACITY and - nvm.liquid.name == "techage:isobutane" and - nvm.consumed == PWR_NEEDED then - nvm.running = true - return 0 - end - nvm.running = nil - return -2 - end, - - on_turn_off = function(pos) - local nvm = techage.get_nvm(pos) - nvm.running = nil - end, - - tubelib2_on_update2 = function(pos, outdir, tlib2, node) - if tlib2.tube_type == "vtube" then - local nvm = techage.get_nvm(pos) - nvm.tube_damage = true - elseif tlib2.tube_type == "pipe2" then - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = 0 - end - end, - - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - VTube:after_dig_node(pos) - techage.del_mem(pos) - end, -}) - -power.register_nodes({"techage:ta4_magnet"}, Cable, "con", {"U"}) -liquid.register_nodes({"techage:ta4_magnet"}, Pipe, "tank", {"F"}, { - capa = CAPACITY, - peek = function(pos, indir) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_put(nvm, name, amount, CAPACITY) - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_take(nvm, name, amount) - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - liquid.srv_put(nvm, name, amount, CAPACITY) - end, -}) - -VTube:add_secondary_node_names({"techage:ta4_magnet"}) -VTube:set_valid_sides("techage:ta4_magnet", {"R", "L"}) - -local function send_to_next(pos, in_dir, topic, payload) - return techage.transfer(pos, in_dir, topic, payload, VTube, - {"techage:ta4_magnet", "techage:ta4_collider_tube_inlet"}) -end - ---[[ -Commands --------- - -distance : Check distance between all magnets. - Returns pos of next magnet or the number of the defect magnet. -enumerate : Give each magnet a unique number (1...n) -pos : Read the position -test : Test all magnet attributs. - Returns true or false, err -]]-- -techage.register_node({"techage:ta4_magnet"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "distance" then - local pos2 = send_to_next(pos, in_dir, topic, payload) - if type(pos2) == "table" then - local dist = math.abs(pos.x - pos2.x) + math.abs(pos.z - pos2.z) - if pos.y == pos2.y and dist == VTube.max_tube_length + 1 then - return pos - end - return nvm.number or 0 - else - return pos2 - end - elseif topic == "enumerate" and payload then - handle_legacy_magnet(pos) - payload = tonumber(payload) or 1 - nvm.number = payload - M(pos):set_string("infotext", S("TA4 Collider Magnet") .. " #" .. payload) - 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) - end - elseif topic == "test" then - if payload and tonumber(payload) == nvm.number then - if not nvm.liquid or not nvm.liquid.amount or nvm.liquid.amount < CAPACITY then - return false, "no gas" - elseif nvm.liquid.name ~= "techage:isobutane" then - return false, "wrong gas" - elseif nvm.consumed ~= PWR_NEEDED then - return false, "no power" - elseif nvm.tube_damage then - nvm.tube_damage = nil - return false, "no vacuum" - end - return true - else - return send_to_next(pos, in_dir, topic, payload) - end - end - end, -}) - -minetest.register_node("techage:ta4_magnet_base", { - description = S("TA4 Collider Magnet Base"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-6/16, -8/16, -6/16, 6/16, 5/16, 6/16}, - }, - }, - paramtype2 = "facedir", - groups = {cracky = 1}, - is_ground_content = false, - paramtype = "light", - use_texture_alpha = techage.CLIP, - 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", - recipe = { - {'default:steel_ingot', '', 'techage:aluminum'}, - {'dye:red', 'basic_materials:gold_wire', 'dye:brown'}, - {'techage:aluminum', '', 'default:steel_ingot'}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_magnet", - recipe = { - {'techage:ta3_pipeS', '', 'techage:electric_cableS'}, - {'techage:ta4_round_ceramic', 'techage:ta4_detector_magnet', 'techage:ta4_round_ceramic'}, - {'', '', ''}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_magnet_base 4", - recipe = { - {'techage:aluminum', 'default:steel_ingot', ''}, - {'techage:aluminum', 'default:steel_ingot', ''}, - {'techage:aluminum', 'default:steel_ingot', ''}, - }, -}) - -minetest.register_lbm({ - label = "Repair Magnets", - name = "techage:magnets", - nodenames = {"techage:ta4_magnet", "techage:ta4_collider_pipe_inlet"}, - run_at_every_load = false, - action = function(pos, node) - local nvm = techage.get_nvm(pos) - if nvm.liquid and nvm.liquid.name == "techage:hydrogen" then - nvm.liquid.name = "techage:isobutane" - end - end, -}) diff --git a/techage/collider/vacuumtube.lua b/techage/collider/vacuumtube.lua deleted file mode 100644 index 9782670..0000000 --- a/techage/collider/vacuumtube.lua +++ /dev/null @@ -1,130 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Vacuum Tube as part of the Collider - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local VTube = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4}, - max_tube_length = 5, - tube_type = "vtube", - show_infotext = false, - primary_node_names = {"techage:ta4_vtubeS", "techage:ta4_vtubeA"}, - secondary_node_names = {"techage:ta4_magnet"}, - after_place_tube = function(pos, param2, tube_type, num_tubes) - minetest.swap_node(pos, {name = "techage:ta4_vtube"..tube_type, param2 = param2}) - end, -}) - -techage.VTube = VTube - -minetest.register_node("techage:ta4_vtubeS", { - description = S("TA4 Vacuum Tube"), - drawtype = "nodebox", - tiles = { - -- up, down, right, left, back, front - "techage_collider_tube.png^[transformR90", - "techage_collider_tube.png^[transformR90", - "techage_collider_tube.png", - "techage_collider_tube.png", - 'techage_collider_tube_open.png', - 'techage_collider_tube_open.png', - }, - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, - { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - {-8/16, 6/16, -8/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, 8/16, -6/16, 8/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not VTube:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - VTube:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2}, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta4_vtubeA", { - description = S("TA4 Vacuum Tube"), - drawtype = "nodebox", - tiles = { - -- up, down, right, left, back, front - "techage_collider_tube.png^[transformR90", - 'techage_collider_tube.png^techage_collider_tube_open.png', - "techage_collider_tube.png", - "techage_collider_tube.png", - "techage_collider_tube.png^[transformR90", - 'techage_collider_tube.png^techage_collider_tube_open.png', - }, - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, - { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - {-8/16, 6/16, -8/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, 8/16, -6/16, -6/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - VTube:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 1, not_in_creative_inventory=1}, - drop = "techage:ta4_vtubeS", - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta4_vtubeS 4", - recipe = { - {'', 'default:steel_ingot', ''}, - {'techage:aluminum', 'dye:blue', 'techage:aluminum'}, - {'', 'default:steel_ingot', ''}, - }, -}) diff --git a/techage/collider/worker.lua b/techage/collider/worker.lua deleted file mode 100644 index 89c1793..0000000 --- a/techage/collider/worker.lua +++ /dev/null @@ -1,208 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Detector Worlker as part of the Collider - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local AssemblyPlan = { - -- y-offs, path, facedir-offs, name - -- 0 = forward, 1 = right, 2 = backward, 3 = left - - -- level 1 - -- left/right - { 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, "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, "techage:ta4_colliderblock"}, - { 1, {3,0}, 0, "techage:ta4_colliderblock"}, - { 1, {0}, 2, "techage:ta4_collider_pipe_inlet"}, - { 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, {1}, 0, "techage:ta4_detector_magnet"}, - { 1, {1,1}, 0, "techage:ta4_detector_magnet"}, - - -- level 2 - -- 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, "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, "techage:ta4_colliderblock"}, - -- front - { 2, {3,3,2}, 0, "techage:ta4_detector_magnet"}, - { 2, {3,2}, 0, "techage:ta4_detector_magnet"}, - { 2, {2}, 0, "default:obsidian_glass"}, - { 2, {1,2}, 0, "techage:ta4_detector_magnet"}, - { 2, {1,1,2}, 0, "techage:ta4_detector_magnet"}, - -- back - { 2, {3,3,0}, 0, "techage:ta4_detector_magnet"}, - { 2, {3,0}, 0, "techage:ta4_detector_magnet"}, - { 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, "techage:ta4_colliderblock"}, - { 3, {3,3,3}, 1, "techage:ta4_collider_cable_inlet"}, - { 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, "techage:ta4_colliderblock"}, - -- front - { 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, "techage:ta4_colliderblock"}, - { 3, {3,0}, 0, "techage:ta4_colliderblock"}, - { 3, {0}, 2, "techage:ta4_collider_pipe_inlet"}, - { 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 = {} -for name, cnt in pairs(techage.assemble.count_items(AssemblyPlan)) do - t[#t + 1] = " - " .. cnt .. " " .. name -end -local LABEL = table.concat(t, "\n") - -local function build(pos, player_name) - minetest.chat_send_player(player_name, S("[TA4] Detector is being built!")) - local inv = M(pos):get_inventory() - techage.assemble.build_inv(pos, inv, AssemblyPlan, player_name) -end - -local function remove(pos, player_name) - minetest.chat_send_player(player_name, S("[TA4] Detector is being removed!")) - local inv = M(pos):get_inventory() - techage.assemble.remove_inv(pos, inv, AssemblyPlan, player_name) -end - - -local function formspec() - return "size[8,8.2]".. - "list[context;src;5,0;3,3;]".. - "label[0.2,-0.2;" .. S("Item list") .. ":\n" .. LABEL .. "]" .. - "button_exit[0,3.5;4,1;build;" .. S("Build detector") .. "]" .. - "button_exit[4,3.5;4,1;remove;" .. S("Remove detector") .. "]" .. - "list[current_player;main;0,4.5;8,4;]".. - "listring[context;src]".. - "listring[current_player;main]" -end - -minetest.register_node("techage:ta4_collider_detector_worker", { - description = S("TA4 Collider Detector Worker"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png^techage_collider_detector_appl.png^techage_collider_detector_banner.png", - "default_steel_block.png^techage_collider_detector_banner.png", - "default_steel_block.png^techage_collider_detector_banner.png", - "default_steel_block.png^techage_collider_detector_banner.png", - "default_steel_block.png^techage_collider_detector_banner.png", - "default_steel_block.png^techage_collider_detector_appl.png^techage_collider_detector_banner.png", - }, - paramtype2 = "facedir", - groups = {cracky = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - - after_place_node = function(pos, placer, itemstack) - if pos.y > (techage.collider_min_depth - 2) then - minetest.remove_node(pos) - minetest.add_item(pos, ItemStack("techage:ta4_collider_detector_worker")) - return - end - local inv = M(pos):get_inventory() - inv:set_size("src", 9) - M(pos):set_string("formspec", formspec()) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - if fields.build then - if not nvm.assemble_locked then - build(pos, player:get_player_name()) - end - elseif fields.remove then - if not nvm.assemble_locked then - 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, - - after_dig_node = function(pos, oldnode) - techage.del_mem(pos) - end, - - can_dig = function(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local nvm = techage.get_nvm(pos) - if nvm.assemble_locked or nvm.assemble_build then - minetest.after(30, function(pos) - local nvm = techage.get_nvm(pos) - nvm.assemble_locked = false - end, pos) - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("src") - end, -}) - - -minetest.register_craft({ - output = "techage:ta4_collider_detector_worker", - recipe = { - {'techage:aluminum', 'default:chest', 'default:steel_ingot'}, - {'', 'basic_materials:gear_steel', ''}, - {'default:steel_ingot', 'default:mese_crystal', 'techage:aluminum'}, - }, -}) diff --git a/techage/digtron/battery.lua b/techage/digtron/battery.lua deleted file mode 100644 index 5e5b6c0..0000000 --- a/techage/digtron/battery.lua +++ /dev/null @@ -1,175 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - Copyright (C) 2020 Thomas S. - - AGPL v3 - See LICENSE.txt for more information - - Electricity powered battery for Digtron - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 4 -local INV_SIZE = 4 -local FUEL = "default:coal_lump" -local FUEL_STACK_MAX = ItemStack(FUEL):get_stack_max() -local TOTAL_MAX = INV_SIZE * FUEL_STACK_MAX - -local function count_coal(metadata) - local total = 0 - for _,stack in pairs(metadata.inventory.fuel or {}) do - total = total + stack:get_count() - end - return total -end - -local function formspec(self, pos, nvm) - local meta = M(pos):to_table() - local total = 0 - if meta.inventory then - total = count_coal(meta) - end - return "size[5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;4.8,0.5;#c6e8ff]".. - "label[1,-0.1;"..minetest.colorize("#000000", S("Digtron Battery")).."]".. - techage.formspec_label_bar(pos, 0, 0.8, S("Load"), TOTAL_MAX, total, S("Coal Equivalents")).. - "image_button[2.6,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[2.6,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "image[3.75,2;1,1;"..techage.get_power_image(pos, nvm).."]" -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - return 0 -end - -local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - return 0 -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - return 0 -end - -local function produce_coal(pos, crd, nvm, inv) - local stack = ItemStack(FUEL) - if inv:room_for_item("fuel", stack) then - inv:add_item("fuel", stack) - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - else - crd.State:idle(pos, nvm) - end -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - produce_coal(pos, crd, nvm, inv) - - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - end -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - - -local tiles = {} --- '#' will be replaced by the stage number --- '{power}' will be replaced by the power PNG - -tiles = { - -- up, down, right, left, back, front - "digtron_plate.png^digtron_core.png", - "digtron_plate.png^digtron_core.png", - "digtron_plate.png^digtron_battery.png", - "digtron_plate.png^digtron_battery.png", - "digtron_plate.png^digtron_battery.png", - "digtron_plate.png^digtron_battery.png", -} - -local tubing = { - on_recv_message = function(pos, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, -} - -local node_name_ta2, node_name_ta3, node_name_ta4 = -techage.register_consumer("digtron_battery", S("Digtron Battery"), { act = tiles, pas = tiles }, { - drawtype = "normal", - paramtype = "light", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - after_place_node = function(pos, placer, itemstack) - local inv = M(pos):get_inventory() - inv:set_size('fuel', INV_SIZE) - if itemstack then - local stack_meta = itemstack:get_meta() - if stack_meta then - local coal_amount = techage.in_range(stack_meta:get_int("coal"), 0, TOTAL_MAX) - while coal_amount > 0 do - local amount = math.min(coal_amount, FUEL_STACK_MAX) - inv:add_item("fuel", ItemStack(FUEL.." "..amount)) - coal_amount = coal_amount - amount; - end - end - end - end, - preserve_metadata = function(pos, oldnode, oldmetadata, drops) - local metadata = M(pos):to_table() - if metadata.inventory then - local total = count_coal(metadata) - local meta = drops[1]:get_meta() - meta:set_int("coal", total) - local text = S("Digtron Battery").." ("..math.floor(total/TOTAL_MAX * 100).." %)" - meta:set_string("description", text) - end - end, - on_rightclick = function(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - end, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - 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, digtron=5}, - sounds = default.node_sound_wood_defaults(), - power_consumption = {0,25,25,25}, - power_sides = {L=1, R=1, U=1, D=1, F=1, B=1}, -}, {false, false, true, false}) - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"group:wood", "default:copper_ingot", "group:wood"}, - {"techage:electric_cableS", "default:tin_ingot", "digtron:digtron_core"}, - {"group:wood", "default:copper_ingot", "group:wood"}, - }, -}) diff --git a/techage/doc/guide.lua b/techage/doc/guide.lua deleted file mode 100644 index b4153a7..0000000 --- a/techage/doc/guide.lua +++ /dev/null @@ -1,279 +0,0 @@ ---[[ - -]]-- - -local S = techage.S -local M = minetest.get_meta -local MP = minetest.get_modpath("techage") - -local settings = { - symbol_item = "techage:construction_board_EN", -} - -doclib.create_manual("techage", "DE", settings) -doclib.create_manual("techage", "EN", settings) -doclib.create_manual("techage", "pt-BR", settings) -doclib.create_manual("techage", "RU", settings) - -local content -content = dofile(MP.."/doc/manual_DE.lua") -doclib.add_to_manual("techage", "DE", content) -content = dofile(MP.."/doc/manual_ta1_DE.lua") -doclib.add_to_manual("techage", "DE", content) -content = dofile(MP.."/doc/manual_ta2_DE.lua") -doclib.add_to_manual("techage", "DE", content) -content = dofile(MP.."/doc/manual_ta3_DE.lua") -doclib.add_to_manual("techage", "DE", content) -content = dofile(MP.."/doc/manual_ta4_DE.lua") -doclib.add_to_manual("techage", "DE", content) -content = dofile(MP.."/doc/manual_ta5_DE.lua") -doclib.add_to_manual("techage", "DE", content) - -content = dofile(MP.."/doc/manual_EN.lua") -doclib.add_to_manual("techage", "EN", content) -content = dofile(MP.."/doc/manual_ta1_EN.lua") -doclib.add_to_manual("techage", "EN", content) -content = dofile(MP.."/doc/manual_ta2_EN.lua") -doclib.add_to_manual("techage", "EN", content) -content = dofile(MP.."/doc/manual_ta3_EN.lua") -doclib.add_to_manual("techage", "EN", content) -content = dofile(MP.."/doc/manual_ta4_EN.lua") -doclib.add_to_manual("techage", "EN", content) -content = dofile(MP.."/doc/manual_ta5_EN.lua") -doclib.add_to_manual("techage", "EN", content) - -content = dofile(MP.."/doc/manual_RU.lua") -doclib.add_to_manual("techage", "RU", content) -content = dofile(MP.."/doc/manual_ta1_RU.lua") -doclib.add_to_manual("techage", "RU", content) -content = dofile(MP.."/doc/manual_ta2_RU.lua") -doclib.add_to_manual("techage", "RU", content) -content = dofile(MP.."/doc/manual_ta3_RU.lua") -doclib.add_to_manual("techage", "RU", content) -content = dofile(MP.."/doc/manual_ta4_RU.lua") -doclib.add_to_manual("techage", "RU", content) -content = dofile(MP.."/doc/manual_ta5_RU.lua") -doclib.add_to_manual("techage", "RU", content) -content = dofile(MP.."/doc/manual_pt-BR.lua") -doclib.add_to_manual("techage", "pt-BR", content) -content = dofile(MP.."/doc/manual_ta1_pt-BR.lua") -doclib.add_to_manual("techage", "pt-BR", content) -content = dofile(MP.."/doc/manual_ta2_pt-BR.lua") -doclib.add_to_manual("techage", "pt-BR", content) -content = dofile(MP.."/doc/manual_ta3_pt-BR.lua") -doclib.add_to_manual("techage", "pt-BR", content) -content = dofile(MP.."/doc/manual_ta4_pt-BR.lua") -doclib.add_to_manual("techage", "pt-BR", content) -content = dofile(MP.."/doc/manual_ta5_pt-BR.lua") -doclib.add_to_manual("techage", "pt-BR", content) - -local board_box = { - type = "wallmounted", - wall_side = {-16/32, -11/32, -16/32, -15/32, 6/16, 8/16}, -} - -minetest.register_node("techage:construction_board", { - description = "TA Konstruktionsplan (DE)", - inventory_image = 'techage_constr_plan_inv_de.png', - tiles = {"techage_constr_plan_de.png"}, - drawtype = "nodebox", - node_box = board_box, - selection_box = board_box, - - after_place_node = function(pos, placer, itemstack) - M(pos):set_string("infotext", "TA Konstruktionsplan (DE)") - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "DE")) - end, - - on_receive_fields = function(pos, formname, fields, player) - local player_name = player:get_player_name() - if minetest.is_protected(pos, player_name) then - return - end - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "DE", fields)) - end, - - paramtype2 = "wallmounted", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:construction_board", - recipe = { - {"default:stick", "default:stick", "default:stick"}, - {"default:paper", "default:paper", "default:paper"}, - {"default:paper", "default:paper", "default:paper"}, - }, -}) - -minetest.register_node("techage:construction_board_EN", { - description = "TA Construction Board (EN)", - inventory_image = 'techage_constr_plan_inv.png', - tiles = {"techage_constr_plan.png"}, - drawtype = "nodebox", - node_box = board_box, - selection_box = board_box, - - after_place_node = function(pos, placer, itemstack) - M(pos):set_string("infotext", "TA Construction Board (EN)") - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "EN")) - end, - - on_receive_fields = function(pos, formname, fields, player) - local player_name = player:get_player_name() - if minetest.is_protected(pos, player_name) then - return - end - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "EN", fields)) - end, - - paramtype2 = "wallmounted", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:construction_board_EN", - recipe = { - {"default:stick", "default:paper", "default:stick"}, - {"default:paper", "default:paper", "default:paper"}, - {"default:paper", "default:paper", "default:paper"}, - }, -}) - -minetest.register_node("techage:construction_board_RU", { - description = "TA Construction Board (RU)", - inventory_image = 'techage_constr_plan_inv_ru.png', - tiles = {"techage_constr_plan_ru.png"}, - drawtype = "nodebox", - node_box = board_box, - selection_box = board_box, - - after_place_node = function(pos, placer, itemstack) - M(pos):set_string("infotext", "План строительства ТА (RU)") - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "RU")) - end, - - on_receive_fields = function(pos, formname, fields, player) - local player_name = player:get_player_name() - if minetest.is_protected(pos, player_name) then - return - end - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "RU", fields)) - end, - - paramtype2 = "wallmounted", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:construction_board_RU", - recipe = { - {"default:paper", "default:paper", "default:paper"}, - {"default:paper", "default:paper", "default:paper"}, - {"default:paper", "default:paper", "default:paper"}, - }, -}) - -minetest.register_node("techage:construction_board_pt_BR", { - description = "TA Placa de construção (pt-BR)", - inventory_image = 'techage_constr_plan_inv_br.png', - tiles = {"techage_constr_plan_br.png"}, - drawtype = "nodebox", - node_box = board_box, - selection_box = board_box, - - after_place_node = function(pos, placer, itemstack) - M(pos):set_string("infotext", "TA Placa de construção (pt-BR)") - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "pt-BR")) - end, - - on_receive_fields = function(pos, formname, fields, player) - local player_name = player:get_player_name() - if minetest.is_protected(pos, player_name) then - return - end - M(pos):set_string("formspec", doclib.formspec(pos, "techage", "pt-BR", fields)) - end, - - paramtype2 = "wallmounted", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:construction_board_pt_BR", - recipe = { - {"default:stick", "default:stick", "default:paper"}, - {"default:paper", "default:paper", "default:paper"}, - {"default:paper", "default:paper", "default:paper"}, - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:construction_board_EN", - recipe = {"techage:construction_board"}, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:construction_board_RU", - recipe = { "techage:construction_board_EN" }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:construction_board_pt_BR", - recipe = {"techage:construction_board_RU"}, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:construction_board", - recipe = {"techage:construction_board_pt_BR"}, -}) - --- --- Legacy API functions --- -function techage.add_to_manual(language, titles, texts, items, plans) - local content = {titles = titles, texts = texts, images = items or {}, plans = plans or {}} - doclib.add_to_manual("techage", language, content) -end - -function techage.add_manual_items(table_with_items) - for name, image in pairs(table_with_items) do - doclib.add_manual_image("techage", "EN", name, image) - doclib.add_manual_image("techage", "DE", name, image) - doclib.add_manual_image("techage", "pt-BR", name, image) - doclib.add_manual_image("techage", "RU", name, image) - end -end - -function techage.add_manual_plans(table_with_plans) - for name, plan in pairs(table_with_plans) do - doclib.add_manual_plan("techage", "EN", name, plan) - doclib.add_manual_plan("techage", "DE", name, plan) - doclib.add_manual_plan("techage", "RU", name, plan) - doclib.add_manual_plan("techage", "pt-BR", name, plan) - end -end diff --git a/techage/doc/items.lua b/techage/doc/items.lua deleted file mode 100644 index b3e8953..0000000 --- a/techage/doc/items.lua +++ /dev/null @@ -1,234 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA Items Table - -]]-- - -local items = { - techage_ta1 = "techage_ta1.png", - iron = "techage:iron_ingot", - charcoal = "techage:charcoal", - lighter = "techage:lighter", - ta1_gravelsieve = "techage:sieve3", - hammer = "techage:hammer_bronze", - meridium = "techage:meridium_ingot", - baborium = "techage:stone_with_baborium", - bauxite = "techage:bauxite_stone", - usmium = "techage:usmium_nuggets", - basalt = "techage:basalt_stone", - oil = "techage:oil_source", - ta1_hopper = "techage:hopper_ta1", - wlanchip = "techage:ta4_wlanchip", - tube = "techage:tubeS", - concentrator = "techage:concentrator27", - ta1_sluice = "techage:ta1_sluice_closed", - ta1_sluice_handle = "techage:ta1_sluice_handle_closed", - ta1_board1 = "techage:ta1_board1_apple", - ta1_board2 = "techage:ta1_board2_apple", - ---------------- - techage_ta2 = "techage_ta2.png", - ta2_firebox = "techage:firebox", - ta2_boiler = "techage:boiler2", - ta2_cylinder = "techage:cylinder", - ta2_flywheel = "techage:flywheel", - ta2_steampipe = "techage:steam_pipeS", - ta2_distributor = "techage:ta2_distributor_pas", - ta2_pusher = "techage:ta2_pusher_pas", - ta2_gravelrinser = "techage:ta2_rinser_pas", - ta2_grinder = "techage:ta2_grinder_pas", - ta2_quarry = "techage:ta2_quarry_pas", - ta2_autocrafter = "techage:ta2_autocrafter_pas", - ta2_electronicfab = "techage:ta2_electronic_fab_pas", - ta2_gravelsieve = "techage:ta2_gravelsieve_pas", - ta2_liquidsampler = "techage:ta2_liquidsampler_pas", - ta2_rinser = "techage:ta2_rinser_pas", - ta2_chest = "techage:chest_ta2", - ta2_forceload = "techage:forceload", - ta2_driveaxle = "techage:axle", - ta2_generator = "techage:ta2_generator_off", - ta2_winch = "techage:ta2_winch", - ta2_weight_chest = "techage:ta2_weight_chest", - --------------------- - techage_ta3 = "techage_ta3.png", - techage_ta31 = "techage_ta3b.png", - ta3_firebox = "techage:coalfirebox", - ta3_oilbox = "techage:oilfirebox", - ta3_boiler = "techage:coalboiler_top", - ta3_turbine = "techage:turbine", - ta3_generator = "techage:generator", - ta3_cooler = "techage:cooler", - ta3_distributor = "techage:ta3_distributor_pas", - ta3_pusher = "techage:ta3_pusher_pas", - ta3_gravelrinser = "techage:ta3_rinser_pas", - ta3_grinder = "techage:ta3_grinder_pas", - ta3_quarry = "techage:ta3_quarry_pas", - ta3_autocrafter = "techage:ta3_autocrafter_pas", - ta3_electronicfab = "techage:ta3_electronic_fab_pas", - ta3_gravelsieve = "techage:ta3_gravelsieve_pas", - ta3_liquidsampler = "techage:ta3_liquidsampler_pas", - ta3_powercable = "techage:electric_cableS", - ta3_powerline = "techage:power_lineS", - ta3_powerswitch = "techage:powerswitch", - ta3_powerswitchsmall = "techage:powerswitchsmall", - ta3_powerjunction = "techage:electric_junction0", - ta3_powerpole = "techage:power_pole3", - ta3_powerpole2 = "techage:power_pole2", - ta3_powerpole4 = "techage:power_pole", - ta3_powerswitchbox = "techage:powerswitch_box", - ta3_powerterminal = "techage:ta3_power_terminal", - ta3_trowel = "techage:trowel", - ta3_screwdriver = "techage:screwdriver", - ta3_tinygenerator = "techage:tiny_generator", - ta3_akkublock = "techage:ta3_akku", - ta3_furnace = "techage:ta3_furnace_pas", - ta3_furnacefirebox = "techage:furnace_firebox", - ta3_booster = "techage:ta3_booster", - ta3_oilexplorer = "techage:oilexplorer", - ta3_drillbox = "techage:ta3_drillbox_pas", - ta3_pumpjack = "techage:ta3_pumpjack_pas", - ta3_drillbit = "techage:oil_drillbit", - ta3_end_wrench = "techage:end_wrench", - ta3_tank = "techage:ta3_tank", - ta3_pump = "techage:t3_pump", - oiltank = "techage:oiltank", - reboiler = "techage:ta3_reboiler", - ta3_filler = "techage:filler", - tank_cart = "techage:tank_cart", - chest_cart = "techage:chest_cart", - ---------------------------- - ta3_button = "techage:ta3_button_off", - ta3_cartdetector = "techage:ta3_cartdetector_off", - ta3_detector = "techage:ta3_detector_off", - ta3_logic = "techage:ta3_logic", - ta3_nodedetector = "techage:ta3_nodedetector_off", - ta3_playerdetector = "techage:ta3_playerdetector_off", - ta3_lightdetector = "techage:ta3_lightdetector_off", - ta3_repeater = "techage:ta3_repeater", - ta3_sequencer = "techage:ta3_sequencer", - ta3_timer = "techage:ta3_timer", - ta3_terminal = "techage:terminal2", - ta3_colorlamp = "techage:color_lamp_off", - ta3_doorblock = "techage:doorblock20", - ta3_soundblock = "techage:ta3_soundblock", - ta3_programmer = "techage:programmer", - ta3_doorcontroller = "techage:ta3_doorcontroller", - ta3_drill_pipe_wrench = "techage:ta3_drill_pipe_wrench", - ta3_pipe = "techage:ta3_pipeS", - ta3_pipe_wall_entry = "techage:ta3_pipe_wall_entry", - ta3_mesecons_converter = "techage:ta3_mesecons_converter", - ta3_valve = "techage:ta3_valve_closed", - ta3_motor = "techage:ta3_motor_off", - ta3_injector = "techage:ta3_injector_pas", - ta3_command_converter = "techage:ta3_command_converter_off", - ta3_flipflop = "techage:ta3_flipflop_off", - ---------------------------- - 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", - ta4_nacelle = "techage:ta4_wind_turbine_nacelle", - ta4_minicell = "techage:ta4_solar_minicell", - ta4_pipe = "techage:ta4_pipeS", - ta4_tube = "techage:ta4_tubeS", - ta4_junctionpipe = "techage:ta4_junctionpipe25", - ta4_pipeinlet = "techage:ta4_pipe_inlet", - ta4_turbine = "techage:ta4_turbine", - ta4_generator = "techage:ta4_generator", - ta4_heatexchanger = "techage:heatexchanger3", - ta4_powercable = "techage:ta4_power_cableS", - ta4_powerbox = "techage:ta4_power_box", - ta4_solarmodule = "techage:ta4_solar_module", - ta4_solarcarrier = "techage:ta4_solar_carrier", - ta4_solar_inverter = "techage:ta4_solar_inverter", - techage_ta4_solar = "techage_ta4_solar.png", - ta4_hydrogen = "techage_hydrogen_inv.png", - ta4_electrolyzer = "techage:ta4_electrolyzer", - ta4_fuelcell = "techage:ta4_fuelcell", - ta4_reactor = "techage:ta4_reactor", - ta4_tank = "techage:ta4_tank", - ta4_pump = "techage:t4_pump", - ta4_doser = "techage:ta4_doser", - ta4_silo = "techage:ta4_silo", - ta4_fillerpipe = "techage:ta4_reactor_fillerpipe", - ta4_reactorstand = "techage:ta4_reactor_stand", - ta4_reactorbase = "techage:ta4_reactor_base", - ta4_furnaceheater = "techage:furnace_heater", - ta4_waterpump = "techage:t4_waterpump", - ta4_icta_controller = "techage:ta4_icta_controller", - ta4_battery = "techage:ta4_battery", - ta4_display = "techage:ta4_display", - ta4_displayXL = "techage:ta4_displayXL", - ta4_signaltower = "techage:ta4_signaltower", - ta4_lua_controller = "techage:ta4_lua_controller", - ta4_lua_server = "techage:ta4_server", - ta4_sensor_chest = "techage:ta4_sensor_chest", - ta4_terminal = "techage:ta4_terminal", - ta4_button = "techage:ta4_button_off", - ta4_playerdetector = "techage:ta4_playerdetector_off", - ta4_collector = "techage:ta4_collector", - ta4_pusher = "techage:ta4_pusher_pas", - ta4_distributor = "techage:ta4_distributor_pas", - ta4_high_performance_distributor = "techage:ta4_high_performance_distributor_pas", - ta4_gravelsieve = "techage:ta4_gravelsieve_pas", - ta4_grinder = "techage:ta4_grinder_pas", - ta4_detector = "techage:ta4_detector_off", - ta4_chest = "techage:chest_ta4", - ta4_8x2000_chest = "techage:ta4_chest", - ta4_growlight = "techage:growlight_on", - ta4_streetlamp = "techage_ta4_streetlamp.png", - ta4_industriallamp = "techage:industriallamp4_off", - ta4_quarry = "techage:ta4_quarry_pas", - ta4_electronicfab = "techage:ta4_electronic_fab_pas", - ta4_injector = "techage:ta4_injector_pas", - ta4_liquid_filter = "techage_ta4_filter.png", - ta4_recycler = "techage:ta4_recycler_pas", - ta4_waterinlet = "techage:ta4_waterinlet", - ta4_laser = "techage:ta4_laser_emitter", - ta4_concentrator = "techage:ta4_concentrator27", - ta4_electricmeter = "techage:ta4_electricmeter", - ta4_transformer = "techage:ta4_transformer", - power_reduction = "techage_power_reduction.png", - ta4_button_2x = "techage:ta4_button_2x", - ta4_button_4x = "techage:ta4_button_4x", - ta4_sequencer = "techage:ta4_sequencer", - ta4_movecontroller = "techage:ta4_movecontroller", - ta4_turncontroller = "techage:ta4_turncontroller", - ta4_signallamp_2x = "techage:ta4_signallamp_2x", - ta4_signallamp_4x = "techage:ta4_signallamp_4x", - ta4_terminal = "techage:terminal3", - ta4_autocrafter = "techage:ta4_autocrafter_pas", - ta4_recipeblock = "techage:ta4_recipeblock", - ta4_chargedetector = "techage:ta4_chargedetector_off", - ta4_gaze_sensor = "techage:ta4_gaze_sensor_off", - ta4_nodedetector = "techage:ta4_nodedetector_off", - ---------------------------- - techage_ta5 = "techage:ta5_fr_nucleus", - ta5_flycontroller = "techage:ta5_flycontroller", - ta5_aichip = "techage:ta5_aichip", - ta5_aichip2 = "techage:ta5_aichip2", - ta5_tele_pipe = "techage:ta5_tele_pipe", - ta5_tele_tube = "techage:ta5_tele_tube", - ta5_chest = "techage:ta5_hl_chest", - ta5_tank = "techage:ta5_hl_tank", - ta5_magnet = "techage:ta5_magnet1", - ta5_pump = "techage:ta5_pump", - ta5_fr_shell = "techage:ta5_fr_shell", - ta5_fr_nucleus = "techage:ta5_fr_nucleus", - ta5_fr_controller = "techage:ta5_fr_controller_pas", -} - -for name, image in pairs(items) do - doclib.add_manual_image("techage", "DE", name, image) - doclib.add_manual_image("techage", "EN", name, image) - doclib.add_manual_image("techage", "pt-BR", name, image) - doclib.add_manual_image("techage", "RU", name, image) -end diff --git a/techage/doc/manual_DE.lua b/techage/doc/manual_DE.lua deleted file mode 100644 index 399f705..0000000 --- a/techage/doc/manual_DE.lua +++ /dev/null @@ -1,132 +0,0 @@ -return { - titles = { - "1,Tech Age Mod", - "2,Hinweise", - "2,Änderungen ab Version 1.0", - "3,Tipps zur Umstellung", - "2,Erze und Mineralien", - "3,Meridium", - "3,Usmium", - "3,Baborium", - "3,Erdöl", - "3,Bauxit", - "3,Basalt", - }, - texts = { - "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".. - "\n".. - "TA2: Dampfzeitalter (Steam Age)\n".. - "Baue eine Dampfmaschine mit Antriebsachsen und betreibe damit deine ersten Maschinen zur Verarbeitung von Erzen.\n".. - "\n".. - "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: Gegenwart (Present)\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)\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".. - "\n", - "Diese Dokumentation ist sowohl \"ingame\" (Block Konstruktionsplan) als auch auf GitHub als MD-Files verfügbar.\n".. - "\n".. - " - Link: https://github.com/joe7575/techage/wiki\n".. - "\n".. - "Die Konstruktionspläne (Diagramme) für den Aufbau der Maschinen sowie die Bilder sind aber nur ingame verfügbar.\n".. - "\n".. - "Bei Tech Age musst du von vorne beginnen. Nur mit den Items aus TA1 kannst du TA2 Blöcke herstellen\\, für TA3 benötigst du die Ergebnisse aus TA2\\, usw.\n".. - "\n".. - "In TA2 laufen die Maschinen nur mit Antriebsachsen.\n".. - "\n".. - "Ab TA3 laufen die Maschinen mit Strom und besitzen eine Kommunikationsschnittstelle zur Fernsteuerung.\n".. - "\n".. - "Mit TA4 kommen weitere Stromquellen dazu\\, aber auch höhere logistische Herausforderungen (Stromtrassen\\, Item Transport).\n".. - "\n", - "Ab V1.0 (17.07.2021) hat sich folgendes geändert:\n".. - "\n".. - " - Der Algorithmus zur Berechnung der Stromverteilung hat sich geändert. Energiespeichersystem werden dadurch wichtiger. Diese gleichen Schankungen aus\\, was bei größeren Netzen mit mehreren Generatoren wichtig wird.\n".. - " - Aus diesem Grund hat TA2 seinen eigenen Energiespeicher erhalten.\n".. - " - Die Akkublöcke aus TA3 dienen auch als Energiespeicher. Ihre Funktionsweise wurde entsprechend angepasst.\n".. - " - Das TA4 Speichersystem wurde überarbeitet. Die Wärmetauscher (heatexchanger) haben eine neue Nummer bekommen\\, da die Funktionalität vom unteren in den mittleren Block verschoben wurde. Sofern diese ferngesteuert wurden\\, muss die Knotennummer angepasst werden. Die Generatoren haben kein eigenes Menü mehr\\, sondern werden nur noch über den Wärmetauscher ein-/ausgeschaltet. Wärmetauscher und Generator müssen jetzt am gleichen Netz hängen!\n".. - " - Mehrere Stromnetze können jetzt über einen TA4 Transformator Blöcke gekoppelt werden.\n".. - " - Neu ist auch ein TA4 Stromzähler Block für Unternetze.\n".. - "\n", - "Viele weitere Blöcke haben kleinere Änderungen bekommen. Daher kann es sein\\, dass Maschinen oder Anlagen nach der Umstellung nicht gleich wieder anlaufen. Sollte es zu Störungen kommen\\, helfen folgende Tipps:\n".. - "\n".. - " - Maschinen aus- und wieder eingeschalten\n".. - " - ein Stromkabel-Block entfernen und wieder setzen\n".. - " - den Block ganz entfernen und wieder setzen\n".. - " - mindestens ein Akkublock oder Speichersystem in jedes Netzwerk\n".. - "\n", - "Techage fügt dem Spiel einige neue Items hinzu:\n".. - "\n".. - " - Meridium - eine Legierung zur Herstellung von leuchtenden Werkzeugen in TA1\n".. - " - Usmium - ein Erz\\, was in TA2 gefördert und für TA3 benötigt wird\n".. - " - Baborium - ein Metall\\, welches für Rezepte in TA3 benötigt wird\n".. - " - Erdöl - wird in TA3 benötigt\n".. - " - Bauxit - ein Aluminiumerz\\, was in TA4 zur Herstellung von Aluminium benötigt wird\n".. - " - Basalt - entsteht\\, wenn sich Wasser und Lave berühren\n".. - "\n", - "Meridium ist eine Legierung aus Stahl und Mesekristallen. Meridium Ingots können mit dem Kohlebrenner aus Stahl und Mesesplitter hergestellt werden. Meridium leuchtet im Dunkeln. Auch Werkzeuge aus Meridium leuchten und sind daher im Untertagebau sehr hilfreich.\n".. - "\n".. - "\n".. - "\n", - "Usmium kommt nur als Nuggets vor und kann nur beim Waschen von Kies mit der TA2/TA3 Kieswaschanlage gewonnen werden.\n".. - "\n".. - "\n".. - "\n", - "Barborium kann nur im Untertagebau gewonnen werden. Diesen Stoff findet man nur in einer Tiefe von -250 bis -340 Metern.\n".. - "Baborium kann nur im TA3 Industrieofen geschmolzen werden.\n".. - "\n".. - "\n".. - "\n", - "Erdöl kann nur mit Hilfe des Explorers gefunden und mit Hilfe entsprechender TA3 Maschinen gefördert werden. Siehe TA3.\n".. - "\n".. - "\n".. - "\n", - "Bauxit wird nur im Untertagebau gewonnen. Bauxit findet man nur in Stein in einer Höhe zwischen -50 und -500 Meter.\n".. - "Es wird zur Herstellung von Aluminium benötigt\\, was vor allem in TA4 Verwendung findet.\n".. - "\n".. - "\n".. - "\n", - "Basalt entsteht nur\\, wenn Lava und Wasser zusammen kommen.\n".. - "Dazu sollte man am besten eine Anlage aufbauen\\, bei der eine Lava- und eine Wasserquelle zusammenfließen.\n".. - "Dort wo sich beide Flüssigkeiten treffen\\, entsteht Basalt.\n".. - "Einen automatisierten Basalt Generator kann man mit dem Sign Bot aufbauen.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta4", - "", - "", - "", - "", - "meridium", - "usmium", - "baborium", - "oil", - "bauxite", - "basalt", - }, - plans = { - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_EN.lua b/techage/doc/manual_EN.lua deleted file mode 100644 index 246392e..0000000 --- a/techage/doc/manual_EN.lua +++ /dev/null @@ -1,144 +0,0 @@ -return { - titles = { - "1,Tech Age Mod", - "2,Hints", - "2,Changes from version 1.0", - "3,Tips on switching", - "2,Ores and Minerals", - "3,Meridium", - "3,Usmium", - "3,Baborium", - "3,Petroleum", - "3,Bauxite", - "3,Basalt", - "2,History", - }, - texts = { - "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".. - "\n".. - "TA2: Steam Age\n".. - "Build a steam engine with drive axles and use it to operate your first ore processing machines.\n".. - "\n".. - "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: Present\n".. - "Renewable energy sources such as wind\\, sun and bio-fuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future.\n".. - "\n".. - "TA5: Future\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 sub-chapters of this manual.\n".. - "\n".. - "\n".. - "\n", - "This documentation is available both \"ingame\" (block construction plan) and on GitHub as MD files.\n".. - "\n".. - " - Link: https://github.com/joe7575/techage/wiki\n".. - "\n".. - "The construction plans (diagrams) for the construction of the machines and the pictures are only available in-game.\n".. - "\n".. - "With Tech Age you have to start over. You can only create TA2 blocks with the items from TA1\\, for TA3 you need the results from TA2\\, etc.\n".. - "\n".. - "In TA2\\, the machines only run with drive axes.\n".. - "\n".. - "From TA3\\, the machines run on electricity and have a communication interface for remote control.\n".. - "\n".. - "TA4 adds more power sources\\, but also higher logistical challenges (power lines\\, item transport).\n".. - "\n", - "From V1.0 (07/17/2021) the following has changed:\n".. - "\n".. - " - The algorithm for calculating the power distribution has changed. This makes energy storage systems more important. These compensate for fluctuations\\, which is important in larger networks with several generators.\n".. - " - For this reason TA2 got its own energy storage.\n".. - " - The battery blocks from TA3 also serve as energy storage. Their functionality has been adapted accordingly.\n".. - " - The TA4 storage system has been revised. The heat heat exchanger have been given a new number because the functionality has been moved from the lower to the middle block. If these were remotely controlled\\, the node number must be adapted. The generators no longer have their own menu\\, but are only switched on / off via the heat exchanger. The heat exchanger and generator must now be connected to the same network!\n".. - " - Several power grids can now be coupled via a TA4 transformer blocks.\n".. - " - A TA4 electricity meter block for sub-networks is also new.\n".. - " - At least one battery block or a storage system in each network\n".. - "\n", - "Many more blocks have received minor changes. It is therefore possible that machines or systems do not start up again immediately after the changeover. In the event of malfunctions\\, the following tips will help:\n".. - "\n".. - " - Switch machines off and on again\n".. - " - remove a power cable block and put it back in place\n".. - " - remove the block completely and put it back in place\n".. - "\n", - "Techage adds some new items to the game:\n".. - "\n".. - " - Meridium - an alloy for the production of luminous tools in TA1\n".. - " - Usmium - an ore that is mined in TA2 and needed for TA3\n".. - " - Baborium - a metal that is needed for recipes in TA3\n".. - " - Petroleum - is needed in TA3\n".. - " - Bauxite - an aluminum ore that is needed in TA4 to produce aluminum\n".. - " - Basalt - arises when water and lave touch\n".. - "\n", - "Meridium is an alloy of steel and mesecons crystals. Meridium ingots can be made with the coal burner from steel and mesecons crystals. Meridium glows in the dark. Tools made of Meridium also light up and are therefore very helpful in underground mining.\n".. - "\n".. - "\n".. - "\n", - "Usmium only occurs as nuggets and can only be obtained by washing gravel with the TA2/TA3 gravel washing system.\n".. - "\n".. - "\n".. - "\n", - "Barborium can only be obtained from underground mining. This substance can only be found at a depth of -250 to -340 meters.\n".. - "\n".. - "Baborium can only be melted in the TA3 Industrial Furnace.\n".. - "\n".. - "\n".. - "\n", - "Petroleum can only be found with the help of the Explorer and extracted with the help of appropriate TA3 machines. See TA3.\n".. - "\n".. - "\n".. - "\n", - "Bauxite is only extracted in underground mining. Bauxite is only found in stone at a height between -50 and -500 meters.\n".. - "It is required for the production of aluminum\\, which is mainly used in TA4.\n".. - "\n".. - "\n".. - "\n", - "Basalt is only created when lava and water come together.\n".. - "The best thing to do is to set up a system where a lava and a water source flow together.\n".. - "Basalt is formed where both liquids meet.\n".. - "You can build an automated basalt generator with the Sign Bot.\n".. - "\n".. - "\n".. - "\n", - " - 28.09.2019: Solar system added\n".. - " - 05.10.2019: Data on the solar system and description of the inverter and the power terminal changed\n".. - " - 18.11.2019: Chapter for ores\\, reactor\\, aluminum\\, silo\\, bauxite\\, furnace heating\\, gravel washing system added\n".. - " - 22.02.2020: corrections and chapters on the update\n".. - " - 29.02.2020: ICTA controller added and further corrections\n".. - " - 14.03.2020 Lua controller added and further corrections\n".. - " - 22.03.2020 More TA4 blocks added\n".. - "\n", - }, - images = { - "techage_ta4", - "", - "", - "", - "", - "meridium", - "usmium", - "baborium", - "oil", - "bauxite", - "basalt", - "", - }, - plans = { - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_RU.lua b/techage/doc/manual_RU.lua deleted file mode 100644 index d483b29..0000000 --- a/techage/doc/manual_RU.lua +++ /dev/null @@ -1,144 +0,0 @@ -return { - titles = { - "1,Tech Age Mod", - "2,Подсказки", - "2,Изменения по сравнению с версией 1.0", - "3,Советы по переключению", - "2,Руды и минералы", - "3,Меридий", - "3,Усмий", - "3,Баборий", - "3,Нефть", - "3,Боксит", - "3,Базальт", - "2,History", - }, - texts = { - "Tech Age - это технологический мод с 5 стадиями развития:\n".. - "\n".. - "TA1: Железный век\n".. - "Используйте инструменты и приспособления\\, такие как угольные горелки\\, угольные горелки\\, гравийные сита\\, молоты и бункеры\\, чтобы добывать и обрабатывать необходимые руды и металлы.\n".. - "\n".. - "TA2: Паровой век\n".. - "Постройте паровой двигатель с ведущими осями и используйте его для работы своих первых машин по переработке руды.\n".. - "\n".. - "TA3: Нефтяной век\n".. - "Найдите и добывайте нефть\\, постройте железные дороги для транспортировки нефти. Электростанция дает необходимое электричество для ваших машин. Электрический свет освещает ваши промышленные предприятия.\n".. - "\n".. - "TA4: Настоящее время\n".. - "Возобновляемые источники энергии\\, такие как ветер\\, солнце и биотопливо\\, помогают вам покинуть нефтяной век. С помощью современных технологий и умных машин вы отправляетесь в будущее.\n".. - "\n".. - "TA5: Будущее\n".. - "Машины\\, преодолевающие пространство и время\\, новые источники энергии и другие достижения определяют вашу жизнь.\n".. - "\n".. - "Примечание: Нажав на знак \"плюс\"\\, вы попадаете в подразделы этого руководства.\n".. - "\n".. - "\n".. - "\n", - "Эта документация доступна как \"в игре\" (план строительства блоков)\\, так и на GitHub в виде MD-файлов.\n".. - "\n".. - " - Ссылка: https://github.com/joe7575/techage/wiki\n".. - "\n".. - "Строительные планы (схемы) для постройки машин и картинки доступны только в игре.\n".. - "\n".. - "В Tech Age вам придется начинать все сначала. Вы можете создавать блоки TA2 только с помощью предметов из TA1\\, для TA3 вам нужны результаты из TA2 и т.д.\n".. - "\n".. - "В TA2 машины работают только с приводными осями.\n".. - "\n".. - "В TA3 машины работают от электричества и имеют коммуникационный интерфейс для дистанционного управления.\n".. - "\n".. - "TA4 добавляет больше источников энергии\\, но также и более сложные логистические задачи (линии электропередач\\, транспортировка изделий).\n".. - "\n", - "С версии 1.0 (07/17/2021) изменилось следующее:\n".. - "\n".. - " - Изменился алгоритм расчета распределения энергии. Это делает системы хранения энергии более важными. Они компенсируют колебания\\, что важно для больших сетей с несколькими генераторами.\n".. - " - По этой причине TA2 обзавелась собственным накопителем энергии.\n".. - " - Аккумуляторные блоки из TA3 также служат в качестве накопителей энергии. Их функциональность была соответствующим образом адаптирована.\n".. - " - Система хранения TA4 была пересмотрена. Теплообменник получил новый номер\\, поскольку его функциональность была перенесена с нижнего на средний блок. Если они управлялись дистанционно\\, номер узла должен быть адаптирован. Генераторы больше не имеют собственного меню\\, а включаются/выключаются только через теплообменник. Теплообменник и генератор теперь должны быть подключены к одной сети!\n".. - " - Несколько электросетей теперь могут быть соединены через трансформаторные блоки TA4.\n".. - " - Также появился блок счетчиков электроэнергии TA4 для подсетей.\n".. - " - Как минимум один блок аккумуляторов или система хранения в каждой сети\n".. - "\n", - "Многие другие блоки получили незначительные изменения. Поэтому возможно\\, что машины или системы не будут запускаться сразу после переключения. В случае неполадок помогут следующие советы:\n".. - "\n".. - " - выключите и снова включите машины\n".. - " - снимите блок силовых кабелей и установите его на место\n".. - " - полностью снимите блок и установите его на место\n".. - "\n", - "Techage добавляет в игру несколько новых предметов:\n".. - "\n".. - " - Меридий - сплав для производства светящихся инструментов в TA1\n".. - " - Усмий - руда\\, которая добывается в TA2 и необходима для TA3\n".. - " - Бабориум - металл\\, необходимый для рецептов в TA3\n".. - " - Нефть - необходима в TA3\n".. - " - Боксит - алюминиевая руда\\, которая необходима в TA4 для производства алюминия\n".. - " - Базальт - возникает при соприкосновении воды и лав\n".. - "\n", - "Меридий - это сплав стали и кристаллов мезекона. Слитки меридиума можно изготовить с помощью угольной горелки из стали и кристаллов мезекона. Меридий светится в темноте. Инструменты из меридиума также светятся и поэтому очень полезны при подземной добыче.\n".. - "\n".. - "\n".. - "\n", - "Усмий встречается только в виде самородков и может быть получен только при промывке гравия с помощью системы промывки гравия TA2/TA3.\n".. - "\n".. - "\n".. - "\n", - "Барборий можно получить только при подземной добыче. Это вещество можно найти только на глубине от -250 до -340 метров.\n".. - "\n".. - "Бабориум можно переплавить только в промышленной печи TA3.\n".. - "\n".. - "\n".. - "\n", - "Нефть можно найти только с помощью Исследователя и добыть с помощью соответствующих машин TA3. См. TA3.\n".. - "\n".. - "\n".. - "\n", - "Боксит можно добыть только в подземной шахте. Боксит можно найти только в камне на высоте от -50 до -500 метров.\n".. - "Он необходим для производства алюминия\\, который в основном используется в TA4.\n".. - "\n".. - "\n".. - "\n", - "Базальт образуется только при соединении лавы и воды.\n".. - "Лучше всего создать систему\\, в которой лава и вода будут течь вместе.\n".. - "Базальт образуется там\\, где встречаются обе жидкости.\n".. - "Вы можете создать автоматический генератор базальта с помощью Sign Bot.\n".. - "\n".. - "\n".. - "\n", - " - 28.09.2019: Solar system added\n".. - " - 05.10.2019: Data on the solar system and description of the inverter and the power terminal changed\n".. - " - 18.11.2019: Chapter for ores\\, reactor\\, aluminum\\, silo\\, bauxite\\, furnace heating\\, gravel washing system added\n".. - " - 22.02.2020: corrections and chapters on the update\n".. - " - 29.02.2020: ICTA controller added and further corrections\n".. - " - 14.03.2020 Lua controller added and further corrections\n".. - " - 22.03.2020 More TA4 blocks added\n".. - "\n", - }, - images = { - "techage_ta4", - "", - "", - "", - "", - "meridium", - "usmium", - "baborium", - "oil", - "bauxite", - "basalt", - "", - }, - plans = { - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_pt-BR.lua b/techage/doc/manual_pt-BR.lua deleted file mode 100644 index 212f27d..0000000 --- a/techage/doc/manual_pt-BR.lua +++ /dev/null @@ -1,152 +0,0 @@ -return { - titles = { - "1,Mod Tech Age", - "2,TA1: Idade do Ferro", - "2,TA2: Idade do Vapor", - "2,TA3: Idade do Petróleo", - "2,TA4: Tempos atuais (Presente)", - "2,TA5: Futuro", - "1,Dicas", - "1,Mudanças a partir da versão 1.0", - "2,Dicas sobre a troca", - "1,Minérios e Minerais", - "2,Meridium", - "2,Usmium", - "2,Baborium", - "2,Petróleo", - "2,Bauxita", - "2,Basalto", - "2,History", - }, - texts = { - "O Tech Age é um mod de tecnologia com 5 estágios de desenvolvimento:\n".. - "\n", - "Utilize ferramentas e instrumentos auxiliares como queimadores de carvão\\, peneiras de cascalho\\, martelos e funis para extrair e processar minérios e metais necessários.\n".. - "\n", - "Construa uma máquina a vapor com eixos de transmissão e use-a para operar suas primeiras máquinas de processamento de minérios.\n".. - "\n", - "Encontre e extraia óleo\\, construa ferrovias para transporte de óleo. Uma usina fornece a eletricidade necessária para suas máquinas. A luz elétrica ilumina suas instalações industriais.\n".. - "\n", - "Fontes de energia renovável\\, como vento\\, sol e biocombustíveis\\, ajudam você a sair da era do petróleo. Com tecnologias modernas e máquinas inteligentes\\, você parte para o futuro.\n".. - "\n", - "Máquinas para superar espaço e tempo\\, novas fontes de energia e outras conquistas moldam sua vida.\n".. - "\n".. - "Nota: Clicando no sinal de adição\\, você acessa os subcapítulos deste manual.\n".. - "\n".. - "\n".. - "\n", - "Esta documentação está disponível tanto \"dentro do jogo\" (plano de construção de blocos) quanto no GitHub como arquivos MD.\n".. - "\n".. - " - Link: https://github.com/joe7575/techage/wiki\nOs planos de construção (diagramas) para a construção das máquinas e as imagens estão disponíveis apenas no jogo.\n".. - "\n".. - "Com o Tech Age\\, você precisa começar do zero. Você só pode criar blocos TA2 com os itens do TA1\\, para o TA3 você precisa dos resultados do TA2\\, e assim por diante.\n".. - "\n".. - "No TA2\\, as máquinas só funcionam com eixos de transmissão.\n".. - "\n".. - "A partir do TA3\\, as máquinas funcionam com eletricidade e têm uma interface de comunicação para controle remoto.\n".. - "\n".. - "O TA4 adiciona mais fontes de energia\\, mas também desafios logísticos mais altos (linhas de energia\\, transporte de itens).\n".. - "\n", - "A partir da V1.0 (17/07/2021)\\, as seguintes alterações foram feitas:\n".. - "\n".. - " - O algoritmo para calcular a distribuição de energia foi alterado. Isso torna os sistemas de armazenamento de energia mais importantes. Eles compensam as flutuações\\, o que é importante em redes maiores com vários geradores.\n".. - " - Por esse motivo\\, o TA2 recebeu seu próprio sistema de armazenamento de energia.\n".. - " - Os blocos de bateria do TA3 também servem como armazenamento de energia. Sua funcionalidade foi adaptada de acordo.\n".. - " - O sistema de armazenamento do TA4 foi revisado. O permutador de calor recebeu um novo número porque a funcionalidade foi movida do bloco inferior para o bloco central. Se eles estiverem sendo controlados remotamente\\, o número do nó deve ser adaptado. Os geradores não têm mais um menu próprio\\, mas são ligados/desligados apenas através do permutador de calor. O permutador de calor e o gerador agora devem estar conectados à mesma rede!\n".. - " - Vários sistemas de energia podem agora ser acoplados via blocos transformadores TA4.\n".. - " - Um novo bloco medidor de eletricidade TA4 para sub-redes também foi adicionado.\n".. - " - Pelo menos um bloco de bateria ou um sistema de armazenamento em cada rede.\n".. - "\n", - "Muitos outros blocos receberam alterações menores. Portanto\\, é possível que máquinas ou sistemas não reiniciem imediatamente após a troca. Em caso de falhas\\, as seguintes dicas ajudarão:\n".. - "\n".. - " - Desligue e ligue as máquinas novamente.\n".. - " - Remova um bloco de cabo de energia e coloque-o de volta no lugar.\n".. - " - Remova completamente o bloco e coloque-o de volta no lugar.\n".. - "\n", - "Techage adiciona novos itens ao jogo:\n".. - "\n".. - " - Meridium - uma liga para a produção de ferramentas luminosas no TA1\n".. - " - Usmium - um minério que é extraído no TA2 e necessário para o TA3\n".. - " - Baborium - um metal necessário para receitas no TA3\n".. - " - Petróleo - necessário no TA3\n".. - " - Bauxita - um minério de alumínio necessário no TA4 para produzir alumínio\n".. - " - Basalto - surge quando água e lava se encontram\n".. - "\n", - "O Meridium é uma liga de aço e cristais de mesecons. Lingotes de Meridium podem ser feitos com a caldeira a carvão a partir de aço e cristais de mesecons. O Meridium brilha no escuro. Ferramentas feitas de Meridium também emitem luz e são\\, portanto\\, muito úteis na mineração subterrânea.\n".. - "\n".. - "\n".. - "\n", - "O Usmium ocorre apenas como pepitas e só pode ser obtido lavando cascalho com o sistema de lavagem de cascalho TA2/TA3.\n".. - "\n".. - "\n".. - "\n", - "O Baborium só pode ser obtido através da mineração subterrânea. Essa substância só pode ser encontrada a uma profundidade de -250 a -340 metros.\n".. - "\n".. - "O Baborium só pode ser derretido na Fornalha Industrial TA3.\n".. - "\n".. - "\n".. - "\n", - "O Petróleo só pode ser encontrado com a ajuda do Explorer e extraído com a ajuda de máquinas apropriadas do TA3. Veja TA3.\n".. - "\n".. - "\n".. - "\n", - "A Bauxita é extraída apenas na mineração subterrânea. A Bauxita só é encontrada na pedra a uma altura entre -50 e -500 metros.\n".. - "É necessária para a produção de alumínio\\, que é principalmente usada no TA4.\n".. - "\n".. - "\n".. - "\n", - "O Basalto só é criado quando lava e água se encontram.\n".. - "A melhor coisa a fazer é montar um sistema onde uma fonte de lava e uma fonte de água se encontram.\n".. - "O Basalto é formado onde ambos os líquidos se encontram.\n".. - "Você pode construir um gerador automático de basalto com o Sign Bot.\n".. - "\n".. - "\n".. - "\n", - " - 28.09.2019: Solar system added\n".. - " - 05.10.2019: Data on the solar system and description of the inverter and the power terminal changed\n".. - " - 18.11.2019: Chapter for ores\\, reactor\\, aluminum\\, silo\\, bauxite\\, furnace heating\\, gravel washing system added\n".. - " - 22.02.2020: corrections and chapters on the update\n".. - " - 29.02.2020: ICTA controller added and further corrections\n".. - " - 14.03.2020 Lua controller added and further corrections\n".. - " - 22.03.2020 More TA4 blocks added\n".. - "\n", - }, - images = { - "", - "", - "", - "", - "", - "techage_ta4", - "", - "", - "", - "", - "meridium", - "usmium", - "baborium", - "oil", - "bauxite", - "basalt", - "", - }, - plans = { - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta1_DE.lua b/techage/doc/manual_ta1_DE.lua deleted file mode 100644 index a1f6b51..0000000 --- a/techage/doc/manual_ta1_DE.lua +++ /dev/null @@ -1,172 +0,0 @@ -return { - titles = { - "1,TA1: Eisenzeitalter", - "2,Köhler / Coal Pile", - "2,Kohlebrenner / Coal Burner", - "2,Wassermühle", - "3,TA1 Mühle", - "3,TA1 Schleusenschieber / TA1 Sluice Gate", - "3,TA1 Schleusengriff / TA1 Sluice Handle", - "3,TA1 Apfelholzbrett / TA1 Apple Wood Board", - "3,TA1 Apfel Mühlbachbrett / TA1 Apple Millrace Board", - "2,Erze und Werkzeuge", - "3,Hammer", - "3,Kiessieb / Gravel Sieve", - "3,Trichter / Hopper", - "3,Kies sieben mit dem Trichter", - "3,Meridium", - }, - texts = { - "In TA1 geht es darum\\, mit einfachen Werkzeugen und Gerätschaften ausreichend Erze zu schürfen und Holzkohle herzustellen\\, so dass damit TA2 Maschinen hergestellt und betrieben werden können.\n".. - "\n".. - "Natürlich muss es für ein Eisenzeitalter auch Eisen geben und nicht nur Stahl (steel)\\, wie in \"Minetest Game\". Daher wurden einige Rezepte geändert\\, so dass zuerst Eisen hergestellt werden muss und erst später dann Stahl.\n".. - "\n".. - "Auch ist die Haltbarkeit der Werkzeuge an die Zeitalter angelehnt und entspricht damit nicht dem Minetest Originalspiel.\n".. - "Die Haltbarkeit/Härte bspw. für eine Axt ist:\n".. - "\n".. - " - Bronze: 20\n".. - " - Stahl: 30\n".. - "\n".. - "\n".. - "\n", - "Den Köhler brauchst du\\, um Holzkohle herzustellen. Holzkohle wird für den Brenner\\, aber auch bspw. in TA2 für die Dampfmaschine benötigt.\n".. - "\n".. - "Für den Köhler brauchst du:\n".. - "\n".. - " - einen Anzünderblock ('techage:lighter')\n".. - " - 26 Hölzblöcke (wood)\\, die zu einem Würfen aufgeschichtet werden. Die Holzsorte spielt keine Rolle.\n".. - " - Erde (dirt) um den Holzhaufen abzudecken.\n".. - " - Feuerstein und Eisen (technischer Name: 'fire:flint_and_steel') um den Anzünderblock anzuzünden.\n".. - "\n".. - "Bauanleitung (siehe auch Plan):\n".. - "\n".. - " - Baue eine 5x5 große Fläche aus Erde (dirt)\n".. - " - Platziere in die Mitte einen Anzünder (lighter)\n".. - " - Platziere rund um den Anzünder 7 Holz (wood)\\, aber lasse ein Loch zum Anzünder frei\n".. - " - Baue weitere 2 Schichten Holz darüber\\, so dass ein 3x3x3 großer Holzwürfel entsteht\n".. - " - Überdecke alles mit einer Schicht Erde zu einem 5x5x5 großen Würfel\\, aber lasse das Loch zum Anzünder frei\n".. - " - Entzünde den Anzünder und verschließe das Loch sofort mit jeweils einem Block Holz und Erde\n".. - " - Wenn du alles richtig gemacht hast\\, fängt der Köhler nach wenigen Sekunden an zu rauchen\n".. - " - Öffne den Köhler erst\\, wenn der Rauch verschwunden ist (ca. 20 min)\n".. - "\n".. - "Dann kannst du die 9 Holzkohleblöcke entnehmen und den Köhler erneut füllen.\n".. - "\n".. - "\n".. - "\n", - "Den Kohlebrenner benötigst du bspw. um Eisen und andere Erze im Schmelztiegel zu schmelzen. Es gibt verschiedene Rezepte\\, welche verschiedene Temperaturen benötigen. Je höher der Turm\\, um so heißer ist die Flamme. Eine Höhe von 11 Blöcken über der Bodenplatte ist für alle Rezepte ausreichend\\, ein Brenner mit dieser Höhe verbraucht aber auch mehr Holzkohle.\n".. - "\n".. - "Bauanleitung (siehe auch Plan):\n".. - "\n".. - " - Baue einen Turm aus Stein (cobble) mit einer 3x3 Grundfläche (7-11 Blöcke hoch)\n".. - " - Lasse unten ein Loch an einer Seite offen\n".. - " - Lege einen Anzünder (lighter) hinein\n".. - " - Fülle den Turm bis zum Rand mit Holzkohle\\, in dem du die Holzkohle von oben in das Loch fallen lässt\n".. - " - Entzünde den Anzünder durch das Loch\n".. - " - Platziere den Schmelztiegel oben auf dem Turm direkt in die Flamme\\, einen Block über dem Turmrand\n".. - " - Um den Brenner anzuhalten\\, schließe das Loch vorübergehend bspw. mit einem Erdblock.\n".. - "\n".. - "Der Schmelztiegel hat ein eigenes Menü mit Rezepten und ein Inventar\\, wo du die Erze hinein legst.\n".. - "\n".. - "\n".. - "\n", - "Mit der Wassermühle können Weizen und andere Getreide zu Mehl gemahlen und dann im Ofen zu Brot gebacken werden. Die Mühle wird mit\n".. - "Wasserkraft angetrieben. Dazu muss ein Mühlbach über einen Kanal zum Mühlrad geführt werden.\n".. - "Über eine Schleuse kann der Wasserfluss und damit das Mühlrad gesteuert werden.\n".. - "Die Schleuse besteht aus Schleusenschieber und Schleusengriff.\n".. - "\n".. - "Die Abbildung rechts (auf \"Plan\" klicken) zeigt den Aufbau der Wassermühle.\n".. - "\n".. - "\n".. - "\n", - "Mit der Wassermühle können Weizen und andere Getreide zu Mehl gemahlen und dann im Ofen zu Brot gebacken werden.\n".. - "Die Mühle muss mit einer TA1 Achse mit dem Mühlrad verbunden werden. Die Kraft des Mühlrades reicht nur für eine Mühle.\n".. - "\n".. - "Die Mühle kann mit Hilfe eines Minecart Hoppers automatisiert werden\\, so dass das Mehl bspw. direkt von der Mühle in einen Ofen befördert wird\\, um daraus Brot zu backen.\n".. - "\n".. - "\n".. - "\n", - "Der Schleusenschieber muss auf gleicher Höhe wie die Wasseroberfläche direkt an einen Teich oder in einen Bach gesetzt werden.\n".. - "Wird die Schleuse geöffnet\\, so fließt Wasser durch den Schieber. Dieses Wasser muss dann zum Mühlrad geleitet werden und treibt dort die Mühle an.\n".. - "\n".. - "\n".. - "\n", - "Der TA1 Schleusengriff muss auf den Schleusenschieber gesetzt werden. Mit Hilfe des Schleusengriffs (Rechtsklick) kann der Schieber geöffnet werden.\n".. - "\n".. - "\n".. - "\n", - "Block in verschiedenen Holzsorten zum Bauen des Mühlbachkanals. Es kann aber auch jedes andere Material verwendet werden.\n".. - "\n".. - "\n".. - "\n", - "Block in verschiedenen Holzsorten zum Bauen des Mühlbachkanals. Dieser Block eignet sich speziell in Verbindung mit den Pfosten des Holzzauns um eine Stütze für den Kanal zu bauen.\n".. - "\n".. - "\n".. - "\n", - "TA1 hat seine eigenen Werkzeuge wie Hammer und Kiessieb\\, aber auch der Minecart Hopper kann genutzt werden.\n".. - "\n".. - "\n".. - "\n", - "Mit dem TA1 Hammer können Steine (stone) und Kopfsteinpflaster-Steine (cobble) zu Kies (gravel) zertrümmert werden. Der Hammer ist in verschiedenen Ausführungen und damit verschiedenen Eigenschaften verfügbar: Bronze\\, Stahl\\, Mese und Diamant.\n".. - "\n".. - "\n".. - "\n", - "Mit dem Kiessieb können Erze aus dem Kies gesiebt werden. Dazu mit dem Kies (gravel) auf das Sieb klicken. Der gesiebte Kies und die Erze fallen unten heraus.\n".. - "\n".. - "Um hier nicht stundenlang am Sieb zu stehen\\, kann das Sieben mit dem Trichter (hopper) automatisiert werden.\n".. - "\n".. - "\n".. - "\n", - "Der Hopper aus der Mod \"Minecart\" dient in erster Linie zum Be- und Entladen von Minecarts. Er saugt Gegenstände (items) von oben ein und gibt diese nach rechts weiter. Beim Platzieren des Trichters muss daher auf die Ausgaberichtung geachtet werden.\n".. - "\n".. - "Der Trichter kann aber auch Items aus Kisten (chest) ziehen\\, sofern die Kiste neben oder auf dem Trichter steht. \n".. - "\n".. - "Der Trichter kann auch Items in Kisten legen\\, sofern die Kiste neben dem Trichter steht.\n".. - "\n".. - "\n".. - "\n", - "Mit Hilfe von zwei Kisten\\, zwei Trichtern und einem Kiessieb kann der Siebevorgang automatisiert werden. Der Plan rechts zeigt den Aufbau.\n".. - "\n".. - "Bei den Kisten darauf achten\\, dass es die \"chest_locked\" ist\\, sonst klaut dir jemand die wertvollen Erze aus der Kiste unten.\n".. - "\n".. - "\n".. - "\n", - "TA1 hat seine eigene Metalllegierung Meridium. Meridium Ingots können mit dem Kohlebrenner aus Stahl und Mesesplittern hergestellt werden. Meridium leuchtet im Dunkeln. Auch Werkzeuge aus Meridium leuchten und sind daher im Untertagebau sehr hilfreich.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta1", - "", - "", - "", - "", - "ta1_sluice", - "ta1_sluice_handle", - "ta1_board1", - "ta1_board2", - "ta1_gravelsieve", - "hammer", - "ta1_gravelsieve", - "ta1_hopper", - "", - "meridium", - }, - plans = { - "", - "coalpile", - "coalburner", - "watermill1", - "watermill2", - "", - "", - "", - "", - "", - "", - "", - "", - "hoppersieve", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta1_EN.lua b/techage/doc/manual_ta1_EN.lua deleted file mode 100644 index d11b581..0000000 --- a/techage/doc/manual_ta1_EN.lua +++ /dev/null @@ -1,170 +0,0 @@ -return { - titles = { - "1,TA1: Iron Age", - "2,Charcoal Pile (charcoal burner)", - "2,Melting Furnace", - "2,Watermill", - "3,TA1 mill", - "3,TA1 sluice gate", - "3,TA1 sluice handle", - "3,TA1 Apple Wood Board", - "3,TA1 Apple Millrace Board", - "2,Ores and Tools", - "3,Hammer", - "3,Gravel Sieve", - "3,Hopper", - "3,Gravel seven with the hopper", - "3,Meridium", - }, - texts = { - "TA1 is about mining sufficient ores and producing charcoal with simple tools and equipment\\, so that TA2 machines can be manufactured and operated.\n".. - "\n".. - "Of course\\, for an iron age there must also be iron and not just steel\\, as in \"Minetest Game\". As a result\\, some recipes have been changed so that iron has to be produced first and then steel later.\n".. - "\n".. - "The durability of the tools is based on the ages and therefore does not correspond to the original Minetest game.\n".. - "The durability / hardness for an axe\\, for example:\n".. - "\n".. - " - Bronze: 20\n".. - " - Steel: 30\n".. - "\n".. - "\n".. - "\n", - "You need the Charcoal Pile to make charcoal. Charcoal is required for the melting furnace\\, but also\\, for example\\, in TA2 for the steam engine.\n".. - "\n".. - "For the charcoal burner you need:\n".. - "\n".. - " - a lighter block ('techage:lighter')\n".. - " - 26 wooden blocks that are stacked into a pile of wood. The type of wood is irrelevant\n".. - " - Dirt to cover the pile of wood\n".. - " - Flint and Iron (technical name: 'fire:flint_and_steel') to light the lighter block\n".. - "\n".. - "Building instructions (see also plan):\n".. - "\n".. - " - Build a 5x5 area of dirt\n".. - " - Place 7 wood around the lighter but leave a hole to the lighter\n".. - " - Build another 2 layers of wood on top\\, making a 3x3x3 wooden cube\n".. - " - Cover everything with a layer of dirt into a 5x5x5 cube\\, but keep the hole to the lighter open\n".. - " - Light the lighter and immediately close the hole with a block of wood and dirt\n".. - " - If you have done everything correctly\\, the coal burner will start smoking after a few seconds\n".. - " - Only open the charcoal burner when the smoke has disappeared (approx. 20 min)\n".. - "\n".. - "Then you can remove the 9 charcoal blocks and refill the Charcoal Pile.\n".. - "\n".. - "\n".. - "\n", - "You need the melting furnace\\, for example\\, to melt iron and other ores in the melting pot. There are different recipes that require different temperatures. The higher the melting tower\\, the hotter the flame. A height of 11 blocks above the base plate is for all recipes\\, but a burner with this height also requires more charcoal.\n".. - "\n".. - "Building instructions (see also plan):\n".. - "\n".. - " - Build a stone tower (cobble) with a 3x3 base (7-11 blocks high)\n".. - " - Leave a hole open on one side at the bottom\n".. - " - Put a lighter in it\n".. - " - Fill the tower to the brim with charcoal by dropping the charcoal into the hole from above\n".. - " - Light the lighter through the hole\n".. - " - Place the melting pot on top of the tower directly into the flame\\, one block above the tower edge\n".. - " - To stop the burner\\, temporarily close the hole with an dirt block\\, for example.\n".. - "\n".. - "The melting pot has its own menu of recipes and an inventory where you have to put the ores in.\n".. - "\n".. - "\n".. - "\n", - "The watermill can be used to grind wheat and other grains into flour and then bake them in the furnace to make bread. \n".. - "The mill is powered by water power. To do this\\, a millrace must be led to the mill wheel via a canal.\n".. - "The water flow and thus the mill wheel can be controlled via a sluice. The sluice consists of the sluice lock and sluice handle.\n".. - "\n".. - "The picture on the right (click on \"Plan\") shows the structure of the watermill. \n".. - "\n".. - "\n".. - "\n", - "The watermill can be used to grind wheat and other grains into flour and then bake them in the oven to make bread. The mill must be connected to the mill wheel with a TA1 axle. The power of the mill wheel is only enough for one mill.\n".. - "\n".. - "The mill can be automated with the help of a Minecart Hopper\\, so that the flour\\, for example\\, is transported directly from the mill into an furnace in order to bake bread from it.\n".. - "\n".. - "\n".. - "\n", - "The sluice gate valve must be placed directly next to a pond or in a stream at the same height as the water surface.\n".. - "When the gate is opened\\, water flows through the slide. This water then has to be fed to the mill wheel\\, where it drives the mill.\n".. - "\n".. - "\n".. - "\n", - "The TA1 sluice handle must be placed on the sluice gate. The gate can be opened with the aid of the sluice handle (right click).\n".. - "\n".. - "\n".. - "\n", - "Block in different types of wood for building the millrace canal. However\\, any other material can also be used.\n".. - "\n".. - "\n".. - "\n", - "Block in different types of wood for building the millrace canal. This block is especially suitable in connection\n".. - "with posts of the wooden fence to build a support of the canal.\n".. - "\n".. - "\n".. - "\n", - "TA1 has its own tools such as hammer and gravel sieve\\, but the Minecart Hopper can also be used.\n".. - "\n".. - "\n".. - "\n", - "The TA1 hammer can be used to knock/dig stone in a mine\\, but also to smash cobble to gravel. The hammer is available in different versions and therefore different properties: bronze\\, steel\\, brass and diamond.\n".. - "\n".. - "\n".. - "\n", - "Ores can be sifted from the gravel with the gravel sieve. To do this\\, click on the sieve with the gravel. The sifted gravel and ores fall out below.\n".. - "\n".. - "In order not to stand at the sieve for hours\\, sieving can be automated with the hopper.\n".. - "\n".. - "\n".. - "\n", - "The hopper from the \"Minecart\" mod is primarily used for loading and unloading Minecarts. He sucks in items from above and passes them on to the right. Therefore\\, when placing the hopper\\, pay attention to the direction of dispensing.\n".. - "\n".. - "The hopper can also pull items from boxes (chest)\\, provided the box is next to or on the hopper.\n".. - "\n".. - "The hopper can also put items in boxes if the box is next to the hopper.\n".. - "\n".. - "\n".. - "\n", - "With the help of two boxes\\, two hoppers and a gravel sieve\\, the sieving process can be automated. The plan on the right shows the structure.\n".. - "\n".. - "Make sure that the boxes are \"chest_locked\"\\, otherwise someone will steal the valuable ores from the box below.\n".. - "\n".. - "\n".. - "\n", - "TA1 has its own metal alloy meridium. Meridium ingots can be made with the coal burner from steel and mesecons crystals. Meridium glows in the dark. Tools made of Meridium also light up and are therefore very helpful in underground mining.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta1", - "", - "", - "", - "", - "ta1_sluice", - "ta1_sluice_handle", - "ta1_board1", - "ta1_board2", - "ta1_gravelsieve", - "hammer", - "ta1_gravelsieve", - "ta1_hopper", - "", - "meridium", - }, - plans = { - "", - "coalpile", - "coalburner", - "watermill1", - "watermill2", - "", - "", - "", - "", - "", - "", - "", - "", - "hoppersieve", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta1_RU.lua b/techage/doc/manual_ta1_RU.lua deleted file mode 100644 index 8a9a754..0000000 --- a/techage/doc/manual_ta1_RU.lua +++ /dev/null @@ -1,170 +0,0 @@ -return { - titles = { - "1,TA1: Эпоха железа", - "2,Углевыжигательная куча (древесноугольная печь)", - "2,Плавильная печь", - "2,Водяная мельница", - "3,TA1 мельница", - "3,TA1 шлюзовой затвор", - "3,TA1 шлюзовой рычаг", - "3,TA1 яблоневая доска", - "3,TA1 яблоневая мельничная доска", - "2,Руды и инструменты", - "3,Молот", - "3,Гравийное сито", - "3,Хоппер", - "3,Просеивание гравия и хоппер", - "3,Меридий", - }, - texts = { - "TA1 - про добычу необходимейших руд и изготовление древесного угля простейшими инструментами и оборудованием\\, чтобы ТА2 машины можно было построить и запустить.\n".. - "\n".. - "Конечно\\, для Эпохи железа потребуется также железо и не только сталь\\, как в ванильной \"Minetest Game\". В результате\\, некоторые рецепты были изменены, и теперь сперва нужно произвести железо, а сталь - позже.\n".. - "\n".. - "Долговечность инструментов зависит от эпохи и поэтому не соответствует оригинальной игре Майнтест.\n".. - "Долговечность / прочность топора\\, например:\n".. - "\n".. - " - Бронза: 20\n".. - " - Сталь: 30\n".. - "\n".. - "\n".. - "\n", - "Для изготовления древесного угля потребуется Углевыжигательная Куча. Древесный уголь используется в плавильной печи\\, но также\\, например\\, в TA2 для парового двигателя.\n".. - "\n".. - "Для жжения угля понадобится:\n".. - "\n".. - " - блок-поджигатель ('techage:lighter')\n".. - " - 26 деревянный блоков досок, составленных в кучу. Тип дерева не важен.\n".. - " - Земля для покрытия кучи дерева.\n".. - " - Огниво (техническое наименование: 'fire:flint_and_steel') чтобы зажечь блок-поджигатель\n".. - "\n".. - "Инструкция по строительству (см. также чертёж):\n".. - "\n".. - " - Соорудите площадку из земли 5х5\n".. - " - Поставьте 7 досок вокруг поджигателя но оставьте отверстие для доступа к поджигателю\n".. - " - Постройте ещё 2 слоя досок вверх\\, формируя деревянный куб 3х3х3\n".. - " - Покройте всё слоем земли, формируя земляной куб 5х5х5\\, но оставьте отверстие для доступа к поджигателю\n".. - " - Воспламените поджигатель и немедленно закройте отверстие блоком досок и блоком земли.\n".. - " - Если всё сделано верно\\, углесжигательная куча начнёт пускать дым вверх через несколько секунд\n".. - " - Вскрывайте кучу только тогда, когда дым исчезнет! (примерно 20 минут)\n".. - "\n".. - "Теперь можно забрать 9 блоков древесного угля и заполнить Кучу снова.\n".. - "\n".. - "\n".. - "\n", - "Плавильная печь понадобится\\, например\\, чтобы выплавлять железо и другие руды в плавильном тигеле. Для разных рецептов требуется разная температура. Чем выше плавильная башня\\, тем горячее пламя. Высота 11 блоков приемлема для всех рецептов\\, однако и потребляет больше всего древесного угля.\n".. - "\n".. - "Инструкция по строительству (см. также чертёж):\n".. - "\n".. - " - Соорудите каменную башню (булыжник) с основанием 3х3 высотой 7-11 блоков.\n".. - " - Оставьте отверстие внизу с одной стороны.\n".. - " - Поместите поджигатель в отверстие.\n".. - " - Заполните башню древесным углем до краёв, сбрасывая древесный уголь сверху в шахту.\n".. - " - Воспламените поджигатель через отверстие.\n".. - " - Установите плавильный тигель наверху башни\n(на один блок выше пламени)\n".. - " - Чтобы временно прервать горение\\, закройте отверстие блоком земли\\, например.\n".. - "\n".. - "У плавильного тигеля есть своё меню рецептов и инвентарь, куда помещать руды.\n".. - "\n".. - "\n".. - "\n", - "Мельница используется для перемалывания пшеницы и других зёрен в муку, затем муку испекают в печи для получения хлеба.\n".. - "Мельница крутится силой воды. Для этого\\, к мельнице нужно подвести водный поток каналом.\n".. - "Поток воды и мельничное колесо можно контролировать шлюзом. Шлюз состоит из шлюзового замка и шлюзового рычага.\n".. - "\n".. - "Картинка справа (кликните на \"Plan\") иллюстрирует устройство мельницы. \n".. - "\n".. - "\n".. - "\n", - "Мельница используется для перемалывания пшеницы и других зёрен в муку, затем муку испекают в печи для получения хлеба. Мельница должна быть соединена с мельничным колесом посредством ТА1 оси. Мощности мельничного колеса хватает только для одной мельницы.\n".. - "\n".. - "Автоматизировать мельницу можно Железнодорожным хоппером\\, так что мука\\, например\\, будет перевозиться от мельницы до печи для дальнейшей выпечки.\n".. - "\n".. - "\n".. - "\n", - "Шлюзовой затвор нужно размещать непосредственно рядом с водоёмом или в потоке, на том же уровне что и поверхность воды.\n".. - "Когда шлюзовой затвор открыт\\, вода стекает вниз. Эта вода напирает на мельничное колесо.\\, и крутит мельницу.\n".. - "\n".. - "\n".. - "\n", - "TA1 шлюзовой рычаг размещается на шлюзовом затворе. Затвор можно открывать рычагом (правый клик).\n".. - "\n".. - "\n".. - "\n", - "Блок любого типа дерева для строительства мельничного водоканала. Впрочем\\, можно использовать любой другой материал.\n".. - "\n".. - "\n".. - "\n", - "Блок любого типа дерева для строительства мельничного водоканала. Этот блок оптимально подходит для соединения.\n".. - "со столбами деревянного забора, для строительства опор канала.\n".. - "\n".. - "\n".. - "\n", - "TA1 содержит собственные инструменты, такие как молот и гравийное сито\\, но также можно использовать Железнодорожный хоппер.\n".. - "\n".. - "\n".. - "\n", - "TA1 молот используется для разбивания/выкапывания камня\\, а также для раздробления булыжника в гравий. Молот доступен в разных исполнениях с разными свойствами: бронза\\, сталь\\, латунь и алмаз.\n".. - "\n".. - "\n".. - "\n", - "Руды можно высеивать из гравия через гравийное сито. Для этого\\, кликайте гравием на сито. Просеянный гравий и руды выпадут снизу.\n".. - "\n".. - "Чтобы не стоять возле сита часами\\, процесс можно автоматизировать хоппером.\n".. - "\n".. - "\n".. - "\n", - "Хоппер из мода \"Minecart\" (Вагонетка) задуман для погрузки-разгрузки вагонеток. Хоппер втягивает предметы сверху от себя и выгружает направо от себя. Так\\, располагая хоппер\\, обращайте внимание на направление выгрузки.\n".. - "\n".. - "Хоппер также может вытягивать предметы из коробок (сундуков)\\, при условии что коробка расположена рядом или над хоппером.\n".. - "\n".. - "Хоппер также может помещать предметы в коробки, при условии что коробка расположена рядом с хоппером.\n".. - "\n".. - "\n".. - "\n", - "С помощью двух коробок\\, двух хопперов и гравийного сита\\, процесс просеивания может быть автоматизирован. Чертёж справа иллюстрирует механизм.\n".. - "\n".. - "Убедитесь, что коробки \"chest_locked\"\\ (защищённые), иначе кто-нибудь похитит ценные руды из верхней коробки.\n".. - "\n".. - "\n".. - "\n", - "TA1 отркрывает собственный сплав - меридий. Меридиевые слитки изготавливаются в плавильном тигеле из стали и месекон кристаллов. Меридий светится в темноте. Меридиевые инструменты тоже светятся, становясь хорошей поддержкой в подземных раскопках.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta1", - "", - "", - "", - "", - "ta1_sluice", - "ta1_sluice_handle", - "ta1_board1", - "ta1_board2", - "ta1_gravelsieve", - "hammer", - "ta1_gravelsieve", - "ta1_hopper", - "", - "meridium", - }, - plans = { - "", - "coalpile", - "coalburner", - "watermill1", - "watermill2", - "", - "", - "", - "", - "", - "", - "", - "", - "hoppersieve", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta1_pt-BR.lua b/techage/doc/manual_ta1_pt-BR.lua deleted file mode 100644 index e7ade68..0000000 --- a/techage/doc/manual_ta1_pt-BR.lua +++ /dev/null @@ -1,153 +0,0 @@ -return { - titles = { - "1,TA1: Idade do Ferro", - "2,Pilha de Carvão (queimador de carvão)", - "2,Forno de Fundição", - "2,Moinho d'Água", - "3,Moinho d'Água TA1", - "3,Comporta TA1", - "3,Alavanca de Comporta TA1", - "3,Placa de Madeira de Maçã TA1", - "3,Placa de Curso d'Água de Maçã TA1", - "1,Minérios e Ferramentas", - "2,Martelo", - "2,Peneira de Cascalho(Sieve)", - "2,Funil (Minecart Hopper)", - "2,Peneirando sete cascalhos com Funil", - }, - texts = { - "TA1 trata da extração de minérios suficientes e da produção de carvão com ferramentas e equipamentos simples\\, para que as máquinas TA2 possam ser fabricadas e operadas.\n".. - "\n".. - "É claro que\\, para uma Idade do Ferro\\, deve haver ferro e não apenas aço\\, como em \"Minetest Game\". Como resultado\\, algumas receitas foram alteradas para que o ferro precise ser produzido primeiro e\\, posteriormente\\, o aço.\n".. - "\n".. - "A durabilidade das ferramentas é baseada nas eras e\\, portanto\\, não corresponde ao jogo original do Minetest.\n".. - "A durabilidade/dureza de um machado\\, por exemplo:\n".. - "\n".. - " - Bronze: 20\n".. - " - Aço: 30\n".. - "\n".. - "\n".. - "\n", - "Você precisa da Pilha de Carvão para fazer carvão. O carvão é necessário para a fundição\\, mas também\\, por exemplo\\, em TA2 para a máquina a vapor.\n".. - "\n".. - "Para o queimador de carvão\\, você precisa de:\n".. - "\n".. - " - Um bloco de acendedor ('techage:lighter')\n".. - " - 26 blocos de madeira empilhados para formar um monte de madeira. O tipo de madeira é irrelevante.\n".. - " - Terra para cobrir o monte de madeira\n".. - " - Pedra lascada e Ferro (nome técnico: 'fire:flint_and_steel') para acender o bloco de acendedor\n".. - "\n".. - "Instruções de construção (veja também o plano):\n".. - "\n".. - " - Construa uma área de 5x5 de terra\n".. - " - Coloque 7 blocos de madeira ao redor do acendedor\\, mas deixe um buraco para o acendedor\n".. - " - Construa mais 2 camadas de madeira em cima\\, formando um cubo de madeira 3x3x3\n".. - " - Cubra tudo com uma camada de terra formando um cubo de 5x5x5\\, mas mantenha o buraco para o acendedor aberto\n".. - " - Acenda utilizando o isqueiro e feche imediatamente o buraco com um bloco de madeira e terra\n".. - " - Se você fez tudo corretamente\\, o queimador de carvão começará a soltar fumaça após alguns segundos\n".. - " - Só abra o queimador de carvão quando a fumaça tiver desaparecido (aproximadamente 20 minutos)\n".. - " - Então você pode remover os 9 blocos de carvão e reabastecer a Pilha de Carvão.\n".. - "\n".. - "\n".. - "\n", - "Você precisa do forno de fundição\\, por exemplo\\, para fundir ferro e outros minérios no Vaso de fundição(cadinho). Existem receitas diferentes que requerem diferentes temperaturas. Quanto mais alto a torre de fusão\\, mais quente é a chama. Uma altura de 11 blocos acima da placa base é para todas as receitas\\, mas um queimador com essa altura também requer mais carvão.\n".. - "\n".. - "Instruções de construção (veja também o plano):\n".. - "\n".. - " - Construa uma torre de pedregulho (cobble) com uma base de 3x3 (7-11 blocos de altura)\n".. - " - Deixe um buraco aberto de um lado na parte inferior\n".. - " - Coloque um acendedor nele\n".. - " - Encha a torre até a borda com carvão despejando o carvão no buraco de cima para baixo\n".. - " - Acenda o acendedor através do buraco\n".. - " - Coloque o Vaso de fundição(cadinho) no topo da torre diretamente na chama\\, um bloco acima da borda da torre\n".. - " - Para parar o queimador\\, feche temporariamente o buraco com um bloco de terra\\, por exemplo.\n".. - " - O Vaso de fundição(cadinho) tem seu próprio menu de receitas e um inventário onde você precisa colocar os minérios.\n".. - "\n".. - "\n".. - "\n", - "O moinho d'água pode ser usado para moer trigo e outros grãos para fazer farinha e depois assá-los no forno para fazer pão.\n".. - "O moinho é alimentado por energia hidráulica. Para isso\\, um curso de água deve ser conduzido até a roda do moinho através de um canal.\n".. - "O fluxo de água e\\, portanto\\, a roda do moinho\\, podem ser controlados por meio de uma comporta. A comporta é composta pelo bloqueio de comporta e pela alavanca de comporta.\n".. - "\n".. - "A imagem à direita (clique em \"Plano\") mostra a estrutura do moinho d'água.\n".. - "\n".. - "\n".. - "\n", - "O moinho d'água pode ser usado para moer trigo e outros grãos para fazer farinha e depois assá-los no forno para fazer pão. O moinho deve ser conectado à roda do moinho com um eixo TA1. A potência da roda do moinho é apenas suficiente para um moinho.\n".. - "\n".. - "O moinho pode ser automatizado com a ajuda de um Funil(Minecart Hopper)\\, para que a farinha\\, por exemplo\\, seja transportada diretamente do moinho para um forno para assar pão.\n".. - "\n".. - "\n".. - "\n", - "A válvula de comporta deve ser colocada diretamente ao lado de um lago ou em um riacho na mesma altura que a superfície da água.\n".. - "Quando a comporta é aberta\\, a água flui através do canal. Essa água deve ser conduzida até a roda do moinho\\, onde movimenta o moinho.\n".. - "\n".. - "\n".. - "\n", - "A alavanca de comporta TA1 deve ser colocada na comporta. A comporta pode ser aberta com a ajuda da alavanca de comporta (clique com o botão direito).\n".. - "\n".. - "\n".. - "\n", - "Podem ser usados bloco de diferentes tipos de madeira para construir o canal do curso d'água. No entanto\\, qualquer outro material também pode ser usado.\n".. - "\n".. - "\n".. - "\n", - "Podem ser utilizados blocos em diferentes tipos de madeira para construir o canal do curso d'água. Este bloco é especialmente adequado em conexão com postes da cerca de madeira para construir um suporte do canal.\n".. - "\n".. - "\n".. - "\n", - "O TA1 possui suas próprias ferramentas\\, como martelo e peneira de cascalho\\, mas o Funil(Minecart Hopper) também pode ser utilizado.\n".. - "\n", - "O martelo TA1 pode ser utilizado para bater/escavar pedra em uma mina\\, mas também para quebrar pedregulho(cobble) em cascalho(gravel). O martelo está disponível em diferentes versões\\, cada uma com propriedades distintas: bronze\\, aço\\, latão e diamante.\n".. - "\n", - "Minérios podem ser peneirados do cascalho com a peneira de cascalho. Para fazer isso\\, clique na peneira com o cascalho. O cascalho peneirado e os minérios caem abaixo.\n".. - "\n".. - "Para não ficar horas na peneira\\, é possível automatizar o processo com o Funil(Minecart Hopper).\n".. - "\n", - "O funil do mod \"Minecart Hopper\" é utilizado principalmente para carregar e descarregar carrinhos de mineração. Ele suga itens de cima e os passa para a direita. Portanto\\, ao posicionar o funil\\, preste atenção na direção de dispensa.\n".. - "\n".. - "O funil também pode puxar itens de baús\\, desde que a caixa esteja ao lado ou em cima do funil.\n".. - "\n".. - "O funil também pode colocar itens em baús se a caixa estiver ao lado do funil.\n".. - "\n", - "Com a ajuda de dois baús\\, dois funis e uma peneira de cascalho\\, o processo de peneiração pode ser automatizado. O plano à direita mostra a estrutura.\n".. - "\n".. - "Certifique-se de que os baús são protegidos\\, caso contrário\\, alguém pode roubar os minérios valiosos do baú abaixo.\n".. - "\n".. - "Meridium\n".. - "O TA1 possui sua própria liga metálica\\, o Meridium. Lingotes de meridium podem ser feitos com a caldeira a carvão\\, utilizando aço e cristais de mesecons. O meridium brilha no escuro. Ferramentas feitas de meridium também emitem luz\\, sendo\\, portanto\\, muito úteis na mineração subterrânea.\n".. - "\n", - }, - images = { - "techage_ta1", - "", - "", - "", - "", - "ta1_sluice", - "ta1_sluice_handle", - "ta1_board1", - "ta1_board2", - "", - "", - "", - "", - "", - }, - plans = { - "", - "coalpile", - "coalburner", - "watermill1", - "watermill2", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta2_DE.lua b/techage/doc/manual_ta2_DE.lua deleted file mode 100644 index 7c91acb..0000000 --- a/techage/doc/manual_ta2_DE.lua +++ /dev/null @@ -1,308 +0,0 @@ -return { - titles = { - "1,TA2: Dampfzeitalter", - "2,Dampfmaschine", - "3,TA2 Feuerbox / Firebox", - "3,TA2 Boiler", - "3,TA2 Zylinder /Cylinder", - "3,TA2 Schwungrad / Flywheel", - "3,TA2 Dampfleitungen / Steam Pipe", - "3,TA2 Antriebsachsen / TA2 Drive Axle", - "3,TA2 Stromgenerator / TA2 Power Generator", - "2,TA2 Energiespeicher", - "3,TA2 Seilwinde / TA2 Winch", - "3,TA2 Gewichtekiste / TA2 Weight Chest", - "3,TA2 Kupplung / TA2 Clutch", - "2,Items schieben und sortieren", - "3,Röhren / TechAge Tube", - "3,Röhren Konzentrator / Tube Concentrator", - "3,TA2 Schieber / Pusher", - "3,TA2 Verteiler / Distributor", - "2,Kieswaschanlage", - "3,TA2 Kiesspüler / Gravel Rinser", - "2,Stein brechen\\, mahlen und sieben", - "3,TA2 Steinbrecher / Quarry", - "3,TA2 Mühle / Grinder", - "3,TA2 Kiessieb / Gravel Sieve", - "2,Items produzieren", - "3,TA2 Autocrafter", - "3,TA2 Elektronikfabrik / Electronic Fab", - "2,Sonstige Blöcke", - "3,TA2 Flüssigkeitensammler / Liquid Sampler", - "3,TA2 Gesicherte Kiste / Protected Chest", - "3,Techage Forceload Block", - }, - texts = { - "In TA2 geht es darum\\, erste Maschinen zur Verarbeitung von Erzen zu bauen und zu betreiben. Einige Maschinen müssen dazu über Antriebsachsen angetrieben werden. Dazu musst du eine Dampfmaschine bauen und diese mit Kohle oder Holzkohle anheizen.\n".. - "\n".. - "In TA2 steht auch ein Kiesspüler zur Verfügung\\, mit dem seltene Erze wie Usmium Nuggets ausgewaschen werden können. Diese Nuggets wirst du später für weitere Rezepte brauchen.\n".. - "\n".. - "\n".. - "\n", - "Die Dampfmaschine besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden. Dazu werden die Blöcke TA2 Feuerbox\\, TA2 Boiler oben\\, TA2 Boiler unten\\, TA2 Zylinder\\, TA2 Schwungrad und Dampfleitungen benötigt.\n".. - "\n".. - "Zusätzlich werden Antriebsachsen sowie Getriebeblöcke für Richtungswechsel benötigt. Das Schwungrad muss über die Antriebsachsen mit allen Maschinen verbunden werden\\, die angetrieben werden müssen.\n".. - "\n".. - "Bei allen Blöcken beim Setzen immer auch die Ausrichtung achten:\n".. - "\n".. - " - Zylinder links\\, Schwungrad rechts daneben\n".. - " - Dampfleitungen anschließen\\, wo ein entsprechendes Loch ist\n".. - " - Antriebsachse beim Schwungrad nur rechts\n".. - " - bei allen Maschinen kann die Antriebsachse an allen Seiten angeschlossen werden\\, welche nicht durch andere Funktionen belegt wird\\, wie bspw. die IN und OUT Löcher bei Mühle und Sieb.\n".. - "\n".. - "Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen.\n".. - "Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden.\n".. - "Wenn das Wasser heiß ist (Temperaturanzeige ganz oben)\\, kann die Dampfmaschine am Schwungrad gestartet werden.\n".. - "\n".. - "Die Dampfmaschine leistet 25 ku und kann damit mehrere Maschinen gleichzeitig antreiben.\n".. - "\n".. - "\n".. - "\n", - "Teil der Dampfmaschine. \n".. - "\n".. - "Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die von der Dampfmaschine angefordert wird. Unter Volllast brennt Kohle 32 s und Holzkohle 96 s.\n".. - "\n".. - "\n".. - "\n", - "Teil der Dampfmaschine. Muss mit Wasser gefüllt werden. Dies erfolgt durch Klicken mit einem Wassereimer auf den Boiler. Wenn kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt\\, schaltet sich die Dampfmaschine ab. Bei der Dampfmaschine geht bei jedem Kolbenhub etwas Wasser als Dampf verloren\\, daher muss regelmäßig Wasser nachgefüllt werden.\n".. - "\n".. - "\n".. - "\n", - "Teil der Dampfmaschine.\n".. - "\n".. - "\n".. - "\n", - "Antriebsteil der Dampfmaschine. Das Schwungrad muss über Antriebsachsen mit den Maschinen verbunden werden. \n".. - "\n".. - "\n".. - "\n", - "Teil der Dampfmaschine. Der Boiler muss mit dem Zylinder über die Dampfleitungen (steam pipes) verbunden werden. Die Dampfleitung besitzt keine Abzweigungen\\, die maximale Länge beträgt 12 m (Blöcke).\n".. - "\n".. - "\n".. - "\n", - "Die Antriebsachsen dienen zur Kraftübertragung von der Dampfmaschine zu anderen Maschinen. Die maximale Länge einer Antriebsachse beträgt 10 Blöcke. Über Getriebeblöcke können auch größere Strecken überbrückt\\, sowie Abzweigungen und Richtungswechsel realisiert werden.\n".. - "\n".. - "\n".. - "\n", - "Um Lampen oder andere Stromverbraucher an einer Dampfmaschine betreiben zu können\\, wird der TA2 Stromgenerator benötigt. Der TA2 Stromgenerator muss auf einer Seite mit Antriebsachsen verbunden werden und liefert dann auf der anderen Seite elektrischen Strom.\n".. - "\n".. - "Wird der Stromgenerator nicht mit ausreichend Kraft versorgt\\, geht er in einen Fehlerzustand und muss über einen Rechtsklick wieder aktiviert werden.\n".. - "\n".. - "Das Stromgenerator nimmt primär max. 25 ku an Achsenkraft auf und gibt sekundär max. 24 ku als Strom wieder ab. Er verbraucht also ein ku für die Umwandlung.\n".. - "\n".. - "\n".. - "\n", - "Bei größeren Anlagen mit mehreren Dampfmaschinen oder vielen angetriebenen Maschinen empfiehlt sich ein Energiespeicher. Der Energiespeicher bei TA2 arbeitet mit Lageenergie. Dazu wird Balast (Steine\\, Kies) in einer Kiste mit Hilfe einer Seilwinde in die Höhe gezogen. Ist überschüssige Energie im Achsen-Netzwerk vorhanden\\, so wird die Kiste nach oben gezogen. Wird kurzfristig mehr Energie benötigt\\, als die Dampfmaschine liefern kann\\, so gibt der Energiespeicher die gespeicherte Energie wieder ab\\, und die Balast-Kiste bewegt sich wieder nach unten.\n".. - "\n".. - "Der Energiespeicher besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden.\n".. - "\n".. - "Um die maximale Speicherkapazität zu erreichen\\, muss die Kiste mit Gewichten komplett gefüllt\\, und der Mast inklusive der zwei Getriebeblöcke 12 Blöcke hoch sein. Kleinere Aufbauten sind aber auch möglich.\n".. - "\n".. - "\n".. - "\n", - "Die Seilwinde muss mit einem Getriebeblock verbunden werden und kann so überschüssige Energie aufnehmen und damit eine Gewichtekiste nach oben ziehen. Achte beim Aufbau der Seilwinde darauf\\, dass der Pfeil auf der Blockoberseite zum Getriebeblock zeigt. Die maximale Seillänge beträgt 10 Blöcke.\n".. - "\n".. - "\n".. - "\n", - "Diese Kiste muss mit bis zu 10 Blöcken Abstand unter die Seilwinde gesetzt und mit Pflastersteinen Kies oder Sand gefüllt werden. Ist das Mindestgewicht von einem Stack (99+ Items) erreicht und überschüssige Energie vorhanden\\, wird die Kiste automatisch über eine Seil mit der Seilwinde verbunden und in die Höhe gezogen.\n".. - "\n".. - "\n".. - "\n", - "Mit der Kupplung können Achsen und Maschinen vom Energiespeicher getrennt werden. Damit kommen die Achsen nach der Kupplung zum Stillstand und Maschinenanlagen können umgebaut werden. Achte beim Aufbau der Kupplung darauf\\, dass der Pfeil auf der Blockoberseite zum Energiespeicher zeigt. \n".. - "\n".. - "\n".. - "\n", - "Um Gegenstände (Items) von einer Verarbeitungsstation zur nächsten weiter zu transportieren\\, werden Schieber und Röhren verwendet. Siehe Plan.\n".. - "\n".. - "\n".. - "\n", - "Zwei Maschinen können mit Hilfe eines Schiebers und einer Röhre (tube) verbunden werden. Röhren besitzen keine Abzweigungen. Die maximale Länge beträgt 200 m (Blöcke).\n".. - "\n".. - "Röhren können alternativ mit Hilfe der Shift-Taste platziert werden. Dies erlaubt bspw. Röhren parallel zu verlegen\\, ohne dass diese sich unbeabsichtigt verbinden.\n".. - "\n".. - "Die Transportkapazität einer Röhre ist unbegrenzt und nur durch die Schieber begrenzt.\n".. - "\n".. - "\n".. - "\n", - "Über den Konzentrator können mehrere Röhren zu einer Röhre zusammengeführt werden. Die Richtung\\, in der alle Items weitergegeben werden\\, ist mit einem Pfeil markiert.\n".. - "\n".. - "\n".. - "\n", - "Ein Schieber ist in der Lage\\, Items aus Kisten oder Maschinen zu ziehen und in andere Kisten oder Maschinen zu schieben. Oder anders gesagt: Zwischen zwei Blöcken mit Inventar muss ein und genau ein Schieber sein. Mehrere Schieber in Reihe sind nicht möglich.\n".. - "In die Gegenrichtung ist ein Schieber für Items aber durchlässig\\, so dass eine Kiste über eine Röhre gefüllt und ebenso geleert werden kann. \n".. - "\n".. - "Ein Schieber geht in den Zustand \"standby\"\\, wenn der keine Items zum Schieben hat. Ist der Ausgang blockiert oder das Inventory des Empfängers voll\\, so geht der Schieber in den Zustand \"blocked\". Aus beiden Zuständen kommt der Schieber nach einigen Sekunden selbsttätig wieder raus\\, sofern sich die Situation geändert hat.\n".. - "\n".. - "Der Verarbeitungsleistung eines TA2 Schiebers beträgt 2 Items alle 2 s.\n".. - "\n".. - "\n".. - "\n", - "Der Verteiler ist in der Lage\\, die Items aus seinem Inventar sortiert in bis zu vier Richtungen weiter zu transportieren. Dazu muss der Verteiler entsprechend konfiguriert werden. \n".. - "\n".. - "Der Verteiler besitzt dazu ein Menü mit 4 Filter mit unterschiedlichen Farben\\, entsprechend den 4 Ausgängen. Soll ein Ausgang genutzt werden\\, so muss der entsprechende Filter über die \"on\" Checkbox aktiviert werden. Alle Items\\, die für diesen Filter konfiguriert sind\\, werden über den zugeordneten Ausgang ausgegeben. Wird ein Filter aktiviert\\, ohne das Items konfiguriert werden\\, so sprechen wir hier von einem \"nicht-konfigurierten\"\\, offenen Ausgang.\n".. - "\n".. - "*Achtung: Der Verteiler ist an seinen Ausgängen gleichzeitig ein Schieber. Daher niemals die Gegenstände mit einem Schieber aus dem Verteiler ziehen!*\n".. - "\n".. - "Für einen nicht-konfigurierten Ausgang gibt es zwei Betriebsarten:\n".. - "\n".. - "1) Alle Items ausgeben\\, die an keine anderen Ausgängen ausgegeben werden können\\, auch wenn diese blockiert sind.\n".. - "\n".. - "2) Nur die Items ausgeben\\, die für keinen anderen Filter konfiguriert wurden.\n".. - "\n".. - "Im ersten Fall werden immer alle Items weitergeleitet und der Verteiler läuft nicht voll. Im zweiten Fall werden Items zurückgehalten und der Verteiler kann voll laufen und in der Folge blockieren.\n".. - "\n".. - "Einstellbar ist die Betriebsart über die \"blockiere\" Checkbox.\n".. - "\n".. - "Der Verarbeitungsleistung eines TA2 Verteilers beträgt 4 Items alle 2 s\\, wobei der Verteiler dabei versucht\\, die 4 Items auf die offenen Ausgänge zu verteilen.\n".. - "\n".. - "Wird dasselbe Item in einem Filter mehrfach hinterlegt\\, so beeinflusst dies das langfristige Verteilungsverhältnis entsprechend.\n".. - "\n".. - "Bitte beachte\\, dass die Verteilung ein probabilistischer Vorgang ist\\, d.h. die Verhältnisse werden nicht exakt\\, sondern nur langfristig eingehalten.\n".. - "\n".. - "In den Filtern beträgt die maximale Stackgröße 12\\; insgesamt können höchstens 36 Items konfiguriert werden.\n".. - "\n".. - "\n".. - "\n", - "Die Kieswaschanlage ist eine komplexere Maschine mit dem Ziel\\, Usmium Nuggets aus gesiebtem Kies auszuwaschen. Für den Aufbau wird ein TA2 Kiesspüler mit Achsenantrieb\\, ein Trichter\\, eine Kiste\\, sowie fließendes Wasser benötigt. \n".. - "\n".. - "Aufbau von links nach rechts (siehe auch Plan):\n".. - "\n".. - " - Ein Erdblock\\, darauf die Wasserquelle\\, umgeben auf 3 Seiten von bspw. Glasblöcken\n".. - " - daneben den Kiesspüler\\, ggf. mit Röhrenanschlüssen für den Kies An- und Abtransport\n".. - " - dann den Trichter mit Kiste\n".. - "\n".. - "Das Ganze umgeben von weiteren Glasblöcken\\, so dass das Wasser über den Kiesspüler und den Trichter fließt und ausgespülten Nuggets vom Trichter wieder eingesammelt werden können.\n".. - "\n".. - "\n".. - "\n", - "Der Kiesspüler ist in der Lage\\, aus bereits gesiebtem Kies die Erze Usmium und Kupfer auszuspülen\\, sofern dieser von Wasser überspült wird.\n".. - "\n".. - "Ob der Kiesspüler korrekt arbeitet\\, kann mit Hilfe von Stöcken (sticks) getestet werden\\, wenn diese in das Inventar des Kiesspülers getan werden. Diese müssen einzeln ausgespült und vom Trichter eingefangen werden.\n".. - "\n".. - "Die Verarbeitungsleistung ist ein Kies Item alle 2 s. Der Kiesspüler benötigt 3 ku Energie.\n".. - "\n".. - "\n".. - "\n", - "Das Brechen\\, Mahlen und Siebe von Gestein dient zur Gewinnung von Erzen. Gesiebtes Kies kann aber auch anderweitig genutzt werden. Steinbrecher\\, Mühle und Sieb müssen angetrieben und damit in der Nähe einer Dampfmaschine aufgebaut werden.\n".. - "\n".. - "\n".. - "\n", - "Der Steinbrecher dient zum Abbau von Steinen und anderen Materialien aus dem Untergrund. Der Steinbrecher gräbt ein 5x5 Blöcke großes Loch. Die Tiefe ist einstellbar.\n".. - "Die Verarbeitungsleistung ist ein Block alle 4 s. Der Steinbrecher benötigt 10 ku Energie. Die maximale Tiefe beträgt 20 Meter. Für größere Tiefen siehe TA3/TA4.\n".. - "\n".. - "\n".. - "\n", - "Die Mühle ist in der Lage\\, verschiedenes Gestein\\, aber auch Holz und andere Items zu mahlen.\n".. - "Die Verarbeitungsleistung ist ein Item alle 4 s. Die Mühle benötigt 4 ku Energie.\n".. - "\n".. - "\n".. - "\n", - "Das Kiessieb ist in der Lage\\, Kies zu sieben um Erze zu gewinnen. Als Ergebnis erhält man teilweise \"gesiebtes Kies\"\\, was nicht wieder gesiebt werden kann.\n".. - "Die Verarbeitungsleistung ist ein Item alle 4 s. Das Kiessieb benötigt 3 ku Energie.\n".. - "\n".. - "\n".. - "\n", - "Mit TA2 Maschinen können nicht nur Erze gewonnen\\, sondern auch Gegenstände hergestellt werden.\n".. - "\n", - "Der Autocrafter dient zur automatischen Herstellung von Waren. Alles was der Spieler über das \"Crafting Grid\" herstellen kann\\, kann auch durch den Autocrafter erledigt werden. Dazu müssen im Menü des Autocrafters das Rezept eingegeben und die notwendigen Zutaten hinzugefügt werden.\n".. - "\n".. - "Zutaten und hergestellte Waren können über Röhren und Schieber in und aus dem Block transportiert werden.\n".. - "\n".. - "Die Verarbeitungsleistung ist ein Item alle 4 s. Der Autocrafter benötigt 4 ku Energie.\n".. - "\n".. - "\n".. - "\n", - "Die Elektronikfabrik ist eine Spezialmaschine und nur für die Herstellung der Vakuumröhren nutzbar. Vakuumröhren werden für TA3 Maschinen und Blöcke benötigt.\n".. - "\n".. - "Die Verarbeitungsleistung ist eine Vakuumröhre alle 6 s. Die Elektronikfabrik benötigt 8 ku Energie.\n".. - "\n".. - "\n".. - "\n", - "", - "Für manche Rezepte wird Wasser benötigt. Damit auch diese Rezepte automatisiert mit dem Autocrafter bearbeitet werden können\\, muss Wasser in Eimern bereitgestellt werden. Hierzu dient der Flüssigkeitensammler. Er benötigt leere Eimer und muss ins Wasser gestellt werden.\n".. - "\n".. - "Die Verarbeitungsleistung ist ein Wassereimer alle 8 s. Der Flüssigkeitensammler benötigt 3 ku Energie.\n".. - "\n".. - "\n".. - "\n", - "Die gesicherte Kiste kann nur von den Spielern genutzt werden\\, die an diesem Ort auch bauen können\\, also Protection Rechte besitzen. Es spielt dabei keine Rolle\\, wer die Kiste setzt. \n".. - "\n".. - "\n".. - "\n", - "Minetest teilt die Karte in sogenannte Map-Blocks ein. Das sind Würfel mit 16x16x16 Blöcke Kantenlänge. So ein Map-Block wird vom Server immer komplett geladen\\, aber es werden nur die Blöcke um einen Spieler herum geladen (ca. 2-3 Blöcke in alle Richtungen). In Sichtrichtung des Spielers sind es auch mehr Map-Blöcke. Nur dieser Teil der Welt ist aktiv und nur hier wachsen Pflanzen und Bäume bzw. laufen die Maschinen.\n".. - "\n".. - "Mit einem Forceload-Block kannst du erzwingen\\, dass der Map-Block\\, in dem der Forceload Block steht\\, immer geladen bleibt\\, solange du auf dem Server bist. Wenn alle deine Farmen und Maschinen mit Forceload Blöcken abgedeckt sind\\, ist immer alles am Laufen.\n".. - "\n".. - "Die Map-Blöcke mit ihren Koordinaten sind vordefiniert\\, also bspw. (0\\,0\\,0) bis (15\\,15\\,15)\\, oder (16\\,16\\,16) bis (31\\,31\\,31).\n".. - "Man kann einen Forceload-Block innerhalb eines Map-Blockes verschieben wie man will\\, die Position des Map-Blocks bleibt dabei unverändert. \n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta2", - "", - "ta2_firebox", - "ta2_boiler", - "ta2_cylinder", - "ta2_flywheel", - "ta2_steampipe", - "ta2_driveaxle", - "ta2_generator", - "", - "ta2_winch", - "ta2_weight_chest", - "techage:ta2_clutch_off", - "", - "tube", - "concentrator", - "ta2_pusher", - "ta2_distributor", - "", - "ta2_rinser", - "ta2_grinder", - "ta2_quarry", - "ta2_grinder", - "ta2_gravelsieve", - "", - "ta2_autocrafter", - "ta2_electronicfab", - "", - "ta2_liquidsampler", - "ta2_chest", - "ta2_forceload", - }, - plans = { - "", - "steamengine", - "", - "", - "", - "", - "", - "", - "", - "ta2_storage", - "", - "", - "", - "itemtransport", - "", - "", - "", - "", - "gravelrinser", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta2_EN.lua b/techage/doc/manual_ta2_EN.lua deleted file mode 100644 index af0cfe4..0000000 --- a/techage/doc/manual_ta2_EN.lua +++ /dev/null @@ -1,308 +0,0 @@ -return { - titles = { - "1,TA2: Steam Age", - "2,Steam Engine", - "3,TA2 Firebox", - "3,TA2 Boiler", - "3,TA2 Cylinder", - "3,TA2 Flywheel", - "3,TA2 Steam Pipes", - "3,TA2 Drive Axle / TA2 Gearbox", - "3,TA2 Power Generator", - "2,TA2 energy storage", - "3,TA2 Winch", - "3,TA2 Weight Chest", - "3,TA2 Clutch", - "2,Push and sort items", - "3,TechAge Tube", - "3,Tube Concentrator", - "3,TA2 Pusher", - "3,TA2 Distributor", - "2,Gravel washer", - "3,TA2 Gravel Rinser", - "2,Dig stone\\, grind and sieve", - "3,TA2 Quarry", - "3,TA2 Grinder", - "3,TA2 Gravel Sieve", - "2,Produce Items", - "3,TA2 Autocrafter", - "3,TA2 Electronic Fab", - "2,Other blocks", - "3,TA2 Liquid Sampler", - "3,TA2 Protected Chest", - "3,Techage Forceload Block", - }, - texts = { - "TA2 is about building and operating the first machines for processing ores. Some machines have to be driven via drive axles. To do this\\, you need to build a steam engine and heat it with coal or charcoal.\n".. - "\n".. - "In TA2 there is also a gravel rinser that can be used to wash out rare ores such as Usmium nuggets. You will need these nuggets later for further recipes.\n".. - "\n".. - "\n".. - "\n", - "The steam engine consists of several blocks and must be assembled as shown in the plan on the right. The blocks TA2 fire box\\, TA2 boiler top\\, TA2 boiler bottom\\, TA2 cylinder\\, TA2 flywheel and steam pipes are required.\n".. - "\n".. - "In addition\\, drive axles and gear blocks are required for changing direction. The flywheel must be connected to all machines that have to be driven via the drive axles.\n".. - "\n".. - "Always pay attention to the alignment of all blocks when placing:\n".. - "\n".. - " - Cylinder on the left\\, flywheel on the right\n".. - " - Connect steam pipes where there is a corresponding hole\n".. - " - Drive axle on flywheel only on the right\n".. - " - In all machines\\, the drive axles can be connected on all sides\\, which is not occupied by other functions\\, such as the IN and OUT holes in the grinder and sieve.\n".. - "\n".. - "The boiler must be filled with water. Fill up to 10 buckets of water in the boiler.\n".. - "The fire box must be filled with coal or charcoal.\n".. - "When the water is hot (temperature display at the top)\\, the steam engine can be started on the flywheel.\n".. - "\n".. - "The steam engine has a capacity of 25 ku\\, so it can drive several machines at the same time.\n".. - "\n".. - "\n".. - "\n", - "Part of the steam engine.\n".. - "\n".. - "The fire box must be filled with coal or charcoal. The burning time depends on the power demanded by the steam engine. Coal burns for 32 s and charcoal for 96 s under full load.\n".. - "\n".. - "\n".. - "\n", - "Part of the steam engine. Must be filled with water. This is done by clicking on the boiler with a water bucket. When there is no more water or the temperature drops too low\\, the steam engine switches off. With the steam engine\\, some water is lost as steam with each piston stroke\\, so water has to be refilled regularly.\n".. - "\n".. - "\n".. - "\n", - "Part of the steam engine.\n".. - "\n".. - "\n".. - "\n", - "Drive part of the steam engine. The flywheel must be connected to the machines via drive axles.\n".. - "\n".. - "\n".. - "\n", - "Part of the steam engine. The boiler must be connected to the cylinder via the steam pipes. The steam pipe has no branches\\, the maximum length is 12 m (blocks).\n".. - "\n".. - "\n".. - "\n", - "The drive axles are used to transmit power from the steam engine to other machines. The maximum length of a drive axis is 10 blocks. With TA2 Gearboxes\\, larger distances can be bridged\\, and branches and changes of direction can be realized.\n".. - "\n".. - "\n".. - "\n", - "The TA2 Power Generator is required to operate lamps or other power consumers on a steam engine. The TA2 Power Generator has to be connected to drive axles on one side and then supplies electricity on the other side.\n".. - "\n".. - "If the Power Generator is not supplied with sufficient power\\, it goes into an error state and must be reactivated with a right-click.\n".. - "\n".. - "The Power Generator takes max. 25 ku of axle power and provides on the other side max. 24 ku as electricity. So he consumes one ku for the conversion.\n".. - "\n".. - "\n".. - "\n", - "For larger systems with several steam engines or many driven machines\\, an energy storage system is recommended. The energy storage at TA2 works with position energy. For this purpose\\, ballast (stones\\, gravel\\, sand) is pulled up in a chest with the help of a cable winch. If there is excess energy in the axis network\\, the chest is pulled upwards. If more energy is required in the short term than the steam engine can supply\\, the energy store releases the stored energy again and the weight chest moves down again. \n".. - "The energy storage consists of several blocks and must be assembled as shown in the plan on the right. \n".. - "In order to achieve the maximum storage capacity\\, the chest must be completely filled with weights and the mast including the two gear boxes must be 12 blocks high. Smaller structures are also possible.\n".. - "\n".. - "\n".. - "\n", - "The cable winch must be connected to a gear box and can absorb excess energy and thus pull a weight chest upwards. \n".. - "When assembling the cable winch\\, make sure that the arrow on the top of the block points to the gearbox.\n".. - "The maximum rope length is 10 blocks. \n".. - "\n".. - "\n".. - "\n", - "This chest must be placed under the winch with a distance of up to 10 blocks and filled with cobblestone\\, gravel or sand. If the minimum weight of a stack (99+ items) is reached and there is excess energy\\, the box is automatically connected to the winch via a rope and pulled up. \n".. - "\n".. - "\n".. - "\n", - "With the clutch\\, axles and machines can be separated from the energy storage. This means that the axles after the clutch come to a standstill and machine systems can be rebuilt. When assembling the clutch\\, make sure that the arrow on the top of the block points to the energy storage system.\n".. - "\n".. - "\n".. - "\n", - "In order to transport objects from one processing station to the next\\, pushers and tubes are used. See plan.\n".. - "\n".. - "\n".. - "\n", - "Two machines can be connected with the help of a pusher and a tube. Tubes have no branches. The maximum length is 200 m (blocks).\n".. - "\n".. - "Alternatively\\, tubes can be placed using the Shift key. This allows\\, for example\\, tubes to be laid in parallel without them accidentally connecting.\n".. - "\n".. - "The transport capacity of a tube is unlimited and only limited by the pusher.\n".. - "\n".. - "\n".. - "\n", - "Several tubes can be combined into one tube via the concentrator. The direction in which all items are passed on is marked with an arrow. \n".. - "\n".. - "\n".. - "\n", - "A pusher is able to pull items out of boxes or machines and push them into other boxes or machines. In other words\\, there must be one and exactly one pusher between two blocks with inventory. Multiple pushers in a row are not possible.\n".. - "In the opposite direction\\, however\\, a pusher is permeable for items\\, so that a box can be filled via a tube and also taught.\n".. - "\n".. - "A pusher goes into the \"standby\" state if it has no items to push. If the output is blocked or the recipient's inventory is full\\, the pusher goes into the \"blocked\" state. The pusher automatically comes out of both states after a few seconds if the situation has changed.\n".. - "\n".. - "The processing power of a TA2 pusher is 2 items every 2 s.\n".. - "\n".. - "\n".. - "\n", - "The distributor is able to transport the items from his inventory sorted in up to four directions. To do this\\, the distributor must be configured accordingly.\n".. - "\n".. - "The distributor has a menu with 4 filters with different colors\\, corresponding to the 4 outputs. If an output is to be used\\, the corresponding filter must be activated via the \"on\" checkbox. All items that are configured for this filter are output via the assigned output. If a filter is activated without items being configured\\, we are talking about an \"unconfigured\"\\, open output.\n".. - "\n".. - "*Attention: The distributor is also a pusher at its output sides. Therefore\\, never pull items out of the distributor with a pusher!*\n".. - "\n".. - "There are two operating modes for a non-configured output:\n".. - "\n".. - "1) Output all items that cannot be output to any other exit\\, even if they are blocked.\n".. - "\n".. - "2) Only output the items that have not been configured for any other filter.\n".. - "\n".. - "In the first case\\, all items are always forwarded and the distributor does not run full. In the second case\\, items are held back and the distributor can run full and then block.\n".. - "\n".. - "The operating mode can be set using the \"blocking mode\" checkbox.\n".. - "\n".. - "The processing power of a TA2 distributor is 4 items every 2 s\\, whereby the distributor tries to distribute the 4 items to the open outputs.\n".. - "\n".. - "If the same item is configured multiple times in one filter\\, the long term distribution ratio will be influenced accordingly.\n".. - "\n".. - "Please note that the distribution is a probabilistic process. This means that the distribution rations won't be matched exactly\\, but only in the long term.\n".. - "\n".. - "The maximum stack size in the filters is 12\\; in total\\, not more than 36 items can be configured.\n".. - "\n".. - "\n".. - "\n", - "The gravel washer is a more complex machine with the goal of washing Usmium nuggets out of sieved gravel. A TA2 rinser with axis drive\\, a hopper\\, a chest and running water are required for the installation.\n".. - "\n".. - "Structure from left to right (see also plan):\n".. - "\n".. - " - A dirt block\\, on top of it the water source\\, surrounded on 3 sides by e.g. glass blocks\n".. - " - next to it the gravel rinser\\, if necessary with tube connections for the gravel delivery and removal\n".. - " - then the hopper with chest\n".. - "\n".. - "The whole thing is surrounded by further glass blocks\\, so that the water flows over the gravel rinser and the hopper and rinsed-out nuggets can be collected again by the hopper.\n".. - "\n".. - "\n".. - "\n", - "The gravel washer is able to rinse out the Usmium and copper ores from gravel that has already been sieved\\, provided that this is flushed with water.\n".. - "\n".. - "Whether the Gravel Rinser works correctly can be tested with sticks if these are placed in the inventory of the Gravel Rinser. These must be rinsed out individually and caught by the hopper.\n".. - "\n".. - "The processing power is one gravel item every 2 s. The gravel washer needs 3 ku of energy.\n".. - "\n".. - "\n".. - "\n", - "Crushing\\, grinding and sieving of cobblestone is used to extract ores. Sieved gravel can also be used for other purposes. Quarry\\, grinder and sieve must be driven and thus installed near a steam engine.\n".. - "\n".. - "\n".. - "\n", - "The quarry is used to remove stones and other materials from the underground. The quarry digs a 5x5 block hole. The depth is adjustable.\n".. - "The processing power is one block every 4 s. The quarry needs 10 ku of energy. The maximum depth is 20 meters. For greater depths see TA3 / TA4.\n".. - "\n".. - "\n".. - "\n", - "The grinder is able to grind various rocks\\, but also wood and other items.\n".. - "The processing power is one item every 4 s. The grinder needs 4 ku of energy.\n".. - "\n".. - "\n".. - "\n", - "The gravel sieve is able to sieve gravel to extract ores. The result is partially \"sieved gravel\"\\, which cannot be sieved again.\n".. - "The processing power is one item every 4 s. The gravel sieve requires 3 ku of energy.\n".. - "\n".. - "\n".. - "\n", - "TA2 machines can not only extract ores\\, but also produce objects.\n".. - "\n", - "The autocrafter is used for the automatic production of goods. Everything that the player can produce via the \"Crafting Grid\" can also be done by the autocrafter. To do this\\, the recipe must be entered in the menu of the autocrafter and the necessary ingredients added.\n".. - "\n".. - "Ingredients and manufactured goods can be transported in and out of the block via tubes and pushers.\n".. - "\n".. - "The processing power is one item every 4 s. The autocrafter requires 4 ku of energy.\n".. - "\n".. - "\n".. - "\n", - "The electronic fab is a special machine and can only be used for the production of vacuum tubes. Vacuum tubes are required for TA3 machines and blocks.\n".. - "\n".. - "The processing power is one vacuum tube every 6 s. The electronic fab requires 8 ku of energy.\n".. - "\n".. - "\n".. - "\n", - "", - "Some recipes require water. So that these recipes can also be processed automatically with the autocrafter\\, water must be provided in buckets. The liquid sampler is used for this. He needs empty buckets and has to be put in the water.\n".. - "\n".. - "The processing capacity is one water bucket every 8 s. The liquid sampler requires 3 ku of energy.\n".. - "\n".. - "\n".. - "\n", - "The protected chest can only be used by players who can build at this location\\, i.e. who have protection rights. It does not matter who sets the chest.\n".. - "\n".. - "\n".. - "\n", - "Minetest divides the map into so-called map blocks. These are cubes with an edge length of 16x16x16 blocks. Such a map block is always loaded completely by the server\\, but only the blocks around a player are loaded (approx. 2-3 blocks in all directions). In the player's direction of view\\, there are also more map blocks. Only this part of the world is active and only here do plants and trees grow or the machines run.\n".. - "\n".. - "With a forceload block you can force the map block in which the forceload block is located to remain loaded as long as you are on the server. When all your farms and machines are covered with Forceload blocks\\, everything is always running.\n".. - "\n".. - "The map blocks with their coordinates are predefined\\, e.g. (0\\,0\\,0) to (15\\,15\\,15)\\, or (16\\,16\\,16) to (31\\,31\\,31).\n".. - "You can move a forceload block within a map block as you like\\, the position of the map block remains unchanged.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta2", - "", - "ta2_firebox", - "ta2_boiler", - "ta2_cylinder", - "ta2_flywheel", - "ta2_steampipe", - "ta2_driveaxle", - "ta2_generator", - "", - "ta2_winch", - "ta2_weight_chest", - "techage:ta2_clutch_off", - "", - "tube", - "concentrator", - "ta2_pusher", - "ta2_distributor", - "", - "ta2_rinser", - "ta2_grinder", - "ta2_quarry", - "ta2_grinder", - "ta2_gravelsieve", - "", - "ta2_autocrafter", - "ta2_electronicfab", - "", - "ta2_liquidsampler", - "ta2_chest", - "ta2_forceload", - }, - plans = { - "", - "steamengine", - "", - "", - "", - "", - "", - "", - "", - "ta2_storage", - "", - "", - "", - "itemtransport", - "", - "", - "", - "", - "gravelrinser", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta2_RU.lua b/techage/doc/manual_ta2_RU.lua deleted file mode 100644 index 0de82d5..0000000 --- a/techage/doc/manual_ta2_RU.lua +++ /dev/null @@ -1,308 +0,0 @@ -return { - titles = { - "1,TA2: Эпоха пара", - "2,Паровой двигатель", - "3,TA2 Топка", - "3,TA2 Котел", - "3,TA2 Поршень", - "3,TA2 Маховик", - "3,TA2 Паровые трубы", - "3,TA2 Приводная ось / TA2 редуктор", - "3,TA2 Энергогенератор", - "2,TA2 Энергохранилище", - "3,TA2 Лебедка", - "3,TA2 Ящик-груз", - "3,TA2 Муфта", - "2,Двигаем и сортируем предметы", - "3,ТА труба", - "3,Трубосборник", - "3,TA2 Толкатель", - "3,TA2 Распределитель", - "2,Промывание гравия", - "3,TA2 Гравийная мойка", - "2,Копаем камень\\, дробим и просеиваем", - "3,TA2 Карьер", - "3,TA2 Дробилка", - "3,TA2 Гравийное сито", - "2,Производим предметы", - "3,TA2 Автокрафтер", - "3,TA2 Электронная фабрика", - "2,Другие блоки", - "3,TA2 Заборник жидкостей", - "3,TA2 Защищенный сундук", - "3,ТА Загрузочный блок", - }, - texts = { - "TA2 - про сооружение и запуск первых рудоперерабатывающих машин. Некоторые машины приводятся в движение приводными осями. Для этого\\, нужно построить паровой двигатель и разогреть его углем или древесным углем.\n".. - "\n".. - "В TA2 ещё есть гравийная мойка, которая применяется для намывания редких руд, в частности усмиевых самородков. Эти самородки понадобятся в будущих рецептах.\n".. - "\n".. - "\n".. - "\n", - "Паровой двигатель состоит из нескольких блоков и должен быть собран так, как показано на чертеже справа. Понадобятся блоки ТА2 Топка\\, TA2 котёл навершие\\, TA2 котёл основание\\, TA2 поршень\\, TA2 маховик и паровые трубы.\n".. - "\n".. - "Кроме того\\, приводные оси и редуктор(ы) необходимы для изменения направления. Маховик должен быть соединен со всеми машинами, которые требуют привода от осей.\n".. - "\n".. - "Всегда обращайте внимание на направление ориентации блока, который размещаете:\n".. - "\n".. - " - Поршень слева\\, маховик справа\n".. - " - Подключайте паровые трубы в местах, где есть соответствующее отверстие\n".. - " - Приводная ось к маховику только справа\n".. - " - Для всех машин\\, приводная ось может быть присоединена к любой стороне\\, не занятой другой функцией\\, такой как отверстия ВХОД (IN) и ВЫХОД (OUT) у дробилки и сита.\n".. - "\n".. - "Котёл должен быть заполнен водой. Наливайте до 10 вёдер.\n".. - "Топка должна быть заполнена углём или древесным углём.\n".. - "Когда вода достаточно нагрелась (градусник наверху)\\, паровой двигатель начнет вращать маховик.\n".. - "\n".. - "Мощность парового двигателя 25 кю (ku, kilo unit, условных килоединиц)\\, он может питать несколько машин одновременно.\n".. - "\n".. - "\n".. - "\n", - "Часть парового двигателя.\n".. - "\n".. - "Топка должна быть заполнена углём или древесным углём. Время горения зависит от мощности, вырабатываемой паровым двигателем. Уголь горит 32 с, древесный уголь 86 с при полной нагрузке.\n".. - "\n".. - "\n".. - "\n", - "Часть парового двигателя. Должен быть заполнен водой. Кликать на котёл ведром с водой. Если вода закончится или температура упадёт слишком низко\\, паровой двигатель отключится.\n".. - "\n".. - "\n".. - "\n", - "Часть парового двигателя.\n".. - "\n".. - "\n".. - "\n", - "Приводная часть парового двигателя. Маховик должен быть соединен с машинами через приводные оси.\n".. - "\n".. - "\n".. - "\n", - "Часть парового двигателя. Котел должен быть соединен с поршнем посредством паровых труб. Паровая труба не может иметь ответвлений\\, максимальная длина 12 м (блоков).\n".. - "\n".. - "\n".. - "\n", - "Приводные оси нужны для передачи мощности от парового двигателя к остальным машинам. Максимальная длина приводной оси 10 блоков. С помощью ТА2 редукторов\\, можно увеличивать расстояния\\, а также организовать ветвления и повороты.\n".. - "\n".. - "\n".. - "\n", - "TA2 Электрогенератор требуется для активации ламп или других потребителей на паровом двигателе. ТА2 Электрогенератор должен быть присоединен к приводной оси с одной стороны, тогда он выдаёт электричество с другой стороны.\n".. - "\n".. - "Если Электрогенератор не получает достаточно мощности\\, он переходит в состояние ошибки и должен быть повторно активирован правым кликом.\n".. - "\n".. - "Электрогенератор потребляет максимум 25 кю с приводной оси и выдаёт на другой стороне максимум 24 кю в виде электричества. Одна кю потребляется на преобразование.\n".. - "\n".. - "\n".. - "\n", - "Для более крупных систем с несколькими паровыми двигателями или множеством машин\\, рекомендуется энергохранилище. Энергохранилище в ТА2 работает от позиционной энергии. Для этого\\, балласт (камни\\, гравий\\, песок) подтягивается вверх в сундуке кабельной лебёдкой. Если в осевой сети избыток энергии\\, сундук тянется вверх. Если потребление энергии превышает возможости парового двигателя\\, хранилище выпускает энергию, и грузовой сундук движется вниз. \n".. - "Энергохранилище состоит из нескольких блоков и собирается как показано на чертеже справа. \n".. - "Чтобы получить максимальную ёмкость хранения\\, сундук должен быть польностью заполнен грузом, а мачта вместе с двумя редукторами должна быть 12 блоков в высоту. Меньшие конструкции допускаются.\n".. - "\n".. - "\n".. - "\n", - "Лебедка должна быть подключена к редуктору и может поглощать избыточную энергию и, таким образом, подтягивать ящик-груз вверх. \n".. - "При сборке лебедки\\ убедитесь, что стрелка в верхней части блока указывает на редуктор.\n".. - "Максимальная длина веревки составляет 10 блоков. \n".. - "\n".. - "\n".. - "\n", - "Этот сундук должен быть размещён под лебедкой на расстоянии до 10 блоков и заполнен булыжником,\\, гравием или песком. Если минимальный вес стака (99+ штук) достигнут и имеется избыточная энергия\\, коробка автоматически присоединится к лебедке тросом и будет утянута вверх. \n".. - "\n".. - "\n".. - "\n", - "С помощью муфты\\ можно отделить оси и машины от накопителя энергии. Это означает, что оси после сцепления останавливаются, а системы машин могут быть восстановлены. При сборке сцепления\\ убедитесь, что стрелка на верхней части блока направлена на накопитель энергии.\n".. - "\n".. - "\n".. - "\n", - "Для транспортировки предметов от одного пункта переработки к другому\\, использудтся толкатели и трубы. См. план.\n".. - "\n".. - "\n".. - "\n", - "Две машины можно соединить толкателем и трубой. У труб нет ответвлений. Максимальная длина 200 м (блоков).\n".. - "\n".. - "Альтернативно\\, трубы можно размещать с применением клавиши Shift. Это позволитs\\, например\\, уложить трубы параллельно без их случайного соединения.\n".. - "\n".. - "Пропускная способность трубы неограниченна, ограничение имеет только толкатель.\n".. - "\n".. - "\n".. - "\n", - "Несколько труб можно собрать в одну посредством концентратора. Стрелкой обозначено направление, в котором будут передаваться предметы.\n".. - "\n".. - "\n".. - "\n", - "Толкатель способен вынимать предметы из сундуков или из машине и толкать их в другие сундуки или машины. Иными словами\\, между двумя блоками с инвентарем должен один и только один толкатель. Несколько толкателей в ряд поставить нельзя.\n".. - "В обратном направлении\\, однако\\, толькатель проницаем для предметов\\, так что сундук может заполняться через трубу и в то же время обучен (чё?).\n".. - "\n".. - "Толкатель переходит в режим \"standby\" ожидания, если нет предметов для толкания. Если выход заблокирован или инвентарь получателя переполнен\\, толкатель переходит в состояние \"blocked\" заблокирован. Толкатель автоматически выходит из обоих состояний через несколько секунд после изменения обстановки.\n".. - "\n".. - "Перерабатывающая мощность ТА2 толкателя составляет 2 предмета каждые 2 с.\n".. - "\n".. - "\n".. - "\n", - "Распределитель может передавать предметы из своего инвентаря, сортируя их по направлениям, до 4 направлений. Для этого\\, распределитель нужно соответственно сконфигурировать.\n".. - "\n".. - "У распределителя в меню 4 фильтра разных цветов.\\, соответствующих 4 выходам. Если выход будет использоваться\\, соответствующий фильтр нужно активировать галочкой \"on\". Все предметы, на которые этот фильтр настроен, двинутся через начначенный выход. Если фильтр активирован без назначенных предметов\\, мы говорим о несконфигурированном \"unconfigured\"\\, открытом выходе.\n".. - "\n".. - "*Внимание: Распределитель является толкателем на своих выходных сторонах. Поэтому\\, никогда не вытягивайте предметы из распределителя толкателем!*\n".. - "\n".. - "Для несконфигурированного выхода есть два режима работы:\n".. - "\n".. - "1) Выпускать все предметы, которые не могут выйти через другие стороны\\, даже если они заблокированы.\n".. - "\n".. - "2) Выпускать только те предметы, которые не были сконфигурированы для какого-либо из остальных фильтров.\n".. - "\n".. - "В первом случае\\, все предметы всегда пересылаются и распределитель не наполняется. Во втором случае\\, предметы удерживаются и распределитель может переполниться и заблокироваться.\n".. - "\n".. - "Операционный режим устанавливается галочкой в \"blocking mode\".\n".. - "\n".. - "Производительность ТА2 распределителя составляет 4 штуки каждые 2 секунды\\, он пытается распределить 4 штуки в открытые выходы.\n".. - "\n".. - "Если один предмет сконфигурирован несколько раз в один фильтр\\, то соответственно увеличится долгосрочный темп распределения.\n".. - "\n".. - "Обратите вннимание: распределение это вероятностный процесс. Это значит, что темп распределения соблюдается не в точности\\, но сохраняется при длительной работе.\n".. - "\n".. - "Максимальный размер стека в фильтре - 12\\; в сумме\\, можно сконфигурировать не более 36 позиций.\n".. - "\n".. - "\n".. - "\n", - "Гравийная мойка это достаточно сложная машина предназначенная для вымывания усмиевых самородоков из просеянного гравия. ТА2 мойка с осевым приводом\\, хопром\\, сундуком и текущей водой требуются для запуска.\n".. - "\n".. - "Структура слева направо (также см. план):\n".. - "\n".. - " - Блок земли\\, сверху него источник воды\\, с трех сторон окружен блоками, например стекла\n".. - " - следом гравийная мойка\\, по желанию с трубными соединениями для поступления и удаления гравия\n".. - " - затем хопер с сундуком\n".. - "\n".. - "Вся конструкция окружена блоками стекла\\, так что вода течет над мойкой и хопром и вымытые самородки собираются в хопер.\n".. - "\n".. - "\n".. - "\n", - "Гравийнай мойка вымывает усмий и медь из гравия который был ранее просеян\\, предполагая что это обеспечивается водными потоком.\n".. - "\n".. - "Правильную работоспособность мойки можно проверить палками, помещенными в инвентарь мойки. Они должны поочередно вымываться и собираться в хопер.\n".. - "\n".. - "Производительность гравийной мойки 1 гравий каждые 2 секунды. Потребление энергии 2 ku.\n".. - "\n".. - "\n".. - "\n", - "Дробление\\, перемалывание и просеивание булыжника применяется для извлечения руд. Просеянный гравий также может быть использован в других процессах. Карьер\\, дробилка и сито требуют привода и поэтому ставятся поблизости от парового двигателя.\n".. - "\n".. - "\n".. - "\n", - "Карьер используют для извлечения камней и иных материалов из-под земли. Карьер копает шахту размером 5х5 блоков. Глубину можно настраивать.\n".. - "Производительность карьера 1 блок каждые 4 секунды. Потребляет 10 ku энергии. Максимальная глубина 20 метров. Для больших глубин переходите к ТА3 / ТА4.\n".. - "\n".. - "\n".. - "\n", - "Дробилка может дробить различные породы\\, а также дерево и некторые другие предметы.\n".. - "Производительность 1 штука каждые 4 секунды. Потребление 4 ku.\n".. - "\n".. - "\n".. - "\n", - "Гравийное сито может просеивать гравий для извлечения руд. На выходе также образуется просеянный гравий \"sieved gravel\"\\, который можно просеивать повторно.\n".. - "Производительность гравийного сита 1 штука каждые 4 секунды. Потребление 3 ku.\n".. - "\n".. - "\n".. - "\n", - "ТА2 машины могут не только извлекать руды\\, но также и производить объекты.\n".. - "\n", - "Автокрафтер используется для автоматического производства изделий. Все что игрок может создать на решетке крафта \"Crafting Grid\" может быть выполнено автокрафтером. Для этого\\, рецепт нужно ввести в меню автокрафтера и вложить нужные ингредиенты.\n".. - "\n".. - "Ингредиенты и произведенные изделия можно транспортировать внутрь и наружу автокрафтера через трубы и толкатели.\n".. - "\n".. - "Производительность автокрафтера 1 предмет каждые 4 секунды. Потребление 4 ku.\n".. - "\n".. - "\n".. - "\n", - "Электронная фабрика это отдельная машина которая используется только для производства радиоламп. Радиолампы требуются для ТА3 машин и блоков.\n".. - "\n".. - "Производительность электронной фабрики 1 радиолампа каждые 6 секунд. Потребление 8 ku.\n".. - "\n".. - "\n".. - "\n", - "", - "Некоторые рецепты требуют воды. Такие рецепты также могут быть обработаны автокрафтером\\, вода должна поступать в ведрах. Для этого нужен водозаборник. В него нужно поместить пустые ведра, а его - в воду.\n".. - "\n".. - "Производительность водозаборника 1 ведро каждые 8 секунд. Потребление 3 ku.\n".. - "\n".. - "\n".. - "\n", - "Защищенный сундук могут использовать только игроки с правами строительства на этой территории\\, т.е. с правами привата. Неважно, кто поставил сундук.\n".. - "\n".. - "\n".. - "\n", - "Майнтест делит карту на блоки - так называемые чанки. Это кубы с гранью 16 блоков. Такой чанк всегда загружается сервером целиком\\, но загружаются только блоки вокруг игрока, примерно 2-3 чанка во всех направлениях. В направлении взгляда игрока\\, загружается больше чанков. Только эта часть мира активна и только в ней растения растут и машины работают.\n".. - "\n".. - "Блоком принудительной загрузки (БПЗ) вы можете заставить чанк, в котором размещен такой блок, оставаться активным все время пока вы находитесь на сервере. Если все ваши фермы и фабрики покрыты БлокамиПЗ\\, всё работает непрерывно.\n".. - "\n".. - "Блоки карты - чанки предопределены в своих координатах\\, например (0\\,0\\,0) до (15\\,15\\,15)\\, или (16\\,16\\,16) до (31\\,31\\,31).\n".. - "БлокПЗ можно ставить в любом месте чанка\\, тогда как положение чанка всегда неизменно.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta2", - "", - "ta2_firebox", - "ta2_boiler", - "ta2_cylinder", - "ta2_flywheel", - "ta2_steampipe", - "ta2_driveaxle", - "ta2_generator", - "", - "ta2_winch", - "ta2_weight_chest", - "techage:ta2_clutch_off", - "", - "tube", - "concentrator", - "ta2_pusher", - "ta2_distributor", - "", - "ta2_rinser", - "ta2_grinder", - "ta2_quarry", - "ta2_grinder", - "ta2_gravelsieve", - "", - "ta2_autocrafter", - "ta2_electronicfab", - "", - "ta2_liquidsampler", - "ta2_chest", - "ta2_forceload", - }, - plans = { - "", - "steamengine", - "", - "", - "", - "", - "", - "", - "", - "ta2_storage", - "", - "", - "", - "itemtransport", - "", - "", - "", - "", - "gravelrinser", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta2_pt-BR.lua b/techage/doc/manual_ta2_pt-BR.lua deleted file mode 100644 index 5db2a6e..0000000 --- a/techage/doc/manual_ta2_pt-BR.lua +++ /dev/null @@ -1,306 +0,0 @@ -return { - titles = { - "1,TA2: Era a Vapor", - "2,Máquina a Vapor", - "3,Caixa de Fogo(Firebox) TA2", - "3,TA2 Caldeira(Boiler)", - "3,TA2 Cilindro(Cylinder)", - "3,TA2 Volante(Flywheel)", - "3,TA2 Tubos de Vapor(Steam pipes)", - "3,TA2 Eixo de Transmissão(Drive axle) TA2 / Caixa de Engrenagem(Gearbox)", - "3,TA2 Gerador de Energia", - "2,TA2 Armazenamento de Energia", - "3,TA2 Guincho", - "3,TA2 Baú de Pesos", - "3,TA2 Embreagem", - "2,Empurrar e classificar itens", - "3,Tubo TechAge", - "3,Tubo Concentrador", - "3,TA2 Pusher", - "3,TA2 Distributor(Distribuidor)", - "2,Gravel washer(Lavador de cascalho)", - "3,TA2 Gravel Rinser(Enxaguatório de cascalho)", - "2,Escavar pedra\\, moer e peneirar", - "3,TA2 Quarry(Pedreira)", - "3,TA2 Grinder(Moedor)", - "3,TA2 Gravel Sieve(Peneira de cascalho)", - "2,Produzindo Itens", - "3,TA2 Autocrafter", - "3,TA2 Electronic Fab", - "2,Outros Blocos", - "3,TA2 Liquid Sampler", - "3,TA2 Protected Chest", - "3,Techage Forceload Block", - }, - texts = { - "TA2 trata-se de construir e operar as primeiras máquinas para processamento de minérios. Algumas máquinas precisam ser acionadas por eixos de transmissão. Para fazer isso\\, você precisa construir uma máquina a vapor e aquecê-la com carvão ou carvão vegetal.\n".. - "\n".. - "No TA2\\, há também um lavador de cascalho que pode ser usado para lavar minérios raros\\, como pepitas de Usmium. Você precisará dessas pepitas posteriormente para receitas adicionais.\n".. - "\n".. - "\n".. - "\n", - "A máquina a vapor é composta por vários blocos e deve ser montada conforme mostrado no plano à direita. São necessários os blocos da Caixa de Fogo(Firebox) TA2\\, parte superior da Caldeira(Boiler) TA2\\, parte inferior da Caldeira(Boiler) TA2\\, Cilindro(Cylinder) TA2\\, Volante(Flywheel) TA2 e Tubos de Vapor(steam piper) TA2.\n".. - "\n".. - "Além disso\\, são necessários Eixos de Transmissão(drive axles) e blocos de Engrenagem(gear) para mudança de direção. O Volante deve ser conectado a todas as máquinas que precisam ser acionadas pelos Eixos de Transmissão.\n".. - "\n".. - "Sempre preste atenção ao alinhamento de todos os blocos ao colocá-los:\n".. - "\n".. - " - Cilindro à esquerda\\, volante à direita\n".. - " - Conectar os tubos de vapor onde há um furo correspondente\n".. - " - Eixo de transmissão no volante apenas à direita\n".. - " - Em todas as máquinas\\, os eixos de transmissão podem ser conectados em todos os lados que não estejam ocupados por outras funções\\, como os furos de ENTRADA(IN) e SAÍDA(OUTPUT) no Moedor(grinder) e na Peneira(sieve).\n".. - "\n".. - "A Caldeira deve ser preenchida com água. Preencha até 10 baldes de água na caldeira.\n".. - "A Caixa de fogo deve ser preenchida com carvão ou carvão vegetal.\n".. - "Quando a água estiver quente (indicador de temperatura no topo)\\, a máquina a vapor pode ser iniciada no Volante.\n".. - "\n".. - "A máquina a vapor tem uma capacidade de 25ku\\, podendo acionar várias máquinas ao mesmo tempo.\n".. - "\n".. - "\n".. - "\n", - "Parte da máquina a vapor.\n".. - "\n".. - "A Caixa de fogo deve ser preenchida com carvão ou carvão vegetal. O tempo de queima depende da potência exigida pela máquina a vapor. O carvão queima por 32s e o carvão vegetal por 96s em carga máxima.\n".. - "\n".. - "\n".. - "\n", - "Parte da máquina a vapor. Deve ser preenchida com água. Isso é feito clicando na caldeira com um balde de água. Quando não há mais água ou a temperatura cai muito\\, a máquina a vapor desliga. Com a máquina a vapor\\, parte da água é perdida como vapor a cada curso do pistão\\, então a água deve ser reabastecida regularmente.\n".. - "\n".. - "\n".. - "\n", - "Parte da máquina a vapor.\n".. - "\n".. - "\n".. - "\n", - "Parte motora da máquina a vapor. O Volante deve ser conectado às máquinas por meio de eixos de transmissão.\n".. - "\n".. - "\n".. - "\n", - "Parte da máquina a vapor. A caldeira deve ser conectada ao cilindro por meio dos Tubos de vapor. O tubo de vapor não tem ramificações\\, o comprimento máximo é 12 m (blocos).\n".. - "\n".. - "\n".. - "\n", - "Os Eixos de transmissão são usados para transmitir energia da máquina a vapor para outras máquinas. O comprimento máximo de um eixo de transmissão é 10 blocos. Com as Caixas de Engrenagem TA2\\, é possível vencer distâncias maiores\\, e também realizar ramificações e mudanças de direção.\n".. - "\n".. - "\n".. - "\n", - "O Gerador de Energia TA2 é necessário para operar lâmpadas ou outros consumidores de energia em uma Máquina a vapor. O Gerador de Energia TA2 deve ser conectado aos eixos de transmissão de um lado e\\, em seguida\\, fornece eletricidade do outro lado.\n".. - "\n".. - "Se o Gerador de Energia não receber energia suficiente\\, ele entra em estado de erro e deve ser reativado com um clique direito.\n".. - "\n".. - "O Gerador de Energia consome no máximo 25ku de potência do eixo e fornece no máximo 24ku como eletricidade do outro lado. Portanto\\, ele consome um ku para a conversão.\n".. - "\n".. - "\n".. - "\n", - "Para sistemas maiores com várias máquinas a vapor ou muitas máquinas acionadas\\, é recomendado um sistema de armazenamento de energia. O armazenamento de energia no TA2 funciona com energia potencial. Para isso\\, o peso (pedras\\, cascalho\\, areia) é puxado para cima em um baú com a ajuda de um guincho. Se houver excesso de energia na rede de eixos\\, o baú é puxado para cima. Se mais energia for necessária a curto prazo do que a máquina a vapor pode fornecer\\, o armazenamento de energia libera a energia armazenada novamente e o baú de pesos desce novamente.\n".. - "O armazenamento de energia é composto por vários blocos e deve ser montado conforme mostrado no plano à direita. \n".. - "Para alcançar a capacidade máxima de armazenamento\\, o baú deve ser completamente preenchido com pesos e o mastro\\, incluindo as duas caixas de engrenagens\\, deve ter 12 blocos de altura. Estruturas menores também são possíveis.\n".. - "\n".. - "\n".. - "\n", - "O guincho deve ser conectado a uma caixa de engrenagens e pode absorver energia excessiva e assim puxar um baú de pesos para cima. \n".. - "Ao montar o guincho\\, certifique-se de que a seta no topo do bloco aponte para a caixa de engrenagens.\n".. - "O comprimento máximo da corda é 10 blocos. \n".. - "\n".. - "\n".. - "\n", - "Este baú deve ser colocado sob o guincho com uma distância de até 10 blocos e preenchido com pedras\\, cascalho ou areia. Se o peso mínimo de uma pilha (99+ itens)\n".. - "\n", - "Com a embreagem\\, eixos e máquinas podem ser separados do armazenamento de energia. Isso significa que os eixos após a embreagem param e sistemas de máquinas podem ser reconstruídos. Ao montar a embreagem\\, certifique-se de que a seta na parte superior do bloco aponta para o sistema de armazenamento de energia.\n".. - "\n".. - "\n".. - "\n", - "Para transportar objetos de uma estação de processamento para a próxima\\, são usados pushers e tubos. Veja o plano.\n".. - "\n".. - "\n".. - "\n", - "Duas máquinas podem ser conectadas com a ajuda de um pusher e um tubo. Tubos não têm ramificações. O comprimento máximo é 200m (blocos).\n".. - "\n".. - "Alternativamente\\, os tubos podem ser colocados usando a tecla Shift. Isso permite\\, por exemplo\\, que tubos sejam colocados em paralelo sem que eles se conectem acidentalmente.\n".. - "\n".. - "A capacidade de transporte de um tubo é ilimitada e é limitada apenas pelo pusher.\n".. - "\n".. - "\n".. - "\n", - "Vários tubos podem ser combinados em um único tubo via concentrador. A direção na qual todos os itens são passados é marcada com uma seta. \n".. - "\n".. - "\n".. - "\n", - "Um pusher(empurrador) é capaz de puxar itens de caixas ou máquinas e empurrá-los para outras caixas ou máquinas. Em outras palavras\\, deve haver um e apenas um pusher entre dois blocos com inventário. Múltiplos pushers em sequência não são possíveis.\n".. - "No entanto\\, na direção oposta\\, um pusher é permeável a itens\\, de modo que uma caixa pode ser preenchida via tubo e também ensinada.\n".. - "\n".. - "Um pusher entra no estado \"standby\" se não tiver itens para empurrar. Se a saída estiver bloqueada ou o inventário do destinatário estiver cheio\\, o pusher entra no estado \"bloqueado\". O pusher automaticamente sai de ambos os estados após alguns segundos se a situação mudar.\n".. - "\n".. - "A capacidade de processamento de um pusher TA2 é de 2 itens a cada 2 s.\n".. - "\n".. - "\n".. - "\n", - "O distribuidor é capaz de transportar os itens de seu inventário ordenados em até quatro direções. Para fazer isso\\, o distribuidor deve ser configurado conforme necessário.\n".. - "\n".. - "O distribuidor possui um menu com 4 filtros com cores diferentes\\, correspondendo às 4 saídas. Se uma saída for usada\\, o filtro correspondente deve ser ativado via caixa de seleção \"ligado\". Todos os itens configurados para este filtro são enviados através da saída designada. Se um filtro for ativado sem que itens sejam configurados\\, estamos falando de uma saída \"não configurada\"\\, aberta.\n".. - "\n".. - "*Atenção: O distribuidor também é um pusher em suas saídas. Portanto\\, nunca puxe itens do distribuidor com um pusher!*\n".. - "\n".. - "Existem dois modos de operação para uma saída não configurada:\n".. - "\n".. - "1) Enviar todos os itens que não podem ser enviados para nenhuma outra saída\\, mesmo que estejam bloqueados.\n".. - "\n".. - "2) Enviar apenas os itens que não foram configurados para nenhum outro filtro.\n".. - "\n".. - "No primeiro caso\\, todos os itens são sempre encaminhados e o distribuidor não fica cheio. No segundo caso\\, os itens são retidos e o distribuidor pode ficar cheio e\\, em seguida\\, bloquear.\n".. - "\n".. - "O modo de operação pode ser definido usando a caixa de seleção \"modo de bloqueio\".\n".. - "\n".. - "A capacidade de processamento de um distribuidor TA2 é de 4 itens a cada 2s\\, onde o distribuidor tenta distribuir os 4 itens para as saídas abertas.\n".. - "\n".. - "Se o mesmo item for configurado várias vezes em um filtro\\, a proporção de distribuição a longo prazo será influenciada de acordo.\n".. - "\n".. - "Observe que a distribuição é um processo probabilístico. Isso significa que as proporções de distribuição não serão correspondidas exatamente\\, mas apenas a longo prazo.\n".. - "\n".. - "O tamanho máximo de pilha nos filtros é 12\\; no total\\, não mais que 36 itens podem ser configurados.\n".. - "\n".. - "\n".. - "\n", - "O lavador de cascalho é uma máquina mais complexa com o objetivo de lavar pepitas de Usmium a partir de cascalho peneirado. Um enxaguatório TA2 com eixo de acionamento\\, um funil\\, um baú e água corrente são necessários para a instalação.\n".. - "\n".. - "Estrutura da esquerda para a direita (veja também o plano):\n".. - "\n".. - " - Um bloco de terra\\, sobre ele a fonte de água\\, cercada em 3 lados\\, por exemplo\\, por blocos de vidro\n".. - " - Ao lado\\, o enxaguatório de cascalho\\, se necessário com conexões de tubulação para a entrega e remoção de cascalho\n".. - " - Em seguida\\, o funil com baú\n".. - "\n".. - "O conjunto é cercado por mais blocos de vidro\\, para que a água flua sobre o enxaguatório de cascalho e o funil\\, e as pepitas lavadas possam ser coletadas novamente pelo funil.\n".. - "\n".. - "\n".. - "\n", - "O lavador de cascalho é capaz de enxaguar os minérios de Usmium e cobre do cascalho que já foi peneirado\\, desde que seja lavado com água.\n".. - "\n".. - "Se o Enxaguatório de Cascalho funciona corretamente\\, pode ser testado com pedaços de madeira\\, se estes forem colocados no inventário do Enxaguatório de Cascalho. Eles devem ser enxaguados individualmente e recolhidos pelo funil.\n".. - "\n".. - "A capacidade de processamento é de um item de cascalho a cada 2s. O lavador de cascalho precisa de 3 ku de energia.\n".. - "\n".. - "\n".. - "\n", - "Esmagar\\, moer e peneirar pedregulhos é usado para extrair minérios. O cascalho peneirado também pode ser usado para outros fins. A pedreira\\, moedor e peneira devem ser acionados e\\, portanto\\, instalados perto de uma máquina a vapor.\n".. - "\n".. - "\n".. - "\n", - "A pedreira é usada para remover pedras e outros materiais do subsolo. A pedreira escava um buraco de 5x5 blocos. A profundidade é ajustável.\n".. - "A capacidade de processamento é de um bloco a cada 4s. A pedreira precisa de 10 ku de energia. A profundidade máxima é de 20 metros. Para maiores profundidades\\, consulte TA3 / TA4.\n".. - "\n".. - "\n".. - "\n", - "O moedor é capaz de moer várias rochas\\, mas também madeira e outros itens.\n".. - "A capacidade de processamento é de um item a cada 4s. O moedor precisa de 4 ku de energia.\n".. - "\n".. - "\n".. - "\n", - "A peneira de cascalho é capaz de peneirar cascalho para extrair minérios. O resultado é parcialmente \"sieved gravel\"\\, que não pode ser peneirado novamente.\n".. - "A capacidade de processamento é de um item a cada 4s. A peneira de cascalho requer 3 ku de energia.\n".. - "\n".. - "\n".. - "\n", - "As máquinas TA2 podem não apenas extrair minérios\\, mas também produzir objetos.\n".. - "\n", - "O autocrafter é usado para a produção automática de bens. Tudo o que o jogador pode produzir via \"Crafting Grid\" também pode ser feito pelo autocrafter. Para isso\\, a receita deve ser inserida no menu do autocrafter e os ingredientes necessários adicionados.\n".. - "\n".. - "Ingredientes e produtos fabricados podem ser transportados para dentro e para fora do bloco por meio de tubos e pushers.\n".. - "\n".. - "A capacidade de processamento é de um item a cada 4s. O autocrafter requer 4 ku de energia.\n".. - "\n".. - "\n".. - "\n", - "O electronic fab é uma máquina especial e só pode ser usada para a produção de tubos de vácuo. Tubos de vácuo são necessários para máquinas e blocos TA3.\n".. - "\n".. - "A capacidade de processamento é de um tubo de vácuo a cada 6s. O electronic fab requer 8 ku de energia.\n".. - "\n".. - "\n".. - "\n", - "", - "Algumas receitas requerem água. Para que essas receitas também possam ser processadas automaticamente com o autocrafter\\, água deve ser fornecida em baldes. Isso é feito usando o liquid sampler. Ele precisa de baldes vazios e deve ser colocado na água.\n".. - "\n".. - "A capacidade de processamento é de um balde de água a cada 8s. O liquid sampler requer 3 ku de energia.\n".. - "\n".. - "\n".. - "\n", - "O protected chest só pode ser usado por jogadores que têm permissão de construção neste local\\, ou seja\\, que têm direitos de proteção. Não importa quem coloca o baú.\n".. - "\n".. - "\n".. - "\n", - "O Minetest divide o mapa em chamados map blocks. Estes são cubos com uma aresta de 16x16x16 blocos. Um map block é sempre completamente carregado pelo servidor\\, mas apenas os blocos ao redor de um jogador são carregados (aproximadamente 2-3 blocos em todas as direções). Na direção de visão do jogador\\, também existem mais map blocks. Apenas esta parte do mundo é ativa e apenas aqui as plantas e árvores crescem ou as máquinas funcionam.\n".. - "\n".. - "Com um bloco forceload\\, você pode forçar o map block em que o bloco forceload está localizado a permanecer carregado enquanto você estiver no servidor. Quando todos os seus campos e máquinas estão cobertos com blocos Forceload\\, tudo está sempre em execução.\n".. - "\n".. - "Os map blocks com suas coordenadas são predefinidos\\, por exemplo\\, (0\\,0\\,0) a (15\\,15\\,15)\\, ou (16\\,16\\,16) a (31\\,31\\,31).\n".. - "Você pode mover um bloco forceload dentro de um map block como quiser\\, a posição do map block permanece inalterada.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta2", - "", - "ta2_firebox", - "ta2_boiler", - "ta2_cylinder", - "ta2_flywheel", - "ta2_steampipe", - "ta2_driveaxle", - "ta2_generator", - "", - "ta2_winch", - "", - "techage:ta2_clutch_off", - "", - "tube", - "concentrador", - "ta2_pusher", - "ta2_distributor", - "", - "ta2_rinser", - "ta2_grinder", - "ta2_quarry", - "ta2_grinder", - "ta2_gravelsieve", - "", - "ta2_autocrafter", - "ta2_electronicfab", - "", - "ta2_liquidsampler", - "ta2_chest", - "ta2_forceload", - }, - plans = { - "", - "steamengine", - "", - "", - "", - "", - "", - "", - "", - "ta2_storage", - "", - "", - "", - "itemtransport", - "", - "", - "", - "", - "gravelrinser", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta3_DE.lua b/techage/doc/manual_ta3_DE.lua deleted file mode 100644 index b1a4003..0000000 --- a/techage/doc/manual_ta3_DE.lua +++ /dev/null @@ -1,934 +0,0 @@ -return { - titles = { - "1,TA3: Ölzeitalter", - "2,Kohlekraftwerk / Ölkraftwerk", - "3,TA3 Kraftwerks-Feuerbox / Power Station Firebox", - "3,TA3 Kraftwerks-Ölbrenner / TA3 Power Station Oil Burner", - "3,TA3 Boiler unten/oben", - "3,TA3 Turbine", - "3,TA3 Generator", - "3,TA3 Kühler / Cooler", - "2,Elektrischer Strom", - "3,Bedeutung von Speichersystemen", - "3,TA Stromkabel / Electric Cable", - "3,TA Verteilerdose / Electric Junction Box", - "3,TA Stromleitung / Power Line", - "3,TA Strommast / Power Pole", - "3,TA Strommastkopf / Power Pole Top", - "3,TA Strommastkopf 2 / Power Pole Top 2", - "3,TA Stromschalter / Power Switch", - "3,TA Stromschalter klein / Power Switch Small", - "3,TA Stromschalterbox / Power Switch Box", - "3,TA3 Kleiner Stromgenerator / Tiny Power Generator", - "3,TA3 Akku Block / TA3 Accu Box", - "3,TA3 Strom Terminal / Power Terminal", - "3,TA3 Elektromotor / TA3 Electric Motor", - "2,TA3 Industrieofen", - "3,TA3 Ofen-Ölbrenner / Furnace Oil Burner", - "3,TA3 Ofenoberteil / Furnace Top", - "3,TA3 Gebläse / Booster", - "2,Flüssigkeiten", - "3,TA3 Tank / TA3 Tank", - "3,TA3 Pumpe / TA3 Pump", - "3,TA Einfülltrichter / TA Liquid Filler", - "3,TA4 Röhre / Pipe", - "3,TA3 Rohr/Wanddurchbruch / TA3 Pipe Wall Entry Blöcke", - "3,TA Ventil / TA Valve", - "2,Öl-Förderung", - "3,TA3 Ölexplorer / Oil Explorer", - "3,TA3 Ölbohrkiste / Oil Drill Box", - "3,TA3 Ölpumpe / Oil Pumpjack", - "3,TA3 Bohrgestänge / Drill Pipe", - "3,Öltank / Oil Tank", - "2,Öl-Transport", - "3,Öl-Transport mit dem Tankwagen", - "3,Öl-Transport mit Fässern über Minecarts", - "3,Tankwagen / Tank Cart", - "3,Kistenwagen / Chest Cart", - "2,Öl-Verarbeitung", - "3,Destillationsturm / distiller tower", - "4,Aufkocher / reboiler)", - "2,Logik-/Schalt-Blöcke", - "3,TA3 Taster/Schalter / Button/Switch", - "3,TA3 Kommando Konverter / Command Converter", - "3,TA3 Flipflop / Flip-Flop", - "3,TA3 Logikblock / Logic Block", - "3,TA3 Wiederholer / Repeater", - "3,TA3 Sequenzer / Sequencer", - "3,TA3 Timer", - "3,TA3 Terminal", - "3,TechAge Farblampe / Color Lamp", - "3,Tür/Tor Blöcke / Door/Gate Blocks", - "3,TA3 Tür Controller / Door Controller", - "3,TA3 Tür Controller II / Door Controller II", - "3,TA3 Sound Block", - "3,TA3 Mesecons Umsetzer / TA3 Mesecons Converter", - "2,Detektoren", - "3,TA3 Detektor / Detector", - "3,TA3 Wagen Detektor / Cart Detector", - "3,TA3 Block Detektor / Node Detector", - "3,TA3 Spieler Detektor / Player Detector", - "3,TA3 Lichtdetektor", - "2,TA3 Maschinen", - "3,TA3 Schieber / Pusher", - "3,TA3 Verteiler / Distributor", - "3,TA3 Autocrafter", - "3,TA3 Elektronikfabrik / Electronic Fab", - "3,TA3 Steinbrecher / Quarry", - "3,TA3 Kiessieb / Gravel Sieve", - "3,TA3 Kieswaschanlage / Gravel Rinser", - "3,TA3 Mühle / Grinder", - "3,TA3 Injektor / Injector", - "2,Werkzeuge", - "3,Techage Info Tool", - "3,TechAge Programmer", - "3,TechAge Kelle / Trowel", - "3,TA3 Bohrgestängezange / TA3 Drill Pipe Wrench", - "3,Techage Schraubendreher / Screwdriver", - "3,TechAge Montagewerkzeug / Assembly Tool", - }, - texts = { - "Bei TA3 gilt es\\, die Dampf-betriebenen Maschinen durch leistungsfähigere und mit elektrischem Strom betriebene Maschinen abzulösen.\n".. - "\n".. - "Dazu musst du Kohlekraftwerke und Generatoren bauen. Bald wirst du sehen\\, dass dein Strombedarf nur mit Öl-betriebenen Kraftwerken zu decken ist. Also machst du dich auf die Suche nach Erdöl. Bohrtürme und Ölpumpen helfen die\\, an das Öl zu kommen. Schienenwege dienen dir zum Öltransport bis in die Kraftwerke.\n".. - "\n".. - "Das Industrielle Zeitalter ist auf seinem Höhepunkt.\n".. - "\n".. - "\n".. - "\n", - "Das Kohlekraftwerk besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet\\, zusammen gebaut werden. Dazu werden die Blöcke TA3 Kraftwerks-Feuerbox\\, TA3 Boiler oben\\, TA3 Boiler unten\\, TA3 Turbine\\, TA3 Generator und TA3 Kühler benötigt.\n".. - "\n".. - "Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen.\n".. - "Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden.\n".. - "Wenn das Wasser heiß ist\\, kann der Generator gestartet werden.\n".. - "\n".. - "Das Kraftwerk kann alternativ auch mit einem Ölbrenner ausgestattet und dann mit Öl betrieben werden.\n".. - "Das Öl kann über eine Pumpe und Ölleitung nachgefüllt werden.\n".. - "\n".. - "Das Kraftwerk liefert eine Leistung von 80 ku.\n".. - "\n".. - "\n".. - "\n", - "Teil des Kraftwerks. \n".. - "Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die vom Kraftwerk angefordert wird. Unter Volllast brennt Kohle 20 s und Holzkohle 60 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n".. - "\n".. - "\n".. - "\n", - "Teil des Kraftwerks. \n".. - "\n".. - "Der Ölbrenner kann mit Erdöl\\, Schweröl\\, Naphtha oder Benzin gefüllt werden. Die Brenndauer ist abhängig von der Leistung\\, die vom Kraftwerk angefordert wird. Unter Volllast brennt Erdöl 15 s\\, Schweröl 20 s\\, Naphtha 22 s und Benzin 25 s. \n".. - "\n".. - "Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n".. - "\n".. - "Der Ölbrenner kann nur 50 Einheiten Kraftstoff aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam.\n".. - "\n".. - "\n".. - "\n", - "Teil des Kraftwerk. Muss mit Wasser gefüllt werden. Wem kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt\\, schaltet sich das Kraftwerk ab. Der Wasserverbrauch des TA3-Kessels ist durch den geschlossenen Dampfkreislauf viel geringer als bei der Dampfmachine.\n".. - "Bei der Dampfmaschine geht bei jedem Kolbenhub etwas Wasser als Dampf verloren.\n".. - "\n".. - "\n".. - "\n", - "Die Turbine ist Teil des Kraftwerk. Sie muss neben den Generator gesetzt und über Dampfleitungen mit dem Boiler und dem Kühler\\, wie im Plan abgebildet\\, verbunden werden.\n".. - "\n".. - "\n".. - "\n", - "Der Generator dient zur Stromerzeugung. Er muss über Stromkabel und Verteilerdosen mit den Maschinen verbunden werden.\n".. - "\n".. - "\n".. - "\n", - "Dient zur Abkühlung des heißen Dampfs aus der Turbine. Muss über Dampfleitungen mit dem Boiler und der Turbine\\, wie im Plan abgebildet\\, verbunden werden.\n".. - "\n".. - "\n".. - "\n", - "In TA3 (und TA4) werden die Maschinen mit Strom angetrieben. Dazu müssen die Maschinen\\, Speichersysteme und Generatoren mit Stromkabel verbunden werden.\n".. - "TA3 besitzt 2 Arten von Stromkabel:\n".. - "\n".. - " - Isolierte Kabel (TA Stromkabel) für die lokale Verkabelung im Boden oder in Gebäuden. Diese Kabel lassen sich in der Wand oder im Boden verstecken (können mit der Kelle \"verputzt\" werden).\n".. - " - Überlandleitungen (TA Stromleitung) für Freiluftverkabelung über große Strecken. Diese Kabel sind geschützt\\, können also von anderen Spielern nicht entfernt werden.\n".. - "\n".. - "Mehrere Verbraucher\\, Speichersysteme und Generatoren können in einem Stromnetzwerk zusammen betrieben werden. Mit Hilfe der Verteilerdosen können so Netzwerke aufgebaut werden.\n".. - "Wird zu wenig Strom bereitgestellt\\, gehen die Verbraucher aus.\n".. - "In diesem Zusammenhang ist auch wichtig\\, dass die Funktionsweise von Forceload Blöcken verstanden wurde\\, denn bspw. Generatoren liefern nur Strom\\, wenn der entsprechende Map-Block geladen ist. Dies kann mit einen Forceload Block erzwungen werden.\n".. - "\n".. - "In TA4 kommt noch ein Kabel für die Solaranlage hinzu.\n".. - "\n".. - "\n".. - "\n", - "Speichersysteme im Stromnetz erfüllen zwei Aufgaben:\n".. - "\n".. - " - Um Bedarfsspitzen abzufangen: Alle Generatoren liefern immer gerade soviel Leistung\\, wie benötigt wird. Werden aber Verbraucher ein/ausgeschaltet oder kommt es aus anderen Gründen zu Bedarfsschwankungen\\, so können Verbraucher kurzzeitig ausfallen. Um dies zu verhindern\\, sollte immer mindestens ein Akkublock in jedem Netzwerk vorhanden sein. Dieser dient als Puffer und gleicht diese Schwankungen im Sekundenbereich aus.\n".. - " - Um regenerative Energie zu speichern: Solar und Wind stehen nicht 24 Stunden am Tag zur Verfügung. Damit die Stromversorgung nicht ausfällt\\, wenn kein Strom produziert wird\\, müssen ein oder mehrere Speichersysteme im Netzwerk verbaut werden. Alternativ können die Lücken auch mit Öl/Kohle-Strom überbrückt werden.\n".. - "\n".. - "Ein Speichersystem gibt seine Kapazität in kud an\\, also ku pro day (Tag). Bspw. ein Speichersystem mit 100 kud liefert 100 ku einen Spieltag lang\\, oder auch 10 ku für 10 Spieltage.\n".. - "\n".. - "Alle TA3/TA4 Energiequellen besitzen eine einstellbare Ladecharakteristik. Standardmäßig ist diese auf \"80% - 100%\" eingestellt. Dies bedeutet\\, dass die Leistung ab 80% Füllung des Speichersystems immer weiter reduziert wird\\, bis sie bei 100 % komplett abschaltet. Sofern Strom im Netzwerk benötigt wird\\, werden die 100 % nie erreicht\\, da die Leistung des Generators irgendwann auf den Strombedarf im Netzwerk abgesunken ist und damit das Speichersystem nicht mehr geladen\\, sondern nur noch die Verbraucher bedient werden.\n".. - "\n".. - "Dies hat mehrere Vorteile:\n".. - "\n".. - " - Die Ladecharakteristik ist einstellbar. Damit kann man bspw. Öl/Kohle Energiequellen bei 60% und die regenerativen Energiequellen erst bei 80% zurückfahren. Damit wird nur Öl/Kohle verbrannt\\, wenn nicht ausreichend regenerativen Energiequellen zur Verfügung stehen.\n".. - " - Mehrere Energiequellen können parallel betrieben werden und werden dabei nahezu gleichmäßig belastet\\, denn alle Energiequellen arbeiten bspw. bis 80% Ladekapazität des Speichersystems mit ihrer vollen Leistung und fahren dann gleichzeitig ihre Leistung zurück.\n".. - " - Alle Speichersysteme in einem Netzwerk bilden einen großen Puffer. An jedem Speichersystem aber auch am Strom Terminal kann immer die Ladekapazität und der Füllungsgrad des gesamten Speichersystems in Prozent abgelesen werden.\n".. - "\n".. - "\n".. - "\n", - "Für die lokale Verkabelung im Boden oder in Gebäuden.\n".. - "Abzweigungen können mit Hilfe von Verteilerdosen realisiert werden. Die maximale Kabellänge zwischen Maschinen oder Verteilerdosen beträgt 1000 m. Es können maximale 1000 Knoten in einem Strom-Netzwerk verbunden werden. Als Knoten zählen alle Blöcke mit Stromanschluss\\, also auch Verteilerdosen.\n".. - "\n".. - "Da die Stromkabel nicht automatisch geschützt sind\\, wird für längere Strecken die Überlandleitungen (TA Stromleitung) empfohlen.\n".. - "\n".. - "Stromkabel können mit der Kelle verputzt also in der Wand oder im Boden versteckt werden. Als Material zum Verputzen können alle Stein-\\, Clay- und sonstige Blöcke ohne \"Intelligenz\" genutzt werden. Erde (dirt) geht nicht\\, da Erde zu Gras oder ähnlichem konvertiert werden kann\\, was die Leitung zerstören würde.\n".. - "\n".. - "Zum Verputzen muss mit der Kelle auf das Kabel geklickt werden. Das Material\\, mit dem das Kabel verputzt werden soll\\, muss sich im Spieler-Inventar ganz links befinden.\n".. - "Die Kabel können wieder sichtbar gemacht werden\\, indem man mit der Kelle wieder auf den Block klickt.\n".. - "\n".. - "Außer Kabel können auch die TA Verteilerdose und die TA Stromschalterbox verputzt werden.\n".. - "\n".. - "\n".. - "\n", - "Mit der Verteilerdose kann Strom in bis zu 6 Richtungen verteilt werden. Verteilerdosen können auch mit der Kelle verputzt (versteckt) und wieder sichtbar gemacht werden.\n".. - "\n".. - "\n".. - "\n", - "Mit der TA Stromleitung und den Strommasten können halbwegs realistische Überlandleitungen realisiert werden. Die Strommasten-Köpfe dienen gleichzeitig zum Schutz der Stromleitung (Protection). Dazu muss alle 16 m oder weniger ein Masten gesetzt werden. Der Schutz gilt aber nur die die Stromleitung und die Masten\\, alle anderen Blöcke in diesem Bereich sind dadurch nicht geschützt.\n".. - "\n".. - "\n".. - "\n", - "Dient zum Bauen von Strommasten. Ist durch den Strommast-Kopf vor Zerstörung geschützt und kann nur vom Besitzer wieder abgebaut werden.\n".. - "\n".. - "\n".. - "\n", - "Hat bis zu vier Arme und erlaubt damit\\, Strom in bis zu 6 Richtungen weiter zu verteilen. \n".. - "Der Strommastkopf schützt Stromleitungen und Masten in einem Radius von 8 m.\n".. - "\n".. - "\n".. - "\n", - "Dieser Strommastkopf hat zwei feste Arme und wird für die Überlandleitungen genutzt. Er kann aber auch Strom nach unten und oben weiterleiten.\n".. - "Der Strommastkopf schützt Stromleitungen und Masten in einem Radius von 8 m.\n".. - "\n".. - "\n".. - "\n", - "Mit dem Schalter kann der Strom ein- und ausgeschaltet werden. Der Schalter muss dazu auf eine Stromschalterbox gesetzt werden. Die Stromschalterbox muss dazu auf beiden Seiten mit dem Stromkabel verbunden sein.\n".. - "\n".. - "\n".. - "\n", - "Mit dem Schalter kann der Strom ein- und ausgeschaltet werden. Der Schalter muss dazu auf eine Stromschalterbox gesetzt werden. Die Stromschalterbox muss dazu auf beiden Seiten mit dem Stromkabel verbunden sein.\n".. - "\n".. - "\n".. - "\n", - "siehe TA Stromschalter.\n".. - "\n".. - "\n".. - "\n", - "Der kleine Stromgenerator wird mit Benzin betrieben und kann für kleine Verbraucher mit bis zu 12 ku genutzt werden. Unter Volllast brennt Benzin 150 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit).\n".. - "\n".. - "Der Stromgenerator kann nur 50 Einheiten Benzin aufnehmen. Ein zusätzlicher Tank und eine Pumpe sind daher ratsam.\n".. - "\n".. - "\n".. - "\n", - "Der Akku Block dient zur Speicherung von überschüssiger Energie und gibt bei Stromausfall automatisch Strom ab (soweit vorhanden).\n".. - "Mehrere Akku Blocks zusammen bilden ein TA3 Energiespeichersystem. Jeder Akku Block hat eine Anzeige für den Ladezustand und für die gespeicherte Ladung\\, wobei hier immer die Werte für das gesamte Netzwerk angezeigt werden. Die gespeicherte Ladung wird in \"kud\" also \"ku-days\" angezeigt (analog zu kWh) 5 kud entspricht damit bspw. 5 ku für einen Spieltag (20 min) oder 1 ku für 5 Spieltage.\n".. - "\n".. - "Ein Akku Block hat 3.33 kud.\n".. - "\n".. - "\n".. - "\n", - "Das Strom-Terminal muss mit dem Stromnetz verbunden werden. Es zeigt Daten aus dem Stromnetz an.\n".. - "\n".. - "In der oberen Hälfte werden die wichtigsten Größen ausgegeben:\n".. - "\n".. - " - aktuelle/maximale Generatorleistung\n".. - " - aktueller Stromaufnahme aller Verbraucher\n".. - " - aktueller Ladestrom in/aus dem Speichersystems\n".. - " - aktuellen Ladezustand des Speichersystems in Prozent\n".. - "\n".. - "In der unteren Hälfte wird die Anzahl der Netzwerkblöcke ausgegeben.\n".. - "\n".. - "Über den Reiter \"console\" können weitere Daten zu den Generatoren und Speichersystemen abgefragt werden.\n".. - "\n".. - "\n".. - "\n", - "Um TA2 Maschinen über das Stromnetz betreiben zu können\\, wird der TA3 Elektromotor benötigt. Dieser wandelt Strom in Achsenkraft um.\n".. - "Wird der Elektromotor nicht mit ausreichend Strom versorgt\\, geht er in einen Fehlerzustand und muss über einen Rechtsklick wieder aktiviert werden.\n".. - "\n".. - "Das Elektromotor nimmt primär max. 40 ku an Strom auf und gibt sekundär max. 39 ku als Achsenkraft wieder ab. Er verbraucht also ein ku für die Umwandlung.\n".. - "\n".. - "\n".. - "\n", - "Der TA3 Industrieofen dient als Ergänzung zu normalen Ofen (furnace). Damit können alle Waren mit \"Koch\" Rezepten\\, auch im Industrieofen hergestellt werden. Es gibt aber auch spezielle Rezepte\\, die nur im Industrieofen hergestellt werden können.\n".. - "Der Industrieofen hat sein eigenes Menü zur Rezeptauswahl. Abhängig von den Waren im Industrieofen Inventar links kann rechts das Ausgangsprodukt gewählt werden.\n".. - "\n".. - "Der Industrieofen benötigt Strom (für das Gebläse) sowie Schweröl/Benzin für den Brenner. Der Industrieofen muss wie im Plan rechts abgebildet\\, zusammen gebaut werden.\n".. - "\n".. - "Siehe auch TA4 Ofenheizung.\n".. - "\n".. - "\n".. - "\n", - "Ist Teil des TA3 Industrieofen.\n".. - "\n".. - "Der Ölbrenner kann mit Erdöl\\, Schweröl\\, Naphtha oder Benzin betrieben werden. Die Brennzeit beträgt für Erdöl 65 s\\, Schweröl 80 s\\, Naphtha 90 s und Benzin 100 s.\n".. - "\n".. - "Der Ölbrenner kann nur 50 Einheiten Kraftstoff aufnehmen. Ein zusätzlicher Tank und eine Pumpe sind daher ratsam.\n".. - "\n".. - "\n".. - "\n", - "Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen.\n".. - "\n".. - "\n".. - "\n", - "Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen.\n".. - "\n".. - "\n".. - "\n", - "Flüssigkeiten wie Wasser oder Öl können nur die spezielle Leitungen gepumpt und in Tanks gespeichert werden. Wie auch bei Wasser gibt es aber Behälter (Kanister\\, Fässer)\\, in denen die Flüssig gelagert und transportiert werden kann.\n".. - "\n".. - "Über die gelben Leitungen und Verbindungsstücke ist es auch möglich\\, mehrere Tanks zu verbinden. Allerdings müssen die Tanks den selben Inhalt haben und zwischen Tank\\, Pumpe und Verteiler muss immer mindestens eine gelbe Leitung sein.\n".. - "\n".. - "Bspw. zwei Tanks direkt mit einem Verteilerstück zu verbinden\\, geht nicht.\n".. - "\n".. - "Um Flüssigkeiten von Behältern nach Tanks umzufüllen\\, dient der Einfülltrichter. Im Plan ist dargestellt\\, wie Kanistern oder Fässer mit Flüssigkeiten über Schieber in einen Einfülltrichter geschoben werden. Im Einfülltrichter wird der Behälter geleert und die Flüssigkeit nach unten in den Tank geleitet. \n".. - "\n".. - "Der Einfülltrichter kann auch unter einen Tank gesetzt werden\\, um den Tank zu leeren.\n".. - "\n".. - "\n".. - "\n", - "In einem Tank können Flüssigkeiten gespeichert werden. Ein Tank kann über eine Pumpe gefüllt bzw. geleert werden. Dazu muss die Pumpe über einer Leitung (gelbe Röhre) mit dem Tank verbunden sein.\n".. - "\n".. - "Ein Tank kann auch von Hand gefüllt oder geleert werden\\, indem mit einem vollen oder leeren Flüssigkeitsbehälter (Fass\\, Kanister) auf den Tank geklickt wird. Dabei ist zu beachten\\, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank\\, muss dieser Rest mit Kanistern entnommen oder leergepumpt werden.\n".. - "\n".. - "In einen TA3 Tank passen 1000 Einheiten oder 100 Fässer einer Flüssigkeit.\n".. - "\n".. - "\n".. - "\n", - "Mit der Pumpe können Flüssigkeiten von Tanks oder Behältern zu anderen Tanks oder Behältern gepumpt werden. Bei der Pumpe muss die Pumprichtung (Pfeil) beachtet werden. Über die gelben Leitungen und Verbindungsstücke ist es auch möglich\\, mehrere Tanks auf jeder Seite der Pumpe anzuordnen. Allerdings müssen die Tanks den selben Inhalt haben.\n".. - "\n".. - "Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden.\n".. - "\n".. - "Hinweis 1: Die Pumpe darf nicht direkt neben den Tank platziert werden. Es muss immer mindestens ein Stück gelbe Leitung dazwischen sein.\n".. - "\n".. - "Hinweis 2: Nach dem Starten markiert die Pumpe 10 x die Blöcke\\, von und zu denen gepumpt wird.\n".. - "\n".. - "\n".. - "\n", - "Um Flüssigkeiten zwischen Behältern und Tanks umzufüllen\\, dient der Einfülltrichter.\n".. - "\n".. - " - wird der Einfülltrichter unter einen Tank gesetzt und werden leere Fässer mit einem Schieber oder von Hand in den Einfülltrichter gegeben\\, wird der Tankinhalt in die Fässer umgefüllt und die Fässer können ausgangsseitig wieder entnommen werden\n".. - " - wird der Einfülltrichter auf einen Tank gesetzt und werden volle Fässer mit einem Schieber oder von Hand in den Einfülltrichter gegeben\\, werden diese in den Tank umgefüllt und die Fässer können ausgangsseitig wieder entnommen werden\n".. - "\n".. - "Dabei ist zu beachten\\, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank\\, muss dieser Rest mit Kanistern entnommen oder leergepumpt werden.\n".. - "\n".. - "\n".. - "\n", - "Die gelben Röhren dienen zur Weiterleitung von Gas und Flüssigkeiten. \n".. - "Die maximale Leitungslänge beträgt 100 m.\n".. - "\n".. - "\n".. - "\n", - "Die Blöcke dienen als Wanddurchbrüche für Röhren\\, so dass keine Löcher offen bleiben.\n".. - "\n".. - "\n".. - "\n", - "Für die gelben Röhren gibt es ein Ventil\\, welches über Mausklicks geöffnet und geschlossen werden kann.\n".. - "Das Ventil kann auch über on/off Kommandos angesteuert werden.\n".. - "\n".. - "\n".. - "\n", - "Um deine Generatoren und Öfen mit Öl betreiben zu können\\, muss du zuerst nach Öl suchen und einen Bohrturm errichten und danach das Öl fördern.\n".. - "Dazu dienen dir TA3 Ölexplorer\\, TA3 Ölbohrkiste und TA3 Ölpumpe.\n".. - "\n".. - "\n".. - "\n", - "Mit dem Ölexplorer kannst du nach Öl suchen. Dazu den Block auf den Boden setzen und mit Rechtsklick die Suche starten. Der Ölexplorer kann oberirdisch und unterirdisch in allen Tiefen eingesetzt werden.\n".. - "Über die Chat-Ausgabe wird dir angezeigt\\, in welcher Tiefe nach Öl gesucht wurde und wie viel Öl (oil) gefunden wurde.\n".. - "Du kannst mehrfach auf den Block klicken\\, um auch in tieferen Bereichen nach Öl zu suchen. Ölfelder haben eine Größe von 4000 bis zu 20000 Items.\n".. - "\n".. - "Falls die Suche erfolglos war\\, musst du den Block ca. 16 m weiter setzen.\n".. - "Der Ölexplorer sucht immer innerhalb des ganzen Map-Blocks und darunter nach Öl\\, in dem er gesetzt wurde. Eine erneute Suche im gleichen Map-Block (16x16 Feld) macht daher keinen Sinn.\n".. - "\n".. - "Falls Öl gefunden wurde\\, wird die Stelle für den Bohrturm angezeigt. Du musst den Bohrturm innerhalb des angezeigten Bereiches errichten\\, die Stelle am besten gleich mit einem Schild markieren und den ganzen Bereich gegen fremde Spieler schützen.\n".. - "\n".. - "Gib die Suche nach Öl nicht zu schnell auf. Es kann wenn du Pech hast\\, sehr lange dauern\\, bis du eine Ölquelle gefunden hast.\n".. - "Es macht auch keinen Sinn\\, einen Bereich den ein anderer Spieler bereits abgesucht hat\\, nochmals abzusuchen. Die Chance\\, irgendwo Öl zu finden\\, ist für alle Spieler gleich.\n".. - "\n".. - "Der Ölexplorer kann immer wieder zur Suche nach Öl eingesetzt werden.\n".. - "\n".. - "\n".. - "\n", - "Die Ölbohrkiste muss an die Stelle gesetzt werden\\, die vom Ölexplorer angezeigt wurde. An anderen Stellen nach Öl zu bohren ist zwecklos.\n".. - "Wird auf den Button der Ölbohrkiste geklickt\\, wird über der Kiste ein Bohrturm errichtet. Dies dauert einige Sekunden.\n".. - "Die Ölbohrkiste hat 4 Seiten\\, bei IN muss das Bohrgestänge über Schieber angeliefert und bei OUT muss das Bohrmaterial abtransportiert werden. Über eine der anderen zwei Seiten muss die Ölbohrkiste mit Strom versorgt werden.\n".. - "\n".. - "Die Ölbohrkiste bohrt bis zum Ölfeld (1 Meter in 16 s) und benötigt dazu 16 ku Strom.\n".. - "Wurde das Ölfeld erreicht\\, kann der Bohrturm abgebaut und die Kiste entfernt werden.\n".. - "\n".. - "\n".. - "\n", - "An die Stelle der Ölbohrkiste muss nun die Ölpumpe platziert werden. Auch die Ölpumpe benötigt Strom (16 ku) und liefert alle 8 s ein Einheit Erdöl. Das Erdöl muss in einem Tank gesammelt werden. Dazu muss die Ölpumpe über eine Leitung (gelbe Röhre) mit dem Tank verbunden werden.\n".. - "Ist alles Öl abgepumpt\\, kann auch die Ölpumpe wieder entfernt werden.\n".. - "\n".. - "\n".. - "\n", - "Das Bohrgestänge wird für die Bohrung benötigt. Es werden so viele Bohrgestänge Items benötigt wie als Tiefe für das Ölfeld angegeben wurde. Das Bohrgestänge ist nach der Bohrung nutzlos\\, kann aber auch nicht abgebaut werden und verbleibt im Boden. Es gibt aber ein Werkzeug\\, um die Bohrgestänge Blöcke wieder entfernen zu können (-> Werkzeuge -> TA3 Bohrgestängezange).\n".. - "\n".. - "\n".. - "\n", - "Der Öltank ist die große Ausführung des TA3 Tanks (siehe Flüssigkeiten -> TA3 Tank).\n".. - "\n".. - "Der große Tank kann 4000 Einheiten Öl\\, aber auch jede andere Art von Flüssigkeit aufnehmen.\n".. - "\n".. - "\n".. - "\n", - "", - "Um Öl von der Ölquelle zur Ölverarbeitungsanlage zu befördern\\, können Tankwagen (tank carts) genutzt werden. Ein Tankwagen kann direkt über Pumpen gefüllt bzw. geleert werden. In beiden Fällen muss die gelbe Röhre von oben mit dem Tankwagen verbunden werden.\n".. - "\n".. - "Dazu sind folgende Schritte notwendig:\n".. - "\n".. - " - Den Tankwagen vor den Prellbock setzen. Der Prellbock darf noch nicht mit einer Zeit programmiert sein\\, so dass der Tankwagen nicht automatisch losfährt\n".. - " - Den Tankwagen über gelbe Röhren mit der Pumpe verbinden\n".. - " - Pumpe einschalten\n".. - " - Prellbock mit einer Zeit (10 - 20 s) programmieren\n".. - "\n".. - "Diese Reihenfolge muss auf beiden Seiten /Füllen/Leeren) eingehalten werden.\n".. - "\n".. - "\n".. - "\n", - "In die Minecarts können Kanister und Fässer geladen werden. Das Öl muss dazu zuvor in Fässer umgeladen werden. Die Ölfässer können direkt mit einem Schieber und Röhren in das Minecart geschoben werden (siehe Plan). Die leeren Fässer\\, welche per Minecart von der Entladestation zurück kommen\\, können über einen Hopper entladen werden\\, der unter der Schiene an der Haltestelle platziert wird.\n".. - "\n".. - "Es ist mit dem Hopper nicht möglich\\, an *einer* Haltestelle sowohl die leeren Fässer zu entladen\\, als auch die vollen Fässer zu beladen. Der Hopper lädt die vollen Fässer sofort wieder aus. Daher ist es ratsam\\, jeweils 2 Stationen auf der Be- und Entladeseite einzurichten und den Minecart dann über eine Aufzeichnungsfahrt entsprechend zu programmieren.\n".. - "\n".. - "Der Plan zeigt\\, wie das Öl in einen Tank gepumpt und über einen Einfülltrichter in Fässer umgefüllt und in Minecarts geladen werden kann.\n".. - "\n".. - "Damit die Minecarts automatisch wieder starten\\, müssen die Prellböcke mit Stationsname und Wartezeit konfiguriert werden. Für das Entladen reichen 5 s. Da aber die Schieber immer für mehrere Sekunden in den Standby fallen\\, wenn kein Minecart da ist\\, muss für das Beladen eine Zeit von 15 oder mehr Sekunden eingegeben werden.\n".. - "\n".. - "\n".. - "\n", - "Der Tankwagen dient zum Transport von Flüssigkeiten. Es kann wie Tanks mit Pumpen gefüllt bzw. geleert werden. In beiden Fällen muss die gelbe Röhre von oben mit dem Tankwagen verbunden werden.\n".. - "\n".. - "In den Tankwagen passen 200 Einheiten.\n".. - "\n".. - "\n".. - "\n", - "Der Kistenwagen dient zum Transport von Items. Es kann wie Kisten über Schieber gefüllt bzw. geleert werden.\n".. - "\n".. - "In den Kistenwagen passen 4 Stacks.\n".. - "\n".. - "\n".. - "\n", - "Öl ist ein Stoffgemisch und besteht aus sehr vielen Komponenten. Über einen Destillationsturm kann das Öl in seine Hauptbestandteile wie Bitumen\\, Schweröl\\, Naphtha\\, Benzin und Gas zerlegt werden.\n".. - "Die weitere Verarbeitung zu Endprodukten erfolgt im Chemischen Reaktor.\n".. - "\n".. - "\n".. - "\n", - "Der Destillationsturm muss wie im Plan rechts oben aufgebaut werden. \n".. - "Über den Basisblock wird das Bitumen abgelassen. Der Ausgang ist auf der Rückseite des Basisblocks (Pfeilrichtung beachten).\n".. - "Auf diesen Basisblock kommen die \"Destillationsturm\" Blöcke mit den Nummern: 1\\, 2\\, 3\\, 2\\, 3\\, 2\\, 3\\, 4\n".. - "An den Öffnungen von unten nach oben werden Schweröl\\, Naphtha und Benzin abgeleitet. Ganz oben wird das Propangas abgefangen.\n".. - "Es müssen alle Öffnungen am Turm mit Tanks verbunden werden.\n".. - "Der Aufkocher (reboiler) muss mit dem Block \"Destillationsturm 1\" verbunden werden.\n".. - "\n".. - "Der Aufkocher benötigt Strom (nicht im Plan zu sehen)!\n".. - "\n".. - "\n".. - "\n", - "Der Aufkocher erhitzt das Erdöl auf ca. 400°C. Dabei verdampft es weitgehend und wird in den Destillationsturm zur Abkühlung geleitet.\n".. - "\n".. - "Der Aufkocher benötigt 14 Einheiten Strom und produziert alle 16 s jeweils eine Einheit Bitumen\\, Schweröl\\, Naphtha\\, Benzin und Propangas.\n".. - "Dazu muss der Aufkocher über einen Pumpe mit Erdöl versorgt werden.\n".. - "\n".. - "\n".. - "\n", - "Neben den Röhren für Warentransport\\, sowie den Gas- und Stromleitungen gibt es auch noch eine drahtlose Kommunikationsebene\\, über die Blöcke untereinander Daten austauschen können. Dafür müssen keine Leitungen gezogen werden\\, sondern die Verbindung zwischen Sender und Empfänger erfolgt nur über die Blocknummer. \n".. - "\n".. - "*Info:* Eine *Blocknummer* ist eine eindeutige Zahl\\, die von Techage beim Setzen von vielen Techage Blöcken generiert wird. Die Blocknummer dient zur Adressierung bei der Kommunikation zwischen Techage Controllern und Maschinen. Alle Blöcke\\, die an dieser Kommunikation teilnehmen können\\, zeigen die Blocknummer als Info-Text an\\, wenn man mit dem Mauscursor den Block fixiert.\n".. - "\n".. - "Welche Kommandos ein Block unterstützt\\, kann mit dem TechAge Info Werkzeug (Schraubenschlüssel) ausgelesen und angezeigt werden.\n".. - "Die einfachsten Kommandos\\, die von fast allen Blöcken unterstützt werden\\, sind:\n".. - "\n".. - " - 'on' - Block/Maschine/Lampe einschalten\n".. - " - 'off' - Block/Maschine/Lampe ausschalten\n".. - "\n".. - "Mir Hilfe des TA3 Terminal können diese Kommandos sehr einfach ausprobiert werden. Angenommen\\, eine Signallampe hat die Nummer 123.\n".. - "Dann kann mit:\n".. - "\n".. - " cmd 123 on\n".. - "\n".. - "die Lampe ein\\, und mit:\n".. - "\n".. - " cmd 123 off\n".. - "\n".. - "die Lampe wieder ausgeschaltet werden. Diese Kommandos müssen so in das Eingabefeld des TA3 Terminals eingegeben werden.\n".. - "\n".. - "Kommandos wie 'on' und 'off' werden zum Empfänger gesendet\\, ohne dass eine Antwort zurück kommt. Diese Kommandos können daher bspw. mit einem Taster/Schalter auch gleichzeitig an mehrere Empfänger gesendet werden\\, wenn dort im Eingabefeld mehrere Nummern eingegeben werden.\n".. - "\n".. - "Ein Kommandos wie 'state' fordert den Status eines Blockes an. Der Block sendet in Folge seinen Status zurück. Diese Art von bestätigten Kommandos kann gleichzeitig nur an einen Empfänger gesendet werden.\n".. - "Auch dieses Kommandos kann mit dem TA3 Terminal bspw. an einem Schieber ausprobiert werden:\n".. - "\n".. - " cmd 123 state\n".. - "\n".. - "Mögliche Antworten des Schiebers sind:\n".. - "\n".. - " - 'running' --> bin am arbeiten\n".. - " - 'stopped' --> ausgeschaltet\n".. - " - 'standby' --> nichts zu tun\\, da Quell-Inventar leer\n".. - " - 'blocked' --> kann nichts tun\\, da Ziel-Inventar voll\n".. - "\n".. - "Dieser Status und weitere Informationen werden auch ausgegeben\\, wenn mit dem Schraubenschlüssel auf den Block geklickt wird.\n".. - "\n".. - "\n".. - "\n", - "Der Taster/Schalter sendet 'on'/'off' Kommandos zu den Blöcken\\, die über die Nummern konfiguriert wurden.\n".. - "Der Taster/Schalter kann als Taster (button) oder Schalter (switch) konfiguriert werden. Wird er als Taster konfiguriert\\, so kann die Zeit zwischen den 'on' und 'off' Kommandos eingestellt werden. Mit der Betriebsart \"on button\" wird nur ein 'on' und kein 'off' Kommandos gesendet.\n".. - "\n".. - "Über die Checkbox \"public\" kann eingestellt werden\\, ob den Taster von jedem (gesetzt)\\, oder nur vom Besitzer selbst (nicht gesetzt) genutzt werden darf.\n".. - "\n".. - "Hinweis: Mit dem Programmer können Blocknummern sehr einfach eingesammelt und konfiguriert werden.\n".. - "\n".. - "\n".. - "\n", - "Mit dem TA3 Kommando Konverter können 'on' / 'off' Kommandos in andere Kommandos umgewandelt werden\\, sowie die Weiterleitung verhindert oder verzögert werden. Die Nummer des Zielblockes bzw. die Nummern der Zielblöcke\\, die Kommandos die gesendet werden sollen\\, sowie die Verzögerungszeiten in Sekunden müssen eingegeben werden. Wird kein Kommando eingegeben\\, wird nichts gesendet.\n".. - "\n".. - "Die Nummern können auch mit Hilfe des Techage Programmers programmiert werden.\n".. - "\n".. - "\n".. - "\n", - "Das TA3 Flipflop wechselt seinen Zustand mit jedem empfangenen 'on' Kommando. Empfangene 'off' Kommandos werden ignoriert. Damit werden abhängig vom Zustandswechsel abwechselnd 'on' / 'off' Kommandos gesendet. Die Nummer des Zielblockes bzw. die Nummern der Zielblöcke müssen eingegeben werden. Die Nummern können auch mit Hilfe des Techage Programmers programmiert werden.\n".. - "\n".. - "Damit lassen sich bspw. Lampen mit Hilfe von Tastern ein- und wieder ausschalten.\n".. - "\n".. - "\n".. - "\n", - "Den TA3 Logikblock kann man so programmieren\\, dass ein oder mehrere Eingangskommandos zu einem Ausgangskommando verknüpft und gesendet werden. Dieser Block kann daher diverse Logik-Elemente wie AND\\, OR\\, NOT\\, XOR usw. ersetzen.\n".. - "Eingangkommandos für den Logikblock sind 'on'/'off' Kommandos.\n".. - "Eingangskommandos werden über die Nummer referenziert\\, also bspw. '1234' für das Kommando vom Sender mit der Nummer 1234.\n".. - "Das gleiche gilt für Ausgangskommandos.\n".. - "\n".. - "Eine Regel ist wie folgt aufgebaut:\n".. - "\n".. - " = on/off if is true\n".. - "\n".. - "'' ist die Nummer des Blocks\\, zu dem das Kommando gesendet werden soll.\n".. - "'' ist ein boolescher Ausdruck\\, bei dem Eingabenummern ausgewertet werden. \n".. - "\n".. - "*Beispiele für den Input Ausdruck*\n".. - "\n".. - "Signal negieren (NOT):\n".. - "\n".. - " 1234 == off\n".. - "\n".. - "Logisches UND (AND):\n".. - "\n".. - " 1234 == on and 2345 == on\n".. - "\n".. - "Logisches ODER (OR):\n".. - "\n".. - " 1234 == on or 2345 == on\n".. - "\n".. - "Folgende Operatoren sind zulässig: 'and' 'or' 'on' 'off' 'me' '==' '~=' '(' ')'\n".. - "\n".. - "Ist der Ausdruck wahr (true)\\, wird ein Kommando an den Block mit der '' Nummer gesendet.\n".. - "\n".. - "Es können bis zu vier Regeln definiert werden\\, wobei immer alle Regeln geprüft werden\\, wenn ein Kommando empfangen wird.\n".. - "\n".. - "Die interne Durchlaufzeit aller Kommandos beträgt 100 ms.\n".. - "\n".. - "Über das Schlüsselwort 'me' kann die eigene Knotennummer referenziert werden. Damit ist es möglich\\, dass sich der Block selbst ein Kommando sendet (Flip-Flop Funktion).\n".. - "\n".. - "Die Sperrzeit definiert eine Pause nach einem Kommando\\, in der der Logikblock kein weiteres Kommando von extern annimmt. Empfangene Kommandos in der Sperrzeit werden damit verworfen. Die Sperrzeit kann in Sekunden definiert werden.\n".. - "\n".. - "\n".. - "\n", - "Der Wiederholer (repeater) sendet das empfangene Signal an alle konfigurierten Nummern weiter.\n".. - "Dies kann bspw. Sinn machen\\, wenn man viele Blöcke gleichzeitig angesteuert werden sollen. Den Wiederholer kann man dazu mit dem Programmer konfigurieren\\, was nicht bei allen Blöcken möglich ist.\n".. - "\n".. - "\n".. - "\n", - "Der Sequenzer kann eine Reihe von 'on'/'off' Kommandos senden\\, wobei der Abstand zwischen den Kommandos in Sekunden angegeben werden muss. Damit kann man bspw. eine Lampe blinken lassen.\n".. - "Es können bis zu 8 Kommandos konfiguriert werden\\, jedes mit Zielblocknummer und Anstand zum nächsten Kommando.\n".. - "Der Sequenzer wiederholt die Kommandos endlos\\, wenn \"Run endless\" gesetzt wird.\n".. - "Wird also Kommando nichts ausgewählt\\, wird nur die angegeben Zeit in Sekunden gewartet.\n".. - "\n".. - "\n".. - "\n", - "Der Timer kann Kommandos Spielzeit-gesteuert senden. Für jede Kommandozeile kann die Uhrzeit\\, die Zielnummer(n) und das Kommando selbst angegeben werden. Damit lassen sich bspw. Lampen abends ein- und morgens wieder ausschalten.\n".. - "\n".. - "\n".. - "\n", - "Das Terminal dient in erster Linie zum Austesten der Kommandoschnittstelle anderer Blöcke (siehe \"Logik-/Schalt-Blöcke\").\n".. - "Man kann aber auch Kommandos auf Tasten legen und so das Terminal produktiv nutzen.\n".. - "\n".. - " set \n".. - "\n".. - "Mit 'set 1 ON cmd 123 on' kann bspw. die Usertaste 1 mit dem Kommando 'cnd 123 on' programmiert werden. Wird die Taste gedrückt\\, wird das Kommando gesendet und die Antwort auf dem Bildschirm ausgegeben.\n".. - "\n".. - "Das Terminal besitzt folgende\\, lokalen Kommandos:\n".. - "\n".. - " - 'clear' lösche Bildschirm\n".. - " - 'help' gib eine Hilfeseite aus\n".. - " - 'pub' schalte in den öffentlichen Modus um\n".. - " - 'priv' schalte in den privaten Modus um\n".. - "\n".. - "Im privaten Modus (private) kann das Terminal nur von Spielern verwendet werden\\, die an diesem Ort bauen können\\, also Protection Rechte besitzen. Im öffentlichen Modus (public) können alle Spieler die vorkonfigurierten Tasten verwenden.\n".. - "\n".. - "\n".. - "\n", - "Die Farblampe kann mit 'on'/'off' Kommando ein- bzw. ausgeschaltet werden. Diese Lampe braucht keinen Strom und\n".. - "kann mit der Spritzpistole aus der Mod \"Unified Dyes\" und über Lua/Beduino Kommandos eingefärbt werden.\n".. - "\n".. - "Mit dem Chat-Kommando '/ta_color' wird die Farbpalette mit den Werten für die Lua/Beduino Kommandos angezeigt und mit '/ta_send color ' kann die Farbe geändert werden.\n".. - "\n".. - "\n".. - "\n", - "Mit diese Blöcken kann man Türe und Tore realisieren\\, die über Kommandos geöffnet (Blöcke verschwinden) und wieder geschlossen werden können. Pro Tor oder Tür wird dazu ein Tür Controller benötigt. \n".. - "\n".. - "Das Aussehen der Blöcke kann über das Block-Menü eingestellt werden.\n".. - "Damit lassen sich Geheimtüren realisieren\\, die sich nur bei bestimmten Spielern öffnen (mit Hilfe des Spieler-Detektors). \n".. - "\n".. - "\n".. - "\n", - "Der Tür Controller dient zur Ansteuerung der TA3 Tür/Tor Blöcke. Beim Tür Controller müssen die Nummern der Tür/Tor Blöcke eingegeben werden. Wird ein 'on'/'off' Kommando Kommando an den Tür Controller gesendet\\, öffnet/schließt dieser die Tür bzw. das Tor.\n".. - "\n".. - "\n".. - "\n", - "Der Tür Controller II kann alle Arten von Blöcken entfernen und wieder setzen. Um den Tür Controller II anzulernen\\, muss der \"Aufzeichnen\" Button gedrückt werden. Dann müssen alle Blöcke angeklickt werden\\, die Teil der Tür / des Tores sein sollen. Danach muss der \"Fertig\" Button gedrückt werden. Es können bis zu 16 Blöcke ausgewählt werden. Die entfernten Blöcke werden im Inventar des Controllers gespeichert.\n".. - "\n".. - " Über die Tasten \"Entfernen\" bzw. \"Setzen\" kann die Funktion des Controllers von Hand getestet werden.\n".. - "\n".. - "Wird ein 'on' / 'off' Kommando an den Tür Controller II gesendet\\, entfernt bzw. setzt er die Blöcke ebenfalls.\n".. - "\n".. - "Mit '$send_cmnd(node_number\\, \"exchange\"\\, 2)' können einzelne Böcke gesetzt\\, entfernt\\, bzw. durch andere Blöcke aus dem Inventar ersetzt werden. \n".. - "\n".. - "Mit '$send_cmnd(node_number\\, \"set\"\\, 2)' kann ein Block aus dem Inventory explizit gesetzt werden\\, sofern der Inventory Slot nicht leer ist.\n".. - "\n".. - "Mit '$send_cmnd(node_number\\, \"dig\"\\, 2)' kann ein Block wieder entfernt werden\\, sofern der Inventory Slot leer ist. \n".. - "\n".. - "Mit '$send_cmnd(node_number\\, \"get\"\\, 2)' wird der Name des gesetzten Blocks zurückgeliefert. \n".. - "\n".. - "Die Slot-Nummer des Inventars (1 .. 16) muss in allen drei Fällen als payload übergeben werden.\n".. - "\n".. - "Damit lassen sich auch ausfahrbare Treppen und ähnliches simulieren.\n".. - "\n".. - "\n".. - "\n", - "Mir dem Sound Block können veschiedene Sounds/Laute abgespielt werden. Es sind alle Sounds der Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack und Minetest Game verfügbar.\n".. - "\n".. - "Die Sounds können über das Menü und über ein Kommando ausgewählt und abgespielt werden.\n".. - "\n".. - " - Kommando 'on' zum Abspielen eines Sounds\n".. - " - Kommando 'sound ' zur Auswahl eines Sounds über den Index\n".. - " - Kommando 'gain ' zum Einstellen der Lautstärke über den '' Wert (1 bis 5).\n".. - "\n".. - "\n".. - "\n", - "Der Mesecons Umsetzer dient zur Umwandlung von Techage on/off Kommandos in Mesecons Signale und umgekehrt.\n".. - "Dazu müssen eine oder mehrere Knotennummern eingegeben und der Konverter mit Mesecons Blöcken \n".. - "über Mesecons Leitungen verbunden werden. Den Mesecons Umsetzer kann man auch mit dem Programmer konfigurieren.\n".. - "Der Mesecons Umsetzer akzeptiert bis zu 5 Kommandos pro Sekunde\\, bei höherer Belastung schaltet er sich ab.\n".. - "\n".. - "*Dieser Block existiert aber nur\\, wenn die Mod mesecons aktiv ist!*\n".. - "\n".. - "\n".. - "\n", - "Detektoren scannen ihre Umgebung ab und senden ein 'on'-Kommando\\, wenn das Gesuchte erkannt wurde.\n".. - "\n".. - "\n".. - "\n", - "Der Detektor ist eine spezieller Röhrenblock\\, der erkennt\\, wenn Items über die Röhre weitergegeben werden. Es muss dazu auf beiden Seiten mit der Röhre verbunden sein. Werden Items mit einem Schieber in den Detektor geschoben\\, gibt er diese automatisch weiter.\n".. - "Er sendet ein 'on'\\, wenn ein Item erkannt wird\\, gefolgt von einem 'off' eine Sekunde später.\n".. - "Danach werden weitere Kommando für 8 Sekunden blockiert.\n".. - "Die Wartezeit\\, sowie die Items\\, die ein Kommando auslösen sollen\\, können über das Gabelschlüssel-Menü konfiguriert werden.\n".. - "\n".. - "\n".. - "\n", - "Der Wagen Detektor sendet ein 'on'-Kommando\\, wenn er einen Wagen/Cart (Minecart) direkt vor sich erkannt hat. Zusätzlich kann der Detektor auch den Wagen wieder starten\\, wenn ein 'on'-Kommando empfangen wird.\n".. - "\n".. - "Der Detektor kann auch mit seiner eigenen Nummer programmiert werden. In diesem Falle schiebt er alle Wagen an\\, die in seiner Nähe (ein Block in alle Richtungen) zum Halten kommen.\n".. - "\n".. - "\n".. - "\n", - "Der Block Detektor sendet ein 'on'-Kommando\\, wenn er erkennt\\, dass Blöcke vor ihm erscheinen oder verschwinden\\, muss jedoch entsprechend konfiguriert werden. Nach dem Zurückschalten des Detektors in den Standardzustand (grauer Block) wird ein 'off'-Kommando gesendet. Gültige Blöcke sind alle Arten von Blöcken und Pflanzen\\, aber keine Tiere oder Spieler. Die Sensorreichweite beträgt 3 Blöcke/Meter in Pfeilrichtung.\n".. - "\n".. - "\n".. - "\n", - "Der Spieler Detektor sendet ein 'on'-Kommando\\, wenn er einen Spieler in einem Umkreis von 4 m um den Block herum erkennt. Verlässt der Spieler wieder den Bereich\\, wird ein 'off'-Kommando gesendet.\n".. - "Soll die Suche auf bestimmte Spieler eingegrenzt werden\\, so können diese Spielernamen auch eingegeben werden.\n".. - "\n".. - "\n".. - "\n", - "Der Lichtdetektor sendet einen 'on'-Kommando\\, wenn der Lichtpegel des darüber liegenden Blocks einen bestimmten Pegel überschreitet\\, der über das Rechtsklickmenü eingestellt werden kann.\n".. - "Mit einen TA4 Lua Controller kann die genaue Lichtstärke mit $get_cmd(num\\, 'light_level') ermitteln werden.\n".. - "\n".. - "\n".. - "\n", - "Bei TA3 existieren die gleichen Maschinen wie bei TA2\\, nur sind diese hier leistungsfähiger und benötigen Strom statt Achsenantrieb.\n".. - "Im folgenden sind daher nur die unterschiedlichen\\, technischen Daten angegeben.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 6 Items alle 2 s.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion des TA3 Verteilers entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 12 Items alle 4 s.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Autocrafter benötigt hierfür 6 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2\\, nur werden hier TA4 WLAN Chips produziert.\n".. - "Die Verarbeitungsleistung beträgt ein Chip alle 6 s. Der Block benötigt hierfür 12 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die maximale Tiefe beträgt 40 Meter. Der Steinbrecher benötigt 12 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Block benötigt 4 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Auch die Wahrscheinlichkeit ist wie bei TA2. Der Block benötigt auch 3 ku Strom.\n".. - "Aber im Gegensatz zu TA2 kann beim TA3 Block bspw. der Status abgefragt werden (Controller)\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Block benötigt 6 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Der Injektor ist ein TA3 Schieber mit speziellen Eigenschaften. Er besitzt ein Menü zur Konfiguration. Hier können bis zu 8 Items konfiguriert werden. Er entnimmt nur diese Items einer Kiste um sie an Maschinen mit Rezepturen weiterzugeben (Autocrafter\\, Industrieofen und Elektronikfabrik).\n".. - "\n".. - "Beim Weitergeben wird in der Zielmaschine pro Item nur eine Position im Inventar genutzt. Sind bspw. nur die ersten drei Einträge im Injektor konfiguriert\\, so werden auch nur die ersten drei Speicherplätze im Inventar der Maschine belegt. Damit wir ein Überlauf im Inventar der Maschine verhindert.\n".. - "\n".. - "Der Injektor kann auch auf \"Ziehe-Modus\" umgeschaltet werden. Dann zieht er nur Items von den Positionen aus der Kiste\\, die in der Konfiguration des Injektors definiert sind. Hier müssen also Item-Typ und Position überein stimmen. Damit können geziehlt Speicherplätze im Inventar einer Kiste geleert werden.\n".. - "\n".. - "Die Verarbeitungsleistung beträgt bis zu 8 mal ein Item alle 4 Sekunden.\n".. - "\n".. - "\n".. - "\n", - "", - "Das Techage Info Tool (Schraubenschlüssel) hat verschiedene Funktionen. Er zeigt die Uhrzeit\\, die Position\\, die Temperatur und das Biome an\\, wenn auf einen unbekannten Block geklickt wird.\n".. - "Wird auf einen TechAge Block mit Kommandoschnittstelle geklickt\\, werden alle verfügbaren Daten abgerufen (siehe auch \"Logik-/Schalt-Blöcke\").\n".. - "\n".. - "Mit Shift+Rechtsklick kann bei einigen Blöcken ein erweitertes Menü geöffnet werden. Hier lassen sich je nach Block weitere Daten abrufen oder spezielle Einstellungen vornehmen. Bei einem Generator kann bspw. die Ladekurve/abschaltung programmiert werden. \n".. - "\n".. - "\n".. - "\n", - "Mit dem Programmer können Blocknummern mit einem Rechtsklick von mehreren Blöcken eingesammelt und mit einem Linksklick in einen Block wie Taster/Schalter geschrieben werden.\n".. - "Wird in die Luft geklickt\\, wird der interne Speicher gelöscht.\n".. - "\n".. - "\n".. - "\n", - "Die Kelle dient zum Verputzen von Stromkabel. Siehe dazu \"TA Stromkabel\".\n".. - "\n".. - "\n".. - "\n", - "Mit diesem Werkzeug lassen sich die Bohrgestängezange Blöcke wieder entfernen\\, wenn dort bspw. ein Tunnel durch soll.\n".. - "\n".. - "\n".. - "\n", - "Der Techage Schraubendreher dient als Ersatz für den normalen Schraubendreher. Es besitzt folgende Funktionen:\n".. - "\n".. - " - Linksklick: Den Block nach links drehen\n".. - " - Rechtsklick: Die sichtbare Seite des Blockes nach oben drehen\n".. - " - Shift+Linksklick: Ausrichtung des angeklickten Blockes speichern\n".. - " - Shift+Rechtsklick: Die gespeicherte Ausrichtung auf den angeklickten Block anwenden\n".. - "\n".. - "\n".. - "\n", - "Das TechAge Montagewerkzeug dient zum Entfernen und wieder Setzen von Techage Blöcken\\, ohne dass diese Blöcke ihre Blocknummer verlieren\\, bzw. beim Setzen eine neue Nummer zugeteilt bekommen. Dies ist bspw. bei Steinbrechern hilfreich\\, da diese oft umgesetzt werden müssen.\n".. - "\n".. - " - Linke Taste: Entfernen eines Blocks\n".. - " - Rechte Taste: Setzen eines Blocks\n".. - "\n".. - "Der Block\\, der zuvor mit dem Montagewerkzeug entfernt wurde und wieder gesetzt werden soll\\, muss sich im Spieler-Inventar ganz links befinden.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta3", - "", - "ta3_firebox", - "ta3_oilbox", - "ta3_boiler", - "ta3_turbine", - "ta3_generator", - "ta3_cooler", - "ta3_powerswitch", - "power_reduction", - "ta3_powercable", - "ta3_powerjunction", - "ta3_powerline", - "ta3_powerpole", - "ta3_powerpole4", - "ta3_powerpole2", - "ta3_powerswitch", - "ta3_powerswitchsmall", - "ta3_powerswitchbox", - "ta3_tinygenerator", - "ta3_akkublock", - "ta3_powerterminal", - "ta3_motor", - "", - "ta3_furnacefirebox", - "ta3_furnace", - "ta3_booster", - "", - "ta3_tank", - "ta3_pump", - "ta3_filler", - "ta3_pipe", - "ta3_pipe_wall_entry", - "ta3_valve", - "techage_ta3", - "ta3_oilexplorer", - "ta3_drillbox", - "ta3_pumpjack", - "ta3_drillbit", - "oiltank", - "", - "tank_cart", - "", - "tank_cart", - "chest_cart", - "techage_ta31", - "", - "reboiler", - "ta3_logic", - "ta3_button", - "ta3_command_converter", - "ta3_flipflop", - "ta3_logic", - "ta3_repeater", - "ta3_sequencer", - "ta3_timer", - "ta3_terminal", - "ta3_colorlamp", - "ta3_doorblock", - "ta3_doorcontroller", - "ta3_doorcontroller", - "ta3_soundblock", - "ta3_mesecons_converter", - "ta3_nodedetector", - "ta3_detector", - "ta3_cartdetector", - "ta3_nodedetector", - "ta3_playerdetector", - "ta3_lightdetector", - "ta3_grinder", - "ta3_pusher", - "ta3_distributor", - "ta3_autocrafter", - "ta3_electronicfab", - "ta3_quarry", - "ta3_gravelsieve", - "ta3_gravelrinser", - "ta3_grinder", - "ta3_injector", - "", - "ta3_end_wrench", - "ta3_programmer", - "ta3_trowel", - "ta3_drill_pipe_wrench", - "ta3_screwdriver", - "techage:assembly_tool", - }, - plans = { - "", - "coalpowerstation", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_furnace", - "", - "", - "", - "ta3_tank", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_loading", - "", - "", - "", - "ta3_distiller", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta3_EN.lua b/techage/doc/manual_ta3_EN.lua deleted file mode 100644 index e63e9c1..0000000 --- a/techage/doc/manual_ta3_EN.lua +++ /dev/null @@ -1,931 +0,0 @@ -return { - titles = { - "1,TA3: Oil Age", - "2,Coal-fired Power Station / Oil-fired Power Station", - "3,TA3 power station firebox", - "3,TA3 Power Station Oil Burner", - "3,TA3 boiler base / top", - "3,TA3 turbine", - "3,TA3 generator", - "3,TA3 cooler", - "2,Electrical current", - "3,Importance of storage systems", - "3,TA Electric Cable", - "3,TA Electric Junction Box", - "3,TA Power Line", - "3,TA Power Pole", - "3,TA Power Pole Top", - "3,TA Power Pole Top 2", - "3,TA Power Switch", - "3,TA Power Switch Small", - "3,TA Power Switch Box", - "3,TA3 Small Power Generator", - "3,TA3 Accu Block", - "3,TA3 Power Terminal", - "3,TA3 Electric Motor", - "2,TA3 Industrial Furnace", - "3,TA3 Furnace Oil Burner", - "3,TA3 Furnace Top", - "3,TA3 Booster", - "2,Liquids", - "3,TA3 Tank", - "3,TA3 Pump", - "3,TA Liquid Filler", - "3,TA4 Pipe", - "3,TA3 Pipe Wall Entry Blocks", - "3,TA Valve", - "2,Oil Production", - "3,TA3 Oil Explorer", - "3,TA3 Oil Drill Box", - "3,TA3 Oil Pumpjack", - "3,TA3 Drill Pipe", - "3,Oil tank", - "2,Oil Transportation", - "3,Oil transportation by Tank Carts", - "3,Oil transportation with barrels over Minecarts", - "3,Tank Cart", - "3,Chest Cart", - "2,Oil Processing", - "3,Distillation Tower", - "4,Reboiler", - "2,Logic / Switching Blocks", - "3,TA3 Button / Switch", - "3,TA3 Command Converter", - "3,TA3 Flip-Flop", - "3,TA3 Logic Block", - "3,TA3 Repeater", - "3,TA3 Sequencer", - "3,TA3 Timer", - "3,TA3 Terminal", - "3,TechAge Color Lamp", - "3,Door/Gate Blocks", - "3,TA3 Door Controller", - "3,TA3 Door Controller II", - "3,TA3 Sound Block", - "3,TA3 Mesecons Converter", - "2,Detectors", - "3,TA3 Detector", - "3,TA3 Cart Detector", - "3,TA3 Node Detector", - "3,TA3 Player Detector", - "3,TA3 Light Detector", - "2,TA3 Machines", - "3,TA3 Pusher", - "3,TA3 Distributor", - "3,TA3 Autocrafter", - "3,TA3 Electronic Fab", - "3,TA3 Quarry", - "3,TA3 Gravel Sieve", - "3,TA3 Gravel Rinser", - "3,TA3 Grinder", - "3,TA3 Injector", - "2,Tools", - "3,Techage Info Tool", - "3,TechAge Programmer", - "3,TechAge Trowel / Trowel", - "3,TA3 drill pipe wrench", - "3,Techage Screwdriver", - "3,TechAge Assembly Tool", - }, - texts = { - "At TA3 it is important to replace the steam-powered machines with more powerful and electric-powered machines.\n".. - "\n".. - "To do this\\, you have to build coal-fired power plants and generators. You will soon see that your electricity needs can only be met with oil-powered power plants. So you go looking for oil. Drilling derricks and oil pumps help them get the oil. Railways are used to transport oil to the power plants.\n".. - "\n".. - "The industrial age is at its peak.\n".. - "\n".. - "\n".. - "\n", - "The coal-fired power plant consists of several blocks and must be assembled as shown in the plan on the right. The blocks TA3 power station fire box\\, TA3 boiler top\\, TA3 boiler base\\, TA3 turbine\\, TA3 generator and TA3 cooler are required.\n".. - "\n".. - "The boiler must be filled with water. Fill up to 10 buckets of water in the boiler.\n".. - "The fire box must be filled with coal or charcoal.\n".. - "When the water is hot\\, the generator can then be started.\n".. - "\n".. - "Alternatively\\, the power plant can be equipped with an oil burner and then operated with oil.\n".. - "The oil can be refilled using a pump and oil pipe.\n".. - "\n".. - "The power plant delivers an output of 80 ku.\n".. - "\n".. - "\n".. - "\n", - "Part of the power plant.\n".. - "The fire box must be filled with coal or charcoal. The burning time depends on the power that is requested by the power plant. Coal burns for 20 s and charcoal for 60 s under full load. Correspondingly longer under partial load (50% load = double time).\n".. - "\n".. - "\n".. - "\n", - "Part of the power plant.\n".. - "\n".. - "The oil burner can be filled with crude oil\\, fuel oil\\, naphtha or gasoline. The burning time depends on the power that is requested by the power plant. Under full load\\, crude oil burns 15 s\\, fuel oil 20 s\\, naphtha 22 s and gasoline 25 s.\n".. - "\n".. - "Correspondingly longer under partial load (50% load = double time).\n".. - "\n".. - "The oil burner can only hold 50 units of fuel. An additional oil tank and an oil pump are therefore advisable.\n".. - "\n".. - "\n".. - "\n", - "Part of the power plant. Must be filled with water. If there is no more water or the temperature drops too low\\, the power plant switches off.\n".. - "\n".. - "The water consumption of the TA3 boiler is much lower than that of the steam engine due to the closed steam circuit.\n".. - "With the steam engine\\, some water is lost as steam with each piston stroke.\n".. - "\n".. - "\n".. - "\n", - "The turbine is part of the power plant. It must be placed next to the generator and connected to the boiler and cooler via steam pipes as shown in the plan.\n".. - "\n".. - "\n".. - "\n", - "The generator is used to generate electricity. It must be connected to the machines via power cables and junction boxes.\n".. - "\n".. - "\n".. - "\n", - "Used to cool the hot steam from the turbine. Must be connected to the boiler and turbine via steam pipes as shown in the plan.\n".. - "\n".. - "\n".. - "\n", - "In TA3 (and TA4) the machines are powered by electricity. To do this\\, machines\\, storage systems\\, and generators must be connected with power cables.\n".. - "TA3 has 2 types of power cables:\n".. - "\n".. - " - Insulated cables (TA power cables) for local wiring in the floor or in buildings. These cables can be hidden in the wall or in the floor (can be \"plastered\" with the trowel).\n".. - " - Overland lines (TA power line) for outdoor cabling over long distances. These cables are protected and cannot be removed by other players.\n".. - "\n".. - "Several consumers\\, storage systems\\, and generators can be operated together in a power network. Networks can be set up with the help of the junction boxes.\n".. - "If too little electricity is provided\\, consumers run out.\n".. - "In this context\\, it is also important that the functionality of Forceload blocks is understood\\, because generators\\, for example\\, only supply electricity when the corresponding map block is loaded. This can be enforced with a forceload block.\n".. - "\n".. - "In TA4 there is also a cable for the solar system.\n".. - "\n".. - "\n".. - "\n", - "Storage systems in the power grid fulfill two tasks:\n".. - "\n".. - " - To cope with peaks in demand: All generators always deliver just as much power as is needed. However\\, if consumers are switched on/off or there are fluctuations in demand for other reasons\\, consumers can fail for a short time. To prevent this\\, there should always be at least one battery block in every network. This serves as a buffer and compensates for these fluctuations in the seconds range.\n".. - " - To store regenerative energy: Solar and wind are not available 24 hours a day. So that the power supply does not fail when no electricity is produced\\, one or more storage systems must be installed in the network. Alternatively\\, the gaps can also be bridged with oil/coal electricity.\n".. - "\n".. - "A storage system indicates its capacity in kud\\, i.e. ku per day. For example\\, a storage system with 100 kud delivers 100 ku for one game day\\, or 10 ku for 10 game days.\n".. - "\n".. - "All TA3/TA4 energy sources have adjustable charging characteristics. By default this is set to \"80% - 100%\". This means that when the storage system is 80% full\\, the output is reduced further and further until it switches off completely at 100%. If electricity is required in the network\\, 100% will never be reached\\, since the power of the generator has at some point dropped to the electricity demand in the network and the storage system is no longer charged\\, but only the consumers are served.\n".. - "\n".. - "This has several advantages:\n".. - "\n".. - " - The charging characteristics are adjustable. This means\\, for example\\, that oil/coal energy sources can be reduced at 60% and regenerative energy sources only at 80%. This means that oil/coal is only burned if there are not enough renewable energy sources available.\n".. - " - Several energy sources can be operated in parallel and are loaded almost evenly\\, because all energy sources work\\, for example\\, up to 80% of the storage system's charging capacity at their full capacity and then reduce their capacity at the same time.\n".. - " - All storage systems in a network form a large buffer. The charging capacity and the filling level of the entire storage system can always be read in percent on every storage system\\, but also on the electricity terminal.\n".. - "\n".. - " \n".. - "\n", - "For local wiring in the floor or in buildings.\n".. - "Branches can be realized using junction boxes. The maximum cable length between machines or junction boxes is 1000 m. A maximum of 1000 nodes can be connected in a power network. All blocks with power connection\\, including junction boxes\\, count as nodes.\n".. - "\n".. - "Since the power cables are not automatically protected\\, the land lines (TA power line) are recommended for longer distances.\n".. - "\n".. - "Power cables can be plastered with the trowel so they can be hidden in the wall or in the floor. All stone\\, clay and other blocks without \"intelligence\" can be used as plastering material. Dirt does not work because dirt can be converted to grass or the like\\, which would destroy the line.\n".. - "\n".. - "For plastering\\, the cable must be clicked on with the trowel. The material with which the cable is to be plastered must be on the far left in the player inventory.\n".. - "The cables can be made visible again by clicking on the block with the trowel.\n".. - "\n".. - "In addition to cables\\, the TA junction box and the TA power switch box can also be plastered.\n".. - "\n".. - "\n".. - "\n", - "With the junction box\\, electricity can be distributed in up to 6 directions. Junction boxes can also be plastered (hidden) with a trowel and made visible again.\n".. - "\n".. - "\n".. - "\n", - "With the TA power line and the electricity poles\\, reasonably realistic overhead lines can be realized. The power pole heads also serve to protect the power line (protection). A pole must be set every 16 m or less. The protection only applies to the power line and the poles\\, however\\, all other blocks in this area are not protected.\n".. - "\n".. - "\n".. - "\n", - "Used to build electricity poles. Is protected from destruction by the electricity pole head and can only be removed by the owner.\n".. - "\n".. - "\n".. - "\n", - "Has up to four arms and thus allows electricity to be distributed in up to 6 directions.\n".. - "The electricity pole head protects power lines and poles within a radius of 8 m.\n".. - "\n".. - "\n".. - "\n", - "This electricity pole head has two fixed arms and is used for the overhead lines. However\\, it can also transmit current downwards and upwards.\n".. - "The electricity pole head protects power lines and poles within a radius of 8 m.\n".. - "\n".. - "\n".. - "\n", - "The switch can be used to switch the power on and off. To do this\\, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides.\n".. - "\n".. - "\n".. - "\n", - "The switch can be used to switch the power on and off. To do this\\, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides.\n".. - "\n".. - "\n".. - "\n", - "see TA power switch.\n".. - "\n".. - "\n".. - "\n", - "The small power generator runs on gasoline and can be used for small consumers with up to 12 ku. Gasoline burns for 150 s under full load. Correspondingly longer under partial load (50% load = double time).\n".. - "\n".. - "The power generator can only hold 50 units of gasoline. An additional tank and a pump are therefore advisable.\n".. - "\n".. - "\n".. - "\n", - "The accu block (rechargeable battery) is used to store excess energy and automatically delivers power in the event of a power failure (if available).\n".. - "Several accu blocks together form a TA3 energy storage system. Each accu block has a display for the charging state and for the stored load.\n".. - "The values for the entire network are always displayed here. The stored load is displayed in \"kud\" or \"ku-days\" (analogous to kWh) 5 kud thus corresponds\\, for example\\, to 5 ku for a game day (20 min) or 1 ku for 5 game days.\n".. - "\n".. - "A accu block has 3.33 kud\n".. - "\n".. - "\n".. - "\n", - "The power terminal must be connected to the power grid. It shows data from the power grid.\n".. - "\n".. - "The most important figures are displayed in the upper half:\n".. - "\n".. - " - current/maximum generator power\n".. - " - current power consumption of all consumers\n".. - " - current charging current in/from the storage system\n".. - " - Current state of charge of the storage system in percent\n".. - "\n".. - "The number of network blocks is output in the lower half.\n".. - "\n".. - "Additional data on the generators and storage systems can be queried via the \"console\" tab.\n".. - "\n".. - "\n".. - "\n", - "The TA3 Electric Motor is required in order to be able to operate TA2 machines via the power grid. The TA3 Electric Motor converts electricity into axle power.\n".. - "If the electric motor is not supplied with sufficient power\\, it goes into an fault state and must be reactivated with a right-click.\n".. - "\n".. - "The electric motor takes max. 40 ku of electricity and provides on the other side max. 39 ku as axle power. So he consumes one ku for the conversion.\n".. - "\n".. - "\n".. - "\n", - "The TA3 industrial furnace serves as a supplement to normal furnaces. This means that all goods can be produced with \"cooking\" recipes\\, even in an industrial furnace. But there are also special recipes that can only be made in an industrial furnace.\n".. - "The industrial furnace has its own menu for recipe selection. Depending on the goods in the industrial furnace inventory on the left\\, the output product can be selected on the right.\n".. - "\n".. - "The industrial furnace requires electricity (for the booster) and fuel oil / gasoline for the burner. The industrial furnace must be assembled as shown in the plan on the right.\n".. - "\n".. - "See also TA4 heater.\n".. - "\n".. - "\n".. - "\n", - "Is part of the TA3 industrial furnace.\n".. - "\n".. - "The oil burner can be operated with crude oil\\, fuel oil\\, naphtha or gasoline. The burning time is 64 s for crude oil\\, 80 s for fuel oil\\, 90 s for naphtha and 100 s for gasoline.\n".. - "\n".. - "The oil burner can only hold 50 units of fuel. An additional tank and a pump are therefore advisable.\n".. - "\n".. - "\n".. - "\n", - "Is part of the TA3 industrial furnace. See TA3 industrial furnace.\n".. - "\n".. - "\n".. - "\n", - "Is part of the TA3 industrial furnace. See TA3 industrial furnace.\n".. - "\n".. - "\n".. - "\n", - "Liquids such as water or oil can only be pumped through the special pipes and stored in tanks. As with water\\, there are containers (canisters\\, barrels) in which the liquid can be stored and transported.\n".. - "\n".. - "It is also possible to connect several tanks using the yellow pipes and connectors. However\\, the tanks must have the same content and there must always be at least one yellow pipe between the tank\\, pump and distributor pipe.\n".. - "\n".. - "E.g. It is not possible to connect two tanks directly to a distributor pipe.\n".. - "\n".. - "The liquid filler is used to transfer liquids from containers to tanks. The plan shows how canisters or barrels with liquids are pushed into a liquid filler via pushers. The container is emptied in the liquid filler and the liquid is led down into the tank.\n".. - "\n".. - "The liquid filler can also be placed under a tank to empty the tank.\n".. - "\n".. - "\n".. - "\n", - "Liquids can be stored in a tank. A tank can be filled or emptied using a pump. To do this\\, the pump must be connected to the tank via a pipe (yellow pipes).\n".. - "\n".. - "A tank can also be filled or emptied manually by clicking on the tank with a full or empty liquid container (barrel\\, canister). It should be noted that barrels can only be completely filled or emptied. If\\, for example\\, there are less than 10 units in the tank\\, this remainder must be removed with canisters or pumped empty.\n".. - "\n".. - "A TA3 tank can hold 1000 units or 100 barrels of liquid.\n".. - "\n".. - "\n".. - "\n", - "The pump can be used to pump liquids from tanks or containers to other tanks or containers. The pump direction (arrow) must be observed for the pump. The yellow lines and connectors also make it possible to arrange several tanks on each side of the pump. However\\, the tanks must have the same content.\n".. - "\n".. - "The TA3 pump pumps 4 units of liquid every two seconds.\n".. - "\n".. - "Note 1: The pump must not be placed directly next to the tank. There must always be at least a piece of yellow pipe between them.\n".. - "\n".. - "\n".. - "\n", - "The liquid filler is used to transfer liquids between containers and tanks.\n".. - "\n".. - " - If the liquid filler is placed under a tank and empty barrels are put into the liquid filler with a pusher or by hand\\, the contents of the tank are transferred to the barrels and the barrels can be removed from the outlet\n".. - " - If the liquid filler is placed on a tank and if full containers are put into the liquid filler with a pusher or by hand\\, the content is transferred to the tank and the empty containers can be removed on the exit side\n".. - "\n".. - "It should be noted that barrels can only be completely filled or emptied. If\\, for example\\, there are less than 10 units in the tank\\, this remainder must be removed with canisters or pumped empty.\n".. - "\n".. - "\n".. - "\n", - "The yellow pipes are used for the transmission of gas and liquids.\n".. - "The maximum pipe length is 100 m.\n".. - "\n".. - "\n".. - "\n", - "The blocks serve as wall openings for tubes\\, so that no holes remain open.\n".. - "\n".. - "\n".. - "\n", - "There is a valve for the yellow pipes\\, which can be opened and closed with a click of the mouse.\n".. - "The valve can also be controlled via on/off commands.\n".. - "\n".. - "\n".. - "\n", - "In order to run your generators and stoves with oil\\, you must first look for oil and build a derrick and then extract the oil.\n".. - "TA3 oil explorer\\, TA3 oil drilling box and TA3 pump jack are used for this.\n".. - "\n".. - "\n".. - "\n", - "You can search for oil with the oil explorer. To do this\\, place the block on the floor and right-click to start the search. The oil explorer can be used above ground and underground at all depths.\n".. - "The chat output shows you the depth to which oil was searched and how much oil (petroleum) was found.\n".. - "You can click the block multiple times to search for oil in deeper areas. Oil fields range in size from 4\\,000 to 20\\,000 items.\n".. - "\n".. - "If the search was unsuccessful\\, you have to move the block approx. 16 m further.\n".. - "The oil explorer always searches for oil in the whole map block and below\\, in which it was set. A new search in the same map block (16x16 field) therefore makes no sense.\n".. - "\n".. - "If oil is found\\, the location for the derrick is displayed. You have to erect the derrick within the area shown\\, it is best to mark the spot with a sign and protect the entire area against foreign players.\n".. - "\n".. - "Don't give up looking for oil too quickly. If you're unlucky\\, it can take a long time to find an oil well.\n".. - "It also makes no sense to search an area that another player has already searched. The chance of finding oil anywhere is the same for all players.\n".. - "\n".. - "The oil explorer can always be used to search for oil.\n".. - "\n".. - "\n".. - "\n", - "The oil drill box must be placed in the position indicated by the oil explorer. Drilling for oil elsewhere is pointless.\n".. - "If the button on the oil drilling box is clicked\\, the derrick is erected above the box. This takes a few seconds.\n".. - "The oil drilling box has 4 sides\\, at IN the drill pipe has to be delivered via pusher and at OUT the drilling material has to be removed. The oil drilling box must be supplied with power via one of the other two sides.\n".. - "\n".. - "The oil drilling box drills to the oil field (1 meter in 16 s) and requires 16 ku of electricity.\n".. - "Once the oil field has been reached\\, the derrick can be dismantled and the box removed.\n".. - "\n".. - "\n".. - "\n", - "The oil pump (pump-jack) must now be placed in the place of the oil drilling box. The oil pump also requires electricity (16 ku) and supplies one unit of oil every 8 s. The oil must be collected in a tank. To do this\\, the oil pump must be connected to the tank via yellow pipes.\n".. - "Once all the oil has been pumped out\\, the oil pump can also be removed.\n".. - "\n".. - "\n".. - "\n", - "The drill pipe is required for drilling. As many drill pipe items are required as the depth specified for the oil field. The drill pipe is useless after drilling\\, but it also cannot be dismantled and remains in the ground. However\\, there is a tool to remove the drill pipe blocks (-> Tools -> TA3 drill pipe pliers).\n".. - "\n".. - "\n".. - "\n", - "The oil tank is the large version of the TA3 tank (see liquids -> TA3 tank).\n".. - "\n".. - "The large tank can hold 4000 units of oil\\, but also any other type of liquid.\n".. - "\n".. - "\n".. - "\n", - "", - "Tank carts can be used to transport oil from the oil well to the oil processing plant. A tank cart can be filled or emptied directly using pumps. In both cases\\, the yellow pipes must be connected to the tank cart from above.\n".. - "\n".. - "The following steps are necessary:\n".. - "\n".. - " - Place the tank cart in front of the rail bumper block. The bumper block must not yet be programmed with a time so that the tank cart does not start automatically\n".. - " - Connect the tank cart to the pump using yellow pipes\n".. - " - Switch on the pump\n".. - " - Program the bumper with a time (10 - 20 s)\n".. - "\n".. - "This sequence must be observed on both sides (fill / empty).\n".. - "\n".. - "\n".. - "\n", - "Canisters and barrels can be loaded into the Minecarts. To do this\\, the oil must first be transferred to barrels. The oil barrels can be pushed directly into the Minecart with a pusher and tubes (see map). The empty barrels\\, which come back from the unloading station by Minecart\\, can be unloaded using a hopper\\, which is placed under the rail at the stop.\n".. - "\n".. - "It is not possible with the hopper to both *unload the empty barrels and load the full barrels at a stop*. The hopper immediately unloads the full barrels. It is therefore advisable to set up 2 stations on the loading and unloading side and then program the Minecart accordingly using a recording run.\n".. - "\n".. - "The plan shows how the oil can be pumped into a tank and filled into barrels via a liquid filler and loaded into Minecarts.\n".. - "\n".. - "For the Minecarts to start again automatically\\, the bumper blocks must be configured with the station name and waiting time. 5 s are sufficient for unloading. However\\, since the pushers always go into standby for several seconds when there is no Minecart\\, a time of 15 or more seconds must be entered for loading.\n".. - "\n".. - "\n".. - "\n", - "The tank truck is used to transport liquids. Like tanks\\, it can be filled with pumps or emptied. In both cases\\, the yellow tube must be connected to the tank truck from above.\n".. - "\n".. - "200 units fit in the tank truck.\n".. - "\n".. - "\n".. - "\n", - "The chest cart is used to transport items. Like chests\\, it can be filled or emptied using a pusher.\n".. - "\n".. - "4 stacks fit in the chest cart.\n".. - "\n".. - "\n".. - "\n", - "Oil is a mixture of substances and consists of many components. The oil can be broken down into its main components such as bitumen\\, fuel oil\\, naphtha\\, gasoline and propane gas via a distillation tower.\n".. - "Further processing to end products takes place in the chemical reactor.\n".. - "\n".. - "\n".. - "\n", - "The distillation tower must be set up as in the plan at the top right.\n".. - "The bitumen is drained off via the base block. The exit is on the back of the base block (note the direction of the arrow).\n".. - "The \"distillation tower\" blocks with the numbers: 1\\, 2\\, 3\\, 2\\, 3\\, 2\\, 3\\, 4 are placed on this basic block\n".. - "Fuel oil\\, naphtha and gasoline are drained from the openings from bottom to top. The propane gas is caught at the top.\n".. - "All openings on the tower must be connected to tanks.\n".. - "The reboiler must be connected to the \"distillation tower 1\" block.\n".. - "\n".. - "The reboiler needs electricity (not shown in the plan)!\n".. - "\n".. - "\n".. - "\n", - "The reboiler heats the oil to approx. 400 ° C. It largely evaporates and is fed into the distillation tower for cooling.\n".. - "\n".. - "The reboiler requires 14 units of electricity and produces one unit of bitumen\\, fuel oil\\, naphtha\\, gasoline and propane every 16 s.\n".. - "To do this\\, the reboiler must be supplied with oil via a pump.\n".. - "\n".. - "\n".. - "\n", - "In addition to the tubes for goods transport\\, as well as the gas and power pipes\\, there is also a wireless communication level through which blocks can exchange data with each other. No lines have to be drawn for this\\, the connection between transmitter and receiver is only made via the block number. \n".. - "\n".. - "*Info:* A block number is a unique number that is generated by Techage when many Techage blocks are placed. The block number is used for addressing during communication between Techage controllers and machines. All blocks that can participate in this communication show the block number as info text if you fix the block with the mouse cursor.\n".. - "\n".. - "Which commands a block supports can be read out and displayed with the TechAge Info Tool (wrench).\n".. - "The simplest commands supported by almost all blocks are:\n".. - "\n".. - " - 'on' - to turn on block / machine / lamp\n".. - " - 'off' - to turn off the block / machine / lamp\n".. - "\n".. - "With the help of the TA3 Terminal\\, these commands can be tried out very easily. Suppose a signal lamp is number 123.\n".. - "Then with:\n".. - "\n".. - " cmd 123 on\n".. - "\n".. - "the lamp can be turned on and with:\n".. - "\n".. - " cmd 123 off\n".. - "\n".. - "the lamp can be turned off again. These commands must be entered in the input field of the TA3 terminal.\n".. - "\n".. - "Commands such as 'on' and'off' are sent to the recipient without a response coming back. These commands can therefore be sent to several receivers at the same time\\, for example with a push button / switch\\, if several numbers are entered in the input field.\n".. - "\n".. - "A command like 'state' requests the status of a block. The block then sends its status back. This type of confirmed command can only be sent to one recipient at a time.\n".. - "This command can also be tested with the TA3 terminal on a pusher\\, for example:\n".. - "\n".. - " cmd 123 state\n".. - "\n".. - "Possible responses from the pusher are:\n".. - "\n".. - " - 'running' -> I'm working\n".. - " - 'stopped' -> switched off\n".. - " - 'standby' -> nothing to do because source inventory is empty\n".. - " - 'blocked' -> can't do anything because target inventory is full\n".. - "\n".. - "This status and other information is also output when the wrench is clicked on the block.\n".. - "\n".. - "\n".. - "\n", - "The button/switch sends 'on' / 'off' commands to the blocks that have been configured via the numbers.\n".. - "The button/switch can be configured as a button or a switch. If it is configured as a button\\, the time between the 'on' and 'off' commands can be set. With the operating mode \"on button\" only an 'on' and no 'off' command is sent.\n".. - "\n".. - "The checkbox \"public\" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set).\n".. - "\n".. - "Note: With the programmer\\, block numbers can be easily collected and configured.\n".. - "\n".. - "\n".. - "\n", - "With the TA3 command converter\\, 'on' / 'off' commands can be converted into other commands\\, and forwarding can be prevented or delayed.\n".. - "The number of the target block or the numbers of the target blocks\\, the commands to be sent and the delay times in seconds must be entered. If no command is entered\\, nothing is sent.\n".. - "\n".. - "The numbers can also be programmed using the Techage programmer.\n".. - "\n".. - "\n".. - "\n", - "The TA3 flip-flop changes its state with each received 'on' command. Received 'off' commands are ignored. Depending on the status change\\, 'on' / 'off' commands are sent alternately. The number of the target block or the numbers of the target blocks must be entered. The numbers can also be programmed using the Techage programmer.\n".. - "\n".. - "For example\\, lamps can be switched on and off with the help of buttons.\n".. - "\n".. - "\n".. - "\n", - "The TA3 logic block can be programmed in such a way that one or more input commands are linked to one output command and sent. This block can therefore replace various logic elements such as AND\\, OR\\, NOT\\, XOR etc. \n".. - "Input commands for the logic block are 'on' /'off' commands.\n".. - "Input commands are referenced via the number\\, e.g. '1234' for the command from the sender with the number 1234. \n".. - "The same applies to output commands.\n".. - "\n".. - "A rule is structured as follows: \n".. - "\n".. - " = on/off if is true\n".. - "\n".. - "'' is the block number to which the command should be sent.\n".. - "'' is a boolean expression where input numbers are evaluated.\n".. - "\n".. - "*Examples for the input expression*\n".. - "\n".. - "Negate signal (NOT):\n".. - "\n".. - " 1234 == off\n".. - "\n".. - "Logical AND:\n".. - "\n".. - " 1234 == on and 2345 == on\n".. - "\n".. - "Logical OR:\n".. - "\n".. - " 1234 == on or 2345 == on\n".. - "\n".. - "The following operators are allowed: 'and' 'or' 'on' 'off' 'me' '==' '~=' '(' ')'\n".. - "\n".. - "If the expression is true\\, a command is sent to the block with the '' number. \n".. - "Up to four rules can be defined\\, whereby all rules are always checked when a command is received. \n".. - "The internal processing time for all commands is 100 ms. \n".. - "\n".. - "Your own node number can be referenced using the keyword 'me'. This makes it possible for the block to send itself a command (flip-flop function). \n".. - "\n".. - "The blocking time defines a pause after a command\\, during which the logic block does not accept any further external commands. Commands received during the blocking period are thus discarded. The blocking time can be defined in seconds. \n".. - "\n".. - "\n".. - "\n", - "The repeater sends the received signal to all configured numbers.\n".. - "This can make sense\\, for example\\, if you want to control many blocks at the same time. The repeater can be configured with the programmer\\, which is not possible with all blocks.\n".. - "\n".. - "\n".. - "\n", - "The sequencer can send a series of 'on' / 'off' commands\\, whereby the interval between the commands must be specified in seconds. You can use it to make a lamp blink\\, for example.\n".. - "Up to 8 commands can be configured\\, each with target block number and pending the next command.\n".. - "The sequencer repeats the commands endlessly when \"Run endless\" is set.\n".. - "If nothing is selected\\, only the specified time in seconds is waited for.\n".. - "\n".. - "\n".. - "\n", - "The timer can send commands time-controlled. The time\\, the target number(s) and the command itself can be specified for each command line. This means that lamps can be switched on in the evening and switched off again in the morning.\n".. - "\n".. - "\n".. - "\n", - "The terminal is primarily used to test the command interface of other blocks (see \"Logic / switching blocks\").\n".. - "You can also assign commands to keys and use the terminal productively.\n".. - "\n".. - " set \n".. - "\n".. - "With 'set 1 ON cmd 123 on'\\, for example\\, user key 1 can be programmed with the command 'cmd 123 on'. If the key is pressed\\, the command is sent and the response is output on the screen.\n".. - "\n".. - "The terminal has the following local commands:\n".. - "\n".. - " - 'clear' clear screen\n".. - " - 'help' output a help page\n".. - " - 'pub' switch to public mode\n".. - " - 'priv' switch to private mode\n".. - "\n".. - "In private mode\\, the terminal can only be used by players who can build at this location\\, i.e. who have protection rights.\n".. - "\n".. - "In public mode\\, all players can use the preconfigured keys.\n".. - "\n".. - "\n".. - "\n", - "The signal lamp can be switched on or off with the 'on' / 'off' command. This lamp does not need electricity and can be colored with the airbrush tool from the mod Unified Dyes\" and via Lua/Beduino commands.\n".. - "\n".. - "With the chat command '/ta_color' the color palette with the values for the Lua/Beduino commands is displayed and with '/ta_send color ' the color can be changed.\n".. - "\n".. - "\n".. - "\n", - "With these blocks you can realize doors and gates that can be opened via commands (blocks disappear) and closed again. One door controller is required for each gate or door.\n".. - "\n".. - "The appearance of the blocks can be adjusted via the block menu.\n".. - "This makes it possible to realize secret doors that only open for certain players (with the help of the player detector).\n".. - "\n".. - "\n".. - "\n", - "The door controller is used to control the TA3 door/gate blocks. With the door controller\\, the numbers of the door/gate blocks must be entered. If an 'on' / 'off' command is sent to the door controller\\, this opens/closes the door or gate.\n".. - "\n".. - "\n".. - "\n", - "The Door Controller II can remove and set all types of blocks. To teach in the Door Controller II\\, the \"Record\" button must be pressed. Then all blocks that should be part of the door / gate must be clicked. Then the \"Done\" button must be pressed. Up to 16 blocks can be selected. The removed blocks are saved in the controller's inventory. The function of the controller can be tested manually using the \"Remove\" or \"Set\" buttons. If an 'on' /'off' command is sent to the Door Controller II\\, it removes or sets the blocks as well.\n".. - "\n".. - "With '$send_cmnd(node_number\\, \"exchange\"\\, 2)' individual blocks can be set\\, removed or replaced by other blocks from the inventory. \n".. - "\n".. - "With '$send_cmnd(node_number\\, \"set\"\\, 2)' a block from the inventory can be set explicitly\\, as long as the inventory slot is not empty.\n".. - "\n".. - "A block can be removed again with '$send_cmnd(node_number\\, \"dig\"\\, 2)' if the inventory slot is empty. \n".. - "\n".. - "The name of the set block is returned with '$send_cmnd(node_number\\, \"get\"\\, 2)'.\n".. - "\n".. - "The slot number of the inventory (1 .. 16) must be passed as payload in all three cases.\n".. - "\n".. - "This can also be used to simulate extendable stairs and the like. \n".. - "\n".. - "\n".. - "\n", - "Different sounds can be played with the sound block. All sounds of the Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack and Minetest Game are available.\n".. - "\n".. - "The sounds can be selected and played via the menu and via command.\n".. - "\n".. - " - Command 'on' to play a sound\n".. - " - Command 'sound ' to select a sound via the index\n".. - " - Command 'gain ' to adjust the volume via the '' value (1 to 5).\n".. - "\n".. - "\n".. - "\n", - "The Mesecons converter is used to convert Techage on/off commands into Mesecons signals and vice versa.\n".. - "To do this\\, one or more node numbers must be entered and the converter with Mesecons blocks\n".. - "has to be connected via Mesecons cables. The Mesecons converter can also be configured with the programmer.\n".. - "The Mesecons converter accepts up to 5 commands per second\\; it switches itself off at higher loads.\n".. - "\n".. - "*This node only exists if the mod mesecons is active!*\n".. - "\n".. - "\n".. - "\n", - "Detectors scan their surroundings and send an 'on' command when the search is recognized.\n".. - "\n".. - "\n".. - "\n", - "The detector is a special tube block that detects when items are passed on through the tube. To do this\\, it must be connected to tubes on both sides. If items are pushed into the detector with a pusher\\, they are automatically passed on.\n".. - "It sends an 'on' when an item is recognized\\, followed by an 'off' a second later.\n".. - "Then further commands are blocked for 8 seconds.\n".. - "The waiting time and the items that should trigger a command can be configured using the open-ended wrench menu. \n".. - "\n".. - "\n".. - "\n", - "The cart detector sends an 'on' command if it has recognized a cart (Minecart) directly in front of it. In addition\\, the detector can also restart the cart when an 'on' command is received.\n".. - "\n".. - "The detector can also be programmed with its own number. In this case\\, he pushes all the wagons that stop near him (one block in all directions).\n".. - "\n".. - "\n".. - "\n", - "The node detector sends an 'on' command if it detects that nodes (blocks) appear or disappear in front of it\\, but must be configured accordingly. After switching the detector back to the standard state (gray block)\\, an 'off' command is sent. Valid blocks are all types of blocks and plants\\, but not animals or players. The sensor range is 3 blocks / meter in the direction of the arrow.\n".. - "\n".. - "\n".. - "\n", - "The player detector sends an 'on' command if it detects a player within 4 m of the block. If the player leaves the area again\\, an 'off' command is sent.\n".. - "If the search should be limited to specific players\\, these player names can also be entered.\n".. - "\n".. - "\n".. - "\n", - "The light detector sends an 'on' command if the light level of the block above exceeds a certain level\\, which can be set through the right-click menu.\n".. - "If you have a TA4 Lua Controller\\, you can get the exact light level with $get_cmd(num\\, 'light_level')\n".. - "\n".. - "\n".. - "\n", - "TA3 has the same machines as TA2\\, only these are more powerful and require electricity instead of axis drive.\n".. - "Therefore\\, only the different technical data are given below.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 6 items every 2 s.\n".. - "\n".. - "\n".. - "\n", - "The function of the TA3 distributor corresponds to that of TA2.\n".. - "The processing power is 12 items every 4 s.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 2 items every 4 s. The autocrafter requires 6 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2\\, only TA4 WLAN chips are produced here.\n".. - "The processing power is one chip every 6 s. The block requires 12 ku of electricity for this.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The maximum depth is 40 meters. The quarry requires 12 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 2 items every 4 s. The block requires 4 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The probability is also the same as for TA2. The block also requires 3 ku of electricity.\n".. - "But in contrast to TA2\\, the status of the TA3 block can be read (controller)\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 2 items every 4 s. The block requires 6 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The injector is a TA3 pusher with special properties. It has a menu for configuration. Up to 8 items can be configured here. He only takes these items from a chest to pass them on to machines with recipes (autocrafter\\, industrial furnace and electronic fab).\n".. - "\n".. - "When passing on\\, only one position in the inventory is used in the target machine. If\\, for example\\, only the first three entries are configured in the injector\\, only the first three storage locations in the machine's inventory are used. So that an overflow in the machine inventory is prevented.\n".. - "\n".. - "The injector can also be switched to \"pull mode\". Then he only pulls items out of the chest from the positions that are defined in the configuration of the injector. In this case\\, item type and position must match. This allows to empty specific inventory entries of a chest. \n".. - "\n".. - "The processing power is up to 8 times one item every 4 seconds.\n".. - "\n".. - "\n".. - "\n", - "", - "The Techage Info Tool (open-ended wrench) has several functions. It shows the time\\, position\\, temperature and biome when an unknown block is clicked on.\n".. - "If you click on a TechAge block with command interface\\, all available data will be shown (see also \"Logic / switching blocks\").\n".. - "\n".. - "With Shift + right click an extended menu can be opened for some blocks. Depending on the block\\, further data can be called up or special settings can be made here. In the case of a generator\\, for example\\, the charging curve/switch-off can be programmed. \n".. - "\n".. - "\n".. - "\n", - "With the programmer\\, block numbers can be collected from several blocks with a right click and written into a block like a button / switch with a left click.\n".. - "If you click in the air\\, the internal memory is deleted.\n".. - "\n".. - "\n".. - "\n", - "The trowel is used for plastering power cables. See also \"TA power cable\".\n".. - "\n".. - "\n".. - "\n", - "This tool can be used to remove the drill pipe blocks if\\, for example\\, a tunnel is to pass through there.\n".. - "\n".. - "\n".. - "\n", - "The Techage Screwdriver serves as a replacement for the normal screwdriver. It has the following functions:\n".. - "\n".. - " - Left click: turn the block to the left\n".. - " - Right click: turn the visible side of the block upwards\n".. - " - Shift + left click: save the alignment of the clicked block\n".. - " - Shift + right click: apply the saved alignment to the clicked block\n".. - "\n".. - " \n".. - "\n", - "The TechAge Assembly Tool is used to remove and reposition Techage blocks without these blocks losing their block number or being assigned a new number when setting. This is helpful\\, for example\\, for quarries\\, as they often have to be moved.\n".. - "\n".. - " - Left button: Remove a block\n".. - " - Right button: Set a block\n".. - "\n".. - "The block that was previously removed with the assembly tool and is to be placed again must be on the far left of the player inventory.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta3", - "", - "ta3_firebox", - "ta3_oilbox", - "ta3_boiler", - "ta3_turbine", - "ta3_generator", - "ta3_cooler", - "ta3_powerswitch", - "power_reduction", - "ta3_powercable", - "ta3_powerjunction", - "ta3_powerline", - "ta3_powerpole", - "ta3_powerpole4", - "ta3_powerpole2", - "ta3_powerswitch", - "ta3_powerswitchsmall", - "ta3_powerswitchbox", - "ta3_tinygenerator", - "ta3_akkublock", - "ta3_powerterminal", - "ta3_motor", - "", - "ta3_furnacefirebox", - "ta3_furnace", - "ta3_booster", - "", - "ta3_tank", - "ta3_pump", - "ta3_filler", - "ta3_pipe", - "ta3_pipe_wall_entry", - "ta3_valve", - "techage_ta3", - "ta3_oilexplorer", - "ta3_drillbox", - "ta3_pumpjack", - "ta3_drillbit", - "oiltank", - "", - "", - "", - "", - "", - "techage_ta31", - "", - "reboiler", - "ta3_logic", - "ta3_button", - "ta3_command_converter", - "ta3_flipflop", - "ta3_logic", - "ta3_repeater", - "ta3_sequencer", - "ta3_timer", - "ta3_terminal", - "ta3_colorlamp", - "ta3_doorblock", - "ta3_doorcontroller", - "ta3_doorcontroller", - "ta3_soundblock", - "ta3_mesecons_converter", - "ta3_nodedetector", - "ta3_detector", - "ta3_cartdetector", - "ta3_nodedetector", - "ta3_playerdetector", - "ta3_lightdetector", - "ta3_grinder", - "ta3_pusher", - "ta3_distributor", - "ta3_autocrafter", - "ta3_electronicfab", - "ta3_quarry", - "ta3_gravelsieve", - "ta3_gravelrinser", - "ta3_grinder", - "ta3_injector", - "", - "ta3_end_wrench", - "ta3_programmer", - "ta3_trowel", - "ta3_drill_pipe_wrench", - "ta3_screwdriver", - "techage:assembly_tool", - }, - plans = { - "", - "coalpowerstation", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_furnace", - "", - "", - "", - "ta3_tank", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_loading", - "", - "", - "", - "ta3_distiller", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta3_RU.lua b/techage/doc/manual_ta3_RU.lua deleted file mode 100644 index ae1a46a..0000000 --- a/techage/doc/manual_ta3_RU.lua +++ /dev/null @@ -1,931 +0,0 @@ -return { - titles = { - "1,TA3: Эпоха нефти", - "2,Угольная электростанция / Нефтяная электростанция", - "3,TA3 топка электростанции", - "3,TA3 нефтяная топка электростанции", - "3,TA3 котел основание / навершие", - "3,TA3 турбина", - "3,TA3 генератор", - "3,TA3 охладитель", - "2,Электрический ток", - "3,Значимость хранилищ энергии", - "3,TA Электрический кабель", - "3,TA Электрическая распред.коробка", - "3,TA Электролиния", - "3,TA Электростолб", - "3,TA Электростолб навершие", - "3,TA Электростолб навершие 2", - "3,TA Электрический переключатель", - "3,TA Электрический переключатель малый", - "3,TA Электрощиток", - "3,TA3 Малый электрогенератор", - "3,TA3 Батарейный пакет", - "3,TA3 Электотерминал", - "3,TA3 Электромотор", - "2,TA3 Промышленная печь", - "3,TA3 Нефтяная печная топка", - "3,TA3 Печь навершие", - "3,TA3 Нагнетатель", - "2,Жидкости", - "3,TA3 Цистерна", - "3,TA3 Насос", - "3,TA Жидкостный нагнетатель", - "3,TA4 Труба", - "3,TA3 Трубно-стеновой проходной блок", - "3,TA Клапана", - "2,Нефтедобыча", - "3,TA3 Нефтеразведчик", - "3,TA3 Нефтяная буровая вышка", - "3,TA3 Скважинный насос", - "3,TA3 Буровая труба", - "3,Нефтяная цистерна", - "2,Транспортировка нефти", - "3,Транспортировка нефти железнодорожными цистернами", - "3,Транспортировка нефти бочками на вагонетках", - "3,Железнодорожная цистерна", - "3,Вагонетки-сундуки", - "2,Нефтепереработка", - "3,Ректификационная колонна", - "4,Ребойлер", - "2,Логика / Блоки-переключатели", - "3,TA3 Кнопка / Переключатель", - "3,TA3 Command Converter", - "3,TA3 Flip-Flop", - "3,TA3 Логический блок", - "3,TA3 Повторитель", - "3,TA3 Секвенсер", - "3,TA3 Таймер", - "3,TA3 Терминал", - "3,ТА цветная лампа", - "3,Блоки дверей/ворот", - "3,TA3 контроллер дверей", - "3,TA3 контроллер дверей II", - "3,TA3 Звуковой блок", - "3,TA3 Преобразователь месекон", - "2,Датчики", - "3,TA3 Датчик", - "3,TA3 Определитель вагонетки", - "3,TA3 Определитель блока", - "3,TA3 Определитель игрока", - "3,TA3 Определитель света", - "2,TA3 Машины", - "3,TA3 Толкатель", - "3,TA3 Распределитель", - "3,TA3 Автокрафтер", - "3,TA3 Электронная фабрика", - "3,TA3 Карьер", - "3,TA3 Гравийное сито", - "3,TA3 Гравийная мойка", - "3,TA3 Дробилка", - "3,TA3 Внедритель", - "2,Инструменты", - "3,ТА инфо-инструмент", - "3,ТА программатор", - "3,ТА шпатель / Шпатель", - "3,TA3 буротрубный ключ", - "3,ТА отвертка", - "3,TechAge Монтажный инструмент", - }, - texts = { - "В ТА3 происходит замещение паровых машин более мощными машинами с электроприводом.\n".. - "\n".. - "Для этого\\, нужно построить угольную электростанции и генераторы. Постепенно вы обнаружите, что потребности в электроэнергии могут быть покрыты только электростанциями на нефтепродуктах. Отправляемся на поиски нефти. Буровые вышки и нефтяные насосы выдадут нефть. Железные дороги будут использованы для доставки нефти на электростанции.\n".. - "\n".. - "Индустриальная эпоха в разгаре.\n".. - "\n".. - "\n".. - "\n", - "Угольная электростанция состоит из нескольких блоков и собирается как показано на чертеже справа. Требуемые блоки: ТА3 топка электростанции\\, TA3 навершие котла\\, TA3 основа котла\\, TA3 турбина\\, TA3 генератор и TA3 теплообменник.\n".. - "\n".. - "Котел нужно заполнить водой в количестве до 10 ведер. Клик левой кнопкой мыши ведром на котел.\n".. - "Топку нужно заполнить углем или ТА древесным углем. Прим. переводчика: Древесный уголь из других модов не подходит!\n".. - "Как только вода вскипит\\, генератор можно запускать.\n".. - "\n".. - "Альтернативная топка\\, которой заменить угольную - нефтяная.\n".. - "Нефть можно подавать в топку с помощью насоса и нефтяной трубы.\n".. - "\n".. - "Электростанция выдает мощность до 80 ku.\n".. - "\n".. - "\n".. - "\n", - "Часть электростанции.\n".. - "Топку нужно заполнить углем или ТА древесным углем. Длительность горения зависит от мощности потребителей электростанции. Уголь сгорает 20 секунд, древесный уголь 60 секунд под полной нагрузкой. Под частичной загрузкой пропорционально дольше (50% нагрузка = вдвое дольше).\n".. - "\n".. - "\n".. - "\n", - "Часть электростанции.\n".. - "\n".. - "Нефтяная топка может быть наполнена сырой нефтью\\, печным топливом\\, нафтой или бензином. Длительность горения зависит от мощности потребителей электростанции. Под полной нагрузкой\\, сырая нефть сгорает 15 секунд\\, печное топливо 20 секунд\\, нафта 22 секунды и бензин 25 секунд\n".. - "\n".. - "Под частичной загрузкой пропорционально дольше (50% нагрузка = вдвое дольше).\n".. - "\n".. - "Нефтяная топка вмещает только 50 единиц топлива. Поэтому рекомендуется дополнительный топливный бак и насос.\n".. - "\n".. - "\n".. - "\n", - "Часть электростанции. Нужно заполнять водой. Если воды больше нет или температура снизилась\\, электростанция отключится.\n".. - "\n".. - "Расход воды в котле TA3 намного меньше, чем в паровом двигателе, благодаря замкнутому паровому контуру.\n".. - "В паровом двигателе\\, часть воды теряется в виде пара при каждом ходе поршня.\n".. - "\n".. - "\n".. - "\n", - "Турбина - часть электростанции. Должна быть размещена рядом с генератором и соединена с котлом и теплообменником паровыми трубами, как показано на чертеже.\n".. - "\n".. - "\n".. - "\n", - "Генератор использутся для выработки электричества. Должен быть соединен с машинами-потребителями электропроводами и электрораспределительными коробками.\n".. - "\n".. - "\n".. - "\n", - "Нужен для охлаждения пара выходящего из турбины. Должен быть присоединен к котлу и к турбине паровыми трубами, как показано на чертеже.\n".. - "\n".. - "\n".. - "\n", - "В ТА3 (и ТА4) машины приводятся в движение электричеством. Для этого\\, машины\\, хранилища\\, и генераторы должны быть соединены силовыми кабелями.\n".. - "В ТА3 есть 2 типа силовых кабелей:\n".. - "\n".. - " - Изолированные кабели (ТА силовые кабели) для местной проводки на этажах зданий. Эти кабели можно прятать внутрь строительных блоков - заштукатуривать \"plastered\" шпателем.\n".. - " - Магистральные линии (ТА силовые линии) для уличной проводки на дальние дистанции. Эти кабели защищены и не могут быть удалены другими игроками.\n".. - "\n".. - "Несколько потребителей\\, хранилищ\\, и генераторов могут работать совместно в силовой сети. Сети настраиваются распределительными коробками.\n".. - "Если поступает недостаточно электричества\\, потребители начинают отключаться.\n".. - "В такой ситуации\\, важно понимать принцип действия Блока принудительной загрузки\\, поскольку генераторы\\, например\\, поставляют электричество только когда чанк их размещения загружен. Загрузку можно гарантировать размещением БлокаПЗ.\n".. - "\n".. - "In TA4 there is also a cable for the solar system.\n".. - "\n".. - "\n".. - "\n", - "Storage systems in the power grid fulfill two tasks:\n".. - "\n".. - " - To cope with peaks in demand: All generators always deliver just as much power as is needed. However\\, if consumers are switched on/off or there are fluctuations in demand for other reasons\\, consumers can fail for a short time. To prevent this\\, there should always be at least one battery block in every network. This serves as a buffer and compensates for these fluctuations in the seconds range.\n".. - " - To store regenerative energy: Solar and wind are not available 24 hours a day. So that the power supply does not fail when no electricity is produced\\, one or more storage systems must be installed in the network. Alternatively\\, the gaps can also be bridged with oil/coal electricity.\n".. - "\n".. - "A storage system indicates its capacity in kud\\, i.e. ku per day. For example\\, a storage system with 100 kud delivers 100 ku for one game day\\, or 10 ku for 10 game days.\n".. - "\n".. - "All TA3/TA4 energy sources have adjustable charging characteristics. By default this is set to \"80% - 100%\". This means that when the storage system is 80% full\\, the output is reduced further and further until it switches off completely at 100%. If electricity is required in the network\\, 100% will never be reached\\, since the power of the generator has at some point dropped to the electricity demand in the network and the storage system is no longer charged\\, but only the consumers are served.\n".. - "\n".. - "This has several advantages:\n".. - "\n".. - " - The charging characteristics are adjustable. This means\\, for example\\, that oil/coal energy sources can be reduced at 60% and regenerative energy sources only at 80%. This means that oil/coal is only burned if there are not enough renewable energy sources available.\n".. - " - Several energy sources can be operated in parallel and are loaded almost evenly\\, because all energy sources work\\, for example\\, up to 80% of the storage system's charging capacity at their full capacity and then reduce their capacity at the same time.\n".. - " - All storage systems in a network form a large buffer. The charging capacity and the filling level of the entire storage system can always be read in percent on every storage system\\, but also on the electricity terminal.\n".. - "\n".. - " \n".. - "\n", - "For local wiring in the floor or in buildings.\n".. - "Branches can be realized using junction boxes. The maximum cable length between machines or junction boxes is 1000 m. A maximum of 1000 nodes can be connected in a power network. All blocks with power connection\\, including junction boxes\\, count as nodes.\n".. - "\n".. - "Since the power cables are not automatically protected\\, the land lines (TA power line) are recommended for longer distances.\n".. - "\n".. - "Power cables can be plastered with the trowel so they can be hidden in the wall or in the floor. All stone\\, clay and other blocks without \"intelligence\" can be used as plastering material. Dirt does not work because dirt can be converted to grass or the like\\, which would destroy the line.\n".. - "\n".. - "For plastering\\, the cable must be clicked on with the trowel. The material with which the cable is to be plastered must be on the far left in the player inventory.\n".. - "The cables can be made visible again by clicking on the block with the trowel.\n".. - "\n".. - "In addition to cables\\, the TA junction box and the TA power switch box can also be plastered.\n".. - "\n".. - "\n".. - "\n", - "With the junction box\\, electricity can be distributed in up to 6 directions. Junction boxes can also be plastered (hidden) with a trowel and made visible again.\n".. - "\n".. - "\n".. - "\n", - "With the TA power line and the electricity poles\\, reasonably realistic overhead lines can be realized. The power pole heads also serve to protect the power line (protection). A pole must be set every 16 m or less. The protection only applies to the power line and the poles\\, however\\, all other blocks in this area are not protected.\n".. - "\n".. - "\n".. - "\n", - "Used to build electricity poles. Is protected from destruction by the electricity pole head and can only be removed by the owner.\n".. - "\n".. - "\n".. - "\n", - "Has up to four arms and thus allows electricity to be distributed in up to 6 directions.\n".. - "The electricity pole head protects power lines and poles within a radius of 8 m.\n".. - "\n".. - "\n".. - "\n", - "This electricity pole head has two fixed arms and is used for the overhead lines. However\\, it can also transmit current downwards and upwards.\n".. - "The electricity pole head protects power lines and poles within a radius of 8 m.\n".. - "\n".. - "\n".. - "\n", - "The switch can be used to switch the power on and off. To do this\\, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides.\n".. - "\n".. - "\n".. - "\n", - "The switch can be used to switch the power on and off. To do this\\, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides.\n".. - "\n".. - "\n".. - "\n", - "see TA power switch.\n".. - "\n".. - "\n".. - "\n", - "The small power generator runs on gasoline and can be used for small consumers with up to 12 ku. Gasoline burns for 150 s under full load. Correspondingly longer under partial load (50% load = double time).\n".. - "\n".. - "The power generator can only hold 50 units of gasoline. An additional tank and a pump are therefore advisable.\n".. - "\n".. - "\n".. - "\n", - "The accu block (rechargeable battery) is used to store excess energy and automatically delivers power in the event of a power failure (if available).\n".. - "Several accu blocks together form a TA3 energy storage system. Each accu block has a display for the charging state and for the stored load.\n".. - "The values for the entire network are always displayed here. The stored load is displayed in \"kud\" or \"ku-days\" (analogous to kWh) 5 kud thus corresponds\\, for example\\, to 5 ku for a game day (20 min) or 1 ku for 5 game days.\n".. - "\n".. - "A accu block has 3.33 kud\n".. - "\n".. - "\n".. - "\n", - "The power terminal must be connected to the power grid. It shows data from the power grid.\n".. - "\n".. - "The most important figures are displayed in the upper half:\n".. - "\n".. - " - current/maximum generator power\n".. - " - current power consumption of all consumers\n".. - " - current charging current in/from the storage system\n".. - " - Current state of charge of the storage system in percent\n".. - "\n".. - "The number of network blocks is output in the lower half.\n".. - "\n".. - "Additional data on the generators and storage systems can be queried via the \"console\" tab.\n".. - "\n".. - "\n".. - "\n", - "The TA3 Electric Motor is required in order to be able to operate TA2 machines via the power grid. The TA3 Electric Motor converts electricity into axle power.\n".. - "If the electric motor is not supplied with sufficient power\\, it goes into an fault state and must be reactivated with a right-click.\n".. - "\n".. - "The electric motor takes max. 40 ku of electricity and provides on the other side max. 39 ku as axle power. So he consumes one ku for the conversion.\n".. - "\n".. - "\n".. - "\n", - "The TA3 industrial furnace serves as a supplement to normal furnaces. This means that all goods can be produced with \"cooking\" recipes\\, even in an industrial furnace. But there are also special recipes that can only be made in an industrial furnace.\n".. - "The industrial furnace has its own menu for recipe selection. Depending on the goods in the industrial furnace inventory on the left\\, the output product can be selected on the right.\n".. - "\n".. - "The industrial furnace requires electricity (for the booster) and fuel oil / gasoline for the burner. The industrial furnace must be assembled as shown in the plan on the right.\n".. - "\n".. - "See also TA4 heater.\n".. - "\n".. - "\n".. - "\n", - "Is part of the TA3 industrial furnace.\n".. - "\n".. - "The oil burner can be operated with crude oil\\, fuel oil\\, naphtha or gasoline. The burning time is 64 s for crude oil\\, 80 s for fuel oil\\, 90 s for naphtha and 100 s for gasoline.\n".. - "\n".. - "The oil burner can only hold 50 units of fuel. An additional tank and a pump are therefore advisable.\n".. - "\n".. - "\n".. - "\n", - "Is part of the TA3 industrial furnace. See TA3 industrial furnace.\n".. - "\n".. - "\n".. - "\n", - "Is part of the TA3 industrial furnace. See TA3 industrial furnace.\n".. - "\n".. - "\n".. - "\n", - "Liquids such as water or oil can only be pumped through the special pipes and stored in tanks. As with water\\, there are containers (canisters\\, barrels) in which the liquid can be stored and transported.\n".. - "\n".. - "It is also possible to connect several tanks using the yellow pipes and connectors. However\\, the tanks must have the same content and there must always be at least one yellow pipe between the tank\\, pump and distributor pipe.\n".. - "\n".. - "E.g. It is not possible to connect two tanks directly to a distributor pipe.\n".. - "\n".. - "The liquid filler is used to transfer liquids from containers to tanks. The plan shows how canisters or barrels with liquids are pushed into a liquid filler via pushers. The container is emptied in the liquid filler and the liquid is led down into the tank.\n".. - "\n".. - "The liquid filler can also be placed under a tank to empty the tank.\n".. - "\n".. - "\n".. - "\n", - "Liquids can be stored in a tank. A tank can be filled or emptied using a pump. To do this\\, the pump must be connected to the tank via a pipe (yellow pipes).\n".. - "\n".. - "A tank can also be filled or emptied manually by clicking on the tank with a full or empty liquid container (barrel\\, canister). It should be noted that barrels can only be completely filled or emptied. If\\, for example\\, there are less than 10 units in the tank\\, this remainder must be removed with canisters or pumped empty.\n".. - "\n".. - "A TA3 tank can hold 1000 units or 100 barrels of liquid.\n".. - "\n".. - "\n".. - "\n", - "The pump can be used to pump liquids from tanks or containers to other tanks or containers. The pump direction (arrow) must be observed for the pump. The yellow lines and connectors also make it possible to arrange several tanks on each side of the pump. However\\, the tanks must have the same content.\n".. - "\n".. - "The TA3 pump pumps 4 units of liquid every two seconds.\n".. - "\n".. - "Note 1: The pump must not be placed directly next to the tank. There must always be at least a piece of yellow pipe between them.\n".. - "\n".. - "\n".. - "\n", - "The liquid filler is used to transfer liquids between containers and tanks.\n".. - "\n".. - " - If the liquid filler is placed under a tank and empty barrels are put into the liquid filler with a pusher or by hand\\, the contents of the tank are transferred to the barrels and the barrels can be removed from the outlet\n".. - " - If the liquid filler is placed on a tank and if full containers are put into the liquid filler with a pusher or by hand\\, the content is transferred to the tank and the empty containers can be removed on the exit side\n".. - "\n".. - "It should be noted that barrels can only be completely filled or emptied. If\\, for example\\, there are less than 10 units in the tank\\, this remainder must be removed with canisters or pumped empty.\n".. - "\n".. - "\n".. - "\n", - "The yellow pipes are used for the transmission of gas and liquids.\n".. - "The maximum pipe length is 100 m.\n".. - "\n".. - "\n".. - "\n", - "The blocks serve as wall openings for tubes\\, so that no holes remain open.\n".. - "\n".. - "\n".. - "\n", - "There is a valve for the yellow pipes\\, which can be opened and closed with a click of the mouse.\n".. - "The valve can also be controlled via on/off commands.\n".. - "\n".. - "\n".. - "\n", - "In order to run your generators and stoves with oil\\, you must first look for oil and build a derrick and then extract the oil.\n".. - "TA3 oil explorer\\, TA3 oil drilling box and TA3 pump jack are used for this.\n".. - "\n".. - "\n".. - "\n", - "You can search for oil with the oil explorer. To do this\\, place the block on the floor and right-click to start the search. The oil explorer can be used above ground and underground at all depths.\n".. - "The chat output shows you the depth to which oil was searched and how much oil (petroleum) was found.\n".. - "You can click the block multiple times to search for oil in deeper areas. Oil fields range in size from 4\\,000 to 20\\,000 items.\n".. - "\n".. - "If the search was unsuccessful\\, you have to move the block approx. 16 m further.\n".. - "The oil explorer always searches for oil in the whole map block and below\\, in which it was set. A new search in the same map block (16x16 field) therefore makes no sense.\n".. - "\n".. - "If oil is found\\, the location for the derrick is displayed. You have to erect the derrick within the area shown\\, it is best to mark the spot with a sign and protect the entire area against foreign players.\n".. - "\n".. - "Don't give up looking for oil too quickly. If you're unlucky\\, it can take a long time to find an oil well.\n".. - "It also makes no sense to search an area that another player has already searched. The chance of finding oil anywhere is the same for all players.\n".. - "\n".. - "The oil explorer can always be used to search for oil.\n".. - "\n".. - "\n".. - "\n", - "The oil drill box must be placed in the position indicated by the oil explorer. Drilling for oil elsewhere is pointless.\n".. - "If the button on the oil drilling box is clicked\\, the derrick is erected above the box. This takes a few seconds.\n".. - "The oil drilling box has 4 sides\\, at IN the drill pipe has to be delivered via pusher and at OUT the drilling material has to be removed. The oil drilling box must be supplied with power via one of the other two sides.\n".. - "\n".. - "The oil drilling box drills to the oil field (1 meter in 16 s) and requires 16 ku of electricity.\n".. - "Once the oil field has been reached\\, the derrick can be dismantled and the box removed.\n".. - "\n".. - "\n".. - "\n", - "The oil pump (pump-jack) must now be placed in the place of the oil drilling box. The oil pump also requires electricity (16 ku) and supplies one unit of oil every 8 s. The oil must be collected in a tank. To do this\\, the oil pump must be connected to the tank via yellow pipes.\n".. - "Once all the oil has been pumped out\\, the oil pump can also be removed.\n".. - "\n".. - "\n".. - "\n", - "The drill pipe is required for drilling. As many drill pipe items are required as the depth specified for the oil field. The drill pipe is useless after drilling\\, but it also cannot be dismantled and remains in the ground. However\\, there is a tool to remove the drill pipe blocks (-> Tools -> TA3 drill pipe pliers).\n".. - "\n".. - "\n".. - "\n", - "The oil tank is the large version of the TA3 tank (see liquids -> TA3 tank).\n".. - "\n".. - "The large tank can hold 4000 units of oil\\, but also any other type of liquid.\n".. - "\n".. - "\n".. - "\n", - "", - "Tank carts can be used to transport oil from the oil well to the oil processing plant. A tank cart can be filled or emptied directly using pumps. In both cases\\, the yellow pipes must be connected to the tank cart from above.\n".. - "\n".. - "The following steps are necessary:\n".. - "\n".. - " - Place the tank cart in front of the rail bumper block. The bumper block must not yet be programmed with a time so that the tank cart does not start automatically\n".. - " - Connect the tank cart to the pump using yellow pipes\n".. - " - Switch on the pump\n".. - " - Program the bumper with a time (10 - 20 s)\n".. - "\n".. - "This sequence must be observed on both sides (fill / empty).\n".. - "\n".. - "\n".. - "\n", - "Canisters and barrels can be loaded into the Minecarts. To do this\\, the oil must first be transferred to barrels. The oil barrels can be pushed directly into the Minecart with a pusher and tubes (see map). The empty barrels\\, which come back from the unloading station by Minecart\\, can be unloaded using a hopper\\, which is placed under the rail at the stop.\n".. - "\n".. - "It is not possible with the hopper to both *unload the empty barrels and load the full barrels at a stop*. The hopper immediately unloads the full barrels. It is therefore advisable to set up 2 stations on the loading and unloading side and then program the Minecart accordingly using a recording run.\n".. - "\n".. - "The plan shows how the oil can be pumped into a tank and filled into barrels via a liquid filler and loaded into Minecarts.\n".. - "\n".. - "For the Minecarts to start again automatically\\, the bumper blocks must be configured with the station name and waiting time. 5 s are sufficient for unloading. However\\, since the pushers always go into standby for several seconds when there is no Minecart\\, a time of 15 or more seconds must be entered for loading.\n".. - "\n".. - "\n".. - "\n", - "The tank truck is used to transport liquids. Like tanks\\, it can be filled with pumps or emptied. In both cases\\, the yellow tube must be connected to the tank truck from above.\n".. - "\n".. - "200 units fit in the tank truck.\n".. - "\n".. - "\n".. - "\n", - "The chest cart is used to transport items. Like chests\\, it can be filled or emptied using a pusher.\n".. - "\n".. - "4 stacks fit in the chest cart.\n".. - "\n".. - "\n".. - "\n", - "Oil is a mixture of substances and consists of many components. The oil can be broken down into its main components such as bitumen\\, fuel oil\\, naphtha\\, gasoline and propane gas via a distillation tower.\n".. - "Further processing to end products takes place in the chemical reactor.\n".. - "\n".. - "\n".. - "\n", - "The distillation tower must be set up as in the plan at the top right.\n".. - "The bitumen is drained off via the base block. The exit is on the back of the base block (note the direction of the arrow).\n".. - "The \"distillation tower\" blocks with the numbers: 1\\, 2\\, 3\\, 2\\, 3\\, 2\\, 3\\, 4 are placed on this basic block\n".. - "Fuel oil\\, naphtha and gasoline are drained from the openings from bottom to top. The propane gas is caught at the top.\n".. - "All openings on the tower must be connected to tanks.\n".. - "The reboiler must be connected to the \"distillation tower 1\" block.\n".. - "\n".. - "The reboiler needs electricity (not shown in the plan)!\n".. - "\n".. - "\n".. - "\n", - "The reboiler heats the oil to approx. 400 ° C. It largely evaporates and is fed into the distillation tower for cooling.\n".. - "\n".. - "The reboiler requires 14 units of electricity and produces one unit of bitumen\\, fuel oil\\, naphtha\\, gasoline and propane every 16 s.\n".. - "To do this\\, the reboiler must be supplied with oil via a pump.\n".. - "\n".. - "\n".. - "\n", - "In addition to the tubes for goods transport\\, as well as the gas and power pipes\\, there is also a wireless communication level through which blocks can exchange data with each other. No lines have to be drawn for this\\, the connection between transmitter and receiver is only made via the block number. \n".. - "\n".. - "*Info:* A block number is a unique number that is generated by Techage when many Techage blocks are placed. The block number is used for addressing during communication between Techage controllers and machines. All blocks that can participate in this communication show the block number as info text if you fix the block with the mouse cursor.\n".. - "\n".. - "Which commands a block supports can be read out and displayed with the TechAge Info Tool (wrench).\n".. - "The simplest commands supported by almost all blocks are:\n".. - "\n".. - " - 'on' - to turn on block / machine / lamp\n".. - " - 'off' - to turn off the block / machine / lamp\n".. - "\n".. - "With the help of the TA3 Terminal\\, these commands can be tried out very easily. Suppose a signal lamp is number 123.\n".. - "Then with:\n".. - "\n".. - " cmd 123 on\n".. - "\n".. - "the lamp can be turned on and with:\n".. - "\n".. - " cmd 123 off\n".. - "\n".. - "the lamp can be turned off again. These commands must be entered in the input field of the TA3 terminal.\n".. - "\n".. - "Commands such as 'on' and'off' are sent to the recipient without a response coming back. These commands can therefore be sent to several receivers at the same time\\, for example with a push button / switch\\, if several numbers are entered in the input field.\n".. - "\n".. - "A command like 'state' requests the status of a block. The block then sends its status back. This type of confirmed command can only be sent to one recipient at a time.\n".. - "This command can also be tested with the TA3 terminal on a pusher\\, for example:\n".. - "\n".. - " cmd 123 state\n".. - "\n".. - "Possible responses from the pusher are:\n".. - "\n".. - " - 'running' -> I'm working\n".. - " - 'stopped' -> switched off\n".. - " - 'standby' -> nothing to do because source inventory is empty\n".. - " - 'blocked' -> can't do anything because target inventory is full\n".. - "\n".. - "This status and other information is also output when the wrench is clicked on the block.\n".. - "\n".. - "\n".. - "\n", - "The button/switch sends 'on' / 'off' commands to the blocks that have been configured via the numbers.\n".. - "The button/switch can be configured as a button or a switch. If it is configured as a button\\, the time between the 'on' and 'off' commands can be set. With the operating mode \"on button\" only an 'on' and no 'off' command is sent.\n".. - "\n".. - "The checkbox \"public\" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set).\n".. - "\n".. - "Note: With the programmer\\, block numbers can be easily collected and configured.\n".. - "\n".. - "\n".. - "\n", - "With the TA3 command converter\\, 'on' / 'off' commands can be converted into other commands\\, and forwarding can be prevented or delayed.\n".. - "The number of the target block or the numbers of the target blocks\\, the commands to be sent and the delay times in seconds must be entered. If no command is entered\\, nothing is sent.\n".. - "\n".. - "The numbers can also be programmed using the Techage programmer.\n".. - "\n".. - "\n".. - "\n", - "The TA3 flip-flop changes its state with each received 'on' command. Received 'off' commands are ignored. Depending on the status change\\, 'on' / 'off' commands are sent alternately. The number of the target block or the numbers of the target blocks must be entered. The numbers can also be programmed using the Techage programmer.\n".. - "\n".. - "For example\\, lamps can be switched on and off with the help of buttons.\n".. - "\n".. - "\n".. - "\n", - "The TA3 logic block can be programmed in such a way that one or more input commands are linked to one output command and sent. This block can therefore replace various logic elements such as AND\\, OR\\, NOT\\, XOR etc. \n".. - "Input commands for the logic block are 'on' /'off' commands.\n".. - "Input commands are referenced via the number\\, e.g. '1234' for the command from the sender with the number 1234. \n".. - "The same applies to output commands.\n".. - "\n".. - "A rule is structured as follows: \n".. - "\n".. - " = on/off if is true\n".. - "\n".. - "'' is the block number to which the command should be sent.\n".. - "'' is a boolean expression where input numbers are evaluated.\n".. - "\n".. - "*Examples for the input expression*\n".. - "\n".. - "Negate signal (NOT):\n".. - "\n".. - " 1234 == off\n".. - "\n".. - "Logical AND:\n".. - "\n".. - " 1234 == on and 2345 == on\n".. - "\n".. - "Logical OR:\n".. - "\n".. - " 1234 == on or 2345 == on\n".. - "\n".. - "The following operators are allowed: 'and' 'or' 'on' 'off' 'me' '==' '~=' '(' ')'\n".. - "\n".. - "If the expression is true\\, a command is sent to the block with the '' number. \n".. - "Up to four rules can be defined\\, whereby all rules are always checked when a command is received. \n".. - "The internal processing time for all commands is 100 ms. \n".. - "\n".. - "Your own node number can be referenced using the keyword 'me'. This makes it possible for the block to send itself a command (flip-flop function). \n".. - "\n".. - "The blocking time defines a pause after a command\\, during which the logic block does not accept any further external commands. Commands received during the blocking period are thus discarded. The blocking time can be defined in seconds. \n".. - "\n".. - "\n".. - "\n", - "The repeater sends the received signal to all configured numbers.\n".. - "This can make sense\\, for example\\, if you want to control many blocks at the same time. The repeater can be configured with the programmer\\, which is not possible with all blocks.\n".. - "\n".. - "\n".. - "\n", - "The sequencer can send a series of 'on' / 'off' commands\\, whereby the interval between the commands must be specified in seconds. You can use it to make a lamp blink\\, for example.\n".. - "Up to 8 commands can be configured\\, each with target block number and pending the next command.\n".. - "The sequencer repeats the commands endlessly when \"Run endless\" is set.\n".. - "If nothing is selected\\, only the specified time in seconds is waited for.\n".. - "\n".. - "\n".. - "\n", - "The timer can send commands time-controlled. The time\\, the target number(s) and the command itself can be specified for each command line. This means that lamps can be switched on in the evening and switched off again in the morning.\n".. - "\n".. - "\n".. - "\n", - "The terminal is primarily used to test the command interface of other blocks (see \"Logic / switching blocks\").\n".. - "You can also assign commands to keys and use the terminal productively.\n".. - "\n".. - " set \n".. - "\n".. - "With 'set 1 ON cmd 123 on'\\, for example\\, user key 1 can be programmed with the command 'cmd 123 on'. If the key is pressed\\, the command is sent and the response is output on the screen.\n".. - "\n".. - "The terminal has the following local commands:\n".. - "\n".. - " - 'clear' clear screen\n".. - " - 'help' output a help page\n".. - " - 'pub' switch to public mode\n".. - " - 'priv' switch to private mode\n".. - "\n".. - "In private mode\\, the terminal can only be used by players who can build at this location\\, i.e. who have protection rights.\n".. - "\n".. - "In public mode\\, all players can use the preconfigured keys.\n".. - "\n".. - "\n".. - "\n", - "The signal lamp can be switched on or off with the 'on' / 'off' command. This lamp does not need electricity and can be colored with the airbrush tool from the mod Unified Dyes\" and via Lua/Beduino commands.\n".. - "\n".. - "With the chat command '/ta_color' the color palette with the values for the Lua/Beduino commands is displayed and with '/ta_send color ' the color can be changed.\n".. - "\n".. - "\n".. - "\n", - "With these blocks you can realize doors and gates that can be opened via commands (blocks disappear) and closed again. One door controller is required for each gate or door.\n".. - "\n".. - "The appearance of the blocks can be adjusted via the block menu.\n".. - "This makes it possible to realize secret doors that only open for certain players (with the help of the player detector).\n".. - "\n".. - "\n".. - "\n", - "The door controller is used to control the TA3 door/gate blocks. With the door controller\\, the numbers of the door/gate blocks must be entered. If an 'on' / 'off' command is sent to the door controller\\, this opens/closes the door or gate.\n".. - "\n".. - "\n".. - "\n", - "The Door Controller II can remove and set all types of blocks. To teach in the Door Controller II\\, the \"Record\" button must be pressed. Then all blocks that should be part of the door / gate must be clicked. Then the \"Done\" button must be pressed. Up to 16 blocks can be selected. The removed blocks are saved in the controller's inventory. The function of the controller can be tested manually using the \"Remove\" or \"Set\" buttons. If an 'on' /'off' command is sent to the Door Controller II\\, it removes or sets the blocks as well.\n".. - "\n".. - "With '$send_cmnd(node_number\\, \"exchange\"\\, 2)' individual blocks can be set\\, removed or replaced by other blocks from the inventory. \n".. - "\n".. - "With '$send_cmnd(node_number\\, \"set\"\\, 2)' a block from the inventory can be set explicitly\\, as long as the inventory slot is not empty.\n".. - "\n".. - "A block can be removed again with '$send_cmnd(node_number\\, \"dig\"\\, 2)' if the inventory slot is empty. \n".. - "\n".. - "The name of the set block is returned with '$send_cmnd(node_number\\, \"get\"\\, 2)'.\n".. - "\n".. - "The slot number of the inventory (1 .. 16) must be passed as payload in all three cases.\n".. - "\n".. - "This can also be used to simulate extendable stairs and the like. \n".. - "\n".. - "\n".. - "\n", - "Different sounds can be played with the sound block. All sounds of the Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack and Minetest Game are available.\n".. - "\n".. - "The sounds can be selected and played via the menu and via command.\n".. - "\n".. - " - Command 'on' to play a sound\n".. - " - Command 'sound ' to select a sound via the index\n".. - " - Command 'gain ' to adjust the volume via the '' value (1 to 5).\n".. - "\n".. - "\n".. - "\n", - "The Mesecons converter is used to convert Techage on/off commands into Mesecons signals and vice versa.\n".. - "To do this\\, one or more node numbers must be entered and the converter with Mesecons blocks\n".. - "has to be connected via Mesecons cables. The Mesecons converter can also be configured with the programmer.\n".. - "The Mesecons converter accepts up to 5 commands per second\\; it switches itself off at higher loads.\n".. - "\n".. - "*This node only exists if the mod mesecons is active!*\n".. - "\n".. - "\n".. - "\n", - "Detectors scan their surroundings and send an 'on' command when the search is recognized.\n".. - "\n".. - "\n".. - "\n", - "The detector is a special tube block that detects when items are passed on through the tube. To do this\\, it must be connected to tubes on both sides. If items are pushed into the detector with a pusher\\, they are automatically passed on.\n".. - "It sends an 'on' when an item is recognized\\, followed by an 'off' a second later.\n".. - "Then further commands are blocked for 8 seconds.\n".. - "The waiting time and the items that should trigger a command can be configured using the open-ended wrench menu. \n".. - "\n".. - "\n".. - "\n", - "The cart detector sends an 'on' command if it has recognized a cart (Minecart) directly in front of it. In addition\\, the detector can also restart the cart when an 'on' command is received.\n".. - "\n".. - "The detector can also be programmed with its own number. In this case\\, he pushes all the wagons that stop near him (one block in all directions).\n".. - "\n".. - "\n".. - "\n", - "The node detector sends an 'on' command if it detects that nodes (blocks) appear or disappear in front of it\\, but must be configured accordingly. After switching the detector back to the standard state (gray block)\\, an 'off' command is sent. Valid blocks are all types of blocks and plants\\, but not animals or players. The sensor range is 3 blocks / meter in the direction of the arrow.\n".. - "\n".. - "\n".. - "\n", - "The player detector sends an 'on' command if it detects a player within 4 m of the block. If the player leaves the area again\\, an 'off' command is sent.\n".. - "If the search should be limited to specific players\\, these player names can also be entered.\n".. - "\n".. - "\n".. - "\n", - "The light detector sends an 'on' command if the light level of the block above exceeds a certain level\\, which can be set through the right-click menu.\n".. - "If you have a TA4 Lua Controller\\, you can get the exact light level with $get_cmd(num\\, 'light_level')\n".. - "\n".. - "\n".. - "\n", - "TA3 has the same machines as TA2\\, only these are more powerful and require electricity instead of axis drive.\n".. - "Therefore\\, only the different technical data are given below.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 6 items every 2 s.\n".. - "\n".. - "\n".. - "\n", - "The function of the TA3 distributor corresponds to that of TA2.\n".. - "The processing power is 12 items every 4 s.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 2 items every 4 s. The autocrafter requires 6 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2\\, only TA4 WLAN chips are produced here.\n".. - "The processing power is one chip every 6 s. The block requires 12 ku of electricity for this.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The maximum depth is 40 meters. The quarry requires 12 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 2 items every 4 s. The block requires 4 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The probability is also the same as for TA2. The block also requires 3 ku of electricity.\n".. - "But in contrast to TA2\\, the status of the TA3 block can be read (controller)\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 2 items every 4 s. The block requires 6 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The injector is a TA3 pusher with special properties. It has a menu for configuration. Up to 8 items can be configured here. He only takes these items from a chest to pass them on to machines with recipes (autocrafter\\, industrial furnace and electronic fab).\n".. - "\n".. - "When passing on\\, only one position in the inventory is used in the target machine. If\\, for example\\, only the first three entries are configured in the injector\\, only the first three storage locations in the machine's inventory are used. So that an overflow in the machine inventory is prevented.\n".. - "\n".. - "The injector can also be switched to \"pull mode\". Then he only pulls items out of the chest from the positions that are defined in the configuration of the injector. In this case\\, item type and position must match. This allows to empty specific inventory entries of a chest. \n".. - "\n".. - "The processing power is up to 8 times one item every 4 seconds.\n".. - "\n".. - "\n".. - "\n", - "", - "The Techage Info Tool (open-ended wrench) has several functions. It shows the time\\, position\\, temperature and biome when an unknown block is clicked on.\n".. - "If you click on a TechAge block with command interface\\, all available data will be shown (see also \"Logic / switching blocks\").\n".. - "\n".. - "With Shift + right click an extended menu can be opened for some blocks. Depending on the block\\, further data can be called up or special settings can be made here. In the case of a generator\\, for example\\, the charging curve/switch-off can be programmed. \n".. - "\n".. - "\n".. - "\n", - "With the programmer\\, block numbers can be collected from several blocks with a right click and written into a block like a button / switch with a left click.\n".. - "If you click in the air\\, the internal memory is deleted.\n".. - "\n".. - "\n".. - "\n", - "The trowel is used for plastering power cables. See also \"TA power cable\".\n".. - "\n".. - "\n".. - "\n", - "This tool can be used to remove the drill pipe blocks if\\, for example\\, a tunnel is to pass through there.\n".. - "\n".. - "\n".. - "\n", - "The Techage Screwdriver serves as a replacement for the normal screwdriver. It has the following functions:\n".. - "\n".. - " - Left click: turn the block to the left\n".. - " - Right click: turn the visible side of the block upwards\n".. - " - Shift + left click: save the alignment of the clicked block\n".. - " - Shift + right click: apply the saved alignment to the clicked block\n".. - "\n".. - " \n".. - "\n", - "The TechAge Assembly Tool is used to remove and reposition Techage blocks without these blocks losing their block number or being assigned a new number when setting. This is helpful\\, for example\\, for quarries\\, as they often have to be moved.\n".. - "\n".. - " - Left button: Remove a block\n".. - " - Right button: Set a block\n".. - "\n".. - "The block that was previously removed with the assembly tool and is to be placed again must be on the far left of the player inventory.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta3", - "", - "ta3_firebox", - "ta3_oilbox", - "ta3_boiler", - "ta3_turbine", - "ta3_generator", - "ta3_cooler", - "ta3_powerswitch", - "power_reduction", - "ta3_powercable", - "ta3_powerjunction", - "ta3_powerline", - "ta3_powerpole", - "ta3_powerpole4", - "ta3_powerpole2", - "ta3_powerswitch", - "ta3_powerswitchsmall", - "ta3_powerswitchbox", - "ta3_tinygenerator", - "ta3_akkublock", - "ta3_powerterminal", - "ta3_motor", - "", - "ta3_furnacefirebox", - "ta3_furnace", - "ta3_booster", - "", - "ta3_tank", - "ta3_pump", - "ta3_filler", - "ta3_pipe", - "ta3_pipe_wall_entry", - "ta3_valve", - "techage_ta3", - "ta3_oilexplorer", - "ta3_drillbox", - "ta3_pumpjack", - "ta3_drillbit", - "oiltank", - "", - "", - "", - "", - "", - "techage_ta31", - "", - "reboiler", - "ta3_logic", - "ta3_button", - "ta3_command_converter", - "ta3_flipflop", - "ta3_logic", - "ta3_repeater", - "ta3_sequencer", - "ta3_timer", - "ta3_terminal", - "ta3_colorlamp", - "ta3_doorblock", - "ta3_doorcontroller", - "ta3_doorcontroller", - "ta3_soundblock", - "ta3_mesecons_converter", - "ta3_nodedetector", - "ta3_detector", - "ta3_cartdetector", - "ta3_nodedetector", - "ta3_playerdetector", - "ta3_lightdetector", - "ta3_grinder", - "ta3_pusher", - "ta3_distributor", - "ta3_autocrafter", - "ta3_electronicfab", - "ta3_quarry", - "ta3_gravelsieve", - "ta3_gravelrinser", - "ta3_grinder", - "ta3_injector", - "", - "ta3_end_wrench", - "ta3_programmer", - "ta3_trowel", - "ta3_drill_pipe_wrench", - "ta3_screwdriver", - "techage:assembly_tool", - }, - plans = { - "", - "coalpowerstation", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_furnace", - "", - "", - "", - "ta3_tank", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_loading", - "", - "", - "", - "ta3_distiller", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta3_pt-BR.lua b/techage/doc/manual_ta3_pt-BR.lua deleted file mode 100644 index ae26512..0000000 --- a/techage/doc/manual_ta3_pt-BR.lua +++ /dev/null @@ -1,942 +0,0 @@ -return { - titles = { - "1,TA3: Era do Petróleo", - "2,Usina Termelétrica a Carvão / Usina Termelétrica a Óleo", - "3,TA3 Fornalha(firebox) da estação de energia", - "3,TA3 Queimador de Óleo da Usina de Energia", - "3,TA3 Base / Topo da Caldeira", - "3,TA3 Turbina", - "3,TA3 Gerador", - "3,TA3 Cooler", - "2,Corrente elétrica", - "3,Importância dos sistemas de armazenamento", - "3,TA3 Cabo Elétrico", - "3,TA Caixa de Junção Elétrica", - "3,TA Linha de Energia", - "3,TA Poste de Energia", - "3,TA Topo do Poste de Energia", - "3,TA Topo do Poste de Energia 2", - "3,TA Interruptor de Energia", - "3,TA Interruptor de Energia Pequeno", - "3,TA Caixa de Interruptor de Energia", - "3,TA3 Pequeno Gerador de Energia", - "3,TA3 Bloco Acumulador", - "3,TA3 Terminal de Energia", - "3,TA3 Motor Elétrico", - "2,TA3 Forno Industrial", - "3,TA3 Forno - Queimador de Óleo", - "3,TA3 Forno - Parte Superior", - "3,TA3 Reforço", - "2,Líquidos", - "3,TA3 Tanque", - "3,TA3 Bomba", - "3,TA Liquid Filler", - "3,TA4 Tubos(pipe)", - "3,TA3 Tubos de parede (entre-blocos)", - "3,TA Válvula", - "2,Produção de Óleo", - "3,TA3 Explorador de petróleo", - "3,TA3 Caixa de perfuração de petróleo", - "3,TA3 Bomba de petróleo", - "3,TA3 Haste de perfuração", - "3,Tanque de petróleo", - "2,Transporte de Petróleo", - "3,Transporte de Petróleo por Vagões Tanque", - "3,Oil transportation with barrels over Minecarts", - "3,Transporte de Petróleo com Barris por Minecarts", - "3,Carrinho-tanque", - "3,Carrinho-baú", - "2,Processamento de Petróleo", - "3,Torre de Destilação", - "4,Refervedor(Reboiler)", - "2,Blocos Lógicos / de Comutação", - "3,TA3 Botão / Interruptor", - "3,TA3 Conversor de Comandos", - "3,TA3 Flip-Flop", - "3,Bloco Lógico TA3", - "3,TA3 Repetidor", - "3,TA3 Sequenciador", - "3,TA3 Temporizador", - "3,TA3 Terminal", - "3,Lâmpada Colorida TechAge", - "3,Blocos de Porta/Portão", - "3,TA3 Controlador de Porta", - "3,Controlador de Porta TA3 II", - "3,TA3 Bloco de Som", - "3,TA3 Conversor Mesecons", - "2,Detectores", - "3,TA3 Detector", - "3,TA3 Cart Detector", - "3,TA3 Node Detector", - "3,TA3 Detector de jogador(Player detector)", - "3,TA3 Detector de luz(Light detector)", - "2,Máquinas TA3", - "3,TA3 Pusher", - "3,TA3 Distributor", - "3,TA3 Autocrafter", - "3,TA3 Electronic Fab", - "3,TA3 Quarry", - "3,TA3 Gravel Sieve", - "3,TA3 Gravel Rinser", - "3,TA3 Grinder", - "3,TA3 Injetor", - "2,Ferramentas", - "3,Techage Info Tool", - "3,TechAge Programmer (Programador)", - "3,TechAge Trowel / Trowel", - "3,TA3 chave de cano", - "3,Techage Screwdriver", - "3,TechAge Assembly Tool", - }, - texts = { - "Na TA3\\, é importante substituir as máquinas a vapor por máquinas mais potentes movidas a eletricidade.\n".. - "\n".. - "Para fazer isso\\, é necessário construir usinas termelétricas a carvão e geradores. Logo você perceberá que suas necessidades de eletricidade só podem ser atendidas com usinas movidas a óleo. Portanto\\, você parte em busca de petróleo. Torres de perfuração e bombas de petróleo ajudam a extrair o óleo. Ferrovias são usadas para transportar o óleo até as usinas.\n".. - "\n".. - "A era industrial está em seu auge.\n".. - "\n".. - "\n".. - "\n", - "A usina termelétrica a carvão é composta por vários blocos e deve ser montada conforme mostrado no plano à direita. São necessários os blocos Fornalha(Firebox) TA3\\, Topo da Caldeira TA3\\, Base da Caldeira TA3\\, Turbina TA3\\, Gerador TA3 e Resfriador TA3.\n".. - "\n".. - "A caldeira deve ser preenchida com água. Encha até 10 baldes de água na caldeira.\n".. - "A caixa de fogo deve ser preenchida com carvão ou carvão vegetal.\n".. - "Quando a água estiver quente\\, o gerador pode ser iniciado.\n".. - "\n".. - "Alternativamente\\, a usina pode ser equipada com um queimador de óleo e operada com óleo. O óleo pode ser reabastecido usando uma bomba e um tubo de óleo.\n".. - "\n".. - "A usina fornece uma saída de 80 ku.\n".. - "\n".. - "\n".. - "\n", - "Parte da usina de energia.\n".. - "A fornalha deve ser preenchida com carvão ou carvão vegetal. O tempo de queima depende da potência solicitada pela usina. Carvão queima por 20s e carvão vegetal por 60s em carga total. Proporcionalmente mais tempo em carga parcial (50% de carga = dobro do tempo).\n".. - "\n".. - "\n".. - "\n", - "Parte da usina de energia.\n".. - "\n".. - "O queimador de óleo pode ser preenchido com óleo cru\\, óleo combustível\\, nafta ou gasolina. O tempo de queima depende da potência solicitada pela usina. Em carga total\\, óleo cru queima por 15s\\, óleo combustível por 20s\\, nafta por 22s e gasolina por 25s.\n".. - "\n".. - "Proporcionalmente mais tempo em carga parcial (50% de carga = dobro do tempo).\n".. - "\n".. - "O queimador de óleo pode armazenar apenas 50 unidades de combustível. Recomenda-se\\, portanto\\, um tanque de óleo adicional e uma bomba de óleo.\n".. - "\n".. - "\n".. - "\n", - "Parte da usina de energia. Deve ser preenchida com água. Se não houver mais água ou a temperatura diminuir muito\\, a usina desliga.\n".. - "\n".. - "O consumo de água da caldeira TA3 é muito menor do que o da máquina a vapor devido ao circuito de vapor fechado.\n".. - "Com a máquina a vapor\\, parte da água é perdida como vapor a cada curso do pistão.\n".. - "\n".. - "\n".. - "\n", - "A turbina faz parte da usina de energia. Deve ser colocada ao lado do gerador e conectada à caldeira e ao resfriador por meio de tubos de vapor\\, conforme mostrado no plano.\n".. - "\n".. - "\n".. - "\n", - "O gerador é usado para gerar eletricidade. Deve ser conectado às máquinas por meio de cabos de energia e caixas de junção.\n".. - "\n".. - "\n".. - "\n", - "Usado para resfriar o vapor quente da turbina. Deve ser conectado à caldeira e à turbina por meio de tubos de vapor\\, conforme mostrado no plano.\n".. - "\n".. - "\n".. - "\n", - "Em TA3 (e TA4)\\, as máquinas são alimentadas por eletricidade. Para isso\\, máquinas\\, sistemas de armazenamento e geradores devem ser conectados com cabos de energia.\n".. - "TA3 possui 2 tipos de cabos de energia:\n".. - "\n".. - " - Cabos isolados (cabos de energia TA) para instalação local no chão ou em edifícios. Esses cabos podem ser ocultos na parede ou no chão (podem ser \"revestidos\" com a colher de pedreiro).\n".. - " - Linhas aéreas (linha de energia TA) para cabeamento externo em longas distâncias. Esses cabos são protegidos e não podem ser removidos por outros jogadores.\n".. - "\n".. - "Vários consumidores\\, sistemas de armazenamento e geradores podem ser operados juntos em uma rede de energia. Redes podem ser configuradas com a ajuda das caixas de junção.\n".. - "Se houver pouca eletricidade fornecida\\, os consumidores ficam sem energia.\n".. - "Nesse contexto\\, também é importante entender a funcionalidade dos blocos de Forceload\\, porque os geradores\\, por exemplo\\, só fornecem eletricidade quando o bloco de mapa correspondente está carregado. Isso pode ser imposto com um bloco de Forceload.\n".. - "\n".. - "Em TA4\\, também existe um cabo para o sistema solar.\n".. - "\n".. - "\n".. - "\n", - "Os sistemas de armazenamento na rede elétrica desempenham duas funções:\n".. - "\n".. - " - Lidar com picos de demanda: Todos os geradores sempre fornecem exatamente a quantidade de energia necessária. No entanto\\, se os consumidores forem ligados/desligados ou houver flutuações na demanda por outros motivos\\, os consumidores podem falhar por um curto período. Para evitar isso\\, deve sempre haver pelo menos um bloco de bateria em cada rede. Isso serve como um buffer e compensa essas flutuações na faixa de segundos.\n".. - " - Armazenar energia regenerativa: Solar e eólica não estão disponíveis 24 horas por dia. Para que o fornecimento de energia não falhe quando não há produção de eletricidade\\, um ou mais sistemas de armazenamento devem ser instalados na rede. Alternativamente\\, as lacunas também podem ser preenchidas com eletricidade de óleo/carvão.\n".. - "\n".. - "Um sistema de armazenamento indica sua capacidade em kud\\, ou seja\\, ku por dia. Por exemplo\\, um sistema de armazenamento com 100 kud fornece 100 ku por um dia de jogo\\, ou 10 ku por 10 dias de jogo.\n".. - "\n".. - "Todas as fontes de energia TA3/TA4 têm características de carregamento ajustáveis. Por padrão\\, isso é configurado para \"80% - 100%\". Isso significa que\\, quando o sistema de armazenamento estiver 80% cheio\\, a saída é reduzida cada vez mais até desligar completamente em 100%. Se eletricidade for necessária na rede\\, nunca se atingirá 100%\\, pois a potência do gerador em algum momento caiu para a demanda de eletricidade na rede e o sistema de armazenamento não está mais sendo carregado\\, mas apenas os consumidores estão sendo atendidos.\n".. - "\n".. - "Isso tem várias vantagens:\n".. - "\n".. - " - As características de carregamento são ajustáveis. Isso significa\\, por exemplo\\, que as fontes de energia de óleo/carvão podem ser reduzidas em 60% e as fontes de energia renovável apenas em 80%. Isso significa que o óleo/carvão só é queimado se não houver energia renovável suficiente disponível.\n".. - " - Várias fontes de energia podem ser operadas em paralelo e são carregadas quase uniformemente\\, porque todas as fontes de energia trabalham\\, por exemplo\\, até 80% da capacidade de carga do sistema de armazenamento em sua capacidade total e depois reduzem sua capacidade ao mesmo tempo.\n".. - " - Todos os sistemas de armazenamento em uma rede formam um grande buffer. A capacidade de carga e o nível de preenchimento de todo o sistema de armazenamento podem sempre ser lidos em percentagem em todos os sistemas de armazenamento\\, mas também no terminal de eletricidade.\n".. - "\n".. - " \n".. - "\n", - "Para fiação local no chão ou em construções.\n".. - "Ramos podem ser realizados usando caixas de junção. O comprimento máximo do cabo entre máquinas ou caixas de junção é de 1000 m. Um máximo de 1000 nós pode ser conectado em uma rede elétrica. Todos os blocos com conexão elétrica\\, incluindo caixas de junção\\, contam como nós.\n".. - "\n".. - "Como os cabos elétricos não são automaticamente protegidos\\, as linhas aéreas (TA power line) são recomendadas para distâncias mais longas.\n".. - "\n".. - "Os cabos elétricos podem ser rebocados com a colher de alvenaria para que fiquem ocultos na parede ou no chão. Todos os blocos de pedra\\, argila e outros blocos sem \"inteligência\" podem ser usados como material de reboco. A sujeira não funciona porque pode ser convertida em grama ou algo semelhante\\, o que destruiria a linha.\n".. - "\n".. - "Para rebocar\\, o cabo deve ser clicado com a colher de alvenaria. O material com o qual o cabo deve ser rebocado deve estar no canto mais à esquerda do inventário do jogador.\n".. - "Os cabos podem ser tornados visíveis novamente clicando no bloco com a colher de alvenaria.\n".. - "\n".. - "Além dos cabos\\, a caixa de junção TA e a caixa de interruptores de energia TA também podem ser rebocadas.\n".. - "\n".. - "\n".. - "\n", - "Com a caixa de junção\\, a eletricidade pode ser distribuída em até 6 direções. Caixas de junção também podem ser rebocadas (ocultas) com uma colher de alvenaria e tornadas visíveis novamente.\n".. - "\n".. - "\n".. - "\n", - "Com a linha de energia TA e os postes de eletricidade\\, é possível realizar linhas aéreas razoavelmente realistas. As cabeças dos postes também servem para proteger a linha de energia (proteção). Um poste deve ser colocado a cada 16 m ou menos. A proteção se aplica apenas à linha de energia e aos postes\\; no entanto\\, todos os outros blocos nesta área não estão protegidos.\n".. - "\n".. - "\n".. - "\n", - "Usado para construir postes de eletricidade. É protegido contra destruição pela cabeça do poste de eletricidade e só pode ser removido pelo proprietário.\n".. - "\n".. - "\n".. - "\n", - "Possui até quatro braços e permite assim a distribuição de eletricidade em até 6 direções.\n".. - "A cabeça do poste de eletricidade protege as linhas de energia e os postes dentro de um raio de 8 m.\n".. - "\n".. - "\n".. - "\n", - "Esta cabeça de poste de eletricidade tem dois braços fixos e é usada para as linhas aéreas. No entanto\\, também pode transmitir corrente para baixo e para cima.\n".. - "A cabeça do poste de eletricidade protege as linhas de energia e os postes dentro de um raio de 8 m.\n".. - "\n".. - "\n".. - "\n", - "O interruptor pode ser usado para ligar e desligar a energia. Para isso\\, o interruptor deve ser colocado em uma caixa de interruptor de energia. A caixa de interruptor de energia deve ser conectada ao cabo de energia em ambos os lados.\n".. - "\n".. - "\n".. - "\n", - "O interruptor pode ser usado para ligar e desligar a energia. Para isso\\, o interruptor deve ser colocado em uma caixa de interruptor de energia. A caixa de interruptor de energia deve ser conectada ao cabo de energia em ambos os lados.\n".. - "\n".. - "\n".. - "\n", - "Veja o interruptor de energia TA.\n".. - "\n".. - "\n".. - "\n", - "O pequeno gerador de energia funciona com gasolina e pode ser usado para consumidores pequenos com até 12 ku. A gasolina queima por 150s em carga total. Correspondentemente mais tempo em carga parcial (50% de carga = tempo duplo).\n".. - "\n".. - "O gerador de energia só pode armazenar 50 unidades de gasolina. Portanto\\, é aconselhável um tanque adicional e uma bomba.\n".. - "\n".. - "\n".. - "\n", - "O bloco acumulador (bateria recarregável) é usado para armazenar energia excedente e fornece automaticamente energia em caso de queda de energia (se disponível).\n".. - "Vários blocos de acumulador juntos formam um sistema de armazenamento de energia TA3. Cada bloco de acumulador possui um display para o estado de carga e para a carga armazenada.\n".. - "Os valores para toda a rede são sempre exibidos aqui. A carga armazenada é exibida em \"kud\" ou \"ku-dias\" (análogo a kWh). Assim\\, 5 kud correspondem\\, por exemplo\\, a 5 ku para um dia de jogo (20 minutos) ou 1 ku para 5 dias de jogo.\n".. - "\n".. - "Um bloco de acumulador tem 3\\,33 kud.\n".. - "\n".. - "\n".. - "\n", - "O terminal de energia deve ser conectado à rede elétrica. Ele exibe dados da rede elétrica.\n".. - "\n".. - "As informações mais importantes são exibidas na metade superior:\n".. - "\n".. - " - potência do gerador atual/máxima\n".. - " - consumo de energia atual de todos os consumidores\n".. - " - corrente de carga atual dentro/fora do sistema de armazenamento\n".. - " - Estado de carga atual do sistema de armazenamento em percentual\n".. - "\n".. - "O número de blocos da rede é exibido na metade inferior.\n".. - "\n".. - "Dados adicionais sobre os geradores e sistemas de armazenamento podem ser consultados através da guia \"console\".\n".. - "\n".. - "\n".. - "\n", - "O Motor Elétrico TA3 é necessário para operar as máquinas TA2 através da rede elétrica. O Motor Elétrico TA3 converte eletricidade em potência de eixo.\n".. - "Se o motor elétrico não for alimentado com energia suficiente\\, ele entra em um estado de falha e deve ser reativado com um clique direito.\n".. - "\n".. - "O motor elétrico consome no máximo 40 ku de eletricidade e fornece do outro lado no máximo 39 ku como potência de eixo. Portanto\\, ele consome um ku para a conversão.\n".. - "\n".. - "\n".. - "\n", - "O forno industrial TA3 serve como complemento aos fornos normais. Isso significa que todos os produtos podem ser fabricados com receitas de \"cozimento\"\\, mesmo em um forno industrial. No entanto\\, também existem receitas especiais que só podem ser feitas em um forno industrial.\n".. - "O forno industrial possui seu próprio menu para seleção de receitas. Dependendo dos produtos no inventário do forno industrial à esquerda\\, o produto de saída pode ser selecionado à direita.\n".. - "\n".. - "O forno industrial requer eletricidade (para o impulsionador) e óleo combustível/gasolina para o queimador. O forno industrial deve ser montado conforme mostrado no plano à direita.\n".. - "\n".. - "Veja também o aquecedor TA4.\n".. - "\n".. - "\n".. - "\n", - "Parte do forno industrial TA3.\n".. - "\n".. - "O queimador de óleo pode ser operado com óleo bruto\\, óleo combustível\\, nafta ou gasolina. O tempo de queima é de 64 s para óleo bruto\\, 80 s para óleo combustível\\, 90 s para nafta e 100 s para gasolina.\n".. - "\n".. - "O queimador de óleo pode armazenar apenas 50 unidades de combustível. Portanto\\, é aconselhável um tanque adicional e uma bomba.\n".. - "\n".. - "\n".. - "\n", - "Faz parte do forno industrial TA3. Consulte o forno industrial TA3.\n".. - "\n".. - "\n".. - "\n", - "Faz parte do forno industrial TA3. Consulte o forno industrial TA3.\n".. - "\n".. - "\n".. - "\n", - "Líquidos como água ou óleo só podem ser bombeados através de tubulações especiais e armazenados em tanques. Assim como com a água\\, existem recipientes (latas\\, barris) nos quais o líquido pode ser armazenado e transportado.\n".. - "\n".. - "Também é possível conectar vários tanques usando as tubulações amarelas e conectores. No entanto\\, os tanques devem ter o mesmo conteúdo e sempre deve haver pelo menos um tubo amarelo entre o tanque\\, a bomba e o tubo distribuidor.\n".. - "\n".. - "Por exemplo\\, não é possível conectar dois tanques diretamente a um tubo distribuidor.\n".. - "\n".. - "O enchimento de líquidos é usado para transferir líquidos de recipientes para tanques. O plano mostra como latas ou barris com líquidos são empurrados para um enchimento de líquidos através de empurradores. O recipiente é esvaziado no enchimento de líquidos e o líquido é conduzido para baixo no tanque.\n".. - "\n".. - "O enchimento de líquidos também pode ser colocado sob um tanque para esvaziar o tanque.\n".. - "\n".. - "\n".. - "\n", - "Líquidos podem ser armazenados em um tanque. Um tanque pode ser preenchido ou esvaziado usando uma bomba. Para fazer isso\\, a bomba deve ser conectada ao tanque por meio de um tubo (tubos amarelos).\n".. - "\n".. - "Um tanque também pode ser preenchido ou esvaziado manualmente clicando no tanque com um recipiente de líquido cheio ou vazio (barril\\, galão). Deve-se observar que os barris só podem ser completamente preenchidos ou esvaziados. Se\\, por exemplo\\, houver menos de 10 unidades no tanque\\, esse restante deve ser removido com galões ou esvaziado com uma bomba.\n".. - "\n".. - "Um tanque TA3 pode armazenar 1000 unidades ou 100 barris de líquido.\n".. - "\n".. - "\n".. - "\n", - "A bomba pode ser usada para bombear líquidos de tanques ou recipientes para outros tanques ou recipientes. A direção da bomba (seta) deve ser observada. As linhas amarelas e os conectores também permitem organizar vários tanques em cada lado da bomba. No entanto\\, os tanques devem ter o mesmo conteúdo.\n".. - "\n".. - "A bomba TA3 bombeia 4 unidades de líquido a cada dois segundos.\n".. - "\n".. - "Observação 1: A bomba não deve ser colocada diretamente ao lado do tanque. Deve sempre haver pelo menos um pedaço de tubo amarelo entre eles.\n".. - "\n".. - "\n".. - "\n", - "O liquid filler é usado para transferir líquidos entre recipientes e tanques.\n".. - "\n".. - " - Se o liquid filler for colocado sob um tanque e barris vazios forem colocados no liquid filler com um empurrador ou manualmente\\, o conteúdo do tanque é transferido para os barris e os barris podem ser removidos da saída\n".. - " - Se o liquid filler for colocado em cima de um tanque e se recipientes cheios forem colocados no liquid filler com um empurrador ou manualmente\\, o conteúdo é transferido para o tanque e os recipientes vazios podem ser removidos no lado de saída\n".. - "\n".. - "Deve-se observar que os barris só podem ser completamente cheios ou esvaziados. Se\\, por exemplo\\, houver menos de 10 unidades no tanque\\, este restante deve ser removido com recipientes ou bombeado vazio.\n".. - "\n".. - "\n".. - "\n", - "Os tubos amarelos são usados para a transmissão de gás e líquidos.\n".. - "O comprimento máximo do tubo é 100m.\n".. - "\n".. - "\n".. - "\n", - "Os blocos servem como aberturas de parede para os tubos\\, para que não fiquem buracos abertos.\n".. - "\n".. - "\n".. - "\n", - "Existe uma válvula para os tubos amarelos\\, que pode ser aberta e fechada com um clique do mouse.\n".. - "A válvula também pode ser controlada por comandos ligar/desligar.\n".. - "\n".. - "\n".. - "\n", - "Para alimentar seus geradores e fogões com óleo\\, você deve primeiro procurar óleo e construir uma torre de perfuração para extrair o óleo.\n".. - "Para isso\\, são utilizados o explorador de óleo TA3\\, a caixa de perfuração de óleo TA3 e o macaco de bomba de óleo TA3.\n".. - "\n".. - "\n".. - "\n", - "Você pode procurar petróleo com o explorador de petróleo. Para fazer isso\\, coloque o bloco no chão e clique com o botão direito para iniciar a busca. O explorador de petróleo pode ser usado tanto acima quanto abaixo do solo em todas as profundidades.\n".. - "A saída do chat mostra a profundidade até a qual o petróleo foi procurado e quanto petróleo foi encontrado.\n".. - "Você pode clicar várias vezes no bloco para procurar petróleo em áreas mais profundas. Os campos de petróleo variam em tamanho de 4.000 a 20.000 itens.\n".. - "\n".. - "Se a busca não der certo\\, você deve mover o bloco aproximadamente 16 m para frente.\n".. - "O explorador de petróleo sempre procura petróleo em todo o bloco do mapa e abaixo\\, no qual foi colocado. Uma nova busca no mesmo bloco do mapa (campo 16x16) portanto\\, não faz sentido.\n".. - "\n".. - "Se o petróleo for encontrado\\, a localização para a torre de perfuração é exibida. Você precisa erguer a torre de perfuração dentro da área mostrada\\, é melhor marcar o local com uma placa e proteger toda a área contra jogadores estrangeiros.\n".. - "\n".. - "Não desista de procurar petróleo muito rapidamente. Se tiver azar\\, pode levar muito tempo para encontrar um poço de petróleo.\n".. - "Também não faz sentido procurar em uma área que outro jogador já tenha procurado. A chance de encontrar petróleo é a mesma para todos os jogadores.\n".. - "\n".. - "O explorador de petróleo pode ser sempre usado para procurar petróleo.\n".. - "\n".. - "\n".. - "\n", - "A caixa de perfuração de petróleo deve ser colocada na posição indicada pelo explorador de petróleo. Perfurar petróleo em outro lugar não tem sentido.\n".. - "Se o botão na caixa de perfuração de petróleo for clicado\\, a torre de perfuração será erguida acima da caixa. Isso leva alguns segundos.\n".. - "A caixa de perfuração de petróleo tem 4 lados\\, em IN o tubo de perfuração deve ser entregue via pusher e em OUT o material de perfuração deve ser removido. A caixa de perfuração de petróleo deve ser alimentada com eletricidade por um dos outros dois lados.\n".. - "\n".. - "A caixa de perfuração de petróleo perfura até o campo de petróleo (1 metro em 16 s) e requer 16 ku de eletricidade.\n".. - "Depois que o campo de petróleo for alcançado\\, a torre de perfuração pode ser desmontada e a caixa removida.\n".. - "\n".. - "\n".. - "\n", - "A bomba de petróleo (pumpjack) deve ser colocada no lugar da caixa de perfuração de petróleo. A bomba de petróleo também requer eletricidade (16 ku) e fornece uma unidade de petróleo a cada 8 segundos. O petróleo deve ser coletado em um tanque. Para fazer isso\\, a bomba de petróleo deve ser conectada ao tanque por meio de tubos amarelos.\n".. - "Depois que todo o petróleo for bombeado para fora\\, a bomba de petróleo também pode ser removida.\n".. - "\n".. - "\n".. - "\n", - "A haste de perfuração é necessária para perfurar. Tantos itens de haste de perfuração são necessários quanto a profundidade especificada para o campo de petróleo. A haste de perfuração é inútil após a perfuração\\, mas também não pode ser desmontada e permanece no solo. No entanto\\, há uma ferramenta para remover os blocos de haste de perfuração (-> Ferramentas -> TA3 Alicate de haste de perfuração(drill pipe pliers)).\n".. - "\n".. - "\n".. - "\n", - "O tanque de petróleo é a versão grande do tanque TA3 (ver líquidos -> Tanque TA3).\n".. - "\n".. - "O tanque grande pode armazenar 4000 unidades de petróleo\\, mas também qualquer outro tipo de líquido.\n".. - "\n".. - "\n".. - "\n", - "", - "Os vagões tanque podem ser usados para transportar petróleo do poço de petróleo para a usina de processamento de petróleo. Um vagão tanque pode ser preenchido ou esvaziado diretamente usando bombas. Em ambos os casos\\, os tubos amarelos devem ser conectados ao vagão tanque de cima.\n".. - "\n".. - "Os seguintes passos são necessários:\n".. - "\n".. - " - Coloque o vagão tanque na frente do bloco para-choque da ferrovia. O bloco para-choque ainda não deve estar programado com um tempo para que o vagão tanque não comece automaticamente.\n".. - " - Conecte o vagão tanque à bomba usando tubos amarelos.\n".. - " - Ligue a bomba.\n".. - " - Programe o para-choque com um tempo (10 - 20s).\n".. - "\n".. - "Essa sequência deve ser observada em ambos os lados (encher / esvaziar).\n".. - "\n".. - "\n".. - "\n", - "Canisters and barrels can be loaded into the Minecarts. To do this\\, the oil must first be transferred to barrels. The oil barrels can be pushed directly into the Minecart with a pusher and tubes (see map). The empty barrels\\, which come back from the unloading station by Minecart\\, can be unloaded using a hopper\\, which is placed under the rail at the stop.\n".. - "\n".. - "It is not possible with the hopper to both *unload the empty barrels and load the full barrels at a stop*. The hopper immediately unloads the full barrels. It is therefore advisable to set up 2 stations on the loading and unloading side and then program the Minecart accordingly using a recording run.\n".. - "\n".. - "The plan shows how the oil can be pumped into a tank and filled into barrels via a liquid filler and loaded into Minecarts.\n".. - "\n".. - "For the Minecarts to start again automatically\\, the bumper blocks must be configured with the station name and waiting time. 5 s are sufficient for unloading. However\\, since the pushers always go into standby for several seconds when there is no Minecart\\, a time of 15 or more seconds must be entered for loading.\n".. - "\n".. - "\n".. - "\n", - "As latas e barris podem ser carregados nos Minecarts. Para fazer isso\\, o petróleo deve primeiro ser transferido para os barris. Os barris de petróleo podem ser empurrados diretamente para dentro do Minecart com um empurrador e tubos (veja o mapa). Os barris vazios\\, que retornam da estação de descarga por Minecart\\, podem ser descarregados usando um funil\\, que é colocado sob os trilhos na parada.\n".. - "\n".. - "Não é possível com o funil *descarregar os barris vazios e carregar os barris cheios em uma parada*. O funil descarrega imediatamente os barris cheios. Portanto\\, é aconselhável configurar 2 estações no lado de carregamento e descarregamento e\\, em seguida\\, programar o Minecart de acordo com uma corrida de gravação.\n".. - "\n".. - "O plano mostra como o petróleo pode ser bombeado para um tanque\\, preenchido em barris via um dispositivo de enchimento de líquidos e carregado em Minecarts.\n".. - "\n".. - "Para que os Minecarts reiniciem automaticamente\\, os blocos para-choque devem ser configurados com o nome da estação e o tempo de espera. 5 segundos são suficientes para descarregar. No entanto\\, como os empurradores sempre entram em espera por vários segundos quando não há Minecart\\, um tempo de 15 segundos ou mais deve ser inserido para carregar.\n".. - "\n".. - "\n".. - "\n", - "O carrinho-tanque é usado para transportar líquidos. Assim como os tanques\\, ele pode ser cheio com bombas ou esvaziado. Em ambos os casos\\, o tubo amarelo deve ser conectado ao caminhão-tanque de cima.\n".. - "\n".. - "Cabem 200 unidades no caminhão-tanque.\n".. - "\n".. - "\n".. - "\n", - "O carrinho-baú é usado para transportar itens. Assim como os baús\\, ele pode ser cheio ou esvaziado usando um empurrador.\n".. - "\n".. - "Cabem 4 pilhas no carrinho de baú.\n".. - "\n".. - "\n".. - "\n", - "O petróleo é uma mistura de substâncias e consiste em muitos componentes. O petróleo pode ser decomposto em seus principais componentes\\, como betume\\, óleo combustível\\, nafta\\, gasolina e gás propano\\, por meio de uma torre de destilação.\n".. - "O processamento adicional para produtos finais ocorre no reator químico.\n".. - "\n".. - "\n".. - "\n", - "A torre de destilação deve ser montada como no plano no canto superior direito.\n".. - "O betume é drenado pelo bloco de base. A saída está na parte de trás do bloco de base (observe a direção da seta).\n".. - "Os blocos \"torre de destilação\" com os números: 1\\, 2\\, 3\\, 2\\, 3\\, 2\\, 3\\, 4 são colocados sobre este bloco base.\n".. - "Óleo combustível\\, nafta e gasolina são drenados das aberturas de baixo para cima. O gás propano é capturado no topo.\n".. - "Todas as aberturas na torre devem ser conectadas a tanques.\n".. - "O reboiler deve ser conectado ao bloco \"torre de destilação 1\".\n".. - "\n".. - "O reboiler precisa de eletricidade (não mostrado no plano)!\n".. - "\n".. - "\n".. - "\n", - "O reboiler aquece o petróleo para aproximadamente 400 °C. Ele evapora em grande parte e é alimentado na torre de destilação para resfriamento.\n".. - "\n".. - "O reboiler requer 14 unidades de eletricidade e produz uma unidade de betume\\, óleo combustível\\, nafta\\, gasolina e propano a cada 16s.\n".. - "Para isso\\, o reboiler deve ser alimentado com petróleo por meio de uma bomba.\n".. - "\n".. - "\n".. - "\n", - "Além dos tubos para transporte de mercadorias\\, bem como os tubos de gás e energia\\, há também um nível de comunicação sem fio através do qual os blocos podem trocar dados entre si. Não é necessário desenhar linhas para isso\\, a conexão entre transmissor e receptor é feita apenas através do número do bloco.\n".. - "\n".. - "*Info:* Um número de bloco é um número único gerado pelo Techage quando muitos blocos do Techage são colocados. O número do bloco é usado para endereçamento durante a comunicação entre controladores e máquinas Techage. Todos os blocos que podem participar dessa comunicação mostram o número do bloco como texto de informações se você fixar o bloco com o cursor do mouse.\n".. - "\n".. - "Quais comandos um bloco suporta podem ser lidos e exibidos com a TechAge Info Tool (chave inglesa ou wrench).\n".. - "Os comandos mais simples suportados por quase todos os blocos são:\n".. - "\n".. - " - 'on' - para ligar o bloco / máquina / lâmpada\n".. - " - 'off' - para desligar o bloco / máquina / lâmpada\n".. - "\n".. - "Com a ajuda do Terminal TA3\\, esses comandos podem ser testados muito facilmente. Suponha que uma lâmpada de sinalização seja o número 123.\n".. - "Então com:\n".. - "\n".. - " cmd 123 on\n".. - "\n".. - "a lâmpada pode ser ligada e com:\n".. - "\n".. - " cmd 123 off\n".. - "\n".. - "a lâmpada pode ser desligada novamente. Esses comandos devem ser inseridos no campo de entrada do terminal TA3.\n".. - "\n".. - "Comandos como 'on' e 'off' são enviados ao destinatário sem que uma resposta seja enviada de volta. Portanto\\, esses comandos podem ser enviados para vários destinatários ao mesmo tempo\\, por exemplo\\, com um botão de pressão / interruptor\\, se vários números forem inseridos no campo de entrada.\n".. - "\n".. - "Um comando como 'state' solicita o status de um bloco. O bloco então envia seu status de volta. Esse tipo de comando confirmado só pode ser enviado para um destinatário de cada vez.\n".. - "Esse comando também pode ser testado com o terminal TA3 em um empurrador\\, por exemplo:\n".. - "\n".. - " cmd 123 state\n".. - "\n".. - "As respostas possíveis do empurrador são:\n".. - "\n".. - " - 'running' -> Estou funcionando\n".. - " - 'stopped' -> desligado\n".. - " - 'standby' -> nada a fazer porque o inventário da fonte está vazio\n".. - " - 'blocked' -> não pode fazer nada porque o inventário de destino está cheio\n".. - "\n".. - "Esse status e outras informações também são exibidos quando a chave inglesa(wrench) é clicada no bloco.\n".. - "\n".. - "\n".. - "\n", - "O botão/interruptor envia comandos 'on' / 'off' para os blocos que foram configurados através dos números.\n".. - "O botão/interruptor pode ser configurado como um botão ou um interruptor. Se for configurado como um botão\\, o tempo entre os comandos 'on' e 'off' pode ser definido. Com o modo de operação \"no botão\"\\, apenas um comando 'on' e nenhum comando 'off' é enviado.\n".. - "\n".. - "A caixa de seleção \"público\" pode ser usada para definir se o botão pode ser usado por todos (marcado) ou apenas pelo próprio proprietário (não marcado).\n".. - "\n".. - "Nota: Com o programador\\, os números dos blocos podem ser facilmente coletados e configurados.\n".. - "\n".. - "\n".. - "\n", - "Com o conversor de comandos TA3\\, os comandos 'on' / 'off' podem ser convertidos em outros comandos\\, e o encaminhamento pode ser impedido ou atrasado.\n".. - "Deve-se inserir o número do bloco de destino ou os números dos blocos de destino\\, os comandos a serem enviados e os tempos de atraso em segundos. Se nenhum comando for inserido\\, nada será enviado.\n".. - "\n".. - "Os números também podem ser programados usando o programador Techage(programmer).\n".. - "\n".. - "\n".. - "\n", - "O flip-flop TA3 muda de estado a cada comando 'on' recebido. Os comandos 'off' recebidos são ignorados. Dependendo da alteração de status\\, os comandos 'on' / 'off' são enviados alternadamente. Deve-se inserir o número do bloco de destino ou os números dos blocos de destino. Os números também podem ser programados usando o programador Techage.\n".. - "\n".. - "Por exemplo\\, lâmpadas podem ser ligadas e desligadas com a ajuda de botões.\n".. - "\n".. - "\n".. - "\n", - "O bloco lógico TA3 pode ser programado de forma que um ou mais comandos de entrada estejam vinculados a um comando de saída e sejam enviados. Este bloco pode\\, portanto\\, substituir vários elementos lógicos\\, como AND\\, OR\\, NOT\\, XOR\\, etc.\n".. - "Os comandos de entrada para o bloco lógico são comandos 'ligar' / 'desligar'.\n".. - "Os comandos de entrada são referenciados pelo número\\, por exemplo\\, '1234' para o comando do remetente com o número 1234.\n".. - "O mesmo se aplica aos comandos de saída.\n".. - "\n".. - "Uma regra é estruturada da seguinte forma:\n".. - "\n".. - " = on/off if is true\n".. - "\n".. - "'' é o número do bloco para o qual o comando deve ser enviado.\n".. - "'' é uma expressão booleana onde os números de entrada são avaliados.\n".. - "\n".. - "*Exemplos para a expressão de entrada*\n".. - "\n".. - "Negar sinal (NOT):\n".. - "\n".. - " 1234 == off\n".. - "\n".. - "AND lógico:\n".. - "\n".. - " 1234 == on e 2345 == on\n".. - "\n".. - "OR lógico:\n".. - "\n".. - " 1234 == ligar ou 2345 == ligar\n".. - "\n".. - "Os seguintes operadores são permitidos: 'and' 'or' 'on' 'off' 'me' '==' '~=' '(' ')'\n".. - "\n".. - "Se a expressão for verdadeira\\, um comando é enviado para o bloco com o número ''.\n".. - "Até quatro regras podem ser definidas\\, sendo que todas as regras são sempre verificadas quando um comando é recebido.\n".. - "O tempo interno de processamento para todos os comandos é de 100 ms.\n".. - "\n".. - "Seu próprio número de nó pode ser referenciado usando a palavra-chave 'me'. Isso permite que o bloco envie a si mesmo um comando (função flip-flop).\n".. - "\n".. - "O tempo de bloqueio define uma pausa após um comando\\, durante a qual o bloco lógico não aceita mais comandos externos. Comandos recebidos durante o período de bloqueio são descartados. O tempo de bloqueio pode ser definido em segundos.\n".. - "\n".. - "\n".. - "\n", - "O repetidor envia o sinal recebido para todos os números configurados.\n".. - "Isso pode fazer sentido\\, por exemplo\\, se você quiser controlar muitos blocos ao mesmo tempo. O repetidor pode ser configurado com o programador\\, o que não é possível com todos os blocos.\n".. - "\n".. - "\n".. - "\n", - "O sequenciador pode enviar uma série de comandos 'on' / 'off'\\, em que o intervalo entre os comandos deve ser especificado em segundos. Você pode usá-lo para fazer uma lâmpada piscar\\, por exemplo.\n".. - "Até 8 comandos podem ser configurados\\, cada um com número de bloco de destino e aguardando o próximo comando.\n".. - "O sequenciador repete os comandos indefinidamente quando \"Run endless\" está ativado.\n".. - "Se nada for selecionado\\, apenas o tempo especificado em segundos é aguardado.\n".. - "\n".. - "\n".. - "\n", - "O temporizador pode enviar comandos controlados pelo tempo. O horário\\, o(s) número(s) de destino e o comando em si podem ser especificados para cada linha de comando. Isso significa que as lâmpadas podem ser ligadas à noite e desligadas pela manhã.\n".. - "\n".. - "\n".. - "\n", - "O terminal é usado principalmente para testar a interface de comando de outros blocos (veja \"Blocos lógicos / de comutação\").\n".. - "Você também pode atribuir comandos a teclas e usar o terminal de maneira produtiva.\n".. - "\n".. - " set \n".. - "\n".. - "Com 'set 1 ON cmd 123 on'\\, por exemplo\\, a tecla do usuário 1 pode ser programada com o comando 'cmd 123 on'. Se a tecla for pressionada\\, o comando é enviado e a resposta é exibida na tela.\n".. - "\n".. - "O terminal possui os seguintes comandos locais:\n".. - "\n".. - " - 'clear' limpa a tela\n".. - " - 'help' exibe uma página de ajuda\n".. - " - 'pub' alterna para o modo público\n".. - " - 'priv' alterna para o modo privado\n".. - "\n".. - "No modo privado\\, o terminal só pode ser usado por jogadores que podem construir neste local\\, ou seja\\, que têm direitos de proteção.\n".. - "\n".. - "No modo público\\, todos os jogadores podem usar as teclas preconfiguradas.\n".. - "\n".. - "\n".. - "\n", - "A lâmpada de sinalização pode ser ligada ou desligada com o comando 'on' / 'off'. Esta lâmpada não precisa de eletricidade e pode ser colorida com a ferramenta de aerografia do mod \"Dyes Unificados\" e via comandos Lua/Beduino.\n".. - "\n".. - "Com o comando de chat '/ta_color'\\, a paleta de cores com os valores para os comandos Lua/Beduino é exibida e com '/ta_send color ' a cor pode ser alterada.\n".. - "\n".. - "\n".. - "\n", - "Com esses blocos\\, você pode criar portas e portões que podem ser abertos por meio de comandos (blocos desaparecem) e fechados novamente. Um controlador de porta é necessário para cada portão ou porta.\n".. - "\n".. - "A aparência dos blocos pode ser ajustada por meio do menu de blocos.\n".. - "Isso permite a criação de portas secretas que só se abrem para certos jogadores (com a ajuda do detector de jogadores).\n".. - "\n".. - "\n".. - "\n", - "O controlador de porta é usado para controlar os blocos de porta/portão TA3. Com o controlador de porta\\, os números dos blocos de porta/portão devem ser inseridos. Se um comando 'on' / 'off' for enviado para o controlador de porta\\, isso abre/fecha a porta ou portão.\n".. - "\n".. - "\n".. - "\n", - "O Controlador de Porta II pode remover e definir todos os tipos de blocos. Para ensinar ao Controlador de Porta II\\, o botão \"Record\" deve ser pressionado. Em seguida\\, todos os blocos que devem fazer parte da porta/portão devem ser clicados. Depois\\, o botão \"Done\" deve ser pressionado. Até 16 blocos podem ser selecionados. Os blocos removidos são salvos no inventário do controlador. A função do controlador pode ser testada manualmente usando os botões \"Remove\" ou \"Set\". Se um comando 'on' /'off' for enviado para o Controlador de Porta II\\, ele remove ou define os blocos também.\n".. - "\n".. - "Com '$send_cmnd(número_do_nó\\, \"exchange\"\\, 2)' blocos individuais podem ser definidos\\, removidos ou substituídos por outros blocos do inventário.\n".. - "\n".. - "Com '$send_cmnd(número_do_nó\\, \"set\"\\, 2)' um bloco do inventário pode ser definido explicitamente\\, desde que o slot do inventário não esteja vazio.\n".. - "\n".. - "Um bloco pode ser removido novamente com '$send_cmnd(número_do_nó\\, \"dig\"\\, 2)' se o slot do inventário estiver vazio.\n".. - "\n".. - "O nome do bloco definido é retornado com '$send_cmnd(número_do_nó\\, \"get\"\\, 2)'.\n".. - "\n".. - "O número do slot do inventário (1 .. 16) deve ser passado como carga útil em todos os três casos.\n".. - "\n".. - "Isso também pode ser usado para simular escadas extensíveis e coisas do tipo.\n".. - "\n".. - "\n".. - "\n", - "Diferentes sons podem ser reproduzidos com o bloco de som. Todos os sons dos Mods Techage\\, Signs Bot\\, Hyperloop\\, Unified Inventory\\, TA4 Jetpack e Minetest Game estão disponíveis.\n".. - "\n".. - "Os sons podem ser selecionados e reproduzidos pelo menu e via comando.\n".. - "\n".. - " - Comando 'on' para reproduzir um som\n".. - " - Comando 'sound <índice>' para selecionar um som via o índice\n".. - " - Comando 'gain ' para ajustar o volume via o valor '' (1 a 5).\n".. - "\n".. - "\n".. - "\n", - "O conversor Mesecons é utilizado para converter comandos de ligar/desligar do Techage em sinais Mesecons e vice-versa.\n".. - "Para fazer isso\\, um ou mais números de nó devem ser inseridos e o conversor deve ser conectado a blocos Mesecons por meio de cabos Mesecons. O conversor Mesecons também pode ser configurado com o programador.\n".. - "O conversor Mesecons aceita até 5 comandos por segundo\\; ele se desativa em cargas mais altas.\n".. - "\n".. - "*Este nó só existe se o mod mesecons estiver ativo!*\n".. - "\n".. - "\n".. - "\n", - "Os detectores escaneiam o ambiente e enviam um comando 'on' quando a busca é reconhecida.\n".. - "\n".. - "\n".. - "\n", - "O detector é um bloco de tubo especial que detecta quando itens passam pelo tubo. Para fazer isso\\, ele deve ser conectado a tubos dos dois lados. Se os itens forem empurrados para o detector com um empurrador(pusher)\\, eles são passados automaticamente.\n".. - "Ele envia um comando 'on' quando um item é reconhecido\\, seguido por um 'off' um segundo depois.\n".. - "Em seguida\\, outros comandos são bloqueados por 8 segundos.\n".. - "O tempo de espera e os itens que devem acionar um comando podem ser configurados usando o menu de chave inglesa(wrench).\n".. - "\n".. - "\n".. - "\n", - "O detector de carrinho envia um comando 'on' se reconhecer um carrinho (Minecart) diretamente na frente dele. Além disso\\, o detector também pode reiniciar o carrinho quando recebe um comando 'on'.\n".. - "\n".. - "O detector também pode ser programado com seu próprio número. Nesse caso\\, ele empurra todos os vagões que param perto dele (um bloco em todas as direções).\n".. - "\n".. - "\n".. - "\n", - "O detector de nó envia um comando 'on' se detectar que nós (blocos) aparecem ou desaparecem na frente dele\\, mas deve ser configurado de acordo. Após retornar o detector ao estado padrão (bloco cinza)\\, um comando 'off' é enviado. Blocos válidos são todos os tipos de blocos e plantas\\, mas não animais ou jogadores. O alcance do sensor é de 3 blocos por metro na direção da seta.\n".. - "\n".. - "\n".. - "\n", - "O detector de jogador envia um comando 'on' se detectar um jogador dentro de 4m do bloco. Se o jogador sair da área\\, um comando 'off' é enviado.\n".. - "Se a pesquisa deve ser limitada a jogadores específicos\\, esses nomes de jogador também podem ser inseridos.\n".. - "\n".. - "\n".. - "\n", - "O detector de luz envia um comando 'on' se o nível de luz do bloco acima exceder um certo nível\\, que pode ser definido através do menu de clique direito.\n".. - "Se você tiver um Controlador Lua TA4\\, pode obter o nível exato de luz com $get_cmd(num\\, 'light_level')\n".. - "\n".. - "\n".. - "\n", - "TA3 possui as mesmas máquinas que o TA2\\, apenas estas são mais poderosas e requerem eletricidade em vez de movimento por eixo.\n".. - "Portanto\\, abaixo são fornecidos apenas os dados técnicos diferentes.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A capacidade de processamento é de 6 itens a cada 2 segundos.\n".. - "\n".. - "\n".. - "\n", - "A função do Distribuidor TA3 corresponde à do TA2.\n".. - "A capacidade de processamento é de 12 itens a cada 4 segundos.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A capacidade de processamento é de 2 itens a cada 4 segundos. O autocrafter requer 6 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2\\, apenas os chips WLAN do TA4 são produzidos aqui.\n".. - "A capacidade de processamento é de um chip a cada 6 segundos. O bloco requer 12 ku de eletricidade para isso.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A profundidade máxima é de 40 metros. A pedreira requer 12 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A capacidade de processamento é de 2 itens a cada 4 segundos. O bloco requer 4 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A probabilidade também é a mesma que a do TA2. O bloco também requer 3 ku de eletricidade.\n".. - "Mas\\, ao contrário do TA2\\, o status do bloco TA3 pode ser lido (controlador)\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A capacidade de processamento é de 2 itens a cada 4 segundos. O bloco requer 6 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "O injetor é um TA3 pusher com propriedades especiais. Ele possui um menu para configuração. Até 8 itens podem ser configurados aqui. Ele apenas pega esses itens de um baú para passá-los para as máquinas com receitas (autocrafter\\, forno industrial e electronic fab).\n".. - "\n".. - "Ao passar\\, apenas uma posição no inventário é usada na máquina de destino. Se\\, por exemplo\\, apenas as três primeiras entradas estiverem configuradas no injetor\\, apenas as três primeiras posições de armazenamento no inventário da máquina serão usadas. Isso evita o transbordamento no inventário da máquina.\n".. - "\n".. - "O injetor também pode ser alternado para o \"modo pull\". Então ele apenas retira itens do baú das posições que estão definidas na configuração do injetor. Nesse caso\\, o tipo e a posição do item devem corresponder. Isso permite esvaziar entradas específicas do inventário de um baú.\n".. - "\n".. - "A capacidade de processamento é de até 8 vezes um item a cada 4 segundos.\n".. - "\n".. - "\n".. - "\n", - "", - "O Techage Info Tool (chave inglesa de ponta aberta) possui várias funções. Ele mostra a hora\\, posição\\, temperatura e bioma quando um bloco desconhecido é clicado.\n".. - "Se você clicar em um bloco TechAge com interface de comando\\, todos os dados disponíveis serão mostrados (consulte também \"Blocos lógicos / de comutação\").\n".. - "\n".. - "Com Shift + clique direito\\, um menu estendido pode ser aberto para alguns blocos. Dependendo do bloco\\, dados adicionais podem ser chamados ou configurações especiais podem ser feitas aqui. No caso de um gerador\\, por exemplo\\, a curva de carga/desligamento pode ser programada.\n".. - "\n".. - "\n".. - "\n", - "Com o programador\\, números de bloco podem ser coletados de vários blocos com um clique direito e gravados em um bloco como um botão / interruptor com um clique esquerdo.\n".. - "Se você clicar no ar\\, a memória interna é apagada.\n".. - "\n".. - "\n".. - "\n", - "A colher de pedreiro é usada para revestir cabos de energia. Veja também \"Cabo de energia TA\".\n".. - "\n".. - "\n".. - "\n", - "Esta ferramenta pode ser usada para remover blocos de tubo se\\, por exemplo\\, um túnel precisar passar por lá.\n".. - "\n".. - "\n".. - "\n", - "A chave de fenda Techage serve como substituto da chave de fenda normal. Ela possui as seguintes funções:\n".. - "\n".. - " - Clique esquerdo: girar o bloco para a esquerda\n".. - " - Clique direito: girar a face visível do bloco para cima\n".. - " - Shift + clique esquerdo: salvar o alinhamento do bloco clicado\n".. - " - Shift + clique direito: aplicar o alinhamento salvo ao bloco clicado\n".. - "\n".. - " \n".. - "\n", - "A TechAge Assembly Tool é usada para remover e reposicionar blocos Techage sem que esses blocos percam seu número de bloco ou recebam um novo número ao serem configurados. Isso é útil\\, por exemplo\\, para pedreiras\\, já que muitas vezes precisam ser movidas.\n".. - "\n".. - " - Botão esquerdo: remover um bloco\n".. - " - Botão direito: configurar um bloco\n".. - "\n".. - "O bloco que foi removido anteriormente com a ferramenta de montagem e que será colocado novamente deve estar no extremo esquerdo do inventário do jogador.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta3", - "", - "ta3_firebox", - "ta3_oilbox", - "ta3_boiler", - "ta3_turbine", - "ta3_generator", - "ta3_cooler", - "ta3_powerswitch", - "power_reduction", - "ta3_powercable", - "ta3_powerjunction", - "ta3_powerline", - "ta3_powerpole", - "ta3_powerpole4", - "ta3_powerpole2", - "ta3_powerswitch", - "ta3_powerswitchsmall", - "ta3_powerswitchbox", - "ta3_tinygenerator", - "ta3_akkublock", - "ta3_powerterminal", - "ta3_motor", - "", - "ta3_furnacefirebox", - "ta3_furnace", - "ta3_booster", - "", - "ta3_tank", - "ta3_pump", - "ta3_filler", - "ta3_pipe", - "ta3_pipe_wall_entry", - "ta3_valve", - "techage_ta3", - "ta3_oilexplorer", - "ta3_drillbox", - "ta3_pumpjack", - "ta3_drillbit", - "oiltank", - "", - "tank_cart", - "", - "", - "tank_cart", - "chest_cart", - "techage_ta31", - "", - "reboiler", - "ta3_logic", - "ta3_button", - "ta3_command_converter", - "ta3_flipflop", - "ta3_logic", - "ta3_repeater", - "ta3_sequencer", - "ta3_timer", - "ta3_terminal", - "ta3_colorlamp", - "ta3_doorblock", - "ta3_doorcontroller", - "ta3_doorcontroller", - "ta3_soundblock", - "ta3_mesecons_converter", - "ta3_nodedetector", - "ta3_detector", - "ta3_cartdetector", - "ta3_nodedetector", - "ta3_playerdetector", - "ta3_lightdetector", - "ta3_grinder", - "ta3_pusher", - "ta3_distributor", - "ta3_autocrafter", - "ta3_electronicfab", - "ta3_quarry", - "ta3_gravelsieve", - "ta3_gravelrinser", - "ta3_grinder", - "ta3_injector", - "", - "ta3_end_wrench", - "ta3_programmer", - "ta3_trowel", - "ta3_drill_pipe_wrench", - "ta3_screwdriver", - "techage:assembly_tool", - }, - plans = { - "", - "coalpowerstation", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_furnace", - "", - "", - "", - "ta3_tank", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta3_loading", - "ta3_loading", - "", - "", - "", - "ta3_distiller", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta4_DE.lua b/techage/doc/manual_ta4_DE.lua deleted file mode 100644 index 92aee0e..0000000 --- a/techage/doc/manual_ta4_DE.lua +++ /dev/null @@ -1,1052 +0,0 @@ -return { - titles = { - "1,TA4: Gegenwart", - "2,Windkraftanlage", - "3,TA4 Windkraftanlage / Wind Turbine", - "3,TA4 Windkraftanlagengondel / Wind Turbine Nacelle", - "3,TA4 Wind Turbine Signal Lamp", - "3,TA4 Säule / Pillar", - "2,Solaranlage", - "3,TA4 Solarmodul / Solar Module", - "3,TA4 Solar Trägermodul / Carrier Module", - "3,TA4 Solar Wechselrichter / Solar Inverter", - "3,TA4 Niederspannungskabel / Low Power Cable", - "3,TA4 Niederspannungsverteilerbox / Low Power Box", - "3,TA4 Straßenlampen-Solarzelle / Streetlamp Solar Cell", - "2,Energiespeicher", - "3,TA4 Wärmetauscher / Heat Exchanger", - "3,TA4 Turbine", - "3,TA4 Generator", - "3,TA4 Rohrzulauf / TA4 Pipe Inlet", - "3,TA4 Röhre / Pipe", - "2,Stromverteilung", - "3,TA4 Trenntransformator / TA4 Isolation Transformer", - "3,TA4 Stromzähler / TA4 Electric Meter", - "3,TA4 Laser", - "2,Wasserstoff", - "3,Elektrolyseur", - "3,Brennstoffzelle", - "2,Chemischer Reaktor / chemical reactor", - "3,TA4 Dosierer / doser", - "3,TA4 Reaktor / reactor", - "3,TA4 Einfüllstutzen / fillerpipe", - "3,TA4 Reaktorständer / reactor stand", - "3,TA4 Reaktorsockel / reactor base", - "3,TA4 Silo / silo", - "2,ICTA Controller", - "3,TA4 ICTA Controller", - "3,Batterie", - "3,TA4 Display", - "3,TA4 Display XL", - "3,TA4 Signal Tower", - "2,TA4 Lua Controller", - "3,TA4 Lua Server", - "3,TA4 Sensor Kiste/Chest", - "3,TA4 Lua Controller Terminal", - "2,TA4 Logik-/Schalt-Module", - "3,TA4 Taster/Schalter / Button/Switch", - "3,TA4 2x Taster / 2x Button", - "3,TA4 4x Taster / 4x Button", - "3,TA4 2x Signallampe / 2x Signal Lamp", - "3,TA4 4x Signallampe / 4x Signal Lamp", - "3,TA4 Spieler Detektor / Player Detector", - "3,TA4 Zustandssammler / State Collector", - "3,TA4 Detektor / Detector", - "3,TA4 Block Detektor / Node Detector", - "3,TA4 Energiespeicher-Ladungsdetektor / Energy Storage Charge Detector", - "3,TA4 Blicksensor / Gaze Sensor", - "3,TA4 Sequenzer", - "2,Move/Dreh-Controller", - "3,TA4 Move Controller", - "3,TA4 Drehcontroller / Turn Controller", - "2,TA4 Lampen", - "3,TA4 LED Pflanzenlampe / TA4 LED Grow Light", - "3,TA4 LED Straßenlampe / TA4 LED Street Lamp", - "3,TA4 LED Industrielampe / TA4 LED Industrial Lamp", - "2,TA4 Flüssigkeitsfilter", - "3,Fundament-Ebene", - "3,Schotter-Ebene", - "3,Einfüll-Ebene", - "2,TA4 Teilchenbeschleuniger / Collider", - "3,Detektor", - "3,Steuerung / TA4 Terminal", - "3,Kühlung und Strom", - "3,Aufbau", - "2,Weitere TA4 Blöcke", - "3,TA4 Rezept Block", - "3,TA4 Autocrafter", - "3,TA4 Tank / TA4 Tank", - "3,TA4 Pumpe / TA4 Pump", - "3,TA4 Ofenheizung / furnace heater", - "3,TA4 Wasserpumpe / Water Pump (veraltet)", - "3,TA4 Wassereinlass / TA4 Water Inlet", - "3,TA4 Röhren / TA4 Tube", - "3,TA4 Schieber / Pusher", - "3,TA4 Kiste / TA4 Chest", - "3,TA4 8x2000 Kiste / TA4 8x2000 Chest", - "3,TA4 Verteiler / Distributor", - "3,TA4 Hochleistungs-Verteiler / High Performance Distributor", - "3,TA4 Kiessieb / Gravel Sieve", - "3,TA4 Mühle / Grinder", - "3,TA4 Steinbrecher / Quarry", - "3,TA4 Elektronikfabrik / Electronic Fab", - "3,TA4 Injektor / Injector", - "3,TA4 Recycler", - }, - texts = { - "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".. - "\n".. - "\n", - "Eine Windkraftanlage liefern immer dann Strom\\, wenn Wind vorhanden ist. Im Spiel gibt es keinen Wind\\, aber die Mod simuliert dies dadurch\\, dass sich nur morgens (5:00 - 9:00) und abends (17:00 - 21:00) die Windräder drehen. Eine Windkraftanlage liefert nur dann Strom\\, wenn sie an einer geeigneten Stelle aufgestellt ist.\n".. - "\n".. - "Die TA Windkraftanlagen sind reine Offshore Anlagen\\, das heißt\\, die müssen im Meer errichtet werden. Dies bedeutet\\, dass Windkraftanlagen nur in einem Meer (occean) Biom errichtet werden können und dass um den Mast herum ausreichend Wasser und freie Sicht vorhanden sein müssen.\n".. - "\n".. - "Um eine geeignete Stelle zu finden\\, musst du mit dem Schraubenschlüssel (TechAge Info Werkzeug) auf das Wasser klicken. Ob diese Stelle für den Mast der Windkraftanlage geeignet ist\\, wird dir als Chat Nachricht angezeigt.\n".. - "\n".. - "Der Strom muss vom Rotor-Block durch den Mast nach unten geführt werden. Dazu zuerst die Stromleitung nach oben ziehen und das Stromkabel dann mit TA4 Säulenblöcke \"verputzen\". Unten kann eine Arbeitsplattform errichtet werden. Der Plan rechts zeigt den Aufbau im oberen Teil.\n".. - "\n".. - "Die Windkraftanlage liefert eine Leistung von 70 ku\\, aber dies nur 8 Stunden am Tag (siehe oben).\n".. - "\n".. - "\n".. - "\n", - "Der Windkraftanlagenblock (Rotor) ist das Herzstück der Windkraftanlage. Dieser Block muss oben auf den Mast gesetzt werden. Idealerweise auf Y = 15\\, dann bleibst du noch gerade innerhalb eines Map-/Forceload-Blocks.\n".. - "Beim Starten der Windkraftanlage werden alle Bedingungen für den Betrieb der Windkraftanlage überprüft. Sofern alle Bedingungen erfüllt sind\\, erscheinen auch automatisch die Rotorblätter (Flügel). Anderenfalls wird eine Fehlermeldung angezeigt. \n".. - "\n".. - "\n".. - "\n", - "Dieser Block muss an das schwarze Ende des Wind Turbinen Block gesetzt werden.\n".. - "\n".. - "\n".. - "\n", - "Dieses Blinklicht ist nur für dekorative Zwecke und kann oben auf den Wind Turbinen Block gesetzt werden.\n".. - "\n".. - "\n".. - "\n", - "Damit wird der Mast für die Windkraftanlage gebaut. Allerdings werden diese Blöcke nicht von Hand gesetzt sondern müssen mit Hilfe der Kelle gesetzt werden\\, so dass die Stromleitung zur Mastspitze mit diesen Blöcken ersetzt wird (siehe unter TA Stromkabel).\n".. - "\n".. - "\n".. - "\n", - "Die Solaranlage produziert nur Strom\\, wenn die Sonne scheint. Im Spiel ist das jeder Spieltag von morgens 6:00 bis abends 18:00.\n".. - "In dieser Zeit steht immer die gleiche Leistung zur Verfügung. Nach 18:00 schalten die Solarmodule komplett ab.\n".. - "\n".. - "Für die Leistung der Solarmodule ist die Biome Temperatur entscheidend. Je heißer die Temperatur\\, um so höher der Ertrag.\n".. - "Die Biome Temperatur kann mit dem Techage Info Tool (Schraubenschlüssel) bestimmt werden. Sie schwankt typischerweise zwischen 0 und 100:\n".. - "\n".. - " - bei 100 steht die volle Leistung zur Verfügung\n".. - " - bei 50 steht die halbe Leistung zur Verfügung\n".. - " - bei 0 steht keine Leistung zur Verfügung\n".. - "\n".. - "Es empfiehlt sich daher\\, nach heißen Steppen und Wüsten für die Solaranlage Ausschau zu halten.\n".. - "Für den Stromtransport stehen die Überlandleitungen zur Verfügung.\n".. - "Es kann aber auch Wasserstoff produziert werden\\, welcher sich transportieren und am Ziel wieder zu Strom umwandeln lässt.\n".. - "\n".. - "Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden\\, die zwei Solarmodule dann links und rechts daneben (nicht darüber!).\n".. - "\n".. - "Der Plan rechts zeigt 3 Einheiten mit je zwei Solarmodulen und einem Trägermodul\\, über rote Kabel mit dem Wechselrichter verbunden.\n".. - "\n".. - "Solarmodule liefern Gleichspannung\\, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser besteht aus zwei Blöcken\\, einen für das rote Kabel zu den Solarmodulen (DC) und einen für das graue Stromkabel ins Stromnetz (AC).\n".. - "\n".. - "Der Kartenbereich\\, wo die Solaranlage steht\\, muss komplett geladen sein. Die gilt auch für die direkte Position über dem Solarmodul\\, denn dort wird regelmäßig die Lichtstärke gemessen. Es empfiehlt sich daher\\, zuerst einen Forceload Block zu setzen\\, und dann innerhalb dieses Bereiches die Module zu platzieren.\n".. - "\n".. - "\n".. - "\n", - "Das Solarmodul muss an das Trägermodul gesetzt werden. Es sind immer zwei Solarmodule notwendig.\n".. - "Im Paar leisten die Solarmodule bis 3 ku\\, je nach Temperatur.\n".. - "Bei den Solarmodul muss darauf geachtet werden\\, dass diese das volle Tageslicht haben und nicht durch Blöcke oder Bäume beschattet sind. Getestet kann dies mit dem Info Tool (Schraubenschlüssel).\n".. - "\n".. - "\n".. - "\n", - "Das Trägermodul gibt es in zwei Bauhöhen (1m und 2m). Funktionell sind beide identisch.\n".. - "Die Trägermodule können direkt aneinander gesetzt und so zu einer Modulreihe verbunden werden. Die Verbindung zum Wechselrichter oder zu anderen Modulreihen muss mit den roten Niederspannungskabeln bzw. den Niederspannungsverteilerboxen hergestellt werden.\n".. - "\n".. - "\n".. - "\n", - "Der Wechselrichter wandelt den Solarstrom (DC) in Wechselstrom (AC) um\\, so dass dieser in das Stromnetz eingespeist werden kann.\n".. - "Ein Wechselrichter kann maximal 100 ku an Strom einspeisen\\, was 33 Solarmodulen oder auch mehr entspricht.\n".. - "\n".. - "\n".. - "\n", - "Das Niederspannungskabel dient zur Verbindung von Solar-Modulreihen mit dem Wechselrichter. Das Kabel darf nicht für andere Zwecke benutzt werden.\n".. - "\n".. - "Die maximale Leitungslänge beträgt 200 m.\n".. - "\n".. - "\n".. - "\n", - "Die Verteilerbox muss auf den Boden gesetzt werden. Sie besitzt nur 4 Anschlüsse (in die 4 Himmelsrichtungen).\n".. - "\n".. - "\n".. - "\n", - "Die Straßenlampen-Solarzelle dient\\, wie der Name schon sagt\\, zur Stromversorgung einer Straßenlampe. Dabei kann eine Solarzelle zwei Lampen versorgen. Die Solarzelle speichert die Sonnenenergie tagsüber und gibt den Strom Nachts an die Lampe ab. Das bedeutet\\, die Lampe leuchtet nur im Dunkeln.\n".. - "\n".. - "Diese Solarzelle kann nicht mit den anderen Solarmodulen kombiniert werden.\n".. - "\n".. - "\n".. - "\n", - "Der TA4 Energiespeicher ersetzt den Batterie Block aus TA3.\n".. - "\n".. - "Der Energiespeicher besteht aus einer Betonhülle (Concrete Block) gefüllt mit Gravel. Es gibt 5 Größen vom Speicher:\n".. - "\n".. - " - Hülle mit 5x5x5 Concrete Blocks\\, gefüllt mit 27 Gravel\\, Speicherkapazität: 22.5 kud\n".. - " - Hülle mit 7x7x7 Concrete Blocks\\, gefüllt mit 125 Gravel\\, Speicherkapazität: 104 kud\n".. - " - Hülle mit 9x9x9 Concrete Blocks\\, gefüllt mit 343 Gravel\\, Speicherkapazität: 286 kud\n".. - " - Hülle mit 11x11x11 Concrete Blocks\\, gefüllt mit 729 Gravel\\, Speicherkapazität: 610 kud\n".. - " - Hülle mit 13x13x13 Concrete Blocks\\, gefüllt mit 1331 Gravel\\, Speicherkapazität: 1112 kud\n".. - "\n".. - "In der Betonhülle darf ein Fenster aus einem Obsidian Glas Block sein. Dieses muss ziemlich in der Mitte der Wand platziert werden. Durch dieses Fenster sieht man\\, ob der Speicher mehr als 80 % geladen ist. Im Plan rechts sieht man den Aufbau aus TA4 Wärmetauscher bestehend aus 3 Blöcken\\, der TA4 Turbine und dem TA4 Generator. Beim Wärmetauscher ist auf die Ausrichtung zu achten (der Pfeil bei Block 1 muss zur Turbine zeigen).\n".. - "\n".. - "Entgegen dem Plan rechts müssen die Anschlüsse am Speicherblock auf gleicher Ebene sein (horizontal angeordnet\\, also nicht unten und oben). Die Rohrzuläufe (TA4 Pipe Inlet) müssen genau in der Mitte der Wand sein und stehen sich damit gegenüber. Als Röhren kommen die gelben TA4 Röhren zum Einsatz. Die TA3 Dampfrohre können hier nicht verwendet werden.\n".. - "Sowohl der Generator als auch der Wärmetauscher haben einen Stromanschluss und müssen mit dem Stromnetz verbunden werden.\n".. - "\n".. - "Im Prinzip arbeitet das das Wärmespeichersystem genau gleich wie die Akkus\\, nur mit viel mehr Speicherkapazität. \n".. - "\n".. - "Damit das Wärmespeichersystem funktioniert\\, müssen alle Blöcke (auch Betonhülle und Gravel) mit Hilfe eines Forceloadblockes geladen sein.\n".. - "\n".. - "\n".. - "\n", - "Der Wärmetauscher besteht aus 3 Teilen\\, die aufeinander gesetzt werden müssen\\, wobei der Pfeil des ersten Blockes Richtung Turbine zeigen muss. Die Rohrleitungen müssen mit den gelben TA4 Röhren aufgebaut werden.\n".. - "Der Wärmetauscher muss am Stromnetz angeschlossen werden. Über den Wärmetauscher wird der Energiespeicher wieder aufgeladen\\, sofern ausreichend Strom zur Verfügung steht.\n".. - "\n".. - "\n".. - "\n", - "Die Turbine ist Teil des Energiespeichers. Sie muss neben den Generator gesetzt und über TA4 Röhren\\, wie im Plan abgebildet\\, mit dem Wärmetauscher verbunden werden.\n".. - "\n".. - "\n".. - "\n", - "Der Generator ist Teil des Energiespeichers. Er dient zur Stromerzeugung und gibt damt die Energie des Energiespeichers wieder ab. Daher muss auch der Generator am Stromnetz angeschlossen werden. \n".. - "\n".. - "Wichtig: Wärmetauscher und Generator müssen mit ein und demselben Stromnetz verbunden sein!\n".. - "\n".. - "\n".. - "\n", - "Je ein Rohrzulaufblock muss auf beiden Seiten des Speicherblockes eingebaut werden. Die Blöcke müssen sich exakt gegenüber stehen.\n".. - "\n".. - "Die Rohrzulaufblöcke können *nicht* als normale Wanddurchbrüche verwendet werden\\, dazu die TA3 Rohr/Wanddurchbruch / TA3 Pipe Wall Entry Blöcke verwenden.\n".. - "\n".. - "\n".. - "\n", - "Die gelben Röhren dienen bei TA4 zur Weiterleitung von Gas und Flüssigkeiten. \n".. - "Die maximale Leitungslänge beträgt 100 m.\n".. - "\n".. - "\n".. - "\n", - "Mit Hilfe von Stromkabeln und Verteilerdosen können Stromnetze von bis zu 1000 Blöcke/Knoten aufgebaut werden. Hierbei ist aber zu beachten\\, dass Verteilerdosen auch mitgezählt werden müssen. Somit können bis zu 500 Generatoren/Speichersysteme/Maschinen/Lampen an einem Stromnetz hängen.\n".. - "\n".. - "Mit Hilfe von Trenntransformator und Stromzähler können Netzwerke zu noch größeren Strukturen verbunden werden.\n".. - "\n".. - "\n".. - "\n", - "Mit Hilfe eines Trenntransformators können zwei Stromnetze zu einem größeren Netzwerk verbunden werden. Der Trenntransformator kann Strom in beide Richtungen übertragen.\n".. - "\n".. - "Der Trenntransformator kann bis zu 300 ku übertragen. Der Maximalwert ist über das Schraubenschlüsselmenü einstellbar.\n".. - "\n".. - "\n".. - "\n", - "Mit Hilfe eines Stromzählers können zwei Stromnetze zu einem größeren Netzwerk verbunden werden. Der Stromzähler leitet den Strom nur in eine Richtungen weiter (Pfeil beachten). Die durchgeleitete Menge an elektrischer Energie (in kud) wird gemessen und angezeigt. Dieser Wert kann auch über das Kommando 'consumption' durch einen Lua Controller abgefragt werden. Die aktuelle Stromstärke kann über 'current' abgefragt werden.\n".. - "\n".. - "Der Stromzähler kann bis zu 200 ku durchleiten. Der Maximalwert ist über das Schraubenschlüsselmenü einstellbar.\n".. - "\n".. - "Über das Schraubenschlüsselmenü kann auch ein Countdown für die Leistungsabgabe eingegeben werden. Läuft dieser Countdown auf Null\\, schaltet sich der Stromzähler ab. Der Countdown kann über das Kommando 'countdown' abgefragt werden.\n".. - "\n".. - "\n".. - "\n", - "Der TA4 Laser dient zur kabellosen Stromübertagung. Dazu sind zwei Blöcke notwendig: TA4 Laserstrahl Sender und TA4 Laserstrahl Empfänger. Zwischen beiden Blöcken muss sich eine Luftstrecke befinden\\, so dass der Laserstrahl vom Sender bis zum Empfänger aufgebaut werden kann.\n".. - "\n".. - "Zuerst muss der Sender platziert werden. Dieser schaltet sofort den Laserstahls ein und zeigt damit mögliche Positionen des Empfängers an. Mögliche Positionen für den Empfänger werden auch über eine Chat-Nachricht ausgegeben. Mit dem Laser lassen sich Strecken bis 96 Blöcke überbrücken.\n".. - "\n".. - "Ist die Verbindung aufgebaut (es muss dazu noch kein Strom fließen)\\, wird dies über den Info-Text des Senders und auch des Empfängers angezeigt.\n".. - "\n".. - "Die Laserblöcke selbst benötigen keinen Strom.\n".. - "\n".. - "\n".. - "\n", - "Strom kann mittels Elektrolyse in Wasserstoff und Sauerstoff aufgespalten werden. Auf der anderen Seite kann über eine Brennstoffzelle Wasserstoff mit Sauerstoff aus der Luft wieder in Strom umgewandelt werden.\n".. - "Damit können Stromspitzen oder ein Überangebot an Strom in Wasserstoff umgewandelt und so gespeichert werden.\n".. - "\n".. - "Im Spiel kann Strom mit Hilfe des Elektrolyseurs in Wasserstoff und Wasserstoff über die Brennstoffzelle wieder in Strom umgewandelt werden.\n".. - "Damit kann Strom (in Form von Wasserstoff) nicht nur in Tanks gelagert\\, sonder mit dem Tankwagen auch transportiert werden.\n".. - "\n".. - "Die Umwandlung von Strom in Wasserstoff und zurück ist aber verlustbehaftet. Von 100 Einheiten Strom kommen nach der Umwandlung in Wasserstoff und zurück nur 95 Einheiten Strom wieder raus.\n".. - "\n".. - "\n".. - "\n", - "Der Elektrolyseur wandelt Strom in Wasserstoff um.\n".. - "Es muss von links mit Strom versorgt werden. Rechts kann Wasserstoff über Röhren und Pumpen entnommen werden.\n".. - "\n".. - "Der Elektrolyseur kann bis zu 35 ku an Strom aufnehmen und generiert dann alle 4 s ein Wasserstoff Item.\n".. - "In den Elektrolyseur passen 200 Einheiten Wasserstoff.\n".. - "\n".. - "Der Elektrolyseur besitzt ein Schraubenschlüssel-Menü zur Einstellung der Stromaufnahme und des Abschaltpunkts.\n".. - "\n".. - "Unterschreitet die im Stromnetz gespeicherte Leistung den angegebenen Wert des Abschaltpunkts\\, so schaltet sich der Elektrolyseur automatisch ab. Damit kann ein Leerlaufen der Speichersysteme verhindert werden.\n".. - "\n".. - "\n".. - "\n", - "Die Brennstoffzelle wandelt Wasserstoff in Strom um.\n".. - "Sie muss von links per Pumpe mit Wasserstoff versorgt werden. Rechts ist der Stromanschluss.\n".. - "\n".. - "Die Brennstoffzelle kann bis zu 34 ku an Strom abgeben und benötigt dazu alle 4 s ein Wasserstoff Item.\n".. - "\n".. - "Normalerweise arbeitet die Brennstoffzelle als Generator der Kategorie 2 (wie auch anderen Speichersystemen).\n".. - "In diesem Fall können keine anderen Blöcke der Kategorie 2 wie der Akku-Block geladen werden.\n".. - "Über das Kontrollkästchen kann die Brennstoffzelle jedoch auch als Generator der Kategorie 1 eingesetzt werden.\n".. - "\n".. - "\n".. - "\n", - "Der Reaktor dient dazu\\, die über den Destillationsturm oder aus anderen Rezepten gewonnenen Zutaten zu neuen Produkten weiter zu verarbeiten. Der Plan links zeigt nur eine mögliche Variante\\, da die Anordnung der Silos und Tanks rezeptabhängig ist.\n".. - "\n".. - "Das primäre Ausgabeprodukt wird immer an der Seite des Reaktorständers ausgegeben\\, unabhängig davon\\, ob es sich um ein Pulver oder eine Flüssigkeit handelt. Das (sekundäre) Abfallprodukt wird immer unten am Reaktorständers ausgegeben.\n".. - "\n".. - "Ein Reaktor besteht aus:\n".. - "\n".. - " - div. Tanks und Silos mit den Zutaten\\, die über Leitungen mit dem Dosierer verbunden sind\n".. - " - optional einem Reaktorsockel\\, welcher die Abfälle aus dem Reaktor ableitet (nur bei Rezepten mit zwei Ausgabestoffen notwendig)\n".. - " - dem Reaktorständer\\, der auf den Sockel gesetzt werden muss (sofern vorhanden). Der Ständer hat einen Stromanschluss und zieht bei Betrieb 8 ku.\n".. - " - dem eigentlichen Reaktorbehälter\\, der auf den Reaktorständer gesetzt werden muss\n".. - " - dem Einfüllstutzen der auf den Reaktorbehälter gesetzt werden muss\n".. - " - dem Dosierer\\, welcher über Leitungen mit den Tanks oder Silos sowie dem Einfüllstutzen verbunden werden muss\n".. - "\n".. - "Hinweis 1: Flüssigkeiten werden nur in Tanks gelagert\\, feste Stoffe und Stoffe in Pulverform nur in Silos. Dies gilt für Zutaten und Ausgabestoffe.\n".. - "\n".. - "Hinweis 2: Tanks oder Silos mit verschiedenen Inhalten dürfen nicht zu einem Leitungssystem verbunden werden. Mehrere Tanks oder Silos mit gleichem Inhalt dürfen dagegen parallel an einer Leitung hängen.\n".. - "\n".. - "Beim Cracken werden lange Kette von Kohlenwasserstoffen unter Verwendung eines Katalysator in kurze Ketten gebrochen.\n".. - "Als Katalysator dient Gibbsitpulver (wird nicht verbraucht). Damit kann Bitumen in Schweröl\\, Schweröl in Naphtha und Naphtha in Benzin umgewandelt werden.\n".. - "\n".. - "Bei der Hydrierung werden einem Molekül Paare von Wasserstoffatomen hinzugefügt\\, um kurzkettige Kohlenwasserstoffe in lange umzuwandeln.\n".. - "Hier wird Eisenpulver als Katalysator benötigt (wird nicht verbraucht). Damit kann Propangas in Isobutan\\, Isobutan in Benzin\\, Benzin in Naphtha\\,\n".. - "Naphtha in Schweröl und Schweröl in Bitumen umgewandelt werden.\n".. - "\n".. - "\n".. - "\n", - "Teil des Chemischen Reaktors.\n".. - "Auf allen 4 Seiten der Dosierers können Leitungen für Eingangsmaterialien angeschlossen werden. Nach oben werden die Materialien für den Reaktor ausgegeben.\n".. - "\n".. - "Über den Dosierer kann das Rezept eingestellt und der Reaktor gestartet werden.\n".. - "\n".. - "Wie auch bei anderen Maschinen:\n".. - "\n".. - " - geht der Dosierer in den standby Zustand\\, so fehlen ein oder mehrere Zutaten\n".. - " - geht der Dosierer in den blocked Zustand\\, so ist Ausgabetank oder Silo voll\\, defekt oder falsch angeschlossen\n".. - "\n".. - "Der Dosierer benötigt keinen Strom. Alle 10 s wird ein Rezept abgearbeitet.\n".. - "\n".. - "\n".. - "\n", - "Teil des Chemischen Reaktors. Der Reaktor verfügt über ein Inventar für die Katalysator \n".. - "Gegenstände (für Cracking- und Hydrierungs-Rezepte).\n".. - "\n".. - "\n".. - "\n", - "Teil des Chemischen Reaktors. Muss auf den Reaktor gesetzt werden. Wenn dies nicht klappt\\, ggf. das Rohr an der Position darüber nochmals entfernen und neu setzen.\n".. - "\n".. - "\n".. - "\n", - "Teil des Chemischen Reaktors. Hier ist auch der Stromanschluss für den Reaktor. Der Reaktor benötigt 8 ku Strom.\n".. - "\n".. - "Der Ständer hat zwei Leitungsanschlüsse\\, nach rechst für das primäre Ausgabeprodukt und nach unten für den Abfall\\, wie bspw. Rotschlamm bei der Aluminiumherstellung.\n".. - "\n".. - "\n".. - "\n", - "Teil des Chemischen Reaktors. Wird für den Abfluss des Abfallproduktes benötigt.\n".. - "\n".. - "\n".. - "\n", - "Teil des Chemischen Reaktors. Wird zur Aufbewahrung von Stoffen in Pulver- oder Granulatform benötigt.\n".. - "\n".. - "\n".. - "\n", - "Der ICTA Controller (ICTA steht für \"If Condition Then Action\") dient zur Überwachung und Steuerung von Maschinen. Mit dem Controller kann man Daten von Maschinen und anderen Blöcken einlesen und abhängig davon andere Maschinen und Blöcke ein-/ausschalten.\n".. - "\n".. - "Einlesen von Maschinendaten sowie das Steuern von Blöcken und Maschinen erfolgt über sogenannte Kommandos. Für das Verständnis\\, wie Kommandos funktionieren\\, ist das Kapitel TA3 -> Logik-/Schalt-Blöcke wichtig. \n".. - "\n".. - "Der Controller benötigt für den Betrieb eine Batterie. Das Display dient zur Ausgabe von Daten\\, der Signal Tower zur Anzeige von Fehlern.\n".. - "\n".. - "\n".. - "\n", - "Der Controller arbeitet auf das Basis von 'IF THEN ' Regeln. Es können bis zu 8 Regeln pro Controller angelegt werden.\n".. - "\n".. - "Beispiele für Regeln sind:\n".. - "\n".. - " - Wenn ein Verteiler verstopft ist ('blocked')\\, soll der Schieber davor ausgeschaltet werden\n".. - " - Wenn eine Maschine einen Fehler anzeigt\\, soll dieser auf dem Display ausgegeben werden\n".. - "\n".. - "Der Controller prüft diese Regeln zyklisch. Dazu muss pro Regel eine Zykluszeit in Sekunden ('Cycle/s') angegeben werden (1..1000). \n".. - "\n".. - "Für Regeln die einen on/off Eingang auswerten\\, bspw. von einen Schalter oder Detektor\\, muss als Zykluszeit 0 angegeben werden. Der Wert 0 bedeutet\\, dass diese Regel immer dann ausgeführt werden soll\\, wenn sich das Eingangssignal geändert hat\\, also bspw. der Button einen neuen Wert gesendet hat.\n".. - "\n".. - "Alle Regeln sollten nur so oft wie notwendig ausgeführt werden. Dies hat zwei Vorteile:\n".. - "\n".. - " - die Batterie des Controllers hält länger (jeder Controller benötigt eine Batterie)\n".. - " - die Last für den Server ist geringer (damit weniger Lags)\n".. - "\n".. - "Man muss für jede action eine Verzögerungszeit ('after/s') einstellen. Soll die Aktion sofort ausgeführt werden\\, ist 0 einzugeben.\n".. - "\n".. - "Der Controller hat eine eigene Hilfe und Hinweise zu allen Kommandos über das Controller-Menü.\n".. - "\n".. - "\n".. - "\n", - "Die Batterie muss in unmittelbarer Nähe zum Controller platziert werden\\, also an einer der 26 Positionen um den Controller herum.\n".. - "\n".. - "\n".. - "\n", - "Das Display zeigt nach dem Platzieren seine Nummer an. Über diese Nummer kann das Display angesprochen werden. Auf dem Display können Texte ausgegeben werden\\, wobei das Display 5 Zeilen und damit 5 unterschiedliche Texte darstellen kann.\n".. - "\n".. - "Textzeilen werden immer linksbündig ausgegeben. Soll der Text horizontal zentriert ausgerichtet werden\\, muss dem Text das Zeichen „t“ (Tabulator) vorangestellt werden.\n".. - "\n".. - "Das Display wird maximal ein mal pro Sekunde aktualisiert.\n".. - "\n".. - "\n".. - "\n", - "Das TA4 Display XL hat die doppelte Größ wie das TA4 Display.\n".. - "\n".. - "Textzeilen werden immer linksbündig ausgegeben. Soll der Text horizontal zentriert ausgerichtet werden\\, muss dem Text das Zeichen „t“ (Tabulator) vorangestellt werden.\n".. - "\n".. - "Das Display wird maximal alle zwei Sekunden aktualisiert.\n".. - "\n".. - "\n".. - "\n", - "Der Signal Tower kann rot\\, grün und orange anzeigen. Eine Kombination der 3 Farben ist nicht möglich.\n".. - "\n".. - "\n".. - "\n", - "Der Lua Controller muss\\, wie der Name schon sagt\\, in der Programmiersprache Lua programmiert werden. Außerdem sollte man etwas Englisch können (oder Google bemühen)\\, denn die Anleitung dazu gibt es nur in Englisch:\n".. - "\n".. - "https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md\n".. - "\n".. - "Auch der Lua Controller benötigt eine Batterie. Die Batterie muss in unmittelbarer Nähe zum Controller platziert werden\\, also an einer der 26 Positionen um den Controller herum.\n".. - "\n".. - "\n".. - "\n", - "Der Server dient zur zentralen Speicherung von Daten von mehreren Lua Controllern. Es speichert auch die Daten über einen Server-Neustart hinweg.\n".. - "\n".. - "\n".. - "\n", - "Die TA4 Sensor Kiste dient zum Aufbau von Automatischen Lagern oder Verkaufsautomaten in Verbindung mit dem Lua Controller.\n".. - "Wird etwas in die Kiste gelegt\\, oder entnommen\\, oder eine der Tasten \"F1\"/\"F2\" gedrückt\\, so wird ein Event-Signal an den Lua Controller gesendet.\n".. - "Die Sensor Kiste unterstützt folgende Kommandos:\n".. - "\n".. - " - Über 'state = $send_cmnd(\\, \"state\")' kann der Status der Kiste abgefragt werden. Mögliche Antworten sind: \"empty\"\\, \"loaded\"\\, \"full\"\n".. - " - Über 'name\\, action = $send_cmnd(\\, \"action\")' kann die letzte Spieleraktion abgefragt werden. 'name' ist der Spielername\\, Als 'action' wird zurückgeliefert: \"put\"\\, \"take\"\\, \"f1\"\\, \"f2\".\n".. - " - Über 'stacks = $send_cmnd(\\, \"stacks\")' kann der Inhalt der Kiste ausgelesen werden. Siehe dazu: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest\n".. - " - Über '$send_cmnd(\\, \"text\"\\, \"press both buttons andnput something into the chest\")' kann der Text im Menü der Sensor Kiste gesetzt werden.\n".. - "\n".. - "Über die Checkbox \"Erlaube öffentlichen Zugriff\" kann eingestellt werden\\, ob die Kiste von jedem genutzt werden darf\\, oder nur von Spielern die hier Zugriffsrechte haben.\n".. - "\n".. - "\n".. - "\n", - "Das Terminal dient zur Ein-/Ausgabe für den Lua Controller.\n".. - "\n".. - "\n".. - "\n", - "", - "Beim TA4 Taster/Schalter hat sich nur das Aussehen geändert. Die Funktionalität ist gleich wie beim TA3 Taster/Schalter. Mit dem Schraubenschlüssel-Menü können die Daten aber nachträglich geändert werden.\n".. - "\n".. - "\n".. - "\n", - "Dieser Block hat zwei Taster\\, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für beide Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für beide Taster das Kommando konfiguriert werden\\, welches gesendet werden soll.\n".. - "\n".. - "\n".. - "\n", - "Dieser Block hat vier Taster\\, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für jeden Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für jeden Taster das Kommando konfiguriert werden\\, welches gesendet werden soll.\n".. - "\n".. - "\n".. - "\n", - "Dieser Block hat zwei Lampen\\, die individuell angesteuert werden können. Jede Lampe kann die Farben \"rot\"\\, \"grün\" und \"orange\" anzeigen. Über das Schraubenschlüssel-Menü kann für beide Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden:\n".. - "\n".. - " - Lampe 1 auf rot schalten: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Lampe 2 auf grün schalten: '$send_cmnd(1234\\, \"green\"\\, 2)'\n".. - " - Lampe 1 auf orange schalten: '$send_cmnd(1234\\, \"amber\"\\, 1)'\n".. - " - Lampe 2 aus schalten: '$send_cmnd(1234\\, \"off\"\\, 2)'\n".. - "\n".. - "\n".. - "\n", - "Dieser Block hat vier Lampen\\, die individuell angesteuert werden können. Jede Lampe kann die Farben \"rot\"\\, \"grün\" und \"orange\" anzeigen. Über das Schraubenschlüssel-Menü kann für alle Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden:\n".. - "\n".. - " - Lampe 1 auf rot schalten: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Lampe 2 auf grün schalten: '$send_cmnd(1234\\, \"green\"\\, 2)'\n".. - " - Lampe 3 auf orange schalten: '$send_cmnd(1234\\, \"amber\"\\, 3)'\n".. - " - Lampe 4 aus schalten: '$send_cmnd(1234\\, \"off\"\\, 4)'\n".. - "\n".. - "\n".. - "\n", - "Beim TA4 Spieler Detektor hat sich nur das Aussehen geändert. Die Funktionalität ist gleich wie beim TA3 Spieler Detektor.\n".. - "\n".. - "\n".. - "\n", - "\n".. - "\n".. - "Der Zustandssammler fragt der Reihe nach alle konfigurierten Maschinen nach dem Status ab. Wenn eine der Maschinen einen vorkonfigurierte Status erreicht oder überschritten hat\\, wird ein \"on\" Kommando gesendet. Damit können bspw. vom einem Lua Controller aus sehr einfach viele Maschinen auf Störungen überwacht werden.\n".. - "\n", - "Die Funktionalität ist gleich wie beim TA3 Detektor / Detector. Zusätzlich zählt der Detector aber die weitergegebenen Items. \n".. - "Diesen Zähler kann man über das Kommando 'count' abfragen und über 'reset' zurücksetzen.\n".. - "\n".. - "\n".. - "\n", - "Die Funktionalität ist gleich wie beim TA3 Block Detektor. \n".. - "\n".. - "Im Unterschied zum TA3 Block Detektor können hier die Positionen\\, die überwacht werden sollen\\, individuell konfiguriert werden. Dazu muss der \"Aufzeichnen\" Button gedrückt werden. Dann müssen alle Blöcke angeklickt werden\\, von denen die Position überprüft werden soll. Danach muss der \"Fertig\" Button gedrückt werden. \n".. - "\n".. - "Es können bis zu 4 Blöcke ausgewählt werden. \n".. - "\n".. - "\n".. - "\n", - "Der Ladungsdetektor misst alle 8 s den Ladezustand des Energiespeichers des Stromnetzwerkes.\n".. - "\n".. - "Fällt der Wert unter eine konfigurierbare Schwelle (Schaltpunkt)\\, wird ein Kommando (default: \"off\") versendet. Steigt der Wert wieder über diesen Schaltpunkt\\, so wird ein zweites Kommando (default: \"on\") gesendet. Damit lassen sich Verbraucher vom Netz trennen\\, wenn der Ladezustand des Energiespeichers unter den angegebenen Schaltpunkt sinkt.\n".. - "\n".. - "Der Ladungsdetektor muss dazu über eine Verteilerdose an das Stromnetz angeschlossen werden. Die Konfiguration des Ladungsdetektors erfolgt über das Gabelschlüsselmenü.\n".. - "\n".. - "\n".. - "\n", - "Der TA4 Blicksensor generiert ein Kommando\\, wenn der Block vom Besitzer oder anderen konfigurierten Spielern angesehen/fokussiert wird und sendet ein zweites Kommando\\, wenn der Block nicht mehr fokussiert wird. Er dient damit als Ersatz für Taster/Schalter\\, um bspw. Türen zu öffnen/schließen.\n".. - "\n".. - "Der TA4 Blicksensor kann nur mit dem Gabelschlüsselmenü programmiert werden. Hat man einen Gabelschlüssel in der Hand\\, löst der Sensor nicht aus\\, auch wenn dieser fokussiert wird.\n".. - "\n".. - "\n".. - "\n", - "über den TA4 Sequenzer können ganze Abläufe programmiert werden. Hier ein Beispiel:\n".. - "\n".. - " -- this is a comment\n".. - " \\[1\\] send 1234 a2b\n".. - " \\[30\\] send 1234 b2a\n".. - " \\[60\\] goto 1\n".. - "\n".. - " - Jede Zeile beginnt mit einem Nummer\\, welche einem Zeitpunkt entspricht '\\[\\]'\n".. - " - Für Zeitpunkte sind Werte von 1 bis 50000 zulässig\n".. - " - 1 entspricht 100 ms\\, 50000 entspricht in etwa 4 Spieltagen\n".. - " - Leerzeilen oder Kommentare sind erlaubt ('-- comment')\n".. - " - Mit 'send ' kann man ein Kommando an einen Block senden\n".. - " - Mit 'goto ' kann man an eine andere Zeile/Zeitpunkt springen\n".. - " - Mit 'stop' kann man den Sequenzer verzögert stoppen\\, so dass er kein neues Kommando\nvon einem Taster oder anderem Block annimmt (um eine Bewegung abzuschließen)\nOhne 'stop' geht der Sequenzer sofort nach dem letzten Kommando in den stopped Modus.\n".. - "\n".. - "Der TA4 Sequenzer unterstützt folgende techage Kommandos:\n".. - "\n".. - " - 'goto ' Zu einer Kommandozeile springen und damit den Sequenzer starten\n".. - " - 'stop' Den Sequenzer anhalten\n".. - " - 'on' und 'off' als Alias für 'goto 1' bzw. 'stop'\n".. - "\n".. - "Das 'goto' Kommando wird nur angenommen\\, wenn der Sequenzer gestoppt ist.\n".. - "\n".. - "Über das Gabelschlüssel-Menü kann beim Sequenzer die Zykluszeit (normal: 100 ms) geändert werden. \n".. - "\n".. - "\n".. - "\n", - "", - "Der TA4 Move Controller ist ähnlich zum \"Door Controller 2\"\\, aber die ausgewählten Blöcke werden nicht entfernt\\, sondern können bewegt werden.\n".. - "Da die bewegten Blöcke Spieler und Mobs mitnehmen können\\, die auf dem Block stehen\\, können damit Fahrstühle und ähnliche Transportsysteme gebaut werden.\n".. - "\n".. - "Anleitung:\n".. - "\n".. - " - Controller setzen und die Blöcke\\, die bewegt werden sollen\\, über das Menü (Taste \"Aufzeichnen\") an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden)\n".. - " - die \"Flugstrecke\" muss über eine x\\,y\\,z Angabe (relativ) eingegeben werden (die maximale Distanz (x+y+z) beträgt 200 m)\n".. - " - mit den Menü-Tasten \"Bewege A-B\" sowie \"Bewege B-A\" kann die Bewegung getestet werden\n".. - " - man kann auch durch Wände oder andere Blöcke fliegen\n".. - " - auch die Zielposition für die Blöcke kann belegt sein. Die Blöcke werden in diesem Falle \"unsichtbar\" gespeichert. Dies ist für Schiebetüren und ähnliches gedacht\n".. - "\n".. - "Der Move Controller unterstützt folgende techage Kommandos:\n".. - "\n".. - " - 'a2b' Bewege Block von A nach B\n".. - " - 'b2a' Bewege Block von B nach A\n".. - " - 'move' Bewege Block auf die andere Seite\n".. - "\n".. - "Über das Schraubenschlüssel-Menü kann auf die Betriebsart 'move xyz' umgeschaltet werden. Nach der Umschaltung werden folgende techage Kommandos unterstützt:\n".. - "\n".. - " - 'move2' Beim Kommando muss zusätzlich die Flugstrecke als x\\,y\\,z Vektor angegeben werden.\nBeispiel Lua Controller: '$send_cmnd(MOVE_CTLR\\, \"move2\"\\, \"0\\,12\\,0\")'\n".. - " - 'reset' Block/Blöcke zurück in Startposition bewegen\n".. - "\n".. - "*Wichtige Hinweise:*\n".. - "\n".. - " - Sofern mehrere Blöcke bewegt werden sollen\\, muss der Block\\, der die Spieler/Mobs mitnehmen soll\\, beim Antrainieren als erstes angeklickt werden.\n".. - " - Hat der Block\\, der die Spieler/Mobs mitnehmen soll\\, eine reduzierte Höhe\\, so muss die Höhe im Controller über das Schraubenschlüsselmenü eingestellt werden (bspw. Höhe = 0.5). Ansonsten wird der Spieler/Mob nicht \"gefunden\" und damit nicht mitgenommen.\n".. - "\n".. - "\n".. - "\n", - "Der TA4 Drehcontroller ist ähnlich zum Move Controller\"\\, aber die ausgewählten Blöcke werden nicht bewegt\\, sondern um ihr Zentrum nach rechts oder links gedreht.\n".. - "\n".. - "Anleitung:\n".. - "\n".. - " - Controller setzen und die Blöcke\\, die bewegt werden sollen\\, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden)\n".. - " - mit den Menü-Tasten \"Drehe links\" sowie \"Drehe rechts\" kann die Bewegung getestet werden\n".. - "\n".. - "Der Drehcontroller unterstützt folgende techage Kommandos:\n".. - "\n".. - " - 'left' Drehe nach links\n".. - " - 'right' Drehe nach rechts\n".. - " - 'uturn' Drehe um 180 Grad\n".. - "\n".. - "\n".. - "\n", - "TA4 beinhaltet eine Reihe von leistungsstarken Lampen\\, die eine bessere Ausleuchtung ermöglichen oder Spezialaufgaben übernehmen.\n".. - "\n", - "Die TA4 LED Pflanzenlampe ermöglicht ein schnelles und kräftiges Wachstum aller Pflanzen aus der 'farming' Mod. Die Lampe beleuchtet ein 3x3 großes Feld\\, so dass sich damit auch Pflanzen unter Tage anbauen lassen.\n".. - "Die Lampe muss mit einem Abstand von einem Block über dem Boden in der Mitte des 3x3 Feldes platziert werden.\n".. - "\n".. - "Zusätzlich kann die Lampe auch zur Blumenzucht genutzt werden. Wird die Lampe über ein 3x3 großes Blumenbeet aus \"Garden Soil\" (Mod 'compost') platziert\\, so wachsen dort die Blumen ganz von selbst (über und unter Tage).\n".. - "\n".. - "Abernten kann man die Blumen mit den Signs Bot\\, der auch über ein entsprechendes Zeichen verfügt\\, das vor das Blumenfeld gestellt werden muss.\n".. - "\n".. - "Die Lampe benötigt 1 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die TA4 LED Straßenlampe ist eine Lampe mit besonders starker Ausleuchtung. Die Lampe besteht aus dem Lampengehäuse\\, Lampenarm und Lampenmast Blöcken.\n".. - "\n".. - "Der Strom muss von unten durch den Mast nach oben zum Lampengehäuse geführt werden. Dazu zuerst die Stromleitung nach oben ziehen und das Stromkabel dann mit Lampenmast Blöcken \"verputzen\".\n".. - "\n".. - "Die Lampe benötigt 1 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die TA4 LED Industrielampe ist eine Lampe mit besonders starker Ausleuchtung. Die Lampe muss von oben mit Strom versorgt werden.\n".. - "\n".. - "Die Lampe benötigt 1 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Im Flüssigkeitsfilter wird Rotschlamm gefiltert.\n".. - "Dabei entsteht entweder Lauge\\, welche unten in einem Tank gesammelt werden kann oder Wüstenkopfsteinpflaster\\, welches sich im Filter absetzt.\n".. - "Wenn der Filter zu sehr verstopft ist\\, muss er geleert und neu befüllt werden.\n".. - "Der Filter besteht aus einer Fundament-Ebene\\, auf der 7 identische Filterschichten platziert werden. \n".. - "Ganz oben befindet sich die Einfüllebene.\n".. - "\n".. - "\n".. - "\n", - "Der Aufbau dieser Ebene kann dem Plan entnommen werden.\n".. - "\n".. - "Im Tank wird die Lauge gesammelt.\n".. - "\n".. - "\n".. - "\n", - "Diese Ebene muss so wie im Plan gezeigt mit Schotter befüllt werden.\n".. - "Insgesamt müssen sieben Lagen Schotter übereinander liegen.\n".. - "Dabei wird mit der Zeit der Filter verunreinigt\\, sodass das Füllmaterial erneuert werden muss.\n".. - "\n".. - "\n".. - "\n", - "Diese Ebene dient zum Befüllen des Filters mit Rotschlamm.\n".. - "In den Einfüllstutzen muss Rotschlamm mittels einer Pumpe geleitet werden.\n".. - "\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".. - " - 22 TA4 Collider Magnete (nicht die TA4 Collider Detector Magnete!) müssen über jeweils 5 Blöcken der TA4 Vakuumröhre miteinander verbunden werden. Das ganze bildet (wie rechts im Plan abgebildet) ein Quadrat mit einer Kantenlänge von 37 Metern.\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", - "Jeder TA4 Collider Magnet muss zusätzlich (wie rechts im Plan abgebildet) mit Strom sowie mit Isobutan zur Kühlung versorgt werden:\n".. - "\n".. - " - Der Anschluss für den Strom ist auf der Oberseite des Magneten.\n".. - " - Der Anschluss für die Kühlung ist auf der Vorderseite des Magneten.\n".. - " - Für die Kühlung der gesamten Anlage wird zusätzlich eine TA4 Pumpe und ein TA4 Tank mit mindestens 250 Einheiten Isobutan benötigt.\n".. - " - Die Anlage benötigt auch einiges an Strom. Daher ist eine eigene Stromversorgung mit mindestens 145 ku sinnvoll.\n".. - "\n".. - "\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 Magnete und den Detektor mit Stromkabel verbinden\n".. - " - Alle Magnete und den Detektor mit den gelben Röhren verbinden und das Isobutan mit einer Pumpe in das Röhrensystem pumpen.\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".. - " - Der Teilchenbeschleunigers muss im Dauerbetrieb laufen und liefert dann nach und nach Erfahrungspunkte. Für 10 Punkte muss der Teilchenbeschleuniger schon einige Stunden laufen.\n".. - "\n".. - "\n".. - "\n", - "", - "Im Rezept Block können bis zu 10 Rezepte gespeichert werden. Diese Rezepte können dann über ein TA4 Autocrafter Kommando abgerufen werden. Dies ermöglicht eine Rezept-Konfiguration des Autocrafters über ein Kommando. Die Rezepte des Rezept Blocks können auch direkt per Kommando abgefragt werden.\n".. - "\n".. - "'input ' liest ein Rezept aus dem TA4 Rezeptblock. '' ist die Nummer des Rezepts. Der Block gibt eine Liste von Rezept-Zutaten zurück. \n".. - "\n".. - "Beispiel: '$send_cmnd(1234\\, \"input\"\\, 1)'\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA3. \n".. - "\n".. - "Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Autocrafter benötigt hierfür 9 ku Strom.\n".. - "\n".. - "Zusätzlich unterstützt der TA4 Autocrafter die Auswahl unterschiedlicher Rezepte über folgende Kommandos:\n".. - "\n".. - "'recipe \".\"' schaltet den Autocrafter auf ein Rezept des TA4 Rezept Blocks um. '' ist die Nummer des Rezept Blocks\\, '' die Rezept-Nummer. Beispiel: '$send_cmnd(1234\\, \"recipe\"\\, \"5467.1\")'\n".. - "\n".. - "Alternativ kann ein Rezept auch über die Zutatenliste ausgewählt werden\\, wie bspw.:\n".. - "'$send_cmnd(1234\\, \"recipe\"\\, \"default:coal_lump\\,\\,\\,default:stick\")'\n".. - "Hier müssen alle technische Namen eines Rezeptes durch Kommas getrennt angegeben werden. Siehe auch das Kommando 'input' beim TA4 Rezept Block.\n".. - "\n".. - "Das Kommando 'flush' verschiebt alle Artikel vom Eingabeinventar in das Ausgabeinventar. Das Kommando liefert 'true' zurück\\, wenn das Eingabeinventar dabei vollständig geleert wurde. Falls 'false' zurückgeliefert wurde (Ausgabeinventar voll)\\, muss das Kommando zu einem späteren Zeitpunkt wiederholt werden.\n".. - "\n".. - "\n".. - "\n", - "Siehe TA3 Tank.\n".. - "\n".. - "In einen TA4 Tank passen 2000 Einheiten oder 200 Fässer einer Flüssigkeit.\n".. - "\n".. - "\n".. - "\n", - "Siehe TA3 Pumpe.\n".. - "\n".. - "Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden. \n".. - "\n".. - "In der Betriebsart \"Durchflussbegrenzer\" kann die Anzahl der Einheiten\\, die von der Pumpe gepumpt werden\\, begrenzt werden. Die Betriebsart Durchflussbegrenzer kann über das Gabelschlüssel-Menü aktiviert werden\\, indem im Menü die Anzahl an Einheiten konfiguriert wird. Sobald die konfigurierte Anzahl an Einheiten gepumpt wurden\\, schaltet sich die Pumpe ab. Wird die Pumpe wieder eingeschaltet\\, pumpt sie wieder die konfigurierte Anzahl an Einheiten und schaltet sich dann ab.\n".. - "\n".. - "Der Durchflussbegrenzer kann auch per Lua- oder Beduino Controller konfiguriert und gestartet werden.\n".. - "\n".. - "Zusätzlich unterstützt die Pumpe das Kommando 'flowrate'. Damit kann die Gesamtdurchflussmenge durch die Pumpe abgefragt werden.\n".. - "\n".. - "\n".. - "\n", - "Mit TA4 hat der Industrieofen auch seine elektrische Heizung. Der Ölbrenner und auch das Gebläse können mit der Ofenheizung ersetzt werden.\n".. - "\n".. - "Die Ofenheizung benötigt 14 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Dieser Block kann nicht mehr gecraftet werden und wird durch den TA4 Wassereinlass Block ersetzt.\n".. - "\n", - "Für manche Rezepte wird Wasser benötigt. Das Wasser muss mit einer Pumpe aus dem Meer (Wasser auf y = 1) gepumpt werden. Ein \"Pool\" aus ein paar Wasserblöcken ist dafür nicht ausreichend!\n".. - "\n".. - "Dazu muss der Wassereinlass-Block ins Wasser gesetzt und über Röhren mit der Pumpe verbunden werden. Wird der Block ins Wasser gesetzt\\, so muss darauf geachtet werden\\, dass sich unter dem Block Wasser befindet (Wasser muss mindestens 2 Blöcke tief sein). \n".. - "\n".. - "\n".. - "\n", - "TA4 hat auch seine eigenen Röhren im TA4 Design. Diese können wie Standard Röhren eingesetzt werden.\n".. - "Aber: TA4 Schieber und TA4 Verteiler erreichen ihre volle Leistungsfähigkeit nur beim Einsatz mit TA4 Röhren.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht grundsätzlich der von TA2/TA3. Zusätzlich kann aber über ein Menü konfiguriert werden\\, welche Gegenstände aus einer TA4 Kiste geholt und weiter transportiert werden sollen.\n".. - "Die Verarbeitungsleistung beträgt 12 Items alle 2 s\\, sofern auf beiden Seiten TA4 Röhren verwendet werden. Anderenfalls sind es nur 6 Items alle 2 s.\n".. - "\n".. - "In der Betriebsart \"Durchlaufbegrenzer\" kann die Anzahl der Items\\, die von dem Schieber bewegt werden\\, begrenzt werden. Die Betriebsart Durchlaufbegrenzer kann über das Gabelschlüssel-Menü aktiviert werden\\, indem im Menü die Anzahl an Items konfiguriert wird. Sobald die konfigurierte Anzahl an Items bewegt wurden\\, schaltet sich der Schieber ab. Wird der Schieber wieder eingeschaltet\\, bewegt er wieder die konfigurierte Anzahl an Items und schaltet sich dann ab.\n".. - "\n".. - "Der TA4 Schieber kann auch per Lua- oder Beduino Controller konfiguriert und gestartet werden.\n".. - "\n".. - "Hier die zusätzlichen Kommandos für den Lua Controller:\n".. - "\n".. - " - 'config' dient zur Konfiguration des Schiebers\\, analog zum manuellen Konfiguration über das Menü.\nBeispiel: '$send_cmnd(1234\\, \"config\"\\, \"default:dirt\")'\nMit '$send_cmnd(1234\\, \"config\"\\, \"\")' wird die Konfiguration gelöscht\n".. - " - 'limit' dient zum Setzen der Anzahl der Items für die Durchlaufbegrenzer Betriebsart:\nBeispiel: '$send_cmnd(1234\\, \"init\"\\, 7)'\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA3. Die Kiste kann aber mehr Inhalt aufnehmen.\n".. - "\n".. - "Zusätzlich besitzt die TA4 Kiste ein Schatteninventar zur Konfiguration. Hier können bestimmte Speicherplätze mit einem Item vorbelegt werden. Vorbelegte Speicherplätze werden beim Füllen nur mit diesen Items belegt. Zum Leeren eines vorbelegten Speicherplatzes wird ein TA4 Schieber oder TA4 Injektor mit entsprechender Konfiguration benötigt.\n".. - "\n".. - "\n".. - "\n", - "Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten\\, sondern verfügt über 8 Speicher\\, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2\\, TA3 oder TA4) gefüllt bzw. geleert werden.\n".. - "\n".. - "Wird die Kiste mit einem Schieber gefüllt\\, so füllen sich alle Speicherplätze von links nach rechts. Sind alle 8 Speicher voll und können keine weiteren Items hinzugefügt werden\\, so werden weitere Items werden abgewiesen.\n".. - "\n".. - "*Reihenfunktion*\n".. - "\n".. - "Mehrere TA4 8x2000 Kisten können zu einer großen Kiste mit mehr Inhalt verbunden werden. Dazu müssen die Kisten in einer Reihe hintereinander gesetzt werden.\n".. - "\n".. - "Zuerst muss die Front-Kiste gesetzt werden\\, dann werden die Stapel-Kisten mit gleicher Blickrichtung dahinter gesetzt (alle Kisten haben die Front in Richtung Spieler). Bei 2 Kisten in Reihe erhöht sich die Größe auf 8x4000\\, usw.\n".. - "\n".. - "Die angereihten Kisten können nun nicht mehr entfernt werden. Um die Kisten wieder abbauen zu können\\, gibt es zwei Möglichkeiten:\n".. - "\n".. - " - Die Frontkiste leeren und entfernen. Damit wird die nächste Kiste entsperrt und kann entfernt werden.\n".. - " - Die Frontkiste soweit leeren dass alle Speicherplätzen maximal 2000 Items beinhalten. Damit wird die nächste Kiste entsperrt und kann entfernt werden.\n".. - "\n".. - "Die Kisten haben eine \"Reihenfolge\" Checkbox. Wird diese Checkbox aktiviert\\, werden die Speicherplätze durch einen Schieber nicht mehr vollständig entleert. Das letzte Item verbleibt als Vorbelegung in dem Speicherplatz. Damit ergibt sich eine feste Zuordnung von Items zu Speicherplätzen.\n".. - "\n".. - "Die Kiste kann nur von den Spielern genutzt werden\\, die an diesem Ort auch bauen können\\, also Protection Rechte besitzen. Es spielt dabei keine Rolle\\, wer die Kiste setzt. \n".. - "\n".. - "Der Kiste besitzt ein zusätzliches Kommandos für den Lua Controller:\n".. - "\n".. - " - 'count' dient zur Anfrage\\, wie viele Items in der Kiste sind.\nBeispiel 1: '$send_cmnd(CHEST\\, \"count\")' --> Summe der Items über alle 8 Speicher\nBeispiel 2: '$send_cmnd(CHEST\\, \"count\"\\, 2)' --> Anzahl der Items in Speicher 2 (zweiter von links)\n".. - " - 'storesize' wird verwendet\\, um die Größe eines der acht Speicher auszulesen\nBeispiel: '$send_cmnd(CHEST\\, \"storesize\")' -> Funktion liefert bspw. 6000 zurück\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 24 Items alle 4 s\\, sofern auf allen Seiten TA4 Röhren verwendet werden. Anderenfalls sind es nur 12 Items alle 4 s.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht dem normalen TA4 Verteiler\\, mit zwei Unterschieden:\n".. - "Die Verarbeitungsleistung beträgt 36 Items alle 4 s\\, sofern auf allen Seiten TA4 Röhren verwendet werden. Anderenfalls sind es nur 18 Items alle 4 s.\n".. - "Außerdem können pro Ausgang bis zu 8 Items konfiguriert werden.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Block benötigt 5 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2.\n".. - "Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Block benötigt 9 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht weitgehend der von TA2. \n".. - "\n".. - "Zusätzlich kann die Lochgröße zwischen 3x3 und 11x11 Blöcken eingestellt werden. \n".. - "Die maximale Tiefe beträgt 80 Meter. Der Steinbrecher benötigt 14 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA2\\, nur werden hier verschiedene Chips produziert.\n".. - "Die Verarbeitungsleistung beträgt ein Chip alle 6 s. Der Block benötigt hierfür 12 ku Strom.\n".. - "\n".. - "\n".. - "\n", - "Die Funktion entspricht der von TA3. \n".. - "\n".. - "Die Verarbeitungsleistung beträgt bis zu 8 mal vier Items alle 4 Sekunden.\n".. - "\n".. - "\n".. - "\n", - "Der Recycler ist eine Maschine\\, die alle Techage Rezepte rückwärts abarbeitet\\, also Maschinen und Blöcke wieder in die Bestandteile zerlegen kann. Die Maschine kann so ziemlich alle Techage und Hyperloop Blöcke zerlegen.\n".. - "Aber nicht alle Zutaten/Materialien der Rezepte lassen sich recyclen:\n".. - "\n".. - " - Holz wird zu Sticks\n".. - " - Stein wird zu Sand oder Kies\n".. - " - Halbleiter/Chips können nicht recycelt werden\n".. - " - Werkzeuge können nicht recycelt werden\n".. - "\n".. - "Die Verarbeitungsleistung beträgt ein Item alle 8 s. Der Block benötigt hierfür 16 ku Strom.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta4", - "", - "ta4_windturbine", - "ta4_nacelle", - "ta4_blinklamp", - "ta4_pillar", - "", - "ta4_solarmodule", - "ta4_solarcarrier", - "ta4_solar_inverter", - "ta4_powercable", - "ta4_powerbox", - "ta4_minicell", - "", - "ta4_heatexchanger", - "ta4_turbine", - "ta4_generator", - "ta4_pipeinlet", - "ta4_pipe", - "ta4_transformer", - "ta4_transformer", - "ta4_electricmeter", - "ta4_laser", - "ta4_hydrogen", - "ta4_electrolyzer", - "ta4_fuelcell", - "", - "ta4_doser", - "ta4_reactor", - "ta4_fillerpipe", - "ta4_reactorstand", - "ta4_reactorbase", - "ta4_silo", - "ta4_icta_controller", - "ta4_icta_controller", - "ta4_battery", - "ta4_display", - "ta4_displayXL", - "ta4_signaltower", - "ta4_lua_controller", - "ta4_lua_server", - "ta4_sensor_chest", - "ta4_terminal", - "", - "ta4_button", - "ta4_button_2x", - "ta4_button_4x", - "ta4_signallamp_2x", - "ta4_signallamp_4x", - "ta4_playerdetector", - "ta4_collector", - "ta4_detector", - "ta4_nodedetector", - "ta4_chargedetector", - "ta4_gaze_sensor", - "ta4_sequencer", - "", - "ta4_movecontroller", - "ta4_turncontroller", - "", - "ta4_growlight", - "ta4_streetlamp", - "ta4_industriallamp", - "ta4_liquid_filter", - "", - "", - "", - "", - "", - "ta4_terminal", - "", - "techage_ta4c", - "", - "ta4_recipeblock", - "ta4_autocrafter", - "ta4_tank", - "ta4_pump", - "ta4_furnaceheater", - "", - "ta4_waterinlet", - "ta4_tube", - "ta4_pusher", - "ta4_chest", - "ta4_8x2000_chest", - "ta4_distributor", - "ta4_high_performance_distributor", - "ta4_gravelsieve", - "ta4_grinder", - "ta4_quarry", - "ta4_electronicfab", - "ta4_injector", - "ta4_recycler", - }, - plans = { - "", - "ta4_windturbine", - "", - "", - "", - "", - "ta4_solarplant", - "", - "", - "", - "", - "", - "", - "ta4_storagesystem", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_reactor", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_liquid_filter_base", - "ta4_liquid_filter_gravel", - "ta4_liquid_filter_top", - "techage_collider_plan", - "ta4_cooler", - "", - "techage_collider_plan2", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta4_EN.lua b/techage/doc/manual_ta4_EN.lua deleted file mode 100644 index 32faa51..0000000 --- a/techage/doc/manual_ta4_EN.lua +++ /dev/null @@ -1,1054 +0,0 @@ -return { - titles = { - "1,TA4: Present", - "2,Wind Turbine", - "3,TA4 Wind Turbine", - "3,TA4 Wind Turbine Nacelle", - "3,TA4 Wind Turbine Signal Lamp", - "3,TA4 Pillar", - "2,Solar System", - "3,TA4 Solar Module", - "3,TA4 Solar Carrier Module", - "3,TA4 Solar Inverter", - "3,TA4 Low Power Cable", - "3,TA4 Low Voltage Junction Box", - "3,TA4 Street Lamp Solar Cell", - "2,Thermal Energy Storage", - "3,TA4 Heat Exchanger", - "3,TA4 Turbine", - "3,TA4 Generator", - "3,TA4 Pipe Inlet", - "3,TA4 Pipe", - "2,Power Distribution", - "3,TA4 Isolation Transformer", - "3,TA4 Electric Meter", - "3,TA4 Laser", - "2,Hydrogen", - "3,Electrolyzer", - "3,Fuel Cell", - "2,Chemical Reactor", - "3,TA4 Doser", - "3,TA4 Reactor", - "3,TA4 Filler Pipe", - "3,TA4 Reactor Stand", - "3,TA4 Reactor Base", - "3,TA4 Silo", - "2,ICTA Controller", - "3,TA4 ICTA controller", - "3,Battery", - "3,TA4 Display", - "3,TA4 Display XL", - "3,TA4 Signal Tower", - "2,TA4 Lua Controller", - "3,TA4 Lua Server", - "3,TA4 Sensor Box / Chest", - "3,TA4 Lua Controller Terminal", - "2,TA4 Logic/Switching Modules", - "3,TA4 Button/Switch", - "3,TA4 2x Button", - "3,TA4 4x Button", - "3,TA4 2x Signal Lamp", - "3,TA4 4x Signal Lamp", - "3,TA4 Player Detector", - "3,TA4 State Collector", - "3,TA4 Detector", - "3,TA4 Node Detector", - "3,TA4 Energy Storage Charge Detector", - "3,TA4 Gaze Sensor", - "3,TA4 Sequencer", - "2,Move/Turn Controller", - "3,TA4 Move Controller", - "3,TA4 Turn Controller", - "2,TA4 Lamps", - "3,TA4 LED Grow Light", - "3,TA4 Street Lamp", - "3,TA4 LED Industrial Lamp", - "2,TA4 Liquid Filter", - "3,Base Layer", - "3,Gravel Layer", - "3,Filling Layer", - "2,TA4 Collider (Particle Accelerator)", - "3,Detector", - "3,Control / TA4 Terminal", - "3,Cooling and power", - "3,Construction", - "2,More TA4 Blocks", - "3,TA4 Recipe Block", - "3,TA4 Autocrafter", - "3,TA4 Tank", - "3,TA4 Pump", - "3,TA4 Furnace Heater", - "3,TA4 Water Pump (deprecated)", - "3,TA4 Water Inlet", - "3,TA4 Tube", - "3,TA4 Pusher", - "3,TA4 Chest", - "3,TA4 8x2000 Chest", - "3,TA4 Distributor", - "3,TA4 High Performance Distributor", - "3,TA4 Gravel Sieve", - "3,TA4 Grinder", - "3,TA4 Quarry", - "3,TA4 Electronic Fab", - "3,TA4 Injector", - "3,TA4 Recycler", - }, - texts = { - "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".. - "\n".. - "\n", - "A wind turbine always supplies electricity when there is wind. There is no wind in the game\\, but the mod simulates this by turning the wind turbines only in the morning (5:00 - 9:00) and in the evening (17:00 - 21:00). A wind turbine only supplies electricity if it is set up in a suitable location.\n".. - "\n".. - "The TA wind power plants are pure offshore plants\\, which means that they have to be built in the sea. This means that wind turbines can only be build in a sea (occean) biome and that there must be sufficient water and a clear view around the mast.\n".. - "\n".. - "To find a suitable spot\\, click on the water with the wrench (TechAge Info Tool). A chat message will show you whether this position is suitable for the mast of the wind turbine.\n".. - "\n".. - "The current must be led from the rotor block down through the mast. First pull the power line up and then \"plaster\" the power cable with TA4 pillar blocks. A work platform can be built below. The plan on the right shows the structure in the upper part.\n".. - "\n".. - "The wind turbine delivers 70 ku\\, but only 8 hours a day (see above).\n".. - "\n".. - "\n".. - "\n", - "The wind turbine block (rotor) is the heart of the wind turbine. This block must be placed on top of the mast. Ideally at Y = 15\\, then you just stay within a map / forceload block.\n".. - "When you start the turbine\\, all conditions for the operation of the wind turbine are checked. If all conditions are met\\, the rotor blades (wings) appear automatically. Otherwise you will get an error message.\n".. - "\n".. - "\n".. - "\n", - "This block must be placed on the black end of the wind turbine block.\n".. - "\n".. - "\n".. - "\n", - "This flashing light is only for decorative purposes and can be placed on top of the wind turbine block.\n".. - "\n".. - "\n".. - "\n", - "This builds the mast for the wind turbine. However\\, these blocks are not set by hand but must be set with the help of a trowel\\, so that the power line to the mast tip is replaced with these blocks (see under TA power cable).\n".. - "\n".. - "\n".. - "\n", - "The solar system only produces electricity when the sun is shining. In the game this is every game day from 6:00 am to 6:00 pm.\n".. - "The same power is always available during this time. After 6:00 p.m.\\, the solar modules switch off completely.\n".. - "\n".. - "The biome temperature is decisive for the performance of the solar modules. The hotter the temperature\\, the higher the yield.\n".. - "The biome temperature can be determined with the Techage Info Tool (wrench). It typically fluctuates between 0 and 100:\n".. - "\n".. - " - full power is available at 100\n".. - " - at 50\\, half the power is available\n".. - " - at 0 there is no service available\n".. - "\n".. - "It is therefore advisable to look for hot steppes and deserts for the solar system.\n".. - "The overhead lines are available for the transport of electricity.\n".. - "However\\, hydrogen can also be produced\\, which can be transported and converted back into electricity at the destination.\n".. - "\n".. - "The smallest unit in a solar system is two solar modules and one carrier module. The carrier module must be placed first\\, the two solar modules to the left and right next to it (not above!).\n".. - "\n".. - "The plan on the right shows 3 units\\, each with two solar modules and one carrier module\\, connected to the inverter via red cables.\n".. - "\n".. - "Solar modules supply DC voltage\\, which cannot be fed directly into the power grid. Therefore\\, the solar units must first be connected to the inverter via the red cable. This consists of two blocks\\, one for the red cable to the solar modules (DC) and one for the gray power cable to the power grid (AC).\n".. - "\n".. - "The map area where the solar system is located must be fully loaded. This also applies to the direct position above the solar module\\, because the light intensity is regularly measured there. It is therefore advisable to first set a forceload block and then to place the modules within this area.\n".. - "\n".. - "\n".. - "\n", - "The solar module must be placed on the carrier module. Two solar modules are always required.\n".. - "In a pair\\, the solar modules perform up to 3 ku\\, depending on the temperature.\n".. - "With the solar modules\\, care must be taken that they have full daylight and are not shaded by blocks or trees. This can be tested with the Info Tool (wrench).\n".. - "\n".. - "\n".. - "\n", - "The carrier module is available in two heights (1m and 2m). Both are functionally identical.\n".. - "The carrier modules can be placed directly next to one another and thus connected to form a row of modules. The connection to the inverter or to other module series must be made with the red low-voltage cables or the low-voltage junction boxes.\n".. - "\n".. - "\n".. - "\n", - "The inverter converts the solar power (DC) into alternating current (AC) so that it can be fed into the power grid.\n".. - "An inverter can feed a maximum of 100 ku of electricity\\, which corresponds to 33 solar modules or more.\n".. - "\n".. - "\n".. - "\n", - "The low voltage cable is used to connect rows of solar modules to the inverter. The cable must not be used for other purposes.\n".. - "\n".. - "The maximum cable length is 200 m.\n".. - "\n".. - "\n".. - "\n", - "The junction box must be placed on the floor. It has only 4 connections (in the 4 directions).\n".. - "\n".. - "\n".. - "\n", - "As the name suggests\\, the street lamp solar cell is used to power a street lamp. A solar cell can supply two lamps (1 ku). The solar cell stores the sun's energy during the day and delivers the electricity to the lamp at night. That means the lamp only glows in the dark.\n".. - "\n".. - "This solar cell cannot be combined with the other solar modules.\n".. - "\n".. - "\n".. - "\n", - "The thermal energy storage replaces the battery block from TA3.\n".. - "\n".. - "The thermal energy store consists of a concrete shell (concrete blocks) filled with gravel. Five sizes of the storage are possible:\n".. - "\n".. - " - Cover with 5x5x5 concrete blocks\\, filled with 27 gravel\\, storage capacity: 22.5 kud\n".. - " - Cover with 7x7x7 concrete blocks\\, filled with 125 gravel\\, storage capacity: 104 kud\n".. - " - Cover with 9x9x9 concrete blocks\\, filled with 343 gravel\\, storage capacity: 286 kud\n".. - " - Cover with 11x11x11 concrete blocks\\, filled with 729 gravel\\, storage capacity: 610 kud\n".. - " - Cover with 13x13x13 concrete blocks\\, filled with 1331 gravel\\, storage capacity: 1112 kud\n".. - "\n".. - "A window made of an obsidian glass block may be in the concrete shell. This must be placed fairly in the middle of the wall. Through this window you can see whether the storage is loaded more than 80%. In the plan on the right you can see the structure of TA4 heat exchanger consisting of 3 blocks\\, the TA4 turbine and the TA4 generator. Pay attention to the alignment of the heat exchanger (the arrow at block 1 must point to the turbine).\n".. - "\n".. - "Contrary to the plan on the right\\, the connections on the storage block must be on the same level (arranged horizontally\\, i.e. not below and above). The pipe inlets (TA4 Pipe Inlet) must be exactly in the middle of the wall and face each other. The yellow TA4 pipes are used as steam pipes. The TA3 steam pipes cannot be used here.\n".. - "Both the generator and the heat exchanger have a power connection and must be connected to the power grid.\n".. - "\n".. - "In principle\\, the heat storage system works exactly the same as the batteries\\, only with much more storage capacity.\n".. - "\n".. - "In order for the heat storage system to work\\, all blocks (also the concrete shell and gravel) must be loaded using a forceload block.\n".. - "\n".. - "\n".. - "\n", - "The heat exchanger consists of 3 parts that must be placed on top of each other\\, with the arrow of the first block pointing towards the turbine. The pipes must be built with the yellow TA4 pipes.\n".. - "The heat exchanger must be connected to the power grid. The energy storage device is recharged via the heat exchanger\\, provided that sufficient electricity is available. \n".. - "\n".. - "\n".. - "\n", - "The turbine is part of the energy storage. It must be placed next to the generator and connected to the heat exchanger via TA4 tubes as shown in the plan.\n".. - "\n".. - "\n".. - "\n", - "The generator is used to generate electricity. Therefore\\, the generator must also be connected to the power grid.\n".. - "The generator is part of the energy storage. It is used to generate electricity and thus releases the energy from the energy storage unit. Therefore\\, the generator must also be connected to the power grid.\n".. - "\n".. - "Important: Both\\, heat exchanger and generator must be connected to the same power grid! \n".. - "\n".. - "\n".. - "\n", - "One pipe inlet block each must be installed on both sides of the storage block. The blocks must face each other exactly.\n".. - "\n".. - "The pipe inlet blocks *cannot* be used as normal wall openings\\, use the TA3 pipe wall entry blocks instead.\n".. - "\n".. - "\n".. - "\n", - "With TA4\\, the yellow pipes are used for the transmission of gas and liquids.\n".. - "The maximum cable length is 100 m.\n".. - "\n".. - "\n".. - "\n", - "With the help of power cables and junction boxes\\, power networks of up to 1000 blocks/nodes can be set up. However\\, it should be noted that distribution boxes must also be counted. This means that up to 500 generators/storage systems/machines/lamps can be connected to a power grid.\n".. - "\n".. - "With the help of an isolating transformer and electricity meter\\, networks can be connected to form even larger structures.\n".. - "\n".. - "\n".. - "\n", - "With the help of an isolating transformer\\, two power grids can be connected to form a larger network. The isolation transformer can transmit electricity in both directions.\n".. - "\n".. - "The isolation transformer can transmit up to 300 ku. The maximum value is adjustable via the wrench menu.\n".. - "\n".. - "\n".. - "\n", - "With the help of an electricity meter\\, two electricity networks can be connected to form a larger network. The electricity meter only transmits electricity in one direction (note arrow). The amount of electrical energy passed through (in kud) is measured and displayed. This value can also be queried by a Lua controller using the 'consumption' command. The current current can be queried via the command 'current'.\n".. - "\n".. - "The electricity meter can pass up to 200 ku. The maximum value is adjustable via the wrench menu.\n".. - "\n".. - "A power output countdown can also be entered via the wrench menu. When this countdown reaches zero\\, the electricity meter switches off. The countdown can be queried using the 'countdown' command.\n".. - "\n".. - "\n".. - "\n", - "The TA4 laser is used for wireless power transmission. Two blocks are required for this: TA4 Laser Beam Emitter and TA4 Laser Beam Receiver. There must be an air gap between the two blocks so that the laser beam can be built up from the emitter to the receiver. First the emitter must be placed. This immediately switches on the laser beam and shows possible positions of the receiver. Possible positions for the receiver are also output via a chat message. \n".. - "\n".. - "With the laser\\, distances of up to 96 blocks can be bridged. Once the connection has been established (no current has to flow)\\, this is indicated via the info text of the emitter and also of the receiver. \n".. - "\n".. - "The laser blocks themselves do not require any electricity.\n".. - "\n".. - "\n".. - "\n", - "Electrolysis can be used to split electricity into hydrogen and oxygen. On the other hand\\, hydrogen can be converted back into electricity with oxygen from the air using a fuel cell.\n".. - "This enables current peaks or an excess supply of electricity to be converted into hydrogen and thus stored.\n".. - "\n".. - "In the game\\, electricity can be converted back into electricity via the fuel cell using the electrolyzer in hydrogen and hydrogen.\n".. - "This means that electricity (in the form of hydrogen) can not only be stored in tanks\\, but also transported by means of the tank cart.\n".. - "\n".. - "However\\, the conversion of electricity into hydrogen and back is lossy. Out of 100 units of electricity\\, only 95 units of electricity come out after the conversion to hydrogen and back.\n".. - "\n".. - "\n".. - "\n", - "The electrolyzer converts electricity into hydrogen.\n".. - "It must be powered from the left. On the right\\, hydrogen can be extracted via pipes and pumps.\n".. - "\n".. - "The electrolyzer can draw up to 35 ku of electricity and then generates a hydrogen item every 4 s.\n".. - "200 units of hydrogen fit into the electrolyzer.\n".. - "\n".. - "The electrolyzer has a wrench menu for setting the current consumption and the switch-off point.\n".. - "\n".. - "If the power stored in the power grid falls below the specified value of the switch-off point\\, the electrolyzer switches off automatically. This prevents the storage systems from running empty.\n".. - "\n".. - "\n".. - "\n", - "The fuel cell converts hydrogen into electricity.\n".. - "It must be supplied with hydrogen from the left by a pump. The power connection is on the right.\n".. - "\n".. - "The fuel cell can deliver up to 34 ku of electricity and needs a hydrogen item every 4 s.\n".. - "\n".. - "Usually the fuel cell works as a category 2 generator (like other storage systems). \n".. - "In this case\\, no other category 2 blocks such as the battery block can be charged. However\\, the fuel cell can also be used as a category 1 generator via the check box.\n".. - "\n".. - "\n".. - "\n", - "The reactor is used to process the ingredients obtained from the distillation tower or from other recipes into new products.\n".. - "The plan on the left shows only one possible variant\\, since the arrangement of the silos and tanks depends on the recipe.\n".. - "\n".. - "The primary output product is always output to the side of the reactor stand\\, regardless of whether it is a powder or a liquid. The (secondary) waste product is always discharged at the bottom of the reactor stand.\n".. - "\n".. - "A reactor consists of:\n".. - "\n".. - " - Various tanks and silos with the ingredients that are connected to the doser via pipes\n".. - " - optionally a reactor base\\, which discharges the waste from the reactor (only necessary for recipes with two output products)\n".. - " - the reactor stand\\, which must be placed on the base (if available). The stand has a power connection and draws 8 ku during operation.\n".. - " - The reactor vessel that has to be placed on the reactor stand\n".. - " - The filler pipe that must be placed on the reactor vessel\n".. - " - The dosing device\\, which has to be connected to the tanks or silos and the filler pipe via pipes\n".. - "\n".. - "Note 1: Liquids are only stored in tanks\\, solids and substances in powder form only in silos. This applies to ingredients and output products.\n".. - "\n".. - "Note 2: Tanks or silos with different contents must not be connected to a pipe system. In contrast\\, several tanks or silos with the same content may hang in parallel on one line.\n".. - "\n".. - "Cracking breaks long chains of hydrocarbons into short chains using a catalyst.\n".. - "Gibbsite powder serves as a catalyst (is not consumed). It can be used to convert bitumen into fueloil\\, fueloil into naphtha and naphtha into gasoline.\n".. - "\n".. - "In hydrogenation\\, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones.\n".. - "Here iron powder is required as a catalyst (is not consumed). It can be used to convert gas (propane) into isobutane\\,\n".. - "isobutane into gasoline\\, gasoline into naphtha\\, naphtha into fueloil\\, and fueloil into bitumen.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor.\n".. - "Pipes for input materials can be connected on all 4 sides of the doser. The materials for the reactor are discharged upwards.\n".. - "\n".. - "The recipe can be set and the reactor started via the doser.\n".. - "\n".. - "As with other machines:\n".. - "\n".. - " - if the doser is in standby mode\\, one or more ingredients are missing\n".. - " - if the doser is in the blocked state\\, the output tank or silo is full\\, defective or incorrectly connected\n".. - "\n".. - "The doser does not need any electricity. A recipe is processed every 10 s.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. The reactor has a inventory for the catalyst items (for cracking and hydrogenation recipes).\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Must be placed on the reactor. If this does not work\\, remove the pipe at the position above and place it again.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Here is also the power connection for the reactor. The reactor requires 8 ku of electricity.\n".. - "\n".. - "The stand has two pipe connections\\, to the right for the starting product and down for the waste\\, such as red mud in aluminum production.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Is required for the drainage of the waste product.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Is required to store substances in powder or granule form.\n".. - "\n".. - "\n".. - "\n", - "The ICTA controller (ICTA stands for \"If Condition Then Action\") is used to monitor and control machines. The controller can be used to read in data from machines and other blocks and\\, depending on this\\, switch other machines and blocks on / off.\n".. - "\n".. - "Machine data is read in and blocks and machines are controlled using commands. Chapter TA3 -> Logic / switching blocks is important for understanding how commands work.\n".. - "\n".. - "The controller requires a battery to operate. The display is used to output data\\, the signal tower to display errors.\n".. - "\n".. - "\n".. - "\n", - "The controller works on the basis of 'IF THEN ' rules. Up to 8 rules can be created per controller.\n".. - "\n".. - "Examples of rules are:\n".. - "\n".. - " - If a distributor is 'blocked'\\, the pusher in front of it should be switched off\n".. - " - If a machine shows an error\\, this should be shown on the display\n".. - "\n".. - "The controller checks these rules cyclically. To do this\\, a cycle time in seconds (`` Cycle / s '') must be specified for each rule (1..1000).\n".. - "\n".. - "For rules that evaluate an on / off input\\, e.g. from a switch or detector\\, cycle time 0 must be specified. The value 0 means that this rule should always be carried out when the input signal has changed\\, e.g. the button has sent a new value.\n".. - "\n".. - "All rules should only be executed as often as necessary. This has two advantages:\n".. - "\n".. - " - the battery of the controller lasts longer (each controller needs a battery)\n".. - " - the load for the server is lower (therefore fewer lags)\n".. - "\n".. - "You have to set a delay time ('after/s') for each action. If the action is to be carried out immediately\\, 0 must be entered.\n".. - "\n".. - "The controller has its own help and information on all commands via the controller menu.\n".. - "\n".. - "\n".. - "\n", - "The battery must be placed in close proximity to the controller\\, i.e. in one of the 26 positions around the controller.\n".. - "\n".. - "\n".. - "\n", - "The display shows its number after placement. The display can be addressed via this number. Texts can be output on the display\\, whereby the display can display 5 lines and thus 5 different texts.\n".. - "\n".. - "Lines of text are always left-aligned. If the text is to be centered horizontally\\, the text must be preceded by the character \"t\" (tabulator).\n".. - "\n".. - "The display is updated at most once per second.\n".. - "\n".. - "\n".. - "\n", - "The TA4 Display XL is twice the size of the TA4 display.\n".. - "\n".. - "Lines of text are always left-aligned. If the text is to be centered horizontally\\, the text must be preceded by the character \"t\" (tabulator).\n".. - "\n".. - "The display is updated every two seconds at most.\n".. - "\n".. - "\n".. - "\n", - "The signal tower can display red\\, green and orange. A combination of the 3 colors is not possible.\n".. - "\n".. - "\n".. - "\n", - "As the name suggests\\, the Lua controller must be programmed in the Lua programming language. The manual in English is here available:\n".. - "\n".. - "https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md\n".. - "\n".. - "The Lua controller also requires a battery. The battery must be placed in close proximity to the controller\\, i.e. in one of the 26 positions around the controller.\n".. - "\n".. - "\n".. - "\n", - "The server is used for the central storage of data from several Lua controllers. It also saves the data after a server restart.\n".. - "\n".. - "\n".. - "\n", - "The TA4 sensor box is used to set up automatic warehouses or vending machines in conjunction with the Lua controller.\n".. - "If something is put into the box or removed\\, or one of the \"F1\" / \"F2\" keys is pressed\\, an event signal is sent to the Lua controller.\n".. - "The sensor box supports the following commands:\n".. - "\n".. - " - The status of the box can be queried via 'state = $send_cmnd(\\, \"state\")'. Possible answers are: \"empty\"\\, \"loaded\"\\, \"full\"\n".. - " - The last player action can be queried via 'name\\, action = $send_cmnd(\\, \"action\")'. 'name' is the player name. One of the following is returned as 'action': \"put\"\\, \"take\"\\, \"f1\"\\, \"f2\".\n".. - " - The contents of the box can be read out via 'stacks = $send_cmnd(\\, \"stacks\")'. See: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest\n".. - " - Via '$send_cmnd(\\, \"text\"\\, \"press both buttons andnput something into the chest\")' the text can be set in the menu of the sensor box.\n".. - "\n".. - "The checkbox \"Allow public chest access\" can be used to set whether the box can be used by everyone or only by players who have access/protection rights here.\n".. - "\n".. - "\n".. - "\n", - "The terminal is used for input / output for the Lua controller.\n".. - "\n".. - "\n".. - "\n", - "", - "Only the appearance of the TA4 button/switch has changed. The functionality is the same as with the TA3 button/switch. With the wrench menu\\, however\\, the data can be changed later.\n".. - "\n".. - "\n".. - "\n", - "This block has two buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition\\, the command that is to be sent can be configured for each button. \n".. - "\n".. - "\n".. - "\n", - "This block has four buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition\\, the command that is to be sent can be configured for each button. \n".. - "\n".. - "\n".. - "\n", - "This block has two lamps that can be controlled individually. Each lamp can display the colors \"red\"\\, \"green\" and \"amber\". The labeling for both lamps can be configured via the wrench menu. The lamps can be controlled using the following commands:\n".. - "\n".. - " - Switch lamp 1 to red: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Switch lamp 2 to green: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. - " - Switch lamp 1 to orange: '$send_cmnd(1234\\, \"amber\"\\, 1)'\n".. - " - Switch lamp 2 off: '$send_cmnd(1234\\, \"off\"\\, 2)'\n".. - "\n".. - "\n".. - "\n", - "This block has four lamps that can be controlled individually. Each lamp can display the colors \"red\"\\, \"green\" and \"amber\". The labeling for all lamps can be configured via the wrench menu. The lamps can be controlled using the following commands:\n".. - "\n".. - " - Switch lamp 1 to red: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Switch lamp 2 to green: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. - " - Switch lamp 3 to orange: '$send_cmnd(1234\\, \"amber\"\\, 3)'\n".. - " - Switch lamp 4 off: '$send_cmnd(1234\\, \"off\"\\, 4)'\n".. - "\n".. - "\n".. - "\n", - "Only the appearance of the TA4 player detector has changed. The functionality is the same as with the TA3 player detector.\n".. - "\n".. - "\n".. - "\n", - "\n".. - "\n".. - "The status collector queries all configured machines in turn for the status. If one of the machines has reached or exceeded a preconfigured status\\, an \"on\" command is sent. For example\\, many machines can be easily monitored for faults from a Lua controller.\n".. - "\n", - "The functionality is the same as for the TA3 detector. In addition\\, the detector counts the items passed on.\n".. - "This counter can be queried with the 'count' command and reset with 'reset'.\n".. - "\n".. - "\n".. - "\n", - "The functionality is the same as with the TA3 Node Detector.\n".. - "\n".. - "In contrast to the TA3 node detector\\, the positions to be monitored can be configured individually here. To do this\\, the \"Record\" button must be pressed. Then all blocks must be clicked\\, the position of which is to be checked. Then the \"Done\" button must be pressed.\n".. - "\n".. - "Up to 4 blocks can be selected.\n".. - "\n".. - "\n".. - "\n", - "The charge detector measures the state of charge of the power grid's energy storage every 8 s.\n".. - "\n".. - "If the value falls below a configurable threshold (switching point)\\, a command (default: \"off\") is sent. If the value rises above this switching point again\\, a second command (default: \"on\") is sent. This allows consumers to be disconnected from the grid when the charge level of the energy storage device falls below the specified switching point.\n".. - "\n".. - "To do this\\, the charge detector must be connected to the grid via a junction box. The charge detector is configured via the open-end wrench menu.\n".. - "\n".. - "\n".. - "\n", - "The TA4 gaze sensor generates a command when the block is viewed/focused by the owner or other configured players and sends a second command when the block is no longer focused. It thus serves as a replacement for buttons/switches\\, for example to open/close doors.\n".. - "\n".. - "The TA4 Gaze Sensor can only be programmed using the open-end wrench menu. If you have an open-end wrench in your hand\\, the sensor does not trigger\\, even if it is focused.\n".. - "\n".. - "\n".. - "\n", - "Entire processes can be programmed using the TA4 sequencer. Here's an example:\n".. - "\n".. - " -- this is a comment\n".. - " \\[1\\] send 1234 a2b\n".. - " \\[30\\] send 1234 b2a\n".. - " \\[60\\] goto 1\n".. - "\n".. - " - Each line begins with a number which corresponds to a point in time '\\[\\]'\n".. - " - Values from 1 to 50000 are permitted for times\n".. - " - 1 corresponds to 100 ms\\, 50000 corresponds to about 4 game days\n".. - " - Empty lines or comments are allowed ('-- comment')\n".. - " - With 'send ' you can send a command to a block\n".. - " - With 'goto ' you can jump to another line / point in time\n".. - " - With 'stop' you can stop the sequencer with a delay so that it does not receive a new command\naccepts from a button or other block (to complete a movement)\nWithout 'stop'\\, the sequencer goes into stopped mode immediately after the last command.\n".. - "\n".. - "The TA4 sequencer supports the following techage commands:\n".. - "\n".. - " - 'goto ' Jump to a command line and start the sequencer\n".. - " - 'stop' Stop the sequencer\n".. - " - 'on' and 'off' as aliases for 'goto 1' resp. 'stop'\n".. - "\n".. - "The 'goto' command is only accepted when the sequencer is stopped.\n".. - "\n".. - "The cycle time (default: 100 ms) can be changed for the sequencer via the open-end wrench menu.\n".. - "\n".. - "\n".. - "\n", - "", - "The TA4 Move Controller is similar to \"Door Controller 2\"\\, but the selected blocks are not removed\\, but can be moved.\n".. - "Since the moving blocks can take players and mobs standing on the block with them\\, elevators and similar transport systems can be built with them.\n".. - "\n".. - "Instructions:\n".. - "\n".. - " - Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained)\n".. - " - the \"flight route\" must be entered via an x\\, y\\, z specification (relative) (the maximum distance (x+y+z) is 200 m)\n".. - " - The movement can be tested with the menu buttons \"Move A-B\" and \"Move B-A\"\n".. - " - you can also fly through walls or other blocks\n".. - " - The target position for the blocks can also be occupied. In this case\\, the blocks are saved \"invisibly\". This is intended for sliding doors and the like\n".. - "\n".. - "The Move Controller supports the following techage commands:\n".. - "\n".. - " - 'a2b' Move block from A to B.\n".. - " - 'b2a' Move block from B to A.\n".. - " - 'move' Move block to the other side\n".. - "\n".. - "You can switch to the 'move xyz' operating mode via the wrench menu. After switching\\, the following techage commands are supported: \n".. - "\n".. - " - 'move2' With the command\\, the flight route must also be specified as an x\\,y\\,z vector.\nExample Lua Controller: '$send_cmnd(MOVE_CTLR\\, \"move2\"\\, \"0\\,12\\,0\")'\n".. - " - 'reset' move block(s) back to start position\n".. - "\n".. - "*Important instructions:*\n".. - "\n".. - " - If several blocks are to be moved\\, the block that is to take the players/mobs must be clicked first when training.\n".. - " - If the block that is supposed to take the players/mobs has a reduced height\\, the height must be set in the controller using the open-ended wrench menu (e.g. height = 0.5). Otherwise the player/mob will not be \"found\" and will not be taken away.\n".. - "\n".. - "\n".. - "\n", - "The TA4 turn controller is similar to the \"Move Controller\"\\, but the selected blocks are not moved\\, but rotated around their center to the right or left.\n".. - "\n".. - "Instructions:\n".. - "\n".. - " - Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained)\n".. - " - The movement can be tested with the menu buttons \"Turn left\" and \"Turn right\"\n".. - "\n".. - "The turn controller supports the following techage commands:\n".. - "\n".. - " - 'left' Turn left\n".. - " - 'right' Turn right\n".. - " - 'uturn' Turn 180 degrees\n".. - "\n".. - "\n".. - "\n", - "TA4 contains a series of powerful lamps that enable better illumination or take on special tasks.\n".. - "\n", - "The TA4 LED grow light enables fast and vigorous growth of all plants from the 'farming' mod. The lamp illuminates a 3x3 field\\, so that plants can also be grown underground.\n".. - "The lamp must be placed one block above the ground in the middle of the 3x3 field.\n".. - "\n".. - "The lamp can also be used to grow flowers. If the lamp is placed over a 3x3 flower bed made of \"Garden Soil\" (Mod 'compost')\\, the flowers grow there automatically (above and below ground).\n".. - "\n".. - "You can harvest the flowers with the Signs Bot\\, which also has a corresponding sign that must be placed in front of the flower field.\n".. - "\n".. - "The lamp requires 1 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The TA4 LED street lamp is a lamp with particularly strong illumination. The lamp consists of the lamp housing\\, lamp arm and lamp pole blocks.\n".. - "\n".. - "The current must be led from below through the mast up to the lamp housing. First pull the power line up and then \"plaster\" the power cable with lamp pole blocks.\n".. - "\n".. - "The lamp requires 1 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The TA4 LED industrial lamp is a lamp with particularly strong illumination. The lamp must be powered from above.\n".. - "\n".. - "The lamp requires 1 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The liquid filter filters red mud.\n".. - "A part of the red mud becomes lye\\, which can be collected at the bottom in a tank.\n".. - "The other part becomes desert cobblestone and clutters the filter material.\n".. - "If the filter is too clogged\\, it has to be cleaned and re-filled.\n".. - "The filter consists of a base layer\\, 7 identical filter layers and a filling layer at the top.\n".. - "\n".. - "\n".. - "\n", - "You can see the structure of this layer in the plan.\n".. - "\n".. - "The lye is collected in the tank.\n".. - "\n".. - "\n".. - "\n", - "This layer has to be filled with gravel as shown in the plan.\n".. - "In total\\, there must be seven layers of gravel.\n".. - "The filter will become cluttered over time\\, so that it has to be cleaned and re-filled.\n".. - "\n".. - "\n".. - "\n", - "This layer is used to fill the filter with red mud.\n".. - "The red mud must be pumped into the filler pipe.\n".. - "\n".. - "\n".. - "\n", - "The Collider is a research facility that conducts basic research. Experience points can be collected here\\, which are required for TA5 (Future Age).\n".. - "\n".. - "Like its original at CERN in Geneva\\, the collider must be built underground. The standard setting here is Y <= -28. The value can\\, however\\, be changed by the server personnel via configuration. Please ask or try the \"TA4 Collider Detector Worker\" block.\n".. - "\n".. - "Only one collider can be operated per player. So it makes no sense to set up two or more colliders. Experience points are credited to the player who owns the collider. The experience points cannot be transferred.\n".. - "\n".. - "A collider consists of a \"ring\" made of tubes and magnets as well as a detector with a cooling system.\n".. - "\n".. - " - The detector is the heart of the system. This is where the scientific experiments take place. The detector is 3x3x7 blocks in size.\n".. - " - 22 TA4 Collider Magnets (not the TA4 Collider Detector Magnets!) must be connected to each other via 5 blocks of the TA4 vacuum tube. Each magnet also requires electricity and a gas connection for cooling. The whole thing forms (as shown in the plan on the right) a square with an edge length of 37 meters.\n".. - "\n".. - "The plan shows the facility from above:\n".. - "\n".. - " - the gray block is the detector with the worker block in the middle\n".. - " - the red blocks are the magnets\\, the blue the vacuum tubes\n".. - "\n".. - "\n".. - "\n", - "The detector is set up automatically with the help of the \"TA4 Collider Detector Worker\" block (similar to the derrick). All of the materials required for this must first be placed in the worker block. The detector is shown symbolically on the worker block. The detector is set up across the worker block.\n".. - "\n".. - "The detector can also be dismantled again with the help of the worker block.\n".. - "\n".. - "The connections for electricity\\, gas and vacuum tubes are located on the two front sides of the detector. A TA4 pump must be connected at the top in order to suck the tube empty / to create the vacuum.\n".. - "\n".. - "The cooling system must be connected to the rear of the detector. The cooling system is shown in the plan on the right. In addition to the TA4 heat exchanger of the energy storage unit (which is used here for cooling)\\, a TA4 cooler block is also required.\n".. - "\n".. - "Note: The arrow on the heat exchanger must point away from the detector. The heat exchanger must also be supplied with electricity.\n".. - "\n".. - "\n".. - "\n".. - " - In addition\\, cooling is required\\, which must also be installed at the detector. Isobutane is required for cooling.\n".. - " - The system requires quite a bit of electricity. Therefore\\, it makes sense to have your own power supply.\n".. - "\n", - "The collider is controlled via a TA4 terminal (not via the TA4 Lua controller terminal).\n".. - "\n".. - "This terminal must be connected to the detector. The number of the detector is displayed as info text on the worker block.\n".. - "\n".. - "The terminal supports the following commands:\n".. - "\n".. - " - 'connect ' (connect to the detector)\n".. - " - 'start' (starting the detector)\n".. - " - 'stop' (stop the detector)\n".. - " - 'test ' (checking a magnet)\n".. - " - 'points' (query of the experience points already achieved)\n".. - "\n".. - "If an error occurs on a magnet during the 'start'\\, the number of the magnet is output. The 'test' command can be used to request further information on the magnet error.\n".. - "\n".. - "\n".. - "\n", - "Each TA4 Collider magnet must also be supplied with electricity (as shown on the right in the plan) and with Isobutane for cooling:\n".. - "\n".. - " - The connection for the power is on the top of the magnet.\n".. - " - The connection for the cooling is on the front of the magnet.\n".. - " - A TA4 pump and a TA4 tank with at least 250 units of isobutane are also required to cool the entire system.\n".. - " - The system also requires a lot of electricity. It therefore makes sense to have your own power supply with at least 145 ku.\n".. - "\n".. - "\n".. - "\n", - "The following sequence is recommended when setting up the collider:\n".. - "\n".. - " - Put a forceload block. Only the detector with the cooling system has to be in the area of ​​the forceload block.\n".. - " - Set the worker block\\, fill it with items and set up the detector via the menu\n".. - " - Build the ring with tubes and magnets\n".. - " - Connect all magnets and the detector with power cables\n".. - " - Connect all magnets and the detector with the yellow tubes and pump the isobutane into the tube system with a pump\n".. - " - Install a TA4 pump as a vacuum pump on the detector and switch it on (no additional tank is required). If the pump goes into \"standby\"\\, the vacuum is established. This will take a few seconds\n".. - " - assemble the cooler (heat exchanger) and connect it to the power cable\n".. - " - Place the TA4 terminal in front of the detector and connect it to the detector via 'connect '\n".. - " - Switch on / connect the power supply\n".. - " - switch on the cooler (heat exchanger)\n".. - " - Switch on the detector via 'start' on the TA4 terminal. After a few test steps\\, the detector goes into normal operation or outputs an error.\n".. - " - The collider has to run continuously and then gradually delivers experience points. For 10 points\\, the collider has to run for a few hours\n".. - "\n".. - "\n".. - "\n", - "", - "Up to 10 recipes can be saved in the recipe block. These recipes can then be called up via a TA4 Autocrafter command. This enables the autocrafter's recipe to be configured using a command. The recipes in the recipe block can also be queried directly using a command.\n".. - "\n".. - "'input ' reads a recipe from the TA4 recipe block. '' is the number of the recipe. The block returns a list of recipe ingredients.\n".. - "\n".. - "Example: '$send_cmnd(1234\\, \"input\"\\, 1)'\n".. - "\n".. - " \n".. - "\n", - "The function corresponds to that of TA3.\n".. - "\n".. - "The processing power is 4 items every 4 s. The autocrafter requires 9 ku of electricity for this.\n".. - "\n".. - "In addition\\, the TA4 Autocrafter supports the selection of different recipes using the following commands:\n".. - "\n".. - "'recipe \".\"' switches the autocrafter to a recipe from the TA4 Recipe Block. '' is the number of the recipe block\\, '' the recipe number. Example: '$send_cmnd(1234\\, \"recipe\"\\, \"5467.1\")'\n".. - "\n".. - "Alternatively\\, a recipe can also be selected via the list of ingredients\\, such as:\n".. - "'$send_cmnd(1234\\, \"recipe\"\\, \"default:coal_lump\\,\\,\\,default:stick\")'\n".. - "All technical names of a recipe must be specified here\\, separated by commas. See also the command 'input' in the TA4 recipe block.\n".. - "\n".. - "The 'flush' command moves all items from the input inventory to the output inventory. The command returns 'true' if the input inventory was completely emptied. If 'false' was returned (output inventory full)\\, the command must be repeated at a later time.\n".. - "\n".. - " \n".. - "\n", - "See TA3 tank.\n".. - "\n".. - "A TA4 tank can hold 2000 units or 200 barrels of liquid.\n".. - "\n".. - "\n".. - "\n", - "See TA3 pump.\n".. - "\n".. - "The TA4 pump pumps 8 units of liquid every two seconds. \n".. - "\n".. - "In the \"Flow limiter\" mode\\, the number of units pumped by the pump can be limited. The flow limiter mode can be activated via the open-end wrench menu by configuring the number of units in the menu. Once the configured number of units have been pumped\\, the pump will turn off. When the pump is turned on again\\, it will pump the configured number of units again and then turn off.\n".. - "\n".. - "The flow limiter can also be configured and started using a Lua or Beduino controller.\n".. - "\n".. - "The pump also supports the 'flowrate' command. This allows the total flow rate through the pump to be queried.\n".. - "\n".. - "\n".. - "\n", - "With TA4\\, the industrial furnace also has its electrical heating. The oil burner and the blower can be replaced with the heater.\n".. - "\n".. - "The heater requires 14 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "This block can no longer be crafted and will be replaced by the TA4 water inlet block. \n".. - "\n", - "Some recipes require water. The water must be pumped from the sea with a pump (water at y = 1). A \"pool\" made up of a few water blocks is not sufficient for this! \n".. - "\n".. - "To do this\\, the water inlet block must be placed in the water and connected to the pump via pipes. If the block is placed in the water\\, it must be ensured that there is water under the block (water must be at least 2 blocks deep). \n".. - "\n".. - "\n".. - "\n", - "TA4 also has its own tubes in the TA4 design. These can be used like standard tubes.\n".. - "But: TA4 pushers and TA4 distributors only achieve their full performance when used with TA4 tubes.\n".. - "\n".. - "\n".. - "\n", - "The function basically corresponds to that of TA2 / TA3. In addition\\, a menu can be used to configure which objects should be taken from a TA4 chest and transported further.\n".. - "The processing power is 12 items every 2 s\\, if TA4 tubes are used on both sides. Otherwise there are only 6 items every 2 s.\n".. - "\n".. - "In the \"flow limiter\" mode\\, the number of items that are moved by the pusher can be limited. The flow limiter mode can be activated via the open-end wrench menu by configuring the number of items in the menu. As soon as the configured number of items have been moved\\, the pusher switches off. If the pusher is switched on again\\, it moves the configured number of items again and then switches off.\n".. - "\n".. - "The TA4 pusher can also be configured and started using a Lua or Beduino controller.\n".. - "\n".. - "Here are the additional commands for the Lua controller:\n".. - "\n".. - " - 'config' is used to configure the pusher\\, analogous to manual configuration via the menu.\n Example: '$send_cmnd(1234\\, \"config\"\\, \"default:dirt\")'\n With '$send_cmnd(1234\\, \"config\"\\, \"\")' the configuration is deleted\n".. - " - 'limit' is used to set the number of items for the flow limiter mode:\n Example: '$send_cmnd(1234\\, \"init\"\\, 7)'\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA3. The chest can hold more content.\n".. - "\n".. - "In addition\\, the TA4 chest has a shadow inventory for configuration. Here certain stack locations can be pre-assigned with an item. Pre-assigned inventory stacks are only filled with these items when filling. A TA4 pusher or TA4 injector with the appropriate configuration is required to empty a pre-assigned inventory stacks.\n".. - "\n".. - "\n".. - "\n", - "The TA4 8x2000 chest does not have a normal inventory like other chest\\, but has 8 stores\\, whereby each store can hold up to 2000 items of one sort. The orange buttons can be used to move items to or from the store. The box can also be filled or emptied with a pusher (TA2\\, TA3 or TA4) as usual.\n".. - "\n".. - "If the chest is filled with a pusher\\, all stores fill from left to right. If all 8 stores are full and no further items can be added\\, further items are rejected.\n".. - "\n".. - "*Row function*\n".. - "\n".. - "Several TA4 8x2000 chests can be connected to a large chest with more content. To do this\\, the chests must be placed in a row one after the other.\n".. - "\n".. - "First the front chest must be placed\\, then the stacking chests are placed behind with the same direction of view (all boxes have the front towards the player). With 2 chests in a row\\, the size increases to 8x4000\\, etc.\n".. - "\n".. - "The rows of chests can no longer be removed. There are two ways to dismantle the chests:\n".. - "\n".. - " - Empty and remove the front chest. This unlocks the next chest and can be removed.\n".. - " - Empty the front chest so far that all stores contain a maximum of 2000 items. This unlocks the next chest and can be removed.\n".. - "\n".. - "The chests have an \"order\" checkbox. If this checkbox is activated\\, the stores are no longer completely emptied by a pusher. The last item remains in the store as a default. This results in a fixed assignment of items to storage locations.\n".. - "\n".. - "The chest can only be used by players who can build at this location\\, i.e. who have protection rights. It does not matter who sets the chest.\n".. - "\n".. - "The chest has an additional command for the Lua controller:\n".. - "\n".. - " - 'count' is used to request how many items are in the chest.\nExample 1: '$send_cmnd(CHEST\\, \"count\")' -> Sum of items across all 8 stores\nExample 2: '$send_cmnd(CHEST\\, \"count\"\\, 2)' -> number of items in store 2 (second from left)\n".. - " - 'storesize' is used to read the size of one of the eight stores:\nExample: '$send_cmnd(CHEST\\, \"storesize\")' -> function returns e.g. 6000\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 24 items every 4 s\\, provided TA4 tubes are used on all sides. Otherwise there are only 12 items every 4 s.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of the normal TA4 distributor\\, with two differences:\n".. - "The processing power is 36 items every 4 s\\, provided TA4 tubes are used on all sides. Otherwise there are only 18 items every 4 s.\n".. - "Furthermore\\, up to 8 items can be configured per direction.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 4 items every 4 s. The block requires 5 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 4 items every 4 s. The block requires 9 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function largely corresponds to that of TA2.\n".. - "\n".. - "In addition\\, the hole size can be set between 3x3 and 11x11 blocks.\n".. - "The maximum depth is 80 meters. The quarry requires 14 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2\\, only different chips are produced here.\n".. - "The processing power is one chip every 6 s. The block requires 12 ku of electricity for this.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA3.\n".. - "\n".. - "The processing power is up to 8 times four items every 4 seconds.\n".. - "\n".. - "\n".. - "\n", - "The recycler is a machine that processes all Techage recipes backwards\\, i.e. it can dismantle machines and blocks back into their components. \n".. - "\n".. - "The machine can disassemble pretty much any Techage and Hyperloop blocks. But not all recipe items/materials can be recycled:\n".. - "\n".. - " - Wood turns into sticks\n".. - " - Stone turns into sand or gravel\n".. - " - Semiconductors / chips cannot be recycled\n".. - " - Tools cannot be recycled\n".. - "\n".. - "The processing power is one item every 8 s. The block requires 16 ku of electricity for this.\n".. - "\n".. - " \n".. - "\n", - }, - images = { - "techage_ta4", - "", - "ta4_windturbine", - "ta4_nacelle", - "ta4_blinklamp", - "ta4_pillar", - "", - "ta4_solarmodule", - "ta4_solarcarrier", - "ta4_solar_inverter", - "ta4_powercable", - "ta4_powerbox", - "ta4_minicell", - "", - "ta4_heatexchanger", - "ta4_turbine", - "ta4_generator", - "ta4_pipeinlet", - "ta4_pipe", - "ta4_transformer", - "ta4_transformer", - "ta4_electricmeter", - "ta4_laser", - "ta4_hydrogen", - "ta4_electrolyzer", - "ta4_fuelcell", - "", - "ta4_doser", - "ta4_reactor", - "ta4_fillerpipe", - "ta4_reactorstand", - "ta4_reactorbase", - "ta4_silo", - "ta4_icta_controller", - "ta4_icta_controller", - "ta4_battery", - "ta4_display", - "ta4_displayXL", - "ta4_signaltower", - "ta4_lua_controller", - "ta4_lua_server", - "ta4_sensor_chest", - "ta4_terminal", - "", - "ta4_button", - "ta4_button_2x", - "ta4_button_4x", - "ta4_signallamp_2x", - "ta4_signallamp_4x", - "ta4_playerdetector", - "ta4_collector", - "ta4_detector", - "ta4_nodedetector", - "ta4_chargedetector", - "ta4_gaze_sensor", - "ta4_sequencer", - "", - "ta4_movecontroller", - "ta4_turncontroller", - "", - "ta4_growlight", - "ta4_streetlamp", - "ta4_industriallamp", - "ta4_liquid_filter", - "", - "", - "", - "", - "", - "ta4_terminal", - "", - "techage_ta4c", - "", - "ta4_recipeblock", - "ta4_autocrafter", - "ta4_tank", - "ta4_pump", - "ta4_furnaceheater", - "", - "ta4_waterinlet", - "ta4_tube", - "ta4_pusher", - "ta4_chest", - "ta4_8x2000_chest", - "ta4_distributor", - "ta4_high_performance_distributor", - "ta4_gravelsieve", - "ta4_grinder", - "ta4_quarry", - "ta4_electronicfab", - "ta4_injector", - "ta4_recycler", - }, - plans = { - "", - "ta4_windturbine", - "", - "", - "", - "", - "ta4_solarplant", - "", - "", - "", - "", - "", - "", - "ta4_storagesystem", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_reactor", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_liquid_filter_base", - "ta4_liquid_filter_gravel", - "ta4_liquid_filter_top", - "techage_collider_plan", - "ta4_cooler", - "", - "techage_collider_plan2", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta4_RU.lua b/techage/doc/manual_ta4_RU.lua deleted file mode 100644 index 32faa51..0000000 --- a/techage/doc/manual_ta4_RU.lua +++ /dev/null @@ -1,1054 +0,0 @@ -return { - titles = { - "1,TA4: Present", - "2,Wind Turbine", - "3,TA4 Wind Turbine", - "3,TA4 Wind Turbine Nacelle", - "3,TA4 Wind Turbine Signal Lamp", - "3,TA4 Pillar", - "2,Solar System", - "3,TA4 Solar Module", - "3,TA4 Solar Carrier Module", - "3,TA4 Solar Inverter", - "3,TA4 Low Power Cable", - "3,TA4 Low Voltage Junction Box", - "3,TA4 Street Lamp Solar Cell", - "2,Thermal Energy Storage", - "3,TA4 Heat Exchanger", - "3,TA4 Turbine", - "3,TA4 Generator", - "3,TA4 Pipe Inlet", - "3,TA4 Pipe", - "2,Power Distribution", - "3,TA4 Isolation Transformer", - "3,TA4 Electric Meter", - "3,TA4 Laser", - "2,Hydrogen", - "3,Electrolyzer", - "3,Fuel Cell", - "2,Chemical Reactor", - "3,TA4 Doser", - "3,TA4 Reactor", - "3,TA4 Filler Pipe", - "3,TA4 Reactor Stand", - "3,TA4 Reactor Base", - "3,TA4 Silo", - "2,ICTA Controller", - "3,TA4 ICTA controller", - "3,Battery", - "3,TA4 Display", - "3,TA4 Display XL", - "3,TA4 Signal Tower", - "2,TA4 Lua Controller", - "3,TA4 Lua Server", - "3,TA4 Sensor Box / Chest", - "3,TA4 Lua Controller Terminal", - "2,TA4 Logic/Switching Modules", - "3,TA4 Button/Switch", - "3,TA4 2x Button", - "3,TA4 4x Button", - "3,TA4 2x Signal Lamp", - "3,TA4 4x Signal Lamp", - "3,TA4 Player Detector", - "3,TA4 State Collector", - "3,TA4 Detector", - "3,TA4 Node Detector", - "3,TA4 Energy Storage Charge Detector", - "3,TA4 Gaze Sensor", - "3,TA4 Sequencer", - "2,Move/Turn Controller", - "3,TA4 Move Controller", - "3,TA4 Turn Controller", - "2,TA4 Lamps", - "3,TA4 LED Grow Light", - "3,TA4 Street Lamp", - "3,TA4 LED Industrial Lamp", - "2,TA4 Liquid Filter", - "3,Base Layer", - "3,Gravel Layer", - "3,Filling Layer", - "2,TA4 Collider (Particle Accelerator)", - "3,Detector", - "3,Control / TA4 Terminal", - "3,Cooling and power", - "3,Construction", - "2,More TA4 Blocks", - "3,TA4 Recipe Block", - "3,TA4 Autocrafter", - "3,TA4 Tank", - "3,TA4 Pump", - "3,TA4 Furnace Heater", - "3,TA4 Water Pump (deprecated)", - "3,TA4 Water Inlet", - "3,TA4 Tube", - "3,TA4 Pusher", - "3,TA4 Chest", - "3,TA4 8x2000 Chest", - "3,TA4 Distributor", - "3,TA4 High Performance Distributor", - "3,TA4 Gravel Sieve", - "3,TA4 Grinder", - "3,TA4 Quarry", - "3,TA4 Electronic Fab", - "3,TA4 Injector", - "3,TA4 Recycler", - }, - texts = { - "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".. - "\n".. - "\n", - "A wind turbine always supplies electricity when there is wind. There is no wind in the game\\, but the mod simulates this by turning the wind turbines only in the morning (5:00 - 9:00) and in the evening (17:00 - 21:00). A wind turbine only supplies electricity if it is set up in a suitable location.\n".. - "\n".. - "The TA wind power plants are pure offshore plants\\, which means that they have to be built in the sea. This means that wind turbines can only be build in a sea (occean) biome and that there must be sufficient water and a clear view around the mast.\n".. - "\n".. - "To find a suitable spot\\, click on the water with the wrench (TechAge Info Tool). A chat message will show you whether this position is suitable for the mast of the wind turbine.\n".. - "\n".. - "The current must be led from the rotor block down through the mast. First pull the power line up and then \"plaster\" the power cable with TA4 pillar blocks. A work platform can be built below. The plan on the right shows the structure in the upper part.\n".. - "\n".. - "The wind turbine delivers 70 ku\\, but only 8 hours a day (see above).\n".. - "\n".. - "\n".. - "\n", - "The wind turbine block (rotor) is the heart of the wind turbine. This block must be placed on top of the mast. Ideally at Y = 15\\, then you just stay within a map / forceload block.\n".. - "When you start the turbine\\, all conditions for the operation of the wind turbine are checked. If all conditions are met\\, the rotor blades (wings) appear automatically. Otherwise you will get an error message.\n".. - "\n".. - "\n".. - "\n", - "This block must be placed on the black end of the wind turbine block.\n".. - "\n".. - "\n".. - "\n", - "This flashing light is only for decorative purposes and can be placed on top of the wind turbine block.\n".. - "\n".. - "\n".. - "\n", - "This builds the mast for the wind turbine. However\\, these blocks are not set by hand but must be set with the help of a trowel\\, so that the power line to the mast tip is replaced with these blocks (see under TA power cable).\n".. - "\n".. - "\n".. - "\n", - "The solar system only produces electricity when the sun is shining. In the game this is every game day from 6:00 am to 6:00 pm.\n".. - "The same power is always available during this time. After 6:00 p.m.\\, the solar modules switch off completely.\n".. - "\n".. - "The biome temperature is decisive for the performance of the solar modules. The hotter the temperature\\, the higher the yield.\n".. - "The biome temperature can be determined with the Techage Info Tool (wrench). It typically fluctuates between 0 and 100:\n".. - "\n".. - " - full power is available at 100\n".. - " - at 50\\, half the power is available\n".. - " - at 0 there is no service available\n".. - "\n".. - "It is therefore advisable to look for hot steppes and deserts for the solar system.\n".. - "The overhead lines are available for the transport of electricity.\n".. - "However\\, hydrogen can also be produced\\, which can be transported and converted back into electricity at the destination.\n".. - "\n".. - "The smallest unit in a solar system is two solar modules and one carrier module. The carrier module must be placed first\\, the two solar modules to the left and right next to it (not above!).\n".. - "\n".. - "The plan on the right shows 3 units\\, each with two solar modules and one carrier module\\, connected to the inverter via red cables.\n".. - "\n".. - "Solar modules supply DC voltage\\, which cannot be fed directly into the power grid. Therefore\\, the solar units must first be connected to the inverter via the red cable. This consists of two blocks\\, one for the red cable to the solar modules (DC) and one for the gray power cable to the power grid (AC).\n".. - "\n".. - "The map area where the solar system is located must be fully loaded. This also applies to the direct position above the solar module\\, because the light intensity is regularly measured there. It is therefore advisable to first set a forceload block and then to place the modules within this area.\n".. - "\n".. - "\n".. - "\n", - "The solar module must be placed on the carrier module. Two solar modules are always required.\n".. - "In a pair\\, the solar modules perform up to 3 ku\\, depending on the temperature.\n".. - "With the solar modules\\, care must be taken that they have full daylight and are not shaded by blocks or trees. This can be tested with the Info Tool (wrench).\n".. - "\n".. - "\n".. - "\n", - "The carrier module is available in two heights (1m and 2m). Both are functionally identical.\n".. - "The carrier modules can be placed directly next to one another and thus connected to form a row of modules. The connection to the inverter or to other module series must be made with the red low-voltage cables or the low-voltage junction boxes.\n".. - "\n".. - "\n".. - "\n", - "The inverter converts the solar power (DC) into alternating current (AC) so that it can be fed into the power grid.\n".. - "An inverter can feed a maximum of 100 ku of electricity\\, which corresponds to 33 solar modules or more.\n".. - "\n".. - "\n".. - "\n", - "The low voltage cable is used to connect rows of solar modules to the inverter. The cable must not be used for other purposes.\n".. - "\n".. - "The maximum cable length is 200 m.\n".. - "\n".. - "\n".. - "\n", - "The junction box must be placed on the floor. It has only 4 connections (in the 4 directions).\n".. - "\n".. - "\n".. - "\n", - "As the name suggests\\, the street lamp solar cell is used to power a street lamp. A solar cell can supply two lamps (1 ku). The solar cell stores the sun's energy during the day and delivers the electricity to the lamp at night. That means the lamp only glows in the dark.\n".. - "\n".. - "This solar cell cannot be combined with the other solar modules.\n".. - "\n".. - "\n".. - "\n", - "The thermal energy storage replaces the battery block from TA3.\n".. - "\n".. - "The thermal energy store consists of a concrete shell (concrete blocks) filled with gravel. Five sizes of the storage are possible:\n".. - "\n".. - " - Cover with 5x5x5 concrete blocks\\, filled with 27 gravel\\, storage capacity: 22.5 kud\n".. - " - Cover with 7x7x7 concrete blocks\\, filled with 125 gravel\\, storage capacity: 104 kud\n".. - " - Cover with 9x9x9 concrete blocks\\, filled with 343 gravel\\, storage capacity: 286 kud\n".. - " - Cover with 11x11x11 concrete blocks\\, filled with 729 gravel\\, storage capacity: 610 kud\n".. - " - Cover with 13x13x13 concrete blocks\\, filled with 1331 gravel\\, storage capacity: 1112 kud\n".. - "\n".. - "A window made of an obsidian glass block may be in the concrete shell. This must be placed fairly in the middle of the wall. Through this window you can see whether the storage is loaded more than 80%. In the plan on the right you can see the structure of TA4 heat exchanger consisting of 3 blocks\\, the TA4 turbine and the TA4 generator. Pay attention to the alignment of the heat exchanger (the arrow at block 1 must point to the turbine).\n".. - "\n".. - "Contrary to the plan on the right\\, the connections on the storage block must be on the same level (arranged horizontally\\, i.e. not below and above). The pipe inlets (TA4 Pipe Inlet) must be exactly in the middle of the wall and face each other. The yellow TA4 pipes are used as steam pipes. The TA3 steam pipes cannot be used here.\n".. - "Both the generator and the heat exchanger have a power connection and must be connected to the power grid.\n".. - "\n".. - "In principle\\, the heat storage system works exactly the same as the batteries\\, only with much more storage capacity.\n".. - "\n".. - "In order for the heat storage system to work\\, all blocks (also the concrete shell and gravel) must be loaded using a forceload block.\n".. - "\n".. - "\n".. - "\n", - "The heat exchanger consists of 3 parts that must be placed on top of each other\\, with the arrow of the first block pointing towards the turbine. The pipes must be built with the yellow TA4 pipes.\n".. - "The heat exchanger must be connected to the power grid. The energy storage device is recharged via the heat exchanger\\, provided that sufficient electricity is available. \n".. - "\n".. - "\n".. - "\n", - "The turbine is part of the energy storage. It must be placed next to the generator and connected to the heat exchanger via TA4 tubes as shown in the plan.\n".. - "\n".. - "\n".. - "\n", - "The generator is used to generate electricity. Therefore\\, the generator must also be connected to the power grid.\n".. - "The generator is part of the energy storage. It is used to generate electricity and thus releases the energy from the energy storage unit. Therefore\\, the generator must also be connected to the power grid.\n".. - "\n".. - "Important: Both\\, heat exchanger and generator must be connected to the same power grid! \n".. - "\n".. - "\n".. - "\n", - "One pipe inlet block each must be installed on both sides of the storage block. The blocks must face each other exactly.\n".. - "\n".. - "The pipe inlet blocks *cannot* be used as normal wall openings\\, use the TA3 pipe wall entry blocks instead.\n".. - "\n".. - "\n".. - "\n", - "With TA4\\, the yellow pipes are used for the transmission of gas and liquids.\n".. - "The maximum cable length is 100 m.\n".. - "\n".. - "\n".. - "\n", - "With the help of power cables and junction boxes\\, power networks of up to 1000 blocks/nodes can be set up. However\\, it should be noted that distribution boxes must also be counted. This means that up to 500 generators/storage systems/machines/lamps can be connected to a power grid.\n".. - "\n".. - "With the help of an isolating transformer and electricity meter\\, networks can be connected to form even larger structures.\n".. - "\n".. - "\n".. - "\n", - "With the help of an isolating transformer\\, two power grids can be connected to form a larger network. The isolation transformer can transmit electricity in both directions.\n".. - "\n".. - "The isolation transformer can transmit up to 300 ku. The maximum value is adjustable via the wrench menu.\n".. - "\n".. - "\n".. - "\n", - "With the help of an electricity meter\\, two electricity networks can be connected to form a larger network. The electricity meter only transmits electricity in one direction (note arrow). The amount of electrical energy passed through (in kud) is measured and displayed. This value can also be queried by a Lua controller using the 'consumption' command. The current current can be queried via the command 'current'.\n".. - "\n".. - "The electricity meter can pass up to 200 ku. The maximum value is adjustable via the wrench menu.\n".. - "\n".. - "A power output countdown can also be entered via the wrench menu. When this countdown reaches zero\\, the electricity meter switches off. The countdown can be queried using the 'countdown' command.\n".. - "\n".. - "\n".. - "\n", - "The TA4 laser is used for wireless power transmission. Two blocks are required for this: TA4 Laser Beam Emitter and TA4 Laser Beam Receiver. There must be an air gap between the two blocks so that the laser beam can be built up from the emitter to the receiver. First the emitter must be placed. This immediately switches on the laser beam and shows possible positions of the receiver. Possible positions for the receiver are also output via a chat message. \n".. - "\n".. - "With the laser\\, distances of up to 96 blocks can be bridged. Once the connection has been established (no current has to flow)\\, this is indicated via the info text of the emitter and also of the receiver. \n".. - "\n".. - "The laser blocks themselves do not require any electricity.\n".. - "\n".. - "\n".. - "\n", - "Electrolysis can be used to split electricity into hydrogen and oxygen. On the other hand\\, hydrogen can be converted back into electricity with oxygen from the air using a fuel cell.\n".. - "This enables current peaks or an excess supply of electricity to be converted into hydrogen and thus stored.\n".. - "\n".. - "In the game\\, electricity can be converted back into electricity via the fuel cell using the electrolyzer in hydrogen and hydrogen.\n".. - "This means that electricity (in the form of hydrogen) can not only be stored in tanks\\, but also transported by means of the tank cart.\n".. - "\n".. - "However\\, the conversion of electricity into hydrogen and back is lossy. Out of 100 units of electricity\\, only 95 units of electricity come out after the conversion to hydrogen and back.\n".. - "\n".. - "\n".. - "\n", - "The electrolyzer converts electricity into hydrogen.\n".. - "It must be powered from the left. On the right\\, hydrogen can be extracted via pipes and pumps.\n".. - "\n".. - "The electrolyzer can draw up to 35 ku of electricity and then generates a hydrogen item every 4 s.\n".. - "200 units of hydrogen fit into the electrolyzer.\n".. - "\n".. - "The electrolyzer has a wrench menu for setting the current consumption and the switch-off point.\n".. - "\n".. - "If the power stored in the power grid falls below the specified value of the switch-off point\\, the electrolyzer switches off automatically. This prevents the storage systems from running empty.\n".. - "\n".. - "\n".. - "\n", - "The fuel cell converts hydrogen into electricity.\n".. - "It must be supplied with hydrogen from the left by a pump. The power connection is on the right.\n".. - "\n".. - "The fuel cell can deliver up to 34 ku of electricity and needs a hydrogen item every 4 s.\n".. - "\n".. - "Usually the fuel cell works as a category 2 generator (like other storage systems). \n".. - "In this case\\, no other category 2 blocks such as the battery block can be charged. However\\, the fuel cell can also be used as a category 1 generator via the check box.\n".. - "\n".. - "\n".. - "\n", - "The reactor is used to process the ingredients obtained from the distillation tower or from other recipes into new products.\n".. - "The plan on the left shows only one possible variant\\, since the arrangement of the silos and tanks depends on the recipe.\n".. - "\n".. - "The primary output product is always output to the side of the reactor stand\\, regardless of whether it is a powder or a liquid. The (secondary) waste product is always discharged at the bottom of the reactor stand.\n".. - "\n".. - "A reactor consists of:\n".. - "\n".. - " - Various tanks and silos with the ingredients that are connected to the doser via pipes\n".. - " - optionally a reactor base\\, which discharges the waste from the reactor (only necessary for recipes with two output products)\n".. - " - the reactor stand\\, which must be placed on the base (if available). The stand has a power connection and draws 8 ku during operation.\n".. - " - The reactor vessel that has to be placed on the reactor stand\n".. - " - The filler pipe that must be placed on the reactor vessel\n".. - " - The dosing device\\, which has to be connected to the tanks or silos and the filler pipe via pipes\n".. - "\n".. - "Note 1: Liquids are only stored in tanks\\, solids and substances in powder form only in silos. This applies to ingredients and output products.\n".. - "\n".. - "Note 2: Tanks or silos with different contents must not be connected to a pipe system. In contrast\\, several tanks or silos with the same content may hang in parallel on one line.\n".. - "\n".. - "Cracking breaks long chains of hydrocarbons into short chains using a catalyst.\n".. - "Gibbsite powder serves as a catalyst (is not consumed). It can be used to convert bitumen into fueloil\\, fueloil into naphtha and naphtha into gasoline.\n".. - "\n".. - "In hydrogenation\\, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones.\n".. - "Here iron powder is required as a catalyst (is not consumed). It can be used to convert gas (propane) into isobutane\\,\n".. - "isobutane into gasoline\\, gasoline into naphtha\\, naphtha into fueloil\\, and fueloil into bitumen.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor.\n".. - "Pipes for input materials can be connected on all 4 sides of the doser. The materials for the reactor are discharged upwards.\n".. - "\n".. - "The recipe can be set and the reactor started via the doser.\n".. - "\n".. - "As with other machines:\n".. - "\n".. - " - if the doser is in standby mode\\, one or more ingredients are missing\n".. - " - if the doser is in the blocked state\\, the output tank or silo is full\\, defective or incorrectly connected\n".. - "\n".. - "The doser does not need any electricity. A recipe is processed every 10 s.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. The reactor has a inventory for the catalyst items (for cracking and hydrogenation recipes).\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Must be placed on the reactor. If this does not work\\, remove the pipe at the position above and place it again.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Here is also the power connection for the reactor. The reactor requires 8 ku of electricity.\n".. - "\n".. - "The stand has two pipe connections\\, to the right for the starting product and down for the waste\\, such as red mud in aluminum production.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Is required for the drainage of the waste product.\n".. - "\n".. - "\n".. - "\n", - "Part of the chemical reactor. Is required to store substances in powder or granule form.\n".. - "\n".. - "\n".. - "\n", - "The ICTA controller (ICTA stands for \"If Condition Then Action\") is used to monitor and control machines. The controller can be used to read in data from machines and other blocks and\\, depending on this\\, switch other machines and blocks on / off.\n".. - "\n".. - "Machine data is read in and blocks and machines are controlled using commands. Chapter TA3 -> Logic / switching blocks is important for understanding how commands work.\n".. - "\n".. - "The controller requires a battery to operate. The display is used to output data\\, the signal tower to display errors.\n".. - "\n".. - "\n".. - "\n", - "The controller works on the basis of 'IF THEN ' rules. Up to 8 rules can be created per controller.\n".. - "\n".. - "Examples of rules are:\n".. - "\n".. - " - If a distributor is 'blocked'\\, the pusher in front of it should be switched off\n".. - " - If a machine shows an error\\, this should be shown on the display\n".. - "\n".. - "The controller checks these rules cyclically. To do this\\, a cycle time in seconds (`` Cycle / s '') must be specified for each rule (1..1000).\n".. - "\n".. - "For rules that evaluate an on / off input\\, e.g. from a switch or detector\\, cycle time 0 must be specified. The value 0 means that this rule should always be carried out when the input signal has changed\\, e.g. the button has sent a new value.\n".. - "\n".. - "All rules should only be executed as often as necessary. This has two advantages:\n".. - "\n".. - " - the battery of the controller lasts longer (each controller needs a battery)\n".. - " - the load for the server is lower (therefore fewer lags)\n".. - "\n".. - "You have to set a delay time ('after/s') for each action. If the action is to be carried out immediately\\, 0 must be entered.\n".. - "\n".. - "The controller has its own help and information on all commands via the controller menu.\n".. - "\n".. - "\n".. - "\n", - "The battery must be placed in close proximity to the controller\\, i.e. in one of the 26 positions around the controller.\n".. - "\n".. - "\n".. - "\n", - "The display shows its number after placement. The display can be addressed via this number. Texts can be output on the display\\, whereby the display can display 5 lines and thus 5 different texts.\n".. - "\n".. - "Lines of text are always left-aligned. If the text is to be centered horizontally\\, the text must be preceded by the character \"t\" (tabulator).\n".. - "\n".. - "The display is updated at most once per second.\n".. - "\n".. - "\n".. - "\n", - "The TA4 Display XL is twice the size of the TA4 display.\n".. - "\n".. - "Lines of text are always left-aligned. If the text is to be centered horizontally\\, the text must be preceded by the character \"t\" (tabulator).\n".. - "\n".. - "The display is updated every two seconds at most.\n".. - "\n".. - "\n".. - "\n", - "The signal tower can display red\\, green and orange. A combination of the 3 colors is not possible.\n".. - "\n".. - "\n".. - "\n", - "As the name suggests\\, the Lua controller must be programmed in the Lua programming language. The manual in English is here available:\n".. - "\n".. - "https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md\n".. - "\n".. - "The Lua controller also requires a battery. The battery must be placed in close proximity to the controller\\, i.e. in one of the 26 positions around the controller.\n".. - "\n".. - "\n".. - "\n", - "The server is used for the central storage of data from several Lua controllers. It also saves the data after a server restart.\n".. - "\n".. - "\n".. - "\n", - "The TA4 sensor box is used to set up automatic warehouses or vending machines in conjunction with the Lua controller.\n".. - "If something is put into the box or removed\\, or one of the \"F1\" / \"F2\" keys is pressed\\, an event signal is sent to the Lua controller.\n".. - "The sensor box supports the following commands:\n".. - "\n".. - " - The status of the box can be queried via 'state = $send_cmnd(\\, \"state\")'. Possible answers are: \"empty\"\\, \"loaded\"\\, \"full\"\n".. - " - The last player action can be queried via 'name\\, action = $send_cmnd(\\, \"action\")'. 'name' is the player name. One of the following is returned as 'action': \"put\"\\, \"take\"\\, \"f1\"\\, \"f2\".\n".. - " - The contents of the box can be read out via 'stacks = $send_cmnd(\\, \"stacks\")'. See: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest\n".. - " - Via '$send_cmnd(\\, \"text\"\\, \"press both buttons andnput something into the chest\")' the text can be set in the menu of the sensor box.\n".. - "\n".. - "The checkbox \"Allow public chest access\" can be used to set whether the box can be used by everyone or only by players who have access/protection rights here.\n".. - "\n".. - "\n".. - "\n", - "The terminal is used for input / output for the Lua controller.\n".. - "\n".. - "\n".. - "\n", - "", - "Only the appearance of the TA4 button/switch has changed. The functionality is the same as with the TA3 button/switch. With the wrench menu\\, however\\, the data can be changed later.\n".. - "\n".. - "\n".. - "\n", - "This block has two buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition\\, the command that is to be sent can be configured for each button. \n".. - "\n".. - "\n".. - "\n", - "This block has four buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition\\, the command that is to be sent can be configured for each button. \n".. - "\n".. - "\n".. - "\n", - "This block has two lamps that can be controlled individually. Each lamp can display the colors \"red\"\\, \"green\" and \"amber\". The labeling for both lamps can be configured via the wrench menu. The lamps can be controlled using the following commands:\n".. - "\n".. - " - Switch lamp 1 to red: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Switch lamp 2 to green: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. - " - Switch lamp 1 to orange: '$send_cmnd(1234\\, \"amber\"\\, 1)'\n".. - " - Switch lamp 2 off: '$send_cmnd(1234\\, \"off\"\\, 2)'\n".. - "\n".. - "\n".. - "\n", - "This block has four lamps that can be controlled individually. Each lamp can display the colors \"red\"\\, \"green\" and \"amber\". The labeling for all lamps can be configured via the wrench menu. The lamps can be controlled using the following commands:\n".. - "\n".. - " - Switch lamp 1 to red: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Switch lamp 2 to green: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. - " - Switch lamp 3 to orange: '$send_cmnd(1234\\, \"amber\"\\, 3)'\n".. - " - Switch lamp 4 off: '$send_cmnd(1234\\, \"off\"\\, 4)'\n".. - "\n".. - "\n".. - "\n", - "Only the appearance of the TA4 player detector has changed. The functionality is the same as with the TA3 player detector.\n".. - "\n".. - "\n".. - "\n", - "\n".. - "\n".. - "The status collector queries all configured machines in turn for the status. If one of the machines has reached or exceeded a preconfigured status\\, an \"on\" command is sent. For example\\, many machines can be easily monitored for faults from a Lua controller.\n".. - "\n", - "The functionality is the same as for the TA3 detector. In addition\\, the detector counts the items passed on.\n".. - "This counter can be queried with the 'count' command and reset with 'reset'.\n".. - "\n".. - "\n".. - "\n", - "The functionality is the same as with the TA3 Node Detector.\n".. - "\n".. - "In contrast to the TA3 node detector\\, the positions to be monitored can be configured individually here. To do this\\, the \"Record\" button must be pressed. Then all blocks must be clicked\\, the position of which is to be checked. Then the \"Done\" button must be pressed.\n".. - "\n".. - "Up to 4 blocks can be selected.\n".. - "\n".. - "\n".. - "\n", - "The charge detector measures the state of charge of the power grid's energy storage every 8 s.\n".. - "\n".. - "If the value falls below a configurable threshold (switching point)\\, a command (default: \"off\") is sent. If the value rises above this switching point again\\, a second command (default: \"on\") is sent. This allows consumers to be disconnected from the grid when the charge level of the energy storage device falls below the specified switching point.\n".. - "\n".. - "To do this\\, the charge detector must be connected to the grid via a junction box. The charge detector is configured via the open-end wrench menu.\n".. - "\n".. - "\n".. - "\n", - "The TA4 gaze sensor generates a command when the block is viewed/focused by the owner or other configured players and sends a second command when the block is no longer focused. It thus serves as a replacement for buttons/switches\\, for example to open/close doors.\n".. - "\n".. - "The TA4 Gaze Sensor can only be programmed using the open-end wrench menu. If you have an open-end wrench in your hand\\, the sensor does not trigger\\, even if it is focused.\n".. - "\n".. - "\n".. - "\n", - "Entire processes can be programmed using the TA4 sequencer. Here's an example:\n".. - "\n".. - " -- this is a comment\n".. - " \\[1\\] send 1234 a2b\n".. - " \\[30\\] send 1234 b2a\n".. - " \\[60\\] goto 1\n".. - "\n".. - " - Each line begins with a number which corresponds to a point in time '\\[\\]'\n".. - " - Values from 1 to 50000 are permitted for times\n".. - " - 1 corresponds to 100 ms\\, 50000 corresponds to about 4 game days\n".. - " - Empty lines or comments are allowed ('-- comment')\n".. - " - With 'send ' you can send a command to a block\n".. - " - With 'goto ' you can jump to another line / point in time\n".. - " - With 'stop' you can stop the sequencer with a delay so that it does not receive a new command\naccepts from a button or other block (to complete a movement)\nWithout 'stop'\\, the sequencer goes into stopped mode immediately after the last command.\n".. - "\n".. - "The TA4 sequencer supports the following techage commands:\n".. - "\n".. - " - 'goto ' Jump to a command line and start the sequencer\n".. - " - 'stop' Stop the sequencer\n".. - " - 'on' and 'off' as aliases for 'goto 1' resp. 'stop'\n".. - "\n".. - "The 'goto' command is only accepted when the sequencer is stopped.\n".. - "\n".. - "The cycle time (default: 100 ms) can be changed for the sequencer via the open-end wrench menu.\n".. - "\n".. - "\n".. - "\n", - "", - "The TA4 Move Controller is similar to \"Door Controller 2\"\\, but the selected blocks are not removed\\, but can be moved.\n".. - "Since the moving blocks can take players and mobs standing on the block with them\\, elevators and similar transport systems can be built with them.\n".. - "\n".. - "Instructions:\n".. - "\n".. - " - Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained)\n".. - " - the \"flight route\" must be entered via an x\\, y\\, z specification (relative) (the maximum distance (x+y+z) is 200 m)\n".. - " - The movement can be tested with the menu buttons \"Move A-B\" and \"Move B-A\"\n".. - " - you can also fly through walls or other blocks\n".. - " - The target position for the blocks can also be occupied. In this case\\, the blocks are saved \"invisibly\". This is intended for sliding doors and the like\n".. - "\n".. - "The Move Controller supports the following techage commands:\n".. - "\n".. - " - 'a2b' Move block from A to B.\n".. - " - 'b2a' Move block from B to A.\n".. - " - 'move' Move block to the other side\n".. - "\n".. - "You can switch to the 'move xyz' operating mode via the wrench menu. After switching\\, the following techage commands are supported: \n".. - "\n".. - " - 'move2' With the command\\, the flight route must also be specified as an x\\,y\\,z vector.\nExample Lua Controller: '$send_cmnd(MOVE_CTLR\\, \"move2\"\\, \"0\\,12\\,0\")'\n".. - " - 'reset' move block(s) back to start position\n".. - "\n".. - "*Important instructions:*\n".. - "\n".. - " - If several blocks are to be moved\\, the block that is to take the players/mobs must be clicked first when training.\n".. - " - If the block that is supposed to take the players/mobs has a reduced height\\, the height must be set in the controller using the open-ended wrench menu (e.g. height = 0.5). Otherwise the player/mob will not be \"found\" and will not be taken away.\n".. - "\n".. - "\n".. - "\n", - "The TA4 turn controller is similar to the \"Move Controller\"\\, but the selected blocks are not moved\\, but rotated around their center to the right or left.\n".. - "\n".. - "Instructions:\n".. - "\n".. - " - Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained)\n".. - " - The movement can be tested with the menu buttons \"Turn left\" and \"Turn right\"\n".. - "\n".. - "The turn controller supports the following techage commands:\n".. - "\n".. - " - 'left' Turn left\n".. - " - 'right' Turn right\n".. - " - 'uturn' Turn 180 degrees\n".. - "\n".. - "\n".. - "\n", - "TA4 contains a series of powerful lamps that enable better illumination or take on special tasks.\n".. - "\n", - "The TA4 LED grow light enables fast and vigorous growth of all plants from the 'farming' mod. The lamp illuminates a 3x3 field\\, so that plants can also be grown underground.\n".. - "The lamp must be placed one block above the ground in the middle of the 3x3 field.\n".. - "\n".. - "The lamp can also be used to grow flowers. If the lamp is placed over a 3x3 flower bed made of \"Garden Soil\" (Mod 'compost')\\, the flowers grow there automatically (above and below ground).\n".. - "\n".. - "You can harvest the flowers with the Signs Bot\\, which also has a corresponding sign that must be placed in front of the flower field.\n".. - "\n".. - "The lamp requires 1 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The TA4 LED street lamp is a lamp with particularly strong illumination. The lamp consists of the lamp housing\\, lamp arm and lamp pole blocks.\n".. - "\n".. - "The current must be led from below through the mast up to the lamp housing. First pull the power line up and then \"plaster\" the power cable with lamp pole blocks.\n".. - "\n".. - "The lamp requires 1 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The TA4 LED industrial lamp is a lamp with particularly strong illumination. The lamp must be powered from above.\n".. - "\n".. - "The lamp requires 1 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The liquid filter filters red mud.\n".. - "A part of the red mud becomes lye\\, which can be collected at the bottom in a tank.\n".. - "The other part becomes desert cobblestone and clutters the filter material.\n".. - "If the filter is too clogged\\, it has to be cleaned and re-filled.\n".. - "The filter consists of a base layer\\, 7 identical filter layers and a filling layer at the top.\n".. - "\n".. - "\n".. - "\n", - "You can see the structure of this layer in the plan.\n".. - "\n".. - "The lye is collected in the tank.\n".. - "\n".. - "\n".. - "\n", - "This layer has to be filled with gravel as shown in the plan.\n".. - "In total\\, there must be seven layers of gravel.\n".. - "The filter will become cluttered over time\\, so that it has to be cleaned and re-filled.\n".. - "\n".. - "\n".. - "\n", - "This layer is used to fill the filter with red mud.\n".. - "The red mud must be pumped into the filler pipe.\n".. - "\n".. - "\n".. - "\n", - "The Collider is a research facility that conducts basic research. Experience points can be collected here\\, which are required for TA5 (Future Age).\n".. - "\n".. - "Like its original at CERN in Geneva\\, the collider must be built underground. The standard setting here is Y <= -28. The value can\\, however\\, be changed by the server personnel via configuration. Please ask or try the \"TA4 Collider Detector Worker\" block.\n".. - "\n".. - "Only one collider can be operated per player. So it makes no sense to set up two or more colliders. Experience points are credited to the player who owns the collider. The experience points cannot be transferred.\n".. - "\n".. - "A collider consists of a \"ring\" made of tubes and magnets as well as a detector with a cooling system.\n".. - "\n".. - " - The detector is the heart of the system. This is where the scientific experiments take place. The detector is 3x3x7 blocks in size.\n".. - " - 22 TA4 Collider Magnets (not the TA4 Collider Detector Magnets!) must be connected to each other via 5 blocks of the TA4 vacuum tube. Each magnet also requires electricity and a gas connection for cooling. The whole thing forms (as shown in the plan on the right) a square with an edge length of 37 meters.\n".. - "\n".. - "The plan shows the facility from above:\n".. - "\n".. - " - the gray block is the detector with the worker block in the middle\n".. - " - the red blocks are the magnets\\, the blue the vacuum tubes\n".. - "\n".. - "\n".. - "\n", - "The detector is set up automatically with the help of the \"TA4 Collider Detector Worker\" block (similar to the derrick). All of the materials required for this must first be placed in the worker block. The detector is shown symbolically on the worker block. The detector is set up across the worker block.\n".. - "\n".. - "The detector can also be dismantled again with the help of the worker block.\n".. - "\n".. - "The connections for electricity\\, gas and vacuum tubes are located on the two front sides of the detector. A TA4 pump must be connected at the top in order to suck the tube empty / to create the vacuum.\n".. - "\n".. - "The cooling system must be connected to the rear of the detector. The cooling system is shown in the plan on the right. In addition to the TA4 heat exchanger of the energy storage unit (which is used here for cooling)\\, a TA4 cooler block is also required.\n".. - "\n".. - "Note: The arrow on the heat exchanger must point away from the detector. The heat exchanger must also be supplied with electricity.\n".. - "\n".. - "\n".. - "\n".. - " - In addition\\, cooling is required\\, which must also be installed at the detector. Isobutane is required for cooling.\n".. - " - The system requires quite a bit of electricity. Therefore\\, it makes sense to have your own power supply.\n".. - "\n", - "The collider is controlled via a TA4 terminal (not via the TA4 Lua controller terminal).\n".. - "\n".. - "This terminal must be connected to the detector. The number of the detector is displayed as info text on the worker block.\n".. - "\n".. - "The terminal supports the following commands:\n".. - "\n".. - " - 'connect ' (connect to the detector)\n".. - " - 'start' (starting the detector)\n".. - " - 'stop' (stop the detector)\n".. - " - 'test ' (checking a magnet)\n".. - " - 'points' (query of the experience points already achieved)\n".. - "\n".. - "If an error occurs on a magnet during the 'start'\\, the number of the magnet is output. The 'test' command can be used to request further information on the magnet error.\n".. - "\n".. - "\n".. - "\n", - "Each TA4 Collider magnet must also be supplied with electricity (as shown on the right in the plan) and with Isobutane for cooling:\n".. - "\n".. - " - The connection for the power is on the top of the magnet.\n".. - " - The connection for the cooling is on the front of the magnet.\n".. - " - A TA4 pump and a TA4 tank with at least 250 units of isobutane are also required to cool the entire system.\n".. - " - The system also requires a lot of electricity. It therefore makes sense to have your own power supply with at least 145 ku.\n".. - "\n".. - "\n".. - "\n", - "The following sequence is recommended when setting up the collider:\n".. - "\n".. - " - Put a forceload block. Only the detector with the cooling system has to be in the area of ​​the forceload block.\n".. - " - Set the worker block\\, fill it with items and set up the detector via the menu\n".. - " - Build the ring with tubes and magnets\n".. - " - Connect all magnets and the detector with power cables\n".. - " - Connect all magnets and the detector with the yellow tubes and pump the isobutane into the tube system with a pump\n".. - " - Install a TA4 pump as a vacuum pump on the detector and switch it on (no additional tank is required). If the pump goes into \"standby\"\\, the vacuum is established. This will take a few seconds\n".. - " - assemble the cooler (heat exchanger) and connect it to the power cable\n".. - " - Place the TA4 terminal in front of the detector and connect it to the detector via 'connect '\n".. - " - Switch on / connect the power supply\n".. - " - switch on the cooler (heat exchanger)\n".. - " - Switch on the detector via 'start' on the TA4 terminal. After a few test steps\\, the detector goes into normal operation or outputs an error.\n".. - " - The collider has to run continuously and then gradually delivers experience points. For 10 points\\, the collider has to run for a few hours\n".. - "\n".. - "\n".. - "\n", - "", - "Up to 10 recipes can be saved in the recipe block. These recipes can then be called up via a TA4 Autocrafter command. This enables the autocrafter's recipe to be configured using a command. The recipes in the recipe block can also be queried directly using a command.\n".. - "\n".. - "'input ' reads a recipe from the TA4 recipe block. '' is the number of the recipe. The block returns a list of recipe ingredients.\n".. - "\n".. - "Example: '$send_cmnd(1234\\, \"input\"\\, 1)'\n".. - "\n".. - " \n".. - "\n", - "The function corresponds to that of TA3.\n".. - "\n".. - "The processing power is 4 items every 4 s. The autocrafter requires 9 ku of electricity for this.\n".. - "\n".. - "In addition\\, the TA4 Autocrafter supports the selection of different recipes using the following commands:\n".. - "\n".. - "'recipe \".\"' switches the autocrafter to a recipe from the TA4 Recipe Block. '' is the number of the recipe block\\, '' the recipe number. Example: '$send_cmnd(1234\\, \"recipe\"\\, \"5467.1\")'\n".. - "\n".. - "Alternatively\\, a recipe can also be selected via the list of ingredients\\, such as:\n".. - "'$send_cmnd(1234\\, \"recipe\"\\, \"default:coal_lump\\,\\,\\,default:stick\")'\n".. - "All technical names of a recipe must be specified here\\, separated by commas. See also the command 'input' in the TA4 recipe block.\n".. - "\n".. - "The 'flush' command moves all items from the input inventory to the output inventory. The command returns 'true' if the input inventory was completely emptied. If 'false' was returned (output inventory full)\\, the command must be repeated at a later time.\n".. - "\n".. - " \n".. - "\n", - "See TA3 tank.\n".. - "\n".. - "A TA4 tank can hold 2000 units or 200 barrels of liquid.\n".. - "\n".. - "\n".. - "\n", - "See TA3 pump.\n".. - "\n".. - "The TA4 pump pumps 8 units of liquid every two seconds. \n".. - "\n".. - "In the \"Flow limiter\" mode\\, the number of units pumped by the pump can be limited. The flow limiter mode can be activated via the open-end wrench menu by configuring the number of units in the menu. Once the configured number of units have been pumped\\, the pump will turn off. When the pump is turned on again\\, it will pump the configured number of units again and then turn off.\n".. - "\n".. - "The flow limiter can also be configured and started using a Lua or Beduino controller.\n".. - "\n".. - "The pump also supports the 'flowrate' command. This allows the total flow rate through the pump to be queried.\n".. - "\n".. - "\n".. - "\n", - "With TA4\\, the industrial furnace also has its electrical heating. The oil burner and the blower can be replaced with the heater.\n".. - "\n".. - "The heater requires 14 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "This block can no longer be crafted and will be replaced by the TA4 water inlet block. \n".. - "\n", - "Some recipes require water. The water must be pumped from the sea with a pump (water at y = 1). A \"pool\" made up of a few water blocks is not sufficient for this! \n".. - "\n".. - "To do this\\, the water inlet block must be placed in the water and connected to the pump via pipes. If the block is placed in the water\\, it must be ensured that there is water under the block (water must be at least 2 blocks deep). \n".. - "\n".. - "\n".. - "\n", - "TA4 also has its own tubes in the TA4 design. These can be used like standard tubes.\n".. - "But: TA4 pushers and TA4 distributors only achieve their full performance when used with TA4 tubes.\n".. - "\n".. - "\n".. - "\n", - "The function basically corresponds to that of TA2 / TA3. In addition\\, a menu can be used to configure which objects should be taken from a TA4 chest and transported further.\n".. - "The processing power is 12 items every 2 s\\, if TA4 tubes are used on both sides. Otherwise there are only 6 items every 2 s.\n".. - "\n".. - "In the \"flow limiter\" mode\\, the number of items that are moved by the pusher can be limited. The flow limiter mode can be activated via the open-end wrench menu by configuring the number of items in the menu. As soon as the configured number of items have been moved\\, the pusher switches off. If the pusher is switched on again\\, it moves the configured number of items again and then switches off.\n".. - "\n".. - "The TA4 pusher can also be configured and started using a Lua or Beduino controller.\n".. - "\n".. - "Here are the additional commands for the Lua controller:\n".. - "\n".. - " - 'config' is used to configure the pusher\\, analogous to manual configuration via the menu.\n Example: '$send_cmnd(1234\\, \"config\"\\, \"default:dirt\")'\n With '$send_cmnd(1234\\, \"config\"\\, \"\")' the configuration is deleted\n".. - " - 'limit' is used to set the number of items for the flow limiter mode:\n Example: '$send_cmnd(1234\\, \"init\"\\, 7)'\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA3. The chest can hold more content.\n".. - "\n".. - "In addition\\, the TA4 chest has a shadow inventory for configuration. Here certain stack locations can be pre-assigned with an item. Pre-assigned inventory stacks are only filled with these items when filling. A TA4 pusher or TA4 injector with the appropriate configuration is required to empty a pre-assigned inventory stacks.\n".. - "\n".. - "\n".. - "\n", - "The TA4 8x2000 chest does not have a normal inventory like other chest\\, but has 8 stores\\, whereby each store can hold up to 2000 items of one sort. The orange buttons can be used to move items to or from the store. The box can also be filled or emptied with a pusher (TA2\\, TA3 or TA4) as usual.\n".. - "\n".. - "If the chest is filled with a pusher\\, all stores fill from left to right. If all 8 stores are full and no further items can be added\\, further items are rejected.\n".. - "\n".. - "*Row function*\n".. - "\n".. - "Several TA4 8x2000 chests can be connected to a large chest with more content. To do this\\, the chests must be placed in a row one after the other.\n".. - "\n".. - "First the front chest must be placed\\, then the stacking chests are placed behind with the same direction of view (all boxes have the front towards the player). With 2 chests in a row\\, the size increases to 8x4000\\, etc.\n".. - "\n".. - "The rows of chests can no longer be removed. There are two ways to dismantle the chests:\n".. - "\n".. - " - Empty and remove the front chest. This unlocks the next chest and can be removed.\n".. - " - Empty the front chest so far that all stores contain a maximum of 2000 items. This unlocks the next chest and can be removed.\n".. - "\n".. - "The chests have an \"order\" checkbox. If this checkbox is activated\\, the stores are no longer completely emptied by a pusher. The last item remains in the store as a default. This results in a fixed assignment of items to storage locations.\n".. - "\n".. - "The chest can only be used by players who can build at this location\\, i.e. who have protection rights. It does not matter who sets the chest.\n".. - "\n".. - "The chest has an additional command for the Lua controller:\n".. - "\n".. - " - 'count' is used to request how many items are in the chest.\nExample 1: '$send_cmnd(CHEST\\, \"count\")' -> Sum of items across all 8 stores\nExample 2: '$send_cmnd(CHEST\\, \"count\"\\, 2)' -> number of items in store 2 (second from left)\n".. - " - 'storesize' is used to read the size of one of the eight stores:\nExample: '$send_cmnd(CHEST\\, \"storesize\")' -> function returns e.g. 6000\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 24 items every 4 s\\, provided TA4 tubes are used on all sides. Otherwise there are only 12 items every 4 s.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of the normal TA4 distributor\\, with two differences:\n".. - "The processing power is 36 items every 4 s\\, provided TA4 tubes are used on all sides. Otherwise there are only 18 items every 4 s.\n".. - "Furthermore\\, up to 8 items can be configured per direction.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 4 items every 4 s. The block requires 5 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2.\n".. - "The processing power is 4 items every 4 s. The block requires 9 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function largely corresponds to that of TA2.\n".. - "\n".. - "In addition\\, the hole size can be set between 3x3 and 11x11 blocks.\n".. - "The maximum depth is 80 meters. The quarry requires 14 ku of electricity.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA2\\, only different chips are produced here.\n".. - "The processing power is one chip every 6 s. The block requires 12 ku of electricity for this.\n".. - "\n".. - "\n".. - "\n", - "The function corresponds to that of TA3.\n".. - "\n".. - "The processing power is up to 8 times four items every 4 seconds.\n".. - "\n".. - "\n".. - "\n", - "The recycler is a machine that processes all Techage recipes backwards\\, i.e. it can dismantle machines and blocks back into their components. \n".. - "\n".. - "The machine can disassemble pretty much any Techage and Hyperloop blocks. But not all recipe items/materials can be recycled:\n".. - "\n".. - " - Wood turns into sticks\n".. - " - Stone turns into sand or gravel\n".. - " - Semiconductors / chips cannot be recycled\n".. - " - Tools cannot be recycled\n".. - "\n".. - "The processing power is one item every 8 s. The block requires 16 ku of electricity for this.\n".. - "\n".. - " \n".. - "\n", - }, - images = { - "techage_ta4", - "", - "ta4_windturbine", - "ta4_nacelle", - "ta4_blinklamp", - "ta4_pillar", - "", - "ta4_solarmodule", - "ta4_solarcarrier", - "ta4_solar_inverter", - "ta4_powercable", - "ta4_powerbox", - "ta4_minicell", - "", - "ta4_heatexchanger", - "ta4_turbine", - "ta4_generator", - "ta4_pipeinlet", - "ta4_pipe", - "ta4_transformer", - "ta4_transformer", - "ta4_electricmeter", - "ta4_laser", - "ta4_hydrogen", - "ta4_electrolyzer", - "ta4_fuelcell", - "", - "ta4_doser", - "ta4_reactor", - "ta4_fillerpipe", - "ta4_reactorstand", - "ta4_reactorbase", - "ta4_silo", - "ta4_icta_controller", - "ta4_icta_controller", - "ta4_battery", - "ta4_display", - "ta4_displayXL", - "ta4_signaltower", - "ta4_lua_controller", - "ta4_lua_server", - "ta4_sensor_chest", - "ta4_terminal", - "", - "ta4_button", - "ta4_button_2x", - "ta4_button_4x", - "ta4_signallamp_2x", - "ta4_signallamp_4x", - "ta4_playerdetector", - "ta4_collector", - "ta4_detector", - "ta4_nodedetector", - "ta4_chargedetector", - "ta4_gaze_sensor", - "ta4_sequencer", - "", - "ta4_movecontroller", - "ta4_turncontroller", - "", - "ta4_growlight", - "ta4_streetlamp", - "ta4_industriallamp", - "ta4_liquid_filter", - "", - "", - "", - "", - "", - "ta4_terminal", - "", - "techage_ta4c", - "", - "ta4_recipeblock", - "ta4_autocrafter", - "ta4_tank", - "ta4_pump", - "ta4_furnaceheater", - "", - "ta4_waterinlet", - "ta4_tube", - "ta4_pusher", - "ta4_chest", - "ta4_8x2000_chest", - "ta4_distributor", - "ta4_high_performance_distributor", - "ta4_gravelsieve", - "ta4_grinder", - "ta4_quarry", - "ta4_electronicfab", - "ta4_injector", - "ta4_recycler", - }, - plans = { - "", - "ta4_windturbine", - "", - "", - "", - "", - "ta4_solarplant", - "", - "", - "", - "", - "", - "", - "ta4_storagesystem", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_reactor", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_liquid_filter_base", - "ta4_liquid_filter_gravel", - "ta4_liquid_filter_top", - "techage_collider_plan", - "ta4_cooler", - "", - "techage_collider_plan2", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta4_pt-BR.lua b/techage/doc/manual_ta4_pt-BR.lua deleted file mode 100644 index 51ab2fe..0000000 --- a/techage/doc/manual_ta4_pt-BR.lua +++ /dev/null @@ -1,1054 +0,0 @@ -return { - titles = { - "1,TA4: Presente", - "2,Turbina eólica", - "3,Turbina eólica TA4", - "3,Nacelle da turbina eólica TA4", - "3,Lâmpada de sinalização de turbina eólica TA4", - "3,Pilar TA4", - "2,Sistema Solar", - "3,Módulo solar TA4", - "3,Módulo de transporte solar TA4", - "3,Inversor solar TA4", - "3,Cabo de baixa potência TA4", - "3,Caixa de junção de baixa tensão TA4", - "3,Célula solar para lâmpadas de rua TA4", - "2,Armazenamento de energia térmica", - "3,Trocador de calor TA4", - "3,Turbina TA4", - "3,Gerador TA4", - "3,Entrada do tubo TA4", - "3,Tubo TA4", - "2,Distribuição de energia", - "3,Transformador de isolamento TA4", - "3,Medidor elétrico TA4", - "3,Laser TA4", - "2,Hidrogênio", - "3,Eletrolisador", - "3,Célula de combustível", - "2,Reator químico", - "3,Dosador TA4", - "3,Reator TA4", - "3,Tubo de enchimento TA4", - "3,Suporte do reator TA4", - "3,Base do reator TA4", - "3,Silo TA4", - "2,Controlador ICTA", - "3,Controlador TA4 ICTA", - "3,Bateria", - "3,Exibição do TA4", - "3,TA4 Display XL", - "3,Torre de sinalização TA4", - "2,Controlador TA4 Lua", - "3,Servidor TA4 Lua", - "3,Caixa do sensor TA4 / baú", - "3,Terminal do controlador TA4 Lua", - "2,Módulos de lógica/comutação TA4", - "3,Botão/interruptor TA4", - "3,Botão TA4 2x", - "3,Botão TA4 4x", - "3,Lâmpada de sinalização TA4 2x", - "3,Lâmpada de sinalização TA4 4x", - "3,Detector de jogadores TA4", - "3,Coletor de estado TA4", - "3,Detector TA4", - "3,Detector de nó TA4", - "3,Detector de carga de armazenamento de energia TA4", - "3,Sensor de olhar TA4", - "3,Sequenciador TA4", - "2,Controlador de movimento/volta", - "3,Controlador de movimento TA4", - "3,Controlador de giro TA4", - "2,Lâmpadas TA4", - "3,Luz de cultivo LED TA4", - "3,Lâmpada de rua TA4", - "3,Lâmpada industrial de LED TA4", - "2,Filtro líquido TA4", - "3,Camada de base", - "3,Camada de cascalho", - "3,Camada de enchimento", - "2,Colisor TA4 (acelerador de partículas)", - "3,Detector", - "3,Controle / Terminal TA4", - "3,Resfriamento e energia", - "3,Construção", - "2,Mais blocos TA4", - "3,Bloco de receitas TA4", - "3,TA4 Autocrafter", - "3,Tanque TA4", - "3,Bomba TA4", - "3,Aquecedor de forno TA4", - "3,Bomba d'água TA4 (obsoleta)", - "3,Entrada de água TA4", - "3,Tubo TA4", - "3,TA4 Pusher", - "3,Peito TA4", - "3,Baú TA4 8x2000", - "3,Distribuidor TA4", - "3,Distribuidor de alto desempenho TA4", - "3,Peneira de cascalho TA4", - "3,Moedor TA4", - "3,Pedreira TA4", - "3,Fab. eletrônica TA4", - "3,Injetor TA4", - "3,Reciclador TA4", - }, - texts = { - "Fontes de energia renováveis\\, como vento\\, sol e biocombustíveis\\, ajudam você a sair da era do petróleo. Com tecnologias modernas e máquinas inteligentes\\, você parte para o futuro.\n".. - "\n".. - "\n".. - "\n", - "Uma turbina eólica sempre fornece eletricidade quando há vento. Não há vento no jogo\\, mas o mod simula isso girando as turbinas eólicas somente pela manhã (5:00 - 9:00) e à noite (17:00 - 21:00). Uma turbina eólica só fornece eletricidade se estiver instalada em um local adequado.\n".. - "\n".. - "As usinas eólicas da TA são usinas puramente offshore\\, o que significa que elas precisam ser construídas no mar. Isso significa que as turbinas eólicas só podem ser construídas em um bioma marinho (oceano) e que deve haver água suficiente e uma visão clara ao redor do mastro.\n".. - "\n".. - "Para encontrar um local adequado\\, clique na água com a chave inglesa (TechAge Info Tool). Uma mensagem de bate-papo mostrará se essa posição é adequada para o mastro da turbina eólica.\n".. - "\n".. - "A corrente deve ser conduzida do bloco do rotor até o mastro. Primeiro\\, puxe a linha de energia para cima e\\, em seguida\\, \"engesse\" o cabo de energia com blocos de pilar TA4. Uma plataforma de trabalho pode ser construída abaixo. A planta à direita mostra a estrutura na parte superior.\n".. - "\n".. - "A turbina eólica fornece 70 ku\\, mas apenas 8 horas por dia (veja acima).\n".. - "\n".. - "\n".. - "\n", - "O bloco da turbina eólica (rotor) é o coração da turbina eólica. Esse bloco deve ser colocado no topo do mastro. Idealmente\\, em Y = 15\\, então você fica dentro de um bloco de mapa/carga.\n".. - "Quando você inicia a turbina\\, todas as condições para a operação da turbina eólica são verificadas. Se todas as condições forem atendidas\\, as pás do rotor (asas) aparecerão automaticamente. Caso contrário\\, você receberá uma mensagem de erro.\n".. - "\n".. - "\n".. - "\n", - "Esse bloco deve ser colocado na extremidade preta do bloco da turbina eólica.\n".. - "\n".. - "\n".. - "\n", - "Essa luz intermitente serve apenas para fins decorativos e pode ser colocada na parte superior do bloco da turbina eólica.\n".. - "\n".. - "\n".. - "\n", - "Isso constrói o mastro da turbina eólica. No entanto\\, esses blocos não são fixados manualmente\\, mas devem ser fixados com a ajuda de uma espátula(trowel)\\, de modo que a linha de energia para a ponta do mastro seja substituída por esses blocos (consulte Cabo de energia TA).\n".. - "\n".. - "\n".. - "\n", - "O sistema solar só produz eletricidade quando o sol está brilhando. No jogo\\, isso ocorre todo dia de jogo\\, das 6h às 18h.\n".. - "A mesma energia está sempre disponível durante esse período. Após as 18h00\\, os módulos solares se desligam completamente.\n".. - "\n".. - "A temperatura do bioma é decisiva para o desempenho dos módulos solares. Quanto mais quente for a temperatura\\, maior será o rendimento.\n".. - "A temperatura do bioma pode ser determinada com a Techage Info Tool (chave inglesa). Normalmente\\, ela oscila entre 0 e 100:\n".. - "\n".. - " - a potência total está disponível a 100\n".. - " - a 50\\, metade da potência está disponível\n".. - " - em 0\\, não há serviço disponível\n".. - "\n".. - "Portanto\\, é aconselhável procurar estepes e desertos quentes para o sistema solar.\n".. - "As linhas aéreas estão disponíveis para o transporte de eletricidade.\n".. - "No entanto\\, também é possível produzir hidrogênio\\, que pode ser transportado e convertido novamente em eletricidade no destino.\n".. - "\n".. - "A menor unidade em um sistema solar é composta por dois módulos solares e um módulo de transporte. O módulo de transporte deve ser colocado primeiro\\, com os dois módulos solares à esquerda e à direita próximos a ele (não acima!).\n".. - "\n".. - "A planta à direita mostra 3 unidades\\, cada uma com dois módulos solares e um módulo de suporte\\, conectadas ao inversor por meio de cabos vermelhos.\n".. - "\n".. - "Os módulos solares fornecem tensão CC\\, que não pode ser alimentada diretamente na rede elétrica. Portanto\\, as unidades solares devem primeiro ser conectadas ao inversor por meio do cabo vermelho. Ele consiste em dois blocos\\, um para o cabo vermelho dos módulos solares (CC) e outro para o cabo de alimentação cinza da rede elétrica (CA).\n".. - "\n".. - "A área do mapa onde o sistema solar está localizado deve estar totalmente carregada. Isso também se aplica à posição direta acima do módulo solar\\, pois a intensidade da luz é medida regularmente nesse local. Portanto\\, é aconselhável definir primeiro um bloco de carga e depois colocar os módulos dentro dessa área.\n".. - "\n".. - "\n".. - "\n", - "O módulo solar deve ser colocado no módulo de suporte. São sempre necessários dois módulos solares.\n".. - "Em um par\\, os módulos solares têm desempenho de até 3 ku\\, dependendo da temperatura.\n".. - "Com os módulos solares\\, deve-se tomar cuidado para que eles tenham plena luz do dia e não sejam sombreados por blocos ou árvores. Isso pode ser testado com a Info Tool (wrench ou chave inglesa).\n".. - "\n".. - "\n".. - "\n", - "O módulo de suporte está disponível em duas alturas (1m e 2m). Ambos são funcionalmente idênticos.\n".. - "Os módulos portadores podem ser colocados diretamente um ao lado do outro e\\, assim\\, conectados para formar uma fileira de módulos. A conexão com o inversor ou com outras séries de módulos deve ser feita com os cabos vermelhos de baixa tensão ou com as caixas de junção de baixa tensão.\n".. - "\n".. - "\n".. - "\n", - "O inversor converte a energia solar (CC) em corrente alternada (CA) para que ela possa ser alimentada na rede elétrica.\n".. - "Um inversor pode alimentar um máximo de 100 ku de eletricidade\\, o que corresponde a 33 módulos solares ou mais.\n".. - "\n".. - "\n".. - "\n", - "O cabo de baixa tensão é usado para conectar fileiras de módulos solares ao inversor. O cabo não deve ser usado para outros fins.\n".. - "\n".. - "O comprimento máximo do cabo é de 200 m.\n".. - "\n".. - "\n".. - "\n", - "A caixa de junção deve ser colocada no chão. Ela tem apenas 4 conexões (nas 4 direções).\n".. - "\n".. - "\n".. - "\n", - "Como o nome sugere\\, a célula solar para lâmpadas de rua é usada para alimentar uma lâmpada de rua. Uma célula solar pode alimentar duas lâmpadas (1 ku). A célula solar armazena a energia do sol durante o dia e fornece a eletricidade para a lâmpada à noite. Isso significa que a lâmpada só brilha no escuro.\n".. - "\n".. - "Essa célula solar não pode ser combinada com os outros módulos solares.\n".. - "\n".. - "\n".. - "\n", - "O armazenamento de energia térmica substitui o bloco de baterias do TA3.\n".. - "\n".. - "O armazenamento de energia térmica consiste em uma concha de concreto (blocos de concreto) preenchida com cascalho. São possíveis cinco tamanhos de armazenamento:\n".. - "\n".. - " - Cobertura com blocos de concreto 5x5x5\\, preenchida com 27 cascalhos\\, capacidade de armazenamento: 22\\,5 kud\n".. - " - Cobertura com blocos de concreto 7x7x7\\, preenchidos com cascalho 125\\, capacidade de armazenamento: 104 kud\n".. - " - Cobertura com blocos de concreto 9x9x9\\, preenchida com 343 cascalhos\\, capacidade de armazenamento: 286 kud\n".. - " - Cobertura com blocos de concreto 11x11x11\\, preenchida com 729 cascalhos\\, capacidade de armazenamento: 610 kud\n".. - " - Cobertura com blocos de concreto 13x13x13\\, preenchidos com cascalho 1331\\, capacidade de armazenamento: 1112 kud\n".. - "\n".. - "Uma janela feita de um bloco de vidro de obsidiana pode ser colocada na estrutura de concreto. Ela deve ser colocada bem no meio da parede. Por essa janela\\, é possível ver se o armazenamento está carregado em mais de 80%. Na planta à direita\\, você pode ver a estrutura do trocador de calor TA4\\, que consiste em 3 blocos\\, a turbina TA4 e o gerador TA4. Preste atenção ao alinhamento do trocador de calor (a seta no bloco 1 deve apontar para a turbina).\n".. - "\n".. - "Ao contrário da planta à direita\\, as conexões no bloco de armazenamento devem estar no mesmo nível (dispostas horizontalmente\\, ou seja\\, não abaixo e acima). As entradas de tubulação (TA4 Pipe Inlet) devem estar exatamente no meio da parede e de frente uma para a outra. Os tubos TA4 amarelos são usados como tubos de vapor. Os tubos de vapor TA3 não podem ser usados aqui.\n".. - "Tanto o gerador quanto o trocador de calor têm uma conexão de energia e devem ser conectados à rede elétrica.\n".. - "\n".. - "Em princípio\\, o sistema de armazenamento de calor funciona exatamente da mesma forma que as baterias\\, só que com muito mais capacidade de armazenamento.\n".. - "\n".. - "Para que o sistema de armazenamento de calor funcione\\, todos os blocos (também a casca de concreto e o cascalho) devem ser carregados usando um bloco forceload.\n".. - "\n".. - "\n".. - "\n", - "O trocador de calor consiste em três partes que devem ser colocadas umas sobre as outras\\, com a seta do primeiro bloco apontando para a turbina. Os tubos devem ser construídos com os tubos TA4 amarelos.\n".. - "O trocador de calor deve ser conectado à rede elétrica. O dispositivo de armazenamento de energia é recarregado por meio do trocador de calor\\, desde que haja eletricidade suficiente disponível. \n".. - "\n".. - "\n".. - "\n", - "A turbina faz parte do armazenamento de energia. Ela deve ser colocada ao lado do gerador e conectada ao trocador de calor por meio de tubos TA4\\, conforme mostrado na planta.\n".. - "\n".. - "\n".. - "\n", - "O gerador é usado para gerar eletricidade. Portanto\\, o gerador também deve ser conectado à rede elétrica.\n".. - "O gerador faz parte do armazenamento de energia. Ele é usado para gerar eletricidade e\\, assim\\, liberar a energia da unidade de armazenamento de energia. Portanto\\, o gerador também deve ser conectado à rede elétrica.\n".. - "\n".. - "Importante: Tanto o trocador de calor quanto o gerador devem estar conectados à mesma rede elétrica! \n".. - "\n".. - "\n".. - "\n", - "Um bloco de entrada de tubo deve ser instalado em cada um dos dois lados do bloco de armazenamento. Os blocos devem estar exatamente de frente um para o outro.\n".. - "\n".. - "Os blocos de entrada de tubo *não* podem ser usados como aberturas normais de parede\\; em vez disso\\, use os blocos de entrada de tubo TA3 na parede.\n".. - "\n".. - "\n".. - "\n", - "Com o TA4\\, os tubos amarelos são usados para a transmissão de gás e líquidos.\n".. - "O comprimento máximo do cabo é de 100 m.\n".. - "\n".. - "\n".. - "\n", - "Com a ajuda de cabos de energia e caixas de junção\\, é possível configurar redes de energia de até 1.000 blocos/nós. Entretanto\\, deve-se observar que as caixas de distribuição também devem ser contadas. Isso significa que até 500 geradores/sistemas de armazenamento/máquinas/lâmpadas podem ser conectados a uma rede elétrica.\n".. - "\n".. - "Com a ajuda de um transformador de isolamento e de um medidor de eletricidade\\, as redes podem ser conectadas para formar estruturas ainda maiores.\n".. - "\n".. - "\n".. - "\n", - "Com a ajuda de um transformador de isolamento\\, duas redes de energia podem ser conectadas para formar uma rede maior. O transformador de isolamento pode transmitir eletricidade em ambas as direções.\n".. - "\n".. - "O transformador de isolamento pode transmitir até 300 ku. O valor máximo é ajustável por meio do menu da chave inglesa.\n".. - "\n".. - "\n".. - "\n", - "Com a ajuda de um medidor de eletricidade\\, duas redes de eletricidade podem ser conectadas para formar uma rede maior. O medidor de eletricidade transmite eletricidade somente em uma direção (observe a seta). A quantidade de energia elétrica transmitida (em kud) é medida e exibida. Esse valor também pode ser consultado por um controlador Lua usando o comando 'consumption'. A corrente atual pode ser consultada por meio do comando 'current'.\n".. - "\n".. - "O medidor de eletricidade pode passar até 200 ku. O valor máximo é ajustável por meio do menu da chave inglesa.\n".. - "\n".. - "Uma contagem regressiva da potência de saída também pode ser inserida por meio do menu da chave inglesa. Quando essa contagem regressiva chega a zero\\, o medidor de eletricidade é desligado. A contagem regressiva pode ser consultada com o comando 'countdown'.\n".. - "\n".. - "\n".. - "\n", - "O laser TA4 é usado para transmissão de energia sem fio. Para isso\\, são necessários dois blocos: Emissor de feixe de laser TA4 e Receptor de feixe de laser TA4. Deve haver um espaço de ar entre os dois blocos para que o feixe de laser possa ser construído a partir do emissor até o receptor. Primeiro\\, o emissor deve ser colocado. Isso liga imediatamente o feixe de laser e mostra as possíveis posições do receptor. As possíveis posições do receptor também são exibidas por meio de uma mensagem de bate-papo. \n".. - "\n".. - "Com o laser\\, distâncias de até 96 blocos podem ser superadas. Depois que a conexão é estabelecida (não é necessário haver fluxo de corrente)\\, isso é indicado por meio do texto informativo do emissor e também do receptor. \n".. - "\n".. - "Os blocos de laser em si não requerem eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A eletrólise pode ser usada para dividir a eletricidade em hidrogênio e oxigênio. Por outro lado\\, o hidrogênio pode ser convertido novamente em eletricidade com o oxigênio do ar usando uma célula de combustível.\n".. - "Isso permite que os picos de corrente ou um excesso de fornecimento de eletricidade sejam convertidos em hidrogênio e\\, portanto\\, armazenados.\n".. - "\n".. - "No jogo\\, a eletricidade pode ser convertida novamente em eletricidade por meio da célula de combustível usando o eletrolisador em hidrogênio e hidrogênio.\n".. - "Isso significa que a eletricidade (na forma de hidrogênio) pode não apenas ser armazenada em tanques\\, mas também transportada por meio do carrinho-tanque.\n".. - "\n".. - "No entanto\\, a conversão de eletricidade em hidrogênio e vice-versa é deficitária. De 100 unidades de eletricidade\\, apenas 95 unidades de eletricidade saem após a conversão em hidrogênio e vice-versa.\n".. - "\n".. - "\n".. - "\n", - "O eletrolisador converte eletricidade em hidrogênio.\n".. - "Ele deve ser alimentado pela esquerda. À direita\\, o hidrogênio pode ser extraído por meio de tubos e bombas.\n".. - "\n".. - "O eletrolisador pode consumir até 35 ku de eletricidade e\\, em seguida\\, gera um item de hidrogênio a cada 4 s.\n".. - "200 unidades de hidrogênio cabem no eletrolisador.\n".. - "\n".. - "O eletrolisador tem um menu de chave inglesa para definir o consumo de corrente e o ponto de desligamento.\n".. - "\n".. - "Se a energia armazenada na rede elétrica cair abaixo do valor especificado do ponto de desligamento\\, o eletrolisador se desliga automaticamente. Isso evita que os sistemas de armazenamento fiquem vazios.\n".. - "\n".. - "\n".. - "\n", - "A célula de combustível converte hidrogênio em eletricidade.\n".. - "Ele deve ser abastecido com hidrogênio pela esquerda por meio de uma bomba. A conexão de energia está à direita.\n".. - "\n".. - "A célula de combustível pode fornecer até 34 ku de eletricidade e precisa de um item de hidrogênio a cada 4 s.\n".. - "\n".. - "Normalmente\\, a célula de combustível funciona como um gerador de categoria 2 (como outros sistemas de armazenamento). \n".. - "Nesse caso\\, nenhum outro bloco de categoria 2\\, como o bloco de bateria\\, pode ser carregado. No entanto\\, a célula de combustível também pode ser usada como um gerador de categoria 1 por meio da caixa de seleção.\n".. - "\n".. - "\n".. - "\n", - "O reator é usado para processar os ingredientes obtidos da torre de destilação ou de outras receitas em novos produtos.\n".. - "A planta à esquerda mostra apenas uma variante possível\\, pois a disposição dos silos e tanques depende da receita.\n".. - "\n".. - "O produto primário de saída é sempre descarregado na lateral do suporte do reator\\, independentemente de ser um pó ou um líquido. O produto residual (secundário) é sempre descarregado na parte inferior do suporte do reator.\n".. - "\n".. - "Um reator consiste em:\n".. - "\n".. - " - Vários tanques e silos com os ingredientes que são conectados ao dosador por meio de tubos\n".. - " - opcionalmente\\, uma base do reator\\, que descarrega os resíduos do reator (necessário apenas para receitas com dois produtos de saída)\n".. - " - o suporte do reator\\, que deve ser colocado na base (se disponível). O suporte tem uma conexão de energia e consome 8 ku durante a operação.\n".. - " - O vaso do reator que deve ser colocado no suporte do reator\n".. - " - O tubo de enchimento que deve ser colocado no vaso do reator\n".. - " - O dispositivo de dosagem\\, que deve ser conectado aos tanques ou silos e ao tubo de enchimento por meio de tubos\n".. - "\n".. - "Observação 1: Os líquidos são armazenados somente em tanques e os sólidos e substâncias em pó somente em silos. Isso se aplica a ingredientes e produtos finais.\n".. - "\n".. - "Observação 2: Os tanques ou silos com conteúdos diferentes não devem ser conectados a um sistema de tubulação. Por outro lado\\, vários tanques ou silos com o mesmo conteúdo podem ser pendurados em paralelo em uma linha.\n".. - "\n".. - "O craqueamento quebra cadeias longas de hidrocarbonetos em cadeias curtas usando um catalisador.\n".. - "O pó de gibbsita serve como catalisador (não é consumido). Ele pode ser usado para converter betume em óleo combustível\\, óleo combustível em nafta e nafta em gasolina.\n".. - "\n".. - "Na hidrogenação\\, pares de átomos de hidrogênio são adicionados a uma molécula para converter hidrocarbonetos de cadeia curta em longa.\n".. - "Aqui\\, o pó de ferro é necessário como catalisador (não é consumido). Ele pode ser usado para converter gás (propano) em isobutano\\,\n".. - "isobutano em gasolina\\, gasolina em nafta\\, nafta em óleo combustível e óleo combustível em betume.\n".. - "\n".. - "\n".. - "\n", - "Parte do reator químico.\n".. - "As tubulações para materiais de entrada podem ser conectadas em todos os quatro lados do dosador. Os materiais para o reator são descarregados para cima.\n".. - "\n".. - "A receita pode ser definida e o reator pode ser iniciado por meio do dosador.\n".. - "\n".. - "Como em outras máquinas:\n".. - "\n".. - " - se o dosador estiver no modo de espera\\, um ou mais ingredientes estão faltando\n".. - " - se o dosador estiver no estado bloqueado\\, o tanque ou silo de saída está cheio\\, com defeito ou conectado incorretamente\n".. - "\n".. - "O dosador não precisa de eletricidade. Uma receita é processada a cada 10 s.\n".. - "\n".. - "\n".. - "\n", - "Parte do reator químico. O reator tem um inventário para os itens de catalisador (para receitas de craqueamento e hidrogenação).\n".. - "\n".. - "\n".. - "\n", - "Parte do reator químico. Deve ser colocado no reator. Se isso não funcionar\\, remova o tubo na posição acima e coloque-o novamente.\n".. - "\n".. - "\n".. - "\n", - "Parte do reator químico. Aqui também está a conexão de energia para o reator. O reator requer 8 ku de eletricidade.\n".. - "\n".. - "O suporte tem duas conexões de tubulação\\, à direita para o produto inicial e abaixo para os resíduos\\, como a lama vermelha na produção de alumínio.\n".. - "\n".. - "\n".. - "\n", - "Parte do reator químico. É necessário para a drenagem do produto residual.\n".. - "\n".. - "\n".. - "\n", - "Parte do reator químico. É necessário para armazenar substâncias em forma de pó ou grânulos.\n".. - "\n".. - "\n".. - "\n", - "O controlador ICTA (ICTA significa \"If Condition Then Action\") é usado para monitorar e controlar máquinas. O controlador pode ser usado para ler dados de máquinas e outros blocos e\\, dependendo disso\\, ligar/desligar outras máquinas e blocos.\n".. - "\n".. - "Os dados da máquina são lidos e os blocos e máquinas são controlados por meio de comandos. O capítulo TA3 -> Blocos lógicos/comutação é importante para entender como os comandos funcionam.\n".. - "\n".. - "O controlador requer uma bateria para funcionar. O visor é usado para emitir dados\\, a torre de sinalização para exibir erros.\n".. - "\n".. - "\n".. - "\n", - "O controlador funciona com base nas regras 'IF THEN '. Podem ser criadas até 8 regras por controlador.\n".. - "\n".. - "Exemplos de regras são:\n".. - "\n".. - " - Se um distribuidor estiver \"bloqueado\"\\, o empurrador na frente dele deve ser desligado\n".. - " - Se uma máquina apresentar um erro\\, isso deverá ser mostrado no visor\n".. - "\n".. - "O controlador verifica essas regras ciclicamente. Para fazer isso\\, um tempo de ciclo em segundos (`` Cycle / s '') deve ser especificado para cada regra (1...1000).\n".. - "\n".. - "Para regras que avaliam uma entrada ligada/desligada\\, por exemplo\\, de um interruptor ou detector\\, o tempo de ciclo 0 deve ser especificado. O valor 0 significa que essa regra deve ser sempre executada quando o sinal de entrada for alterado\\, por exemplo\\, quando o botão enviar um novo valor.\n".. - "\n".. - "Todas as regras devem ser executadas apenas com a frequência necessária. Isso tem duas vantagens:\n".. - "\n".. - " - a bateria do controlador dura mais (cada controlador precisa de uma bateria)\n".. - " - a carga do servidor é menor (portanto\\, menos atrasos)\n".. - "\n".. - "Você deve definir um tempo de atraso ('depois/s') para cada ação. Se a ação tiver que ser executada imediatamente\\, deve-se inserir 0.\n".. - "\n".. - "O controlador tem sua própria ajuda e informações sobre todos os comandos por meio do menu do controlador.\n".. - "\n".. - "\n".. - "\n", - "A bateria deve ser colocada bem próxima ao controlador\\, ou seja\\, em uma das 26 posições ao redor do controlador.\n".. - "\n".. - "\n".. - "\n", - "O display mostra seu número após a colocação. O display pode ser endereçado por meio desse número. Os textos podem ser exibidos no visor\\, sendo que o visor pode exibir 5 linhas e\\, portanto\\, 5 textos diferentes.\n".. - "\n".. - "As linhas de texto são sempre alinhadas à esquerda. Se o texto tiver que ser centralizado horizontalmente\\, deverá ser precedido pelo caractere \"t\" (tabulador).\n".. - "\n".. - "O visor é atualizado no máximo uma vez por segundo.\n".. - "\n".. - "\n".. - "\n", - "O TA4 Display XL tem o dobro do tamanho do display TA4.\n".. - "\n".. - "As linhas de texto são sempre alinhadas à esquerda. Se o texto tiver que ser centralizado horizontalmente\\, deverá ser precedido pelo caractere \"t\" (tabulador).\n".. - "\n".. - "O visor é atualizado a cada dois segundos\\, no máximo.\n".. - "\n".. - "\n".. - "\n", - "A torre de sinalização pode exibir vermelho\\, verde e laranja. Não é possível uma combinação das três cores.\n".. - "\n".. - "\n".. - "\n", - "Como o nome sugere\\, o controlador Lua deve ser programado na linguagem de programação Lua. O manual em inglês está disponível aqui:\n".. - "\n".. - "https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md\n".. - "\n".. - "O controlador Lua também requer uma bateria. A bateria deve ser colocada bem próxima ao controlador\\, ou seja\\, em uma das 26 posições ao redor do controlador.\n".. - "\n".. - "\n".. - "\n", - "O servidor é usado para o armazenamento central de dados de vários controladores Lua. Ele também salva os dados após a reinicialização do servidor.\n".. - "\n".. - "\n".. - "\n", - "A caixa de sensores TA4 é usada para configurar armazéns automáticos ou máquinas de venda automática em conjunto com o controlador Lua.\n".. - "Se algo for colocado na caixa ou removido\\, ou se uma das teclas \"F1\"/\"F2\" for pressionada\\, um sinal de evento será enviado ao controlador Lua.\n".. - "A caixa do sensor suporta os seguintes comandos:\n".. - "\n".. - " - O status da caixa pode ser consultado por meio de 'state = $send_cmnd(\\, \"state\")'. As respostas possíveis são: \"empty\" (vazio)\\, \"loaded\" (carregado)\\, \"full\" (cheio)\n".. - " - A última ação do jogador pode ser consultada por meio de 'name\\, action = $send_cmnd(\\, \"action\")'. 'name' é o nome do jogador. Uma das seguintes opções é retornada como 'action': \"put\"\\, \"take\"\\, \"f1\"\\, \"f2\".\n".. - " - O conteúdo da caixa pode ser lido por meio de 'stacks = $send_cmnd(\\, \"stacks\")'. Consulte: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest\n".. - " - Por meio de '$send_cmnd(\\, \"text\"\\, \"pressione ambos os botões e coloque algo no peito\")'\\, o texto pode ser definido no menu da caixa do sensor.\n".. - "\n".. - "A caixa de seleção \"Allow public chest access\" (Permitir acesso público ao baú) pode ser usada para definir se a caixa pode ser usada por todos ou somente por jogadores que tenham direitos de acesso/proteção aqui.\n".. - "\n".. - "\n".. - "\n", - "O terminal é usado para entrada/saída do controlador Lua.\n".. - "\n".. - "\n".. - "\n", - "", - "Apenas a aparência do botão/chave TA4 foi alterada. A funcionalidade é a mesma do botão/chave TA3. No entanto\\, com o menu da chave inglesa\\, os dados podem ser alterados posteriormente.\n".. - "\n".. - "\n".. - "\n", - "Esse bloco tem dois botões que podem ser configurados individualmente por meio do menu de chave inglesa. A rotulagem e o endereço do bloco de destino podem ser configurados para cada botão. Além disso\\, o comando a ser enviado pode ser configurado para cada botão. \n".. - "\n".. - "\n".. - "\n", - "Esse bloco tem quatro botões que podem ser configurados individualmente por meio do menu de chave inglesa. A rotulagem e o endereço do bloco de destino podem ser configurados para cada botão. Além disso\\, o comando a ser enviado pode ser configurado para cada botão. \n".. - "\n".. - "\n".. - "\n", - "Esse bloco tem duas lâmpadas que podem ser controladas individualmente. Cada lâmpada pode exibir as cores \"vermelho\"\\, \"verde\" e \"âmbar\". A rotulagem de ambas as lâmpadas pode ser configurada por meio do menu de chave inglesa. As lâmpadas podem ser controladas usando os seguintes comandos:\n".. - "\n".. - " - Mudar a lâmpada 1 para vermelho: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Mude a lâmpada 2 para verde: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. - " - Mudar a lâmpada 1 para laranja: '$send_cmnd(1234\\, \"amber\"\\, 1)'\n".. - " - Desligar a lâmpada 2: '$send_cmnd(1234\\, \"off\"\\, 2)'\n".. - "\n".. - "\n".. - "\n", - "Esse bloco tem quatro lâmpadas que podem ser controladas individualmente. Cada lâmpada pode exibir as cores \"vermelho\"\\, \"verde\" e \"âmbar\". A rotulagem de todas as lâmpadas pode ser configurada por meio do menu de chave inglesa. As lâmpadas podem ser controladas usando os seguintes comandos:\n".. - "\n".. - " - Mudar a lâmpada 1 para vermelho: '$send_cmnd(1234\\, \"red\"\\, 1)'\n".. - " - Mude a lâmpada 2 para verde: '$send_cmnd(1234\\, \"green \"\\, 2)'\n".. - " - Mudar a lâmpada 3 para laranja: '$send_cmnd(1234\\, \"amber\"\\, 3)'\n".. - " - Desligar a lâmpada 4: '$send_cmnd(1234\\, \"off\"\\, 4)'\n".. - "\n".. - "\n".. - "\n", - "Apenas a aparência do detector de player TA4 foi alterada. A funcionalidade é a mesma do detector de player TA3.\n".. - "\n".. - "\n".. - "\n", - "\n".. - "\n".. - "O coletor de status consulta todas as máquinas configuradas para obter o status. Se uma das máquinas tiver atingido ou excedido um status pré-configurado\\, um comando \"on\" será enviado. Por exemplo\\, muitas máquinas podem ser facilmente monitoradas quanto a falhas a partir de um controlador Lua.\n".. - "\n", - "A funcionalidade é a mesma do detector TA3. Além disso\\, o detector conta os itens passados adiante.\n".. - "Esse contador pode ser consultado com o comando \"count\" e redefinido com \"reset\".\n".. - "\n".. - "\n".. - "\n", - "A funcionalidade é a mesma do TA3 Node Detector.\n".. - "\n".. - "Ao contrário do detector de nós TA3\\, as posições a serem monitoradas podem ser configuradas individualmente aqui. Para fazer isso\\, o botão \"Record\" (Registrar) deve ser pressionado. Em seguida\\, todos os blocos devem ser clicados\\, cuja posição deve ser verificada. Em seguida\\, o botão \"Done\" (Concluído) deve ser pressionado.\n".. - "\n".. - "Podem ser selecionados até 4 blocos.\n".. - "\n".. - "\n".. - "\n", - "O detector de carga mede o estado de carga do armazenamento de energia da rede elétrica a cada 8 s.\n".. - "\n".. - "Se o valor ficar abaixo de um limite configurável (ponto de comutação)\\, um comando (padrão: \"off\") será enviado. Se o valor subir novamente acima desse ponto de comutação\\, um segundo comando (padrão: \"on\") será enviado. Isso permite que os consumidores sejam desconectados da rede quando o nível de carga do dispositivo de armazenamento de energia cair abaixo do ponto de comutação especificado.\n".. - "\n".. - "Para fazer isso\\, o detector de carga deve ser conectado à rede por meio de uma caixa de junção. O detector de carga é configurado por meio do menu da chave de boca.\n".. - "\n".. - "\n".. - "\n", - "O sensor de olhar TA4 gera um comando quando o bloco é visto/focado pelo proprietário ou por outros jogadores configurados e envia um segundo comando quando o bloco não é mais focalizado. Assim\\, ele substitui os botões/interruptores\\, por exemplo\\, para abrir/fechar portas.\n".. - "\n".. - "O TA4 Gaze Sensor só pode ser programado usando o menu da chave de boca. Se você tiver uma chave de boca na mão\\, o sensor não será acionado\\, mesmo que esteja focalizado.\n".. - "\n".. - "\n".. - "\n", - "Processos inteiros podem ser programados usando o sequenciador TA4. Veja um exemplo:\n".. - "\n".. - " -- este é um comentário\n".. - " \\[1\\] send 1234 a2b\n".. - " \\[30\\] send 1234 b2a\n".. - " \\[60\\] goto 1\n".. - "\n".. - " - Cada linha começa com um número que corresponde a um ponto no tempo '\\[\\]'\n".. - " - São permitidos valores de 1 a 50000 para os tempos\n".. - " - 1 corresponde a 100 ms\\, 50000 corresponde a cerca de 4 dias de jogo\n".. - " - Linhas vazias ou comentários são permitidos ('-- comment')\n".. - " - Com 'send '\\, você pode enviar um comando para um bloco\n".. - " - Com 'goto ' você pode pular para outra linha/ponto no tempo\n".. - " - Com 'stop' você pode parar o sequenciador com um atraso para que ele não receba um novo comando\naceita de um botão ou outro bloco (para concluir um movimento)\nSem 'stop'\\, o sequenciador entra no modo parado imediatamente após o último comando.\n".. - "\n".. - "O sequenciador TA4 suporta os seguintes comandos de tecnologia:\n".. - "\n".. - " - 'goto ' Salta para uma linha de comando e inicia o sequenciador\n".. - " - 'stop' Parar o sequenciador\n".. - " - 'on' e 'off' como aliases para 'goto 1' e 'stop'\n".. - "\n".. - "O comando 'goto' só é aceito quando o sequenciador está parado.\n".. - "\n".. - "O tempo de ciclo (padrão: 100 ms) pode ser alterado para o sequenciador por meio do menu da chave de boca.\n".. - "\n".. - "\n".. - "\n", - "", - "O TA4 Move Controller é semelhante ao \"Door Controller 2\"\\, mas os blocos selecionados não são removidos\\, mas podem ser movidos.\n".. - "Como os blocos móveis podem levar consigo os jogadores e as multidões que estão no bloco\\, é possível construir elevadores e sistemas de transporte semelhantes com eles.\n".. - "\n".. - "Instruções:\n".. - "\n".. - " - Defina o controlador e treine os blocos a serem movidos por meio do menu (até 16 blocos podem ser treinados)\n".. - " - A \"rota de voo\" deve ser inserida por meio de uma especificação x\\, y\\, z (relativa) (a distância máxima (x+y+z) é de 200 m)\n".. - " - O movimento pode ser testado com os botões de menu \"Move A-B\" e \"Move B-A\"\n".. - " - Você também pode voar através de paredes ou outros blocos\n".. - " - A posição de destino dos blocos também pode ser ocupada. Nesse caso\\, os blocos são salvos de forma \"invisível\". Isso se destina a portas deslizantes e similares\n".. - "\n".. - "O Move Controller é compatível com os seguintes comandos de tecnologia:\n".. - "\n".. - " - 'a2b' Mover o bloco de A para B.\n".. - " - 'b2a' Mover o bloco de B para A.\n".. - " - 'move' Mover o bloco para o outro lado\n".. - "\n".. - "Você pode alternar para o modo de operação 'move xyz' por meio do menu de chave inglesa. Após a mudança\\, os seguintes comandos técnicos são suportados: \n".. - "\n".. - " - 'move2' Com o comando\\, a rota de voo também deve ser especificada como um vetor x\\,y\\,z.\nExemplo de controlador Lua: '$send_cmnd(MOVE_CTLR\\, \"move2\"\\, \"0\\,12\\,0\")'\n".. - " - 'reset' move o(s) bloco(s) de volta à posição inicial\n".. - "\n".. - "*Instruções importantes:*\n".. - "\n".. - " - Se vários blocos tiverem de ser movidos\\, o bloco que levará os jogadores/mobs deverá ser clicado primeiro durante o treinamento.\n".. - " - Se o bloco que deve levar os jogadores/móbile tiver uma altura reduzida\\, a altura deverá ser definida no controlador usando o menu de chave de boca aberto (por exemplo\\, altura = 0\\,5). Caso contrário\\, o jogador/móbile não será \"encontrado\" e não será levado embora.\n".. - "\n".. - "\n".. - "\n", - "O controlador de giro do TA4 é semelhante ao \"Move Controller\"\\, mas os blocos selecionados não são movidos\\, mas girados em torno de seu centro para a direita ou para a esquerda.\n".. - "\n".. - "Instruções:\n".. - "\n".. - " - Defina o controlador e treine os blocos a serem movidos por meio do menu (até 16 blocos podem ser treinados)\n".. - " - O movimento pode ser testado com os botões de menu \"Turn left\" (Virar à esquerda) e \"Turn right\" (Virar à direita)\n".. - "\n".. - "O controlador de giro suporta os seguintes comandos de tecnologia:\n".. - "\n".. - " - 'left' Vire à esquerda\n".. - " - 'direita' Vire à direita\n".. - " - 'uturn' Girar 180 graus\n".. - "\n".. - "\n".. - "\n", - "O TA4 contém uma série de lâmpadas potentes que permitem uma melhor iluminação ou a realização de tarefas especiais.\n".. - "\n", - "A lâmpada de cultivo TA4 LED permite o crescimento rápido e vigoroso de todas as plantas do modo 'farming'. A lâmpada ilumina um campo de 3x3\\, de modo que as plantas também podem ser cultivadas no subsolo.\n".. - "A lâmpada deve ser colocada um bloco acima do solo no meio do campo 3x3.\n".. - "\n".. - "A lâmpada também pode ser usada para cultivar flores. Se a lâmpada for colocada sobre um canteiro de flores 3x3 feito de \"Garden Soil\" (Mod 'compost')\\, as flores crescerão automaticamente (acima e abaixo do solo).\n".. - "\n".. - "Você pode colher as flores com o Signs Bot\\, que também tem uma placa correspondente que deve ser colocada na frente do campo de flores.\n".. - "\n".. - "A lâmpada requer 1 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A lâmpada de rua de LED TA4 é uma lâmpada com iluminação particularmente forte. A lâmpada consiste no compartimento da lâmpada\\, no braço da lâmpada e nos blocos do poste da lâmpada.\n".. - "\n".. - "A corrente deve ser conduzida de baixo para cima\\, através do mastro\\, até o compartimento da lâmpada. Primeiro\\, puxe o cabo de alimentação para cima e\\, em seguida\\, \"engesse\" o cabo de alimentação com blocos de postes de iluminação.\n".. - "\n".. - "A lâmpada requer 1 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A lâmpada industrial de LED TA4 é uma lâmpada com iluminação particularmente forte. A lâmpada deve ser alimentada por cima.\n".. - "\n".. - "A lâmpada requer 1 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "O filtro de líquidos filtra a lama vermelha.\n".. - "Uma parte da lama vermelha se transforma em soda cáustica\\, que pode ser coletada no fundo de um tanque.\n".. - "A outra parte se transforma em um paralelepípedo do deserto e obstrui o material do filtro.\n".. - "Se o filtro estiver muito entupido\\, ele deverá ser limpo e enchido novamente.\n".. - "O filtro consiste em uma camada de base\\, 7 camadas de filtro idênticas e uma camada de enchimento na parte superior.\n".. - "\n".. - "\n".. - "\n", - "Você pode ver a estrutura dessa camada no plano.\n".. - "\n".. - "A soda cáustica é coletada no tanque.\n".. - "\n".. - "\n".. - "\n", - "Essa camada deve ser preenchida com cascalho\\, conforme mostrado no plano.\n".. - "No total\\, deve haver sete camadas de cascalho.\n".. - "O filtro ficará obstruído com o tempo\\, de modo que precisará ser limpo e preenchido novamente.\n".. - "\n".. - "\n".. - "\n", - "Essa camada é usada para preencher o filtro com lama vermelha.\n".. - "A lama vermelha deve ser bombeada para o tubo de enchimento.\n".. - "\n".. - "\n".. - "\n", - "O Collider é uma instalação de pesquisa que realiza pesquisas básicas. É possível coletar pontos de experiência aqui\\, que são necessários para o TA5 (Future Age).\n".. - "\n".. - "Como seu original no CERN em Genebra\\, o colisor deve ser construído no subsolo. A configuração padrão aqui é Y <= -28. O valor pode\\, no entanto\\, ser alterado pela equipe do servidor por meio da configuração. Pergunte ou tente o bloco \"TA4 Collider Detector Worker\".\n".. - "\n".. - "Somente um colisor pode ser operado por jogador. Portanto\\, não faz sentido configurar dois ou mais colisores. Os pontos de experiência são creditados ao jogador que possui o colisor. Os pontos de experiência não podem ser transferidos.\n".. - "\n".. - "Um colisor consiste em um \"anel\" feito de tubos e ímãs\\, além de um detector com um sistema de resfriamento.\n".. - "\n".. - " - O detector é o coração do sistema. É nele que os experimentos científicos são realizados. O detector tem o tamanho de 3x3x7 blocos.\n".. - " - 22 ímãs do colisor TA4 (não os ímãs do detector do colisor TA4!) devem ser conectados uns aos outros por meio de 5 blocos do tubo de vácuo TA4. Cada ímã também requer eletricidade e uma conexão de gás para resfriamento. O conjunto forma (como mostrado na planta à direita) um quadrado com um comprimento de borda de 37 metros.\n".. - "\n".. - "A planta mostra a instalação vista de cima:\n".. - "\n".. - " - O bloco cinza é o detector com o bloco de trabalho no meio\n".. - " - Os blocos vermelhos são os ímãs\\, os azuis são os tubos de vácuo\n".. - "\n".. - "\n".. - "\n", - "O detector é configurado automaticamente com a ajuda do bloco \"TA4 Collider Detector Worker\" (semelhante à torre). Todos os materiais necessários para isso devem ser colocados primeiro no bloco do trabalhador. O detector é mostrado simbolicamente no bloco do trabalhador. O detector é montado no bloco de trabalho.\n".. - "\n".. - "O detector também pode ser desmontado novamente com a ajuda do bloco de trabalho.\n".. - "\n".. - "As conexões para eletricidade\\, gás e tubos de vácuo estão localizadas nos dois lados frontais do detector. Uma bomba TA4 deve ser conectada na parte superior para sugar o tubo vazio/criar o vácuo.\n".. - "\n".. - "O sistema de resfriamento deve ser conectado à parte traseira do detector. O sistema de resfriamento é mostrado na planta à direita. Além do trocador de calor TA4 da unidade de armazenamento de energia (que é usado aqui para resfriamento)\\, também é necessário um bloco resfriador TA4.\n".. - "\n".. - "Observação: A seta no trocador de calor deve apontar para longe do detector. O trocador de calor também deve ser alimentado com eletricidade.\n".. - "\n".. - "\n".. - "\n".. - " - Além disso\\, é necessário resfriamento\\, que também deve ser instalado no detector. O isobutano é necessário para o resfriamento.\n".. - " - O sistema requer uma quantidade considerável de eletricidade. Portanto\\, faz sentido ter sua própria fonte de alimentação.\n".. - "\n", - "O colisor é controlado por meio de um terminal TA4 (não por meio do terminal do controlador TA4 Lua).\n".. - "\n".. - "Esse terminal deve ser conectado ao detector. O número do detector é exibido como texto informativo no bloco de trabalho.\n".. - "\n".. - "O terminal suporta os seguintes comandos:\n".. - "\n".. - " - 'connect ' (conectar-se ao detector)\n".. - " - 'start' (iniciar o detector)\n".. - " - 'stop' (parar o detector)\n".. - " - 'test ' (verificação de um ímã)\n".. - " - 'points' (consulta dos pontos de experiência já obtidos)\n".. - "\n".. - "Se ocorrer um erro em um ímã durante o 'start'\\, o número do ímã será exibido. O comando 'test' pode ser usado para solicitar mais informações sobre o erro do ímã.\n".. - "\n".. - "\n".. - "\n", - "Cada ímã do Colisor TA4 também deve ser abastecido com eletricidade (conforme mostrado à direita na planta) e com isobutano para resfriamento:\n".. - "\n".. - " - A conexão para a alimentação está na parte superior do ímã.\n".. - " - A conexão para o resfriamento está na parte frontal do ímã.\n".. - " - Uma bomba TA4 e um tanque TA4 com pelo menos 250 unidades de isobutano também são necessários para resfriar todo o sistema.\n".. - " - O sistema também requer muita eletricidade. Portanto\\, faz sentido ter sua própria fonte de alimentação com pelo menos 145 ku.\n".. - "\n".. - "\n".. - "\n", - "A sequência a seguir é recomendada ao configurar o colisor:\n".. - "\n".. - " - Coloque um bloco de carga forçada. Somente o detector com o sistema de resfriamento deve estar na área do bloco de carga forçada.\n".. - " - Defina o bloco de trabalho\\, preencha-o com itens e configure o detector por meio do menu\n".. - " - Construa o anel com tubos e ímãs\n".. - " - Conecte todos os ímãs e o detector com os cabos de alimentação\n".. - " - Conecte todos os ímãs e o detector com os tubos amarelos e bombeie o isobutano no sistema de tubos com uma bomba\n".. - " - Instale uma bomba TA4 como uma bomba de vácuo no detector e ligue-a (não é necessário nenhum tanque adicional). Se a bomba entrar em \"standby\"\\, o vácuo será estabelecido. Isso levará alguns segundos\n".. - " - Monte o resfriador (trocador de calor) e conecte-o ao cabo de alimentação\n".. - " - Coloque o terminal TA4 na frente do detector e conecte-o ao detector por meio de 'connect '\n".. - " - Ligar/conectar a fonte de alimentação\n".. - " - ligar o resfriador (trocador de calor)\n".. - " - Ligue o detector por meio de 'start' no terminal TA4. Após algumas etapas de teste\\, o detector entra em operação normal ou emite um erro.\n".. - " - O colisor precisa ser executado continuamente e\\, em seguida\\, fornece gradualmente pontos de experiência. Para obter 10 pontos\\, o colisor precisa funcionar por algumas horas\n".. - "\n".. - "\n".. - "\n", - "", - "Até 10 receitas podem ser salvas no bloco de receitas. Essas receitas podem então ser chamadas por meio de um comando do TA4 Autocrafter. Isso permite que a receita do autocrafter seja configurada por meio de um comando. As receitas no bloco de receitas também podem ser consultadas diretamente por meio de um comando.\n".. - "\n".. - "'input ' lê uma receita do bloco de receitas do TA4. '' é o número da receita. O bloco retorna uma lista de ingredientes da receita.\n".. - "\n".. - "Exemplo: '$send_cmnd(1234\\, \"input\"\\, 1)'\n".. - "\n".. - " \n".. - "\n", - "A função corresponde à do TA3.\n".. - "\n".. - "A capacidade de processamento é de 4 itens a cada 4 s. O autocrafter requer 9 ku de eletricidade para isso.\n".. - "\n".. - "Além disso\\, o TA4 Autocrafter suporta a seleção de diferentes receitas usando os seguintes comandos:\n".. - "\n".. - "'recipe \".\"' muda o autocrafter para uma receita do bloco de receitas TA4. '' é o número do bloco de receitas\\, '' é o número da receita. Exemplo: '$send_cmnd(1234\\, \"recipe\"\\, \"5467.1\")'\n".. - "\n".. - "Como alternativa\\, uma receita também pode ser selecionada por meio da lista de ingredientes\\, por exemplo:\n".. - "'$send_cmnd(1234\\, \"recipe\"\\, \"default:coal_lump\\,\\,\\,default:stick\")'\n".. - "Todos os nomes técnicos de uma receita devem ser especificados aqui\\, separados por vírgulas. Consulte também o comando 'input' no bloco de receitas do TA4.\n".. - "\n".. - "O comando 'flush' move todos os itens do inventário de entrada para o inventário de saída. O comando retorna 'true' se o inventário de entrada tiver sido completamente esvaziado. Se 'false' for retornado (inventário de saída cheio)\\, o comando deverá ser repetido em um momento posterior.\n".. - "\n".. - " \n".. - "\n", - "Consulte o tanque TA3.\n".. - "\n".. - "Um tanque TA4 pode conter 2.000 unidades ou 200 barris de líquido.\n".. - "\n".. - "\n".. - "\n", - "Consulte a bomba TA3.\n".. - "\n".. - "A bomba TA4 bombeia 8 unidades de líquido a cada dois segundos. \n".. - "\n".. - "No modo \"Flow limiter\" (Limitador de fluxo)\\, o número de unidades bombeadas pela bomba pode ser limitado. O modo de limitador de fluxo pode ser ativado por meio do menu da chave de boca\\, configurando o número de unidades no menu. Quando o número configurado de unidades tiver sido bombeado\\, a bomba será desligada. Quando a bomba for ligada novamente\\, ela bombeará o número configurado de unidades novamente e\\, em seguida\\, será desligada.\n".. - "\n".. - "O limitador de fluxo também pode ser configurado e iniciado usando um controlador Lua ou Beduino.\n".. - "\n".. - "A bomba também é compatível com o comando 'flowrate'. Isso permite que a taxa de fluxo total através da bomba seja consultada.\n".. - "\n".. - "\n".. - "\n", - "Com o TA4\\, o forno industrial também tem seu aquecimento elétrico. O queimador de óleo e o soprador podem ser substituídos pelo aquecedor.\n".. - "\n".. - "O aquecedor requer 14 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "Esse bloco não poderá mais ser fabricado e será substituído pelo bloco de entrada de água TA4. \n".. - "\n", - "Algumas receitas requerem água. A água deve ser bombeada do mar com uma bomba (água em y = 1). Uma \"piscina\" composta de alguns blocos de água não é suficiente para isso! \n".. - "\n".. - "Para fazer isso\\, o bloco de entrada de água deve ser colocado na água e conectado à bomba por meio de tubos. Se o bloco for colocado na água\\, é preciso garantir que haja água sob o bloco (a água deve ter pelo menos 2 blocos de profundidade). \n".. - "\n".. - "\n".. - "\n", - "O TA4 também tem seus próprios tubos no design do TA4. Eles podem ser usados como os tubos padrão.\n".. - "Mas: Os empurradores e distribuidores TA4 só atingem seu desempenho total quando usados com tubos TA4.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde basicamente à do TA2 / TA3. Além disso\\, um menu pode ser usado para configurar quais objetos devem ser retirados de um baú TA4 e transportados posteriormente.\n".. - "A capacidade de processamento é de 12 itens a cada 2 s\\, se forem usados tubos TA4 em ambos os lados. Caso contrário\\, haverá apenas 6 itens a cada 2 s.\n".. - "\n".. - "No modo \"limitador de fluxo\"\\, o número de itens que são movidos pelo empurrador pode ser limitado. O modo limitador de fluxo pode ser ativado por meio do menu da chave de boca\\, configurando o número de itens no menu. Assim que o número configurado de itens tiver sido movido\\, o empurrador se desliga. Se o empurrador for ligado novamente\\, ele moverá o número configurado de itens novamente e depois se desligará.\n".. - "\n".. - "O empurrador TA4 também pode ser configurado e iniciado usando um controlador Lua ou Beduino.\n".. - "\n".. - "Aqui estão os comandos adicionais para o controlador Lua:\n".. - "\n".. - " - O 'config' é usado para configurar o empurrador\\, de forma análoga à configuração manual por meio do menu.\n Exemplo: '$send_cmnd(1234\\, \"config\"\\, \"default:dirt\")'\n Com '$send_cmnd(1234\\, \"config\"\\, \"\")'\\, a configuração é excluída\n".. - " - 'limit' é usado para definir o número de itens para o modo de limitador de fluxo:\n Exemplo: '$send_cmnd(1234\\, \"init\"\\, 7)'\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA3. O baú pode conter mais conteúdo.\n".. - "\n".. - "Além disso\\, o baú do TA4 tem um shadow inventory para configuração. Aqui\\, determinados locais de pilha podem ser pré-atribuídos a um item. As pilhas de inventário pré-atribuídas só são preenchidas com esses itens durante o preenchimento. É necessário um empurrador ou injetor TA4 com a configuração apropriada para esvaziar as pilhas de inventário pré-atribuídas.\n".. - "\n".. - "\n".. - "\n", - "O baú TA4 8x2000 não tem um inventário normal como os outros baús\\, mas tem 8 lojas\\, sendo que cada loja pode armazenar até 2.000 itens de um tipo. Os botões laranja podem ser usados para mover itens de ou para a loja. A caixa também pode ser preenchida ou esvaziada com um empurrador (TA2\\, TA3 ou TA4) como de costume.\n".. - "\n".. - "Se o baú for preenchido com um empurrador\\, todos os depósitos serão preenchidos da esquerda para a direita. Se todos os 8 depósitos estiverem cheios e nenhum outro item puder ser adicionado\\, os itens adicionais serão rejeitados.\n".. - "\n".. - "*Função de linha*\n".. - "\n".. - "Vários baús TA4 8x2000 podem ser conectados a um baú grande com mais conteúdo. Para fazer isso\\, os baús devem ser colocados em uma fileira\\, um após o outro.\n".. - "\n".. - "Primeiro\\, o baú da frente deve ser colocado e\\, em seguida\\, os baús empilhados são colocados atrás com a mesma direção de visão (todas as caixas têm a frente voltada para o jogador). Com 2 baús em uma fileira\\, o tamanho aumenta para 8x4000\\, etc.\n".. - "\n".. - "As fileiras de baús não podem mais ser removidas. Há duas maneiras de desmontar os baús:\n".. - "\n".. - " - Esvazie e remova o baú da frente. Isso desbloqueia o próximo baú e pode ser removido.\n".. - " - Esvazie o baú da frente até o ponto em que todas as lojas contenham no máximo 2.000 itens. Isso desbloqueia o próximo baú e pode ser removido.\n".. - "\n".. - "Os baús têm uma caixa de seleção de \"pedido\". Se essa caixa de seleção for ativada\\, os depósitos não serão mais completamente esvaziados por um empurrador. O último item permanece no depósito como padrão. Isso resulta em uma atribuição fixa de itens aos locais de armazenamento.\n".. - "\n".. - "O baú só pode ser usado por jogadores que podem construir nesse local\\, ou seja\\, que têm direitos de proteção. Não importa quem coloca o baú.\n".. - "\n".. - "O baú tem um comando adicional para o controlador Lua:\n".. - "\n".. - " - 'count' é usado para solicitar quantos itens estão no baú.\nExemplo 1: '$send_cmnd(CHEST\\, \"count\")' -> Soma dos itens em todas as 8 lojas\nExemplo 2: '$send_cmnd(CHEST\\, \"count\"\\, 2)' -> número de itens na loja 2 (segunda a partir da esquerda)\n".. - " - 'storesize' é usado para ler o tamanho de um dos oito armazenamentos:\nExemplo: '$send_cmnd(CHEST\\, \"storesize\")' -> a função retorna\\, por exemplo\\, 6000\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A capacidade de processamento é de 24 itens a cada 4 s\\, desde que os tubos TA4 sejam usados em todos os lados. Caso contrário\\, haverá apenas 12 itens a cada 4 s.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do distribuidor TA4 normal\\, com duas diferenças:\n".. - "A capacidade de processamento é de 36 itens a cada 4 s\\, desde que os tubos TA4 sejam usados em todos os lados. Caso contrário\\, haverá apenas 18 itens a cada 4 s.\n".. - "Além disso\\, até 8 itens podem ser configurados por direção.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A capacidade de processamento é de 4 itens a cada 4 s. O bloco requer 5 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2.\n".. - "A capacidade de processamento é de 4 itens a cada 4 s. O bloco requer 9 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde em grande parte à do TA2.\n".. - "\n".. - "Além disso\\, o tamanho do furo pode ser definido entre blocos de 3x3 e 11x11.\n".. - "A profundidade máxima é de 80 metros. A pedreira requer 14 ku de eletricidade.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA2\\, apenas chips diferentes são produzidos aqui.\n".. - "A capacidade de processamento é de um chip a cada 6 s. O bloco requer 12 ku de eletricidade para isso.\n".. - "\n".. - "\n".. - "\n", - "A função corresponde à do TA3.\n".. - "\n".. - "O poder de processamento é de até 8 vezes quatro itens a cada 4 segundos.\n".. - "\n".. - "\n".. - "\n", - "O reciclador é uma máquina que processa todas as receitas de Techage de trás para frente\\, ou seja\\, pode desmontar máquinas e blocos e transformá-los em seus componentes. \n".. - "\n".. - "A máquina pode desmontar praticamente todos os blocos da Techage e do Hyperloop. Mas nem todos os itens/materiais da receita podem ser reciclados:\n".. - "\n".. - " - A madeira se transforma em gravetos\n".. - " - A pedra se transforma em areia ou cascalho\n".. - " - Os semicondutores/chips não podem ser reciclados\n".. - " - As ferramentas não podem ser recicladas\n".. - "\n".. - "A capacidade de processamento é de um item a cada 8 s. O bloco requer 16 ku de eletricidade para isso.\n".. - "\n".. - " \n".. - "\n", - }, - images = { - "techage_ta4", - "", - "ta4_windturbine", - "ta4_nacelle", - "ta4_blinklamp", - "ta4_pillar", - "", - "ta4_solarmodule", - "ta4_solarcarrier", - "ta4_solar_inverter", - "ta4_powercable", - "ta4_powerbox", - "ta4_minicell", - "", - "ta4_heatexchanger", - "ta4_turbine", - "ta4_generator", - "ta4_pipeinlet", - "ta4_pipe", - "ta4_transformer", - "ta4_transformer", - "ta4_electricmeter", - "ta4_laser", - "ta4_hydrogen", - "ta4_electrolyzer", - "ta4_fuelcell", - "", - "ta4_doser", - "ta4_reactor", - "ta4_fillerpipe", - "ta4_reactorstand", - "ta4_reactorbase", - "ta4_silo", - "ta4_icta_controller", - "ta4_icta_controller", - "ta4_battery", - "ta4_display", - "ta4_displayXL", - "ta4_signaltower", - "ta4_lua_controller", - "ta4_lua_server", - "ta4_sensor_chest", - "ta4_terminal", - "", - "ta4_button", - "ta4_button_2x", - "ta4_button_4x", - "ta4_signallamp_2x", - "ta4_signallamp_4x", - "ta4_playerdetector", - "ta4_collector", - "ta4_detector", - "ta4_nodedetector", - "ta4_chargedetector", - "ta4_gaze_sensor", - "ta4_sequencer", - "", - "ta4_movecontroller", - "ta4_turncontroller", - "", - "ta4_growlight", - "ta4_streetlamp", - "ta4_industriallamp", - "ta4_liquid_filter", - "", - "", - "", - "", - "", - "ta4_terminal", - "", - "techage_ta4c", - "", - "ta4_recipeblock", - "ta4_autocrafter", - "ta4_tank", - "ta4_pump", - "ta4_furnaceheater", - "", - "ta4_waterinlet", - "ta4_tube", - "ta4_pusher", - "ta4_chest", - "ta4_8x2000_chest", - "ta4_distributor", - "ta4_high_performance_distributor", - "ta4_gravelsieve", - "ta4_grinder", - "ta4_quarry", - "ta4_electronicfab", - "ta4_injector", - "ta4_recycler", - }, - plans = { - "", - "ta4_windturbine", - "", - "", - "", - "", - "ta4_solarplant", - "", - "", - "", - "", - "", - "", - "ta4_storagesystem", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_reactor", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta4_liquid_filter_base", - "ta4_liquid_filter_gravel", - "ta4_liquid_filter_top", - "techage_collider_plan", - "ta4_cooler", - "", - "techage_collider_plan2", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta5_DE.lua b/techage/doc/manual_ta5_DE.lua deleted file mode 100644 index 55f5d0c..0000000 --- a/techage/doc/manual_ta5_DE.lua +++ /dev/null @@ -1,219 +0,0 @@ -return { - titles = { - "1,TA5: Zukunft", - "2,Energiequellen", - "3,TA5 Fusionsreaktor", - "4,TA5 Fusionreaktor Magnet", - "4,TA5 Pumpe", - "4,TA5 Wärmetauscher", - "4,TA5 Fusionreaktor Controller", - "4,TA5 Fusionreaktor Hülle", - "4,TA5 Fusionreaktor Kern", - "2,Energiespeicher", - "3,TA5 Hybrid-Speicher (geplant)", - "2,Logik Blöcke", - "2,Transport und Verkehr", - "3,TA5 Flug Controller", - "3,TA5 Hyperloop Kiste / TA5 Hyperloop Chest", - "3,TA5 Hyperloop Tank / TA5 Hyperloop Tank", - "3,TA5-Raumgleiter (geplant)", - "2,Teleport Blöcke", - "3,TA5 Teleport Block Gegenstände / TA5 Teleport Block Items", - "3,TA5 Teleport Block Flüssigkeiten / TA5 Teleport Block Liquids", - "3,Hyperloop Teleport Blöcke (geplant)", - "2,Weitere TA5 Blöcke/Items", - "3,TA5 Container (geplant)", - "3,TA5 KI Chip / TA5 AI Chip", - "3,TA5 KI Chip II / TA5 AI Chip II", - }, - texts = { - "Maschinen zur Überwindung von Raum und Zeit\\, neue Energiequellen und andere Errungenschaften prägen dein Leben. \n".. - "\n".. - "Für die Herstellung und Nutzung von TA5 Maschinen und Blöcken sind Erfahrungspunkte (experience points) notwendig. Diese können nur über den Teilchenbeschleuniger aus TA4 erarbeitet werden.\n".. - "\n".. - "\n".. - "\n", - "", - "Kernfusion bedeutet das Verschmelzen zweier Atomkerne. Dabei können\\, je nach Reaktion\\, große Mengen von Energie freigesetzt werden. Kernfusionen\\, bei denen Energie frei wird\\, laufen in Form von Kettenreaktionen ab. Sie sind die Quelle der Energie der Sterne\\, zum Beispiel auch unserer Sonne. Ein Fusionsreaktor wandelt die Energie\\, die bei einer kontrollierten Kernfusion frei wird\\, in elektrischen Strom um.\n".. - "\n".. - "*Wie funktionieren ein Fusionsreaktor?*\n".. - "\n".. - "Ein Fusionsreaktor funktioniert nach dem klassischen Prinzip eines Wärmekraftwerks: Wasser wird erhitzt und treibt eine Dampfturbine an\\, deren Bewegungsenergie von einem Generator in Strom gewandelt wird.\n".. - "\n".. - "Ein Fusionskraftwerk benötigt zunächst eine hohe Menge an Energie\\, da ein Plasma erzeugt werden muss. „Plasma“ nennt man den vierten Zustand von Stoffen\\, nach fest\\, flüssig und gasförmig. Dafür wird viel Strom benötigt. Erst durch diese extreme Energiekonzentration zündet die Fusionsreaktion und mit der abgegebenen Wärme wird über den Wärmetauscher Strom erzeugt. Der Generator liefert dann 800 ku an Strom.\n".. - "\n".. - "Der Plan rechts zeigt einen Schnitt durch den Fusionsreaktor.\n".. - "\n".. - "Für den Betrieb des Fusionsreaktors werden 60 Erfahrungspunkte benötigt. Der Fusionsreaktur muss komplett in einem Forceload Block Bereich aufgebaut werden.\n".. - "\n".. - "\n".. - "\n", - "Für den Aufbau des Fusionsreaktor werden insgesamt 60 TA5 Fusionreaktor Magnete benötigt. Diese bilden den Ring\\, in dem sich das Plasma bildet. Der TA5 Fusionsreaktor Magnete benötigt Strom und hat zwei Anschlüsse für die Kühlung.\n".. - "\n".. - "Es gibt zwei Typen von Magneten\\, so dass auch alle Seiten des Magnets\\, die zum Plasmaring zeigen\\, mit einem Hitzeschild geschützt werden können.\n".. - "\n".. - "Bei den Eckmagneten auf der Innenseite des Rings ist jeweils eine Anschlussseite verdeckt (Strom oder Kühlung) und kann daher nicht angeschlossen werden. Dies ist technisch nicht machbar und hat daher keinen Einfluß auf die Funktion des Fusionsreaktor. \n".. - "\n".. - "\n".. - "\n", - "Die Pumpe wird benötigt\\, um den Kühlkreislauf mit Isobutan zu füllen. Es werden ca. 350 Einheiten Isobutan benötigt.\n".. - "\n".. - "Hinweis: Die TA5 Pumpe kann nur zum Füllen des Kühlkreislaufs genutzt werden\\, ein Abpumpen des Kühlmittels ist nicht möglich. Daher sollte die Pumpe erst eingeschaltet werden\\, wenn die Magnete korrekt platziert und alle Strom- und Kühlleitungen angeschlossen sind.\n".. - "\n".. - "\n".. - "\n", - "Der TA5 Wärmetauscher wird benötigt\\, um die im Fusionsreaktor erzeugte Hitze zuerst in Dampf und dann in Strom umzuwandeln. Der Wärmetauscher selbst benötigt dazu 5 ku Strom. Der Aufbau gleicht dem Wärmetauscher des Energiespeichers aus TA4.\n".. - "\n".. - "Hinweis: Der TA5 Wärmetauscher hat zwei Anschlüsse (blau und grün) für den Kühlkreislauf. Über die grünen und blauen Röhren müssen der Wärmetauscher und alle Magnete zu einem Kühlkreislauf verbunden werden.\n".. - "\n".. - "Über den Start-Button des Wärmetauschers kann der Kühlkreislauf auf Vollständigkeit geprüft werden\\, auch wenn noch kein Kühlmittel eingefüllt wurde.\n".. - "\n".. - "\n".. - "\n", - "Über den TA5 Fusionreaktor Controller wird der Fusionreaktors eingeschaltet. Dabei muss zuerst die Kühlung/Wärmetauscher und dann der Controller eingeschaltet werden. Es dauert ca. 2 min\\, bis der Reaktor in Gang kommt und Strom liefert. Der Fusionreaktor und damit der Controller benötigt 400 ku an Strom\\, um das Plasma aufrecht zu erhalten.\n".. - "\n".. - "\n".. - "\n", - "Der komplette Reaktor muss mit einer Hülle umgeben werden\\, die den enormen Druck\\, den die Magnete auf das Plasma ausüben\\, abfängt und die Umgebung vor Strahlung schützt. Ohne diese Hülle kann der Reaktor nicht gestartet werden. Mit der TechAge Kelle können auch Stromkabel und Kühlleitungen des Fusionreaktors in die Hülle integriert werden.\n".. - "\n".. - "\n".. - "\n", - "Der Kern muss in der Mitte des Reaktors sitzen. Siehe Abbildung unter \"TA5 Fusionsreaktor\". Auch hierfür wird die TechAge Kelle benötigt.\n".. - "\n".. - "\n".. - "\n", - "", - "", - "", - "", - "Der TA5 Flug Controller ist ähnlich zum TA4 Move Controller. Im Gegensatz zum TA4 Move Controller können hier mehrere Bewegungen zu einer Flugstrecke kombiniert werden. Diese Flugstrecke kann im Eingabefeld über mehrere x\\,y\\,z Angaben definiert werden (eine Bewegung pro Zeile). Über \"Speichern\" wird die Flugstrecke geprüft und gespeichert. Bei einem Fehler wird eine Fehlermeldung ausgegeben.\n".. - "\n".. - "Mit der Taste \"Test\" wird die Flugstrecke mit den absoluten Koordinaten zur Überprüfung im Chat ausgegeben.\n".. - "\n".. - "Die maximale Distanz für die gesammte Flugstrecke beträgt 1500 m. Es können bis zu 32 Blöcke antrainiert werden.\n".. - "\n".. - "Die Nutzung des TA5 Flug Controllers benötigt 40 Erfahrungspunkte.\n".. - "\n".. - "*Teleport Mode*\n".. - "\n".. - "Wird der 'Teleport Mode' aktiviert (auf 'enable' gesetzt)\\, kann ein Spieler auch ohne Blöcke bewegt werden. Dazu muss die Startposition über die Taste \"Aufzeichnen\" konfiguriert werden. Es kann hier nur eine Position konfiguriert werden. Das Spieler\\, der bewegt werden soll\\, muss dazu auf dieser Position stehen. \n".. - "\n".. - "\n".. - "\n", - "Die TA5 Hyperloop Kiste erlaubt den Transport von Gegenständen über ein Hyperloop Netzwerk.\n".. - "\n".. - "Die TA5 Hyperloop Kiste muss man dazu auf eine Hyperloop Junction stellen. Die Kiste besitzt ein spezielles Menü\\, mit dem man das Pairing von zwei Kisten durchführen kann. Dinge\\, die in der Kiste sind\\, werden zur Gegenstelle teleportiert. Die Kiste kann auch mit einem Schieber gefüllt/geleert werden.\n".. - "\n".. - "Für das Pairing musst du zuerst auf der einen Seite einen Namen für die Kiste eingeben\\, dann kannst du bei der anderen Kiste diesen Namen auswählen und so die beiden Blöcke verbinden.\n".. - "\n".. - "Die Nutzung der TA5 Hyperloop Kiste benötigt 15 Erfahrungspunkte.\n".. - "\n".. - "\n".. - "\n", - "Der TA5 Hyperloop Tank erlaubt den Transport von Flüssigkeiten über ein Hyperloop Netzwerk.\n".. - "\n".. - "Den TA5 Hyperloop Tank muss man dazu auf eine Hyperloop Junction stellen. Der Tank besitzt ein spezielles Menü\\, mit dem man das Pairing von zwei Tanks durchführen kann. Flüssigkeiten\\, die in dem Tank sind\\, werden zur Gegenstelle teleportiert. Der Tank kann auch mit einer Pumpe gefüllt/geleert werden.\n".. - "\n".. - "Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Tank eingeben\\, dann kannst du bei dem anderen Tank diesen Namen auswählen und so die beiden Blöcke verbinden.\n".. - "\n".. - "Die Nutzung des TA5 Hyperloop Tanks benötigt 15 Erfahrungspunkte.\n".. - "\n".. - "\n".. - "\n", - "Dank einem Spezialantrieb für Lichtgeschwindigkeit können mit dem Raumgleiter auch große Entfernungen sehr schnell überwunden werden.\n".. - "\n", - "Mit Teleport-Blöcken können Dinge zwischen zwei Teleport-Blöcken übertragen werden\\, ohne dass sich dazwischen eine Röhre oder Leitung befinden muss. Für das Pairing der Blöcke musst du zuerst auf der einen Seite einen Namen für den Block eingeben\\, dann kannst du bei dem anderen Block diesen Namen auswählen und so die beiden Blöcke verbinden. Das Pairung kann nur von einem Spieler durchgeführt werden (Spielername wird geprüft) und muss vor einem Server-Neustart abgeschlossen sein. Anderenfalls gehen die Pairing-Daten verloren.\n".. - "\n".. - "Der Plan rechts zeigt\\, wie die Blöcke genutzt werden können.\n".. - "\n".. - "\n".. - "\n", - "Diese Teleport-Blöcke erlauben die Übertragung von Gegenständen und ersetzen somit eine Röhre. Dabei können Entfernungen von bis zu 500 Blöcken überbrückt werden.\n".. - "\n".. - "Ein Teleport-Block benötigt 12 ku Strom.\n".. - "\n".. - "Für die Nutzung der Teleport-Blöcke werden 30 Erfahrungspunkte benötigt.\n".. - "\n".. - "\n".. - "\n", - "Diese Teleport-Blöcke erlauben die Übertragung von Flüssigkeiten und ersetzen somit eine gelbe Leitung. Dabei können Entfernungen von bis zu 500 Blöcken überbrückt werden.\n".. - "\n".. - "Ein Teleport-Block benötigt 12 ku Strom.\n".. - "\n".. - "Für die Nutzung der Teleport-Blöcke werden 30 Erfahrungspunkte benötigt.\n".. - "\n".. - "\n".. - "\n", - "Die Hyperloop Teleport Blöcke erlauben den Aufbau von Hyperloop Netzwerk ohne Hyperloop-Röhren.\n".. - "\n".. - "Die Nutzung der Hyperloop Teleport Blöcke benötigt 60 Erfahrungspunkte.\n".. - "\n", - "", - "Der TA5 Container erlaubt Techage Anlagen ein- und an einer anderen Stelle wieder auszupacken.\n".. - "\n".. - "Für die Nutzung des TA5 Containers werden 80 Erfahrungspunkte benötigt.\n".. - "\n", - "Der TA5 KI Chip wird teilweise zur Herstellung von TA5 Blöcken benötigt. Der TA5 KI Chip kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 10 Erfahrungspunkte benötigt.\n".. - "\n".. - "\n".. - "\n", - "Der TA5 KI Chip II wird zur Herstellung des TA5 Fusionsreaktors benötigt. Der TA5 KI Chip II kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 25 Erfahrungspunkte benötigt.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta5", - "", - "", - "ta5_magnet", - "ta5_pump", - "", - "ta5_fr_controller", - "ta5_fr_shell", - "ta5_fr_nucleus", - "", - "", - "", - "", - "ta5_flycontroller", - "ta5_chest", - "ta5_tank", - "", - "", - "ta5_tele_tube", - "ta5_tele_pipe", - "", - "", - "", - "ta5_aichip", - "ta5_aichip2", - }, - plans = { - "", - "", - "ta5_fusion_reactor", - "", - "", - "ta5_heatexchanger", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta5_teleport", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta5_EN.lua b/techage/doc/manual_ta5_EN.lua deleted file mode 100644 index 21924bd..0000000 --- a/techage/doc/manual_ta5_EN.lua +++ /dev/null @@ -1,214 +0,0 @@ -return { - titles = { - "1,TA5: Future", - "2,Energy Sources", - "3,TA5 Fusion Reactor", - "4,TA5 Fusion Reactor Magnet", - "4,TA5 Pump", - "4,TA5 Heat Exchanger", - "4,TA5 Fusion Reactor Controller", - "4,TA5 Fusion Reactor Shell", - "4,TA5 Fusion Reactor Core", - "2,Energy Storage", - "3,TA5 Hybrid Storage (planned)", - "2,Logic blocks", - "2,Transport and Traffic", - "3,TA5 Flight Controller", - "3,TA5 Hyperloop Chest", - "3,TA5 Hyperloop Tank", - "2,Teleport Blocks", - "3,TA5 Teleport Block Items", - "3,TA5 Teleport Block Liquids", - "3,Hyperloop Teleport Blocks (planned)", - "2,More TA5 Blocks/Items", - "3,TA5 Container (planned)", - "3,TA5 AI Chip", - "3,TA5 AI Chip II", - }, - texts = { - "Machines to overcome space and time\\, new sources of energy and other achievements shape your life.\n".. - "\n".. - "Experience points are required for the manufacture and use of TA5 machines and blocks. These can only be worked out using the collider from TA4.\n".. - "\n".. - "\n".. - "\n", - "", - "Nuclear fusion means the fusing of two atomic nuclei. Depending on the reaction\\, large amounts of energy can be released. Nuclear fusions\\, in which energy is released\\, take place in the form of chain reactions. They are the source of the energy of the stars\\, including our sun\\, for example. A fusion reactor converts the energy released during controlled nuclear fusion into electricity.\n".. - "\n".. - "*How ​​do fusion reactors work?*\n".. - "\n".. - "A fusion reactor works according to the classic principle of a thermal power plant: water is heated and drives a steam turbine\\, whose kinetic energy is converted into electricity by a generator.\n".. - "\n".. - "A fusion power plant initially requires a large amount of energy\\, since a plasma has to be generated. \"Plasma\" is the name given to the fourth state of matter\\, after solid\\, liquid and gaseous. This requires a lot of electricity. Only through this extreme concentration of energy does the fusion reaction ignite and the heat given off is used to generate electricity via the heat exchanger. The generator then delivers 800 ku of electricity.\n".. - "\n".. - "The plan on the right shows a section through the fusion reactor.\n".. - "\n".. - "60 experience points are required to operate the fusion reactor. The fusion reactor must be built entirely in a forceload block area.\n".. - "\n".. - "\n".. - "\n", - "A total of 60 TA5 Fusion Reactor Magnets are required to set up the fusion reactor. These form the ring in which the plasma forms. The TA5 Fusion Reactor Magnets requires power and has two ports for cooling.\n".. - "\n".. - "There are two types of magnets\\, so all sides of the magnet that face the plasma ring can also be protected with a heat shield.\n".. - "\n".. - "With the corner magnets on the inside of the ring\\, one connection side is covered (power or cooling) and can therefore not be connected. This is technically not feasible and therefore has no influence on the function of the fusion reactor. \n".. - "\n".. - "\n".. - "\n", - "The pump is required to fill the cooling circuit with isobutane. About 350 units of isobutane are required.\n".. - "\n".. - "Note: The TA5 pump can only be used to fill the cooling circuit\\, pumping out the coolant is not possible. Therefore\\, the pump should not be switched on until the magnets are correctly placed and all power and cooling lines are connected.\n".. - "\n".. - "\n".. - "\n", - "The TA5 Heat Exchanger is required to convert the heat generated in the fusion reactor first to steam and then to electricity. The Heat Exchanger itself requires 5 ku electricity. The structure is similar to the Heat Exchanger of the energy store from TA4.\n".. - "\n".. - "Note: The TA5 Heat Exchanger has two connections (blue and green) for the cooling circuit. The heat exchanger and all magnets must be connected to form a cooling circuit via the green and blue pipes.\n".. - "\n".. - "The cooling circuit can be checked for completeness using the start button on the heat exchanger\\, even if no coolant has yet been filled in.\n".. - "\n".. - "\n".. - "\n", - "The fusion reactor is switched on via the TA5 Fusion Reactor Controller. The cooling/Heat Exchanger must be switched on first and then the controller. It takes about 2 minutes for the reactor to start up and supply electricity. The fusion reactor and thus the controller requires 400 ku of electricity to maintain the plasma.\n".. - "\n".. - "\n".. - "\n", - "The entire reactor must be surrounded by a shell that absorbs the enormous pressure that the magnets exert on the plasma and protects the environment from radiation. Without this shell\\, the reactor cannot be started. With the TechAge Trowel\\, power cables and cooling pipes of the fusion reactor can also be integrated into the shell.\n".. - "\n".. - "\n".. - "\n", - "The core must sit in the center of the reactor. See illustration under \"TA5 Fusion Reactor\". The TechAge Trowel is also required for this.\n".. - "\n".. - "\n".. - "\n", - "", - "", - "", - "", - "The TA5 Flight Controller is similar to the TA4 Move Controller. In contrast to the TA4 Move Controller\\, several movements can be combined into one flight route. This flight route can be defined in the input field using several x\\,y\\,z entries (one movement per line). The flight route is checked and saved via \"Save\". In the event of an error\\, an error message is issued.\n".. - "\n".. - "With the \"Test\" button\\, the flight route with the absolute coordinates is output for checking in the chat.\n".. - "\n".. - "The maximum distance for the entire flight distance is 1500 m. Up to 32 blocks can be trained.\n".. - "\n".. - "The use of the TA5 Flight Controller requires 40 experience points.\n".. - "\n".. - "*Teleport mode*\n".. - "\n".. - "If the 'Teleport Mode' is enabled\\, a player can also be moved without blocks. To do this\\, the start position must be configured using the \"Record\" button. Only one position can be configured here. The player to be moved must be in that position.\n".. - "\n".. - "\n".. - "\n", - "The TA5 Hyperloop Chest allows objects to be transported over a Hyperloop network.\n".. - "\n".. - "The TA5 Hyperloop Chest has to be placed on a Hyperloop Junction. The chest has a special menu\\, with which you can pair two chests. Things that are in the chest are teleported to the remote station. The chest can also be filled/emptied with a pusher.\n".. - "\n".. - "For pairing you first have to enter a name for the chest on one side\\, then you can select this name for the other chest and thus connect the two blocks.\n".. - "\n".. - "The use of the TA5 Hyperloop Chest requires 15 experience points.\n".. - "\n".. - "\n".. - "\n", - "The TA5 Hyperloop Tank allows liquids to be transported over a Hyperloop network.\n".. - "\n".. - "The TA5 Hyperloop Tank has to be placed on a Hyperloop Junction.The tank has a special menu\\, with which you can pair two tanks. Liquids in the tank will be teleported to the remote station. The tank can also be filled/emptied with a pump.\n".. - "\n".. - "For pairing you first have to enter a name for the tank on one side\\, then you can select this name for the other tank and thus connect the two blocks.\n".. - "\n".. - "The use of the TA5 Hyperloop Tank requires 15 experience points.\n".. - "\n".. - "\n".. - "\n", - "Teleport blocks allow things to be transferred between two teleport blocks without the need for a pipe or tube in between. To pair the blocks\\, you first have to enter a name for the block on one side\\, then you can select this name for the other block and thus connect the two blocks. Pairing can only be carried out by one player (player name is checked) and must be completed before the server is restarted. Otherwise the pairing data will be lost.\n".. - "\n".. - "The map on the right shows how the blocks can be used. \n".. - "\n".. - "\n".. - "\n", - "These teleport blocks allow the transfer of items and thus replace a tube. Distances of up to 500 blocks can be bridged.\n".. - "\n".. - "Each Teleport blocks requires 12 ku of electricity.\n".. - "\n".. - "30 experience points are required to use the teleport blocks. \n".. - "\n".. - "\n".. - "\n", - "These teleport blocks allow the transfer of liquids and thus replace a pipe. Distances of up to 500 blocks can be bridged.\n".. - "\n".. - "Each Teleport blocks requires 12 ku of electricity.\n".. - "\n".. - "30 experience points are required to use the teleport blocks. \n".. - "\n".. - "\n".. - "\n", - "The Hyperloop Teleport Blocks allow the construction of a Hyperloop network without Hyperloop tubes.\n".. - "\n".. - "The use of the Hyperloop Teleport Blocks requires 60 experience points.\n".. - "\n", - "", - "The TA5 container allows Techage systems to be packed and unpacked at another location.\n".. - "\n".. - "80 experience points are required to use the TA5 container.\n".. - "\n", - "The TA5 AI Chip is partly required for the production of TA5 blocks. The TA5 AI Chip can only be manufactured at the TA4 Electronics Fab. This requires 10 experience points.\n".. - "\n".. - "\n".. - "\n", - "The TA5 AI Chip II is required to build the TA5 Fusion Reactor. The TA5 AI Chip II can only be manufactured at the TA4 Electronics Fab. This requires 25 experience points.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta5", - "", - "", - "ta5_magnet", - "ta5_pump", - "", - "ta5_fr_controller", - "ta5_fr_shell", - "ta5_fr_nucleus", - "", - "", - "", - "", - "ta5_flycontroller", - "ta5_chest", - "ta5_tank", - "", - "ta5_tele_tube", - "ta5_tele_pipe", - "", - "", - "", - "ta5_aichip", - "ta5_aichip2", - }, - plans = { - "", - "", - "ta5_fusion_reactor", - "", - "", - "ta5_heatexchanger", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta5_teleport", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta5_RU.lua b/techage/doc/manual_ta5_RU.lua deleted file mode 100644 index 21924bd..0000000 --- a/techage/doc/manual_ta5_RU.lua +++ /dev/null @@ -1,214 +0,0 @@ -return { - titles = { - "1,TA5: Future", - "2,Energy Sources", - "3,TA5 Fusion Reactor", - "4,TA5 Fusion Reactor Magnet", - "4,TA5 Pump", - "4,TA5 Heat Exchanger", - "4,TA5 Fusion Reactor Controller", - "4,TA5 Fusion Reactor Shell", - "4,TA5 Fusion Reactor Core", - "2,Energy Storage", - "3,TA5 Hybrid Storage (planned)", - "2,Logic blocks", - "2,Transport and Traffic", - "3,TA5 Flight Controller", - "3,TA5 Hyperloop Chest", - "3,TA5 Hyperloop Tank", - "2,Teleport Blocks", - "3,TA5 Teleport Block Items", - "3,TA5 Teleport Block Liquids", - "3,Hyperloop Teleport Blocks (planned)", - "2,More TA5 Blocks/Items", - "3,TA5 Container (planned)", - "3,TA5 AI Chip", - "3,TA5 AI Chip II", - }, - texts = { - "Machines to overcome space and time\\, new sources of energy and other achievements shape your life.\n".. - "\n".. - "Experience points are required for the manufacture and use of TA5 machines and blocks. These can only be worked out using the collider from TA4.\n".. - "\n".. - "\n".. - "\n", - "", - "Nuclear fusion means the fusing of two atomic nuclei. Depending on the reaction\\, large amounts of energy can be released. Nuclear fusions\\, in which energy is released\\, take place in the form of chain reactions. They are the source of the energy of the stars\\, including our sun\\, for example. A fusion reactor converts the energy released during controlled nuclear fusion into electricity.\n".. - "\n".. - "*How ​​do fusion reactors work?*\n".. - "\n".. - "A fusion reactor works according to the classic principle of a thermal power plant: water is heated and drives a steam turbine\\, whose kinetic energy is converted into electricity by a generator.\n".. - "\n".. - "A fusion power plant initially requires a large amount of energy\\, since a plasma has to be generated. \"Plasma\" is the name given to the fourth state of matter\\, after solid\\, liquid and gaseous. This requires a lot of electricity. Only through this extreme concentration of energy does the fusion reaction ignite and the heat given off is used to generate electricity via the heat exchanger. The generator then delivers 800 ku of electricity.\n".. - "\n".. - "The plan on the right shows a section through the fusion reactor.\n".. - "\n".. - "60 experience points are required to operate the fusion reactor. The fusion reactor must be built entirely in a forceload block area.\n".. - "\n".. - "\n".. - "\n", - "A total of 60 TA5 Fusion Reactor Magnets are required to set up the fusion reactor. These form the ring in which the plasma forms. The TA5 Fusion Reactor Magnets requires power and has two ports for cooling.\n".. - "\n".. - "There are two types of magnets\\, so all sides of the magnet that face the plasma ring can also be protected with a heat shield.\n".. - "\n".. - "With the corner magnets on the inside of the ring\\, one connection side is covered (power or cooling) and can therefore not be connected. This is technically not feasible and therefore has no influence on the function of the fusion reactor. \n".. - "\n".. - "\n".. - "\n", - "The pump is required to fill the cooling circuit with isobutane. About 350 units of isobutane are required.\n".. - "\n".. - "Note: The TA5 pump can only be used to fill the cooling circuit\\, pumping out the coolant is not possible. Therefore\\, the pump should not be switched on until the magnets are correctly placed and all power and cooling lines are connected.\n".. - "\n".. - "\n".. - "\n", - "The TA5 Heat Exchanger is required to convert the heat generated in the fusion reactor first to steam and then to electricity. The Heat Exchanger itself requires 5 ku electricity. The structure is similar to the Heat Exchanger of the energy store from TA4.\n".. - "\n".. - "Note: The TA5 Heat Exchanger has two connections (blue and green) for the cooling circuit. The heat exchanger and all magnets must be connected to form a cooling circuit via the green and blue pipes.\n".. - "\n".. - "The cooling circuit can be checked for completeness using the start button on the heat exchanger\\, even if no coolant has yet been filled in.\n".. - "\n".. - "\n".. - "\n", - "The fusion reactor is switched on via the TA5 Fusion Reactor Controller. The cooling/Heat Exchanger must be switched on first and then the controller. It takes about 2 minutes for the reactor to start up and supply electricity. The fusion reactor and thus the controller requires 400 ku of electricity to maintain the plasma.\n".. - "\n".. - "\n".. - "\n", - "The entire reactor must be surrounded by a shell that absorbs the enormous pressure that the magnets exert on the plasma and protects the environment from radiation. Without this shell\\, the reactor cannot be started. With the TechAge Trowel\\, power cables and cooling pipes of the fusion reactor can also be integrated into the shell.\n".. - "\n".. - "\n".. - "\n", - "The core must sit in the center of the reactor. See illustration under \"TA5 Fusion Reactor\". The TechAge Trowel is also required for this.\n".. - "\n".. - "\n".. - "\n", - "", - "", - "", - "", - "The TA5 Flight Controller is similar to the TA4 Move Controller. In contrast to the TA4 Move Controller\\, several movements can be combined into one flight route. This flight route can be defined in the input field using several x\\,y\\,z entries (one movement per line). The flight route is checked and saved via \"Save\". In the event of an error\\, an error message is issued.\n".. - "\n".. - "With the \"Test\" button\\, the flight route with the absolute coordinates is output for checking in the chat.\n".. - "\n".. - "The maximum distance for the entire flight distance is 1500 m. Up to 32 blocks can be trained.\n".. - "\n".. - "The use of the TA5 Flight Controller requires 40 experience points.\n".. - "\n".. - "*Teleport mode*\n".. - "\n".. - "If the 'Teleport Mode' is enabled\\, a player can also be moved without blocks. To do this\\, the start position must be configured using the \"Record\" button. Only one position can be configured here. The player to be moved must be in that position.\n".. - "\n".. - "\n".. - "\n", - "The TA5 Hyperloop Chest allows objects to be transported over a Hyperloop network.\n".. - "\n".. - "The TA5 Hyperloop Chest has to be placed on a Hyperloop Junction. The chest has a special menu\\, with which you can pair two chests. Things that are in the chest are teleported to the remote station. The chest can also be filled/emptied with a pusher.\n".. - "\n".. - "For pairing you first have to enter a name for the chest on one side\\, then you can select this name for the other chest and thus connect the two blocks.\n".. - "\n".. - "The use of the TA5 Hyperloop Chest requires 15 experience points.\n".. - "\n".. - "\n".. - "\n", - "The TA5 Hyperloop Tank allows liquids to be transported over a Hyperloop network.\n".. - "\n".. - "The TA5 Hyperloop Tank has to be placed on a Hyperloop Junction.The tank has a special menu\\, with which you can pair two tanks. Liquids in the tank will be teleported to the remote station. The tank can also be filled/emptied with a pump.\n".. - "\n".. - "For pairing you first have to enter a name for the tank on one side\\, then you can select this name for the other tank and thus connect the two blocks.\n".. - "\n".. - "The use of the TA5 Hyperloop Tank requires 15 experience points.\n".. - "\n".. - "\n".. - "\n", - "Teleport blocks allow things to be transferred between two teleport blocks without the need for a pipe or tube in between. To pair the blocks\\, you first have to enter a name for the block on one side\\, then you can select this name for the other block and thus connect the two blocks. Pairing can only be carried out by one player (player name is checked) and must be completed before the server is restarted. Otherwise the pairing data will be lost.\n".. - "\n".. - "The map on the right shows how the blocks can be used. \n".. - "\n".. - "\n".. - "\n", - "These teleport blocks allow the transfer of items and thus replace a tube. Distances of up to 500 blocks can be bridged.\n".. - "\n".. - "Each Teleport blocks requires 12 ku of electricity.\n".. - "\n".. - "30 experience points are required to use the teleport blocks. \n".. - "\n".. - "\n".. - "\n", - "These teleport blocks allow the transfer of liquids and thus replace a pipe. Distances of up to 500 blocks can be bridged.\n".. - "\n".. - "Each Teleport blocks requires 12 ku of electricity.\n".. - "\n".. - "30 experience points are required to use the teleport blocks. \n".. - "\n".. - "\n".. - "\n", - "The Hyperloop Teleport Blocks allow the construction of a Hyperloop network without Hyperloop tubes.\n".. - "\n".. - "The use of the Hyperloop Teleport Blocks requires 60 experience points.\n".. - "\n", - "", - "The TA5 container allows Techage systems to be packed and unpacked at another location.\n".. - "\n".. - "80 experience points are required to use the TA5 container.\n".. - "\n", - "The TA5 AI Chip is partly required for the production of TA5 blocks. The TA5 AI Chip can only be manufactured at the TA4 Electronics Fab. This requires 10 experience points.\n".. - "\n".. - "\n".. - "\n", - "The TA5 AI Chip II is required to build the TA5 Fusion Reactor. The TA5 AI Chip II can only be manufactured at the TA4 Electronics Fab. This requires 25 experience points.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta5", - "", - "", - "ta5_magnet", - "ta5_pump", - "", - "ta5_fr_controller", - "ta5_fr_shell", - "ta5_fr_nucleus", - "", - "", - "", - "", - "ta5_flycontroller", - "ta5_chest", - "ta5_tank", - "", - "ta5_tele_tube", - "ta5_tele_pipe", - "", - "", - "", - "ta5_aichip", - "ta5_aichip2", - }, - plans = { - "", - "", - "ta5_fusion_reactor", - "", - "", - "ta5_heatexchanger", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta5_teleport", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/manual_ta5_pt-BR.lua b/techage/doc/manual_ta5_pt-BR.lua deleted file mode 100644 index a46e082..0000000 --- a/techage/doc/manual_ta5_pt-BR.lua +++ /dev/null @@ -1,214 +0,0 @@ -return { - titles = { - "1,TA5: Futuro", - "2,Fontes de energia", - "3,Reator de fusão TA5", - "4,Ímã do reator de fusão TA5", - "4,Bomba TA5", - "4,Trocador de calor TA5", - "4,Controlador do reator de fusão TA5", - "4,Carcaça do reator de fusão TA5", - "4,Núcleo do reator de fusão TA5", - "2,Armazenamento de energia", - "3,Armazenamento híbrido TA5 (planejado)", - "2,Blocos lógicos", - "2,Transporte e tráfego", - "3,Controlador de voo TA5", - "3,TA5 Hyperloop Chest", - "3,Tanque de hyperloop TA5", - "2,Blocos de teletransporte", - "3,Itens do bloco de teletransporte TA5", - "3,Líquidos do bloco de teletransporte TA5", - "3,Blocos de teletransporte Hyperloop (planejados)", - "2,Mais blocos/itens TA5", - "3,Contêiner TA5 (planejado)", - "3,Chip TA5 AI", - "3,Chip TA5 AI II", - }, - texts = { - "Máquinas para superar o espaço e o tempo\\, novas fontes de energia e outras conquistas moldam sua vida.\n".. - "\n".. - "São necessários pontos de experiência para a fabricação e o uso de máquinas e blocos TA5. Eles só podem ser calculados usando o colisor do TA4.\n".. - "\n".. - "\n".. - "\n", - "", - "A fusão nuclear significa a fusão de dois núcleos atômicos. Dependendo da reação\\, grandes quantidades de energia podem ser liberadas. As fusões nucleares\\, nas quais a energia é liberada\\, ocorrem na forma de reações em cadeia. Elas são a fonte de energia das estrelas\\, inclusive do nosso sol\\, por exemplo. Um reator de fusão converte a energia liberada durante a fusão nuclear controlada em eletricidade.\n".. - "\n".. - "*Como funcionam os reatores de fusão?*\n".. - "\n".. - "Um reator de fusão funciona de acordo com o princípio clássico de uma usina de energia térmica: a água é aquecida e aciona uma turbina a vapor\\, cuja energia cinética é convertida em eletricidade por um gerador.\n".. - "\n".. - "Uma usina de fusão requer inicialmente uma grande quantidade de energia\\, pois é necessário gerar um plasma. \"Plasma\" é o nome dado ao quarto estado da matéria\\, depois do sólido\\, líquido e gasoso. Isso requer uma grande quantidade de eletricidade. Somente por meio dessa concentração extrema de energia é que a reação de fusão se inflama e o calor liberado é usado para gerar eletricidade por meio do trocador de calor. O gerador fornece então 800 ku de eletricidade.\n".. - "\n".. - "A planta à direita mostra uma seção do reator de fusão.\n".. - "\n".. - "São necessários 60 pontos de experiência para operar o reator de fusão. O reator de fusão deve ser construído inteiramente em uma área de bloco de carga.\n".. - "\n".. - "\n".. - "\n", - "Um total de 60 ímãs de reator de fusão TA5 é necessário para configurar o reator de fusão. Eles formam o anel no qual o plasma se forma. O TA5 Fusion Reactor Magnets requer energia e tem duas portas para resfriamento.\n".. - "\n".. - "Há dois tipos de ímãs\\, portanto\\, todos os lados do ímã voltados para o anel de plasma também podem ser protegidos com um protetor térmico.\n".. - "\n".. - "Com os ímãs de canto na parte interna do anel\\, um lado da conexão é coberto (energia ou resfriamento) e\\, portanto\\, não pode ser conectado. Isso não é tecnicamente viável e\\, portanto\\, não influencia a função do reator de fusão. \n".. - "\n".. - "\n".. - "\n", - "A bomba é necessária para encher o circuito de resfriamento com isobutano. São necessárias cerca de 350 unidades de isobutano.\n".. - "\n".. - "Observação: A bomba TA5 só pode ser usada para encher o circuito de resfriamento\\; não é possível bombear o líquido de arrefecimento para fora. Portanto\\, a bomba não deve ser ligada até que os ímãs estejam corretamente posicionados e todas as linhas de alimentação e resfriamento estejam conectadas.\n".. - "\n".. - "\n".. - "\n", - "O trocador de calor TA5 é necessário para converter o calor gerado no reator de fusão primeiro em vapor e depois em eletricidade. O próprio trocador de calor requer 5 ku de eletricidade. A estrutura é semelhante à do trocador de calor do depósito de energia do TA4.\n".. - "\n".. - "Observação: O trocador de calor TA5 tem duas conexões (azul e verde) para o circuito de resfriamento. O trocador de calor e todos os ímãs devem ser conectados para formar um circuito de resfriamento por meio dos tubos verde e azul.\n".. - "\n".. - "É possível verificar se o circuito de resfriamento está completo usando o botão de partida no trocador de calor\\, mesmo que o líquido de arrefecimento ainda não tenha sido abastecido.\n".. - "\n".. - "\n".. - "\n", - "O reator de fusão é ligado por meio do controlador do reator de fusão TA5. O resfriamento/trocador de calor deve ser ligado primeiro e depois o controlador. Leva cerca de 2 minutos para o reator iniciar e fornecer eletricidade. O reator de fusão e\\, portanto\\, o controlador requerem 400 ku de eletricidade para manter o plasma.\n".. - "\n".. - "\n".. - "\n", - "O reator inteiro deve ser cercado por um invólucro que absorva a enorme pressão que os ímãs exercem sobre o plasma e proteja o ambiente da radiação. Sem esse invólucro\\, o reator não pode ser iniciado. Com a TechAge Trowel\\, os cabos de energia e os tubos de resfriamento do reator de fusão também podem ser integrados à carcaça.\n".. - "\n".. - "\n".. - "\n", - "O núcleo deve ficar no centro do reator. Veja a ilustração em \"TA5 Fusion Reactor\". A espátula TechAge também é necessária para isso.\n".. - "\n".. - "\n".. - "\n", - "", - "", - "", - "", - "O controlador de voo TA5 é semelhante ao controlador de movimento TA4. Ao contrário do TA4 Move Controller\\, vários movimentos podem ser combinados em uma rota de voo. Essa rota de voo pode ser definida no campo de entrada usando várias entradas x\\,y\\,z (um movimento por linha). A rota de voo é verificada e salva por meio de \"Save\" (Salvar). Em caso de erro\\, é emitida uma mensagem de erro.\n".. - "\n".. - "Com o botão \"Test\" (Testar)\\, a rota de voo com as coordenadas absolutas é emitida para verificação no bate-papo.\n".. - "\n".. - "A distância máxima para toda a distância de voo é de 1.500 m. Até 32 blocos podem ser treinados.\n".. - "\n".. - "O uso do controlador de voo TA5 requer 40 pontos de experiência.\n".. - "\n".. - "*Modo teletransporte*\n".. - "\n".. - "Se o \"Teleport Mode\" (Modo de teletransporte) estiver ativado\\, o jogador também poderá ser movido sem blocos. Para fazer isso\\, a posição inicial deve ser configurada usando o botão \"Record\" (Registrar). Somente uma posição pode ser configurada aqui. O jogador a ser movido deve estar nessa posição.\n".. - "\n".. - "\n".. - "\n", - "O TA5 Hyperloop Chest permite que objetos sejam transportados em uma rede Hyperloop.\n".. - "\n".. - "O Baú Hyperloop TA5 deve ser colocado em uma Junção Hyperloop. O baú tem um menu especial\\, com o qual você pode emparelhar dois baús. Os itens que estão no baú são teletransportados para a estação remota. O baú também pode ser preenchido/esvaziado com um empurrador.\n".. - "\n".. - "Para fazer o emparelhamento\\, primeiro você precisa inserir um nome para o baú de um lado e\\, em seguida\\, selecionar esse nome para o outro baú e\\, assim\\, conectar os dois blocos.\n".. - "\n".. - "O uso do Baú do Hyperloop TA5 requer 15 pontos de experiência.\n".. - "\n".. - "\n".. - "\n", - "O TA5 Hyperloop Tank permite o transporte de líquidos em uma rede Hyperloop.\n".. - "\n".. - "O TA5 Hyperloop Tank deve ser colocado em um Hyperloop Junction. O tanque tem um menu especial\\, com o qual você pode emparelhar dois tanques. Os líquidos no tanque serão teletransportados para a estação remota. O tanque também pode ser enchido/esvaziado com uma bomba.\n".. - "\n".. - "Para fazer o emparelhamento\\, primeiro é necessário inserir um nome para o tanque de um lado e\\, em seguida\\, selecionar esse nome para o outro tanque e\\, assim\\, conectar os dois blocos.\n".. - "\n".. - "O uso do TA5 Hyperloop Tank requer 15 pontos de experiência.\n".. - "\n".. - "\n".. - "\n", - "Os blocos de teletransporte permitem a transferência de objetos entre dois blocos de teletransporte sem a necessidade de um cano ou tubo entre eles. Para emparelhar os blocos\\, primeiro é preciso digitar um nome para o bloco de um lado e\\, em seguida\\, selecionar esse nome para o outro bloco e\\, assim\\, conectar os dois blocos. O emparelhamento só pode ser realizado por um jogador (o nome do jogador é verificado) e deve ser concluído antes de o servidor ser reiniciado. Caso contrário\\, os dados de emparelhamento serão perdidos.\n".. - "\n".. - "O mapa à direita mostra como os blocos podem ser usados. \n".. - "\n".. - "\n".. - "\n", - "Esses blocos de teletransporte permitem a transferência de itens e\\, portanto\\, substituem um tubo. Distâncias de até 500 blocos podem ser transpostas.\n".. - "\n".. - "Cada bloco de teletransporte requer 12 ku de eletricidade.\n".. - "\n".. - "São necessários 30 pontos de experiência para usar os blocos de teletransporte. \n".. - "\n".. - "\n".. - "\n", - "Esses blocos de teletransporte permitem a transferência de líquidos e\\, portanto\\, substituem um cano. Distâncias de até 500 blocos podem ser transpostas.\n".. - "\n".. - "Cada bloco de teletransporte requer 12 ku de eletricidade.\n".. - "\n".. - "São necessários 30 pontos de experiência para usar os blocos de teletransporte. \n".. - "\n".. - "\n".. - "\n", - "Os blocos de teletransporte Hyperloop permitem a construção de uma rede Hyperloop sem tubos Hyperloop.\n".. - "\n".. - "O uso dos blocos de teletransporte Hyperloop requer 60 pontos de experiência.\n".. - "\n", - "", - "O contêiner TA5 permite que os sistemas Techage sejam embalados e desembalados em outro local.\n".. - "\n".. - "São necessários 80 pontos de experiência para usar o contêiner TA5.\n".. - "\n", - "O chip TA5 AI é parcialmente necessário para a produção de blocos TA5. O chip de IA TA5 só pode ser fabricado na fábrica de eletrônicos TA4. Isso requer 10 pontos de experiência.\n".. - "\n".. - "\n".. - "\n", - "O TA5 AI Chip II é necessário para construir o Reator de Fusão TA5. O TA5 AI Chip II só pode ser fabricado na fábrica de eletrônicos TA4. Isso requer 25 pontos de experiência.\n".. - "\n".. - "\n".. - "\n", - }, - images = { - "techage_ta5", - "", - "", - "ta5_magnet", - "ta5_pump", - "", - "ta5_fr_controller", - "ta5_fr_shell", - "ta5_fr_nucleus", - "", - "", - "", - "", - "ta5_flycontroller", - "ta5_chest", - "ta5_tank", - "", - "ta5_tele_tube", - "ta5_tele_pipe", - "", - "", - "", - "ta5_aichip", - "ta5_aichip2", - }, - plans = { - "", - "", - "ta5_fusion_reactor", - "", - "", - "ta5_heatexchanger", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "ta5_teleport", - "", - "", - "", - "", - "", - "", - "", - } -} \ No newline at end of file diff --git a/techage/doc/plans.lua b/techage/doc/plans.lua deleted file mode 100644 index 3122f4d..0000000 --- a/techage/doc/plans.lua +++ /dev/null @@ -1,608 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Constructioon Plans for TA machines - -]]-- - -local plans = {} - - -local IMG_1 = {"", "techage_ta1.png"} -local IMG_2 = {"", "techage_ta2.png"} -local IMG_3 = {"", "techage_ta3.png"} -local IMG31 = {"", "techage_ta3b.png"} -local IMG_4 = {"", "techage_ta4.png"} -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 IMG46 = {"5x4", "techage_fusion_reactor.png"} -local IMG47 = {"5x4", "techage_collider_plan2.png"} - -local TOP_V = {"top_view", ""} -local SIDEV = {"side_view", ""} -local SECTV = {"sectional_view", ""} - --- --- TA1: Coal Pile --- -local DDIRT = {"default_dirt.png", "default:dirt"} -local DWOOD = {"default_wood.png" , "default:wood"} -local LIGTR = {"techage_lighter.png", "techage:lighter"} - -plans["coalpile"] = { - {false, false, SIDEV, false, false, false, false, false, TOP_V, false, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, false, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT}, - {DDIRT, DWOOD, DWOOD, DWOOD, DDIRT, false, DDIRT, DWOOD, DWOOD, DWOOD, DDIRT}, - {DDIRT, DWOOD, DWOOD, DWOOD, DDIRT, false, DDIRT, DWOOD, LIGTR, DWOOD, DDIRT}, - {DDIRT, DWOOD, LIGTR, DWOOD, DDIRT, false, DDIRT, DWOOD, DWOOD, DWOOD, DDIRT}, - {DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, false, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT}, - {false, false, false, false, false, false, false, false, false, false, false}, -} - --- --- TA1: Coal Burner --- -local COBBL = {"default_cobble.png", "default:cobble"} -local CCOAL = {"techage_charcoal.png", "techage:charcoal"} -local MEPOT = {"default_cobble.png^techage_meltingpot.png", "techage:meltingpot"} -local FLAME = {"techage_flame.png", nil} - -plans["coalburner"] = { - {false, false, SIDEV, false, false, false, false}, - {false, false, MEPOT, false, false, IMG_1, false}, - {false, false, FLAME, false}, - {false, COBBL, CCOAL, COBBL}, - {false, COBBL, CCOAL, COBBL}, - {false, COBBL, CCOAL, COBBL}, - {false, COBBL, CCOAL, COBBL}, - {false, false, LIGTR, COBBL}, - {false, COBBL, COBBL, COBBL}, -} - --- --- Hopper + Sieve --- -local CHEST = {"default_chest_lock.png", "default:chest_locked"} -local HOPPR = {"techage_hopper.png^[transformFX", "minecart:hopper"} -local SIEVE = {"techage_sieve_sieve_ta1.png", "techage:sieve3"} - -plans["hoppersieve"] = { - {false, false, false, false, false}, - {false, false, false, false, false}, - {false, CHEST, false, false, false}, - {false, HOPPR, SIEVE, false, false}, - {false, false, HOPPR, CHEST, false}, -} - --- --- TA1: Watermill --- -local WATR1 = {"default_water.png" , "techage:water_flowing"} -local WATR3 = {"techage_water_flowing.png" , "techage:water_flowing"} -local WATR4 = {"default_water.png" , "default:water_source"} -local WMILL = {"default_wood.png" , "techage:ta1_board1_apple"} -local SLUC1 = {"techage_sluice2_inv.png" , "techage:ta1_sluice_closed"} -local SLUC2 = {"techage_sluice1_inv.png" , "techage:ta1_sluice_handle_closed"} -local MIL11 = {"techage_watermill1_inv.png" , "techage:ta1_watermill"} -local MIL12 = {"techage_watermill1_inv.png^[transformR90" , "techage:ta1_watermill"} -local MIL13 = {"techage_watermill1_inv.png^[transformR180" , "techage:ta1_watermill"} -local MIL14 = {"techage_watermill1_inv.png^[transformR270" , "techage:ta1_watermill"} -local MIL21 = {"techage_watermill2_inv.png" , "techage:ta1_watermill"} -local MIL22 = {"techage_watermill2_inv.png^[transformR90" , "techage:ta1_watermill"} -local MIL23 = {"techage_watermill2_inv.png^[transformR180" , "techage:ta1_watermill"} -local MIL24 = {"techage_watermill2_inv.png^[transformR270" , "techage:ta1_watermill"} -local MIL31 = {"techage_watermill3_inv.png" , "techage:ta1_watermill"} -local MIL32 = {"techage_watermill3_inv.png^[transformR90" , "techage:ta1_watermill"} -local MIL33 = {"techage_watermill3_inv.png^[transformR180" , "techage:ta1_watermill"} -local MIL34 = {"techage_watermill3_inv.png^[transformR270" , "techage:ta1_watermill"} -local MIL40 = {"techage_watermill4_inv.png" , "techage:ta1_watermill"} -local BEARG = {"default_stone_brick.png^techage_axle_bearing_front.png", "techage:ta1_axle_bearing2"} -local BRICK = {"default_stone_brick.png", "default:stonebrick"} - - -plans["watermill1"] = { - {false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, SLUC2, false, false, false, false, false, false, false, false, false}, - {WATR4, WATR4, SLUC1, WMILL, WMILL, WMILL, WMILL, WMILL, WATR3, false, false, false}, - {WATR4, WATR4, DDIRT, false, false, MIL31, MIL21, MIL11, MIL21, MIL34, false, false}, - {WATR4, DDIRT, DDIRT, false, false, MIL22, MIL40, MIL40, MIL40, MIL24, false, false}, - {DDIRT, DDIRT, DDIRT, DDIRT, false, MIL12, MIL40, BEARG, MIL40, MIL14, false, false}, - {DDIRT, DDIRT, DDIRT, DDIRT, false, MIL22, MIL40, BRICK, MIL40, MIL24, false, false}, - {DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, MIL32, MIL23, BRICK, MIL23, MIL33, false, false}, - {DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, WATR1, WATR1, WATR1, WATR1}, -} - - -local MILLF = {"default_wood.png" , "techage:ta1_watermill"} -local AXLE1 = {"techage_axle_bearing.png", "techage:ta1_axle"} -local MILLG = {"techage_wood50.png^techage_axle_bearing.png", "techage:ta1_mill_gear"} -local MILL_ = {"techage_mill_side.png", "techage:ta1_mill"} -local MILLB = {"default_stone_brick.png", "techage:ta1_mill_base"} -local FURNE = {"default_furnace_front.png", "default:furnace"} -local HOPER = {"techage_hopper.png", "minecart:hopper"} - -plans["watermill2"] = { - {false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, MILLF, false, false, false}, - {false, false, false, false, false, false, false, false, MILLF, false, false, false}, - {false, false, false, false, false, MILLG, AXLE1, BEARG, MILLF, BEARG, false, false}, - {false, false, false, false, false, MILL_, false, BRICK, MILLF, BRICK, false, false}, - {false, CHEST, HOPER, FURNE, HOPER, MILLB, false, BRICK, MILLF, BRICK, false, false}, - {DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, DDIRT, WATR1, DDIRT, DDIRT, DDIRT}, -} - --- --- Steam Engine --- -local PK000 = {"techage_steam_knee.png", "techage:steam_pipeS"} -local PK090 = {"techage_steam_knee.png^[transformR90", "techage:steam_pipeS"} -local PK270 = {"techage_steam_knee.png^[transformR270", "techage:steam_pipeS"} -local PI000 = {"techage_steam_pipe.png", "techage:steam_pipeS"} -local PI090 = {'techage_steam_pipe.png^[transformR90', "techage:steam_pipeS"} -local BOIL1 = {"techage:boiler1", "techage:boiler1"} -local BOIL2 = {"techage:boiler2", "techage:boiler2"} -local FIBOX = {"techage_firebox.png^techage_appl_firehole.png^techage_frame_ta2.png", "techage:firebox"} -local CYLIN = {"techage_filling_ta2.png^techage_cylinder.png^techage_frame_ta2.png", "techage:cylinder"} -local FLYWH = {"techage_filling_ta2.png^techage_frame_ta2.png^techage_flywheel.png^[transformFX]", "techage:flywheel"} - -plans["steamengine"] = { - {false, false, false, false, false, IMG_2, false}, - {false, false, false, false, false, false, false}, - {false, PK000, PI000, PK270, false, false, false}, - {false, BOIL2, false, PI090, false, false, false}, - {false, BOIL1, false, PI090, false, false, false}, - {false, FIBOX, false, PK090, CYLIN, FLYWH, false}, -} - --- --- TA2 Storage --- -local GRBOX = {"techage_filling_ta2.png^techage_axle_gearbox.png^techage_frame_ta2.png", "techage:gearbox"} -local AXL00 = {"techage_axle.png", "techage:axle"} -local AXL90 = {"techage_axle.png^[transformR90", "techage:axle"} -local WINCH = {"techage_filling_ta2.png^techage_appl_winch.png^techage_frame_ta2.png", "techage:ta2_winch"} -local ROPE_ = {"techage_rope_inv.png", "techage:ta2_rope"} -local WCHST = {"techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png^techage_weight_side.png", "techage:ta2_weight_chest"} -local CLTCH = {"techage_filling_ta2.png^techage_appl_clutch.png^techage_frame_ta2.png", "techage:ta2_clutch_off"} - -plans["ta2_storage"] = { - {false, false, false, GRBOX, WINCH, false, SIDEV}, - {false, false, false, AXL90, ROPE_, false, false}, - {false, false, false, AXL90, ROPE_, false, false}, - {false, false, false, AXL90, ROPE_, false, false}, - {false, false, false, AXL90, ROPE_, false, false}, - {false, false, false, AXL90, ROPE_, false, false}, - {false, false, false, AXL90, ROPE_, false, false}, - {false, false, false, AXL90, WCHST, false, false}, - {false, false, false, AXL90, false, false, false}, - {AXL00, CLTCH, AXL00, GRBOX, false, false, false}, -} - --- --- Item Transport --- -local PUSHR = {"techage_appl_pusher.png^techage_frame_ta2.png", "techage:ta2_pusher_pas"} -local TB000 = {"techage_tube_tube.png", "techage:tubeS"} -local GRIND = {"techage_filling_ta2.png^techage_appl_grinder2.png^techage_frame_ta2.png", "techage:ta2_grinder_pas"} -local DISTR = {"techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_distri_blue.png", "techage:ta2_distributor_pas"} -local SIEV2 = {"techage_filling_ta2.png^techage_appl_sieve.png^techage_frame_ta2.png", "techage:ta2_gravelsieve_pas"} - -plans["itemtransport"] = { - {false, false, false, false, false, false, false, false, false, false, false}, - {false}, - {false}, - {CHEST, PUSHR, TB000, GRIND, PUSHR, DISTR, TB000, SIEV2, PUSHR, TB000, CHEST}, -} - --- --- Gravel Rinser --- -local RINSR = {"techage_filling_ta2.png^techage_appl_rinser.png^techage_frame_ta2.png", "techage:ta2_rinser_pas"} -local GLASS = {"default_glass.png", "default:glass"} -local WATER = {"default_water.png^default_glass.png", "default:water_source"} -local WATR2 = {"default_water.png", "default:water_source"} -local TK000 = {"techage_tube_knee.png", "techage:tubeS"} -- like 'r' -local TK090 = {"techage_tube_knee.png^[transformR90", "techage:tubeS"} -- '7' -local TK180 = {"techage_tube_knee.png^[transformR180", "techage:tubeS"} -local TK270 = {"techage_tube_knee.png^[transformR270", "techage:tubeS"} - -plans["gravelrinser"] = { - {false, false, false, SIDEV, false, false, false, false}, - {false, GLASS, WATER, GLASS, GLASS, GLASS, GLASS, GLASS}, - {false, DDIRT, DDIRT, TK000, RINSR, TK270, HOPPR, CHEST}, - {false, false, false, false, false, false, false, false}, - {false, false, false, TOP_V, false, false, false, false}, - {false, GLASS, GLASS, GLASS, GLASS, GLASS, GLASS, GLASS}, - {false, GLASS, WATR2, TK000, RINSR, TK270, HOPPR, GLASS}, - {false, GLASS, GLASS, GLASS, GLASS, GLASS, GLASS, GLASS}, -} - --- --- Coal Power Station --- -local BOIL3 = {"techage:coalboiler_top", "techage:coalboiler_top"} -local BOIL4 = {"techage:coalboiler_base", "techage:coalboiler_base"} -local FBOX3 = {"techage:coalfirebox", "techage:coalfirebox"} -local TURB3 = {"techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png", "techage:turbine"} -local GENE3 = {"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator.png", "techage:generator"} -local COOL3 = {"techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", "techage:cooler"} -local PK180 = {"techage_steam_knee.png^[transformR180", "techage:steam_pipeS"} - -plans["coalpowerstation"] = { - {false, false, false, false, false, false, false, false}, - {false, PK000, PI000, PI000, PI000, PI000, PI000, PK270}, - {false, PI090, BOIL3, PI000, PK270, PK000, COOL3, PK180}, - {false, PK090, BOIL4, false, PI090, PI090}, - {false, false, FBOX3, false, PK090, TURB3, GENE3}, -} - - --- --- TA3 Industrial Furnace --- -local Cable = {"techage_electric_cable_inv.png", "techage:electric_cableS"} -local Tubes = {"techage_tube_tube.png", "techage:tubeS"} -local PushR = {"techage_appl_pusher.png^techage_frame_ta3.png", "techage:ta3_pusher_pas"} -local PushL = {"techage_appl_pusher.png^techage_frame_ta3.png^[transformFX", "techage:ta3_pusher_pas"} -local Boost = {"techage_filling_ta3.png^techage_appl_compressor.png^[transformFX^techage_frame_ta3.png", "techage:ta3_booster"} -local Fibox = {"techage_concrete.png^techage_appl_firehole.png^techage_frame_ta3.png", "techage:furnace_firebox"} -local Furnc = {"techage_concrete.png^techage_appl_furnace.png^techage_frame_ta3.png", "techage:ta3_furnace_pas"} - -plans["ta3_furnace"] = { - {false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false}, - {false, Tubes, PushR, Tubes, Furnc, Tubes, PushR, Tubes}, - {false, false, Cable, Boost, Fibox, false, false, false}, -} - - --- --- TA3 Tank Pump Pusher --- -local Pump = {"techage_filling_ta3.png^techage_appl_pump.png^techage_frame_ta3.png", "techage:t3_pump"} -local TANK3 = {"techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", "techage:ta3_tank"} -local Fillr = {"techage_filling_ta3.png^techage_appl_liquid_hopper.png^techage_frame_ta3.png", "techage:filler"} -local PIPEH = {"techage_gaspipe.png", "techage:ta4_pipeS"} -local PIPEV = {"techage_gaspipe.png^[transformR90", "techage:ta4_pipeS"} -local PN000 = {"techage_gaspipe_knee.png", "techage:ta4_pipeS"} -- r -local PN090 = {"techage_gaspipe_knee.png^[transformR90", "techage:ta4_pipeS"} -- L -local PN180 = {"techage_gaspipe_knee.png^[transformR180", "techage:ta4_pipeS"} -- J -local PN270 = {"techage_gaspipe_knee.png^[transformR270", "techage:ta4_pipeS"} -- 7 - -plans["ta3_tank"] = { - {false, false, false, false, SIDEV, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false}, - {false, Tubes, PushR, Tubes, Fillr, Tubes, PushR, Tubes, false, false}, - {false, false, false, false, TANK3, PIPEH, PIPEH, Pump, PIPEH, false}, - {false, false, false, false, false, false, false, false, false, false}, -} - - --- --- TA3 Oil Loading station --- -local MCART = {minetest.inventorycube("carts_cart_top.png", - "carts_cart_side.png^minecart_logo.png", "carts_cart_side.png^minecart_logo.png"), - "minecart:cart"} -local PRAIL = {"carts_rail_straight_pwr.png", "carts:powerrail"} -local PRAIH = {"carts_rail_straight_pwr.png^[transformR90", "carts:powerrail"} -local TRAIL = {"carts_rail_t_junction.png^[transformR90", "carts:rail"} -local RAILH = {"carts_rail_straight.png^[transformR90", "carts:rail"} -local CRAIL = {"carts_rail_curved.png^[transformR90", "carts:rail"} -local BUFFR = {"default_junglewood.png^minecart_buffer.png", "minecart:buffer"} - -plans["ta3_loading"] = { - {false, false, PIPEH, Pump, PIPEH, PN270, SIDEV, false, false, false, false}, - {false, false, false, false, false, PIPEV, false, false, false, false, false}, - {false, MCART, false, false, false, PN090, TANK3, false, false, false, false}, - {false, HOPPR, CHEST, Tubes, PushR, Tubes, Fillr, PushR, Tubes, MCART, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, BUFFR, false, false, false, TOP_V, false, false, false, BUFFR, false}, - {false, PRAIL, false, false, false, false, false, false, false, PRAIL, false}, - {false, CRAIL, RAILH, PRAIH, RAILH, RAILH, PRAIH, RAILH, RAILH, TRAIL, RAILH}, -} - - --- --- Distiller --- -local DIST4 = {"techage_distiller_inv.png", "techage:ta3_distiller4"} -local DIST3 = {"techage_distiller_inv.png", "techage:ta3_distiller3"} -local DIST2 = {"techage_distiller_inv.png", "techage:ta3_distiller2"} -local DIST1 = {"techage_distiller_inv.png", "techage:ta3_distiller1"} -local DBASE = {"techage_concrete.png", "techage:ta3_distiller_base"} -local REBIO = {"techage_filling_ta3.png^techage_appl_reboiler.png^techage_frame_ta3.png", "techage:ta3_reboiler"} - -plans["ta3_distiller"] = { - {false, false, false, false, false, SIDEV, false, PN000, PIPEH, TANK3, false}, - {false, IMG31, false, false, false, false, false, DIST4, false, false, false}, - {false, false, false, false, false, false, false, DIST3, PIPEH, TANK3, false}, - {false, false, false, false, false, false, false, DIST2, false, false, false}, - {false, false, false, false, false, false, false, DIST3, PIPEH, TANK3, false}, - {false, false, false, false, false, false, false, DIST2, false, false, false}, - {false, false, false, false, false, false, false, DIST3, PIPEH, TANK3, false}, - {false, false, false, false, false, false, false, DIST2, false, false, false}, - {false, TANK3, PIPEH, Pump, PIPEH, REBIO, PIPEH, DIST1, false, false, false}, - {false, false, false, false, false, false, false, DBASE, PIPEH, TANK3, false}, -} - --- --- Chemical Reactor --- -local RBASE = {"techage_concrete.png", "techage:ta4_reactor_base"} -local STAND = {"techage_reactor_stand_side.png", "techage:ta4_reactor_stand"} -local REACT = {"techage_reactor_plan.png", "techage:ta4_reactor"} -local FILLR = {"techage_reactor_filler_plan.png", "techage:ta4_reactor_fillerpipe"} -local DOSER = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_pump_up.png", "techage:ta4_doser"} -local SILO4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_silo.png", "techage:ta4_silo"} -local TANK4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", "techage:ta4_tank"} - -plans["ta4_reactor"] = { - {false, false, false, false, false, false, SIDEV, false, false, false, false}, - {false, IMG43, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, PN000, PIPEH, PIPEH, PN270, false, false, false}, - {false, false, false, false, PIPEV, false, false, FILLR, false, false, false}, - {false, false, false, false, PIPEV, false, false, REACT, false, false, false}, - {false, false, false, false, PIPEV, false, false, STAND, PIPEH, PIPEH, SILO4}, - {false, TANK4, PIPEH, PIPEH, DOSER, PN270, false, RBASE, PIPEH, PIPEH, TANK4}, - {false, SILO4, PIPEH, PIPEH, PIPEH, PN180, false, false, false, false, false}, -} - --- --- Wind Turbine --- -local ROTOR = {"techage_wind_turbine_inv.png", "techage:ta4_wind_turbine"} -local NCLLE = {"techage_rotor.png", "techage:ta4_wind_turbine_nacelle"} -local PILLR = {"techage:pillar", "techage:pillar"} -local SLAMP = {"techage:rotor_signal_lamp_off", "techage:rotor_signal_lamp_off"} - -plans["ta4_windturbine"] = { - {false, false, false, SIDEV, false, false, false}, - {false, false, false, SLAMP, false, false, IMG_4, false}, - {false, false, false, ROTOR, NCLLE, false, false}, - {false, false, false, PILLR, false, false, false}, - {false, false, false, PILLR, false, false, false}, - {false, false, false, PILLR, false, false, false}, - {false, false, false, PILLR, false, false, false}, - {false, false, false, PILLR, false, false, false}, - {false, false, false, PILLR, false, false, false}, - {false, false, false, PILLR, false, false, false}, -} - --- --- Thermal Storage System --- -local CONCR = {"basic_materials_concrete_block.png", "basic_materials:concrete_block"} -local HEXR1 = {"techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", "techage:heatexchanger3"} -local HEXR2 = {"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", "techage:heatexchanger2"} -local HEXR3 = {"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", "techage:heatexchanger1"} -local TURBN = {"techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png", "techage:ta4_turbine"} -local GENER = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]", "techage:ta4_generator"} -local GRAVL = {"default_gravel.png", "default:gravel"} -local INLET = {"basic_materials_concrete_block.png^techage_gaspipe.png^[transformR90", "techage:ta4_pipe_inlet"} -local OGLAS = {"default_obsidian_glass.png", "default:obsidian_glass"} - -plans["ta4_storagesystem"] = { - {false, false, TOP_V, false, false, false, false, SIDEV, false, IMG41, false}, - {false, false, PN000, PIPEH, PIPEH, PIPEH, PN270, false, false, false, false}, - {CONCR, CONCR, INLET, CONCR, CONCR, false, PIPEV, false, false, false, false}, - {CONCR, GRAVL, GRAVL, GRAVL, CONCR, false, PN090, HEXR1, PIPEH, PN270, false}, - {OGLAS, GRAVL, GRAVL, GRAVL, CONCR, false, false, HEXR2, false, PIPEV, false}, - {CONCR, GRAVL, GRAVL, GRAVL, CONCR, false, PN000, HEXR3, PIPEH, TURBN, GENER}, - {CONCR, CONCR, INLET, CONCR, CONCR, false, PIPEV, false, false, false, false}, - {false, false, PN090, PIPEH, PIPEH, PIPEH, PN180, false, false, false, false}, -} - --- --- Solar Plant --- - -local SOLAR = {"techage_solar_module_top.png", "techage:ta4_solar_module"} -local RCBLE = {"techage_ta4_cable_inv.png", "techage:ta4_power_cableS"} -local CARRI = {"techage:ta4_solar_carrier", "techage:ta4_solar_carrier"} -local INVAC = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", "techage:ta4_solar_inverter"} - -plans["ta4_solarplant"] = { - {false, false, false, false, false, false, false, false, false, IMG42, false}, - {false, false, TOP_V, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, SOLAR, SOLAR, SOLAR}, - {false, CARRI, CARRI, CARRI, RCBLE, RCBLE, RCBLE, INVAC, Cable}, - {false, SOLAR, SOLAR, SOLAR}, -} - - --- --- Liquid Filter --- - -local LFSNK = {"basic_materials_concrete_block.png^techage_appl_arrow.png", "techage:ta4_liquid_filter_sink"} -local PWETR = {"basic_materials_concrete_block.png^techage_gaspipe.png", "techage:ta3_pipe_wall_entry"} -local TANK4 = {"techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", "techage:ta4_tank"} -local LFFIL = {"basic_materials_concrete_block.png^techage_gaspipe_hole.png", "techage:ta4_liquid_filter_filler"} - -plans["ta4_liquid_filter_base"] = { - {false, false, false, false, false, false, false, false, IMG44, false}, - {false, false, false, TOP_V, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false}, - {false, CONCR, CONCR, CONCR, CONCR, CONCR}, - {false, CONCR, CONCR, CONCR, CONCR, CONCR}, - {false, CONCR, CONCR, LFSNK, PWETR, PWETR, PIPEH, PIPEH, TANK4}, - {false, CONCR, CONCR, CONCR, CONCR, CONCR}, - {false, CONCR, CONCR, CONCR, CONCR, CONCR}, -} - -plans["ta4_liquid_filter_gravel"] = { - {false, false, false, false, false, false, false, false, IMG44, false}, - {false, false, false, TOP_V, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false}, - {false, CONCR, OGLAS, OGLAS, OGLAS, CONCR}, - {false, OGLAS, GRAVL, GRAVL, GRAVL, OGLAS}, - {false, OGLAS, GRAVL, GRAVL, GRAVL, OGLAS}, - {false, OGLAS, GRAVL, GRAVL, GRAVL, OGLAS}, - {false, CONCR, OGLAS, OGLAS, OGLAS, CONCR}, -} - -plans["ta4_liquid_filter_top"] = { - {false, false, false, false, false, false, false, false, IMG44, false}, - {false, false, false, TOP_V, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false}, - {false, CONCR, CONCR, CONCR, CONCR, CONCR}, - {false, CONCR, false, false, false, CONCR}, - {false, CONCR, false, LFFIL, false, CONCR}, - {false, CONCR, false, false, false, CONCR}, - {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"} - -plans["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}, -} - -plans["techage_collider_plan2"] = { - {false, false, false, false}, - {false, false, false, false}, - {false, false, IMG47, 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"} - -plans["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}, -} - --- --- TA5 Teleport Blocks --- -local TELEP = {"techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", "techage:ta5_tele_pipe"} -local TELET = {"techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", "techage:ta5_tele_tube"} -local PUMP4 = {"techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta4.png", "techage:t4_pump"} -local ARROW = {"techage_form_arrow.png"} - -plans["ta5_teleport"] = { - {false, false, false, false, false, false, false, false, false, false, false}, - {false, CHEST, PushR, TELET, false, ARROW, false, TELET, Tubes, CHEST, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, CHEST, Tubes, TELET, false, ARROW, false, TELET, PushR, CHEST, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, TANK4, PUMP4, TELEP, false, ARROW, false, TELEP, PIPEH, TANK4, false}, -} - --- --- TA5 Fusion Reactor --- -local SHELL = {"techage_reactor_shell.png", "techage:ta5_fr_shell"} -local NUCLS = {"techage_reactor_shell.png^techage_collider_detector_core.png", "techage:ta5_fr_nucleus"} -local MAGN1 = {"techage_collider_magnet.png^techage_steel_tiles_top3.png", "techage:ta5_magnet1"} -local MAGN2 = {"techage_collider_magnet.png^techage_steel_tiles_top3.png^[transformR90]", "techage:ta5_magnet1"} -local MAGN3 = {"techage_collider_magnet.png^techage_steel_tiles_top3.png^[transformR180]", "techage:ta5_magnet1"} -local MAGN4 = {"techage_collider_magnet.png^techage_steel_tiles_top3.png^[transformR270]", "techage:ta5_magnet1"} - -plans["ta5_fusion_reactor"] = { - {false, false, false, false, false, false, IMG46, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, SECTV, false, false, false, false, false, false, false, false, false}, - {false, false, SHELL, SHELL, SHELL, false, SHELL, SHELL, SHELL, false, false}, - {false, SHELL, SHELL, MAGN3, SHELL, SHELL, SHELL, MAGN3, SHELL, SHELL, false}, - {false, SHELL, MAGN4, false, MAGN2, NUCLS, MAGN4, false, MAGN2, SHELL, false}, - {false, SHELL, SHELL, MAGN1, SHELL, SHELL, SHELL, MAGN1, SHELL, SHELL, false}, - {false, false, SHELL, SHELL, SHELL, false, SHELL, SHELL, SHELL, false, false}, -} - --- --- TA5 Heat Exchanger --- -local PIPEG = {"techage_ta5_gaspipe.png", "techage:ta5_pipe1S"} -local PIPEB = {"techage_ta5_gaspipeB.png", "techage:ta5_pipe2S"} -local HEX51 = {"techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_ribsT.png", "techage:ta5_heatexchanger3"} -local HEX52 = {"techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", "techage:ta5_heatexchanger2"} -local HEX53 = {"techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", "techage:ta5_heatexchanger1"} -local TURB5 = {"techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta5.png", "techage:ta5_turbine"} -local GENE5 = {"techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_generator.png^[transformFX]", "techage:ta5_generator"} - -plans["ta5_heatexchanger"] = { - {false, false, false, false, SIDEV, false, false, false}, - {false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false}, - {false, false, PIPEG, PIPEG, HEX51, PIPEH, PN270, false}, - {false, false, false, false, HEX52, false, PIPEV, false}, - {false, false, PIPEB, PIPEB, HEX53, PIPEH, TURB5, GENE5}, - {false, false, false, false, false, false, false, false}, - {false, false, false, false, false, false, false, false}, -} - --- Bring into legacy format -local function reformat(plan) - for y=1,#plan do - for x=1,#plan[1] do - local item = plan[y][x] or false - if item ~= false then - local var1, var2 = item[1], item[2] - - if var1 == "top_view" then - plan[y][x] = {"text", var1} - elseif var1 == "side_view" then - plan[y][x] = {"text", var1} - elseif var1 == "sectional_view" then - plan[y][x] = {"text", var1} - elseif var1 == "" then - plan[y][x] = {"img", var2, "2.2,2.2"} - elseif var1 == "10x10" then - plan[y][x] = {"img", var2, "10,10"} - elseif var1 == "5x4" then - plan[y][x] = {"img", var2, "5,4"} - else - plan[y][x] = {"item", var1, var2} - end - end - end - end - return plan -end - -for name, plan in pairs(plans) do - local plan2 = reformat(plan) - doclib.add_manual_plan("techage", "EN", name, plan2) - doclib.add_manual_plan("techage", "DE", name, plan2) - doclib.add_manual_plan("techage", "RU", name, plan2) - doclib.add_manual_plan("techage", "pt-BR", name, plan2) -end diff --git a/techage/energy_storage/generator.lua b/techage/energy_storage/generator.lua deleted file mode 100644 index 10ab0a7..0000000 --- a/techage/energy_storage/generator.lua +++ /dev/null @@ -1,130 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 TES Generator (dummy) - - can be started and stopped - - provides netID of cable network -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -minetest.register_node("techage:ta4_generator", { - description = S("TA4 Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_hole_electric.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_generator.png^[transformFX]", - }, - - after_place_node = function(pos) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Cable:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta4_generator_on", { - description = S("TA4 Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_hole_electric.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", - { - name = "techage_filling4_ta4.png^techage_appl_generator4.png^techage_frame4_ta4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - { - name = "techage_filling4_ta4.png^techage_appl_generator4.png^[transformFX]^techage_frame4_ta4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - }, - - paramtype2 = "facedir", - drop = "", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - --- The generator is a dummy, it only has to network connection to check the netID -power.register_nodes({"techage:ta4_generator", "techage:ta4_generator_on"}, Cable, "con", {"R"}) - --- controlled by the turbine -techage.register_node({"techage:ta4_generator", "techage:ta4_generator_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "netID" then - local outdir = M(pos):get_int("outdir") - return networks.determine_netID(pos, Cable, outdir) - elseif topic == "start" then - swap_node(pos, "techage:ta4_generator_on") - elseif topic == "stop" then - swap_node(pos, "techage:ta4_generator") - end - end, - on_recv_message = function(pos, src, topic, payload) - return "unsupported" - end, - on_node_load = function(pos) - -- remove legacy formspec - M(pos):set_string("formspec", "") - end, -}) - -minetest.register_craft({ - output = "techage:ta4_generator", - recipe = { - {"", "dye:blue", ""}, - {"", "techage:generator", ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) diff --git a/techage/energy_storage/heatexchanger1.lua b/techage/energy_storage/heatexchanger1.lua deleted file mode 100644 index 6efc2bb..0000000 --- a/techage/energy_storage/heatexchanger1.lua +++ /dev/null @@ -1,101 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Heat Exchanger1 (bottom part) - - has a connection to storage and turbine (via pipes) - - acts as a cable junction for Exchanger2 -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local Pipe = techage.LiquidPipe -local power = networks.power - -local function turbine_cmnd(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, Pipe, - {"techage:ta4_turbine", "techage:ta4_turbine_on", "techage:ta4_collider_cooler"}) -end - -local function inlet_cmnd(pos, topic, payload) - return techage.transfer(pos, "L", topic, payload, Pipe, - {"techage:ta4_pipe_inlet", "techage:ta4_collider_pipe_inlet"}) -end - -minetest.register_node("techage:heatexchanger1", { - description = S("TA4 Heat Exchanger 1"), - tiles = { - -- up, down, right, left, back, front - "techage_hole_ta4.png^techage_appl_arrow_white.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - Cable:after_place_node(pos) - Pipe:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, outdir, tlib2, node) - if tlib2 == Cable then - power.update_network(pos, 0, tlib2, node) - end - end, - can_dig = function(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - pos.y = pos.y + 1 - return minetest.get_node(pos).name ~= "techage:heatexchanger2" - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - Pipe:after_dig_node(pos) - end, - networks = {}, - paramtype2 = "facedir", - groups = {crumbly = 2, cracky = 2, snappy = 2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:heatexchanger1"}) -Pipe:set_valid_sides("techage:heatexchanger1", {"R", "L"}) - -power.register_nodes({"techage:heatexchanger1"}, Cable, "junc", {"F", "B", "U"}) - --- command interface -techage.register_node({"techage:heatexchanger1"}, { - on_transfer = function(pos, indir, topic, payload) - local nvm = techage.get_nvm(pos) - -- used by heatexchanger2 - if topic == "diameter" or topic == "volume" or topic == "window" or topic == "detector" then - return inlet_cmnd(pos, topic, payload) - else - return turbine_cmnd(pos, topic, payload) - end - end, -}) - -minetest.register_craft({ - output = "techage:heatexchanger1", - recipe = { - {"default:tin_ingot", "techage:electric_cableS", "default:steel_ingot"}, - {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"}, - {"", "techage:baborium_ingot", ""}, - }, -}) diff --git a/techage/energy_storage/heatexchanger2.lua b/techage/energy_storage/heatexchanger2.lua deleted file mode 100644 index cfa854e..0000000 --- a/techage/energy_storage/heatexchanger2.lua +++ /dev/null @@ -1,436 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Heat Exchanger2 (middle part) - (alternatively used as cooler for the TA4 collider) - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local Pipe = techage.LiquidPipe -local power = networks.power -local control = networks.control - -local CYCLE_TIME = 2 -local GRVL_CAPA = 500 -local PWR_CAPA = { - [5] = GRVL_CAPA * 3 * 3 * 3, -- 13500 Cyc = 450 min = 22.5 kud - [7] = GRVL_CAPA * 5 * 5 * 5, -- 104 kud - [9] = GRVL_CAPA * 7 * 7 * 7, -- 286 kuh - [11] = GRVL_CAPA * 9 * 9 * 9, -- 610 kuh - [13] = GRVL_CAPA * 11 * 11 * 11, -- 1112 kuh -} -local DOWN = 5 -local PWR_NEEDED = 5 - -local function heatexchanger1_cmnd(pos, topic, payload) - return techage.transfer({x = pos.x, y = pos.y - 1, z = pos.z}, - nil, topic, payload, nil, - {"techage:heatexchanger1"}) -end - -local function heatexchanger3_cmnd(pos, topic, payload) - return techage.transfer({x = pos.x, y = pos.y + 1, z = pos.z}, - nil, topic, payload, nil, - {"techage:heatexchanger3"}) -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_booster", { - pos = pos, - gain = 0.3, - max_hear_distance = 10, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function cooler_formspec(self, pos, nvm) - return "size[4,2]".. - "box[0,-0.1;3.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("TA4 Heat Exchanger")) .. "]" .. - "image_button[1.5,1;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[1.5,1;1,1;"..self:get_state_tooltip(nvm).."]" -end - -local function can_start(pos, nvm) - -- Used as cooler for the collider? - if heatexchanger1_cmnd(pos, "detector") then - if power.power_available(pos, Cable, DOWN) then - nvm.used_as_cooler = true - return true - else - return S("No power") - end - end - -- Used as heat exchanger - local netID = networks.determine_netID(pos, Cable, DOWN) - if heatexchanger1_cmnd(pos, "netID") ~= netID then - return S("Power network connection error") - end - local diameter = heatexchanger1_cmnd(pos, "diameter") - if diameter then - nvm.capa_max = PWR_CAPA[tonumber(diameter)] or 0 - if nvm.capa_max ~= 0 then - nvm.capa = math.min(nvm.capa or 0, nvm.capa_max) - local owner = M(pos):get_string("owner") or "" - return heatexchanger1_cmnd(pos, "volume", owner) - else - return S("wrong storage diameter") .. ": " .. diameter - end - else - return S("inlet/pipe error") - end - return S("did you check the plan?") -end - -local function start_node(pos, nvm) - if nvm.used_as_cooler then - play_sound(pos) - else - nvm.win_pos = heatexchanger1_cmnd(pos, "window") - power.start_storage_calc(pos, Cable, DOWN) - play_sound(pos) - heatexchanger1_cmnd(pos, "start") - end -end - -local function stop_node(pos, nvm) - if nvm.used_as_cooler then - stop_sound(pos) - else - power.start_storage_calc(pos, Cable, DOWN) - stop_sound(pos) - heatexchanger1_cmnd(pos, "stop") - end -end - -local function formspec(self, pos, nvm) - local data - - if nvm.used_as_cooler then - return cooler_formspec(self, pos, nvm) - end - if techage.is_running(nvm) then - data = power.get_network_data(pos, Cable, DOWN) - end - return techage.storage_formspec(self, pos, nvm, S("TA4 Heat Exchanger"), data, nvm.capa, nvm.capa_max) -end - -local function glowing(pos, nvm, should_glow) - if nvm.win_pos then - if should_glow then - swap_node(nvm.win_pos, "techage:glow_gravel") - else - swap_node(nvm.win_pos, "default:gravel") - end - end -end - -local function check_TES_integrity(pos, nvm) - nvm.ticks = (nvm.ticks or 0) + 1 - if (nvm.ticks % 5) == 0 then -- every 10 sec - if techage.is_running(nvm) then - glowing(pos, nvm, (nvm.capa or 0) / (nvm.capa_max or 1) > 0.8) - end - end - if (nvm.ticks % 30) == 0 then -- every minute - return heatexchanger1_cmnd(pos, "volume") - elseif (nvm.ticks % 30) == 10 then -- every minute - return heatexchanger1_cmnd(pos, "diameter") ~= nil or S("inlet/pipe error") - elseif (nvm.ticks % 30) == 20 then -- every minute - return heatexchanger3_cmnd(pos, "diameter") ~= nil or S("inlet/pipe error") - end - local netID = networks.determine_netID(pos, Cable, DOWN) - if heatexchanger1_cmnd(pos, "netID") ~= netID then - if nvm.check_once_again then - nvm.check_once_again = false - return true - else - return S("Power network connection error") - end - end - nvm.check_once_again = true - return true -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:heatexchanger2", - cycle_time = CYCLE_TIME, - infotext_name = S("TA4 Heat Exchanger"), - standby_ticks = 0, - can_start = can_start, - start_node = start_node, - stop_node = stop_node, - formspec_func = formspec, -}) - -local function cooler_timer(pos, nvm) - local err = false - if power.consume_power(pos, Cable, DOWN, PWR_NEEDED) ~= PWR_NEEDED then - State:fault(pos, nvm, "No power") - stop_sound(pos) - return true - end - - -- Cyclically check pipe connections - nvm.ticks = (nvm.ticks or 0) + 1 - if (nvm.ticks % 5) == 0 then -- every 10 s - err = heatexchanger1_cmnd(pos, "detector") ~= true - elseif (nvm.ticks % 5) == 1 then -- every 10 s - err = heatexchanger3_cmnd(pos, "detector") ~= true - elseif (nvm.ticks % 5) == 2 then -- every 10 s - err = heatexchanger1_cmnd(pos, "cooler") ~= true - elseif (nvm.ticks % 5) == 3 then -- every 10 s - err = heatexchanger3_cmnd(pos, "cooler") ~= true - end - if err then - State:fault(pos, nvm, "Pipe connection error") - stop_sound(pos) - end - return true -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - if nvm.used_as_cooler then - cooler_timer(pos, nvm) - return true - end - local res = check_TES_integrity(pos, nvm) - if res ~= true then - State:fault(pos, nvm, res) - heatexchanger1_cmnd(pos, "stop") - power.start_storage_calc(pos, Cable, DOWN) - end - - if techage.is_running(nvm) then - local capa = power.get_storage_load(pos, Cable, DOWN, nvm.capa_max) or 0 - if capa > 0 then - nvm.capa = capa - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return true -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local nvm = techage.get_nvm(pos) - return not techage.is_running(nvm) -end - -local function on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function after_place_node(pos, placer) - if techage.orientate_node(pos, "techage:heatexchanger1") then - return true - end - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local own_num = techage.add_node(pos, "techage:heatexchanger1") - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA4 Heat Exchanger")..": "..own_num) - meta:set_string("formspec", formspec(State, pos, nvm)) - Cable:after_place_node(pos, {DOWN}) - State:node_init(pos, nvm, own_num) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function get_storage_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - nvm.capa_max = nvm.capa_max or 1 - if techage.is_running(nvm) then - return {level = (nvm.capa or 0) / nvm.capa_max, capa = nvm.capa_max} - end -end - --- Middle node with the formspec from the bottom node -minetest.register_node("techage:heatexchanger2", { - description = S("TA4 Heat Exchanger 2"), - tiles = { - -- up, down, right, left, back, front - "techage_hole_ta4.png", - "techage_hole_ta4.png", - "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_turb.png", - "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_core.png", - "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", - "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", - }, - - selection_box = { - type = "fixed", - fixed = {-1/2, -1.5/2, -1/2, 1/2, 1/2, 1/2}, - }, - - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_place_node = after_place_node, - can_dig = can_dig, - after_dig_node = after_dig_node, - get_storage_data = get_storage_data, - - paramtype2 = "facedir", - groups = {crumbly = 2, cracky = 2, snappy = 2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -power.register_nodes({"techage:heatexchanger2"}, Cable, "sto", {"D"}) - -techage.register_node({"techage:heatexchanger2"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - if techage.is_running(nvm) then - return "running" - else - return "stopped" - end - elseif topic == "delivered" then - local data = power.get_network_data(pos, Cable, DOWN) - return data.consumed - data.provided - elseif topic == "load" then - return techage.power.percent(nvm.capa_max, nvm.capa) - elseif topic == "on" then - State:start(pos, nvm) - return true - elseif topic == "off" then - State:stop(pos, nvm) - return true - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 1 and payload[1] == 1 then - State:start(pos, nvm) - return 0 - elseif topic == 1 and payload[1] == 0 then - State:stop(pos, nvm) - return 0 - else - return 2, "" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 128 then - return 0, techage.get_node_lvm(pos).name - elseif topic == 129 then -- State - if techage.is_running(nvm) then - return 0, {techage.RUNNING} - else - return 0, {techage.STOPPED} - end - elseif topic == 135 then -- Delivered Power - local data = power.get_network_data(pos, Cable, DOWN) - return 0, {data.consumed - data.provided} - elseif topic == 134 then -- Tank Load Percent - local value = techage.power.percent(nvm.capa_max, nvm.capa) - return 0, {math.floor(value + 0.5)} - else - return 2, "" - end - end, - on_node_load = function(pos, node) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - play_sound(pos) - else - stop_sound(pos) - end - -- Attempt to restart the system as the heat exchanger goes into error state - -- when parts of the storage block are unloaded. - if nvm.techage_state == techage.FAULT then - start_node(pos, nvm) - end - end, -}) - -control.register_nodes({"techage:heatexchanger2"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - return { - type = S("TA4 Heat Exchanger"), - number = M(pos):get_string("node_number") or "", - running = techage.is_running(nvm) or false, - capa = nvm.capa_max or 1, - load = nvm.capa or 0, - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:heatexchanger2", - recipe = { - {"default:tin_ingot", "", "default:steel_ingot"}, - {"", "techage:ta4_wlanchip", ""}, - {"", "techage:baborium_ingot", ""}, - }, -}) diff --git a/techage/energy_storage/heatexchanger3.lua b/techage/energy_storage/heatexchanger3.lua deleted file mode 100644 index 9c5c2e5..0000000 --- a/techage/energy_storage/heatexchanger3.lua +++ /dev/null @@ -1,102 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Heat Exchanger3 (top part) - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe - -local function orientate_node(pos, name) - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name == name then - local param2 = node.param2 - node = minetest.get_node(pos) - node.param2 = param2 - minetest.swap_node(pos, node) - else - minetest.remove_node(pos) - return true - end -end - -local function after_place_node(pos) - if orientate_node(pos, "techage:heatexchanger2") then - return true - end - Pipe:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Pipe:after_dig_node(pos) -end - -local function cooler_cmnd(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, Pipe, - {"techage:ta4_collider_cooler"}) -end - -local function inlet_cmnd(pos, topic, payload) - return techage.transfer(pos, "L", topic, payload, Pipe, - {"techage:ta4_pipe_inlet", "techage:ta4_collider_pipe_inlet"}) -end - -minetest.register_node("techage:heatexchanger3", { - description = S("TA4 Heat Exchanger 3"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_hole_ta4.png", - "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", - "techage_filling_ta4.png^techage_frameT_ta4.png^techage_appl_ribsT.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - networks = { - pipe2 = {}, - }, - paramtype2 = "facedir", - groups = {crumbly = 2, cracky = 2, snappy = 2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:heatexchanger3"}) - --- command interface, used by heatexchanger2 -techage.register_node({"techage:heatexchanger3"}, { - on_transfer = function(pos, indir, topic, payload) - if topic == "cooler" then - return cooler_cmnd(pos, topic, payload) - else - return inlet_cmnd(pos, topic, payload) - end - end, -}) - -minetest.register_craft({ - output = "techage:heatexchanger3", - recipe = { - {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, - {"techage:ta4_pipeS", "basic_materials:gear_steel", "techage:ta4_pipeS"}, - {"", "techage:baborium_ingot", ""}, - }, -}) - -techage.orientate_node = orientate_node diff --git a/techage/energy_storage/inlet.lua b/techage/energy_storage/inlet.lua deleted file mode 100644 index e5dc23d..0000000 --- a/techage/energy_storage/inlet.lua +++ /dev/null @@ -1,196 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Pipe Inlet - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe - -local function after_place_node(pos, placer, itemstack) - Pipe:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) -end - -minetest.register_node("techage:ta4_pipe_inlet", { - description = S("TA4 Pipe Inlet"), - tiles = { - -- up, down, right, left, back, front - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png^techage_tes_inlet.png", - "basic_materials_concrete_block.png^techage_tes_inlet.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - networks = { - pipe2 = {}, - }, - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - groups = {crumbly = 2, cracky = 2, snappy = 2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:ta4_pipe_inlet"}) - -local Numbers = { - shell = { - [2] = 96, -- 5x5x2 + 3x5x2 + 3x3x2 - 2 - [3] = 216, -- 7x7x2 + 5x7x2 + 5x5x2 - 2 - [4] = 384, -- 9x9x2 + 7x9x2 + 7x7x2 - 2 - [5] = 600, -- 11x11x2 + 9x11x2 + 9x9x2 - 2 - [6] = 864, -- 13x13x2 + 11x13x2 + 11x11x2 - 2 - }, - filling = { - [2] = 27, -- 3x3x3 - [3] = 125, -- 5x5x5 - [4] = 343, -- 7x7x7 - [5] = 729, -- 9x9x9 - [6] = 1331, -- 11x11x11 - } -} - -local function get_diameter(pos, in_dir) - local dir = tubelib2.Dir6dToVector[in_dir] - local pos2, node - - pos2 = vector.add(pos, vector.multiply(dir, 4)) - node = minetest.get_node(pos2) - if node.name == "techage:ta3_pipe_wall_entry" then - return - end - if node.name == "techage:ta4_pipe_inlet" then - return 5 - end - - pos2 = vector.add(pos, vector.multiply(dir, 6)) - node = minetest.get_node(pos2) - if node.name == "techage:ta3_pipe_wall_entry" then - return - end - if node.name == "techage:ta4_pipe_inlet" then - return 7 - end - - pos2 = vector.add(pos, vector.multiply(dir, 8)) - node = minetest.get_node(pos2) - if node.name == "techage:ta3_pipe_wall_entry" then - return - end - if node.name == "techage:ta4_pipe_inlet" then - return 9 - end - - pos2 = vector.add(pos, vector.multiply(dir, 10)) - node = minetest.get_node(pos2) - if node.name == "techage:ta3_pipe_wall_entry" then - return - end - if node.name == "techage:ta4_pipe_inlet" then - return 11 - end - - pos2 = vector.add(pos, vector.multiply(dir, 12)) - node = minetest.get_node(pos2) - if node.name == "techage:ta3_pipe_wall_entry" then - return - end - if node.name == "techage:ta4_pipe_inlet" then - return 13 - end - - pos2 = vector.add(pos, vector.multiply(dir, 14)) - local poses = minetest.find_nodes_in_area(pos, pos2, {"techage:ta4_pipe_inlet"}) - if #poses > 1 then - return vector.distance(pos, poses[2]) + 1 - end -end - -local function check_volume(pos, in_dir, owner) - local diameter = get_diameter(pos, in_dir) - if diameter then - local radius = (diameter - 1) / 2 - local dir = tubelib2.Dir6dToVector[in_dir] - local cpos = vector.add(pos, vector.multiply(dir, radius)) - -- calculate size - local pos1 = {x = cpos.x - radius, y = cpos.y - radius, z = cpos.z - radius} - local pos2 = {x = cpos.x + radius, y = cpos.y + radius, z = cpos.z + radius} - local _, node_tbl = minetest.find_nodes_in_area(pos1, pos2, - {"default:gravel", "techage:ta4_pipe_inlet", - "basic_materials:concrete_block", "default:obsidian_glass", - "techage:glow_gravel"}) - if node_tbl["default:obsidian_glass"] > 1 then - return S("one window maximum") - elseif node_tbl["default:obsidian_glass"] + node_tbl["basic_materials:concrete_block"] ~= Numbers.shell[radius] then - return S("wrong number of shell nodes") - elseif node_tbl["default:gravel"] + node_tbl["techage:glow_gravel"] ~= Numbers.filling[radius] then - return S("wrong number of gravel nodes") - end - else - return S("wrong diameter (should be 5, 7, or 9)") - end - return true -end - --- provide position behind the obsidian_glass -local function check_window(pos, in_dir) - local diameter = get_diameter(pos, in_dir) - if diameter then - local radius = (diameter - 1) / 2 - local dir = tubelib2.Dir6dToVector[in_dir] - local cpos = vector.add(pos, vector.multiply(dir, radius)) - -- calculate size - local pos1 = {x = cpos.x - radius, y = cpos.y - radius, z = cpos.z - radius} - local pos2 = {x = cpos.x + radius, y = cpos.y + radius, z = cpos.z + radius} - local poses,_ = minetest.find_nodes_in_area(pos1, pos2, {"default:obsidian_glass"}) - if #poses == 1 then - local ndir = vector.direction(poses[1], cpos) - ndir = vector.normalize(ndir) - local npos = vector.add(poses[1], ndir) - return npos - end - end -end - --- for logical communication -techage.register_node({"techage:ta4_pipe_inlet"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "diameter" then - return get_diameter(pos, in_dir) - elseif topic == "volume" then - return check_volume(pos, in_dir, payload) - elseif topic == "window" then - return check_window(pos, in_dir) - end - return false - end -}) - -minetest.register_craft({ - type = 'shapeless', - output = "techage:ta4_pipe_inlet", - recipe = {"basic_materials:concrete_block", "techage:ta4_pipeS"}, -}) diff --git a/techage/energy_storage/nodes.lua b/techage/energy_storage/nodes.lua deleted file mode 100644 index 6e48972..0000000 --- a/techage/energy_storage/nodes.lua +++ /dev/null @@ -1,36 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Nodes - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -minetest.register_node("techage:glow_gravel", { - description = S("TechAge Gravel"), - tiles = {{ - name = "techage_gravel4.png", - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 0.2, - }, - }}, - paramtype = "light", - light_source = 8, - groups = {crumbly = 2, falling_node = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_gravel_defaults(), - drop = "", -}) diff --git a/techage/energy_storage/turbine.lua b/techage/energy_storage/turbine.lua deleted file mode 100644 index 3de46e7..0000000 --- a/techage/energy_storage/turbine.lua +++ /dev/null @@ -1,165 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 TES Gas Turbine - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe - -local function generator_cmnd(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, nil, - {"techage:ta4_generator", "techage:ta4_generator_on"}) -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_turbine", { - pos = pos, - gain = 0.4, - max_hear_distance = 10, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -minetest.register_node("techage:ta4_turbine", { - description = S("TA4 Turbine"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png^[transformFX", - "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta4.png", - }, - - after_place_node = function(pos) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - stop_sound(pos) - Pipe:after_dig_node(pos) - techage.del_mem(pos) - end, - networks = { - pipe2 = {}, - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta4_turbine_on", { - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - { - name = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta4.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - { - name = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - }, - - tubelib2_on_update2 = function(pos, outdir, tlib2, node) - swap_node(pos, "techage:ta4_turbine") - stop_sound(pos) - generator_cmnd(pos, "stop") - end, - networks = { - pipe2 = {}, - }, - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:ta4_turbine", "techage:ta4_turbine_on"}) -Pipe:set_valid_sides("techage:ta4_turbine", {"L", "U"}) -Pipe:set_valid_sides("techage:ta4_turbine_on", {"L", "U"}) - -techage.register_node({"techage:ta4_turbine", "techage:ta4_turbine_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "start" then -- used by heatexchanger1 - swap_node(pos, "techage:ta4_turbine_on") - play_sound(pos) - return generator_cmnd(pos, topic, payload) - elseif topic == "stop" then -- used by heatexchanger1 - swap_node(pos, "techage:ta4_turbine") - stop_sound(pos) - return generator_cmnd(pos, topic, payload) - else -- used by heatexchanger1 - return generator_cmnd(pos, topic, payload) - end - end, - on_node_load = function(pos, node) - if node.name == "techage:ta4_turbine_on" then - play_sound(pos) - end - end, -}) - -minetest.register_craft({ - output = "techage:ta4_turbine", - recipe = { - {"", "dye:blue", ""}, - {"", "techage:turbine", ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) diff --git a/techage/fermenter/gasflare.lua b/techage/fermenter/gasflare.lua deleted file mode 100644 index c11b38d..0000000 --- a/techage/fermenter/gasflare.lua +++ /dev/null @@ -1,182 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Biogas flare - -]]-- - - -local HEIGHT = 7 - -local function remove_flame(pos) - local idx - for idx=HEIGHT,1,-1 do - pos = {x=pos.x, y=pos.y+1, z=pos.z} - local node = minetest.get_node(pos) - if string.find(node.name, "techage:flame") then - minetest.remove_node(pos) - end - end -end - -local function flame(pos) - local idx - for idx=HEIGHT,1,-1 do - pos = {x=pos.x, y=pos.y+1, z=pos.z} - idx = math.min(idx, 12) - local node = minetest.get_node(pos) - if node.name ~= "air" then - return - end - minetest.add_node(pos, {name = "techage:flame"..math.min(idx,7)}) - local meta = minetest.get_meta(pos) - end -end - - -local lRatio = {120, 110, 95, 75, 55, 28, 0} -local lColor = {"000080", "400040", "800000", "800000", "800000", "800000", "800000"} -for idx,ratio in ipairs(lRatio) do - local color = "techage_flame_animated.png^[colorize:#"..lColor[idx].."B0:"..ratio - minetest.register_node("techage:flame"..idx, { - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/8, -4/8, -2/8, 3/8, 4/8, 2/8}, - {-2/8, -4/8, -3/8, 2/8, 4/8, 3/8}, - }, - }, - tiles = { - { - name = color, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1 - }, - }, - }, - - after_destruct = function(pos, oldnode) - pos.y = pos.y + 1 - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "techage_flame") > 0 then - minetest.remove_node(pos) - end - end, - - use_texture_alpha = techage.BLEND, - inventory_image = "techage_flame.png", - paramtype = "light", - light_source = 13, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - damage_per_second = 4 + idx, - groups = {igniter = 2, dig_immediate = 3, techage_flame=1, not_in_creative_inventory=1}, - drop = "", - }) -end - -local function start_flarestack(pos, playername) - if minetest.is_protected( - {x=pos.x, y=pos.y+1, z=pos.z}, - playername) then - return - end - local meta = minetest.get_meta(pos) - flame({x=pos.x, y=pos.y+1, z=pos.z}) - local handle = minetest.sound_play("gasflare", { - pos = pos, - max_hear_distance = 20, - gain = 1, - loop = true}) - --print("handle", handle) - meta:set_int("handle", handle) -end - -local function stop_flarestack(pos, handle) - remove_flame({x=pos.x, y=pos.y+1, z=pos.z}) - minetest.sound_stop(handle) -end - -minetest.register_node("techage:gasflare", { - description = "gas flare", - tiles = { - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png^techage_appl_hole2.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - if node.name ~= "air" then - return - end - minetest.add_node({x=pos.x, y=pos.y+1, z=pos.z}, {name = "techage:gasflare2"}) - end, - - on_punch = function(pos, node, puncher) - local meta = minetest.get_meta(pos) - local handle = meta:get_int("handle") - minetest.sound_stop(handle) - start_flarestack(pos, puncher:get_player_name()) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - --print(dump(oldmetadata)) - stop_flarestack(pos, oldmetadata.fields.handle) - local node = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - if node.name == "techage:gasflare2" then - minetest.remove_node({x=pos.x, y=pos.y+1, z=pos.z}) - end - end, - - paramtype = "light", - light_source = 0, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:gasflare2", { - description = "", - tiles = { - "techage_gasflare.png^techage_appl_hole2.png", - "techage_gasflare.png" - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -4/8, -1/8, 1/8, 4/8, 1/8}, - {-4/8, 3/8, -4/8, 4/8, 4/8, 4/8}, - }, - }, - paramtype = "light", - light_source = 0, - sunlight_propagates = true, - paramtype2 = "facedir", - diggable = false, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) diff --git a/techage/furnace/booster.lua b/techage/furnace/booster.lua deleted file mode 100644 index 87b1736..0000000 --- a/techage/furnace/booster.lua +++ /dev/null @@ -1,199 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Booster - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local PWR_NEEDED = 3 -local CYCLE_TIME = 2 - -local Cable = techage.ElectricCable -local power = networks.power - -local function infotext(pos, state) - M(pos):set_string("infotext", S("TA3 Booster")..": "..state) -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_booster", { - pos = pos, - gain = 1, - max_hear_distance = 7, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - Cable:after_place_node(pos) - local node = minetest.get_node(pos) - local indir = techage.side_to_indir("R", node.param2) - M(pos):set_int("indir", indir) - infotext(pos, "stopped") -end - -local function after_dig_node(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -minetest.register_node("techage:ta3_booster", { - description = S("TA3 Booster"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_appl_arrow.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_electric.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_compressor.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_compressor.png^[transformFX^techage_frame_ta3.png", - }, - - on_timer = function(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed == PWR_NEEDED then - swap_node(pos, "techage:ta3_booster_on") - infotext(pos, "running") - play_sound(pos) - end - return true - end, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta3_booster_on", { - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_appl_arrow.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_electric.png^techage_frame_ta3.png", - { - name = "techage_filling4_ta3.png^techage_appl_compressor4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.2, - }, - }, - { - name = "techage_filling4_ta3.png^techage_appl_compressor4.png^[transformFX]^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.2, - }, - }, - }, - - on_timer = function(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed < PWR_NEEDED then - swap_node(pos, "techage:ta3_booster") - infotext(pos, "no power") - stop_sound(pos) - end - return true - end, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - groups = {not_in_creative_inventory = 1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:ta3_booster", "techage:ta3_booster_on"}, Cable, "con", {"B", "F", "L", "D", "U"}) - --- for intra machine communication -techage.register_node({"techage:ta3_booster", "techage:ta3_booster_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - if M(pos):get_int("indir") == in_dir then - local nvm = techage.get_nvm(pos) - if topic == "power" then - return techage.get_node_lvm(pos).name == "techage:ta3_booster_on" or - power.power_available(pos, Cable) - elseif topic == "running" then - return techage.get_node_lvm(pos).name == "techage:ta3_booster_on" - elseif topic == "start" and not nvm.running then - if power.power_available(pos, Cable) then - nvm.running = true - minetest.get_node_timer(pos):start(CYCLE_TIME) - swap_node(pos, "techage:ta3_booster_on") - infotext(pos, "running") - play_sound(pos) - else - infotext(pos, "no power") - end - elseif topic == "stop" then - nvm.running = false - swap_node(pos, "techage:ta3_booster") - minetest.get_node_timer(pos):stop() - infotext(pos, "stopped") - stop_sound(pos) - end - end - end, - on_node_load = function(pos, node) - if node.name == "techage:ta3_booster_on" then - play_sound(pos) - end - end, -}) - -minetest.register_craft({ - output = "techage:ta3_booster", - recipe = { - {"basic_materials:steel_bar", "default:wood", "basic_materials:steel_bar"}, - {"", "basic_materials:gear_steel", ""}, - {"basic_materials:steel_bar", "default:wood", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/furnace/cooking.lua b/techage/furnace/cooking.lua deleted file mode 100644 index 54304c4..0000000 --- a/techage/furnace/cooking.lua +++ /dev/null @@ -1,228 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Cooking routines for furnace - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local range = techage.in_range - -local Recipes = {} -- registered recipes {output = {recipe, ...},} -local Ingredients = {} -- {{input = output}, -local KeyList = {} -- index to Recipes key translation - -techage.furnace = {} - - -local function all_ingredients_available(output, ingr) - if Recipes[output] then - for idx,recipe in ipairs(Recipes[output]) do - local not_in_list = false - for _,item in ipairs(recipe.input) do - if not techage.in_list(ingr, item) then - not_in_list = true - end - end - if not_in_list == false then - return idx -- list number of the recipe - end - end - end -end - --- Return a list with all outputs of the given list of ingredients -local function get_recipes(ingr) - if #ingr > 0 then - local tbl = {} - for _,item in ipairs(ingr) do - if Ingredients[item] then - for _,output in ipairs(Ingredients[item]) do - if all_ingredients_available(output, ingr) then - techage.add_to_set(tbl, output) - end - end - end - end - return tbl - else - return KeyList - end -end - -function techage.furnace.get_ingredients(pos) - local inv = M(pos):get_inventory() - local tbl = {} - for _,stack in ipairs(inv:get_list('src')) do - if stack:get_name() ~= "" then - tbl[#tbl+1] = stack:get_name() - end - end - return tbl -end - -local function remove_item_from_list(list, item) - for _,stack in ipairs(list) do - if stack:get_name() == item then - stack:set_count(stack:get_count() - 1) - return true - end - end - return false -end - --- move recipe src items to output inventory -local function process(inv, recipe, output) - -- check dst inv - local stack = ItemStack(output) - stack:set_count(recipe.number) - if not inv:room_for_item("dst", stack) then - return techage.BLOCKED - end - -- handle waste - if recipe.waste then - if not inv:room_for_item("dst", ItemStack(recipe.waste)) then - return techage.BLOCKED - end - end - -- remove items - local list = inv:get_list("src") - for _,item in ipairs(recipe.input) do - if not remove_item_from_list(list, item) then - return techage.STANDBY - end - end - -- store changes on scr - inv:set_list("src", list) - -- add output to dst - inv:add_item("dst", stack) - -- add waste to dst - if recipe.waste then - local leftover = inv:add_item("dst", ItemStack(recipe.waste)) - if leftover:get_count() > 0 then - inv:add_item("src", leftover) - return techage.BLOCKED - end - end - return techage.RUNNING -end - -function techage.furnace.check_if_worth_to_wakeup(pos, nvm) - local inv = M(pos):get_inventory() - if not nvm.output or not nvm.num_recipe then - return false - end - local recipe = Recipes[nvm.output] and Recipes[nvm.output][nvm.num_recipe] - if not recipe then - return false - end - -- check dst inv - local stack = ItemStack(nvm.output) - stack:set_count(recipe.number) - if not inv:room_for_item("dst", stack) then - return false - end - -- check src inv - local list = inv:get_list("src") - for _,item in ipairs(recipe.input) do - if not remove_item_from_list(list, item) then - return false - end - end - return true -end - -function techage.furnace.smelting(pos, nvm, elapsed) - local inv = M(pos):get_inventory() - local state = techage.RUNNING - if inv and not inv:is_empty("src") then - if not nvm.output or not nvm.num_recipe then - return techage.FAULT, "recipe error" - end - local recipe = Recipes[nvm.output] and Recipes[nvm.output][nvm.num_recipe] - if not recipe then - return techage.FAULT, "recipe error" - end - - elapsed = elapsed + (nvm.leftover or 0) - while elapsed >= recipe.time do - state = process(inv, recipe, nvm.output) - if state ~= techage.RUNNING then - return state - end - elapsed = elapsed - recipe.time - end - nvm.leftover = elapsed - if recipe.time >= 10 then - nvm.item_percent = math.min(math.floor((nvm.leftover * 100.0) / recipe.time), 100) - else - nvm.item_percent = 100 - end - return state - end - return techage.STANDBY -end - -function techage.furnace.get_output(nvm, ingr, idx) - local tbl = get_recipes(ingr) - idx = range(idx, 1, #tbl) - nvm.output = tbl[idx] or tbl[1] - nvm.num_recipe = all_ingredients_available(nvm.output, ingr) - return nvm.output -end - -function techage.furnace.get_num_recipes(ingr) - return #get_recipes(ingr) -end - -function techage.furnace.reset_cooking(nvm) - nvm.leftover = 0 - nvm.item_percent = 0 -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, " ") - local output = words[1] - local number = tonumber(words[2] or 1) - table.insert(KeyList, output) - --print(recipe.output, dump(recipe.recipe)) - if not Recipes[output] then - Recipes[output] = {} - end - table.insert(Recipes[output], { - input = recipe.recipe, - waste = recipe.waste, - number = number, - time = math.max((recipe.time or 3) * number, 2), - }) - for _,item in ipairs(recipe.recipe) do - if Ingredients[item] then - techage.add_to_set(Ingredients[item], output) - else - Ingredients[item] = {output} - end - end - - recipe.items = recipe.recipe - recipe.type = "ta3_melting" - techage.recipes.register_craft(recipe) -end diff --git a/techage/furnace/firebox.lua b/techage/furnace/firebox.lua deleted file mode 100644 index 608df67..0000000 --- a/techage/furnace/firebox.lua +++ /dev/null @@ -1,226 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Industrial Furnace Firebox - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local firebox = techage.firebox -local fuel = techage.fuel -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - -local CYCLE_TIME = 2 -local EFFICIENCY = 2 -- burn cycles -local CATEGORY = 3 - -local function has_fuel(pos, nvm) - return (nvm.burn_cycles or 0) > 0 or (nvm.liquid and nvm.liquid.amount and nvm.liquid.amount > 0) -end - -local function stop_firebox(pos, nvm) - nvm.running = false - firebox.swap_node(pos, "techage:furnace_firebox") - minetest.get_node_timer(pos):stop() - M(pos):set_string("formspec", fuel.formspec(nvm)) -end - -local function furnace_active(pos) - -- Check if furnace is not in standby mode - return techage.get_node_lvm({x=pos.x, y=pos.y+1, z=pos.z}).name == "techage:ta3_furnace_act" -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - if nvm.running and furnace_active(pos) then - nvm.burn_cycles = (nvm.burn_cycles or 0) - 1 - if nvm.burn_cycles <= 0 then - if nvm.liquid.amount > 0 then - nvm.liquid.amount = nvm.liquid.amount - 1 - nvm.burn_cycles = fuel.burntime(nvm.liquid.name) * EFFICIENCY / CYCLE_TIME - nvm.burn_cycles_total = nvm.burn_cycles - else - nvm.liquid.name = nil - stop_firebox(pos, nvm) - return false - end - end - else - stop_firebox(pos, nvm) - return false - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", fuel.formspec(nvm)) - end - return true -end - -local function start_firebox(pos, nvm) - - if not nvm.running and furnace_active(pos) then - nvm.running = true - node_timer(pos, 0) - firebox.swap_node(pos, "techage:furnace_firebox_on") - minetest.get_node_timer(pos):start(CYCLE_TIME) - M(pos):set_string("formspec", fuel.formspec(nvm)) - end -end - -local function booster_cmnd(pos, cmnd) - return techage.transfer( - pos, - "L", -- outdir - cmnd, -- topic - nil, -- payload - nil, -- network - {"techage:ta3_booster", "techage:ta3_booster_on"}) -end - -minetest.register_node("techage:furnace_firebox", { - description = S("TA3 Furnace Oil Burner"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_appl_open.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_appl_firehole.png^techage_frame_ta3.png", - }, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - - on_timer = node_timer, - can_dig = fuel.can_dig, - on_punch = fuel.on_punch, - on_receive_fields = fuel.on_receive_fields, - on_rightclick = fuel.on_rightclick, - - on_construct = function(pos) - local nvm = techage.get_nvm(pos) - techage.add_node(pos, "techage:furnace_firebox", true) - nvm.running = false - nvm.burn_cycles = 0 - nvm.liquid = {} - nvm.liquid.amount = 0 - local meta = M(pos) - meta:set_string("formspec", fuel.formspec(nvm)) - local inv = meta:get_inventory() - inv:set_size('fuel', 1) - end, -}) - -minetest.register_node("techage:furnace_firebox_on", { - description = S("TA3 Furnace Oil Burner"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - { - name = "techage_concrete4.png^techage_appl_firehole4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - }, - paramtype2 = "facedir", - light_source = 8, - on_rotate = screwdriver.disallow, - diggable = false, - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - drop = "techage:furnace_firebox", - - on_timer = node_timer, - can_dig = fuel.can_dig, - on_receive_fields = fuel.on_receive_fields, - on_punch = fuel.on_punch, - on_rightclick = fuel.on_rightclick, -}) - -minetest.register_craft({ - output = "techage:furnace_firebox", - recipe = { - {'techage:basalt_stone', 'techage:basalt_stone', 'techage:basalt_stone'}, - {'default:steel_ingot', '', 'default:steel_ingot'}, - {'techage:basalt_stone', 'techage:basalt_stone', 'techage:basalt_stone'}, - }, -}) - -techage.register_node({"techage:furnace_firebox", "techage:furnace_firebox_on"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - return nvm.running and "running" or "stopped" - elseif topic == "fuel" then - return fuel.get_fuel_amount(nvm) - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 128 then - return 0, techage.get_node_lvm(pos).name - elseif topic == 129 then -- State - return 0, {nvm.running and techage.RUNNING or techage.STOPPED} - elseif topic == 132 then -- Fuel Level - return 0, {fuel.get_fuel_amount(nvm)} - else - return 2, "" - end - end, - -- called from furnace_top - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "fuel" then - return has_fuel(pos, nvm) and booster_cmnd(pos, "power") - elseif topic == "running" then - return nvm.running and booster_cmnd(pos, "running") - elseif topic == "start" then - start_firebox(pos, nvm) - booster_cmnd(pos, "start") - elseif topic == "stop" then - stop_firebox(pos, nvm) - booster_cmnd(pos, "stop") - end - end, - on_node_load = function(pos, node) - local inv = M(pos):get_inventory() - if not inv:is_empty("fuel") then - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - local count = inv:get_stack("fuel", 1):get_count() - nvm.liquid.amount = (nvm.liquid.amount or 0) + count - nvm.liquid.name = "techage:gasoline" - inv:set_stack("fuel", 1, nil) - end - end, -}) - -liquid.register_nodes({"techage:furnace_firebox", "techage:furnace_firebox_on"}, - Pipe, "tank", nil, fuel.get_liquid_table(fuel.BT_OIL, fuel.CAPACITY, start_firebox)) diff --git a/techage/furnace/furnace_top.lua b/techage/furnace/furnace_top.lua deleted file mode 100644 index 1838088..0000000 --- a/techage/furnace/furnace_top.lua +++ /dev/null @@ -1,339 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Industrial Furnace Top - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local STANDBY_TICKS = 6 -local COUNTDOWN_TICKS = 6 -local CYCLE_TIME = 2 - -local smelting = techage.furnace.smelting -local get_output = techage.furnace.get_output -local num_recipes = techage.furnace.get_num_recipes -local reset_cooking = techage.furnace.reset_cooking -local get_ingredients = techage.furnace.get_ingredients -local check_if_worth_to_wakeup = techage.furnace.check_if_worth_to_wakeup -local range = techage.in_range -local MP = minetest.get_modpath(minetest.get_current_modname()) -local mConf = assert(loadfile(MP .. "/basis/conf_inv.lua"))("cfg") - -local WRENCH_MENU3 = { - { - type = "items", - name = "config", - label = S("Pre-Assignment Input Inv."), - tooltip = S("Stack locations can be pre-assigned to specific items,\nto be filled only with those items."), - width = 2, - height = 2, - } -} - -local function update_recipe_menu(pos, nvm) - local ingr = get_ingredients(pos) - nvm.rp_num = num_recipes(ingr) - nvm.rp_idx = range(nvm.rp_idx or 1, 0, nvm.rp_num) - nvm.rp_outp = get_output(nvm, ingr, nvm.rp_idx) -end - -local function formspec(self, pos, nvm) - local idx = nvm.rp_idx or 1 - local num = nvm.rp_num or 1 - local outp = nvm.rp_outp or "" - return "size[8,7.2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - techage.wrench_image(7.6, -0.2) .. - "list[context;src;0,0;2,2;]".. - mConf.preassigned_stacks(pos, 2, 2).. - "image[2,0.5;1,1;techage_form_arrow_bg.png^[lowpart:".. - (nvm.item_percent or 0)..":techage_form_arrow_fg.png^[transformR270]".. - "image_button[2,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[2,2;1,1;"..self:get_state_tooltip(nvm).."]".. - - "list[context;dst;3,0;2,2;]".. - - "label[6,0;"..S("Outp")..": "..idx.."/"..num.."]".. - "item_image_button[6.5,0.5;1,1;"..outp..";b1;]".. - "button[6,1.5;1,1;priv;<<]".. - "button[7,1.5;1,1;next;>>]".. - - "list[current_player;main;0,3.5;8,4;]" .. - "listring[current_player;main]".. - "listring[context;src]" .. - "listring[current_player;main]".. - "listring[context;dst]" .. - "listring[current_player;main]".. - default.get_hotbar_bg(0, 3.5) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) -end - -local function firebox_cmnd(pos, cmnd) - return techage.transfer( - {x=pos.x, y=pos.y-1, z=pos.z}, - nil, -- outdir - cmnd, -- topic - nil, -- payload - nil, -- network - {"techage:furnace_firebox", "techage:furnace_firebox_on", - "techage:furnace_heater", "techage:furnace_heater_on"}) -end - -local function firebox_has_fuel(nvm, pos) - if nvm.techage_state == techage.RUNNING then - return firebox_cmnd(pos, "running") - else - return firebox_cmnd(pos, "fuel") - end -end - -local function cooking(pos, crd, nvm, elapsed) - if nvm.techage_state == techage.RUNNING or check_if_worth_to_wakeup(pos, nvm) then - if firebox_has_fuel(nvm, pos) then - local state, err = smelting(pos, nvm, elapsed) - if state == techage.RUNNING then - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - elseif state == techage.BLOCKED then - crd.State:blocked(pos, nvm) - elseif state == techage.FAULT then - crd.State:fault(pos, nvm, err) - elseif state == techage.STANDBY then - crd.State:idle(pos, nvm) - end - else - crd.State:standby(pos, nvm, S("no fuel or no power")) - end - end -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - cooking(pos, crd, nvm, elapsed) - nvm.toggle = not nvm.toggle - if nvm.toggle then -- progress bar/arrow - M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) - end -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if listname == "src" then - local nvm = techage.get_nvm(pos) - return stack:get_count() - elseif listname == "dst" then - return 0 - end -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_metadata_inventory(pos) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - nvm.rp_idx = nvm.rp_idx or 1 - if fields.next == ">>" then - local ingr = get_ingredients(pos) - nvm.rp_idx = math.min(nvm.rp_idx + 1, num_recipes(ingr)) - update_recipe_menu(pos, nvm) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - reset_cooking(nvm) - elseif fields.priv == "<<" then - local ingr = get_ingredients(pos) - nvm.rp_idx = range(nvm.rp_idx - 1, 1, num_recipes(ingr)) - update_recipe_menu(pos, nvm) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - reset_cooking(nvm) - end - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - -local function can_start(pos, nvm, state) - if not firebox_cmnd(pos, "fuel") then - return S("no fuel or no power") - end - return true -end - -local function on_node_state_change(pos, old_state, new_state) - local pwr1 = techage.needs_power2(old_state) - local pwr2 = techage.needs_power2(new_state) - if pwr1 ~= pwr2 then - if pwr2 then - firebox_cmnd(pos, "start") - else - firebox_cmnd(pos, "stop") - end - end - local nvm = techage.get_nvm(pos) - reset_cooking(nvm) -end - -local tiles = {} - --- '#' will be replaced by the stage number -tiles.pas = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_frame_ta#_top.png", - "techage_concrete.png^techage_frame_ta#_top.png", - "techage_concrete.png^techage_frame_ta#.png^techage_appl_outp.png", - "techage_concrete.png^techage_frame_ta#.png^techage_appl_inp.png", - "techage_concrete.png^techage_frame_ta#.png", - "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta#.png", -} -tiles.act = tiles.pas - -local tubing = { - on_inv_request = function(pos, in_dir, access_type) - if access_type == "push" then - local meta = minetest.get_meta(pos) - if meta:get_int("push_dir") == in_dir or in_dir == 5 then - return meta:get_inventory(), "src" - end - end - end, - 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(pos, inv, "dst", num) - end - end, - on_push_item = function(pos, in_dir, stack, idx) - 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() - local mem = techage.get_mem(pos) - - mem.filter = mem.filter or mConf.item_filter(pos, 4) - mem.chest_configured = mem.chest_configured or not inv:is_empty("cfg") - - if mem.chest_configured then - local name = stack:get_name() - local stacks = mem.filter[name] or mem.filter["unconfigured"] - return mConf.put_items(pos, inv, "src", stack, stacks, idx) - else - return techage.put_items(inv, "src", stack, idx) - end - 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, src, topic, payload) - if topic == "output" then - local nvm = techage.get_nvm(pos) - return string.split(nvm.output or "unknown", " ")[1] - else - return CRD(pos).State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 141 then -- Furnace Output - local nvm = techage.get_nvm(pos) - return 0, string.split(nvm.output or "unknown", " ")[1] - else - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end - end, -} - -local _, node_name_ta3, _ = - techage.register_consumer("furnace", S("Furnace Top"), tiles, { - drawtype = "normal", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - can_start = can_start, - on_state_change = on_node_state_change, - after_place_node = function(pos, placer) - local inv = M(pos):get_inventory() - inv:set_size("src", 2*2) - inv:set_size("dst", 2*2) - inv:set_size("cfg", 2*2) - end, - can_dig = can_dig, - node_timer = keep_running, - on_receive_fields = on_receive_fields, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_metadata_inventory_put = on_metadata_inventory, - on_metadata_inventory_take = on_metadata_inventory, - on_metadata_inventory_move = on_metadata_inventory, - ta3_formspec = WRENCH_MENU3, - on_rightclick = on_rightclick, - groups = {choppy=2, cracky=2, crumbly=2}, - sounds = default.node_sound_wood_defaults(), - num_items = {0,1,1,1}, - }, - {false, false, true, false}) -- TA3 only - - - -minetest.register_craft({ - output = node_name_ta3, - recipe = { - {"", "techage:usmium_nuggets", ""}, - {"default:steel_ingot", "default:furnace", "default:steel_ingot"}, - {"", "techage:vacuum_tube", ""}, - }, -}) diff --git a/techage/furnace/heater.lua b/techage/furnace/heater.lua deleted file mode 100644 index 2037d53..0000000 --- a/techage/furnace/heater.lua +++ /dev/null @@ -1,136 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Industrial Furnace Heater - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local PWR_NEEDED = 14 -local CYCLE_TIME = 2 - -local Cable = techage.ElectricCable -local power = networks.power - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - - -local function after_place_node(pos) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -minetest.register_node("techage:furnace_heater", { - description = S("TA4 Furnace Heater"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_appl_open.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png^techage_appl_hole_electric.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_appl_heater.png^techage_frame_ta3.png", - }, - - on_timer = function(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed == PWR_NEEDED then - swap_node(pos, "techage:furnace_heater_on") - end - return true - end, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -minetest.register_node("techage:furnace_heater_on", { - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_appl_open.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_frame_ta3.png^techage_appl_hole_electric.png", - "techage_concrete.png^techage_frame_ta3.png", - "techage_concrete.png^techage_appl_heater_on.png^techage_frame_ta3.png", - }, - - on_timer = function(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed < PWR_NEEDED then - swap_node(pos, "techage:furnace_heater") - end - return true - end, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - light_source = 8, - paramtype2 = "facedir", - groups = {not_in_creative_inventory = 1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:furnace_heater", "techage:furnace_heater_on"}, Cable, "con", {"B", "F", "L", "D", "U"}) - -techage.register_node({"techage:furnace_heater", "techage:furnace_heater_on"}, { - -- called from furnace_top - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "fuel" then - return power.power_available(pos, Cable) - elseif topic == "running" then - return techage.get_node_lvm(pos).name == "techage:furnace_heater_on" - elseif topic == "start" and not nvm.running then - if power.power_available(pos, Cable) then - nvm.running = true - minetest.get_node_timer(pos):start(CYCLE_TIME) - return true - end - elseif topic == "stop" and nvm.running then - nvm.running = false - swap_node(pos, "techage:furnace_heater") - minetest.get_node_timer(pos):stop() - return true - end - end -}) - -minetest.register_craft({ - output = "techage:furnace_heater", - recipe = { - {'techage:aluminum', 'default:steel_ingot', 'techage:aluminum'}, - {'techage:basalt_stone', 'basic_materials:heating_element', 'techage:basalt_stone'}, - {'techage:aluminum', 'techage:ta4_furnace_ceramic', 'techage:aluminum'}, - }, -}) diff --git a/techage/furnace/recipes.lua b/techage/furnace/recipes.lua deleted file mode 100644 index 47a98b2..0000000 --- a/techage/furnace/recipes.lua +++ /dev/null @@ -1,170 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Cooking recipes for furnace - -]]-- - - -techage.furnace.register_recipe({ - output = "techage:iron_ingot", - recipe = {"default:iron_lump"}, - time = 2, -}) - -techage.furnace.register_recipe({ - output = "default:obsidian", - recipe = {"default:cobble"}, - time = 8, -}) - -if techage.modified_recipes_enabled then - techage.furnace.register_recipe({ - output = "default:bronze_ingot 4", - recipe = {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot", "default:tin_ingot"}, - time = 2, - }) - - techage.furnace.register_recipe({ - output = "default:steel_ingot 4", - recipe = {"default:coal_lump", "default:iron_lump", "default:iron_lump", "default:iron_lump"}, - time = 4, - }) -end - -if minetest.global_exists("wielded_light") then - techage.furnace.register_recipe({ - output = "techage:meridium_ingot", - recipe = {"default:steel_ingot", "default:mese_crystal_fragment"}, - heat = 4, - time = 3, - }) -end - -local function node_group(group) - local tbl = {} - for key,_ in pairs(minetest.registered_items) do - if minetest.get_item_group(key, group) > 0 then - tbl[#tbl + 1] = key - end - end - return tbl -end - -minetest.after(1, function() - for key,_ in pairs(minetest.registered_items) do - if key ~= "" then - local tbl = minetest.get_all_craft_recipes(key) - if tbl then - for _,recipe in ipairs(tbl) do - if recipe and recipe.method == "cooking" then - if recipe.items[1] and string.split(recipe.items[1], ":")[1] == "group" then - for _,item in ipairs(node_group(string.split(recipe.items[1], ":")[2])) do - techage.furnace.register_recipe({ - output = recipe.output, - recipe = {item}, - time = math.floor((recipe.width + 1) / 2), - }) - end - else - techage.furnace.register_recipe({ - output = recipe.output, - recipe = recipe.items, - time = math.floor((recipe.width + 1) / 2), - }) - end - end - end - end - end - end -end) - -techage.furnace.register_recipe({ - output = "techage:basalt_glass2", - recipe = { - "techage:basalt_gravel", - "techage:basalt_gravel", - }, - time = 4, -}) - -techage.furnace.register_recipe({ - output = "techage:basalt_glass", - recipe = { - "techage:sieved_basalt_gravel", - "techage:sieved_basalt_gravel", - }, - time = 4, -}) - -techage.furnace.register_recipe({ - output = "techage:basalt_glass_thin2 2", - recipe = { - "techage:basalt_gravel", - }, - time = 4, -}) - -techage.furnace.register_recipe({ - output = "techage:basalt_glass_thin 2", - recipe = { - "techage:sieved_basalt_gravel", - }, - time = 4, -}) - -techage.furnace.register_recipe({ - output = "techage:basalt_glass_thin_xl2", - recipe = { - "techage:basalt_gravel", - }, - time = 4, -}) - -techage.furnace.register_recipe({ - output = "techage:basalt_glass_thin_xl", - recipe = { - "techage:sieved_basalt_gravel", - }, - time = 4, -}) - -techage.furnace.register_recipe({ - output = "basic_materials:concrete_block 4", - recipe = { - "basic_materials:wet_cement", - "default:sand", - "default:gravel", - "techage:steelmat", - }, - time = 4, -}) - -if minetest.global_exists("moreores") then - - if techage.modified_recipes_enabled then - minetest.clear_craft({output = "moreores:mithril_ingot"}) - minetest.clear_craft({output = "moreores:silver_ingot"}) - end - - techage.furnace.register_recipe({ - output = 'moreores:silver_ingot', - recipe = {'moreores:silver_lump'}, - time = 2, - }) - - techage.furnace.register_recipe({ - output = 'moreores:mithril_ingot', - recipe = {'moreores:mithril_lump'}, - time = 5, - }) - -end diff --git a/techage/fusion_reactor/controller.lua b/techage/fusion_reactor/controller.lua deleted file mode 100644 index 641ba92..0000000 --- a/techage/fusion_reactor/controller.lua +++ /dev/null @@ -1,288 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Fusion Reactor Controller - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local sched = techage.scheduler -local power = networks.power -local control = networks.control - -local CYCLE_TIME = 2 -local STANDBY_TICKS = 1 -local COUNTDOWN_TICKS = 1 -local PWR_NEEDED = 400 -local EXPECTED_PLASMA_NUM = 56 -local EXPECTED_SHELL_NUM = 56 -local EXPECTED_MAGNET_NUM = 56 -local CALL_RATE1 = 16 -- 2s * 16 = 32s -local CALL_RATE2 = 8 -- 2s * 8 = 16s -local DESCRIPTION = S("TA5 Fusion Reactor Controller") -local EX_POINTS = 60 - -local function count_trues(t) - local cnt = 0 - for _,v in ipairs(t) do - if v then - cnt = cnt + 1 - end - end - return cnt -end - -local function nucleus(t) - t = techage.tbl_filter(t, function(v, k, t) return type(v) == "table" end) - if #t == 4 then - if vector.equals(t[1], t[2]) and vector.equals(t[3], t[4]) then - return true - end - end - return S("Nucleus detection error") -end - -local tSched = {} - -sched.register(tSched, CALL_RATE1, 0, function(pos, outdir) - local resp = control.request(pos, Cable, outdir, "con", "connect") - local cnt = count_trues(resp) - if cnt ~= EXPECTED_MAGNET_NUM then - return S("Magnet detection error\n(@1% found / 100% expected)", math.floor(cnt* 100 / EXPECTED_MAGNET_NUM)) - end - return true - end) - -sched.register(tSched, CALL_RATE1, 1, function(pos, outdir) - local resp = control.request(pos, Cable, outdir, "con", "test_plasma") - local cnt = count_trues(resp) - if cnt ~= EXPECTED_PLASMA_NUM then - return S("Plasma ring shape error") - end - return true - end) - -sched.register(tSched, CALL_RATE1, 2, function(pos, outdir) - local resp = control.request(pos, Cable, outdir, "con", "test_shell") - local cnt = count_trues(resp) - if cnt ~= EXPECTED_SHELL_NUM then - return S("Shell shape error\n(@1% found / 100% expected)", math.floor(cnt* 100 / EXPECTED_SHELL_NUM)) - end - return true - end) - -sched.register(tSched, CALL_RATE1, 3, function(pos, outdir) - local resp = control.request(pos, Cable, outdir, "con", "test_nucleus") - return nucleus(resp) - end) - -sched.register(tSched, CALL_RATE2, 4, function(pos, outdir) - local resp = control.request(pos, Cable, outdir, "con", "inc_power") - local cnt = count_trues(resp) - --print("inc_power", cnt) - if cnt < 52 then - return S("Cooling failed") - end - return true - end) - -local function can_start(pos, nvm) - local outdir = networks.side_to_outdir(pos, "L") - if not power.power_available(pos, Cable, outdir) then - return S("No power") - end - outdir = networks.side_to_outdir(pos, "R") - control.request(pos, Cable, outdir, "con", "rst_power") - for i = 0,4 do - local res = tSched[i](pos, outdir) - if res ~= true then return res end - end - return true -end - -local function start_node(pos, nvm) - sched.init(pos) - local outdir = networks.side_to_outdir(pos, "R") - control.send(pos, Cable, outdir, "con", "on") - sched.init(pos) -end - -local function stop_node(pos, nvm) - local outdir = networks.side_to_outdir(pos, "R") - control.send(pos, Cable, outdir, "con", "off") -end - -local function formspec(self, pos, nvm) - return "size[5,3]".. - "box[0,-0.1;4.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", DESCRIPTION) .. "]" .. - "image_button[2,1.5;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[2,1.5;1,1;"..self:get_state_tooltip(nvm).."]" -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta5_fr_controller_pas", - node_name_active = "techage:ta5_fr_controller_act", - cycle_time = CYCLE_TIME, - infotext_name = DESCRIPTION, - standby_ticks = STANDBY_TICKS, - can_start = can_start, - start_node = start_node, - stop_node = stop_node, - formspec_func = formspec, -}) - -local function after_place_node(pos, placer, itemstack) - local nvm = techage.get_nvm(pos) - local meta = M(pos) - local own_num = techage.add_node(pos, "techage:ta5_fr_controller_pas") - State:node_init(pos, nvm, own_num) - meta:set_string("owner", placer:get_player_name()) - Cable:after_place_node(pos) -end - -local function consume_power(pos, nvm, outdir) - if techage.needs_power(nvm) then - local taken = power.consume_power(pos, Cable, outdir, PWR_NEEDED) - if techage.is_running(nvm) then - if taken < PWR_NEEDED then - State:nopower(pos, nvm, "No power") - stop_node(pos, nvm) - else - return true -- keep running - end - end - end -end - -local function node_timer(pos) - local nvm = techage.get_nvm(pos) - local outdir = networks.side_to_outdir(pos, "L") - if consume_power(pos, nvm, outdir) then - local resp = sched.get(pos, tSched, function() - return true end)(pos, networks.Flip[outdir]) - if resp ~= true then - State:fault(pos, nvm, resp) - stop_node(pos, nvm) - else - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - end - return State:is_active(nvm) -end - -local function after_dig_node(pos, oldnode, oldmetadata) - Cable:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - if techage.get_expoints(player) >= EX_POINTS then - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - --M(pos):set_string("formspec", formspec(State, pos, nvm)) - end -end - -minetest.register_node("techage:ta5_fr_controller_pas", { - description = S("TA5 Fusion Reactor Controller"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_appl_plasma.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_appl_plasma.png^techage_frame_ta5.png", - }, - after_place_node = after_place_node, - on_timer = node_timer, - after_dig_node = after_dig_node, - on_receive_fields = on_receive_fields, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta5_fr_controller_act", { - description = S("TA5 Fusion Reactor Controller"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_electric.png", - { - name = "techage_filling4_ta4.png^techage_appl_plasma4.png^techage_frame4_ta5.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 64, - aspect_h = 64, - length = 0.5, - }, - }, - { - name = "techage_filling4_ta4.png^techage_appl_plasma4.png^techage_frame4_ta5.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 64, - aspect_h = 64, - length = 0.5, - }, - }, - }, - after_place_node = after_place_node, - on_timer = node_timer, - after_dig_node = after_dig_node, - on_receive_fields = on_receive_fields, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - drop = "", - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -techage.register_node({"techage:ta5_fr_controller_pas", "techage:ta5_fr_controller_act"}, { - on_recv_message = function(pos, src, topic, payload) - return State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return State:on_beduino_request_data(pos, topic, payload) - end, -}) - -power.register_nodes({"techage:ta5_fr_controller_pas", "techage:ta5_fr_controller_act"}, Cable, "con", {"L", "R"}) - -minetest.register_craft({ - output = "techage:ta5_fr_controller_pas", - recipe = { - {'techage:aluminum', 'basic_materials:gold_wire', 'default:steel_ingot'}, - {'techage:electric_cableS', 'techage:ta5_aichip2', 'techage:electric_cableS'}, - {'default:steel_ingot', 'default:diamond', 'techage:aluminum'}, - }, -}) - diff --git a/techage/fusion_reactor/gas_pipe.lua b/techage/fusion_reactor/gas_pipe.lua deleted file mode 100644 index 108164d..0000000 --- a/techage/fusion_reactor/gas_pipe.lua +++ /dev/null @@ -1,331 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Gas Pipes - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local MAX_PIPE_LENGHT = 100 - -local liquid = networks.liquid - -local Pipe = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = MAX_PIPE_LENGHT, - show_infotext = false, - force_to_use_tubes = false, - tube_type = "pipe3", - primary_node_names = { - "techage:ta5_pipe1S", "techage:ta5_pipe1A", - "techage:ta5_pipe2S", "techage:ta5_pipe2A", - }, - secondary_node_names = {}, - after_place_tube = function(pos, param2, tube_type, num_tubes) - local name = minetest.get_node(pos).name - if not networks.hidden_name(pos) then - local name = minetest.get_node(pos).name - if name == "techage:ta5_pipe1S" or name == "techage:ta5_pipe1A" then - minetest.swap_node(pos, {name = "techage:ta5_pipe1"..tube_type, param2 = param2 % 32}) - else - minetest.swap_node(pos, {name = "techage:ta5_pipe2"..tube_type, param2 = param2 % 32}) - end - end - M(pos):set_int("netw_param2", param2) - end, -}) - --- Enable hidden cables -networks.use_metadata(Pipe) - --- Use global callback instead of node related functions -Pipe:register_on_tube_update2(function(pos, outdir, tlib2, node) - liquid.update_network(pos, outdir, tlib2, node) -end) - -minetest.register_node("techage:ta5_pipe1S", { - description = S("TA5 Pipe"), - tiles = { - "techage_ta5_gaspipe.png^[transformR90^[colorize:#000080:160", - "techage_ta5_gaspipe.png^[transformR90^[colorize:#000080:160", - "techage_ta5_gaspipe.png^[colorize:#000080:160", - "techage_ta5_gaspipe.png^[colorize:#000080:160", - "techage_ta5_gaspipe_hole2.png^[colorize:#000080:160", - "techage_ta5_gaspipe_hole2.png^[colorize:#000080:160", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Pipe:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -1/16, -8/16, 1/16, 1/16, 8/16}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta5_pipe1A", { - description = S("TA5 Pipe"), - tiles = { - "techage_ta5_gaspipe_knee2.png^[colorize:#000080:160", - "techage_ta5_gaspipe_hole2.png^[transformR180^[colorize:#000080:160", - "techage_ta5_gaspipe_knee.png^[transformR270^[colorize:#000080:160", - "techage_ta5_gaspipe_knee.png^[colorize:#000080:160", - "techage_ta5_gaspipe_knee2.png^[colorize:#000080:160", - "techage_ta5_gaspipe_hole2.png^[colorize:#000080:160", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -8/16, -1/16, 1/16, 1/16, 1/16}, - {-2/16, -0.5, -2/16, 2/16, -13/32, 2/16}, - {-1/16, -1/16, -8/16, 1/16, 1/16, -1/16}, - {-2/16, -2/16, -0.5, 2/16, 2/16, -13/32}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, - not_in_creative_inventory=1, techage_trowel = 1}, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta5_pipe1S", -}) - -minetest.register_node("techage:ta5_pipe2S", { - description = S("TA5 Pipe"), - tiles = { - "techage_ta5_gaspipe.png^[transformR90^[colorize:#008000:160", - "techage_ta5_gaspipe.png^[transformR90^[colorize:#008000:160", - "techage_ta5_gaspipe.png^[colorize:#008000:160", - "techage_ta5_gaspipe.png^[colorize:#008000:160", - "techage_ta5_gaspipe_hole2.png^[colorize:#008000:160", - "techage_ta5_gaspipe_hole2.png^[colorize:#008000:160", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Pipe:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -1/16, -8/16, 1/16, 1/16, 8/16}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta5_pipe2A", { - description = S("TA5 Pipe"), - tiles = { - "techage_ta5_gaspipe_knee2.png^[colorize:#008000:160", - "techage_ta5_gaspipe_hole2.png^[transformR180^[colorize:#008000:160", - "techage_ta5_gaspipe_knee.png^[transformR270^[colorize:#008000:160", - "techage_ta5_gaspipe_knee.png^[colorize:#008000:160", - "techage_ta5_gaspipe_knee2.png^[colorize:#008000:160", - "techage_ta5_gaspipe_hole2.png^[colorize:#008000:160", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -8/16, -1/16, 1/16, 1/16, 1/16}, - {-2/16, -0.5, -2/16, 2/16, -13/32, 2/16}, - {-1/16, -1/16, -8/16, 1/16, 1/16, -1/16}, - {-2/16, -2/16, -0.5, 2/16, 2/16, -13/32}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, - not_in_creative_inventory=1, techage_trowel = 1}, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta5_pipe2S", -}) - -local size1 = 1/16 -local size2 = 2/16 -local size3 = 13/32 -local Boxes = { - { - {-size1, -size1, size1, size1, size1, 0.5 }, -- z+ - {-size2, -size2, size3, size2, size2, 0.5 }, -- z+ - }, - { - {-size1, -size1, -size1, 0.5, size1, size1}, -- x+ - { size3, -size2, -size2, 0.5, size2, size2}, -- x+ - }, - { - {-size1, -size1, -0.5, size1, size1, size1}, -- z- - {-size2, -size2, -0.5, size2, size2, -size3}, -- z- - }, - { - {-0.5, -size1, -size1, size1, size1, size1}, -- x- - {-0.5, -size2, -size2, -size3, size2, size2}, -- x- - }, - { - {-size1, -0.5, -size1, size1, size1, size1}, -- y- - {-size2, -0.5, -size2, size2, -size3, size2}, -- y- - }, - { - {-size1, -size1, -size1, size1, 0.5, size1}, -- y+ - {-size2, size3, -size2, size2, 0.5, size2}, -- y+ - } -} - -local names1 = networks.register_junction("techage:ta5_junctionpipe1", 1/8, Boxes, Pipe, { - description = S("TA5 Junction Pipe"), - tiles = {"techage_ta5_gaspipe_junction.png^[colorize:#000080:160"}, - use_texture_alpha = techage.CLIP, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, - sounds = default.node_sound_metal_defaults(), - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local name = "techage:ta5_junctionpipe1" .. networks.junction_type(pos, Pipe) - minetest.swap_node(pos, {name = name, param2 = 0}) - Pipe:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir1, tlib2, node) - if not networks.hidden_name(pos) then - local name = "techage:ta5_junctionpipe1" .. networks.junction_type(pos, Pipe) - minetest.swap_node(pos, {name = name, param2 = 0}) - end - liquid.update_network(pos, 0, tlib2, node) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - end, -}, 25) - -local names2 = networks.register_junction("techage:ta5_junctionpipe2", 1/8, Boxes, Pipe, { - description = S("TA5 Junction Pipe"), - tiles = {"techage_ta5_gaspipe_junction.png^[colorize:#008000:160"}, - use_texture_alpha = techage.CLIP, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, - sounds = default.node_sound_metal_defaults(), - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local name = "techage:ta5_junctionpipe2" .. networks.junction_type(pos, Pipe) - minetest.swap_node(pos, {name = name, param2 = 0}) - Pipe:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir1, tlib2, node) - if not networks.hidden_name(pos) then - local name = "techage:ta5_junctionpipe2" .. networks.junction_type(pos, Pipe) - minetest.swap_node(pos, {name = name, param2 = 0}) - end - liquid.update_network(pos, 0, tlib2, node) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - end, -}, 25) - -liquid.register_nodes(names1, Pipe, "junc") -liquid.register_nodes(names2, Pipe, "junc") - -minetest.register_craft({ - output = "techage:ta5_pipe1S 6", - recipe = { - {'', '', "default:steel_ingot"}, - {'', 'dye:blue', 'techage:ta4_carbon_fiber'}, - {"", '', 'techage:aluminum'}, - }, -}) - -minetest.register_craft({ - output = "techage:ta5_pipe2S 6", - recipe = { - {'', '', "default:steel_ingot"}, - {'', 'dye:green', 'techage:ta4_carbon_fiber'}, - {"", '', 'techage:aluminum'}, - }, -}) - -minetest.register_craft({ - output = "techage:ta5_junctionpipe125 2", - recipe = { - {"", "techage:ta5_pipe1S", ""}, - {"techage:ta5_pipe1S", "", "techage:ta5_pipe1S"}, - {"", "techage:ta5_pipe1S", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta5_junctionpipe225 2", - recipe = { - {"", "techage:ta5_pipe2S", ""}, - {"techage:ta5_pipe2S", "", "techage:ta5_pipe2S"}, - {"", "techage:ta5_pipe2S", ""}, - }, -}) - -techage.GasPipe = Pipe diff --git a/techage/fusion_reactor/generator.lua b/techage/fusion_reactor/generator.lua deleted file mode 100644 index e61735a..0000000 --- a/techage/fusion_reactor/generator.lua +++ /dev/null @@ -1,278 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Fusion Reactor Generator -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local CYCLE_TIME = 2 -local STANDBY_TICKS = 1 -local COUNTDOWN_TICKS = 2 -local PWR_PERF = 800 - -local function formspec(self, pos, nvm) - return techage.generator_formspec(self, pos, nvm, S("TA5 Generator"), nvm.provided, PWR_PERF) -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function can_start(pos, nvm, state) - if nvm.alive_cnt and nvm.alive_cnt > 0 then - return true - end - return S("no steam") -end - -local function start_node(pos, nvm) - local meta = M(pos) - nvm.provided = 0 - nvm.alive_cnt = 5 - techage.evaluate_charge_termination(nvm, meta) - local outdir = meta:get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local function stop_node(pos, nvm) - nvm.provided = 0 - nvm.alive_cnt = 0 - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta5_generator", - node_name_active = "techage:ta5_generator_on", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - infotext_name = S("TA5 Generator"), - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if (nvm.alive_cnt or 0) > 0 then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local running = techage.is_running(nvm) - nvm.alive_cnt = (nvm.alive_cnt or 0) - 1 - local alive = nvm.alive_cnt > 0 - if running and not alive then - State:standby(pos, nvm, S("no steam")) - stop_node(pos, nvm, State) - elseif not running and alive then - State:start(pos, nvm) - elseif running then - local meta = M(pos) - local outdir = meta:get_int("outdir") - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Cable, outdir, PWR_PERF, tp1, tp2) - local val = power.get_storage_load(pos, Cable, outdir, PWR_PERF) - if val > 0 then - nvm.load = val - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) -end - -minetest.register_node("techage:ta5_generator", { - description = S("TA5 Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_appl_hole_electric.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_generator.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_generator.png^[transformFX]", - }, - - after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta5_generator") - State:node_init(pos, nvm, number) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - Cable:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - - get_generator_data = get_generator_data, - ta4_formspec = techage.generator_settings("ta4", PWR_PERF), - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta5_generator_on", { - description = S("TA5 Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_appl_hole_electric.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta5.png", - { - name = "techage_filling4_ta4.png^techage_appl_generator4.png^techage_frame4_ta5.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - { - name = "techage_filling4_ta4.png^techage_appl_generator4.png^[transformFX]^techage_frame4_ta5.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - }, - - get_generator_data = get_generator_data, - ta4_formspec = techage.generator_settings("ta4", PWR_PERF), - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - paramtype2 = "facedir", - drop = "", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:ta5_generator", "techage:ta5_generator_on"}, Cable, "gen", {"R"}) - --- controlled by the turbine -techage.register_node({"techage:ta5_generator", "techage:ta5_generator_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "trigger" then - nvm.alive_cnt = 5 - elseif topic == "start" then - --start_node(pos, nvm) - elseif topic == "stop" then - stop_node(pos, nvm) - end - end, - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "delivered" then - return nvm.provided or 0 - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 135 then - return 0, {nvm.provided or 0} - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, - on_node_load = function(pos) - -- Add node number if missing - local number = M(pos):get_string("node_number") - if number == "" then - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta5_generator") - State:node_init(pos, nvm, number) - State:start(pos, nvm) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - end, -}) - -control.register_nodes({"techage:ta5_generator", "techage:ta5_generator_on"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA5 Generator"), - number = "-", - running = (nvm.alive_cnt or 0) > 0, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = meta:get_string("termpoint"), - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta5_generator", - recipe = { - {"", "dye:red", ""}, - {"", "techage:ta4_generator", ""}, - {"", "techage:baborium_ingot", ""}, - }, -}) diff --git a/techage/fusion_reactor/heatexchanger1.lua b/techage/fusion_reactor/heatexchanger1.lua deleted file mode 100644 index e4f7717..0000000 --- a/techage/fusion_reactor/heatexchanger1.lua +++ /dev/null @@ -1,109 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Heat Exchanger1 (bottom part) - - has a connection to storage and turbine (via pipes) - - acts as a cable junction for Exchanger2 -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local Pipe2 = techage.LiquidPipe -local Pipe3 = techage.GasPipe -local power = networks.power -local liquid = networks.liquid -local control = networks.control - -local function turbine_cmnd(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, Pipe2, - {"techage:ta5_turbine", "techage:ta5_turbine_on"}) -end - --- Send to the magnets -local function control_cmnd(pos, topic) - local outdir = networks.side_to_outdir(pos, "L") - return control.request(pos, Pipe3, outdir, "tank", topic) -end - -minetest.register_node("techage:ta5_heatexchanger1", { - description = S("TA5 Heat Exchanger 1"), - tiles = { - -- up, down, right, left, back, front - "techage_hole_ta4.png^techage_appl_arrow_white.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_ta5_pipe2.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frameB_ta4.png^techage_appl_hole_electric.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - Cable:after_place_node(pos) - Pipe2:after_place_node(pos) - Pipe3:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, outdir, tlib2, node) - if tlib2 == Cable then - power.update_network(pos, 0, Cable, node) -- junction!!! - elseif tlib2 == Pipe2 then - power.update_network(pos, outdir, Pipe2, node) - else - power.update_network(pos, outdir, Pipe3, node) - end - end, - can_dig = function(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - pos.y = pos.y + 1 - return minetest.get_node(pos).name ~= "techage:ta5_heatexchanger2" - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - Pipe2:after_dig_node(pos) - Pipe3:after_dig_node(pos) - end, - paramtype2 = "facedir", - groups = {crumbly = 2, cracky = 2, snappy = 2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta5_heatexchanger1"}, Pipe2, "tank", {"R"}, {}) -liquid.register_nodes({"techage:ta5_heatexchanger1"}, Pipe3, "tank", {"L"}, {}) -power.register_nodes({"techage:ta5_heatexchanger1"}, Cable, "junc", {"F", "B", "U"}) - --- command interface -techage.register_node({"techage:ta5_heatexchanger1"}, { - on_transfer = function(pos, indir, topic, payload) - local nvm = techage.get_nvm(pos) - -- used by heatexchanger2 - if topic == "test_pipe_blue" or topic == "test_gas_blue" then - return control_cmnd(pos, topic) - else - return turbine_cmnd(pos, topic, payload) - end - end, -}) - -minetest.register_craft({ - output = "techage:ta5_heatexchanger1", - recipe = { - {"default:tin_ingot", "techage:electric_cableS", "default:steel_ingot"}, - {"techage:ta5_pipe1S", "basic_materials:gear_steel", "techage:ta4_pipeS"}, - {"", "techage:baborium_ingot", ""}, - }, -}) diff --git a/techage/fusion_reactor/heatexchanger2.lua b/techage/fusion_reactor/heatexchanger2.lua deleted file mode 100644 index 6408263..0000000 --- a/techage/fusion_reactor/heatexchanger2.lua +++ /dev/null @@ -1,426 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Heat Exchanger2 (middle part) - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control -local sched = techage.scheduler - -local CYCLE_TIME = 2 -local PWR_NEEDED = 5 -local COUNTDOWN_TICKS = 1 -local DOWN = 5 -- dir -local DESCRIPTION = S("TA5 Heat Exchanger 2") -local EXPECT_BLUE = 56 -local EXPECT_GREEN = 52 -local CALL_RATE1 = 16 -- 2s * 16 = 32s -local CALL_RATE2 = 8 -- 2s * 8 = 16s -local EX_POINTS = 60 - -local function heatexchanger1_cmnd(pos, topic, payload) - return techage.transfer({x = pos.x, y = pos.y - 1, z = pos.z}, - nil, topic, payload, nil, - {"techage:ta5_heatexchanger1"}) -end - -local function heatexchanger3_cmnd(pos, topic, payload) - return techage.transfer({x = pos.x, y = pos.y + 1, z = pos.z}, - nil, topic, payload, nil, - {"techage:ta5_heatexchanger3"}) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_booster", { - pos = pos, - gain = 0.3, - max_hear_distance = 10, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function count_trues(t) - local cnt = 0 - for _,v in ipairs(t) do - if v then - cnt = cnt + 1 - end - end - return cnt -end - -local tSched = {} - -sched.register(tSched, CALL_RATE1, 0, function(pos) - if not heatexchanger1_cmnd(pos, "turbine") then - return S("Turbine error") - end - return true - end) -sched.register(tSched, CALL_RATE1, 1, function(pos) - if not heatexchanger3_cmnd(pos, "turbine") then - return S("Cooler error") - end - return true - end) -sched.register(tSched, CALL_RATE1, 2, function(pos) - local resp = heatexchanger1_cmnd(pos, "test_pipe_blue") - if type(resp) ~= "table" then - return DESCRIPTION .. S(" Error!") - end - local cnt = count_trues(resp) - if cnt ~= EXPECT_BLUE then - return S("Blue pipe connection error\n(@1 found / @2 expected)", cnt, EXPECT_BLUE) - end - return true - end) -sched.register(tSched, CALL_RATE1, 3, function(pos) - local resp = heatexchanger3_cmnd(pos, "test_pipe_green") - local cnt = count_trues(resp) - if cnt ~= EXPECT_GREEN then - return S("Green pipe connection error\n(@1 found / @2 expected)", cnt, EXPECT_GREEN) - end - return true - end) -sched.register(tSched, CALL_RATE1, 4, function(pos) - local resp = heatexchanger1_cmnd(pos, "test_gas_blue") - local cnt = count_trues(resp) - if cnt ~= EXPECT_BLUE then - return S("Blue pipe coolant missing\n(@1 found / @2 expected)", cnt, EXPECT_BLUE) - end - return true - end) -sched.register(tSched, CALL_RATE1, 5, function(pos) - local resp = heatexchanger3_cmnd(pos, "test_gas_green") - local cnt = count_trues(resp) - if cnt ~= EXPECT_GREEN then - return S("Green pipe coolant missing\n(@1 found / @2 expected)", cnt, EXPECT_GREEN) - end - return true - end) -sched.register(tSched, CALL_RATE2, 6, function(pos) - local resp = heatexchanger3_cmnd(pos, "dec_power") - local cnt = count_trues(resp) - --print("dec_power", cnt) - if cnt < 52 then - return 0 - end - return 1 - end) - -local function can_start(pos, nvm) - if not power.power_available(pos, Cable, DOWN) then - return S("No power") - end - heatexchanger3_cmnd(pos, "rst_power") - for i = 0,6 do - local res = tSched[i](pos) - if res ~= true and res ~= 1 then return res end - end - return true -end - -local function start_node(pos, nvm) - play_sound(pos) - sched.init(pos) - nvm.temperature = nvm.temperature or 0 - local mem = techage.get_mem(pos) - local t = minetest.get_gametime() - (mem.stopped_at or 0) - nvm.temperature = math.max(nvm.temperature - math.floor(t/2), 0) - nvm.temperature = math.min(nvm.temperature, 70) -end - -local function stop_node(pos, nvm) - stop_sound(pos) - heatexchanger1_cmnd(pos, "stop") - local mem = techage.get_mem(pos) - mem.stopped_at = minetest.get_gametime() -end - -local function temp_indicator (nvm, x, y) - local temp = techage.is_running(nvm) and nvm.temperature or 0 - return "image[" .. x .. "," .. y .. ";1,2;techage_form_temp_bg.png^[lowpart:" .. - temp .. ":techage_form_temp_fg.png]" .. - "tooltip[" .. x .. "," .. y .. ";1,2;" .. S("water temperature") .. ";#0C3D32;#FFFFFF]" -end - -local function formspec(self, pos, nvm) - return "size[5,3]".. - "box[0,-0.1;4.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", DESCRIPTION) .. "]" .. - temp_indicator (nvm, 1, 1) .. - "image_button[3.2,1.5;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.2,1.5;1,1;"..self:get_state_tooltip(nvm).."]" -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta5_heatexchanger2", - cycle_time = CYCLE_TIME, - infotext_name = DESCRIPTION, - standby_ticks = 1, - can_start = can_start, - start_node = start_node, - stop_node = stop_node, - formspec_func = formspec, -}) - -local function steam_management(pos, nvm) - local resp = sched.get(pos, tSched, function() return true end)(pos) - - if resp == 0 then -- has no power - nvm.temperature = math.max(nvm.temperature - 10, 0) - elseif resp == 1 then -- has power - nvm.temperature = math.min(nvm.temperature + 10, 100) - elseif resp ~= true then - State:fault(pos, nvm, resp) - State:stop(pos, nvm) - return false - end - - if resp == 0 and nvm.temperature == 70 then - heatexchanger1_cmnd(pos, "stop") - elseif nvm.temperature == 80 then - if resp == 1 then - heatexchanger1_cmnd(pos, "start") - local owner = M(pos):get_string("owner") - minetest.log("action", "[techage] " .. owner .. " starts the TA5 Fusion Reactor at " .. P2S(pos)) - else - heatexchanger1_cmnd(pos, "trigger") - end - elseif nvm.temperature > 80 then - heatexchanger1_cmnd(pos, "trigger") - end - return true -end - -local function consume_power(pos, nvm) - if techage.needs_power(nvm) then - local taken = power.consume_power(pos, Cable, DOWN, PWR_NEEDED) - if techage.is_running(nvm) then - if taken < PWR_NEEDED then - State:nopower(pos, nvm, S("No power")) - stop_sound(pos) - heatexchanger1_cmnd(pos, "stop") - else - return true -- keep running - end - end - end -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.temperature = nvm.temperature or 0 - --print("node_timer", nvm.temperature) - if consume_power(pos, nvm) then - if steam_management(pos, nvm) then - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) or nvm.temperature > 0 -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local nvm = techage.get_nvm(pos) - return not techage.is_running(nvm) -end - -local function on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function after_place_node(pos, placer) - if techage.orientate_node(pos, "techage:ta5_heatexchanger1") then - return true - end - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local own_num = techage.add_node(pos, "techage:ta5_heatexchanger2") - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", DESCRIPTION..": "..own_num) - meta:set_string("formspec", formspec(State, pos, nvm)) - Cable:after_place_node(pos, {DOWN}) - State:node_init(pos, nvm, own_num) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - if techage.get_expoints(player) >= EX_POINTS then - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - --M(pos):set_string("formspec", formspec(State, pos, nvm)) - end -end - --- Middle node with the formspec from the bottom node -minetest.register_node("techage:ta5_heatexchanger2", { - description = DESCRIPTION, - tiles = { - -- up, down, right, left, back, front - "techage_hole_ta4.png", - "techage_hole_ta4.png", - "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_tes_turb.png", - "techage_filling_ta4.png^techage_frameM_ta4.png", - "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", - "techage_filling_ta4.png^techage_frameM_ta4.png^techage_appl_ribsB.png", - }, - - selection_box = { - type = "fixed", - fixed = {-1/2, -1.5/2, -1/2, 1/2, 1/2, 1/2}, - }, - - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_place_node = after_place_node, - can_dig = can_dig, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - groups = {crumbly = 2, cracky = 2, snappy = 2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -power.register_nodes({"techage:ta5_heatexchanger2"}, Cable, "con", {"D"}) - -techage.register_node({"techage:ta5_heatexchanger2"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - if techage.is_running(nvm) then - return "running" - else - return "stopped" - end - elseif topic == "delivered" then - local data = power.get_network_data(pos, Cable, DOWN) - return data.consumed - data.provided - elseif topic == "on" then - State:start(pos, nvm) - return true - elseif topic == "off" then - State:stop(pos, nvm) - return true - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 1 and payload[1] == 1 then - start_node(pos, techage.get_nvm(pos)) - return 0 - elseif topic == 1 and payload[1] == 0 then - stop_node(pos, techage.get_nvm(pos)) - return 0 - else - return 2, "" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 128 then - return 0, techage.get_node_lvm(pos).name - elseif topic == 129 then -- State - if techage.is_running(nvm) then - return 0, {techage.RUNNING} - else - return 0, {techage.STOPPED} - end - elseif topic == 135 then -- Delivered Power - local data = power.get_network_data(pos, Cable, DOWN) - return 0, {data.consumed - data.provided} - else - return 2, "" - end - end, - on_node_load = function(pos, node) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - play_sound(pos) - else - stop_sound(pos) - end - -- Attempt to restart the system as the heat exchanger goes into error state - -- when parts of the storage block are unloaded. - if nvm.techage_state == techage.FAULT then - State:start(pos, nvm) - end - end, -}) - -control.register_nodes({"techage:ta5_heatexchanger2"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - return { - type = DESCRIPTION, - number = M(pos):get_string("node_number") or "", - running = techage.is_running(nvm) or false, - capa = nvm.capa_max or 1, - load = nvm.capa or 0, - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta5_heatexchanger2", - recipe = { - {"default:tin_ingot", "", "default:steel_ingot"}, - {"", "techage:ta5_aichip2", ""}, - {"", "techage:baborium_ingot", ""}, - }, -}) diff --git a/techage/fusion_reactor/heatexchanger3.lua b/techage/fusion_reactor/heatexchanger3.lua deleted file mode 100644 index dd8ee47..0000000 --- a/techage/fusion_reactor/heatexchanger3.lua +++ /dev/null @@ -1,106 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Heat Exchanger3 (top part) - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe2 = techage.LiquidPipe -local Pipe3 = techage.GasPipe -local liquid = networks.liquid -local control = networks.control - -local function orientate_node(pos, name) - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name == name then - local param2 = node.param2 - node = minetest.get_node(pos) - node.param2 = param2 - minetest.swap_node(pos, node) - else - minetest.remove_node(pos) - return true - end -end - -local function after_place_node(pos) - if orientate_node(pos, "techage:ta5_heatexchanger2") then - return true - end - Pipe2:after_place_node(pos) - Pipe3:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Pipe2:after_dig_node(pos) - Pipe3:after_dig_node(pos) -end - -local function turbine_cmnd(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, Pipe2, - {"techage:ta5_turbine", "techage:ta5_turbine_on"}) -end - --- Send to the magnets -local function control_cmnd(pos, topic) - local outdir = networks.side_to_outdir(pos, "L") - return control.request(pos, Pipe3, outdir, "tank", topic) -end - -minetest.register_node("techage:ta5_heatexchanger3", { - description = S("TA5 Heat Exchanger 3"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_hole_ta4.png", - "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_hole_ta5_pipe1.png", - "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_ribsT.png", - "techage_filling_ta4.png^techage_frameT_ta5.png^techage_appl_ribsT.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - groups = {crumbly = 2, cracky = 2, snappy = 2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta5_heatexchanger3"}, Pipe2, "tank", {"R"}, {}) -liquid.register_nodes({"techage:ta5_heatexchanger3"}, Pipe3, "tank", {"L"}, {}) - --- command interface, used by heatexchanger2 -techage.register_node({"techage:ta5_heatexchanger3"}, { - on_transfer = function(pos, indir, topic, payload) - if topic == "turbine" then - return turbine_cmnd(pos, topic, payload) - else - return control_cmnd(pos, topic) - end - end, -}) - -minetest.register_craft({ - output = "techage:ta5_heatexchanger3", - recipe = { - {"default:tin_ingot", "dye:red", "default:steel_ingot"}, - {"techage:ta5_pipe2S", "basic_materials:gear_steel", "techage:ta4_pipeS"}, - {"", "techage:baborium_ingot", ""}, - }, -}) - -techage.orientate_node = orientate_node diff --git a/techage/fusion_reactor/magnet.lua b/techage/fusion_reactor/magnet.lua deleted file mode 100644 index 6e4dfa0..0000000 --- a/techage/fusion_reactor/magnet.lua +++ /dev/null @@ -1,271 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Fusion Reactor Magnet - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local Pipe = techage.GasPipe -local power = networks.power -local liquid = networks.liquid -local control = networks.control - -local CAPACITY = 6 -local SHELLBLOCKS = {"techage:ta5_fr_shell", "techage:ta5_fr_nucleus", "techage:ta5_magnet1", "techage:ta5_magnet2"} - -minetest.register_node("techage:ta5_magnet1", { - description = S("TA5 Fusion Reactor Magnet 1"), - tiles = { - -- up, down, right, left, back, front - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe1.png^techage_steel_tiles_top.png^[transformR180]", - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe2.png^techage_steel_tiles_top.png", - "techage_collider_magnet.png^techage_steel_tiles_side.png", - "techage_collider_magnet.png^techage_steel_tiles_side.png^[transformR180]", - "techage_collider_magnet.png^techage_appl_hole_electric.png", - "techage_steel_tiles.png", - }, - after_place_node = function(pos, placer, itemstack) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - ta_rotate_node = function(pos, node, new_param2) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta5_magnet2", { - description = S("TA5 Fusion Reactor Magnet 2"), - tiles = { - -- up, down, right, left, back, front - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe1.png^techage_steel_tiles_top2.png^[transformR180]", - "techage_collider_magnet.png^techage_appl_hole_ta5_pipe2.png^techage_steel_tiles_top2.png^[transformR270]", - "techage_steel_tiles.png", - "techage_collider_magnet.png^techage_steel_tiles_side.png^[transformR180]", - "techage_collider_magnet.png^techage_steel_tiles_side.png", - "techage_steel_tiles.png", - }, - after_place_node = function(pos, placer, itemstack) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - ta_rotate_node = function(pos, node, new_param2) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -power.register_nodes({"techage:ta5_magnet1"}, Cable, "con", {"B"}) -liquid.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, Pipe, "tank", {"U", "D"}, { - capa = CAPACITY, - peek = function(pos, indir) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_put(nvm, name, amount, CAPACITY) - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - return liquid.srv_take(nvm, name, amount) - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - liquid.srv_put(nvm, name, amount, CAPACITY) - end, -}) - -local function check_plasma(pos, param2) - local pos1 = networks.get_relpos(pos, "F", param2) - local node = minetest.get_node(pos1) or {} - return node.name == "air" -end - -local function swap_plasma(pos, name, param2) - local pos1 = networks.get_relpos(pos, "F", param2) - minetest.swap_node(pos1, {name = name, param2 = param2}) -end - -local function check_shell(pos, param2) - local pos1 = networks.get_relpos(pos, "D", param2) - local pos2 = networks.get_relpos(pos, "BU", param2) - local _,t = minetest.find_nodes_in_area(pos1, pos2, SHELLBLOCKS) - local cnt = 0 - for k,v in pairs(t) do - cnt = cnt + v - end - return cnt == 6 -end - -local function check_nucleus(pos, param2) - local pos1 = networks.get_relpos(pos, "B", param2) - local node = minetest.get_node(pos1) or {} - if node.name == "techage:ta5_fr_nucleus" then - return pos1 - end -end - -local function on_receive(pos, tlib2, topic, payload) - --print("on_receive", topic) - local nvm = techage.get_nvm(pos) - if topic == "on" then - nvm.running = true - elseif topic == "off" then - nvm.running = false - end -end - -local function rst_power(nvm) - nvm.power = 0 - return true -end - -local function inc_power(nvm) - nvm.power = nvm.power or 0 - if nvm.power < 0 then nvm.power = 0 end - nvm.power = nvm.power + 1 - return nvm.power <= 2 -end - -local function dec_power(nvm) - nvm.power = nvm.power or 0 - if nvm.power > 0 then nvm.power = 0 end - nvm.power = nvm.power - 1 - return nvm.power >= -2 -end - -local function on_request(pos, tlib2, topic) - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - if tlib2 == Cable then - if topic == "connect" then - return true - elseif topic == "inc_power" then - return inc_power(nvm) - elseif topic == "test_plasma" then - local node = minetest.get_node(pos) or {} - return check_plasma(pos, node.param2) - elseif topic == "test_shell" then - local node = minetest.get_node(pos) or {} - return check_shell(pos, node.param2) - elseif topic == "test_nucleus" then - local node = minetest.get_node(pos) or {} - return check_nucleus(pos, node.param2) - elseif topic == "no_gas" then - nvm.liquid.amount = 0 - return true - end - else -- Pipe - if topic == "dec_power" then - return dec_power(nvm) - elseif topic == "test_pipe_blue" then - nvm.test_pipe = true - return true - elseif topic == "test_pipe_green" then - local res = nvm.test_pipe - nvm.test_pipe = false - return res - elseif topic == "test_gas_blue" then - nvm.has_gas = true - return nvm.liquid.amount == CAPACITY - elseif topic == "test_gas_green" then - local res = nvm.has_gas - nvm.has_gas = false - return res - end - end - if topic == "rst_power" then - return rst_power(nvm) - end - return false -end - -control.register_nodes({"techage:ta5_magnet1", "techage:ta5_magnet2"}, { - on_receive = on_receive, - on_request = on_request, - } -) - -minetest.register_craftitem("techage:ta5_magnet_blank", { - description = S("TA5 Fusion Reactor Magnet Blank"), - inventory_image = "techage_collider_magnet.png^techage_appl_hole_electric.png", -}) - -minetest.register_craftitem("techage:ta5_magnet_shield", { - description = S("TA5 Fusion Reactor Magnet Shield"), - inventory_image = "techage_steel_tiles.png", -}) - -techage.furnace.register_recipe({ - output = "techage:ta5_magnet_shield 2", - recipe = {"default:steel_ingot", "techage:usmium_powder", "techage:graphite_powder"}, - time = 2, - -}) - -minetest.register_craft({ - output = "techage:ta5_magnet_blank 2", - recipe = { - {'default:steel_ingot', 'techage:electric_cableS', 'techage:aluminum'}, - {'techage:ta5_pipe1S', 'basic_materials:gold_wire', 'techage:ta5_pipe2S'}, - {'techage:aluminum', 'dye:brown', 'default:steel_ingot'}, - }, -}) - -minetest.register_craft({ - output = "techage:ta5_magnet1", - recipe = { - {'', 'techage:ta5_magnet_shield', 'techage:ta5_magnet_blank'}, - {'', '', ''}, - {'', '', ''}, - }, -}) - -minetest.register_craft({ - output = "techage:ta5_magnet2", - recipe = { - {'', 'techage:ta5_magnet_shield', 'techage:ta5_magnet_blank'}, - {'', '', 'techage:ta5_magnet_shield'}, - {'', '', ''}, - }, -}) diff --git a/techage/fusion_reactor/shell.lua b/techage/fusion_reactor/shell.lua deleted file mode 100644 index b2f1fcc..0000000 --- a/techage/fusion_reactor/shell.lua +++ /dev/null @@ -1,63 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Fusion Reactor Shell - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -minetest.register_node("techage:ta5_fr_shell", { - description = S("TA5 Fusion Reactor Shell"), - tiles = { - "techage_reactor_shell.png", - }, - drawtype = "nodebox", - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = "blend", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta5_fr_nucleus", { - description = S("TA5 Fusion Reactor Nucleus"), - tiles = { - "techage_reactor_shell.png^techage_collider_detector_core.png", - }, - drawtype = "nodebox", - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = "blend", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -techage.furnace.register_recipe({ - output = "techage:ta5_fr_shell 3", - recipe = {'techage:ta4_colliderblock', 'techage:ta4_colliderblock', "techage:graphite_powder"}, - time = 24, -}) - -minetest.register_craft({ - output = "techage:ta5_fr_nucleus", - recipe = { - {"", "techage:ta5_aichip2", ""}, - {"techage:electric_cableS", "techage:cylinder_large_hydrogen", "techage:ta3_valve_open"}, - {"", "techage:ta5_fr_shell", ""}, - }, -}) - diff --git a/techage/fusion_reactor/ta5_pump.lua b/techage/fusion_reactor/ta5_pump.lua deleted file mode 100644 index 9a8a299..0000000 --- a/techage/fusion_reactor/ta5_pump.lua +++ /dev/null @@ -1,224 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Pump - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local Pipe2 = techage.LiquidPipe -local Pipe3 = techage.GasPipe -local liquid = networks.liquid -local Flip = networks.Flip - -local STANDBY_TICKS = 16 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 2 -local CAPA = 4 - -local WRENCH_MENU = {{ - type = "output", - name = "flowrate", - label = S("Total flow rate"), - tooltip = S("Total flow rate in liquid units"), -},{ - type = "dropdown", - choices = "normal,reverse", - name = "operation", - label = S("Operation"), - tooltip = S("Pump direction"), - values = {0, 1}, - default = "1", -}} - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta5_pump", - node_name_active = "techage:ta5_pump_on", - infotext_name = S("TA5 Pump"), - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, -}) - -local function pumping(pos, nvm) - local outdir = M(pos):get_int("outdir") - local reverse = M(pos):get_int("operation") - if reverse == 1 then - local taken, name = liquid.take(pos, Pipe3, outdir, nil, CAPA) - if taken > 0 then - local leftover = liquid.put(pos, Pipe2, Flip[outdir], name, taken) - if leftover and leftover > 0 then - liquid.untake(pos, Pipe3, outdir, name, leftover) - if leftover == taken then - State:blocked(pos, nvm) - return 0 - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return taken - leftover - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return taken - end - else - local taken, name = liquid.take(pos, Pipe2, Flip[outdir], nil, CAPA) - if taken > 0 then - local leftover = liquid.put(pos, Pipe3, outdir, name, taken) - if leftover and leftover > 0 then - liquid.untake(pos, Pipe2, Flip[outdir], name, leftover) - if leftover == taken then - State:blocked(pos, nvm) - return 0 - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return taken - leftover - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return taken - end - end - State:idle(pos, nvm) - return 0 -end - -local function after_place_node(pos, placer) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta5_pump") - State:node_init(pos, nvm, number) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Pipe2:after_place_node(pos) - Pipe3:after_place_node(pos) -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.flowrate = (nvm.flowrate or 0) + pumping(pos, nvm) - return State:is_active(nvm) -end - -local function on_rightclick(pos, node, clicker) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - if node.name == "techage:ta5_pump" then - State:start(pos, nvm) - elseif node.name == "techage:ta5_pump_on" then - State:stop(pos, nvm) - end -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Pipe2:after_dig_node(pos) - Pipe3:after_dig_node(pos) - techage.del_mem(pos) -end - -local tiles_pas = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_appl_hole_ta5_pipe2.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta5.png^[transformFX", - "techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta5.png", -} - -local tiles_act = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_appl_hole_ta5_pipe2.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta5.png", - { - name = "techage_filling8_ta4.png^techage_appl_pump8.png^techage_frame8_ta5.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - { - name = "techage_filling8_ta4.png^techage_appl_pump8.png^techage_frame8_ta5.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, -} - -minetest.register_node("techage:ta5_pump", { - description = S("TA5 Pump"), - tiles = tiles_pas, - after_place_node = after_place_node, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_dig_node = after_dig_node, - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - ta4_formspec = WRENCH_MENU, -}) - -minetest.register_node("techage:ta5_pump_on", { - description = S("TA5 Pump"), - tiles = tiles_act, - --after_place_node = after_place_node4, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_dig_node = after_dig_node, - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - diggable = false, - groups = {not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -techage.register_node({"techage:ta5_pump", "techage:ta5_pump_on"}, { - on_recv_message = function(pos, src, topic, payload) - return State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return State:on_beduino_request_data(pos, topic, payload) - end, -}) - --- Pumps have to provide one output and one input side -liquid.register_nodes({ - "techage:ta5_pump", "techage:ta5_pump_on", -}, Pipe2, "pump", {"L"}, {}) - -liquid.register_nodes({ - "techage:ta5_pump", "techage:ta5_pump_on", -}, Pipe3, "pump", {"R"}, {}) - -minetest.register_craft({ - output = "techage:ta5_pump", - recipe = { - {"techage:aluminum", "dye:red", "default:steel_ingot"}, - {"techage:ta4_pipeS", "techage:ta5_ceramic_turbine", "techage:ta5_pipe1S"}, - {"default:steel_ingot", "basic_materials:motor", "techage:aluminum"}, - }, -}) diff --git a/techage/fusion_reactor/turbine.lua b/techage/fusion_reactor/turbine.lua deleted file mode 100644 index 1f5a6fa..0000000 --- a/techage/fusion_reactor/turbine.lua +++ /dev/null @@ -1,170 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Gas Turbine - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe - -local function generator_cmnd(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, nil, - {"techage:ta5_generator", "techage:ta5_generator_on"}) -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_turbine", { - pos = pos, - gain = 0.4, - max_hear_distance = 10, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -minetest.register_node("techage:ta5_turbine", { - description = S("TA5 Turbine"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta5.png^[transformFX", - "techage_filling_ta4.png^techage_appl_turbine.png^techage_frame_ta5.png", - }, - - after_place_node = function(pos) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode) - stop_sound(pos) - Pipe:after_dig_node(pos) - techage.del_mem(pos) - end, - networks = { - pipe2 = {}, - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta5_turbine_on", { - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_appl_open.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_pipe.png", - { - name = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta5.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - { - name = "techage_filling4_ta4.png^techage_appl_turbine4.png^techage_frame4_ta5.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - }, - - tubelib2_on_update2 = function(pos, outdir, tlib2, node) - swap_node(pos, "techage:ta5_turbine") - stop_sound(pos) - generator_cmnd(pos, "stop") - end, - networks = { - pipe2 = {}, - }, - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:ta5_turbine", "techage:ta5_turbine_on"}) -Pipe:set_valid_sides("techage:ta5_turbine", {"L", "U"}) -Pipe:set_valid_sides("techage:ta5_turbine_on", {"L", "U"}) - -techage.register_node({"techage:ta5_turbine", "techage:ta5_turbine_on"}, { - -- used by heatexchanger1 - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "trigger" then - return generator_cmnd(pos, topic, payload) - elseif topic == "start" then - swap_node(pos, "techage:ta5_turbine_on") - play_sound(pos) - return generator_cmnd(pos, topic, payload) - elseif topic == "stop" then - swap_node(pos, "techage:ta5_turbine") - stop_sound(pos) - return generator_cmnd(pos, topic, payload) - elseif topic == "turbine" then - return true - else - return generator_cmnd(pos, topic, payload) - end - end, - on_node_load = function(pos, node) - if node.name == "techage:ta5_turbine_on" then - play_sound(pos) - end - end, -}) - -minetest.register_craft({ - output = "techage:ta5_turbine", - recipe = { - {"", "dye:red", ""}, - {"", "techage:turbine", ""}, - {"", "techage:ta5_ceramic_turbine", ""}, - }, -}) diff --git a/techage/hydrogen/electrolyzer.lua b/techage/hydrogen/electrolyzer.lua deleted file mode 100644 index b9f256b..0000000 --- a/techage/hydrogen/electrolyzer.lua +++ /dev/null @@ -1,370 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Electrolyzer - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - -local CYCLE_TIME = 2 -local STANDBY_TICKS = 3 -local PWR_NEEDED = 35 -local PWR_UNITS_PER_HYDROGEN_ITEM = 80 -local CAPACITY = 200 -local TURNOFF_THRESHOLD = "40%" - -local function evaluate_percent(s) - return (tonumber(s:sub(1, -2)) or 0) / 100 -end - -local function formspec(self, pos, nvm) - local amount = (nvm.liquid and nvm.liquid.amount) or 0 - local lqd_name = (nvm.liquid and nvm.liquid.name) or "techage:liquid" - local arrow = "image[3,1.5;1,1;techage_form_arrow_bg.png^[transformR270]" - if techage.is_running(nvm) then - arrow = "image[3,1.5;1,1;techage_form_arrow_fg.png^[transformR270]" - end - if amount > 0 then - lqd_name = lqd_name .. " " .. amount - end - return "size[6,4]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "box[0,-0.1;5.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("Electrolyzer")) .. "]" .. - techage.wrench_tooltip(5.4, -0.1).. - techage.formspec_power_bar(pos, 0.1, 0.8, S("Electricity"), nvm.taken, PWR_NEEDED) .. - arrow .. - "image_button[3,2.5;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. - "tooltip[3,2.5;1,1;" .. self:get_state_tooltip(nvm) .. "]" .. - techage.item_image(4.5,2, lqd_name) -end - -local function can_start(pos, nvm, state) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - - if nvm.liquid.amount < CAPACITY then - return true - end - return S("Storage full") -end - -local function start_node(pos, nvm, state) - nvm.taken = 0 - nvm.reduction = evaluate_percent(M(pos):get_string("reduction")) - nvm.turnoff = evaluate_percent(M(pos):get_string("turnoff")) -end - -local function stop_node(pos, nvm, state) - nvm.taken = 0 - nvm.running = nil -- legacy -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta4_electrolyzer", - node_name_active = "techage:ta4_electrolyzer_on", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - infotext_name = S("TA4 Electrolyzer"), - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function generating(pos, nvm) - nvm.num_pwr_units = nvm.num_pwr_units or 0 - nvm.countdown = nvm.countdown or 0 - if nvm.taken > 0 then - nvm.num_pwr_units = nvm.num_pwr_units + (nvm.taken or 0) - if nvm.num_pwr_units >= PWR_UNITS_PER_HYDROGEN_ITEM then - nvm.liquid.amount = nvm.liquid.amount + 1 - nvm.liquid.name = "techage:hydrogen" - nvm.num_pwr_units = nvm.num_pwr_units - PWR_UNITS_PER_HYDROGEN_ITEM - end - end -end - --- converts power into hydrogen -local function node_timer(pos, elapsed) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - - if nvm.liquid.amount < CAPACITY then - local in_dir = meta:get_int("in_dir") - local curr_load = power.get_storage_load(pos, Cable, in_dir, 1) - if curr_load > (nvm.turnoff or 0) then - local to_be_taken = PWR_NEEDED * (nvm.reduction or 1) - nvm.taken = power.consume_power(pos, Cable, in_dir, to_be_taken) or 0 - local running = techage.is_running(nvm) - if not running and nvm.taken == to_be_taken then - State:start(pos, nvm) - elseif running and nvm.taken < to_be_taken then - State:nopower(pos, nvm) - elseif running then - generating(pos, nvm) - State:keep_running(pos, nvm, 1) - end - elseif curr_load == 0 then - nvm.taken = 0 - State:nopower(pos, nvm) - else - nvm.taken = 0 - State:standby(pos, nvm, S("Turnoff point reached")) - end - else - nvm.taken = 0 - State:blocked(pos, nvm, S("Storage full")) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return true -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, player) - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - nvm.running = false - nvm.num_pwr_units = 0 - local number = techage.add_node(pos, "techage:ta4_electrolyzer") - State:node_init(pos, nvm, number) - local node = minetest.get_node(pos) - M(pos):set_int("in_dir", techage.side_to_indir("R", node.param2)) - M(pos):set_string("reduction", "100%") - M(pos):set_string("turnoff", TURNOFF_THRESHOLD) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) -end - -local function put(pos, indir, name, amount) - local leftover = liquid.srv_put(pos, indir, name, amount) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return leftover -end - -local tool_config = { - { - type = "const", - name = "needed", - label = S("Maximum power consumption [ku]"), - tooltip = S("Maximum possible\ncurrent consumption"), - value = PWR_NEEDED, - }, - { - type = "dropdown", - choices = "20%,40%,60%,80%,100%", - name = "reduction", - label = S("Current limitation"), - tooltip = S("Configurable value\nfor the current limit"), - default = "100%", - }, - { - type = "dropdown", - choices = "0%,20%,40%,60%,80%,98%", - name = "turnoff", - label = S("Turnoff point"), - tooltip = S("If the charge of the storage\nsystem falls below the configured value,\nthe block switches off"), - default = TURNOFF_THRESHOLD, - }, -} - -minetest.register_node("techage:ta4_electrolyzer", { - description = S("TA4 Electrolyzer"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_electrolyzer.png^techage_appl_ctrl_unit.png^[transformFX", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_electrolyzer.png^techage_appl_ctrl_unit.png", - }, - - can_dig = function(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - return liquid.is_empty(pos) - end, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_punch = liquid.on_punch, - on_receive_fields = on_receive_fields, - on_timer = node_timer, - on_rightclick = on_rightclick, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - ta3_formspec = tool_config, -}) - -minetest.register_node("techage:ta4_electrolyzer_on", { - description = S("TA4 Electrolyzer"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - { - name = "techage_filling4_ta4.png^techage_frame4_ta4.png^techage_appl_electrolyzer4.png^techage_appl_ctrl_unit4.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.8, - }, - }, - { - name = "techage_filling4_ta4.png^techage_frame4_ta4.png^techage_appl_electrolyzer4.png^techage_appl_ctrl_unit4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.8, - }, - }, - }, - - on_receive_fields = on_receive_fields, - on_punch = liquid.on_punch, - on_timer = node_timer, - on_rightclick = on_rightclick, - - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - diggable = false, - paramtype = "light", - light_source = 6, - ta3_formspec = tool_config, -}) - -local liquid_def = { - capa = CAPACITY, - peek = function(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, CAPACITY) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return leftover - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - amount, name = liquid.srv_take(nvm, name, amount) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return amount, name - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, CAPACITY) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return leftover - end, -} - -liquid.register_nodes({"techage:ta4_electrolyzer", "techage:ta4_electrolyzer_on"}, Pipe, "tank", {"R"}, liquid_def) -power.register_nodes({"techage:ta4_electrolyzer", "techage:ta4_electrolyzer_on"}, Cable, "con", {"L"}) - -techage.register_node({"techage:ta4_electrolyzer", "techage:ta4_electrolyzer_on"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "load" then - return techage.power.percent(CAPACITY, (nvm.liquid and nvm.liquid.amount) or 0) - elseif topic == "delivered" then - return -math.floor((nvm.taken or 0) + 0.5) - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 134 and payload[1] == 1 then - return 0, {techage.power.percent(CAPACITY, (nvm.liquid and nvm.liquid.amount) or 0)} - elseif topic == 135 then - return 0, {math.floor((nvm.provided or 0) + 0.5)} - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, - on_node_load = function(pos, node) - local meta = M(pos) - if not meta:contains("reduction") then - meta:set_string("reduction", "100%") - meta:set_string("turnoff", TURNOFF_THRESHOLD) - end - end, -}) - -minetest.register_craft({ - output = "techage:ta4_electrolyzer", - recipe = { - {'default:steel_ingot', 'dye:blue', 'default:steel_ingot'}, - {'techage:electric_cableS', 'default:glass', 'techage:ta3_pipeS'}, - {'default:steel_ingot', "techage:ta4_wlanchip", 'default:steel_ingot'}, - }, -}) diff --git a/techage/hydrogen/fuelcell.lua b/techage/hydrogen/fuelcell.lua deleted file mode 100644 index 1a583dd..0000000 --- a/techage/hydrogen/fuelcell.lua +++ /dev/null @@ -1,350 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Fuel Cell - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power -local Pipe = techage.LiquidPipe -local liquid = networks.liquid -local control = networks.control - -local CYCLE_TIME = 2 -local STANDBY_TICKS = 4 -local COUNTDOWN_TICKS = 2 -local PWR_PERF = 34 -local PWR_UNITS_PER_HYDROGEN_ITEM = 75 -local CAPACITY = 100 - -local function formspec(self, pos, nvm) - local amount = (nvm.liquid and nvm.liquid.amount) or 0 - local lqd_name = (nvm.liquid and nvm.liquid.name) or "techage:liquid" - local arrow = "image[2,1.5;1,1;techage_form_arrow_bg.png^[transformR270]" - if techage.is_running(nvm) then - arrow = "image[2,1.5;1,1;techage_form_arrow_fg.png^[transformR270]" - end - if amount > 0 then - lqd_name = lqd_name.." "..amount - end - return "size[6,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;5.8,0.5;#c6e8ff]".. - "label[0.2,-0.1;"..minetest.colorize( "#000000", S("Fuel Cell")).."]".. - techage.item_image(0.5,2, lqd_name).. - arrow.. - "image_button[2,2.5;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[2,2.5;1,1;"..self:get_state_tooltip(nvm).."]".. - techage.formspec_power_bar(pos, 3.5, 0.8, S("Electricity"), nvm.provided, PWR_PERF) -end - -local function has_hydrogen(nvm) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - nvm.num_pwr_units = nvm.num_pwr_units or 0 - return nvm.num_pwr_units > 0 or (nvm.liquid.amount > 0 and nvm.liquid.name == "techage:hydrogen") -end - -local function can_start(pos, nvm, state) - if has_hydrogen(nvm) then - return true - end - return S("no hydrogen") -end - - -local function consuming(pos, nvm) - if nvm.num_pwr_units <= 0 then - nvm.num_pwr_units = nvm.num_pwr_units + PWR_UNITS_PER_HYDROGEN_ITEM - nvm.liquid.amount = nvm.liquid.amount - 1 - end - nvm.num_pwr_units = nvm.num_pwr_units - nvm.provided -end - -local function start_node(pos, nvm, state) - local meta = M(pos) - nvm.provided = 0 - local outdir = meta:get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) - techage.evaluate_charge_termination(nvm, meta) -end - -local function stop_node(pos, nvm, state) - nvm.provided = 0 - nvm.running = nil -- legacy - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta4_fuelcell", - node_name_active = "techage:ta4_fuelcell_on", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - infotext_name = S("TA4 Fuel Cell"), - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local running = techage.is_running(nvm) - local hydro = has_hydrogen(nvm) - if running and not hydro then - State:standby(pos, nvm, S("no hydrogen")) - stop_node(pos, nvm, State) - elseif not running and hydro then - State:start(pos, nvm) - -- start_node() is called implicit - elseif running then - local meta = M(pos) - local outdir = meta:get_int("outdir") - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Cable, outdir, PWR_PERF, tp1, tp2) - local val = power.get_storage_load(pos, Cable, outdir, PWR_PERF) - if val > 0 then - nvm.load = val - end - consuming(pos, nvm) - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - nvm.num_pwr_units = 0 - local number = techage.add_node(pos, "techage:ta4_fuelcell") - State:node_init(pos, nvm, number) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - local inv = M(pos):get_inventory() - inv:set_size('src', 4) - inv:set_stack('src', 2, {name = "techage:gasoline", count = 60}) - inv:set_stack('src', 4, {name = "techage:gasoline", count = 60}) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - -minetest.register_node("techage:ta4_fuelcell", { - description = S("TA4 Fuel Cell"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_fuelcell.png^techage_appl_ctrl_unit.png^[transformFX", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_fuelcell.png^techage_appl_ctrl_unit.png", - }, - - can_dig = function(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - return liquid.is_empty(pos) - end, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_generator_data = get_generator_data, - on_punch = liquid.on_punch, - on_receive_fields = on_receive_fields, - on_timer = node_timer, - on_rightclick = on_rightclick, - ta4_formspec = techage.generator_settings("ta4", PWR_PERF), - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, -}) - -minetest.register_node("techage:ta4_fuelcell_on", { - description = S("TA4 Fuel Cell"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_pipe.png", - { - name = "techage_filling4_ta4.png^techage_frame4_ta4.png^techage_appl_fuelcell4.png^techage_appl_ctrl_unit4.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.8, - }, - }, - { - name = "techage_filling4_ta4.png^techage_frame4_ta4.png^techage_appl_fuelcell4.png^techage_appl_ctrl_unit4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.8, - }, - }, - }, - - get_generator_data = get_generator_data, - on_receive_fields = on_receive_fields, - on_punch = liquid.on_punch, - on_timer = node_timer, - on_rightclick = on_rightclick, - ta4_formspec = techage.generator_settings("ta4", PWR_PERF), - - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - diggable = false, - paramtype = "light", - light_source = 6, -}) - -local liquid_def = { - capa = CAPACITY, - peek = function(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, CAPACITY) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return leftover - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - amount, name = liquid.srv_take(nvm, name, amount) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return amount, name - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, CAPACITY) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return leftover - end, -} - -liquid.register_nodes({"techage:ta4_fuelcell", "techage:ta4_fuelcell_on"}, Pipe, "tank", {"L"}, liquid_def) -power.register_nodes({"techage:ta4_fuelcell", "techage:ta4_fuelcell_on"}, Cable, "gen", {"R"}) - -minetest.register_alias_force("techage:ta4_fuelcell2", "techage:ta4_fuelcell") -minetest.register_alias_force("techage:ta4_fuelcell2_on", "techage:ta4_fuelcell_on") - -techage.register_node({"techage:ta4_fuelcell", "techage:ta4_fuelcell_on"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "load" then - return techage.power.percent(CAPACITY, (nvm.liquid and nvm.liquid.amount) or 0) - elseif topic == "delivered" then - return math.floor((nvm.provided or 0) + 0.5) - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 134 and payload[1] == 1 then - return 0, {techage.power.percent(CAPACITY, (nvm.liquid and nvm.liquid.amount) or 0)} - elseif topic == 135 then - return 0, {math.floor((nvm.provided or 0) + 0.5)} - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, -}) - -control.register_nodes({"techage:ta4_fuelcell", "techage:ta4_fuelcell_on"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA4 Fuel Cell"), - number = meta:get_string("node_number") or "", - running = techage.is_running(nvm) or false, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = meta:get_string("termpoint"), - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta4_fuelcell", - recipe = { - {'default:steel_ingot', 'dye:blue', 'default:steel_ingot'}, - {'techage:ta3_pipeS', 'techage:ta4_fuelcellstack', 'techage:electric_cableS'}, - {'default:steel_ingot', "techage:ta4_wlanchip", 'default:steel_ingot'}, - }, -}) diff --git a/techage/hydrogen/fuelcellstack.lua b/techage/hydrogen/fuelcellstack.lua deleted file mode 100644 index 6bc14f7..0000000 --- a/techage/hydrogen/fuelcellstack.lua +++ /dev/null @@ -1,33 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Hydrogen - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:ta4_fuelcellstack", { - description = S("TA4 Fuel Cell Stack"), - inventory_image = "techage_fc_stack_inv.png", -}) - -minetest.register_craft({ - output = "techage:ta4_fuelcellstack", - recipe = { - {'default:copper_ingot', 'techage:ta4_carbon_fiber', 'default:copper_ingot'}, - {'techage:baborium_ingot', 'techage:ta4_carbon_fiber', 'techage:baborium_ingot'}, - {"techage:canister_lye", 'techage:ta4_carbon_fiber', "techage:canister_lye"}, - }, - replacements = { - {"techage:canister_lye", "techage:ta3_canister_empty"}, - {"techage:canister_lye", "techage:ta3_canister_empty"}, - } -}) diff --git a/techage/i18n.py b/techage/i18n.py deleted file mode 100755 index e66de31..0000000 --- a/techage/i18n.py +++ /dev/null @@ -1,459 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# Script to generate the template file and update the translation files. -# Copy the script into the mod or modpack root folder and run it there. -# -# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer -# LGPLv2.1+ -# -# See https://github.com/minetest-tools/update_translations for -# potential future updates to this script. - -from __future__ import print_function -import os, fnmatch, re, shutil, errno -from sys import argv as _argv -from sys import stderr as _stderr - -# Running params -params = {"recursive": False, - "help": False, - "mods": False, - "verbose": False, - "folders": [], - "no-old-file": False, - "break-long-lines": False, - "sort": False -} -# Available CLI options -options = {"recursive": ['--recursive', '-r'], - "help": ['--help', '-h'], - "mods": ['--installed-mods', '-m'], - "verbose": ['--verbose', '-v'], - "no-old-file": ['--no-old-file', '-O'], - "break-long-lines": ['--break-long-lines', '-b'], - "sort": ['--sort', '-s'] -} - -# Strings longer than this will have extra space added between -# them in the translation files to make it easier to distinguish their -# beginnings and endings at a glance -doublespace_threshold = 80 - -def set_params_folders(tab: list): - '''Initialize params["folders"] from CLI arguments.''' - # Discarding argument 0 (tool name) - for param in tab[1:]: - stop_param = False - for option in options: - if param in options[option]: - stop_param = True - break - if not stop_param: - params["folders"].append(os.path.abspath(param)) - -def set_params(tab: list): - '''Initialize params from CLI arguments.''' - for option in options: - for option_name in options[option]: - if option_name in tab: - params[option] = True - break - -def print_help(name): - '''Prints some help message.''' - print(f'''SYNOPSIS - {name} [OPTIONS] [PATHS...] -DESCRIPTION - {', '.join(options["help"])} - prints this help message - {', '.join(options["recursive"])} - run on all subfolders of paths given - {', '.join(options["mods"])} - run on locally installed modules - {', '.join(options["no-old-file"])} - do not create *.old files - {', '.join(options["sort"])} - sort output strings alphabetically - {', '.join(options["break-long-lines"])} - add extra line breaks before and after long strings - {', '.join(options["verbose"])} - add output information -''') - - -def main(): - '''Main function''' - set_params(_argv) - set_params_folders(_argv) - if params["help"]: - print_help(_argv[0]) - elif params["recursive"] and params["mods"]: - print("Option --installed-mods is incompatible with --recursive") - else: - # Add recursivity message - print("Running ", end='') - if params["recursive"]: - print("recursively ", end='') - # Running - if params["mods"]: - print(f"on all locally installed modules in {os.path.abspath('~/.minetest/mods/')}") - run_all_subfolders("~/.minetest/mods") - elif len(params["folders"]) >= 2: - print("on folder list:", params["folders"]) - for f in params["folders"]: - if params["recursive"]: - run_all_subfolders(f) - else: - update_folder(f) - elif len(params["folders"]) == 1: - print("on folder", params["folders"][0]) - if params["recursive"]: - run_all_subfolders(params["folders"][0]) - else: - update_folder(params["folders"][0]) - else: - print("on folder", os.path.abspath("./")) - if params["recursive"]: - run_all_subfolders(os.path.abspath("./")) - else: - update_folder(os.path.abspath("./")) - -#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') -#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote -pattern_lua_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) -pattern_lua_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) -pattern_lua_bracketed_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) -pattern_lua_bracketed_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) - -# Handles "concatenation" .. " of strings" -pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) - -pattern_tr = re.compile(r'(.*?[^@])=(.*)') -pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)') -pattern_tr_filename = re.compile(r'\.tr$') -pattern_po_language_code = re.compile(r'(.*)\.po$') - -#attempt to read the mod's name from the mod.conf file. Returns None on failure -def get_modname(folder): - try: - with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf: - for line in mod_conf: - match = pattern_name.match(line) - if match: - return match.group(1) - except FileNotFoundError: - pass - return None - -#If there are already .tr files in /locale, returns a list of their names -def get_existing_tr_files(folder): - out = [] - for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): - for name in files: - if pattern_tr_filename.search(name): - out.append(name) - return out - -# A series of search and replaces that massage a .po file's contents into -# a .tr file's equivalent -def process_po_file(text): - # The first three items are for unused matches - text = re.sub(r'#~ msgid "', "", text) - text = re.sub(r'"\n#~ msgstr ""\n"', "=", text) - text = re.sub(r'"\n#~ msgstr "', "=", text) - # comment lines - text = re.sub(r'#.*\n', "", text) - # converting msg pairs into "=" pairs - text = re.sub(r'msgid "', "", text) - text = re.sub(r'"\nmsgstr ""\n"', "=", text) - text = re.sub(r'"\nmsgstr "', "=", text) - # various line breaks and escape codes - text = re.sub(r'"\n"', "", text) - text = re.sub(r'"\n', "\n", text) - text = re.sub(r'\\"', '"', text) - text = re.sub(r'\\n', '@n', text) - # remove header text - text = re.sub(r'=Project-Id-Version:.*\n', "", text) - # remove double-spaced lines - text = re.sub(r'\n\n', '\n', text) - return text - -# Go through existing .po files and, if a .tr file for that language -# *doesn't* exist, convert it and create it. -# The .tr file that results will subsequently be reprocessed so -# any "no longer used" strings will be preserved. -# Note that "fuzzy" tags will be lost in this process. -def process_po_files(folder, modname): - for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): - for name in files: - code_match = pattern_po_language_code.match(name) - if code_match == None: - continue - language_code = code_match.group(1) - tr_name = modname + "." + language_code + ".tr" - tr_file = os.path.join(root, tr_name) - if os.path.exists(tr_file): - if params["verbose"]: - print(f"{tr_name} already exists, ignoring {name}") - continue - fname = os.path.join(root, name) - with open(fname, "r", encoding='utf-8') as po_file: - if params["verbose"]: - print(f"Importing translations from {name}") - text = process_po_file(po_file.read()) - with open(tr_file, "wt", encoding='utf-8') as tr_out: - tr_out.write(text) - -# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612 -# Creates a directory if it doesn't exist, silently does -# nothing if it already exists -def mkdir_p(path): - try: - os.makedirs(path) - except OSError as exc: # Python >2.5 - if exc.errno == errno.EEXIST and os.path.isdir(path): - pass - else: raise - -# Converts the template dictionary to a text to be written as a file -# dKeyStrings is a dictionary of localized string to source file sets -# dOld is a dictionary of existing translations and comments from -# the previous version of this text -def strings_to_text(dkeyStrings, dOld, mod_name, header_comments): - lOut = [f"# textdomain: {mod_name}\n"] - if header_comments is not None: - lOut.append(header_comments) - - dGroupedBySource = {} - - for key in dkeyStrings: - sourceList = list(dkeyStrings[key]) - if params["sort"]: - sourceList.sort() - sourceString = "\n".join(sourceList) - listForSource = dGroupedBySource.get(sourceString, []) - listForSource.append(key) - dGroupedBySource[sourceString] = listForSource - - lSourceKeys = list(dGroupedBySource.keys()) - lSourceKeys.sort() - for source in lSourceKeys: - localizedStrings = dGroupedBySource[source] - if params["sort"]: - localizedStrings.sort() - lOut.append("") - lOut.append(source) - lOut.append("") - for localizedString in localizedStrings: - val = dOld.get(localizedString, {}) - translation = val.get("translation", "") - comment = val.get("comment") - if params["break-long-lines"] and len(localizedString) > doublespace_threshold and not lOut[-1] == "": - lOut.append("") - if comment != None: - lOut.append(comment) - lOut.append(f"{localizedString}={translation}") - if params["break-long-lines"] and len(localizedString) > doublespace_threshold: - lOut.append("") - - - unusedExist = False - for key in dOld: - if key not in dkeyStrings: - val = dOld[key] - translation = val.get("translation") - comment = val.get("comment") - # only keep an unused translation if there was translated - # text or a comment associated with it - if translation != None and (translation != "" or comment): - if not unusedExist: - unusedExist = True - lOut.append("\n\n##### not used anymore #####\n") - if params["break-long-lines"] and len(key) > doublespace_threshold and not lOut[-1] == "": - lOut.append("") - if comment != None: - lOut.append(comment) - lOut.append(f"{key}={translation}") - if params["break-long-lines"] and len(key) > doublespace_threshold: - lOut.append("") - return "\n".join(lOut) + '\n' - -# Writes a template.txt file -# dkeyStrings is the dictionary returned by generate_template -def write_template(templ_file, dkeyStrings, mod_name): - # read existing template file to preserve comments - existing_template = import_tr_file(templ_file) - - text = strings_to_text(dkeyStrings, existing_template[0], mod_name, existing_template[2]) - mkdir_p(os.path.dirname(templ_file)) - with open(templ_file, "wt", encoding='utf-8') as template_file: - template_file.write(text) - - -# Gets all translatable strings from a lua file -def read_lua_file_strings(lua_file): - lOut = [] - with open(lua_file, encoding='utf-8') as text_file: - text = text_file.read() - #TODO remove comments here - - text = re.sub(pattern_concat, "", text) - - strings = [] - for s in pattern_lua_s.findall(text): - strings.append(s[1]) - for s in pattern_lua_bracketed_s.findall(text): - strings.append(s) - for s in pattern_lua_fs.findall(text): - strings.append(s[1]) - for s in pattern_lua_bracketed_fs.findall(text): - strings.append(s) - - for s in strings: - s = re.sub(r'"\.\.\s+"', "", s) - s = re.sub("@[^@=0-9]", "@@", s) - s = s.replace('\\"', '"') - s = s.replace("\\'", "'") - s = s.replace("\n", "@n") - s = s.replace("\\n", "@n") - s = s.replace("=", "@=") - lOut.append(s) - return lOut - -# Gets strings from an existing translation file -# returns both a dictionary of translations -# and the full original source text so that the new text -# can be compared to it for changes. -# Returns also header comments in the third return value. -def import_tr_file(tr_file): - dOut = {} - text = None - header_comment = None - if os.path.exists(tr_file): - with open(tr_file, "r", encoding='utf-8') as existing_file : - # save the full text to allow for comparison - # of the old version with the new output - text = existing_file.read() - existing_file.seek(0) - # a running record of the current comment block - # we're inside, to allow preceeding multi-line comments - # to be retained for a translation line - latest_comment_block = None - for line in existing_file.readlines(): - line = line.rstrip('\n') - if line[:3] == "###": - if header_comment is None: - # Save header comments - header_comment = latest_comment_block - # Stip textdomain line - tmp_h_c = "" - for l in header_comment.split('\n'): - if not l.startswith("# textdomain:"): - tmp_h_c += l + '\n' - header_comment = tmp_h_c - - # Reset comment block if we hit a header - latest_comment_block = None - continue - if line[:1] == "#": - # Save the comment we're inside - if not latest_comment_block: - latest_comment_block = line - else: - latest_comment_block = latest_comment_block + "\n" + line - continue - match = pattern_tr.match(line) - if match: - # this line is a translated line - outval = {} - outval["translation"] = match.group(2) - if latest_comment_block: - # if there was a comment, record that. - outval["comment"] = latest_comment_block - latest_comment_block = None - dOut[match.group(1)] = outval - return (dOut, text, header_comment) - -# Walks all lua files in the mod folder, collects translatable strings, -# and writes it to a template.txt file -# Returns a dictionary of localized strings to source file sets -# that can be used with the strings_to_text function. -def generate_template(folder, mod_name): - dOut = {} - for root, dirs, files in os.walk(folder): - for name in files: - if fnmatch.fnmatch(name, "*.lua"): - fname = os.path.join(root, name) - found = read_lua_file_strings(fname) - if params["verbose"]: - print(f"{fname}: {str(len(found))} translatable strings") - - for s in found: - sources = dOut.get(s, set()) - sources.add(f"### {os.path.basename(fname)} ###") - dOut[s] = sources - - if len(dOut) == 0: - return None - templ_file = os.path.join(folder, "locale/template.txt") - write_template(templ_file, dOut, mod_name) - return dOut - -# Updates an existing .tr file, copying the old one to a ".old" file -# if any changes have happened -# dNew is the data used to generate the template, it has all the -# currently-existing localized strings -def update_tr_file(dNew, mod_name, tr_file): - if params["verbose"]: - print(f"updating {tr_file}") - - tr_import = import_tr_file(tr_file) - dOld = tr_import[0] - textOld = tr_import[1] - - textNew = strings_to_text(dNew, dOld, mod_name, tr_import[2]) - - if textOld and textOld != textNew: - print(f"{tr_file} has changed.") - if not params["no-old-file"]: - shutil.copyfile(tr_file, f"{tr_file}.old") - - with open(tr_file, "w", encoding='utf-8') as new_tr_file: - new_tr_file.write(textNew) - -# Updates translation files for the mod in the given folder -def update_mod(folder): - modname = get_modname(folder) - if modname is not None: - process_po_files(folder, modname) - print(f"Updating translations for {modname}") - data = generate_template(folder, modname) - if data == None: - print(f"No translatable strings found in {modname}") - else: - for tr_file in get_existing_tr_files(folder): - update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) - else: - print(f"\033[31mUnable to find modname in folder {folder}.\033[0m", file=_stderr) - exit(1) - -# Determines if the folder being pointed to is a mod or a mod pack -# and then runs update_mod accordingly -def update_folder(folder): - is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) - if is_modpack: - subfolders = [f.path for f in os.scandir(folder) if f.is_dir()] - for subfolder in subfolders: - update_mod(subfolder + "/") - else: - update_mod(folder) - print("Done.") - -def run_all_subfolders(folder): - for modfolder in [f.path for f in os.scandir(folder) if f.is_dir()]: - update_folder(modfolder + "/") - - -_argv.append("--sort") -main() diff --git a/techage/icta_controller/action.lua b/techage/icta_controller/action.lua deleted file mode 100644 index 89ee53b..0000000 --- a/techage/icta_controller/action.lua +++ /dev/null @@ -1,107 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Action Registration - -]]-- - - -- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local logic = techage.logic - - - - --- tables with all data from action registrations -local kvRegisteredActn = {} - --- list of keys for actions -local aActnTypes = {} - --- list of titles for actions -local aActnTitles = {} - --- --- API function for action registrations --- -function techage.icta_register_action(key, tData) - table.insert(aActnTypes, key) - table.insert(aActnTitles, tData.title) - tData.__idx__ = #aActnTypes - if kvRegisteredActn[key] ~= nil then - print("[Techage] Action registration error "..key) - return - end - kvRegisteredActn[key] = tData - for _,item in ipairs(tData.formspec) do - if item.type == "textlist" then - item.tChoices = string.split(item.choices, ",") - item.num_choices = #item.tChoices - end - end -end - --- return formspec string -function techage.actn_formspec(row, kvSelect) - return techage.submenu_generate_formspec( - row, "actn", "Action type", aActnTypes, aActnTitles, kvRegisteredActn, kvSelect) -end - --- evaluate the row action input --- and return new data -function techage.actn_eval_input(kvSelect, fields) - kvSelect = techage.submenu_eval_input(kvRegisteredActn, aActnTypes, aActnTitles, kvSelect, fields) - return kvSelect -end - - --- return the Lua code -function techage.code_action(kvSelect, environ) - if kvSelect and kvRegisteredActn[kvSelect.choice] then - if techage.submenu_verify(environ.owner, kvRegisteredActn, kvSelect) then - return kvRegisteredActn[kvSelect.choice].code(kvSelect, environ) - end - end - return nil -end - -techage.icta_register_action("default", { - title = "", - formspec = {}, - code = function(data, environ) return false, false end, - button = function(data, environ) return "..." end, -}) - -techage.icta_register_action("print", { - title = "print to output window", - formspec = { - { - type = "ascii", - name = "text", - label = "Output the following text", - default = "", - }, - { - type = "label", - name = "lbl", - label = "Use a '*' character as reference to any\ncondition state", - }, - }, - button = function(data, environ) - return 'print("'..data.text:sub(1,12)..'")' - end, - code = function(data, environ) - return function(env, output, idx) - local text = string.gsub(data.text, "*", tostring(env.result[idx])) - output(env.pos, text) - end - end, -}) diff --git a/techage/icta_controller/battery.lua b/techage/icta_controller/battery.lua deleted file mode 100644 index 1b4082e..0000000 --- a/techage/icta_controller/battery.lua +++ /dev/null @@ -1,187 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Battery - -]]-- - - -- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local BATTERY_CAPACITY = 10000000 - -local function calc_percent(content) - local val = (BATTERY_CAPACITY - math.min(content or 0, BATTERY_CAPACITY)) - return 100 - math.floor((val * 100.0 / BATTERY_CAPACITY)) -end - -local function on_timer(pos, elapsed) - local meta = minetest.get_meta(pos) - local number = meta:get_string("node_number") - local percent = calc_percent(meta:get_int("content")) - meta:set_string("infotext", S("Battery").." "..number..": "..percent.." %") - if percent == 0 then - local node = minetest.get_node(pos) - node.name = "techage:ta4_battery_empty" - minetest.swap_node(pos, node) - return false - end - return true -end - -minetest.register_alias("techage:ta4_battery75", "techage:ta4_battery") -minetest.register_alias("techage:ta4_battery50", "techage:ta4_battery") -minetest.register_alias("techage:ta4_battery25", "techage:ta4_battery") - -minetest.register_node("techage:ta4_battery", { - description = S("Battery"), - inventory_image = 'techage_battery_inventory.png', - wield_image = 'techage_battery_inventory.png', - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_battery_green.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer, itemstack) - local content = BATTERY_CAPACITY - if itemstack then - local stack_meta = itemstack:get_meta() - if stack_meta then - -- This ensures that dug batteries of the old system are considered full. - local string_content = stack_meta:get_string("content") - if string_content ~= "" then - -- Batteries dug in the new system are handled correctly. - content = techage.in_range(stack_meta:get_int("content"), 0, BATTERY_CAPACITY) - end - end - end - M(pos):set_int("content", content) - local number = techage.add_node(pos, "techage:ta4_battery") - M(pos):set_string("node_number", number) - on_timer(pos, 1) - minetest.get_node_timer(pos):start(30) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - on_timer = on_timer, - - preserve_metadata = function(pos, oldnode, oldmetadata, drops) - local content = M(pos):get_int("content") - - local meta = drops[1]:get_meta() - meta:set_int("content", content) - local percent = calc_percent(content) - local text = S("Battery").." ("..percent.." %)" - meta:set_string("description", text) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=1, cracky=1, crumbly=1}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:ta4_battery_empty", { - description = S("Battery"), - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_battery_red.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_int("content", 0) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=1}, - drop = "", - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - - -if minetest.global_exists("moreores") then - minetest.register_craft({ - output = "techage:ta4_battery 2", - recipe = { - {"", "moreores:silver_ingot", ""}, - {"", "default:copper_ingot", ""}, - {"", "moreores:silver_ingot", ""}, - } - }) -else - minetest.register_craft({ - output = "techage:ta4_battery 2", - recipe = { - {"", "default:tin_ingot", ""}, - {"", "default:copper_ingot", ""}, - {"", "default:tin_ingot", ""}, - } - }) -end - -techage.register_node({"techage:ta4_battery"}, { - on_node_load = function(pos) - minetest.get_node_timer(pos):start(30) - end, - - on_recv_message = function(pos, src, topic, payload) - if topic == "load" then - local meta = minetest.get_meta(pos) - return calc_percent(meta:get_int("content")) - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 134 then - local meta = minetest.get_meta(pos) - return 0, {calc_percent(meta:get_int("content"))} - else - return 2, "" - end - end, -}) diff --git a/techage/icta_controller/commands.lua b/techage/icta_controller/commands.lua deleted file mode 100644 index f6c31f5..0000000 --- a/techage/icta_controller/commands.lua +++ /dev/null @@ -1,958 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Register all controller commands - -]]-- - - -- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local logic = techage.logic - -function techage.compare(op1, op2, method) - if method == "is" then - return op1 == op2 - elseif method == "is not" then - return op1 ~= op2 - elseif method == "greater" then - return op1 > op2 - elseif method == "less" then - return op1 < op2 - end -end - -function techage.fmt_number(num) - local mtch = num:match('^(%d+).*') - if mtch and num ~= mtch then - return mtch.."..." - end - return num -end - - -techage.icta_register_condition("initial", { - title = "initial", - formspec = { - { - type = "label", - name = "lbl", - label = "Condition is true only after\ncontroller start.", - }, - }, - -- Return two chunks of executable Lua code for the controller, according: - -- return , - code = function(data, environ) - local condition = function(env, idx) - return env.ticks - end - local result = function(val) - return val == 1 - end - return condition, result - end, - button = function(data, environ) return "Initial after start" end, -}) - -techage.icta_register_condition("true", { - title = "true", - formspec = { - { - type = "label", - name = "lbl", - label = "Condition is always true.", - }, - }, - code = function(data, environ) - local condition = function(env, idx) - return true - end - local result = function(val) - return val == true - end - return condition, result - end, - button = function(data, environ) return "true" end, -}) - -techage.icta_register_condition("condition", { - title = "condition", - formspec = { - { - type = "textlist", - name = "condition", - label = "condition row number", - choices = "1,2,3,4,5,6,7,8", - default = "", - }, - { - type = "textlist", - name = "operand", - label = "condition", - choices = "was true, was not true", - default = "was true", - }, - { - type = "label", - name = "lbl", - label = "Used to execute two or more\nactions based on one condition.", - }, - }, - code = function(data, environ) - local condition = function(env, idx) - local index = data.condition:byte(-1) - 0x30 - return env.condition[index] - end - local result = function(val) - return val == (data.operand == "was true") - end - return condition, result - end, - button = function(data, environ) return "cond("..data.condition:sub(-1,-1)..","..data.operand..")" end, -}) - -techage.icta_register_condition("input", { - title = "inputs", - formspec = { - { - type = "digits", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "operand", - choices = "is,is not", - default = "is", - }, - { - type = "textlist", - name = "value", - choices = "on,off,invalid", - default = "on", - }, - { - type = "label", - name = "lbl", - label = "An input is only available,\nif a block sends on/off\ncommands to the controller.", - }, - }, - button = function(data, environ) -- default button label - return 'inp('..techage.fmt_number(data.number)..','..data.operand.." "..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return env.input[data.number] - end - local result = function(val) - return techage.compare(val, data.value or "invalid", data.operand) - end - return condition, result - end, -}) - -techage.icta_register_condition("state", { - title = "read block state", - formspec = { - { - type = "number", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "operand", - label = "", - choices = "is,is not", - default = "is", - }, - { - type = "textlist", - name = "value", - label = "", - choices = "stopped,running,standby,blocked,nopower,fault,unloaded,invalid,on,off,empty,loaded,loading,full", - default = "stopped", - }, - { - type = "label", - name = "lbl", - label = "Read the state of a TA3/TA4 machine.\n", - }, - }, - button = function(data, environ) -- default button label - return 'sts('..techage.fmt_number(data.number)..","..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "state") - end - local result = function(val) - return techage.compare(val, data.value or "invalid", data.operand) - end - return condition, result - end, -}) - -techage.icta_register_condition("fuel", { - title = "read amount of fuel", - formspec = { - { - type = "number", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "operand", - label = "", - choices = "greater,less", - default = "greater", - }, - { - type = "digits", - name = "value", - label = "than", - default = "" - }, - { - type = "label", - name = "lbl", - label = "Read and evaluate the fuel value\nof a fuel consuming block.", - }, - }, - button = function(data, environ) - return 'fuel('..techage.fmt_number(data.number)..","..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "fuel") - end - local result = function(val) - return techage.compare(val, tonumber(data.value) or 0, data.operand) - end - return condition, result - end, -}) - -techage.icta_register_condition("load", { - title = "read power/liquid load", - formspec = { - { - type = "number", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "operand", - label = "", - choices = "greater,less", - default = "greater", - }, - { - type = "digits", - name = "value", - label = "than", - default = "" - }, - { - type = "label", - name = "lbl", - label = "Read and evaluate the load (0..100)\nof a tank/storage block.", - }, - }, - button = function(data, environ) - return 'load('..techage.fmt_number(data.number)..","..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "load") - end - local result = function(val) - return techage.compare(val, tonumber(data.value) or 0, data.operand) - end - return condition, result - end, -}) - -techage.icta_register_condition("depth", { - title = "read quarry depth", - formspec = { - { - type = "number", - name = "number", - label = "quarry number", - default = "", - }, - { - type = "textlist", - name = "operand", - label = "", - choices = "greater,less", - default = "greater", - }, - { - type = "digits", - name = "value", - label = "than", - default = "" - }, - { - type = "label", - name = "lbl", - label = "Read and evaluate the current\ndepth of a quarry block.", - }, - }, - button = function(data, environ) - return 'depth('..techage.fmt_number(data.number)..","..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "depth") - end - local result = function(val) - return techage.compare(val, tonumber(data.value) or 0, data.operand) - end - return condition, result - end, -}) - -techage.icta_register_condition("delivered", { - title = "read delivered power", - formspec = { - { - type = "number", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "operand", - label = "", - choices = "greater,less", - default = "greater", - }, - { - type = "digits", - name = "value", - label = "than", - default = "" - }, - { - type = "label", - name = "lbl", - label = "Read and evaluate the delivered\npower of a generator block.\nPower consuming blocks like accus\ncould also provide a negative value.", - }, - }, - button = function(data, environ) - return 'deliv('..techage.fmt_number(data.number)..","..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "delivered") - end - local result = function(val) - return techage.compare(val, tonumber(data.value) or 0, data.operand) - end - return condition, result - end, -}) - -techage.icta_register_condition("chest", { - title = "read chest state", - formspec = { - { - type = "number", - name = "number", - label = "chest number", - default = "", - }, - { - type = "textlist", - name = "operand", - label = "", - choices = "is,is not", - default = "is", - }, - { - type = "textlist", - name = "value", - label = "", - choices = "empty,loaded,full,invalid", - default = "empty", - }, - { - type = "label", - name = "lbl", - label = "Read the state from a Techage chest\n".. - "and other similar blocks.", - }, - }, - button = function(data, environ) -- default button label - return 'chest('..techage.fmt_number(data.number)..","..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "state") - end - local result = function(val) - return techage.compare(val, data.value or "invalid", data.operand) - end - return condition, result - end, -}) - -techage.icta_register_condition("signaltower", { - title = "read Signal Tower state", - formspec = { - { - type = "number", - name = "number", - label = "Signal Tower number", - default = "", - }, - { - type = "textlist", - name = "operand", - choices = "is,is not", - default = "is", - }, - { - type = "textlist", - name = "value", - choices = "off,green,amber,red,invalid", - default = "off", - }, - { - type = "label", - name = "lbl", - label = "Read the color state\nof a Signal Tower.", - }, - }, - button = function(data, environ) -- default button label - return 'tower('..techage.fmt_number(data.number)..","..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "state") - end - local result = function(val) - return techage.compare(val, data.value or "invalid", data.operand) - end - return condition, result - end, -}) - -techage.icta_register_action("signaltower", { - title = "TA4 Signal Tower", - formspec = { - { - type = "numbers", - name = "number", - label = "Signal Tower number", - default = "", - }, - { - type = "textlist", - name = "value", - label = "lamp color", - choices = "off,green,amber,red", - default = "red", - }, - { - type = "label", - name = "lbl", - label = "Turn on/off a Signal Tower lamp.", - }, - }, - button = function(data, environ) - return 'tower('..techage.fmt_number(data.number)..","..data.value..')' - end, - code = function(data, environ) - return function(env, output, idx) - techage.send_multi(environ.number, data.number, data.value) - end - end, -}) - -techage.icta_register_action("signallamp", { - title = "TA4 Signal Lamp", - formspec = { - { - type = "numbers", - name = "number", - label = "Signal Tower number", - default = "", - }, - { - type = "textlist", - name = "payload", - label = "lamp number", - choices = "1,2,3,4", - default = "1", - }, - { - type = "textlist", - name = "value", - label = "lamp color", - choices = "off,green,amber,red", - default = "red", - }, - { - type = "label", - name = "lbl", - label = "Turn on/off a Signal Tower lamp.", - }, - }, - button = function(data, environ) - return 'tower('..techage.fmt_number(data.number)..","..data.payload..","..data.value..')' - end, - code = function(data, environ) - return function(env, output, idx) - techage.send_multi(environ.number, data.number, data.value, tonumber(data.payload)) - end - end, -}) - -techage.icta_register_action("switch", { - title = "turn block on/off", - formspec = { - { - type = "numbers", - name = "number", - label = "block number(s)", - default = "", - }, - { - type = "textlist", - name = "value", - label = "state", - choices = "on,off", - default = "on", - }, - { - type = "label", - name = "lbl", - label = "Used for lamps, machines, gates,...", - }, - }, - button = function(data, environ) - return 'turn('..techage.fmt_number(data.number)..","..data.value..')' - end, - code = function(data, environ) - return function(env, output, idx) - techage.send_multi(environ.number, data.number, data.value) - end - end, -}) - -techage.icta_register_action("display", { - title = "Display: overwrite one line", - formspec = { - { - type = "numbers", - name = "number", - label = "Display number", - default = "", - }, - { - type = "textlist", - name = "row", - label = "Display line", - choices = "1,2,3,4,5", - default = "1", - }, - { - type = "ascii", - name = "text", - label = "text", - default = "", - }, - { - type = "label", - name = "lbl", - label = "Use a '*' character as reference\nto any condition result", - }, - }, - code = function(data, environ) - return function(env, output, idx) - local text = string.gsub(data.text, "*", tostring(env.result[idx])) - local payload = safer_lua.Store() - payload.set("row", data.row) - payload.set("str", text) - techage.send_multi(environ.number, data.number, "set", payload) - end - end, - button = function(data, environ) - return "lcd("..techage.fmt_number(data.number)..","..data.row..',"'..data.text..'")' - end, -}) - -techage.icta_register_action("cleardisplay", { - title = "Display: Clear screen", - formspec = { - { - type = "number", - name = "number", - label = "Display number", - default = "", - }, - }, - code = function(data, environ) - return function(env, output, idx) - techage.send_multi(environ.number, data.number, "clear") - end - end, - button = function(data, environ) - return "clear lcd("..techage.fmt_number(data.number)..")" - end, -}) - -techage.icta_register_action("chat", { - title = "send chat message", - formspec = { - { - type = "ascii", - name = "text", - label = "message", - default = "", - }, - { - type = "label", - name = "lbl", - label = "The chat message is send to the\nController owner, only.", - }, - }, - code = function(data, environ) - return function(env, output, idx) - minetest.chat_send_player(environ.owner, "[TA4 ICTA Controller] "..data.text) - end - end, - button = function(data, environ) - return 'chat("'..data.text:sub(1,12)..'")' - end, -}) - -function techage.icta_door_toggle(pos, owner, state) - pos = minetest.string_to_pos("("..pos..")") - if pos then - local door = doors.get(pos) - if door then - local player = { - get_player_name = function() return owner end, - is_player = function() return true end, - } - if state == "open" then - door:open(player) - elseif state == "close" then - door:close(player) - end - end - end -end - -techage.icta_register_action("door", { - title = "open/close door", - formspec = { - { - type = "digits", - name = "pos", - label = "door position like: 123,7,-1200", - default = "", - }, - { - type = "textlist", - name = "door_state", - label = "door state", - choices = "open,close", - default = "open", - }, - { - type = "label", - name = "lbl", - label = "For standard doors like the Steel Doors.\n".. - "Use the Techage Info Tool to\neasily determine a door position.", - }, - }, - code = function(data, environ) - return function(env, output, idx) - techage.icta_door_toggle(data.pos, environ.owner, data.door_state) - end - end, - button = function(data, environ) - return 'door("'..data.pos..'",'..data.door_state..")" - end, -}) - -techage.icta_register_action("move", { - title = "TA4 Move Controller", - formspec = { - { - type = "number", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "cmnd", - label = "command", - choices = "a2b,b2a,move", - default = "a2b", - }, - }, - button = function(data, environ) -- default button label - return 'move('..techage.fmt_number(data.number)..","..data.cmnd..')' - end, - code = function(data, environ) - return function(env, output, idx) - return techage.send_single(environ.number, data.number, data.cmnd) - end - end, -}) - -techage.icta_register_action("turn", { - title = "TA4 Turn Controller", - formspec = { - { - type = "number", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "cmnd", - label = "command", - choices = "left,right,uturn", - default = "left", - }, - }, - button = function(data, environ) -- default button label - return 'move('..techage.fmt_number(data.number)..","..data.cmnd..')' - end, - code = function(data, environ) - return function(env, output, idx) - return techage.send_single(environ.number, data.number, data.cmnd) - end - end, -}) - -techage.icta_register_action("goto", { - title = "TA4 Sequencer", - formspec = { - { - type = "number", - name = "number", - label = "block number", - default = "", - }, - { - type = "textlist", - name = "cmnd", - label = "command", - choices = "goto,stop", - default = "left", - }, - { - type = "number", - name = "slot", - label = "time slot", - default = "1", - }, - { - type = "label", - name = "lbl", - label = "The 'stop' command needs no time slot.", - }, - }, - button = function(data, environ) -- default button label - return data.cmnd..'('..techage.fmt_number(data.number)..","..data.slot..')' - end, - code = function(data, environ) - return function(env, output, idx) - return techage.send_single(environ.number, data.number, data.cmnd, tonumber(data.slot or "1") or 1) - end - end, -}) - -function techage.icta_player_detect(own_num, number, name) - local state = techage.send_single(own_num, number, "name", nil) - if state ~= "" then - if name == "*" or string.find(name, state) then - return state - end - elseif name == "-" then - return state - end - return nil -end - -techage.icta_register_condition("playerdetector", { - title = "read Player Detector", - formspec = { - { - type = "number", - name = "number", - label = "Player Detector number", - default = "", - }, - { - type = "ascii", - name = "name", - label = "player name(s) or * for all", - default = "", - }, - { - type = "label", - name = "lbl", - label = "Read and check the name\nof a Player Detector.\nUse a '*' character for all player names.\n Use a '-' character for no player.", - }, - }, - - code = function(data, environ) - local condition = function(env, idx) - return techage.icta_player_detect(environ.number, data.number, data.name) - end - local result = function(val) - return val ~= nil - end - return condition, result - end, - button = function(data, environ) - return "detector("..techage.fmt_number(data.number)..","..data.name:sub(1,8)..")" - end, -}) - -techage.icta_register_action("set_filter", { - title = "turn Distributor filter on/off", - formspec = { - { - type = "number", - name = "number", - label = "distri number", - default = "", - }, - { - type = "textlist", - name = "color", - label = "filter port", - choices = "red,green,blue,yellow", - default = "red", - }, - { - type = "textlist", - name = "value", - label = "state", - choices = "on,off", - default = "on", - }, - { - type = "label", - name = "lbl", - label = "turn Distributor filter port on/off\n", - }, - }, - button = function(data, environ) - return 'turn('..techage.fmt_number(data.number)..","..data.color..","..data.value..')' - end, - code = function(data, environ) - return function(env, output, idx) - local payload = data.color.."="..data.value - techage.send_single(environ.number, data.number, "port", payload) - end - end, -}) - -techage.icta_register_condition("get_filter", { - title = "read state of a Distributor filter slot", - formspec = { - { - type = "number", - name = "number", - label = "distri number", - default = "", - }, - { - type = "textlist", - name = "color", - label = "filter port", - choices = "red,green,blue,yellow", - default = "red", - }, - { - type = "textlist", - name = "operand", - choices = "is,is not", - default = "is", - }, - { - type = "textlist", - name = "value", - label = "state", - choices = "on,off", - default = "off", - }, - { - type = "label", - name = "lbl", - label = "Read state of a Distributor filter slot.\n", - }, - }, - button = function(data, environ) -- default button label - return 'fltr('..techage.fmt_number(data.number)..","..data.color..' '..data.operand..' '..data.value..')' - end, - code = function(data, environ) - local condition = function(env, idx) - return techage.send_single(environ.number, data.number, "port", data.color) - end - local result = function(val) - return techage.compare(val, data.value or "invalid", data.operand) - end - return condition, result - end, -}) - -techage.icta_register_action("exchange", { - title = "place/remove a block via the Door Controller II", - formspec = { - { - type = "number", - name = "number", - label = "number", - default = "", - }, - { - type = "number", - name = "slot", - label = "slot no", - default = "1", - }, - { - type = "label", - name = "lbl", - label = "place/remove a block via\nthe Door Controller II\n", - }, - }, - button = function(data, environ) - return 'exch('..techage.fmt_number(data.number)..","..data.slot..')' - end, - code = function(data, environ) - return function(env, output, idx) - local payload = data.slot - techage.send_single(environ.number, data.number, "exchange", payload) - end - end, -}) diff --git a/techage/icta_controller/condition.lua b/techage/icta_controller/condition.lua deleted file mode 100644 index b407d74..0000000 --- a/techage/icta_controller/condition.lua +++ /dev/null @@ -1,84 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Condition Registration - -]]-- - - -- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local logic = techage.logic - --- tables with all data from condition registrations -local kvRegisteredCond = {} - --- list of keys for conditions -local aCondTypes = {} - --- list of titles for conditions -local aCondTitles = {} - --- --- API functions for condition registrations --- -function techage.icta_register_condition(key, tData) - table.insert(aCondTypes, key) - table.insert(aCondTitles, tData.title) - if kvRegisteredCond[key] ~= nil then - print("[Techage] Condition registration error "..key) - return - end - kvRegisteredCond[key] = tData - for _,item in ipairs(tData.formspec) do - if item.type == "textlist" then - item.tChoices = string.split(item.choices, ",") - item.num_choices = #item.tChoices - end - end -end - --- return formspec string -function techage.cond_formspec(row, kvSelect) - return techage.submenu_generate_formspec( - row, "cond", "Condition type", aCondTypes, aCondTitles, kvRegisteredCond, kvSelect) -end - --- evaluate the row condition input --- and return new data -function techage.cond_eval_input(kvSelect, fields) - kvSelect = techage.submenu_eval_input(kvRegisteredCond, aCondTypes, aCondTitles, kvSelect, fields) - return kvSelect -end - --- return the Lua code -function techage.code_condition(kvSelect, environ) - if kvSelect and kvRegisteredCond[kvSelect.choice] then - if techage.submenu_verify(environ.owner, kvRegisteredCond, kvSelect) then - return kvRegisteredCond[kvSelect.choice].code(kvSelect, environ) - end - end - return nil, nil -end - -techage.icta_register_condition("default", { - title = "", - formspec = {}, - code = function(data, environ) - local condition = function(env, idx) - return false - end - local result = function(val) - return false - end - return condition, result - end, - button = function(data, environ) return "..." end, -}) diff --git a/techage/icta_controller/controller.lua b/techage/icta_controller/controller.lua deleted file mode 100644 index e076354..0000000 --- a/techage/icta_controller/controller.lua +++ /dev/null @@ -1,472 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - -]]-- - - -- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local logic = techage.logic - --- --- Helper functions --- -local function gen_table(size, val) - local tbl = {} - for idx = 1,size do - if type(val) == "table" then - tbl[idx] = table.copy(val) - else - tbl[idx] = val - end - end - return tbl -end - -local function integer(s, min, max) - if s and s ~= "" and s:find("^%d+$") then - local num = tonumber(s) - if num < min then num = min end - if num > max then num = max end - return num - end - return min -end - -local sOUTPUT = "Edit commands (see help)" -local Cache = {} -local FS_DATA = gen_table(techage.NUM_RULES, {}) - - -local function output(pos, text, flush_buffer) - local meta = minetest.get_meta(pos) - if not flush_buffer then - text = meta:get_string("output") .. "\n" .. (text or "") - text = text:sub(-500,-1) - end - meta:set_string("output", text) - meta:set_string("formspec", techage.formspecOutput(meta)) -end - --- cyclic execution (cycle, cond, result, after, actn) -local function TemplCyc(cycle, cond, result, after, actn, idx) - return function(env, output) - if env.blocked[idx] == false and env.ticks % cycle == 0 then - env.result[idx] = cond(env, idx) - env.blocked[idx] = result(env.result[idx]) - if env.blocked[idx] then - env.timer[idx] = env.ticks + after - end - env.condition[idx] = env.blocked[idx] - else - env.condition[idx] = false - end - if env.blocked[idx] and env.timer[idx] == env.ticks then - actn(env, output, idx) - env.blocked[idx] = false - end - end -end - --- event based execution -local function TemplEvt(cond, result, after, actn, idx) - return function(env, output) - if env.blocked[idx] == false and env.event then - env.result[idx] = cond(env, idx) - env.blocked[idx] = result(env.result[idx]) - if env.blocked[idx] then - env.timer[idx] = env.ticks + after - end - env.condition[idx] = env.blocked[idx] - else - env.condition[idx] = false - end - if env.blocked[idx] and env.timer[idx] == env.ticks then - actn(env, output, idx) - env.blocked[idx] = false - end - end - -end - --- generate the Lua code from the NUM_RULES rules -local function generate(pos, meta, environ) - local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA - local tbl = {} - for idx = 1,techage.NUM_RULES do - local cycle = integer(fs_data[idx].cycle, 0, 1000) - local cond, result = techage.code_condition(fs_data[idx].cond, environ) - local after = integer(fs_data[idx].after, 0, 1000) - local actn = techage.code_action(fs_data[idx].actn, environ) - -- valid rule? - if cycle and cond and after and actn then - -- add rule number - local f - if cycle == 0 then -- event - f = TemplEvt(cond, result, after, actn, idx) - else -- cyclic - f = TemplCyc(cycle, cond, result, after, actn, idx) - end - -- add to list of rules - tbl[#tbl+1] = f - elseif cond ~= nil and actn == nil then - output(pos, "Error in action in rule "..idx) - elseif cond == nil and actn ~= nil then - output(pos, "Error in condition in rule "..idx) - end - end - return tbl -end - -local function runtime_environ(pos) - return { - ticks = 0, - pos = pos, - timer = gen_table(8, 0), - blocked = gen_table(8, false), - result = gen_table(8, false), - condition = gen_table(8, false), - input = {}, -- node number is key - } -end - -local function compile(pos, meta, number) - local gen_environ = { - meta = meta, - pos = pos, - number = number, - owner = meta:get_string("owner"), - } - local functions = generate(pos, meta, gen_environ) - Cache[number] = { - code = functions, - env = runtime_environ(pos), - } - return true -end - -local function execute(pos, number, event) - local code = Cache[number].code - local env = Cache[number].env - if event then - env.event = true - else - env.event = false - env.ticks = env.ticks + 1 - end - for _,func in ipairs(code) do - local res, err = pcall(func, env, output) - if not res then - output(pos, err) - return false - end - end - return true -end - - -local function battery(pos) - local battery_pos = minetest.find_node_near(pos, 1, {"techage:ta4_battery"}) - if battery_pos then - local meta = minetest.get_meta(pos) - meta:set_string("battery", minetest.pos_to_string(battery_pos)) - return true - end - return false -end - -local function start_controller(pos, meta) - local number = meta:get_string("number") - if not battery(pos) then - meta:set_string("formspec", techage.formspecError(meta)) - return false - end - - meta:set_string("output", "") - meta:set_int("cpu", 0) - - if compile(pos, meta, number) then - meta:set_int("state", techage.RUNNING) - minetest.get_node_timer(pos):start(1) - local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA - meta:set_string("formspec", techage.formspecRules(meta, fs_data, sOUTPUT)) - meta:set_string("infotext", "Controller "..number..": running") - return true - end - return false -end - -local function stop_controller(pos, meta) - local number = meta:get_string("number") - meta:set_int("state", techage.STOPPED) - minetest.get_node_timer(pos):stop() - meta:set_string("infotext", "Controller "..number..": stopped") - local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA - meta:set_string("formspec", techage.formspecRules(meta, fs_data, sOUTPUT)) -end - -local function no_battery(pos) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - meta:set_int("state", techage.STOPPED) - minetest.get_node_timer(pos):stop() - meta:set_string("infotext", "Controller "..number..": No battery") - meta:set_string("formspec", techage.formspecError(meta)) -end - -local function update_battery(meta, cpu) - local pos = minetest.string_to_pos(meta:get_string("battery")) - if pos then - meta = minetest.get_meta(pos) - local content = meta:get_int("content") - cpu - if content <= 0 then - meta:set_int("content", 0) - return false - end - meta:set_int("content", content) - return true - end -end - -local function on_timer(pos, elapsed) - local meta = minetest.get_meta(pos) - local t = minetest.get_us_time() - local number = meta:get_string("number") - if Cache[number] or compile(pos, meta, number) then - local res = execute(pos, number, elapsed == -1) - if res then - t = minetest.get_us_time() - t - if not update_battery(meta, t) then - no_battery(pos) - return false - end - end - --print("on_timer", t) - return res - end - return false -end - -local function on_receive_fields(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - if not player or not player:is_player() then - return - end - if player:get_player_name() ~= owner then - return - end - - --print("fields", dump(fields)) - if fields.quit then -- cancel button - return - end - if fields.notes then -- notes tab? - meta:set_string("notes", fields.notes) - end - if fields.go then - local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA - local output = techage.edit_command(fs_data, fields.cmnd) - stop_controller(pos, meta) - meta:set_string("formspec", techage.formspecRules(meta, fs_data, output)) - meta:set_string("fs_data", minetest.serialize(fs_data)) - end - if fields._type_ == "main" then - techage.store_main_form_data(meta, fields) - local key = techage.main_form_button_pressed(fields) - if key then - -- store data before going into sub-menu - meta:set_string("fs_old", meta:get_string("fs_data")) - meta:set_string("formspec", techage.formspecSubMenu(meta, key)) - end - elseif fields._col_ == "cond" then - techage.cond_formspec_update(meta, fields) - elseif fields._col_ == "actn" then - techage.actn_formspec_update(meta, fields) - end - if fields._exit_ == "ok" then -- exit from sub-menu? - if fields._button_ then - techage.formspec_button_update(meta, fields) - end - -- simulate tab selection - fields.tab = "1" - elseif fields._cancel_ == "cancel" then -- abort from sub-menu? - -- restore old data - meta:set_string("fs_data", meta:get_string("fs_old")) - -- simulate tab selection - fields.tab = "1" - elseif fields.save == "Save" then -- abort from sub-menu? - -- store as old data - meta:set_string("fs_old", meta:get_string("fs_data")) - -- simulate tab selection - fields.tab = "1" - elseif fields.sb_help then - local evt = minetest.explode_scrollbar_event(fields.sb_help) - meta:set_string("formspec", techage.formspecHelp(evt.value)) - end - if fields.update then - meta:set_string("formspec", techage.formspecOutput(meta)) - elseif fields.clear then - meta:set_string("output", "") - meta:set_string("formspec", techage.formspecOutput(meta)) - elseif fields.list then - local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA - local s = techage.listing(fs_data) - output(pos, s, true) - elseif fields.tab == "1" then - local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA - meta:set_string("formspec", techage.formspecRules(meta, fs_data, sOUTPUT)) - elseif fields.tab == "2" then - meta:set_string("formspec", techage.formspecOutput(meta)) - elseif fields.tab == "3" then - meta:set_string("formspec", techage.formspecNotes(meta)) - elseif fields.tab == "4" then - meta:set_string("formspec", techage.formspecHelp(1)) - elseif fields.start == "Start" then - local environ = { - meta = meta, - pos = pos, - number = meta:get_string("number"), - owner = meta:get_string("owner"), - } - --print("CODE:", generate(pos, meta, environ)) - start_controller(pos, meta) - minetest.log("action", player:get_player_name() .. - " starts the ta4_controller at ".. minetest.pos_to_string(pos)) - elseif fields.stop == "Stop" then - stop_controller(pos, meta) - end -end - -minetest.register_node("techage:ta4_icta_controller", { - description = "TA4 ICTA Controller", - inventory_image = "techage_ta4_controller_inventory.png", - wield_image = "techage_ta4_controller_inventory.png", - stack_max = 1, - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_ta4_controller.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local number = techage.add_node(pos, "techage:ta4_icta_controller") - local fs_data = FS_DATA - meta:set_string("fs_data", minetest.serialize(fs_data)) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("number", number) - meta:set_int("state", techage.STOPPED) - meta:set_string("formspec", techage.formspecRules(meta, fs_data, sOUTPUT)) - meta:set_string("infotext", "TA4 ICTA Controller "..number..": stopped") - end, - - on_receive_fields = on_receive_fields, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_timer = on_timer, - - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - use_texture_alpha = techage.CLIP, - groups = {choppy=1, cracky=1, crumbly=1}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta4_icta_controller", - recipe = { - {"basic_materials:plastic_sheet", "dye:blue", "basic_materials:plastic_sheet"}, - {"", "default:copper_ingot", ""}, - {"techage:ta4_wlanchip", "techage:ta4_ramchip", "techage:ta4_ramchip"}, - }, -}) - --- write inputs from remote nodes -local function set_input(pos, own_number, rmt_number, val) - if rmt_number then - if Cache[own_number] and Cache[own_number].env.input then - local t = minetest.get_us_time() - Cache[own_number].env.input[rmt_number] = val - Cache[own_number].env.last_event = t - -- only two events per second - if not Cache[own_number].last_event or Cache[own_number].last_event < t then - minetest.after(0.01, on_timer, pos, -1) - Cache[own_number].last_event = t + 500000 -- add 500 ms - end - end - end -end - -techage.register_node({"techage:ta4_icta_controller"}, { - on_recv_message = function(pos, src, topic, payload) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - local state = meta:get_int("state") - - if state == techage.RUNNING and topic == "on" then - set_input(pos, number, src, topic) - elseif state == techage.RUNNING and topic == "off" then - set_input(pos, number, src, topic) - elseif topic == "state" then - local state = meta:get_int("state") or 0 - return techage.StateStrings[state] or "stopped" - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - local state = meta:get_int("state") - - if state == techage.RUNNING and topic == 1 and payload[1] == 1 then - set_input(pos, number, src, topic) - elseif state == techage.RUNNING and topic == 1 and payload[1] == 0 then - set_input(pos, number, src, topic) - else - return 2 - end - return 0 - end, - on_beduino_request_data = function(pos, src, topic, payload) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - local state = meta:get_int("state") - - if topic == 129 then - local state = meta:get_int("state") or 0 - return 0, {state or techage.STOPPED} - else - return 2, "" - end - end, -}) diff --git a/techage/icta_controller/display.lua b/techage/icta_controller/display.lua deleted file mode 100644 index 19295b5..0000000 --- a/techage/icta_controller/display.lua +++ /dev/null @@ -1,304 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Display - -]]-- - -local S = techage.S - -techage.display = {} - -local NUM_ROWS = 5 -local RADIUS = 6 -local Param2ToFacedir = {[0] = 0, 0, 3, 1, 2, 0} - -local function lcdlib_bugfix(text_tbl) - if text_tbl and next(text_tbl) then - local t = {} - for _,txt in ipairs(text_tbl) do - if txt == "" then - t[#t+1] = " " - else - t[#t+1] = txt - end - end - return table.concat(t, "\n") - end - return "" -end - -function techage.display.display_update(pos, objref) - pos = vector.round(pos) - local nvm = techage.get_nvm(pos) - local text = lcdlib_bugfix(nvm.text) - local texture = lcdlib.make_multiline_texture( - "default", text, - 70, 70, NUM_ROWS, "top", "#000", nil, true) - objref:set_properties({ textures = {texture}, - visual_size = {x=0.94, y=0.94} }) -end - -function techage.display.display_updateXL(pos, objref) - pos = vector.round(pos) - local nvm = techage.get_nvm(pos) - local text = lcdlib_bugfix(nvm.text) - local texture = lcdlib.make_multiline_texture( - "default", text, - 126, 70, NUM_ROWS, "top", "#000", nil, true) - objref:set_properties({ textures = {texture}, - visual_size = {x=0.94*1.9, y=0.94} }) -end - -function techage.display.on_timer(pos) - local mem = techage.get_mem(pos) - mem.ticks = mem.ticks or 0 - - if mem.ticks > 0 then - local node = minetest.get_node(pos) - -- check if display is loaded and a player in front of the display - if node.name ~= "ignore" then - local dir = minetest.facedir_to_dir(Param2ToFacedir[node.param2 % 6]) - dir.y = 0 - local pos2 = vector.add(pos, vector.multiply(dir, RADIUS)) - for _, obj in pairs(minetest.get_objects_inside_radius(pos2, RADIUS)) do - if obj:is_player() then - lcdlib.update_entities(pos) - mem.ticks = mem.ticks - 1 - break - end - end - end - end - return true -end - -techage.display.lcd_box = { - type = "wallmounted", - wall_top = {-8/16, 15/32, -8/16, 8/16, 8/16, 8/16} -} - -minetest.register_node("techage:ta4_display", { - description = S("TA4 Display"), - inventory_image = 'techage_display_inventory.png', - tiles = {"techage_display.png"}, - drawtype = "nodebox", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "wallmounted", - node_box = techage.display.lcd_box, - selection_box = techage.display.lcd_box, - light_source = 6, - - display_entities = { - ["techage:display_entity"] = { depth = 0.42, - on_display_update = techage.display.display_update}, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:ta4_display") - local meta = minetest.get_meta(pos) - meta:set_string("number", number) - meta:set_string("infotext", S("Display no: ")..number) - local nvm = techage.get_nvm(pos) - nvm.text = {"My", "Techage","TA4", "Display", "No: "..number} - lcdlib.update_entities(pos) - minetest.get_node_timer(pos):start(1) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - on_timer = techage.display.on_timer, - on_place = lcdlib.on_place, - on_construct = lcdlib.on_construct, - on_destruct = lcdlib.on_destruct, - on_rotate = lcdlib.on_rotate, - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - -techage.display.lcd_boxXL = { - type = "fixed", - fixed = {-0.9, -8/16, -8/16, 0.9, -15/32, 8/16} -} - -minetest.register_node("techage:ta4_displayXL", { - description = S("TA4 Display XL"), - inventory_image = 'techage_display_inventoryXL.png', - tiles = {"techage_displayXL.png"}, - drawtype = "nodebox", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "wallmounted", - node_box = techage.display.lcd_boxXL, - selection_box = techage.display.lcd_boxXL, - light_source = 6, - - display_entities = { - ["techage:display_entityXL"] = { depth = 0.42, - on_display_update = techage.display.display_updateXL}, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:ta4_displayXL") - local meta = minetest.get_meta(pos) - meta:set_string("number", number) - meta:set_string("infotext", S("Display no: ")..number) - local nvm = techage.get_nvm(pos) - nvm.text = {"My", "Techage","TA4", "Display", "No: "..number} - lcdlib.update_entities(pos) - minetest.get_node_timer(pos):start(2) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - on_timer = techage.display.on_timer, - on_place = lcdlib.on_place, - on_construct = lcdlib.on_construct, - on_destruct = lcdlib.on_destruct, - on_rotate = lcdlib.on_rotate, - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta4_display", - recipe = { - {"", "", ""}, - {"techage:basalt_glass_thin", "dye:green", "techage:ta4_wlanchip"}, - {"", "default:copper_ingot", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_displayXL", - recipe = { - {"techage:ta4_display", "techage:ta4_display"}, - {"", ""}, - }, -}) - -function techage.display.add_line(pos, payload, cycle_time) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - nvm.text = nvm.text or {} - mem.ticks = mem.ticks or 0 - local str = tostring(payload) or "oops" - - if mem.ticks == 0 then - mem.ticks = cycle_time - end - - while #nvm.text >= NUM_ROWS do - table.remove(nvm.text, 1) - end - table.insert(nvm.text, str) -end - -function techage.display.write_row(pos, payload, cycle_time, beduino) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - local str, row - - nvm.text = nvm.text or {} - mem.ticks = mem.ticks or 0 - - if beduino or type(payload) == "string" then - row = tonumber(payload:sub(1,1) or "1") or 1 - str = payload:sub(2) or "oops" - else - str = tostring(payload.get("str")) or "oops" - row = tonumber(payload.get("row")) or 1 - end - - if mem.ticks == 0 then - mem.ticks = cycle_time - end - - if row < 1 then row = 1 end - if row > NUM_ROWS then row = NUM_ROWS end - - while #nvm.text < row do - table.insert(nvm.text, "") - end - nvm.text[row] = str -end - -function techage.display.clear_screen(pos, cycle_time) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.ticks = mem.ticks or 0 - - if mem.ticks == 0 then - mem.ticks = cycle_time - end - - nvm.text = {} -end - -techage.register_node({"techage:ta4_display"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "add" then -- add one line and scroll if necessary - techage.display.add_line(pos, payload, 1) - elseif topic == "set" then -- overwrite the given row - techage.display.write_row(pos, payload, 1) - elseif topic == "clear" then -- clear the screen - techage.display.clear_screen(pos, 1) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 67 then -- add one line and scroll if necessary - techage.display.add_line(pos, payload, 1) - elseif topic == 68 then -- overwrite the given row - techage.display.write_row(pos, payload, 1, true) - elseif topic == 17 then -- clear the screen - techage.display.clear_screen(pos, 1) - else - return 2 - end - return 0 - end, -}) - -techage.register_node({"techage:ta4_displayXL"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "add" then -- add one line and scroll if necessary - techage.display.add_line(pos, payload, 2) - elseif topic == "set" then -- overwrite the given row - techage.display.write_row(pos, payload, 2) - elseif topic == "clear" then -- clear the screen - techage.display.clear_screen(pos, 2) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 67 then -- add one line and scroll if necessary - techage.display.add_line(pos, payload, 2) - elseif topic == 68 then -- overwrite the given row - techage.display.write_row(pos, payload, 2, true) - elseif topic == 17 then -- clear the screen - techage.display.clear_screen(pos, 2) - else - return 2 - end - return 0 - end, -}) - -lcdlib.register_display_entity("techage:display_entity") -lcdlib.register_display_entity("techage:display_entityXL") diff --git a/techage/icta_controller/edit.lua b/techage/icta_controller/edit.lua deleted file mode 100644 index 55a89db..0000000 --- a/techage/icta_controller/edit.lua +++ /dev/null @@ -1,40 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Formspec edit command - -]]-- - -function techage.edit_command(fs_data, text) - local cmnd, pos1, pos2 = text:match('^(%S)%s(%d+)%s(%d+)$') - if pos2 == nil then - cmnd, pos1 = text:match('^(%S)%s(%d+)$') - end - if cmnd and pos1 and pos2 then - pos1 = math.max(1, math.min(pos1, techage.NUM_RULES)) - pos2 = math.max(1, math.min(pos2, techage.NUM_RULES)) - - if cmnd == "x" then - local temp = fs_data[pos1] - fs_data[pos1] = fs_data[pos2] - fs_data[pos2] = temp - return "rows "..pos1.." and "..pos2.." exchanged" - end - if cmnd == "c" then - fs_data[pos2] = table.copy(fs_data[pos1]) - return "row "..pos1.." copied to "..pos2 - end - elseif cmnd == "d" and pos1 then - pos1 = math.max(1, math.min(pos1, techage.NUM_RULES)) - fs_data[pos1] = {} - return "row "..pos1.." deleted" - end - return "Invalid command '"..text.."'" -end diff --git a/techage/icta_controller/formspec.lua b/techage/icta_controller/formspec.lua deleted file mode 100644 index 13d682c..0000000 --- a/techage/icta_controller/formspec.lua +++ /dev/null @@ -1,243 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Formspec - -]]-- - -techage.NUM_RULES = 8 - -local SIZE = "size[13,8]" - -local sHELP = [[ICTA Controller Help - -Control other nodes by means of rules like: - IF THEN - -These rules allow to execute actions based on conditions. -Examples for conditions are: - - the Player Detector detects a player - - a button is pressed - - a machine is fault, blocked, standby,... - -Actions are: - - switch on/off lamps and machines - - send chat messages to the owner - - output a text message to the display - -The controller executes all rules cyclically. -The cycle time for each rule is configurable -(1..1000 sec). -0 means, the rule will only be called, if -the controller received a command from -another blocks, such as buttons. - -Actions can be delayed. Therefore, the -'after' value can be set (0..1000 sec). - -Edit command examples: - - 'x 1 8' exchange rows 1 with row 8 - - 'c 1 2' copy row 1 to 2 - - 'd 3' delete row 3 - -The 'outp' tab is for debugging outputs via 'print' -The 'notes' tab for your notes. - -The controller needs battery power to work. -The battery pack has to be placed near the -controller (1 node distance). -The needed battery power is directly dependent -on the CPU time the controller consumes. - - The Manual in German: - https://github.com/joe7575/techage/blob/master/manuals/ta4_icta_controller_DE.md - - Or the same as PDF: - https://github.com/joe7575/techage/blob/master/manuals/ta4_icta_controller_DE.pdf - -]] - --- to simplify the search for a pressed main form button (condition/action) -local lButtonKeys = {} - -for idx = 1,techage.NUM_RULES do - lButtonKeys[#lButtonKeys+1] = "cond"..idx - lButtonKeys[#lButtonKeys+1] = "actn"..idx -end - -local function buttons(s) - return "button_exit[7.4,7.5;1.8,1;cancel;Cancel]".. - "button[9.3,7.5;1.8,1;save;Save]".. - "button[11.2,7.5;1.8,1;"..s.."]" -end - -function techage.formspecError(meta) - local running = meta:get_int("state") == techage.RUNNING - local cmnd = running and "stop;Stop" or "start;Start" - local init = meta:get_string("init") - init = minetest.formspec_escape(init) - return "size[4,3]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[0,0;No Battery?]".. - "button[1,2;1.8,1;start;Start]" -end - -local function button(data) - if data then - return data.button - else - return "..." - end -end - -function techage.listing(fs_data) - local tbl = {} - - for idx = 1,techage.NUM_RULES do - tbl[#tbl+1] = idx.." ("..fs_data[idx].cycle.."s): IF "..button(fs_data[idx].cond) - tbl[#tbl+1] = " THEN "..button(fs_data[idx].actn).." after "..fs_data[idx].after.."s\n" - end - return table.concat(tbl) -end - -local function formspec_rules(fs_data) - local tbl = {"field[0,0;0,0;_type_;;main]".. - "label[0.4,0;Cycle/s:]label[2.5,0;IF cond:]label[7,0;THEN action:]label[11.5,0;after/s:]"} - - for idx = 1,techage.NUM_RULES do - local ypos = idx * 0.75 - 0.4 - tbl[#tbl+1] = "label[0,"..(0.2+ypos)..";"..idx.."]" - tbl[#tbl+1] = "field[0.7,"..(0.3+ypos)..";1.4,1;cycle"..idx..";;"..(fs_data[idx].cycle or "").."]" - tbl[#tbl+1] = "button[1.9,"..ypos..";4.9,1;cond"..idx..";"..minetest.formspec_escape(button(fs_data[idx].cond)).."]" - tbl[#tbl+1] = "button[6.8,"..ypos..";4.9,1;actn"..idx..";"..minetest.formspec_escape(button(fs_data[idx].actn)).."]" - tbl[#tbl+1] = "field[12,"..(0.3+ypos)..";1.4,1;after"..idx..";;"..(fs_data[idx].after or "").."]" - end - return table.concat(tbl) -end - -function techage.store_main_form_data(meta, fields) - local fs_data = minetest.deserialize(meta:get_string("fs_data")) - for idx = 1,techage.NUM_RULES do - fs_data[idx].cycle = fields["cycle"..idx] or "" - fs_data[idx].after = fields["after"..idx] or "0" - end - meta:set_string("fs_data", minetest.serialize(fs_data)) -end - -function techage.main_form_button_pressed(fields) - for _,key in ipairs(lButtonKeys) do - if fields[key] then - return key - end - end - return nil -end - -function techage.formspecSubMenu(meta, key) - local fs_data = minetest.deserialize(meta:get_string("fs_data")) - if key:sub(1,4) == "cond" then - local row = tonumber(key:sub(5,5)) - return techage.cond_formspec(row, fs_data[row].cond) - else - local row = tonumber(key:sub(5,5)) - return techage.actn_formspec(row, fs_data[row].actn) - end -end - -function techage.formspec_button_update(meta, fields) - local fs_data = minetest.deserialize(meta:get_string("fs_data")) - local row = tonumber(fields._row_ or 1) - if fields._col_ == "cond" then - fs_data[row].cond = techage.cond_eval_input(fs_data[row].cond, fields) - elseif fields._col_ == "actn" then - fs_data[row].actn = techage.actn_eval_input(fs_data[row].actn, fields) - end - meta:set_string("fs_data", minetest.serialize(fs_data)) -end - -function techage.cond_formspec_update(meta, fields) - local fs_data = minetest.deserialize(meta:get_string("fs_data")) - local row = tonumber(fields._row_ or 1) - fs_data[row].cond = techage.cond_eval_input(fs_data[row].cond, fields) - meta:set_string("formspec", techage.cond_formspec(row, fs_data[row].cond)) - meta:set_string("fs_data", minetest.serialize(fs_data)) -end - -function techage.actn_formspec_update(meta, fields) - local fs_data = minetest.deserialize(meta:get_string("fs_data")) - local row = tonumber(fields._row_ or 1) - fs_data[row].actn = techage.actn_eval_input(fs_data[row].actn, fields) - meta:set_string("formspec", techage.actn_formspec(row, fs_data[row].actn)) - meta:set_string("fs_data", minetest.serialize(fs_data)) -end - - -function techage.formspecRules(meta, fs_data, output) - local running = meta:get_int("state") == techage.RUNNING - local cmnd = running and "stop;Stop" or "start;Start" - local init = meta:get_string("init") - init = minetest.formspec_escape(init) - return SIZE.. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "tabheader[0,0;tab;rules,outp,notes,help;1;;true]".. - formspec_rules(fs_data).. - "label[0.2,7.0;"..output.."]".. - "field[0.3,7.8;4,1;cmnd;;]".. - "button[4.0,7.5;1.5,1;go;GO]".. - buttons(cmnd) -end - -function techage.formspecOutput(meta) - local running = meta:get_int("state") == techage.RUNNING - local cmnd = running and "stop;Stop" or "start;Start" - local output = meta:get_string("output") - output = minetest.formspec_escape(output) - return SIZE.. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "tabheader[0,0;tab;rules,outp,notes,help;2;;true]".. - "textarea[0.3,0.2;13,8.3;output;Output:;"..output.."]".. - "button[5.5,7.5;1.8,1;list;List]".. - "button[7.4,7.5;1.8,1;clear;Clear]".. - "button[9.3,7.5;1.8,1;update;Update]".. - "button[11.2,7.5;1.8,1;"..cmnd.."]" -end - -function techage.formspecNotes(meta) - local running = meta:get_int("state") == techage.RUNNING - local cmnd = running and "stop;Stop" or "start;Start" - local notes = meta:get_string("notes") or "" - if notes == "" then notes = "" end - notes = minetest.formspec_escape(notes) - return SIZE.. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "tabheader[0,0;tab;rules,outp,notes,help;3;;true]".. - "textarea[0.3,0.2;13,8.3;notes;Notepad:;"..notes.."]".. - buttons(cmnd) -end - -function techage.formspecHelp(offs) - return SIZE.. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "tabheader[0,0;tab;rules,outp,notes,help;4;;true]".. - "field[0,0;0,0;_type_;;help]".. - "label[0,"..(-offs/50)..";"..sHELP.."]".. - --"label[0.2,0;test]".. - "scrollbar[12,1;0.5,7;vertical;sb_help;"..offs.."]" -end diff --git a/techage/icta_controller/signaltower.lua b/techage/icta_controller/signaltower.lua deleted file mode 100644 index 13b0d8e..0000000 --- a/techage/icta_controller/signaltower.lua +++ /dev/null @@ -1,158 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Signal Tower - -]]-- - - -local function switch_on(pos, node, color) - local meta = minetest.get_meta(pos) - meta:set_string("state", color) - node.name = "techage:ta4_signaltower_"..color - minetest.swap_node(pos, node) -end - -local function switch_off(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("state", "off") - node.name = "techage:ta4_signaltower" - minetest.swap_node(pos, node) -end - -minetest.register_node("techage:ta4_signaltower", { - description = "TA4 Signal Tower", - tiles = { - 'techage_signaltower_top.png', - 'techage_signaltower_top.png', - 'techage_signaltower.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -5/32, -16/32, -5/32, 5/32, 16/32, 5/32}, - }, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:ta4_signaltower") - local meta = minetest.get_meta(pos) - meta:set_string("state", "off") - meta:set_string("infotext", "TA4 Signal Tower "..number) - end, - - on_rightclick = function(pos, node, clicker) - if not minetest.is_protected(pos, clicker:get_player_name()) then - switch_on(pos, node, "green") - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - light_source = 0, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - -for _,color in ipairs({"green", "amber", "red"}) do - minetest.register_node("techage:ta4_signaltower_"..color, { - description = "TA4 Signal Tower", - tiles = { - 'techage_signaltower_top.png', - 'techage_signaltower_top.png', - 'techage_signaltower_'..color..'.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -5/32, -16/32, -5/32, 5/32, 16/32, 5/32}, - }, - }, - on_rightclick = function(pos, node, clicker) - if not minetest.is_protected(pos, clicker:get_player_name()) then - switch_off(pos, node) - end - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - light_source = 10, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {crumbly=0, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), - drop = "techage:ta4_signaltower", - }) -end - -minetest.register_craft({ - output = "techage:ta4_signaltower", - recipe = { - {"dye:red", "default:copper_ingot", ""}, - {"dye:orange", "default:glass", ""}, - {"dye:green", "techage:ta4_wlanchip", ""}, - }, -}) - -techage.register_node({"techage:ta4_signaltower", - "techage:ta4_signaltower_green", - "techage:ta4_signaltower_amber", - "techage:ta4_signaltower_red"}, { - on_recv_message = function(pos, src, topic, payload) - local node = minetest.get_node(pos) - if topic == "green" then - switch_on(pos, node, "green") - elseif topic == "amber" then - switch_on(pos, node, "amber") - elseif topic == "red" then - switch_on(pos, node, "red") - elseif topic == "off" then - switch_off(pos, node) - elseif topic == "state" then - local meta = minetest.get_meta(pos) - return meta:get_string("state") - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 2 then - local color = ({"green", "amber", "red"})[payload[1]] - local node = minetest.get_node(pos) - if color then - switch_on(pos, node, color) - else - switch_off(pos, node) - end - return 0 - else - return 2 -- unknown or invalid topic - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 130 then - local meta = minetest.get_meta(pos) - local color = ({off = 0, green = 1, amber = 2, red = 3})[meta:get_string("state")] or 1 - return 0, {color} - else - return 2, "" -- unknown or invalid topic - end - end, -}) diff --git a/techage/icta_controller/submenu.lua b/techage/icta_controller/submenu.lua deleted file mode 100644 index 0e690bd..0000000 --- a/techage/icta_controller/submenu.lua +++ /dev/null @@ -1,213 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - ICTA Controller - Formspec - - A sub-menu control to generate a formspec sting for conditions and actions -]]-- - -local function index(list, x) - for idx, v in ipairs(list) do - if v == x then return idx end - end - return nil -end - --- generate the choice dependent part of the form -local function add_controls_to_table(tbl, kvDefinition, kvSelect) - local offs = 1.4 - if kvDefinition[kvSelect.choice] then - local lControls = kvDefinition[kvSelect.choice].formspec - for _,elem in ipairs(lControls) do - if elem.type == "label" then - tbl[#tbl+1] = "label[0,"..offs..";Description:\n"..elem.label.."]" - offs = offs + 0.4 - elseif elem.label and elem.label ~= "" then - tbl[#tbl+1] = "label[0,"..offs..";"..elem.label..":]" - offs = offs + 0.4 - end - if elem.type == "numbers" or elem.type == "number" or elem.type == "digits" or elem.type == "letters" - or elem.type == "ascii" then - local val = kvSelect[elem.name] or elem.default - tbl[#tbl+1] = "field[0.3,"..(offs+0.2)..";8,1;"..elem.name..";;"..val.."]" - offs = offs + 0.9 - elseif elem.type == "textlist" then - local l = elem.choices:split(",") - local val = index(l, kvSelect[elem.name]) or elem.default - tbl[#tbl+1] = "dropdown[0.0,"..(offs)..";8.5,1.4;"..elem.name..";"..elem.choices..";"..val.."]" - offs = offs + 0.9 - end - end - end - return tbl -end - -local function default_data(kvDefinition, kvSelect) - local lControls = kvDefinition[kvSelect.choice].formspec - for _,elem in ipairs(lControls) do - kvSelect[elem.name] = elem.default - end - kvSelect.button = kvDefinition[kvSelect.choice].button(kvSelect) - return kvSelect -end - --- Copy field/formspec data to the table kvSelect --- kvDefinition: submenu formspec definition --- kvSelect: form data --- fields: formspec input -local function field_to_kvSelect(kvDefinition, kvSelect, fields) - local error = false - local lControls = kvDefinition[kvSelect.choice].formspec - for _,elem in ipairs(lControls) do - if elem.type == "numbers" then - if fields[elem.name] then - if fields[elem.name]:find("^[%d ]+$") then - kvSelect[elem.name] = fields[elem.name] - else - kvSelect[elem.name] = elem.default - error = true - end - end - elseif elem.type == "number" then - if fields[elem.name] then - if fields[elem.name]:find("^[%d ]+$") then - kvSelect[elem.name] = fields[elem.name] - else - kvSelect[elem.name] = elem.default - error = true - end - end - elseif elem.type == "digits" then -- including positions - if fields[elem.name] then - if fields[elem.name]:find("^[+%%-,%d]+$") then - kvSelect[elem.name] = fields[elem.name] - else - kvSelect[elem.name] = elem.default - error = true - end - end - elseif elem.type == "letters" then - if fields[elem.name] then - if fields[elem.name]:find("^[+-]?%a+$") then - kvSelect[elem.name] = fields[elem.name] - else - kvSelect[elem.name] = elem.default - error = true - end - end - elseif elem.type == "ascii" then - if fields[elem.name] then - kvSelect[elem.name] = fields[elem.name] - end - elseif elem.type == "textlist" then - if fields[elem.name] ~= nil then - kvSelect[elem.name] = fields[elem.name] - end - end - end - -- store user input of button text - if fields._button_ then - kvSelect._button_ = fields._button_ - end - -- select button text - if error then - kvSelect.button = "invalid" - elseif kvSelect._button_ and kvSelect._button_ ~= "" then - kvSelect.button = kvSelect._button_ - else - kvSelect.button = kvDefinition[kvSelect.choice].button(kvSelect) - end - return kvSelect -end - -function techage.submenu_verify(owner, kvDefinition, kvSelect) - local error = false - local lControls = kvDefinition[kvSelect.choice].formspec - for _,elem in ipairs(lControls) do - if elem.type == "numbers" then - if not kvSelect[elem.name]:find("^[%d ]+$") then - error = true - end - if not techage.check_numbers(kvSelect[elem.name], owner) then - error = true - end - elseif elem.type == "number" then - if not kvSelect[elem.name]:find("^[%d]+$") then - error = true - end - if not techage.check_numbers(kvSelect[elem.name], owner) then - error = true - end - elseif elem.type == "digits" then -- including positions - if not kvSelect[elem.name]:find("^[+%%-,%d]+$") then - error = true - end - elseif elem.type == "letters" then - if not kvSelect[elem.name]:find("^[+-]?%a+$") then - error = true - end - elseif elem.type == "ascii" then - if kvSelect[elem.name] == "" or kvSelect[elem.name] == nil then - error = true - end - elseif elem.type == "textlist" then - if kvSelect[elem.name] == "" or kvSelect[elem.name] == nil then - error = true - end - end - end - return (error == false) -end - --- generate a formspec string from the given control definition --- row, col: numbers to identify the control --- title: Title text for the control --- lKeys: list of keywords of selected choices according to fields --- lChoice: list of possible choices for the control --- kvDefinition: definitions of the choice dependent controls --- kvSelect: data of the last selected item {choice, number, value, ...} -function techage.submenu_generate_formspec(row, col, title, lKeys, lChoice, kvDefinition, kvSelect) - if kvSelect == nil or next(kvSelect) == nil then - kvSelect = {choice = "default"} - end - local tbl = {"size[8.2,9]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0,0;0,0;_row_;;"..row.."]".. - "field[0,0;0,0;_col_;;"..col.."]"} - - local sChoice = table.concat(lChoice, ",") - local idx = index(lKeys, kvSelect.choice) or 1 - tbl[#tbl+1] = "label[0,0;"..title..":]" - tbl[#tbl+1] = "dropdown[0,0.5;8.5,1;choice;"..sChoice..";"..idx.."]" - tbl = add_controls_to_table(tbl, kvDefinition, kvSelect) - tbl[#tbl+1] = "field[0.2,8.7;4,1;_button_;Alternative button text;"..(kvSelect._button_ or "").."]" - tbl[#tbl+1] = "button[4,8.4;2,1;_cancel_;cancel]" - tbl[#tbl+1] = "button[6,8.4;2,1;_exit_;ok]" - return table.concat(tbl) -end - - --- return the selected and configured menu item based on user inputs (fields) -function techage.submenu_eval_input(kvDefinition, lKeys, lChoice, kvSelect, fields) - -- determine selected choice - if fields.choice then - -- load with default values - local idx = index(lChoice, fields.choice) or 1 - kvSelect = {choice = lKeys[idx]} - kvSelect = default_data(kvDefinition, kvSelect) - kvSelect = field_to_kvSelect(kvDefinition, kvSelect, fields) - else - -- add real data - kvSelect = field_to_kvSelect(kvDefinition, kvSelect, fields) - end - return kvSelect -end diff --git a/techage/images/chemical_reactor.png b/techage/images/chemical_reactor.png deleted file mode 100644 index 6fbc83e40cfacbf37db9f2cb585775f872767e91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137189 zcmV(&K;gfMP)fs?AOx`&2~et(RB zfsTrJHH@gtlz}-`S73O3kdCa;s<6L%e2IU4gtD=@l(E=$cY?RJzoxFfW@>$}t+bA= z)~>L-fP|NV5E9(KQ-g$&V`qA^vb%?fm7}J#m6fL|Fv3$*U7NAbjgFjxfrgNMHeF$I za&dN+vD1;0q>P)g8y|s^emA18#ILfzrK-55vBr515s8bK0zP$+k)UsFa&K^ZiKNDd zjGv94xpsAWs;jk~uE>t3$8vLjigPQXvdhcN;Ekieq@%2Pczs}Fc3E9*Y;c2@n5unz zfrXs8Y;1RpdNsD5M4+j=hoHcQbTgr>z>Rh-#KhQzZYjvf+_|DidwPJenL~-M;j6R7 zip_vd4iLyYH4kTuH_*jC4rEpi;W)54B#+Cnr6@*3ovDc_yBu)rnB!*LS#WI`=!N3G90#`A} zf?2!V$$FY&a5qJ&DKgD)&En#o=Xv!?uVmSg9p{H5e`VQ{2{blt??g|s7pz4P8VGIw!)fsYrkD-d`Du!)iw zQf$re>#f|l-fiK4fEnI;{El$LP23XTO9^~t0D4?U$m%*^t7Zhg-2q>C=c&IDW%=ED zJqG}XUanTABZjwmRWD<&m-$_<5RZGg0k&Y3>bw`5fRn2Td;;%Lu%a3O1{KhiBp)%X zB(5qO}jcP9>42MSmGoMP0if%cJvUsp3w`5EgTT*T3 zDZQP+zG2(d*!B#d$XDUfD;Z-6#3O)s{f5LK2akIpkD0WeMNrVY+77tqFuG4;yC(M-q@h%dZu`7$!wN}HM|JvunfrN_LAZQau*)NWMH@uuT0mQtveB|X zzpE+`q^GSq02a$&uk=_lKkt|WZn%6KKypECh4y9lyZScOrk>>LE)6MsPyr0eI?lmyD1O}xeYr7F`<2bzj^cEQOJnzWcDu8#p5(m@AY zxDdl7gv%`?X>`^}FF zgmBH(sGqWVi__^008H%A3|)6%UX8=+n{R^PNZbm5dHcP|Bx26?@4tP4l-9Imjt(dS2xl_^z^l)} zI$kq14?vs`x)Sv)@oA02GXOvO`W!-L7*Wy|n%W;%pNEnsE!ODO z>E-1KEV;nWetq*{>H}Z~2QZ2ql-d+2_lyWz zug#w|PgBFYd=zT9NsoD5s=_8YpkpI|ZZx1G=y7L|WVypgcAp(Fi22XgCn@fSaXs33;U zB_;p-0q-$qo7u@ccFkxWF(to6%A3nqFQ@*rLjF`oTLak%IGAb}cE|4MBMTf2Ty0JO z#$c$1(ryD_u(sQ@l`>b5*46+(cMyl;9}WjV?-s=NAojVf)-ynGndNH#I(-BFg&sx= zKEC>*6M*qNj^dHyPkax_ra*YBVWW*^D4d5I{Y~kZI|dt^s8% zXG76G)CoLng5!ZSO>0y9%+X67u5Duo{^)B6Aig?BP*K4-bvuVrBRA9(Tc1M;XpUd+ z9l-mJlMkceJ$*L*VPZuf85wclXqJTzmVkF9wne1?0+{#^GR?@c4Z+GZ6jG7_2Dnf* zmmXqL=^3IDA+yi{GXNc108n#^00N)%05u2}K+)^%i;&a)3DyAeU%4X9fZ2#87>N9Zli+8i1viP$T2RXJI3cpGwCXjUfNCI`Cq2IVwUN zWnh*7)Kn;UJ4uoQ2tN-QBmii-2w;^12Dh}n55&dxN8*8bApyt}e?`$9tyl*r2?96= z0Np`o8SDr`2cRKSf`3_-V0G>6oE6FE5cqq@033u6 zf)~=(fwFn>G7JyL0dv!VN5Zj@&(16kdKv6s@iDbgtM4t^iOW0LceC zOf2YjIwF8P1h+;1LojXX0~P^Hvq0N6veH@2JJGfi$*#2F`d+mjVdSX__LGF7SPDJ|K;RZ~%2f zDfynJi(cqV=4Kd;-!>UQ~5We2=n+Ra{th<6BgHYhF z-`^@AOZVNe-lgqIeVEj?augKXp=yKx{HW^$po+YyIA_3UlksU9l_8o&H8E?$Xl&56$1&3i19k83-i3}2g=ly<8n}n831rp08nE98u((?*y^spOC;t@UqUNu44x3Uj3(G0Cu~GUbnkygJ;YF&vFY);iKsZcMQdM=QMcF(&WZ*=AO-+C zECA;vY6V5r(%48H0!=w(7$dF*UuneHaAokpqgp;}qn);BylTHpG4h=E@o92Ms6uaCAi_sX+JI@@jFZ$n|F4MzbV+2si=Rd*Q zt@6233Wa6t+o1!7ipu#aiO_OBr< zvkAz@Df#fl96*~ppxImp?6NS-@yjseX&};vw^pAacwkpa7644kU+glosmz87G|Hab=Y-gdKn@muq{CtxHX`RRajw`r*8h`t_AG8|X&m=A*k-=ME@oe{%`y_W zNu_3cH^%KER0x5(6=O6QVRVZKW8O}Yip^rN z`0()W^_$>nE>fx0@iVX@+Nk zvGwceJ^cuG-F0sdK=?wm5kMaSB=~&)3U@vc=&PMY@rYxV&;J7KaccpT#UlJz4Ee$528vdSaCg3#6c~(-Xmtcotxof+W)$b6-@mQ^FjyrwBUHfABv{eG0jTrRbuflcR8}nm&<*|2haC|J z9P&dj2(ssz{Xw4@ys{L1A7#+#HT^U+l-)V00%8y{4*K+D09olo6HEhlHO31<0U;h< z9tfaPKzP3bSNo^{==806FQtISv^rM6vTPZE0G;cGwE1!Dy0Sqg7+tN0)F*6~o*clo z8W4&kp3}6`U^!(RA{20lW4>oJ>XwvMk=ljm1O7}3NB~0ck(NV{t`gup6u{r$imUdp zEUHyG8Wr%o`;YNf03h}O?O`DEacA`yL!j2VVZspDL-K&Z*d_Mx*r%2mp<@_b5uT`U zL?lhbfX%-CDFSxx)6TE9~@h*YlxuR$exJqpw+N+8HO6?q$#{d z0i-a50sI{hv$O$})v5w%yhG8drqzK#2u5A-AMUOHwOMR#Zx@?IQ5bL4RRD@0L;*Ny zCxCGr#V#?3G?D-kgK?}VWX;8~S`J{u6%rS7o6P41giwM0xfY{n zu@-6!WtY&}?+~g+xZ`wAmW|T@+F~Gj1qz4^GJqnd(GimV^eI`v9p_NsyCnHeBaLG4 z`N%+Yk|2Q9-&+V^WbzlwW5y2oi*7CyYXN6>twgCI*37 z!(;y4J~f9GM-N&z6mSo~%b=A2dS2v(Vd#0d@j*xjxaU?`@h7#=QWZ;}YdUI-)|j?t zC-8H9G{;atb^_Kxm8LikS1O<}Vy-{uk-jdEDquSS1mdW0{e8%Fs3_#hD83n>SllXG z)_!Zu{5giJP>sZ#SOGr`;8*%OJPu%*wyqDT`6K2$u044w9(3X>27NyiE*jq#@d+L7 z${^=TtVR%Ws{g14Q0Ib+^h5x5KhgxZ62MT(UnrVkk6UEPT__sm=Ry>p6N-pnNRLJm zSqI0yA&H_m!cTn)3cLG32m*-r@A!XEz~MOHf#|fQ3g`{YmKZyRl1JG)d@i0L^XK~{ zg`p5b=1^K1TeJxiMtZ7%<#flEL`}Mh}%4!9G)q zq0#+7Mqdp;!^pL3NFCEOO$Ko8oY=YcRm&iPhsO*8e|dx`MgqflppHWs8EXg$zA$DH z#6jxNL{M2;8A0XgvXqf)*GS_uoiql7hXZI@W)VO=C!GzcMOjcTxcfD(IlEcO#40TL zHqYY3d7N1=E-?iN3MfsltzeKF-)I0z2>d;ZWCI-G6L4e@aj3?NG<-l^7{^$Lyi|an;IUz%l0Am2zj`c?V)^V@6{wNAS zToWbaE*W&dOV$#y^h3WxnMyM5u0X34~z zyD<8|nRz&S7^mr-{rLW#N(oZff&$t%$gh#SJipEnM|c2_Smyv87H*g$H8e>SuSLRbI2amhhx#7y!rUhbf_ZM-#B zSr%})ZFm;%j(EwtYp<@=jUrxUS*GuFgR_m{kz;tw3<$VkM4=K-59<)cBMe>Q;+r-a zXNSSAa~OcbTHjg=S2Pg!H%hVugs0yJ0H-Bf?df!d`|>{h=~(OI0)Wu*P6RP$0we4VMk;$8 z#kxe=OA``?v2qv2YP6c9&`9GoCd3;E?wa`zRY1IF7T+ACPLMgVeg-OFz1VCPD(E!Z18&$R&vH zVg1)50(h&-_VyD+ebVip*3LH%U``Tvefyy`cd%M{!+rJzWz^y9AA(dIOoQVaDE-%aF zW(`U%b@(;VB+QJSG^i7DiG7Bc*_m29REGrM*iw#IfO}VH=l* z(3OrttGPy@SQyDUun%~iBpI#jlHomkVLuc1!NkR_k{i1ySF1`CIyzz#>?L>`&c$rW zOU`7xU(yy}U_{*m2-HW#s$P}wX@36Z@#8+=iC zMDQY03SGlosFg6*A}HL1uAXNnViL!48kvzp`+zHmLTEj;SGDZ@spb04?DX{rx`0zr zAP%`ZTDRX>dzFpKOuiY2i4iNJP?ht zXpp^F4$bgR7VHK+qe=;teid;bM~K z7r4^+`NbGl!b(Re@b~ul58q>f{SQ~i8Vkf>n2Uf0`)F;!Bv1wAc!@6{iT$&FSzt^A zVeq>aq=lai2G5?s26aB*6DavJxL^?MaB z_V@3-nURymZetfcNu&2ha!BwezxU_&ecz`vG^&}9)5LXKDO@evN@tVPI#+dNtxYPY zoZ1Kf%2OqhY2##K*N{878=yx1fOr56M8Luc{(631x?GBS zaTlCw!haFyexVEA-8lt-M#eCvTe?7CQP}fLb+JrG5$O?e&}PUOLau85OeqY9>U2um`|9gPyAD@*#kV&l8zxtP+IB+nZ>Po94VE_8i6F?~uRKWZ{+!I)Wz&5z=Z+@;G!CD9 zelWkjUJ%D|0&uspv2if~=AQ)rIBoe>mMXvf=-R zCrzqK(^Xxvne2p52E|x)-AL4ly@sVmhn!F*{7}$fCrk@ti$Y~ZlQQ!s@k}-z3hGXH z0zd-*REJy6Fo38?y{HIi_3z*B)4Dg7NBC6DM{)-nkM7?;K0eq##`4qCMZk0u%Hrz6&wS?2oT1mYo{6mDh#K077UmLjw%%794C|pGsvIAJI#~LAmBMOGYB8z zo6tzAE|Z@q@xm#xNDCE)Cgay&g%{@T06x@uHTc<}drJ4uzBJ3_$(^4nahEXj&nC~* zIpIf*n?m|Cwb@#YEGh}WwVj={i;I9q2d$$c2z4ZlkQEpdz^Db87P+9e4qE&BsD|0w z-#^t~jNK-t8Ne{?IXx%AU=RjQA|?WH%%#SWd2@-wfZ}4+B=+0@>lXFSr0%km-jLHM zuF@9Tw07-c7YrowdZ8^VhpelC9$5fH4b5^nX~v+>)rl7jlhY9+A6xmK01!uk0w5WP zZ(P)_xUBcC*X!NAd$-s7k@u5UrA24l=;PR7YJ9xAyR-kL`NL0t{LZCI?_B!y-QnRW z=*wiLc?g(soL&?v_Ie!p!q7<-;F0Kq(C0dYBd--g%XI=m&*88bxXfZ;lE4eYpXrje z3%QfUYtp!i#H)eA28f0(kyxeBD9hKp@gz3rl4Zi!5lMH(xOAP@3K~O9K=PAaFuD^h z!Ec-nYJ)N0F>eXEAOMZS#FFIG%xtBVKKiT0is-%J)A)<0Sd=uTJ^}{gkkG>mkOv&a zKyo__gG7_Uqf3F4;iLs?0?;90mst&1;N?g4Ghq7#>gI)+x_+u zTcpZCba+YwZqeI5%o>IsMx3Vqo$d%2j-$Zo1xO%PgI*Ag10EGpPS`9z0S9M$FV&ln}<1@twUhozh?=9@7foC=BocoB?kk z@&|A59$-5N5krSE!XjA+xq-xCgRz8nR|H+q00_0V0r(3O${MX}sB$&QpHkT%elGK8 zi&cmpp7`&(V+K&pK;$V% zt8#XSUPC>nSF|u5hdp?NVKj<>vGF*9YKWJJsYEQJP}+PGTZCOi4dyUlK9!+pon@kN&_c?J+e&g_!7 zlHk_6J{foc4fD-cD7R*6n{o$dLtmRh189KM5J&O5_BO! z7mh}eYKIsYHIBq#6j4VU$48~=l3UfOMR1ZMHB20FoPir?dCvW;U^g zBLOsXz5rH^Dmd=zKj;_e;B=Ukw>xLHhC%W+jp-f(MiBL&M8Y4?HWuI_!ZDPV4w4b! z7hsF2Bng)whmkK-{6Ssr6R?Rc9ED!4ggnW~m6t8C_`s>Ja8w4=7FHLitdxiFpigYP zB9&!APx&-xi;%=o6S5&bJD3vyanujvC`!Y8001BWNklT@;BB5Mu-@G$Z;r~&|1a9?_%)^4|DE>h|DcVIxe zZ=OMgZ|G^r^a6-f5rd-<@kfOQf*cM7yhwivZzF1I)+pBDii@ZcIQ#3G0LU;dE2}Fh zwuG>us;&6+HB0}DZ!>x)t&=8ITxDexf^pAYP91%hq%aL&e*(aKHZ3hYr>KH#D{C0^ zs*zI~mf8;Gu0j*V~BeIAmKNn`bf&J7)cxkQUsKIoas0yJ#a)5GxQl8 z2xCouSS&J4rQ&L7wJTM)R~+I6Z^D=0;al)i_>=Gl3`vbV^v$>^?Uzm}bMaYP<4=eP zrNS%MbmC5VIpJC;YKC$Gz{2`^K>+N$Dgqkk#2 z{^L-<;G=V=c@-uz8vPMTquDR6tBIB5+`>gHjqQX-xt?k$u@iOL=HE zPFlCp5fiqpPTGOeP)F_XuBYtheFPBaAhWXyK+5@V&ZP-_RWA8|15Z3cUcP+!eVWlf zZ&lbSbDsQapw?=&Fd*;QPyhOo%B#%HUoA$M@>Cp=fME;>DK?valYlBBXx&n=UV7ZD z6H?ux4;9~sI((ssj1{r%`<_pXr3zr?IX%zo!MlldXfb=S@Kx(y^|lR5=?_&^F-T1q z^KlSF{7^JgRsJAs3_@Ce64Z#qU%|);6asJ_rXjQIv$aC2eZ0FP0RAAc5j5fD`qqA{ zhfnSe2QYQ=pFjWN`3o!$4=Ts=@SqDl4k|}`|6F_c@WmI;xqPnyQ!W@WTiL@mM8K(@ zg!rY$k4xQd7hvlGPt9Btp7mxE!dtx#je5PAtJh22Ts?=aZa4S1D_`$k&iUKOm`4{Z zJt&?uNnr^005j5jdGaQTFUzxtKc8gRO6+Bc+$-J=Ah)VXiD9)tN*c^1+h|f#ZLm=Y zOS;&Wp|RXh&NS@Fz+G^mhFd}kONE&V%z{Y~h!Jp3nfgmEFQ0#V)8NCoz>R+M(MO;B z{F9xX4R#*-`m3+L`AQY3ee>+uvlq%IfHulGThHy?q2Q!X`Z)T--cIx+uz>a_Umxn+Cu1VGka8=#LE-p z5J7^GuAb5udTIldDF2;UY3Qgrsc!HiSIb{zBGMp_8UW9t)Uj>LPIz0JGQci%%H5$cJ&9@RXmO7QC;b0)MX+)4cFVdra7C(QS$AI1pii00Mtl=@YV zJROm~V#VcJAc8OSZzTZPzYy0D8x#l|4eibldo$3+_=GPA12_v4U;=Okb8#IV0a;cP zD{73%#N2C3CYkS>JjohAJ8ay!^QT)>{s0dtzrFPxb?4LCMv{hce~3BxBCs2rqZ^zE zN$Wu-U>XcckV6>DL|{Z#E)BNV(O88wg$_6Xv+ag{b?G%Z?}@%r;CNN{8%tEni=k^~VWsj9*x`(=M7woSJgA z8bpiJ6bgXPzhVG+E$%W@Ky7JFKiGv|C7phNvy%K2mTuFFiJsw4(s~MeA-XUCEVt^} z`r6uB9Vy5pN3p(;Drd#Lz0IA?A{8t3Z|>}Z7Yj?5+)Uw_%Z!1yoJ-*4?5Es9v=MpK zNLMG|F^5LN>u()bIHN9@^-%aD&e-3|kfC7PJzK1XQe)?r?Pv!WpbP!jJ$87p<(lm^ ztcX0x2;=KbPlCC^G~>qyxhY2iC6yyl8Rq1$DzO-R0I?J-b{K8P`Y0>MX@9jZtuJJ0 z{!uAK{|>^)!f~{uKesn;-V?z9wg%bQdTcPrQm(W07~Qjj0oVL|z^PtrJv>`0R$8s% zU{Fb>?wyEU=6S#zNglCQAmC7-3$(eKHYO4>_Y}1b_q*tMp@2F2&sy`4t~;QM;IoB5 zB2jr##nWqB+pc?*Uk_zck^Qd%o#Suj2p8=HcR<9o8Sz2HoLx-&2qMu@N)pTwN;#Ei}jsJ+ok>r zM$h_^1usV(EXH=Zr_3Me9;DBeHk;7wbfA-pJ7nDlLoRJw31zOQ0AEj#vptUmkF7Sg z4c84?smjJz;HX!KS>`-mUl#u0@p9mLg##8eYQGKfDEyV#%oTcR#KRC;Xb3&tQ`}57 z2_7*n><0kSm+%XJTihk@30c{19yDQU*cX>WXlQ5#!T%+uaClJJF))kz{TSf8%GC;VcA)z$ZOPh`jA0mz$4o}hf1AOJTKYyHM%Yr8-GX87^$spysE zHY2zNbh%0!F1=1H92VknS&S?tY0Xdh8H!j>|Pc&S4rIT7Y+412Z|uO%uCmRw}DnJo;yT5*%bRi zP|*2;0{$gXz*~7I;O;ay2PIt0<6}-v{jhR8uSong`cKZ>PaR>~ob6Z!}_1%Rz&Ty5t~;}I}N>| zn7%^(xWqw&vEM|vlW?spb*JFxL|7w`+9GCr1AGerhEd7|z<;OOz;14ZdEVF1^w*Q4 zUGT#0(D|UQsa<_8)c*naJ^~=f1AqwvaJo(-LjrIXBLJT@2*8cWY}~k40hfFtIsmNT zW{iL|C7`K-r{rTq8HOQE(m?!i$4mV%@kfv;aOcw9@kS%%C}-p`ambZ$=h(xMH*|)4 z(QDK;qzCMHfV<1n_E$$tv10Rbe7oT=h@p8{COk^bX1htqHDRPV-#5sQXtsDdgmZrr8}%i;>EP(_=FlvzN` z&k#nQvPPtX%2wt`k?1jBR7dV<$E%oLM+~1hZp3gSUPDhi55;Gwg;D!qVZhODLmC9W zV)p|KHrinWrwyllW{#WLA3^X14d)Et_diQ)4gv53hvxWi5H#s@P61!}vHs<}6YNHb zOf2HdCb~1q-`7rgBIf;aXEKtugQV1w)xOw$5w9<>=>#_$Tlp8}I051p}L zS~B@(lib-L&0^}jQ4$a)lWgna7H?#-&x?(Q;_!n1I`9-i9d%K=zj!kMce%0v3A5T=WB2o=Gnc& zcEmPac#=QwGPvDHaIX>+5C9@Zst@4n53fl9k9m_k_QvzkJ7s+k)GNK17j(RldF|?a znE%h5E}>WCc0X2s`aKGWuiyZ{M*rKp#(-}hEV}@%7#IQqw+(9pv>D1wlEzUtTQErY zwururWhSYkChQ6p9(ozi+%|c%Xd4hhMf{n>WI$YUIK|HCeR_*t zyJ(lfAade{dGQr?2TK=>4*1Q7e+qy)SWQ`i(`Y-xLY(z-7;9MbcN|0t3BXJ5rezrp z>v@!h6`2Q&B^IY)0stq00#2q00N9@qfRpibcE18H^`^L$3}lZ~uwZThHY;OpThx>R zZ`)Uh*_(+9i3 z8uIN;y;zS;`;$f@yEqZOFb@a-XKRC&C}8VsJlm|S6Mzry9sw@30uopmXq&mUZIT8O ze!n z4^}&20~?rc@+w_3fX^8~!thT7;Op0Kur2P>@r|5|cM~~&qFSC?QI;c5f`w-0?@uOE%42=X2K8d) zY&<<{wJNQ8<&V9OD=WXYSw6BccxeIL*r1 zh{y;mA~M0!7$by?R8`I*OEihPu5j4S$QPPq5w5@&8W^*>DC>(9K_TrYSkPDKH^?XG z^Soz9w!4A7D1~*8EX|oSBat}2Jn#AQyhrOH$bANoAvTjScd|I<^sH`XB*f~O>{x2% zcx(bKYN4F#V+tS(#>q{LQrI3c!b)z5gjr%R^DhD=bP%|zgvC>j5=X^C9W(){p=AxB zc?Xt7-~Z4$AX<<%&*RfVIq+sPv|6VI-a@Oap_s!@pgh=XBbc0s2iq6#p$K5GHWyxg z7C@zde^~EUlY9Y%LNRuA$zsUwCUhk{e=dv5JUow2CX?i3qK;hI+q-Jd27^zhtJSgf zuJdYhbCZlcxKo5l<$@75<3a@le2qpUclcy0=gfka>)CJG^Z$H9AVwh@_gn!pxojqv zG1FPdp4sVxEkJ1M*$hz3fj_pOu4hy+$9;t#$Xg-=Gblp_udjW7-t<8npTuKm0XfD< zfOBAUtHP2s1VqGX7@gAT53UHAH3L)zZnZ1}S4pL17{e&SD~^U|Sb`kyoCTcvx#j=z z*Pd8^?aHR{dhRO%mGxRSkNYaliW2~z$^LAy0>&FM#IA<*eqDc*^|&}go~UtAPmX)! zj?RVWdupc!u`vKgt^~fE4w;Y@d>XvKBS^g?Q156u?cA}TlFH4^-)wFwJRih}K9XCX zl%Hna-SG9J-6Lk+bXDDsHX5OU=W6<`M-3|vhn8VK@+0Tj$5XShh$Ke)5-6IhTt zm#vZ(nL)+ z90`CN1ycdvFa+Ne1s|6}VsiqQloNZy-pwlWWO8$+?odn5SC{?x*Hs`isbwLX%bK}# z>^2o^{<^ZRzPbfwr_;!7WwTG6!{KT*TCG;zu{KR4~t= zwt21{fkpx~bjhDFoEczCa!$yc>soeX2!tqB6cIZ+nmM5#CQcl2$2zh7;lf`l9xuiX z;(j>y=gJ61PogA4oyUF#nTQrM!v6lVXKE#c8VChk?^+{Y3qPT)W^#ko8m`G5_V^l` zZ;}QcU+m(Sg}(4OH5-5+DWfwloqe*kmCL5nod!DGtfbRBJ89IirrCM*?p@-^hXC&6 z27hs^m3L4DfFN#lOb%B7kgEFf;}3?x_ZL7tn+1JYNL!-;v`pf~(XUS0IwtF5ll{K* zc&FdcV>Lu$!A~_Wf{Q`KE*WTJ)HFa@0T3f6)Y-+R8o+$RZym2A`j(e3# zuh{SDvmih}l#w`?dEV;y{V`ZNJ3c->6P~)q@8AFRcr>c|J8^`51p(aIdSbjkI~y@! zk>GVlqY>^Op+kM$D^~Q68{7Xc{B5WahR`MIW|}}PZ8G>a8eTqv08wK22KwJqDWDSE6?I_@z z!DY>>@x7X+xg>W0)WW7D2dw>HF?GJ!VU_Q?N$%$1oRv%eQY?uaiGV}dJ?ZlDAvdUe z7WV@8{}hMdw{N);GUZ-1lf=L<5cCI|raf6r1 zqOJ z8#!$Hi(ueHl9Fi;BZ2`^JdeCU)FK;H0YIS%1R|p19O8!t%@TE^2G*c(8aS*$|DW5_~tUFd04XF4*P;x?H zu)rZ6|MT-l3i!k4^{ziAJ0c{m{Cf=``g*VWI}EaE6A^ga*}))KKXfD?WD!IIr!*iE z&@RCXlr0!Bp<5KG8ks>IN@%cG#~6zyfCtQ6pb5IDaexoZG4i@3O|v61XV|!n=;3}1 zf@nv;&Z(E3a#*j|Q7@z7C^xp4!64IJGBM$QsOj9Ii(T_1cQ!4+YuK71VAZj z7>LgW(>?v_PTJ?jz22pq!`gA9gTb)*RQ&gc;b0Lg03Opd87f^$nP?QGOSp3latC5; z5M}T>8Z|cCR5n+m+(o!W;%p7v3306&FSuk-tJ#rohudw*3Uv<4Ag+9Ph!;GZdRX^M zcr7`SEfBk831L_udpP1CRT^@d%WG-6=BAo+*=}>GT-fL5=j(0e1VDaQp`>N1O`;_) z^NK9B6-I5PWl9UDvFHhiYu#(d9>FxlDxxP&aSR@h?aZSZqfu zh#_LW%;3r7r#Y$oj!Pj&-wS}x9yn(jeJe3}TQ%UZ{doOQc8Iw0la10$OlP;t))+MrO+}p;7!B!^84QuGh+C~? z8+kV7*{r#(SlP7J!glj$)Nr+yZ%Lz@*IK{~&0j+K@(i~%t);bGwB{Edep!dq0lcS& zL=Ole)KUW3iVE7CdZ}E8{*@4o(IJw5qb9wuGASD_Im<>9c9S+7a7X`Z=6cB$z-#3~ zqzsb3In7w&DFlGAA3sjZKSf))|eAZoQ*tCiR6JRz)U3o0Fp zmd8f{FU?*oer==SOX%ItKqQOSYT3@enLEFpHnKB}ZvwSsjCP}SNgEMGTzJQIY+Ot{ zO=L`*FvuRsFkUInMt~NuM%IROcGGArLX~E{buae9kd+pxLTIF1#F8WJRk)Z6^=7_7 zK0>}qpXWW}e`L44YXIz-v4JS!r{_KInddymvZ^9@Rj=;ZRZqA>)c{FAw!f`bafO<@ zUI&jI4+p%($}20CJDsZVhXP9{VhrS=R8M~EsV=kg5D zs$3(HsIZVb6x4Y@hN4Qjn{l>ES1YBhC43jS+s02__AYxK^-i<=9(j0x!m4izgB_1# zcIq4lR&5;PY(3b6bWnf2eN!z6FmuWqd&+UsDg8L7CMhIs6g-?k09Deam=I~h+24Ob zf9u9k)7^agV}EZBSrx}6Ndn+K`Uy8_{yK7NLH-T0#tQH=!F7_=z{MA{UYl31fX ztkrUlH~L9Rf$#Or-a!E1@}LWTfC9X{G6G<30ANhUfK))40v!NI-<$m3V*;S+f^)$= zXE8(s`vDBQB0%KA=(c*ra||G0VV6+qc2O?@U4uljppr()o>Kx`C8y!w-7EMOQ9Fkk z2)NK%I8%)XUbyCLMWa!aS!b*?)^MCiq;6@Ks~YO8SGO(Cqu}A$!l@`8FMU?vdey=; zC?ssqL)*6ExL)tr77KG{y{=r?79BVyonogM8eru?4_M|v4s^fL5s}ICoDt}ZnXZZY z+jQOL=H^@8iyH+{Dd0U}j@CnQg%L&2<%-_5sE0?m0*6fjuhy)I74eZIe)aaS?SH)K zDIkV?0!#qlnK9twUJ0hSaaa+QU>O6(Olg600-(~si~z`3t;hFw?yL>_aqa{cJrpI! zVHCh$F2U!3%6S&e2FGd`p+UnMM38);p#ID{>NMt~C4z|0RlE@`Q3}D_e4`@Vl}b^C zWTfFtIuYm7RHB~Lw5sp>wr1I$<&islXiz_vUx**js!QQz1qOh&Z<9*Tvn|WAC6&yp zTk(#>Hq<+&b!wUBK@NWw{1-t*I{*M607*naRMnI+&;^^}A^`rSlp9g-6YpydJjx^> zt=6u<$N1L2|NBc?@^6i<3nqZ{fk`N5iymt_a%%0i@+WR82clb3l1Rtm=H`Z2ZWMiD zH+!V=Ub&y>8)-szdtLBK55SdQX+q45TJj|T9&#F{W14CbP~7RV8p7-=;L2B>zVGIq zN)qAI&3>53nk-TIuK*TK>Nb(KFdUH7WVBp#ZT61f9up6z=gdR2Z<@bF}><7lAH2uEv274CrvO~(b-^pY1mNy6ZI**3Sj_`|-kXP33K&cT?wsj@|K=(8 z!fV)S0=~Ad=xQ6>&xbZpmpa4Z;#>kY}g7R7$`DVH)|feBWcaowibx#Hs+N z3ak=5$fK|8R+*BASHNJI0OG1#*5h&8%GxNv`|G;ik$G5ZU|Lx9Usb?`O!an@nP`~H;d?Z z(kWl?^JO&WRns1eEEvRCkbQ^n2jqCg2SF^)Wi3B$@uLjl;){!Nfn&MMg#waXXzRMI zret%AdqSNUBjn!H!9id34&B3JSE*jprLWbcj9&nSH&63eE1##;M_jYO@UMZLkxuU8pCqyYAOK=~+kujij z!9dWC#WKonx;~hg!-8Y(6!PS;u}>$2sW3XPF%8b6KI!hvWgd>|J13wk*7iYke-x zaiOIHLjjQX2!W1fJ3O6AgyAtNZnt~brMcA=SC~Qm#CF|Qnb*x`9w%-^0Vs=-7|@|s z#eEk5SW(7AgY@FN#k6Q_(=NN+?YepVQWav%cicfLqI`18hm*a22?j2E1d!Gk zmf+oC0A*c+G$FkjJfwh1-rpYs$~<)7kNrs!Y*Z|#TEh42nF>=Htk`?lFTufGIq7{D zpnvBCzzHW@h%`dug=q9Qg-ff2@K|{DQuI>z;)U_6iG-#ly+l$=L-Xy*y)NX#H6t^B{N%!gP~l@J-tWdjl)Nc`mO_Em zP+_5SsT5AqX^!+rU>cRz+_i<*!Qnr7r9GWUiP*xdKUnQA>AAVP$?e; z&$6g^82iQJ*|{uUSbUrXeY!sPSl6@JYzACraSahH2mUZK#{4d(0!y+r%5JmLG`4AV zHM-mFc7V<{VKeC6X&XPQ7xHSMiQ26YT`)`VUw#bsYbAg*(7Ii22+*cOR(1!d9O6`b zwD=Y6d~>_PfBW;miM{jcg*d-noJt7T%V6h5Je>q3m;f%TE*Jpr1_18%0nD5Qa99D= zG)!*LgqSi9c(Av;^7uAta6e4$`=R=auK>V4e)6?&c0c4|km~hbyn3(#^#3^q3|}0J zM9}1pO(jL~lIe6Rb^ZSJ+0^XpY>Es5x)e?lS~7j(#(!8lquwUcD-3tD-Ibs$iv$a) zQdLxn!g^vG$M%#J$xJgO8?R(G6A8}-d$o*FWEtXgT@->6V_1q*)l!_TWJeVWNL0d- zFRZ-?7m?EKh1DO>3;w`Lz2`slea|;Dwi7@~+ew_v*ud4pd(QWL?>Q&3CjdsZ1OzTB zaW^4Rd7hEEn{@Cayoac2*3w-~0jN>%(lJBPh#b$q)SDA2&Mwkx#Rcqdi1DQLd9VGZ7^Ft_;u-$ z-#l~rQy$JKe}Z&l5Bv(#gT{q7dTRPCU;jr$Km7Qkp`p)ze(o2?j{Ro%_|VY%LnnrY zJ_(Vz2yhEW_oC!51pR~jIbGt{jfA3(1^~lR(i#@_64X1b>&0BNQc(#Xe(1WU15GPQ z0mLh58GNf&25}(KDjVd^u)v@d!z)St3|tczxFMq(#(b-;RIjP*Iy1B&f;=(!Q}tYz zF*9!yna%u0-ldAs9V;a&GaXi+#5Xqs03ZDJtIz)Qqo;rm|Ni>b6j_antITdsx$$+PhL5F`pT6LPQLg4@bE||3h+Q4Kx8Q1i;hJjcxIpt z6FA7*Jm8A}J49P8kw_50u9hZ%wOCE}wss=trT!vc4jPw`tIp%w|`lcf^PRjH#Nu&r_S3M)>Xi6Q zCr@jSdjP=_3 zU#RY0bRRC$H@bCIjzVS+uY!SJ?@m|A_Y(U_kljhR{?|5h`tJk2{>kyMa`>)5$e|hTEhwq&` zaqQ&pJ{}(a{M5N~BjK^JkrAvs7a5 zu14Ch2#Jc^;V}UKkps$xayUVy!IVjhZJye z(2Ovu6tF)B9G&n_LIME$La>@v#)fi_)Vu(%tR65*cR3jkD#J_~0}Vu`r~CXe)9P;0 zr_dXY(huEakIuPwxew=j*P%$|5dj<)MmcJn^IucxuAPdBj z1k^bWLa(L~!7e|+Z*6U@h6hnQfaW+(QrF6+#=x7@^it6<@vdc=47b!eL{}qL+_tdx zu%rwnR;*Sjg#eN;R-u1S9Unk75>5fQxY$#`1394D20WmE6M+IMBX0jb;FdqF zOzGb9zG(q}UG;|Yuz#>JDopknw-j=3>Sp624{?^+9d5?Q$Gqi76d^biiZ}_aLd+O>yP9U!JgrNDOz_40uU2z3O=k|MSIC*E zeUzkadrt&c@86e(>Wxb*tQUtuwtw_a zBYR*F&%q{3li8lH%a7gaj&q@Wt(^0C4G_%E1>$%_0;6Nx?}P4f!2trp3BD7OdjO~< z9HNEwa5v%95NxS`xWJsrhlFO89N>qHPuCr*6iYg$V^nK|&NR$e72p}hv_jWiKiAEYmxk@6_6JcuBeYBB|+y+5TgyA++XZE-G=9~Y|- zNEu;ESjZmNnwouD%VW*TK3R&snO%Jk$uZGJ$S3s(StDP zMHd8iAb2DIL)>ci;2Q^i5dt{I{lIV{3;+>;HN~K2uB}zN5`WWJYd96hF`T4%{knq( z5U82uQmJN|Mx|_-rdf%ZF%db_C{f`ESxf{EkQD_#rhry)yG+R|L;G|imZn!>X`!>R z(II+JHlPK7;wf87obV%__k7xX**TgPRW*uyo)UYue7JHq<=P7!RmLJdZvrSA(PtiT z8|GiZM)b4H9&$b&VoOn8h5;A}ARS_vR%VGa1eT;QWr?&fBG+H;%WP1w1F}7#YO(qF z#&#3~TJTCrBK%B8ZzRIW4_aEnDr`AA){ zDzUgs!6S@#;!*H?TF+!41cil8r^&1j+Lnqp0hCJt6EF7Nyt|URl45ZHS+iZ61p;`& z14WKubftNh#R2DCYN5RC()A66v&E7x1tAaq2mt>fmV7Qk>fQ8`axE4z^YUV4o@!p) zn%76Afjd^DOY})e7Fd6=PcK$o4T@*G%xB`LzIg)*xbEkGeF}K>NI9UKgec2TzXFOO znjx6uqPYB3-Q!k$>Q)>6U>-%=HP1HV*|t0np?V|RP=>DH%Qv}tYB@O|nGH_SI|QWn z#^kNZz>>|MM*%RbX>#la?8dpxGByqZxfa1I!c_-CtwRYk*Ge^zCSr#;y9TX;+SUGc zotlSWYg*M>#jGHrf=K{ZvTE{Gk|l<^z+Z8D8~W#?S1cMjoiW{|0u~$dg--Kn+g{1r zPpM&$zE0=Y(7?MaPGN0;D{k!b^o5Z*aV*l8O$hD(PwA=*jB!y@@TH0%o-vLIB!?o7x-x)=Nd^`k-&vKxvqxmYxdtc@5FjH|pedv!HcKmvyI8FacrUf|c; zXU*n=6ZG9AlT7T;M`z*P-A9jpe&!Y-w?CExdZ*$po&)wg$vg^(?i_dyNcfTbZS#d< z+hpQJYsy^PB(kd^6rJWlm&av?Jnp~bL9kTsvbgL3+5PwrP8j#X=ZV>0bvIdTV)^s* zt4{zh$rTV1J_xtSt z0^G{|lK{l~9OD#t@e#+2FnOIH#U!sMtCm4h2M?%r2}Sre%9dTNLcq;|{#m*Kc&+Q} z)r@Tbe|oN>*Nj}wwym56I#<&xNMD7(L!-vZM0)yk8V8Y}%)EPdsC{%2X%9k~0jL}S z2a~1=WyWK|?eW}WRnbu5WTqBP1~kf(3XMq-do(Co3}3^{58u!fO=NH>Ha0T43gR|= z77D9bWs=_s;j`(_|MKm>-vfZJ-o1PO%O1Absv={884rg$@x{XG;zAlQ99<}+GKJMq zz%J7*OlcxHbwoYaFQ3f6Jb5#Zp09g*Xfgcc(UV~U&^d;2azF>b`}Z#@AVk~Miwc-` z8nW`k!(IiXp}0qH&~NEAt;*YOY;NMFyA8*qYttpmwe~8V5k(J?USQpodR#NRpDjDe z=)k<(Q%^Uu#8AHMU848&lN4}iX^PJNkUrpWDmjj)e$<5kp?S(Sbc^saTE;ADA?lq` zE>{6ayqlLos zD1bLTx{!mIn@)oOF5uRH44w`D3(~hHnxMXnUKbBbtWdIDlWC z1MmY?aCa!_*>LYxFjv6Tn`ZML=qL9b-i>QC8n`vDPIhtdj7+=GrK`l3Hg*ZyIQz1G z-eQx?4n5lF!dZ91HD!%X^2py`c8M%4Z+Zdzlu@T@bqbG}$FF0yG`h1O-qrv}9Zm13 z!vJbr9McSk+WqbJwRYQ#;P@tnNQpALNfwns!c<1%cQlp41ksFwD#{TPlu%K{#}Y%e z68sD&31m|cCAc_(P;&K)$fBf5LD3uts+trPRE=i&6cGq^_q9HJc;m*s7eBmz#TN$u zvZsAM6dxKn?R4Vt4*cpY6w;Z(Xkj`tnwr3V2powbAP(s61c)F2*gWDQh+eN`zPSrL z-g=UE6_AewpH)Do9}pW-^XC9Oe-6mov1laDse;LxW2V{s+xOr7={0pEG#~(P0D>Ew zw{7%@!|#m^6hKr)dc`m3Lbp|NED+t5q8Gw<*NgLlT=Jh~H^p?^it9c6AOe5F{SfDr z&$<7xG?hrusSMr}fght)wjlO`%o&*J0b}scbp+8Uw~#%(tXs&VWueN|bS!OwIb8?t zYG{nCS0*6aJ3WPvJ2Dg=8Va@BgHcTRuM|bijNt@|=>$|&h$@OI0fHisB!GTF3P>Y( zsz3rLi7FEzQmT=W2!JK~H4*s=vMW9%;0K|DhZK+i=By@!q--|J)Br|SQ4NT{lL){U zv@R1*WBv*X_>R_P{&zndPw-i)5%^wQ>tMeacH&H@(i3>+CWRKU=~OCrK$XFMvw3oa zR&{7e{F1z`u?HK2@%*i4JDwbH$ISt6pXmp@O}j3z8zJ?vJ0Z?!x~CfpiV&Q`!__+& zfJyx}HZTN(#?f!bDy~F!ag7qW7UBf}D8B%S1UfhB^bzq$pLDgd>jvAC%dSRx-#LRU z#C|6M#K%Q{3$s5w zaIuVvetg_IM(G3k){(p#)FF7ocx<5)53j^K@pk(pa$?FjgU1jtQI5t2gQ_n!C_o5R zBo$F&BJ&GH0+P??`IP&rOlOb#+oH@_)M*#Hz9K$xT{0a5ZxOzew6pbeTbyy?@j z!M>QOXzc1-KoTWc=nFt>{?FgteXUT1eCzIO{WYIFh5REvGBVUj48_-mIt%HEg@uKQ ziRm2hH-kMpz#oX<&df|^_-%gWXl0+|Z};RIJ~Dz%#Pg6A&d=jPbT0?=Dj<{~=K=ii zIiRC}JPC9Z@Bje3vx6?!uODo8w}v`P^cvjKYpb-iMU*uf8{Fm)c&u~tOzvMu-mi@k zLc7IdGXdJ*>~i;4Vwo~aXA85FKyJJAohfNZLOq*o|M>scl{7I3qZ`(Yc+co z62LU%Qm2app-?z9aQE6^bWnyU3krop?eN1iHWXr_rUem4piW|as?^8&2TV~6NHJg! zvNljVQ4#}L2*I*?RTX?fOvoycuq+3aEIuTk5YRyMnB)%)T*+qr1HYF<34>H_#SnZz-c_z0auFLqARRvdd|)7Y4pPR-wK zKmmXcc>cH1^=x&F47WIuXz1E-{0qrYu7UfM`QBQ@le{-+#WGoel^ja(dEH4Ox5#yv zE&&c3o}!sgL=mJef}8F>y{CL(ncGSD^`);bc}cwFJSX2cP`xSw2)tG8F&=$+1fH6; zmd2MXP`|?#qQ`?R)EfA_^~D!0gF@}PUOvWOhlefT&(5TmmeQ+Z_Gt&yBt8<3wxj(f zXcbX6IACfDgX%z%BvoPI81SdeDFGJnhx?hY&(B2Dyexed2>MJ(6M{0Z=*wziR_>4Z zAPj@TWrG1N+jm*OAr{E_#6Up4ECw(4!JDQG!sio$!JyRV6SIOpD+!WsLR1A|H>&ku;`@@R6 zyTxyIX{E%`3AG?%d+gr6CkMRKI|n3pKn~!Se}*FD;D2VM?2hsj1ePMggB9`M2TNIP zURRO!&7WaE$b5#aI_I=)_Tt148ap86r+-zQuKJf~2OROIj1=(NqY(uh1rR&(+n>1Y9smF!07*naRKI~cEBkD+)uO_}wbdN@X`+`a!qh?e<1gn+mdohB`I&G2 z{ygwO6fW2dN1j6RwcyOUSfq{3A(4EC9#g=3y#M;%jbRhv-|mefIfN0)+9FoM1rWP^ zo&oX{aJEv+6{d@usDCW+Yiwe;#We7s3z7&WF!ERL;z7&7m*d9WcSprae|G21W#FO-cvLp3Rt3|Z5{AOL+c zC8DdAN{E_COh}F;xp|ocP6$`vuR+{QT_;u$_&R_V2BD)H8l@HuR9%@sG7Vyh$WE@KVYqYiO5qUXaKywP<4 zV5L~WyKDQ6Vu3YY0e&-p<56V>0fb-+>@_wU;_(6$@#=B6-T?d#>IYx0cA+fZEaooy z@B_RIwPZXobuk8tCqs>D>>3bJcMVw$rIfKtgTP1=Z4J0}QKHL#6<8n$ZD%W0xH8tR&=%jnV|Q4qtt8g_xp{(&@Ae%h&Ijjk5U#xz)c&2~2AGtN4jq@e8cH^?{NFqB!&*A3l4ySEo z&o^Eua}VNjXP}>hsEuEixk{Fs!xi;qe(iJXrC4e9>#u`_W};c^zq$w`b4>tn9}iiI zcsF;mUYTJ40)jI$NA)6}Q6F`?$8{_|@QI=a`gaWZ-FrdX|8ibBN7w8P^n5)#N5w<<&^a6X_i++sd+F@fCse={2H?uum60l#h2X(KGy`xQ zmxS{Y1PMIF5ZtSlt_{zjcRr0&!At@FxpR8TK*Y3O{Q`TQdsCUx%=D7=z5@ zS~y$_A_a3CSuTJgNo)b1+=Q5;#(yifcr0i9G5N&r&IJ-LzKmAfVmIu=pYGhdGiV_k zokDpyY+=3k@Y3cH3&KS_?}JE;hk)=4-e)V|-MIbluXaVOJ-`nTz2on@cmZ}lly%>f z$F9KJv_vv+mX{qBzJnxLm>I^im*2B~K#0NbIe<7A{Ncl2SQT98uLFFAeii||{p#k; z_RTgH@@sQz>(>F0XT2(OF+O3Q!zZ`4HsXR+9kPorQM7G19F z$xwVaXldmLUTVDKk9rroT6nkLOyy|v9ZqFdico;m`QZyz8BlK=ck#{$Yl~rHas>b{ zold80LpG97n_|kQjmPahQwjFmn5=~m|3accNYz%8iI_yf&`(0TM<_^PGG!EJjspSs5D}o0=&W@Lup!gzrzRC!d={GXN_EZ1tY*=U4_f-N%M( zoR*ru&djUVOXonx8H>Hx8@o|LhyRm}+Q%C6@?w95Ct#- z@a+J=s0fK{@=Mik?!@u6AwvaxvshcIVcqlbuP5kHy#o4X{E*;^$jpDmTV;`x)W|smM#;gy2rg&68#=r~Vw%+|icfSrYnVT-m zPGzU2CbMIS#O!R^9Z%`->MDN~_DHhfJsEscV5X^KXueFbU($%V|0 zItoY^kz^v-zNh$5E%-L56!EDdW%GgJK(wWnqS>)kFN8pBnD&);!dDz4o}|I@vS(=~ zC4LA+iy_MfRiIkY4O>f894{!W5G3CGzCg~Ud2`Mxc;`qx5cBq zHM*uBaw}_ePG{!Uk%>R(C9@aC3x_;=gsX?>$=*8rxyiY0ZHZ+89WHZGX%h*gC|sh2 z0iyWf7?yv>tT6}l4LfJK!vPIG?Z;4BLQow;RAD;;*p8GL>;JX*-iQ1W`qp0ez?33oDwBQ7}dGQGgI6@K^K)29qT zzNrQQoGbKm*!5T}UOao!Z`@wLJ-_yB{x-T+KgR_E8)qeyzKxS@=Fz^5vrB9wY6*8z z;G|0J*7o@ZvvXhGSy{wfEmANEkWPUL?y_ zYh}aYBogsPIN-=KY@FDE$PvbcRua2nEweQQk-4dsQYg)hXnoNOgCV-vi_ojR$ZzNm z>2KKcJnu+$vaLW$ER8ITkI#9|^FAL8!U@x2hY?BlK25(S^u;7OVLUp9$txh!s}WCbq6G}LU?wIo}yOw;oWTi2SZzNC0gbL(9bk)N(qWXG%+ z8t_;N^(G>`gyDebU?TKDHQc~Rr^5tAa)7Ak`JN*giUjS1HUr8@ozE3fq?ii*IKsJIDIJ(Ha%~aS^td`b!L@)Owy}I+1 zSEhdx0}$8)>(_=Q8WmT1FUA$_9z%Hd_NG^Y{a#Z2HJrxA8|oT9dP$2<1Ohki(Ln8& zh!5}G+aLgLQY+FQGT^g004WjpXzqgJMIj;$xGCyU=aV^ZO7P2#jXgw-7c{Cm;%UJ| zffK4oZ1d{*2?LM@2~VQVgq{{l>1pCWkVaq}&^uVE`#hI@0K5%4{Wj}0>vqg~Gcgtb z6p(BS1&(R5KeyBTB4ua(d7ZJoE*ku(o|*xyF1I z!0)_P%%#$))N-Lx2`hy#?^0I8P|``uRy}JuS+IT2uWLJxfY^fJG`uq*+Yn|W(2dMW#i)B`Xxk3n-hgg43?R!;m1J5`9aGV~x@oC?Q(MZz z>Qd*t6Hv?t>}m~JmlH~$LXGif;OmxBQ9Mm^d_9xOtX69@Uj*zY28#fSuVVl{g#^>S zRtDf(A;IV4{Zh9}le(<^f#vYXYkGRy_XvAeOnj}Y z*7i}4*IWGh1PsWD=(AZt>W2*YjQ1GM8Spv+j5YW&&O?h;xgU>)IeYXg#h{lbPrh#R z*kCc-y3Ht};p(IIeAcxXrT(G!B^#_{H8kA>k*SHLK4J{jtiy#o;pQQv_b|$^J%9^{j#_fLP(i(L-doHtr&g;+=xVjN-;+jaZ&0m2twOoS zZ7HXC6#xVs9&rVkFd@%w<^lgN27EjN;O?v*`kDa=fTAG!yAKMYXMO395CV`Vzx**8 z@f2ZVw>Ce}eBq0cnCQ<1vJowl=){Xo2&WfNUVfZ>HR*I{%>+RU7>ouyc%3fAyDz?K zvvC=)i(!)NliOk8?hNQMiWSL-_v7ph$@$zZ$M%Mj-~CzD;13@(M*R?1|1VI8_l2lx zfyLm`E0SRF-$8d=EA2zOR##vmbD09fvQRK3CE>csgf8igYzDIDII80y_EIcY)>Wb} zsjv#0yCqkYFl@pvsJbS>3^i};ipp)UaD)Iwzjv9c>NQ# zcoO`2yfp<_?DdX%>C+8ff49-&g+04x0)UTadB8J~h`td6KEBC-pB{gDc{$Gm?(NYr z$fl^e+5C7q8@|aSknZKl$=A<+91;CRkr-+n(Ij@T->Cg9?&8*=vBMFUY{!%rwI?GI zWwGCcp~~`oaRD20y^VrWjI;|S4j_q5Nu^1E39n)^)P(&Fg^Hj|BFXp+keGBZn5TK7 z{^6|J|3-V%VcdeU@bmY#=7$`^AsCQKP60lk@|=2&)^jT>#aup-&8+6qg@jUZ1K=Ye zL+Q+90p1e`(XJ$wU~rn(#ar6$3F{gN%%W$WTexa={9-l4EG$vhMls5HcD%oCzd< zOSN6tT^e6QV?@eim#P5Y`Z^smmZ`+HS}Oeq0AvqL=WzmnZ{Grdo8xiq!NI|2gunOi z|J>bqGktS4y=t9`(%7phbvaFGeMOJ3MvW*vDzv6{lOyVx+SuL}=| zvmyCsXTJx)FU46%%z!ipAqF7N#pZ2tF$0Qv)aeu2-m~}o`Dj8*!o>`K8s^{OmHgaUYkN&IKh|6AN08rQZ82#T8Og`YXAd_d?MG6ZYqRPxN$1HX=1IhD%f z7E|k))Jj%Kx{7%6f-Y?HA^^HD;w>n&c7k3Y zL2kzZ4nM7i76h(pjEU_fQOy}6~^JyEjcs%ZsFX>XF5u(51N-DjaK|GaNblp@oyWG$l4O#Nw6BHZP z!dl8G4ab*YN}JGC$EznYX}DSsZo#otJxp4X?nto9YGv6(peBc~3!ZLD71LLh0H)Rq z^NZ=w(@fL$OyG+0FTkOtY60mgG`&)=>vU2AR?W%|Kxrr@g`Q>*=ssk+xVo5G<3Vxd zYBiSK_4TzXM}ceA8s*lj`*68CcV7JE^_`~xAZ4RPJs@q%{OvpZ;N8EEhr`cqmulVG z&M$kpX=^%dwX7?IfFQk7YJ%SuD|}i#u^9?3c)LZ&qjgXW%ls7AzB`E-@J1RY-ct+I+|r`48{&I;kg@$2=1o!W+?I9Rk)>=i3p_^Y8ps zkQ*s5F0By6$7Pk?_kIa*O zu~U!r8=uvW2E5#ipB->L>tS5X|39|Q?zN5d3gdZa-WiyA=Swq@W(EnZL?bVjKh(r* z2utF@l7;pn(_AzOp-{CVtV3#TvkM9>CPY-ZNP-Amy1nRyFLGfp#P`|T?R{bYll~1o z&zX_!lvP4-WJmeXFV8v8d(L^!s*|6a46kqsc<~@Ja&YkdXNTOSTCdjIy=Jpj-|qOX z>!&1tLicfppvL6%?M-=CphdgJ(66U z(rC7&4MnFGwyKOAUuoFg<*BM2w3KZXmcF~yMMAN2^VKcD$LlhAWA%puz-JT!4i5I- zP$d51&a*pT{1l#@)i>6Nz_Tg`VQf+1DNuci+0PNh;6L!7)QAA&aVSLL>Ah-m)Ia%a z0br?s=arBP1;njI?=Ay)va-Pd@Z{+y0In49OWpvsfA`(j7#YO^6Ol*m zDL-+8*ZPd6VK};vbHHD8!DSAJD-$qvd8rh42|)BBT&jdz2Cx_l{`xnVSw1;=`UCJo zoSiIr696gM9P22SV@xW~dBe^GlX`^;LI4R+b}d+l0y^MO7W^t>Uc|%UdR*+uTZ|c0 zc$gwtq~EFt){_ES{&GHHL@f}{em5@mO%asiV#Qujdl`RoY4)iI!R1e`9IPI{`s@(R z&qrI^7~BXuVXc|CO7|NZAthl$!-|K)*zb`A4Fsu?=lgL_c|)PKTDnD8T9##7x#!uj z)YD3vsIU{VD_$N11ftY>A{V~d54i6@^-|vwwk_k%Ml;I-gS-X>Y+>uV9R<)eO{0)s zC5I8HT4+;X#yy6@(R3p+)lllb@8qbrkT&{uFzh9XM&e4A*`VMrJDpD2-b7^)1ft4) z^a!QKo8JPyt0jPc2Y_$izW#9Q`Cid=cJOR(@4?57`dL^DXKFTUw#bI)0B}~woT}9n z=^qwJjWV7YxIv$3=oZtb2*=Lo{@pKE4XNc!$mKiASIsb`0;1}BaT3h{k_%aN!<35* zF91Y04Byyr{qvJ+r>Ap_C1WsZIXE4F!odKD4X~eQ01rW*8(>}!i%#ZHMQ9?^#T$9X ze4)d#e1>Bz2j?+^JzjDq`7b6FG%}(^vdL1%lDa6EEIiGGO%aRagwJ^jw>@5zlcJX= zP51#50_j7S{hO@^-7QpkyW5pCaecR^lrQwQD~2kuZF++xaiJ%=>BmMArg}iUk@J

V@lLyNwWN2qo)hQFihJPXh@B$YQ2-d@e)i@nwIYh zN9g2(EwQog#$-4=*=w5yeM2G6B0Uv`knTo{qJHGXrtpX4rh~pnluJTP*=KI%{iu=Z z4P0u2KC|6ja`WUecFzGsA#MfW%a^Y|{P^Gf_b(0~J$e7n-M!uWVGT`<&3o#eI_nhE zc@a;f0J2#+o8}|sV>Zv6I*x-+%sN^&%4fcbSlxeIDB#_4Q`i2*CHX4_Bmke3IpB3% zv~W^{;PV{t+QpuRi({A)!2Nev=J@%Y>yMwZ02Tu&#~94J4IKnd{M6+3Vz4AMF|#+A zASMGq;*N!J!l8OlMBp(p!wDyQ%Sq`uj!!Q_@S=F|);!{K2^&+KbaUN>@jWh0G`%9e z1Ilr6TMmDMdsdmjKYubCf2BBr#(DG65xNZ4x9jWM?Ox*cbX!-XeP$FVsuR-t+|Oc4 zy*ynvg1%GlC>6jlcw`f#ou+6M6?Uw8oobIzm3~XNhq)(hMG0Z7nG`YYq*F^|9E&)% z{W#0}fi%1%RXRo2i2N>UYYm?)2mxrCNn1$tG&>Sb#f~)@gdq~eUsnR3i19|e!g zO2~exfF*$Y=lxih6>t@RKXJk50G0>Q7XaSnW0*63oZh(c$9s6+2UyEP{$q}g*dj} zjpd|R*@!c5MEV6s?RimvDfjDfSsDxW{iG#!9v7J;RH%T8&aS3Y0mzUnq!@cR?4Iu6tRO*}~R*;mxIG6sCaMh?0&3=^|iJ7tkI!ArkXkCR5feW zEYC;jG|Hnq^C=$ZxyYl;(vsPfC*u8zo)Mdr7+cxnawcTI91LD5;Q6vR&H>K>{OYS~ zxRmL4zW^X#5`6(+Q3<)0`}E%cw?IhCnxZ3T3I1-+F__28bOuX;49^XCV1?(F2LO!_ zy{d@MrWh`egU)nslUGLwFpsu4>x-&>B?-mdr} zkeS_TE7VT}7$wMsbmF*EtN1GFi(z0P!SoQ5TZ!#OltV^{^g~|>VP%eOTS28lKbnrC zr#&HsiYWy(B;}5Nm?qWDtu79ocedBJ8NkB>%+tT;bEQWF;H{ev%b}!K ze|P66Ea0Jki;ruyYA0=2RrnpVn(?tWq(Sa{*SAx zX>B9RqJH%SRj=w*NkXa;E;KR|xv}L~q|JmOxKrS2ky*6xEYdwDFu|sAW)UxDz&4(S ziHM=;1a+8&XE6&edJ!;ql|@Ll^M~>u=A8TFkHi7Rk{m_Ir_R0SzI*QpS|rS15`r4D z$0t{XXuBQ80`S{;2$ufn+W@@xMGm+x{?xav;^Zjq4jGVLHh11{fsV_=FlaqGm;_R4 z+xGwfAOJ~3K~x8-F(r^T?L^d!hA8Jinas*>3ij~$-X8?J(s+%e##JT!+dSsM0qotSr1$Qa&Ge|MI5WC>DG4&H8ek$p0PS^ z4Z!7;dOGjm`p174knS{BR__iw{Umi$ou-Z|8x4&Z7^_I@UbCSfWP_w+J-G_qoJX#} zjvp08qd8D90;)2uhIVZsqK3VZ4mhL1V+^HqlH|s5LcCmFwp~{BV!+xn3UsQFt_5nO zz06zc^b2DY{`+tOiHjr=B6t*g^P@22tCIAzoV&jR8q$l}DI%+8{2 z(pg=T&6>;7eK1_vfCxF-c@F&TJUe=YRO8vZ+W?#!2LHmTq&q8Y+4=zaHE1rcv`g-6 zI8fSkRqW}=>kZ1VI?(uVSUQRiz_kaSJM0~R7!SGi1AlZ+n<{YPty=(;6_qytyc)|S z0Kc)_FrqWAb`xDQ;GNt1DXj>(H_ri&A5@e-k3@)58Z{r&&5lMC^0f<;T+p$so^A^- z(&_}5ytp6`&uNG!H?`Q9)gY^LZWa-Ts3`;tHOx6tc}k4#2}cru{Kf+HsYGi+lkjEo zcgodtMA-o5p|0w4ZH=p8*fI+B@|cR&B|$CtMOcxerT0l@Xu zwI-y;pxx~adv5;_N?liwR-s$!NlWuW@x0ipDq(HTDhK_ptGucxRaH%@02kI|D>@9l zAH^>C%Mg4$82p#HS>~Jp?S`1o8F1c?buxFV;bx8pZ{7$1zdLyXRer#M!s_6W){lCt z`?Jl9S{%lRw9T5{6c@YP;Z9w0Yh<2(@6v>)wz1mA;OW@~{q+b`QOXR~fDbtm(VL7) z9MXo5`)`mO*0PC-6v#68l$OjkBny>FoE8aE)Ad{E@$_0U^KkHdek{m3_S1!aS&WeG z6-%8Y5YfqgdE-Q(mjQr{$Vbr4CTznSyShmI*v*45_MDYr8UrbAvQ%anK7US~#Sp=e zs*clG?DV77`z*}I0YpgVPqMJFG;%z=n)HnNUfM_?X@Q;4Puq>uWmzwF^*EH)W<5dj z2>}xtx8F?0xfhHB4YXDi9022}4NVNei!2k=S9aD`?rw0eA=|E2*6{86^2)~g`oo`C zT0eTVvvc&ECyvkG{rpz~kY86J_{HVrFCRa>1#VY5?OwOn9`tb$YVDQ{hii?Z1lLL{ z3lB?OO(4Hom2xB-P~pVu>7c4o5_HU2QM_Xy_Q#X!p`??~Long@`?+24O&R9S=XJpS zYqwTmzz1`y+6NYZ$A2)6-8k|nK5+Hq@WY4wxxpRn>}I>$HHnWSd$?mw@9NFn`S2(+ zzp3?=vhJW$xySGMg#DuLqvcS#lx>2#a8p~?&>7XWh4iL%R^EfkIh)R=7qt6E(6!a= zbE)LmqWF|_Hxng7@s zUMf1W$bm|V2C~ED)eTzeEH2+&zx(j$+4G-{cAouqB*%yMwFblC0KD~qx_NI7sE`DxQd_AzQF(kB~NK{9DU=tQJ#fKL@+Rk?1Ovhkua^cHo} z$W!6gK6gZadtHdW2Hdki^VzPLmT^dVmmUISLY4)^E=o)m#VN05*Wv}oM{66dfzl}>Hi>X102Cktew+3c zB%9=@^Gv95Dwd=I-#xlRo>H|?ThC6Xwvs5CTvAB-gaese8%9bzmGX>~#AowzkIfht zQWd93)EGoQ@RStc#KflE_cEg-}cTS`?b<}CQv zx1am9N&vo6!Ea8E?`;K+o=gIc#KgVz55wUiaYg)X*D|HY)!K-zUt9ZQIxPY+d}y0y zQq!58pQ`17O)j^oX}M=}NG5{YwGiS3l?-lbYltS#Z-VP;?jxC5N8Fkf93ofPjY1rR zxF>K&rg(aGCPg6%8GsdFuEk3n8vQA|#z=t+qjI#ktYh$(qY+AMWzUag{-PDSX`vnM zFfKw<1WsRbTqs&>kBv7$)+T*1&>9X>IWG*yaatAyMTQwI0jaE^Kmu338Rvjb6zj$1 zuHtSD054Uh;sJ*l4ce*kgAj7pr!n?u#G#Oo(#2^vIVk5P-6)8`%_?`*#D|7a{f5(K zue~f4S>3RPVgTUs#v1qjudoMe1LVgwHf%0q0N(k}%fJ6XpN4xh$A zUQ4H65rD@x8&YpV@Re2E@fQrZ&&>$)sklEsdGhPkj$UbqW;m8CkoZFg-g1$+RQPNh zr}Mw{51r-5^pBF5OJvbW3R&GQGd(=Sk8>y(BlCp~(qdmLn4^m~HbJG*R3jZ^Jmv6`>i?guYw2y{ zI-|PtxWL?bk_SA_!T`5gM$c{({*NGgFIOrJEAmdg zoji1AFcaLe#(Q{h9hiQ1EAHSP2|+JcA)@w-!5OwIF~Y$89m9#I~_0Q5*0cfS%RC6nes@=ll;Xw zB;ou88B_3xze`!fw(^jFu9oD&*(wflO1M%(ifUX43rfH!-=&$kST4B3vanW2EYHP~ zCHwP*oZZO`aeVv_f@0Yxw5y5JH4PaL_K6JF@l43JPkIeLLe*jvWX|7LjaBgISEA-fj&Kxwl)iVCJFleDECn4 zk6hnUDvG=on&nO>y|*C*8MnlHGvA|)u2QbI7PU*w>gwRv0a|04#l^# zdmX9BD$KNF2|gK0r}t|?-`VBa*`)>GiDY%1e6X5|BLLrxTDi%hnJL)w`^K3C)nI5Yx zUkEk6nxZ^Q8NZgCTn)kpmKK38WY>k%`D$$IGFJ{4YjC^p8y=TNe6~F)?ZM<}l$7RX zn~ltQ92WI(pXj#Z)Bwp9y`AP+R`S>!c>*!N240F58TbwSA+b)^(&o%hAvW&}F~_nYgq%v%Qh)-vEEsGvcj8W?|fz>{nU zK%UD$_8UPBG9;9FpVRqh!5L2RCu51A9RZP3K_yk5~{!SH8Ls?*qZO zra3btT~b+I^rA#S<_AvIu9Xl!I!fE9Mhd)VV00Tg&#KZWr|k7MD(!RoHfJloc!>qh>$f)XJziuLzBXC*Sbl??}C{R3JBXV3v>1u#_(?a+bwla{S%|qko#>Gzz&mFXy;p({ zKY~C=q1bCM{%?7T=-apFGn-{L8_k(+amBY}fQo>e&m=mO*|qbL%{d!O7%gzRJe8UH z>8TtoCvkhENS15*YHp=ioJlpuqsSuTVn(X7cm$s25)n?(DKHjllv5MA=tu?0<&z=PRn_T$jOb7`D@C-x>8g+`Fe@s6?MmL@T{^Hr6bxVce_ zU{bthEp-~1Yr^+u;y~15n!=4DPcRl>K zIAqh`F}tC6Io`_!nJr2Be0+%l%x>Fbyz`gmJ6kWWv$_Dl6AmQ_1OD~Eut;tc_*uj4)!O?vbHO(Z z`1_wQ;L~dceDHtIXJam+O{{)kvs`5}_}*7MaN+5%D^CS#W5{EnVE;e;^s~2|n`bEK zi~?{3l<|dAqhpC}B>Mq^=kxJ(xTruA6nS+%gG(WV$cRAaNRT-L6bah7xM!|s^TQ)C z%#?Ps7104fl2JeB1yelEQlL1Ng-6+B;ix{fAXg)8cs)}sXk0#*9h${-tzIuvy}zGu z)W=OLPFQA2g(dij4b1)#p6@L0#==*Xa@;EJ)bJ&+eonjVz!pS&`js}U#A&Wgn#Q0} zg{wmsP&&$3vUHaA0mPt!diRnF7dS<$?FBT;p6d2fk6UUHkDSyA`ydp)&d)q|yo_tAaK=Y3_T;-22@gxFq~!#f&~Hu#G>8t~b(e-UvuC~1|I zY4_$V06(s@(r%~K>U3ILd&5rWhlfiWqzv$#gYlMEk|-*$LM0wi8!}PU)?}hj;Hv}X=y*TB853)ETh$OhC+~u3DV#BRDnUX8TJ5w%BXR@Bn5`MlU zM-qOh#_|PoYqKxtPPkJD2CVhHeXoi_C&69MUjPg&tRP(jPge;HS5n%|T9@+|mCAdq zUP4!hyAXwdx;=N&IE1KE%5^*wZnRPeCqLb27NOVRN}u#41ZnVQ;u#Or5vaau`v2&EnVP{Mx^x5Bm@7ztVH=C)shjbz))*$&sZq=iYO_d(V}r4{qA&xgO6W`tjU?zj8|>PbmGz-?N2Tn0f+2bQZlKw49^ z3vk_xonf=ok0V^9$R2d3mFHoiy{rhx?j;`l?>`6t9~kgc0Dk+e1mIl=-ZJ3JZ9m}K zmu4^>A17bkGvNJ}2C zzOIBC8Gs42O=bMEKbja#)NZ7LxChYr^|8Y#HaXmYysLRM*|2gO->`omjAPpiGDuU1 zk!V==c%zj1Y_pS(<#Gz7t*@8H zX;4vXW12F+nuhWRbmCGjLg$}rqiGZ>Gp1i7iBXBOv}9cR4Xfc!2! z4@l#+ne|%r8ty_jR_$jQl0OTdjeW<(xSh+q*fAh}$}`17acCkHM;@+iJX@7$ylFtB&mk$UG^=E}o=B2va?ZIH zFyn%FlEvKgG!$t}b2)t8ZMac%C4u<#R35egdP#OdmUKg^D3~dt7u&~GrzT|-p*)d5 z%MuPqPmTZ?m??ftt@&-2JdHOG;g?n~j4;oVB6D0V^%4U#*3QDk^2Pqql zkskR`>?3qGtya4p#HwiuEu<_3apJKO!xCZ8ZTGS;aS^s+YC}j#jWn{U>3juAq4i+c z?pU}-scKH-uyIR%kX?uPMZ)MJ^zm>d9zWr_?8AMT@g)ZWXom)aX3SCsE=Oybo)>F1 znhPC|E-z{FN&>vW-Pjq(qD|3mw;PRCQS1OH9Js9maw_SUpG!a02>oH;B(*RI?9|J; zxvh0C@0AJ9XlBaG^X6F^xQXL?%1KkN7Uf7Sq?yCRHOHDKu1NRw?;bPY!%^I4y9%Wc z{rvN8n4kW%n@QRY2H)p^Y>587lV!cqozH7&h8GamYng=#dfcm>;Tne~KVNarsO+zm zRo;xfo7Up=d_ixo$$dbk*QP{XSuD>@%qt^K%))Q(rLQDliLLFSs1MuagCwpi=9AbMk(A_@u07Iv6n+H051r+fL~HNp^N;_O9PG{ z;dQ2omFMU-^X*SnmE9s2!GDJcY4J?2QcU5Jllc#cQp|#Dj8iI6atL9uOpB?`A zAL<2LTM`uw0>u)z6mPWWcRInD7YAvxslm5SFqE)+xIYxRd&m>E5k3A!z}8N19CFt8 zdTQuzI;E}6X#M?-xC|cxjOArw|}WFyV2)k7Gb6Q&?(XoL%9R>u)K=EUOu)tTAV z$WeKQ;K|DDS)Q2qY9cO~aq;q&fHG(malBXv#sJ9)eg7x7z$tOI5&$ynia`m>-X@Qf zV7z%t%nF8AJXB$wM{3fhNwK=SmG~^&$Xt*FDUurGxraQ?^BpU+VkM(#ah&2sY!%}$ zb(5K$XXA7}H)D`m2c4dOHd9V{mdwhOH5pE-QI5neAlV;>r7{RiJ(sK)mH=aFTRccs zh`+hKu7#7Fui@vou6L=pQL^qpjVUJI-pN>D?sG9h*+UZsOUN zYeMkIgPym|V;g~=Pz+|@?@;dFhqxDqffS{piytWM9FGYTD^aw4C{D(6N`OT=a5 z7EYXq9o_ks1S@f9B3+tuKvrbPjoV<(p_OVSG5S`ZDxukgXE_`^t@ar7d^Y-O4pwS8 z2W}MYo@PzNvD0!Ui5$H*>`>2=#LMW+7NwAeY-{ntFwOH!A?!Mhc2L$#!(T$>Tc+%H z32E@+=~VZNx&umW+VwsXC~55@+021hi;o|7@;bMLNyMeg27O(KzXRg$NW=&A?nuVX z@x}Vm@ZU&=-q!2o<@bamz2(+m!sX4d=yE$)ztd{e13R{b0ojZCr2tUsfIkWVCrurP zXRc*w8`K{vC$|$_uOq=i3d?yE{L*-7INajtUaOy$ZZassxeWc$fYVCO{GMOKwcLDt z55TWQ1wZNsd;s9dQ_~Rr{ON-VerW*sbjN@vkA~s|fX`eovD0l0#%Br0I6^8gSM(;c zW;MK;&hY^kh*sREEDLVAg%lWgvyhNH5oV;lO=T3a+$LM-P0l!x1*CV2?Kc9wirPg; zlUQ7U16ffdHJ+}F*r_T}Fc2(+ID<3)Qs{7Ih013FPLwv;)yI!3bLPUL%w`YoyicWT zDKmm*JMCfLhZabjPM$^H8IL4FwyJV4*j2voN4@&6&gzUpf(Hexr3K$r*^|7VD>=hx z(wf}!qr3-fQ}^OW&$40ca-iJ{#;oxupJ(`1a~?u$20be<8bh3f7;sr{K9=(~LE-_2 z&51znFA)GPuW!Utn3KO|fAQt3sob)>UL!zXz8ZELNc{$#yq9-a;8bQ`D8n1{ndcan9MBv8QegS8v zjO4e(6FE?Txm7ic;&-CE7u)Qyl4BO(#)|dF32`Z>fWRg3i3h)!mbm9n4R2Tzgx zX1Y;ygIegx@h#Fg*SD1%NI;pU(U^YoWz=ru>`F-?j42AqdD3~6`p{;9B4vi4OS~w9 zSUV{~yrUCk+w4&gwPFL%$f3vMocO*gJaJBrR!@Cjj#X!AOJ~3K~!2= z+eovh>j_m~sY;JXRfP&s#aL=2+bU9O8WYqOq%Eo!5t_xwr~^TQVGO~w=tVgl3|WLM z+QV!bvdkun0YQs_Squzx&u{3zFn?w4xu0yy4MUp5v8>RRj_*C^KF-ZZugvqDxLnTe zUrZeVUHV*WzRHo;2~Ii3MuHn4$)=r~UH@+^&jv^|W*Is)#QMgPY2vZfH_+wTH>O7YR$)*wMh{gLcmu%{oy@9>x}W^;r0 z_(W=6SZ6M{=qE3m+$?X|OY>~8{Jgy7lZt#ko1h4w-d+ukdz7j|Pov~6()N)k0Kkho z0RHFuUr>hT6g>8c!+Wj3b{a|;#99NZQK(;<6x?UC8Ifd)ar6VH2LVb&%}Allho2|M zB(YDwyIA9LCgCu6!~x%)%j0n8FaA#ie0p~%>E*o$KD_6E?2E8>FP;9q*HyP__$hHt z;^osg4Cuu*bWCyDsuuV9{T?8cuLwB>h+dYN`1`h8$qUT#$UG7JbKPmU^vrqEDb> zF)Qc$iisUJT{X?5o&=h~%#maZ#+&huRij!Osg};wMmgMq=jqW17F@#-q8vat91Y~H zx_+P7;9!S6(i>L`l$!ar;u&9VUtBF2erJS4Y+d4_@fj}wFAyfLF0Tgddf4q9g;5-P z!Xxggy#Mv$loas8Qqqs|Uh99?HvP}0^#~TfZsjPE(-5$Po4^T7Njh=Ln^#k>LK3B_ zCqWw75CAA&xfBK!XNnE0q#u7l0DQycW_d4|I3NM=aW5E$l4JyYBtqmY*6Te0zJB@0 znd8Oz;nXs$)SIGHI-5~sPGX~KYm)})B(2|X_l6?VE;v5Ic@8F=1*jxqBkA6};4nDfg}L>|HK~w{{#8n}IqMVRd6Z`9sh_x^ zoXPIrTw2jz$777@jJS|tk<`b2FJhvb z_KxaN=r!n#(ZWDr7}bF(IOz~g(_K$f700GX3d#_J3T$U_&^cxXZ%MTkU58vb}5nR zqLzZ|`HpWjCYD|i^o|Furc02FH2SHV8516ef%KhB41;LNw04x*wqvVlZMv6&&(GgJ z=72kgN&?{1J#(zRUNA?%!-o|7djP(D+Qfc?=-SGRr-p12z_SS@V4_O&DjxNYg@|`f zHhI~Ji4hV6XE{p{;qQ$$#Zxy0mqOc zrDTuv3uxmS&%CvP{MpQ9jRpyt`5}izOiLg*&T-!&=guEk;`#vT!{CaXu1tfD;!a^X z3gSc3Ue)|0(iNY9ri-Lr(^=7y;w2iV3yt0*8zz1_hN?)9=?{S^`eLxlzc{OdMK-fXX4J$d)xx4-^~wKxFK z(1K~hZVH2c-lnQwod%liRSk{AzUy>rq_2#s-VM_k&UDf%gc6fc6@jDs@KjGJQ3R1t z6&4|KBKnOS2YkGi$vK!K;1`GAKK*k4PR$>82B}Z?BH-_=VO~6IwF9?05g`$nsXRHZ1g#=I4lLJ+|to(_MVF5s7+MKB1W>;>+XN&cH(q@soUda*-9_0=T zirNPZKA0O=dYXi!O?{PKVGEeEw1D^_E?B0iU9GCkR8bvMst65@sEVg3U_a{GWHVjj zKyf#8uqsk(w}iv}y@pP5gbO{!b0tW964DjFd(uPjgV5y}E6Ms;h2SH^Jp$Vqni+uL zfbexDGcZAMc@5lMBH#gqlxyVyZJhKZE=cISy}n#tEp7&+fs?RHOfXJ`==DpR0r=I$ zlZ$s>y?^!Y``>=P2cYi-Cj7Tlg%|>|Dq7Pj#T8q?nxMl9w&>#`QC^JLpf6eupPDy`&-KFs3%8YOE|-pp-$<9>Rr-^zLwUGCY?4;TYh< zZ=8RR5%l0sy^vKu6kLekaRgi}aJ?Ni!X!M-uHh?ui95!ae3mxX*Yw!U)g`W-jOyKH zv(_CAL(=Q5cD+-e4)|^dz>Culzx;#Eu>inGQV%tZyBc+iK#2nTH7OV+E^25xC}s^!hd^y9|7+U)-V8n_+jr>p@iVxIMxn; zUq8$Pe)|BxH(&e2r$v(jgwFkV6Ey{FQ)tf7?$BvTA&otia0)!ngtZDwf}II7&DSgMoM5*T-a;lmXDec`q=OQtG_>eW~=Mv^7`ib zl0?a(*KXCjwOZ0WIgaBfh|(nDd#%_yp8(*$F%E;h;PI41C7Ug%P0G8vaGt}7 z0dr_1ztW0PHEUgT{1JHciI+N-rxW)l<>Bg4v!;PUhfS;_FaY;DApjuOLGBXpA07aB zZw~YNFAu{Af8UFM&wlUD_U21l!-(dzRUIY%!OYHBn*qZtv+2b^7GidRKr*ZO1A+X3{DR~+ zWy&);`T zhWWVc?sj&RQ9RD_B+0WORc?L|#4Sg_M*w~e08#|}_HX}Puh{DhU+uUTp7mlP9?C@j z2J(tIp-R^rLR5G3CK>G?a14ySIv7h3y1(UZS^q6R$IbolX7*LTcPko|1M5a0&JhNWE7@9=!U~+mBbeC$SmiZb2#x@{1Bf}-$jnf56stPSY}RR`K?G*4 zp{60VzJs8B{Fin01cI+#u~qDv`7?M6?wx^PAG2S354LA|F@4iTeRr@Q`51ug6^Ajg zj9ynE3eT|y0~OYih~HTWU%ng@R9(yL^(0}d*O!B-X_#Cg>U?esRiJ^|7uefoM9KOD`n*q=1B`;ilmSRu+2~q#gE6BCh$B%j%F4GPrH~}@}UO&eRn7X>k!VLjs@dt z$alI1{FEaahUgE3=nnw+nH4K$zkU3}D@>H37i<_g71GQ3a=us$l9VzjA?+Y)TeB{c zNKrw-3AUdfy(^dszOwf)PO!(?hg( z94E~K&(<=tKoMxV!lS?-3t#mGC0BZd>0TW)Xr%zpk-~0~#U_sE7{-aS+Y+ zkLGMF?M!|5-oDw<#hjfj3oZ9uoZdpi!(v?oKwNXDFh~K7k2js(oZceyZnj^&-vER9 zjyu8bS$EVE*R?mBo1;9!3FCY^NCHb)1-%tmW7m+6tvJ+xZyx|iB*gBoOv92mf#b%O zL%cSh;`p5%`;s@6IG7VQO~;|?FXZN85L@QTQ9&>ChrZDBT#qbR`vD*Ps2vUd#jV0G zScrZ)75Du|B;@7G7mon^wG-^8Eay88x-v*G!bnrhDABV^FLH|mqOC>Ml4#_?z9Rgz z3jbA}CBsUXh;zv>twPx?7r$v; z2MS|@fJoqL=}!gZ-Dz7Q0~2UuNZz&ZFmT(Y3y){V>*MvFDgw#E!!(MfMZn__X%zVm z8oUU8+VoO~j@?^Xh8i3uMZp6fp^au+AXk{#?HR+=_o+$`Q980!un&{NsyF2xM@CFz zrlmf5PQgJq6VDc>7t05G9{{+WcXHpHB|aAVIsii3+g(!Shl-C+>FA>Ga`$Yf_gr7@ zc8inE&0?1A?=P~^bQ1eM_6(^g8XJBgLie9PJpmxb;@FKqB*Zct!kqx;Hz}}T$^Wzv zp6IXgQIDTQ*v4Ez-=HdN%n9ShF+>5MQgwKc1z0OVsj>g%n>SAe(>4BhB$1-2u z>ws76NaXnj+t%MWIK;7$k-OhBE@Jexqgt0_o>n+H%LZ(HZ+1;>_NPK(mr^9A)|F z(4#yvmc=Ad*nouvd}53p5FUIhMEF-lo{e0~r5dDkaD>Ld5D8{J>>g@BY&2z4zrb=C zN_)du&IgM!O?PqX727bGeXw0`iT(yleat(!#nyS88FDu)s%&w<356f`+=yeK(EEz_ zT`~UNzu(bYyG!~^0B|MP+R|J&DnUK$4 zpR)|}`cnXWFr;2xJ!~iXWd!_V=gHS&!RIe9(?I1n<$l*2Q#ytj!nN`vdcc=_lP77_ zWMEl#Se8;H*vm7S*p!$`EZ6i1MY6$4^>#?)qe@n5{L3}lc4`W+4~mH)1;;i` z8U(?b!lp@320~w@Lse-_n&A~zjk%_GtVanSusFUi4iN}htfA_V`N?sYo{#yy)SvP8 zp3QdVILa-`H$?M1&sB!wl-R0)dmo|W2^?K8D8JY$$_G^O*rhCDMTL0HK@vwhY&i*l zOP6Y?ekh1n%TdNFf@Yo4ho&xiy%}c7S?rtZS)!X$?Q>b4Tu^N{*LpL(pHeI|=Uc)X z>;>B`LLauNZ+Fj_Y3SoRml!?A+5^DvWO=c@na^fXzFcH^S`Yw}!gYO&>{%4-qi=q~ zObCGxqe*Xn{yXL0cWg-Q@#Q7@uPhWXDZa*|vMC-V_b`^iA%0~+bC)Yii5`X1QRGru zwhFIDF9Vm##i25#efB2+@byD4xa)+x?pVnGkAU}`kT0)3jDYux5%fsNuT~Te`pgDB z`dUl~5K6dgmb~TSC1?}N4MwU)3p;2CdA3(7xF@KFw>`7*hcN}kMh#jdX^MWtvKm*_ zP^6WqMpMfq9JPc)K+tO^Rftv!60%Y(;)q~k@x3V7a5hD^S%6PR(0@jE^x@YW9a*BO zIIeOurMSpBx$5Xkwcayv<0F|Ws{AyApn^{jkc!x~61U$MrVEWl5(~y9jskcK$D<_Z zYa;?W_WZ-()djKNs~t*B*-;KV^S!>jVA6pGFY++gf+w&nvzt`&Ua*hNW_vO3^uE&# zj>rOlyZ750R{SXFZMIA~m~k)(p#X@{U-)3SYck)QVoBwG9z~-hou=`Gf`IGBiBDyQ z7(4(FT=?sM=;bi)Py>c%C0f5`>YHQ72+VOf9*nsQ3BK>xJ_Wr1_nZtIKS?Kt(-qZW zJwJxAw(gbK-b61`dG@>e2>8Se1468YnCE&q)|)3f;0J!Js~>*2da&f{Lp8jgP5S{q zKmWpwFv1gZyVSv$o(Yqp;hBq*TY8w6OQMEeDbm5fppa+9QnP#d+RCtLjnczL6|3jA zRwK&xpf0gwMB0>^l@JXTi;X!P28zPuXh?P88SVp6qOOE!C(5cq0v&WjuS!zIJF}~j z@At6Bp;7x2aF&*c&2<+cL0Z-$oz7Lu{N;MhffXOIho;*o%ZH8jwVCV^+VgdkBBN|lyILcRJ=_P7R^#~TVu*G1(j%Ic@>l<2J z|1EXQL!zB8wYv`&+BdAUXua=d!&kH^?{2W;l&>1^E(w3#wjnC{c6`tM*>igL4af|x zOdOq_?C1Ia=(?KSHm)fNtm{)uNj&q5xg^5wyr71n45!^aYwn=&SUcZ-$amBwW~rWE&!Rc)oMK-`RvU z;If3SEmp4f-c1ob>!SSSHvsq@0l1X=VJdWmug$c`v>UmT0r$<(|8fxB21yb|#``dg zd7Oz3D+*VWp&Q9wuc?YvI;uurbPRYulypeLJnDuy0Pub?{pw*m*59rkG2me`{T_f{ ze|jEUU9w9|>H#5VV)>b1RR?X z&nN3S*O%sMu$XVMifte{JBX_&UK_oz#E`m;Z+2{JC z%ti$$3BG4+c)7kfJYKQBaVxjnch@)9jIq0GF}=cnT=#Oo->y6G&KSFax zq$hQ9JXkoB#%?(dWI=mqb!7vXmUkTke*NHrzd58~4)?0@jlUi=-~oV#?N|U{&wzhC zc#y|)>7SlUE8K81N&&b$$6I3{2m&2Of%j3gnQOkiWV)Djqv{7b1 zDNJPwZ>n>^F1ALis^QrJ9f$itpsKLNQ*6Ufv6L4!e$T8<%W7+}C=r`Mr7g%2;t#PL z0BqZlm3t|{*6jCs+fEk3eu%M_MM3exZ9AT@F#V!@^Y-mX4m`ftj*jrzUaVKs&_?oL zZ?lPN&CIdp%gP8F<4GLPGTEu2%k@%;R+qTzXnWyNVEyY<&FD5xVPntaZXf|Dl@Flp zv?D^Ul6-#FC!3$WJWLd^;Bmo%FR@1e-rjM!^KEy*lRN%)*ImY?V?0{k4^KYu!p=3K zj@(3lb|#_sfA)`VH3xg5Kkt{reE&Y6QN$8DoJb>p&*|)%{d=37~4B()qKlB>#_ZYAP z;N!92cUO7VhFRfy{&dwot&Dm9o4~`91%T?iAEq=xMfSbkfv>`kEXawpsvDeNYpKvkh zb4l_^4=IOtMecEhq*#zH*L=#}W(l(lyCU~4c+2R5{iOZl;{Dxq&wqC`AAQEJTQ<}` zK790HcYA$#b4CD4SK(|1;kOu`9uLQ`f||3vSr7!nF$Y4ebMrzvQa|rpFigl#|B=NA zoC$HfW~Xb;VQmU6)kfZ=wLu}XZnCRJ*;*%=3H>HvZ5uBX5y-bEjIEOi*P*U-eYTEG*?*|`Zc76JUtUms|HUfE5<<@R!z0pz+yso6wA4R zO9o0|4)y{4CtS;N=8fJ0XyF!M4XP#t`B@O<7={HLxCNhXE$xbBesS~yMrSc*0_csG zLNxQ%R$3L0OtBuAJj6$eO)!eh2Y4PlPN-70!Azq(7!Q`5@Rcz)=Rgm}L6CFiEsuyq z<2c7Ay;c3=?4bEhxwq<+g737?HA|DrMK{YPIhU@x55MhpJ^XH7UGAjRD`EEfvd{R@ z`F>!=h4N2)$IW|KXvTbm{K;%MUXRzq@oI9i&wR1~CZ-&mQu9Q59`TX3i_iL={4Npw z)6YyqfA@DVpbLwqgCIyrAbn<-Ov zMb<_|U%c*W!94^1<(>f_9ZY}yaIN*zo&kFec=fI~A@>@vuY`OeS3+KYHIgHv+92?- z2OpT97vn)30f2`K87y5D%fO{v;yRMnlE60HH=?+jOyOx*KUr{AN3mNygowm62(XPR5M||XsBQO%(A%aRmvpEg zLx>m{7|#TwZ}HC!{$60-E+*}P9FOoWg`+&!Y%F5WbP6MA{Jh|17!6_JRWwRwCkr@1 z$uv~lgwJURAT$dg>wS`KX0sWCt(1AC()PUD6)C4TI7dz~cy{00e8B)-K%u{3w!=CD z!0q;?%Q)ZO?IiPuKS^&D8?BgdzU<5{>2G)U(GyAe!43n)H`kZ9FMFqbJm#&;#Q?vq zN~IS|*a&F0Dc&bePc7FxI2W!z`*$w@zx?tKpZ_c;)BAQT1w3UIT2`%!M9cjz&ioh_ zCIcPdX-*8QM0u1Yh32Bx$gWoNaw-dS@``&AvW<(=9)Q2efL$-luQcE%zt({N{Nde$ z3qGV_KIzATzy0?0$8~J;+G}uo#N&Ki(z6<`9b`}nZJsd;7Dc0!O`Ou+lf~Kr>8WQoGeE|i%X7)R z0D!`F5_|=JuMV>vT@tWMH{ZOv1?llOGM^k*p!8#9?egyap7!oZkG_kW3$W_V?uJVO zS!H?tbhsFlj+HqBuI+cL>nlk4l*hqnX38a06<=9ke+-_rUQU=oEA^#Q4J{q zR~d&uly!kU&#lUmAjIok&IWZ1uFE#yLD`;}8&z{7?3ASv1QAfgcphH;o(t{(_|Z4N z)_?~9-cM!rd1nd1A3v%EcL4kf1jq#{J}Y!+YIcyQsh&*|9kKK@99G?!4ok({_#I}h z$_CS?!}DBawcjXwcF5krG6=Ow#yXcH09DEb*p5Rm#%Gfu&DOHaJfd;MxT|>UFUtlq zrmY*lXd8Zqt5sm2VM7od+4>5j?b`ip4r$mDm%JvDyEH2R03ZNKL_t)hfjYY<>P)$A zw++y{J*Rjy%vB%d(G*h2`}N77#s|D>wnBu}j-PU%&97F2)w&4t-lK37M@|wXJkbh@ zFjWdZJUKo-K4W94gx52vbjX^%XD?sfJnK4}3BXtH-^(<)lzYL3?=P;Lg}HLG!4X;k-C)rEU+{d8BQx~k}+r`vXSkXlNS(J(jz zae+wVz@$PpW<+%XPh2;*lG*dCfLl zh5%F)JKX3t;Q3X+%BGsx=1w1Qn1nDC?{;DCl;Au2sNWAPxR-|6Z{+{u#iL%EsLz1k zI1K2L zySWZ)-MMwrEj=6+kRSn|lHR-mEbQi~Is=JDjkX7th_q?)^*UmJp#pK0MJWEOySKFC zIsVU@7usw^a3)9kkpk~KzQ2)DG$k0P$HQ6A*wZH@9Bjh47W3)pvsbR=!lT}!CxCJ{ z&xZAS;J?eui(%g34m(`lqprAXINuKO=b#|}^NRgd}0mM$;Ooi60(l zexNPLhUbgON^lGbjG0)xE80sZ%AH&R_L-vKy96B5AQ=$M#I6y2-H+lJfi3`FzU&2} zU*0DnUw=Dfx&0{a!!iQH@5}xq-Q}Ws}o<)4HuKBW4TyoW(p!q*E5v(vF+6){y9fXnX?b@vY zN(|MO1(;3j@BqX{EhlM7d3ew$@F>Nlx4za=F2ydF7KI35Nq;E6i7}?dJ@&C@Jm;?}ghj zz34m6NPX|VxZq^O33HrMa_HpMvFrIQK|U5GU|zMD7eKHc;FxAvvN0$_kxs^=GndV^ zLI8f^j*^}~fByLOo8GJI??3aqRmZ09=-T! zQ0C}`5w5R4jYQykAwCOy5F0=ZDP^o!jbu6_V&aIdzypZSQb^!enG}A0c$iyHD4I}c zJzp;nWyX}1Gp-uNc$FEA=fe`fu>+bk20R~?eeA|OS=X}nPQV$4ek;A%QnV_eoUW_T zsJpIe*rb`vSfTZ7*Shc2yRvLKE9uxK-3gRvpuz1pMPXJPH-m(LXV=Tz>XyfAi}gbE z%VvRt;5@<>G+M|+SxWqnh2REUQPvcc^b>24lz}}a>xmJY)@h$^5SGlPwv6i8!aD?7 z`&YkR>IlfWyDl2OZjj+_T;jXDz2KGOD8cN+ z1NTJZg{2Y`(nZW;7UTjR|M5uGuBHWxF0eXXRKSUiL||`#>bV&%#_LIfB0Rb?3EA%h zx@{Pz&i0#0$cIMsfC1@K^V1N2_crps>doRFv18V0>M7EjMaVJ=ec%I+uFUC#FBB*V zIWZI)V|grx+_5@d)u^YIRtQ1~Tdi{$bh?~Nr8&sQN4kkA+buyrm_LJPuKhR$_DE{Y zR$$!YE1C&&2PkH14nzPy>%9eo!r}5 z6!EQFjNKkg*Xw!I5DsX+o|aT;bQu7@K+axpD=@Uy;CD9yEG0yh5w0UBs%6Ea1hFX) zfRS~lz(BpeyBG;WCtyAj-s;rNI+z1NG3eX7k3X)poIB8W*geh8I;xR@7vOfoEiP_8|c8 z83zCSpI_ZsD&F}dZSWLH6ct`&7Jz{s<*xbi%(8K-|xj)93x1N3!C5@LU@H_!87ugBWK{|AtpPVjOYfV^}Z2F0MQd8H5jRGVigG`PXlMz5v zGReV#{j#PCB>os<=T&^hOEqoq#^OyDevx=ZGh;O^n|&>;M*~N1H`yVeMLt7G zIXlaIFx+t4W^#u(G(wuf|cmhzcPQeg%bvJQM3E zDFVM*COr0|R-A|MiYP;#xwE(rhQUAn8ywg*qJJg(=M9UJBF?}+M5gGyDC-7g2XN39 zqjrVkf@lFRtQFzU2QfTE`6JAqrWjHI4mlk6cC|Z6KDT3N==7)zTvn&KL z6NWe7vJrH?lHrJYZUFLh`g0%;FV#z?-9yU>h30>sn3s-`%)GHto7_XMNRnJ`&-EG$gxdsI#4UPuwjGRc<)_=tHTHpUdZMWv4>yEdwxQOi*~kzFeJ6f#srq0-fq zTH(iTvze9m>f-Xrov*&#eB&m)H;g*=n%!R)?`ZEaz`v_k)P1=+a);|TN2_#_=J-m1 z{>J&DF=akZd_g}uQ`ZR|MLaBWB&HySluC-7YMvkBfr#4o|Kwd}Z<_ABx+o7g1Yo~> z8)t2RT5Q3A6X6;Zp%Pq>1e&z#JdtrP7Zy9yGHZM#oO?E~=6b%c?b*j!@ZKh5$bcUM zaE}4MzT?(9un=Ux&s`Vh?e)h1+-E>w%Rd9m;^R)5M6}39bZiFGvW=x$R7a(rKo@1D z$$kOx@Usbjaxy(hJmP`9nWB6k<40c3vW8_4ANYrILTA&W49uSxZ^V3 zwti+S(Pn4hB=Uf6(!66c*5eTfLI;J@`yW?V*CMx(MJ<&ikV;bN1GP$Y(UBZahjx#r z2nIhG)`G@j4eNecb~a%kC=%0H;rjD)AC7Ublk1ODN006Gjv zEeACE6ADQk0eZw{Q@KeL@Ssp_5+juBqLoA0$A?WI9$ftE#2T#mQM%aJ$g4lFQo1JO z7=ZIy=0Tv>mEgk|=3XA~!!ZM*1#tepU<0p*p@H&Z?aOghKE}GKdWKMR~gyRUr zmE=Y1qr{H9=u>FBhf3s8=$kg@LFB%V>O_s6VwdBo`I)497M{CYWe7^a>!>KovPeXG zAtL0%ld>nQ+?#&nDCP<0KYV)L#4$@PWF)QSYynx31RwGbOg0SKF96OXo0(p+O1n7( zM`8Tye(bdH6MqjUrJK6kUC!*5dD`r5KE8fB z_Z`<%)M3h0Dt{ z+7$C*@T;R=E7#IVNd2)*qR9_-XhhJ>sc4D=y)`&V0PPKfL`i0B1R(hntXx0Hhb|7y4{JAN;9b|MqYdcf^1nU;BhZZO$~0 zc1X&_A|oj#R@nfoHcLe%G%hH1A&yP1I=g;>I;1C~{KP+5+W_%X3Q8OSDQ0sSnG67t%_l-T9j&Yu-HVO-0=`O)Z%_>XXfn5={^h!Y5OYrPah?AD; zVrXkp(cm46J&ja7WX43rfslOnrZQrTlfA0E{ga89ore&H(&VTHN5XY%-vpH%_G0fhReQ4$3UH$p5_@98mGW+mxk_H z5i)~E>C3_mQh<2q^v-*WiKs?8h00H#UVZxH0+1N+A9Tz7-+yyoC%#SVAfY62IHJ2e zp|#jphzbYN{qKgP2PFWC1S68hzzwcK&u8+nkhlEs4=lg?)gzLSuy5-eL2uT3{)qS0OCh$(Muwui%exLmknZ7u7>8MPiW1Wk7~OeXjI_1s71_b-J*jEYk&a2 zbN~~zINKm)ouU4op1yR(m7DeRTQ_T_h}G@w%&vFz`rB)_Qu(mbOEAbCkFOAc-(OM$ zkef=U)XCax5rAxbtCcZ8fmNlcB`(RCXsu-fnum2{jOSbx$wZ2yJmoqiUKZ}TSv7f1 zqZhHqyO2N7v3{iFo-l$S9F-cOg`}!XOYyyIQSRKEGUVDc-80$CB+3lHN;t+7x1{ZW zjFh*F&G0v8>+8q}ZV=-F@coMTta^R_>J45O?^v; zmKdcs$G5R<*h7pS?Nw+!$&HAx01i^x#$oy5<=N?0`i$g|SMBvE%bfj#2iCLQF)Ynk&RIl(e8eY{43MIvMyKOR$IZq5p zI-@=g^^lu!LIrB1ZYO+;dGO~s0G(Id?AJ<_XqpuUImKUnJYc*q<*x5Q&QVaby=jb? zjREj^BR}9_jy_s^yX5hyVe9r)Udq0P{mj`ri)JTDI zlDl~1nEvxo9P3Z~Z~vK>LgoN`|I=r{Pl2XC=?5HtZn4A#N?A(xGbhd+qdy{_$>*h& z05Gm-o!li#AycEMB54k5O%EWOQ4@`8x9BxEI*40qhCaX-)STa3v(KQ_{tD zfrNMF%(P}gAUS$mLqB9dQVeb!)xd?@VW-^fcQ`{!H*dZq|LV%Ir4hz&xMGRs{csiMmXaO}tDjvQ@8bS7dlk+I@Y^p4(P)B0BrUfNimI=0T(n|! z18{0tn#diFDCCHbIp#+g12_=AUJNawQpmEyo9t*g zMXBSITb4l3q(j6>Dl}D2o&-++AmpMoz8e55FLr}}ihj!8E=uava{iA#IpaKy7!hBj z<9-bH;l$obBvV;cj*U7KQb|QPn;o{++c^N;tncRGwqp*zyF1cKT?0aO7Z-z9jJ=m` z%@r}YUM{xV>g?rNRjv$jFrrBS2&-Rg8^unNAL*)FW;ixsq#MH#F{?sCZBqbOv|cgS z;nr191oiG1fS+Fd{lO@NHVrAUpIKD8r5p#2etBYT9MCp}lV&QCcz$LDc_zH`&I8jm z#?U3%YAeU$;5xcP6LJhdUIioWX1A`7e;}lOdvBIGcft2#z>9xgJiD*JukYYR{eQBq<~5G{3~N4NzGr7UJ2UK5*|D>0tkhD=0*O3opDw|L zQ)S-mH3Sne3ZN0^MnE7CtsSo06)5WDV1K*PM$}Adu^-( z^F=EOG%6wKaELfQU;>YR;IUHSX1)eU40){Jnwn0LCWBnJOi%xp+E#cC0K9WeM4~Cs z_P1}oGHW~oTOV|C*^*)mYtS6C(l)0wVP`@)gs$$_8BCexvcFW$A%?MHret(vRnKdKGw(1{Uc&!=X!OaIBTvBzAcW2Tt7pApfAaLbpq360Dtbo#q z0&ja&$Dtyb6ZwPOT$N=J;vMPsZ{^U`qB64M3^81xyTB}t4h)=z z6DyrHj@OYYddS0WOGBQP!SaFUUFLBN=6+*8f?GCna+p`Qq-3r*J$hC%v+X0YiHxek z!O+PUajbC-^f0uef#F7_Tcz;ahu$DFW9kE%bw=DGM$R=;vvu|*Aoy+iMI?-_7C1OE z>cRu#YBlpSEYh2n({8mFK~w_2UXOt)y|$kG1wLQ8y4brY(JuR7RCn`qyo2uE_V%pe zvGtSFG6Ax=c~<60&av9dibsl|x3}1vkBXw>O(v70?{+4W-QC@M9Z*|$ZOceH6vvcX zG;~IQ5$j8`TE_S7+6nb`lGj>jY28m%KOp7V?p*(k0^nmt!8M4_mTeVy@lglPU(=lL z!WgJQdx|dEGKyd_o8!PMamx9m)uDGB`;9a+)h1V){eV*d5@({4|2x^8xiT%psV`i3 zodMORnooW?1K_LG;7cdX2rIuB!QSW*r2}k=e_AklzU}j)rs)|2GMP#B-q2*9UF4Oi zq>dTC2dU1*EPxo^ym&P7y^Px^ED^DV2VCnV>ms2U1WBL8ITz^hL9&{oGe-3Wx*rW1 zE$#<33ec}f3AGr+RTxb!k3pmdpbtF61w%v6f=-#SE)9k?d?zqiy!HYeA*%;d#vg12 z$y`{=OrOmSHFOy)EeiNe&8VC7b00Ur$!6I;BZ0Exvg!p>!!064x0@`9rk~m-1Hggt zmNa zyw$2Yxo?4b(~{%4CSqdq@~?k21K`T65~8*hPU|27z&EGjF8?0`(g(bB>3bhg81PJ% z2b}-(x+#bc=f6|xlphm)00cvNSxRjfgjKs7At(_wcwh=ww!2hbJ!H`hjHXLJ&u%rp z4&=Jc;qA;fy4+p*4~OcRI?Vxta=Bv5$WO1B*zbWI6!{A#5zP z`wd6(-O_~`N|S-~f-v_HYrTHbrlpl#GNP{r#8F&Qbg+7hOI#4RAbo)w($Kddk;Y6= zXbtY)DV94V_Sj(0APn`zt1?@%w7JP1`^J1#0fgPEgZ~rkcf9v-eB~*x@uTq*;_&bY zFx>rjS+DE3O9~_58pZ%l&DkAk|IqS&yXyEn=I_a#h9Cdn`uX$crvUu30PwH9R%sZP z?99^#2=&7u4VmdR<^$U|Y0JBxx$n(^wL&tE=&{!<0O zSu?`QD*$|h0o7#iNhRd+MWqfim-t=Y5<#7!P^BB5X7Wla9Kf4sXpQI~W3HVg<3uFtjtuuEb% zbSYUMqd0+%vu$Xm9XEPK9soQ+Q0YuX!zQp&1TQnQvvQzzT*M}~Kic`g_PM>19fjEeU&XY;4?JUcP$v>aDen zCH|Om+)C4LbsJSN54(%lciw~1CHx+ZpT0QWJ3fB$bSyX=KiLyH#B2) zV($?hL;h+nv?H*)X}>p>NCg1zC;;ALG5GQ0{}jDe1V7ud;bmr0L&iHgw8E$XPld^B zpc^OH*Mc&FC+LI*(A{)fSyNi@=$Rmj^e3M`fBEv@;J4fFzdw^kn5G2ZV8Gu?tBYd5 zn?F}k@Lwbfew6{GTJp}U5<(x)h6!etXwYgW0mVX`yiD`3IZ`1IUNqQm)YQrdb}~n# zhI2R^!YD*RX|S^(=~n}Xo9N@AxpVaB#U9S_KA+$Yp(xML^nmSEGtlh76M=aNhrzps z!F_Ie5Ex0<)0$eREOmBsu_Ly|4cG_|f=;g6VN>$2+@A=n=}hr}!>H+Hc=+D3p_^dh zs7eNN5kjU_+&*G+T%O%rRaJzr>7_-k`a8bt;2)7Lvh z-{GV281Os#>dPN~`SnLfM@RenM=z#ycm;HLxWB(gK7@xjac_G`Dvi-F$CjOzxgXkg zt@42E#)kpEcAbgn$BzlXe}3~}I?q|lST6l4@s|@(gOcmkG$+}?419Dg4_dcL_ zfKmyW&LqXm?SVwJywOYZ8vcP5v|3)Kvnm!NmdBy1$=G$~mQ~V9w2^F_i1obiOuPAa zGl)8AH|Ju=)t#e<564f(SH@Saj2|6}XS2VzPtQiM$kVu9GIW6*MC@%u+8{NU6S4J* z)v;I`=xmhs5y0U%hPGj_>o7_xmTmJq&{kO&i9;{yhV4m!X$m81E7IP6CR_qUS1Orb4Esh26gMKy{^j}OsmpCt<^0Z+4m z_-JkW*0jzxtNBU;0&VZwT_q1(&(_xf03ZNKL_t)ego>8=Q`+s`0^Gi$=vDr%8mL72_U0B;w z0A9N$O8Ja}@7-fZ;6MKRNxS1~oHHtNm--0J=_)(d(T1ZCsKW`Y=?^)+k#S*gSp;-T z25HKUlGRnp#@aj2pB+4V_U!>ssNxQ_EOVNOew_i|KB2&yH%|tGRVhvxV3h})&Ln;I znapLrof(>_mN}tQHj@8wbv2=Fq-WUkCz$_{6lq3i);nq}7uj-#C8e;1Wo zc9Tm<%cg-4orDuo(`8u@N=gXiQ1`Hhkc)L_!G>mY=)tEz$Thx2!XnjSVQqt94}l&E zeV_Lm$=-e;wj-Rs(eu6U^Zq?=#iq}$VdnFSxGsbP)l(s*M?6XQD}{U%aSu~5C6{19 zMyc4!$!@6-sA*^P!_LmyV2uwyzybY=kvPGR7PIW5!%=aSIA0NK#BFl1!~_*Ll~mJB zeKoOA{G}VAC=f_AT#OzEVYwu$P|%IkHm4IcGe|+==n6XtWF!nSlVtGRIfsH@nTUmG z$P|-DWbT4OzNFCqgklsj=q)dY_9{oNSIR80*2t8GpmiWRUKoH4jz1cr0@n}|>X+&J zZ%>PDH$=4qNxx4&MaKCNd0#Z`H=$gPHfMq#1s~Nix!WLQ$;s(te0nT!_lsRCL9DTrt{IeTem*k z`tWZuf$#s!g*X&K#GV@D0nY*OlZCT}XygHbzi&Pl%?L9NxFB5cRWTGtCUC(BN|hK9 zIWZ@HxlHzm0!PG3P*x)2B1y!k+7xueft*_4zl){@!x125iHSyJ&MEA0qj}@2V*;Q! z`{adRgV*eyLn1vyI^%Jh{mN*R%6if<6+I`L%KP)I>;*BhXZ{ZpeWtO6RAux-c z5(H5|53|L~R3x>{L5>m!CPmp!yKPkFie8wH6p!oDEIp1rGD!csCYmdxAhva{O;){4 z=qpS&mqYH4)lQMC6A3_o2UBs2ywzN+coR;z*|aro4l^9m!69jk)$&hOdj~Nt2jRz zO3DDp2Jk9Yh)lMTp4WNG2==U zD>=t7jY>UAzvUgd*xMq7;nB%p3c%g{qod!SOvD+_kjU0?u*UR;z_^+D=8?8)7ffPx zt7zHnc!`F;v(4#mq{rz7>wz8AV=FO<6M|5xXhk&IEzL3QST+I|v)5YDnTu@-YhA51 zTl;2lyQ!3rsU~ORnmMkcxXbm$l_t?UUh2Ub8@v*L6VO=_kN}8Zu-$8l?_hC`=A}os zr@aQ*c+vA4x9>K2=_-Fji+y8jYhw|6wJL}hQq$ws`s};#lRY&ttmB+dyjLy(~M?ZMZ(d8Uj zKnCE87jNG`6#x|alqd=R*a9NO_fy_U{fn6eJm-R+h?%6>P+Z0V*Bz|Xrdvh$adY%; z#??{)m#d*OiDC`KGz?b2Hd9p&>(nQc*55Y9ZuGa#E#S zqWhZIHaB&tK8ErfO#+FPwMxEv>Li1-?@Oo4`u4nfzIkz%w>q9x!k zkRULTvcVrs&L=Sp)?~>UQvg1D@#6i{`{w|7{r;~q0I~(V_Tb5^9}pJsk7wNoSr8(o zGS6E;Zb)6w(AqA+PAE}C(XSQO7wKxDU8kLZ?`o-~K#orJO%nr^MBBm=g$_t(y47l+ zJ3?2_@`(Ztb}|OI``t%3Z+7{C(#>XKLuYCd35mNI6ycf&j6}ATNXAn5e0Z3yCaT;i zw&hMvrr_1^bCyepOT!p)iU6RK>O>Xbu6>2>s}T@~^^0@0IOaY^pbvQq|RB)O4f3~E}5(#W`Z+8R8|KhDBhb^J3hY1S_ik0ZiaRs zY~`X*^D7k)xGc|yfy+t1L-^jo0KT_3gnirV!{%*^!!Q)E>vskA=!@R)F__F0elK5+ zMKA#g;V2}>(8>Uaa@-jJxg{EXtU2Dl#l>(9`3?h5O81F!;U%|RE@5D}t(lme17|^H z0nE$79#GwgM>7Dv%>bAQqzVH#ljgYg0G4kikh-2FqQBvF!3&uMeDcZFe=!FRmWTjC_xTn)WwDU0_|*o&$q?B7{IXC7NM-Xhb? zXduj&D1q>~#9Q93tUwR2DY7$7{yi)AGC`q>KM|rEkG7zk#TJi37p}L}34qPTFo@=( zO{D|)G4mtmdoX0+0dR1=XU}Jwt)DP_bh`cF<6{bl2LgV4_SF`&7*)yl?Eq6+JQeqK zCQu}z;D-;nBehmFEh*8s^v$H2Wu-8YZD2Uq!YEm_WTG=oOG?!!^|J9n%YdwT;-TH` zDC2-L0HPGfKKK6hGXQ3LYS;pDDQ?yfh_PU{fWO2P;jh=f_+tIec@Fqs!SyLDM`Flv z6-m`qZoXAa+m2m+hl|)(4;@$6jw7s40zp)hd^N-xKuxyAx`3Q6cSff(3b-~nT|K~q z6;BsHoVgp&oNd8w-b|4=ndV_(68Y@Vi>E;23Cg5|L@)7FJMRh!U6q(2k|`PyB2-8X zoo6|eD44@4BQ!-@zHgA{C1Z)*t3>^Bo|zBIqR5e1G?rWw&KFBQSl2#NyJrJPc-z?8 zVo}O$AVXM>eENL>z-@uOz3Ep> zcY4DNh(An30bsnJr5<+4Bm#@O`@rYv$q5H*E{3@vV(+?cOsplrx?X01dQg#wYO8Zv z)@(q&MMwIJNNyO&vSU{4st|J)HttdeLZtrCYJYh{ELISvj^)T<(^jr5Wic?n+=Lp! zm*HoIYKLhNFahd|$YzVrVhUv>zS3$gM1`sO?5JJ)={BgqtPdD{%X z!Z67WlIwCrz#vOzW7>emO-DgU-hzV4K_d~7AjbSo4K<)Cl%HcW!Z8zk4uQbiaYslD zz%~QM9$}N81 zL$U3Q#*18(B++8R)U7Z`X6ht7BM$}MwHoGWYWmdH{vi>3{{6FjlCUx>(!&Ah$j(UB z7aM2busJRCN^A2MK;iB#4xcc{0Yx&-i;FuE*;LIhtEn1y5Mq8S3dd54nyMphRPGGO z=OF+#JnYi&ED|vzB>Q|zRa_^V7jb40UqMby?)X4~m6j@V=ts>iAJjiZqvxT=0 z^mf?wTj6sOl!!a~e!n};eowyp-^r&xyk2i;=$pg@L{h8f)TzIVeXUpK=H^cP16^_C z1M--B`Y%yBEO^XoBW`NMK;3b&oDL&YX&CVBooun-b0$E;26?pIA`MK&T|*YuQ;z~r zY%4?<26JLikwD-(E!G8}ku`tsz1P!oi~%oxv$3)9YU34y@Z0ATG7~36NYcx72J{o8 z+=P>hGEzP2XrDk|>_{e44qeQ!RD4BKJ;$yQ1FGdR_R7%-TbeE=&)JP58f2}`E@1nW zo^ONhK3f?HM5zJ!?HBIPyrjgBw_on=?!*RtXL0901b#GBM}bkV!$Eajr$7fqKDBSz zu3bYdUpTQ_Hk_vjlAmc|E4xvm@mFbvb#VpJ&1s9Rgfy_bsuf6HTt zB=7Cb)ANa!4|3y>>lc$>b7hm+Z&|?a>nAb%zWTwlXA3IHKt*9u?<#>cB^Cx_YxNgj zT#*1I6@rpz^f#x&1pS8Y`x=TOO~opwiv<;9lpU*K1)&OKi%-|ai~yx()4}=ZNhP=v zHfhYrUB|HvzRNC(Jcx@+4O1p#Kq`^OPWSG@Q_$dxg%&GwF9)wAZzDnN>b72 z>BvR9(GEi|t?#VXpWT;u6FzqPz9KJjede1n@?!PJ?hiPTfM{;*FG~cHZQn2FIu)~? z3X4h4L)V&Xkn&c1t&SQ^*KizP%a~>dc?-UZ=3pBGI2umDDIqZt8&R=RdZ;om+%GGg zD_r(m;YC{Ujw9hI&fclcR>j^y!HAg6J3d~;gjB3vtqjdxy*gVNMz(jbuhc(C$~TuS z62*`Uou7H_?eEi((6zKi&V;CXArTV8aFan8zn$zB(qE@HKYsZV@FVmQ{JxHj@6$&U z&lVPL*dF=no{v38w&j`H+&_QJQ_AP&PM!K0+A>)M|KYF1fTpP{PM~IV*LN%XLrx_G}2Mnl`CM#U&<(U714SLx75UBL&R)R zJx`Pu(&3g-7$|4=s)lIoaP0{D%e2&a)*#Dq6sG?E+4&f3!q&ji5wHEB3y_?TuV(Xr z37gZc&%5{6#|{wKi1OKNncfJq*z5VIWyZ1;aaD5(mUMA#4I6Fjc@}rRA};#YOtHxU;xMjCKISeZa8EFyvzqp5OG!=CAh& zee1{J_tm3?pMJ2gurTUcj;AC%gN>zWod55yuE=$nSLRNjF`XBMa7nbmqiYTF;Za3G zJm@Q=ToeoCn{-@wV_l<|?JFvo?$y=RZd}Mxx-|{G`l{zC_AvnRo^*)c+nkAO_XW47 zv-R|R5Sw6`3%>W~o(Ty+e3y;qlNT+;q4PCT0x+x-I z%_YHMx=L>@8wF{V^T5dfi-ty!UUXBo7j%|2pG5FtY=Ott*Xs4=^t{k^&Di+fZzGY> zC|n;9-?Z?>oAZJbr5pao%-gmNrcdyNK1I%bx_}^<<5?I$gG7_2DjBQ+PH5$9Z#wK~ zkmlw7|DYHRmPAQuj3|iN{=s3MX3D#05&7fWxLBtu0muy;!^5a$F10TbB?IHPZr$NU zTw+KnSzWGn85E_?Bs-!Y41$NnEdf6f?nJbciExczxX3VEieX49fA1N29Rx!;L*a+A?`j2p+6Gkz&ABtMc4?F z{B7sIfqVPQ9r{+R&CLOC|y6;#+`LNq~dwo>XJzeWBZx{Sboxm-3ZM1`>M zu&||)?HvRBb|I+f5-2g~B?ifn$j&8H>=7Rv=JV)TDddlB+7P8C%Vap90lO0ykXapL6khZ-Dbe` zoflJQg=al2Brs@@;IjdE?Be$bGOHlIN-HwhXDBa@f$M1m>(k<@b<;J zVMS&1`#E72qccoS-ear)Q8sbCqGKjPlH<>s<)m{t$3V`;>CGlN-=E@Agoa@r4nr@m ztwID#Oii~V{rB0>5XIf+G!%+JR-`nUmjdJfiSyl~t8FI`Hu$w}A~Im7=vY!#?^spd;z%$FYvI*hXTuiyb+_)>_gKyPmLwM?4lYhh&8Q8=xyW7V-sgS4BUxbw zT5OjZ3q5+?|L4JhCF(*4+sybpEs1V%k?!rUn|k!y5aLo6_)D_JMn6))WLnvo!&|10 z9cB=N)5T0?w2~1rO!5*!vIs>h{Jy?wADaWGE1BJqT?D{HA{39NQtjTAl}i$P0l(#C z)n>Xl#VDk*z5&CT&*WLFv*BEG@Fn^K{0=jB_D-)q5szB@o`3NqhP`idx2TBQ1=d$cv&{ZtUZGFsfDc}us2pwkcF$=bK zGy#yeP?-RaH7z3?V_}57jl1COIpB#p0P$NMt=c&t+As%)DSZ0lUZ2}+b%dN2{XJP+ zM9NEpnhTrLl+x^P4`6z+}0qu3hr1>>QVmQ@CSx?%Aq!c4sgUV8jk;Kn21;=a{p31*i9N89waUqF#oBDd(7zKL+9+-Q(`Dib%IUGJc;Al}i$Hta2@JPy3gIR1h0H}Pol)aWR*h;h1 zeI~=97$f52$61G5tdQs_mX9CL;6L@HGXy{^YVE@Km&)HzEY>+0U72mf-X(0Bj@g|) z9suzSgz60LbJ{TEoeY8@195F_?S2#d4g-F83Z+6}_6WX!eUT2O3ZJHHS}O1^0T9aw zxQx4g^a22=oN6qJW>DNSaN(ev1{LS=sNr&(c|EZ+npf*;L5~eUanunT*>al?zSx&q zn*a!$$u&VL7o1qeRbKW;{%v_z+I{s4k%wMDdSj#_w)h2Ap}Y*m2{AH23R$7-_!F zOFKsTUaBL*KYAtp^0Tz>UOfp!3|{2Mo>S&Y>mbu^dKwv_+zA z((dJ9bSoxDy<&99iv_X;Bh`n}w-=WgwsuQ17!?51Vn@@T$&^P?lmMI6bA7w8G1K4I zi{VFGXDzj|Qu`B=--8)~Uk87T}vQnC3xL2hk*QTo&~i;TYp{N6lO zm@R?*3I)Vq24Kyy^qkM*=3VpKYV@XgAbHX0|hS~!YLFQe3s7& z_3Ug5_%-M=>i#e&gs%gGp1z7$JJB;La+?*w;b^toYYBFy7p5Qma`5KC{c0UcoNDR} zco_^RRmkvw&4Bhk;NJ&cdnE+dZ<5}+{6#jX2mD?WlGhMeOQoWrwzvs?ap$qO?y@XL zAeBn_QyNpC<{C=$^f-fjphe}qZsmA&P|Fn>HOR=wcOBV|DQT~O$;P+Uzw$ zf?usLI6JEV=yhr=5fdaf$i+gM{>=pzC)%?ID}fij{>PmUKe%%Tqd3dyz+1z?%cna- zZ9BW$+To=U^hKi~Dm1ZnZ|03+Md1z_n-zv(xoR_FQ2}sk;n6RvSB|}}R`QRDQ;h;3 zvEe&cCnmb=tE8?503ptC;B+$s4)82^Vq)Oxu}4pzxuC^t;_wmM*h4{AAeBf_s-WjE zp2J2e)``0#VQ&rse-0;vNdnLg#`P$Mi#~(0MaNH6gUr}%=*3UJ`)=d&si|dby$BHh zPa|e(%I*M;H9h0@SfD8h1Ohw5QRIC7l;4?`t4fv}gfp-e#|gbJ*CH97Ebk?G*Q#H2 zQId6gEs46UvMUK7TWn>jHWfhc9_Amm`7|5CRe4aC&afT~a=;!cfFs@A;m8kXKb6=! zvq&oT#uF6r;WxRE8a5PkRzA~s69M&{ zodeFz5gBZ3Y;J6B)`7UpQCB5^+Y1sYi5YQCFdUyBE8S}(fooI;clX8&!`(XMiKV=5 zahTQ(hmRs~t4Ge|TL>#j`?6O6n3OAX0brW5xpIX)28(tYs8q%)^2w*Ks^`vCP>-kx z-3Jk@avzM5GQ}$W?-bB`ckPN0rzCzj`^R;G9~B-;YO`v5zPaBi`=$1DT)}Yp#RlLv zBJ2n9yFc>px4-?>?Kex;PE3{nzQKKij|;;$AHIJ2RE-%h;DI5PWrPP~7-O5#gJBAw{=x=h$N!#~)vG*fHjfC_;03P;r^F}*r1 z0NmPI!1H{I$nGyUk74-M1i*J}ZK8p_uT;V34-9WjFEomfr$-{pEi&} zt7X2K`d!@I+=G$L4Ss$rZwP=`uY1SsA@TN~)p0o9QOY(YfiH3~DuTSa#~qBue1kPKA!38M+p)+)cxb3&GQ65yv#*{-#j0=joU>RXMpqd%&&>#ZT7

{EjraGzlq@kqEGB0aiBxsw)ei}PwKdK{L46CY?hd5d-iSO;LeBtZmTP({e} znT2WkW_s)3m7lNNeE*&I55AHEicQGtujYW~yM|XA0DS(481TUGaPP$G!pk!+f63lx z4LZV+a3J6kQw$1YIG5FOK?qvWkKI16-(u-TdCXKQpkYZh3d27Wt_MLXSUk_VZaukm z>&c=#uK;llK%CorAwXnuP z?qC2COSf>lCE3fX%l#698;@jrmC>o@8=_lUoYS%MeuA72o`-vDFZ6Iz3xfs2jQ<6 zdPFX*=6RY-$E zMz4wkgUg&MoapuwU*2`h2hMUj^XnTi%|SI5+XQW97<9%l!QG*)n&X%N5pB3oLA* zOLMe1Y9S2aW$Nbi&H21SIQRkgk|E2Y)oUO`;Z5oJmd#fEZff>Ab?wr9AW&E$h!Tes z=n;thcfTVLfAN)2px@j^+r>#aXfY2{wmZoQTsW!%3&IsrN|Hacyux(B>VyX3aC2mi@#lvCknn>aFdAgW7+)IjfdA+5*o)rS zXquaIq4>ea>bw2jq^NVvQrev&;CA|Oq5w9F)_5KKZbTyg&KVwjCD!Gt$I!P9@Y_^+ z@WjR8D@C1Gng+kAsPdr#n)OD#F0;^*ZNS6@D~aA9ENT+{sc@;%i{TVIPg9y;e~>N0s;_cFkm_U*6nK)@URTP z?(vE1=VoTd#{*+yV?#qjp`p<9{Pg_X!?~_9_gS~wjRSa`dfeE;aubzSp)?q*8w;~j z^-l1!z~(BgIsnwkXjNFU((@FlYP~~q@3(RQ#kGzg_E+{Z4!>oB`15vlOk}co^@bdl zC6py)0vDE+zzyItGOXq_MH;r~!pU|Jm+)GpPM2on(#$DT9gia}?KB0(#{51To2^R0 z1RCJ#B>l7dah71MhbbVoKCPvzQd0xE*x}|>ixj?i?h%}u6~gRIlmh$i9y)wqKtECS**^5`0XrdY1vhBVfe3t z0)qdc&raW%sluaI8JiHm9TI@F8O%l{?c3wt$1CuFf<~$10YsxV_w|iR-fR>~J~^xy zRHs%anO!j-nCt_t1&~p=0_%7|=ZVH$C0k$tglrnpmx2=r5Ptbll?=dv@x}kn0)LB7 z#|{W9G=wWU&sG^gShlAW$7ypoGESkvB2d$7xSfNIM>A4!jF`rO-8rZdL7SCt(1S0_ zO++q54#B##-dZJy{X(Q7f`}-_+Zcz57;&u=*c%52Mu**B)OsDC1>}=ULq`v>je^3N znt}lc5QyjAY^*1^P2>>y3t%frzp(F7Ek+=I?5`HUDT4tTblCs^`n_z-uQ&=$uu68o zuiCcrRrLHI-e0)=!{j~8s9<@0BE%Ofy@|v&G4^Pq?Z$Q0??KL;o(nOMzF-9?U|pFz zRu^pS0sI1ujnBM$TlNkPR&|BLT{@+s+@aAbO=guEeDbg0eD z&E+}V$mVnwtJ#6A1gR3HT+bQ#Yy+>^bREb$BwsJ#@N2n;D1rEd6!H0o!Vyl&W4E1> zIf3W}rmAtrhF5|-YcdtQ70VGaj1Jni(QElMRmz*h-@&#^l!Ol{oCM?Bcb9z_3BSr4png4_F^qEInjLhxOWj@Jrk;!Ml?0mhwmcn*`ky`h z{y!hZgTddsjZ69^aKH<-nxjXjrcU?%__x*_I4+ZXz}AmxPQ&GnlOO+mWDLuqK`xb9 z1|^48SZatUE!jHUNTE+~Jd2`y z(=`FW2z?!*@1GRJuag8(4r1lq1!kF_pGFGrDW>95cAJUS7ikTU32m|n< z##;aOtvjFe;(;mlrm^HRC~Utc;3wpr8GaE={Jr%~RRszL ze7nLB{O;@-9KK?2+S}wOu>fx=G?zbTnwxi{jjBt}vmRSo>WcUFA%Mc9t_>S%J{j%k zxQqbax;k`q^kEEJTHpi(J&r{}$w)2C&$n_kOphj7Ig(8<&R;|`U{6-Sfn^~NgA2ou zgdEC&d?AG?xCZD8pA5(q5CEKk&lHM=joEzEeAOEpq>UBqEoS~%OBPFVVd@zMcUnVA6@fa9~@gR#9jB3j`nf(JZGiWm|fG7hKbp3Y^XYvMku za$52f22O0gg7a0i%Bii7E!yfn89H*ZkW;+Q#-1fLr;H#?g)z_o? z5rD3``hx|-+nT)IhhuapLc*28f5+&e0E1nZ1s;ntFI$I29a@D0=OHBdfc}knn>VLxb}O+Fy{$OlkpVcn zIPij=ff_D%i`s?~_%aNSAb`s=2?ZRVU7Q^r{m1$9qaz(RPu@I9pA7|3Qom>@dO&WW z;mOble&~n!^LY2^WA32KRpBsGIgc90C#5Mi1@2tz$$4<-5v|o6Mv{Px`~-)q6|t{U zG;*>yI8%x9S*%$GMJkS@!@jdBmEM}qWvHDBU^2xf?(9+oQY01{pa%NMtMgWin#T4& zykJ_%{R93$3UR6yOUhsj>?LdD_j`AF8cv)$hxoA@gF1lquEDTUq7Yn&X2g(f@JzOW z`mMz;g7}3GSGj`0s`@UBa)aTn`opD-7YDC+Tb>P#gy;g0e~j()Yv%E9jn@n)=h!?tS~fZ9M99aw@iklx4-H^s4~OMgWZ}qvbVT zo$)i70z%|~spIY!E5-JrmSwgiS?oUY5)8ZLCKw{%Bj1ev=FFKh=kam=*2u{bSfMdk zEF1v@lf1*IWSRv%T>2kj=O5GLdc|?dk0zAL4=GlZG9XhETtb7=@CSv|N$vtFbOA<) zo!%7aAGo{?2?=dlO;?JT{Q;zqtzl^h30=5V;9gl|K+U|`hy=U}Sr%t@r&G}>i-F`4 zmc?!7oacGpzD2G()ufhEU&^Q7bI$Xe=bTqBUc7jfH&Tk>$XV=MSzWE`3XDY$ar^Vj zI1Xpy;fqCzv!52kh+GiGAh13!rx5eE^sKy$s%$o45aR$vsv2VIq}&AVaZ%e&oZtm6 zjjZV2NglSZQH0OQc0QZ2pLiclc^joJry_o=Bm|zN*LQWC?&kD`NUUj16J4;JLitW) z1mnW3Rm70+GgE^#*|rCzzJVc!wZY-{hXFu8ri}<-gU~)8a7JviJ%v7t@No=Y)R<$Lm6x#Gtij0I}USC?t3S20GsAK^4 ziS+S>E}FMRBUC$h^oM<}_{;@9feVsmJ%B5miHx%~XY)pSsc!LG8HORbM-~G^CX4!sM@p)90T^Te(zs--Pop(0)8^&}lEddg#$j-mUydaqAb)Ry+uQf&+|N#REgfw)J2xC_bI zPjQGKf&``%V#~)gJno;8w_l-D;1TVVRE1itNLH$=5_s4L(2)u{V*oZndeJ2V&`JAm z?E@%zeBRsWfH>ov9-(cI4yV4`#?&to+R#^vN;`*=pw`+W}(B z?|b9dK+pkybuj?jMoeSZ1see9Gk6T1`TqHSB+-7s=epj1NC1Kh#`ahQ z;ElhnURZq3J|&ZJ7-E4<-9->X70%~4m{rJ%5oo^$74UdYej@c%Ov%X2O4=Jh{vOhs z)L41a>GfKC_9gC>n?c0s%RQhYoQL&+h_pHWndr z9A{@ahZ2lyV9!$1aoE>^qsO(>d{>#5s8nWB)3L;=vzZBv@-k-@>yZdL`zo73>!d=D zK3ex<>wjGs1)={X06W;A>1G=NC`5SZ7uuTXiPd*cb@EfCQ#}_}e-%ezXg7xV&~E&q zh##aKaKrWIFk~YBdWR$Is1I8m0ssj18UXZ6dzcyE@6sLL(sz+@NHb&fm|>) z2gJgB-`5YZ6yfsKxmUwdm4^<3^_dO85WOE{7WUb}2waTfVo9eni%a=xaKwz?6nevo<819nyf&;bB8v<*Bkx!PUb?LIRJ`_bkuKIVh?Ymc?RZ$Hg_uQ{}py(;y!8Sa!$_^~ax z9=65X)45n$@#9k)W<2dXDPKKbf445fFAyEG`Rl`els%9?fB1Ld77#wG)lm-|Vg*Uj z;B~>(ZF9Y5>No9S1bP=alpMwSJ$b--Zj_L@8iF={!8xpnHxWQY zuuKq4D1~5UCYKAt8Gx{?_Si|f>|GoN$l^KNJ5?bB3o=TQld(@69*xL3jz?Z;|SDlOU(ju%ztavYmsn~Pt zt~v$c7e#)K2q0gE0RUA9Aa?&qd>aEW$QGivpJZQp`ehLJL0UH}^$4M{%WDTPeB?qc zUOR0|TbeYQ>3#slQa<+EBi&hI#GOKH*vpoNBlJeTuG<}ye_4J6|X9E7=Q3#1a$ z*pxd~8iNUh$RC(8Qz;yYe^5fr!fK4^Ig>k4ZadvPg=Tj<0$hwri7^~!6#rOu?1qW) zPP6-GpNH@7*B=l2fe1*T(%0|(dH8-FusS`{l#Ns6)VjmG-;NaU7Z~gIo*0+-LjVVH zix!=C42lKkQnZWmCoLKbh45d}w)cF~`vdYQNvX(6IogZ6{(0)yU-)#o) z4ya!v;uptWw|JL3Ztoh3*H0$#R}%`jsFT*~1pt?UKe&Dd`o19m`@`Y1{GBV2yY1ky zJiM1K2P6P#Ho~)^)@^f6B6&*rqxKU`rpjo|&CP#r+erujSVSfmXS!R{CK#MI0Pv^h z)?)Rsl8-Nc&Q!uDH#Pp8iP1XW$S5fkcxw!yBw{|x4g~~1vJ3(A0f4w-v5uqQVG(O} zVvipHh(?*|>m-@9q~XM}Gb9jGq?pAXz4zejx4)6`tE#F6ACUN~a)u^v>GK@)%nbWJ!>TBp)0f)EDq zdBs7q>Gb-?qFERea4owf^%MXk)$^egju3^ISsocio9f#IV8>m{Fgbk$pq!2ABmjLf zfQKkB?&Rp$m(Ci>VM;&ZH$h3#FSoux0b~p7Y^Y%q3<~H11x!}j;05pVBx0B#L8K3C zjm)9LQQH9ThC-oOQT6%F-m|kve9#B+m z%R+-#l(g=`4*^_7=Px$YHgrAi2K$SX4uC*Zzxsy7nVQ8!%p(C9XtO20drS(50Wi?l zF9jbUe;+Je6dotzf8pT-n=v1@C57+J0f5iqQ>ihztsxRAu^)SRQ)zy0x8K>noUKvm zblR38$^1%3aiwOp*l$4tQWXGRey%YW>D6b}Spk2?0BZeD`};waFz^8BL&px3ko1tQ zk-41!{`Up~NKrl5Sf6CAi8U;%kQ9)64Ospx>Ba*YMGJ?`!xIzVOl+M}xPTD)Vp*)G zn|#1T61}TvC0;h0;1EFsL1b~P2d6O9*I3hlS7RuK94_wRAU?rV;OUn9d_AsT)))$^ zwK!r2DOy=m)92^dho5Y8P3`sVrA;#JqV z2+wwzl^RDQikV)s>;i5Z=>?(`xwQv=w{Nc|C#M%&Q?+e;?19c-m)+h0|MxNoH)5e+ za4}&Ecmn~z58jXh9(nxu4cVB_`W4pqg6L)C@j9~u-nQaW_xGJ5t7e(Qo)DBjac9tA zfYka+$s>^UZ+{|gGSV_M!}vA;@hDDZ!Zib0tJDv? z5Gwb@La|sZxVT@*VIrBB)aRMa<=FI}nO#s=T~J`c1wX)`R@N58o7XWgB3-i}Y z0FI+wMgV(7=poWC_}FZyfX%dO5ew}j*Dr}838gwPw0Q}2(aejVLg+UHNR#rCF^0NJD0Q*O1eKr7ytx-=;=j3GQwsry7 z0WP30qdplxj7iV}^V!I5^rU4d2q0z!!VEAfF8oLYP_n>P4lt@70bpAdE1-N4g|=vA z8G*PwNf=JDT_z4E7s)~F<3u)mVYH#KD#{X=NGv3+CcW00f1uE)ZOP6w=jR$!*;JaS zG2-?N6#{tntSDxYQ!ay?Z|)TbZ6}2H2d|iY!T2Kz_|0>DDd-GoOnSE5z^pvcUSa*1 zJSoq%WY2rKm-=DmCD{h}O$~Kp=9!#7z%QAs4~Bxxv7VmT(HJQpUmmZsy9Xrj2wCAb z$z|F5yMWeL_VmGpG&DRG2@fFYV5oCJNab)!ql(b8m&>Ckzvv) z74W@WIt#{rA47&Nr(jbF;Ktgz;Xp;P^^C#?+*rGnNeYPWA1WYGGSYtoC)7Mm9cyiE z)o&^$bFczF2vcgsVo{`B7(hOI9Nxp?Dgf;43`<`+j2p^2!<`SdnP31=R>0aF0K!#i zll9OhaYz^nJ)G?5b~v34K?s*a(NHw#>GrtLIM+C85=pbhYSdYC^NXqtIi@^~UJnem zG;v*)sl|!_p6wyK+B+y;CwfG^6HFtA;R8BzVL-V)D;@ZX$-+|1 zF_zA8fcp7M_Etai{XB8EeQGE^)r}mo`Xwi4Lc!iptoi$|?{6K2hqc_{4O}GvJpotX zC@J8P#~&`w%hM+24gOS$)6ayyV*WP0@^oXbTVZ~|Ep2+ye(mNC^EjbcN0%+TzhcbtY%;Ca}$N6{oHcp4LHW;$SoDN4-H-EzhXC8G`<7PW^g$PaXxyb&($CZ^Ne(hLQ1@yf-|Eg_!pv4M;$dc0hrkY;t zGQZOaN39dw(5&hL@R?1<yU~~b?h`+rdtmHQmhh_CZVFCce91b1o^)({Xz#v{# z-2oL%0)Ze+pMNmFqEHXNL94#FAWN^qni!3CACA?y(laPW9~9x@c^hq4?GZ;EEQC~l zaOJ4%Wc@Kky2sl(h&>rXe!967i(Urgnd*Swi}wG6-*j-uZof{=MpM@Vh@U$?lbEc8 zs4Esa`u5Qys&szz=nxAatSQf6aa-wB_*?x?nM;0 zgyP;9OSRs5Nky}1{@U+AG<4n59gn+>s;msF+N3!?&c|?A5%?=}DIloEZdV*km9@D; z0ngwvfbxvuHU8wrzur06U3DrAAbE4>0|J15`~6e5xxBC-rzH*GWd`u`pRiD7W^Q6z z?F*m2i9=AwzlC zXzR98k{M){CfltTONiKA&AHIs-oY&d9l>$W^ZUK;ynn`SBr5}z-jCns&+q#@KLij9 z-b)lf(&9stvv9kwaMVk^R-K8RpOM&`z2b9i&08iUfJ9%itrsx^loY;r!dgr5%Pl=X z{c5@@YpLA@&Cby_>^`TTv_kTS_)Um|59oPDcgNu1)5X91x-Oi6$}H9T4K)Bg%Q{{8 zfdDjE0fx&El7B}tK(XUIAlx}e)4vvF`SBQLO|}qj8ujoVME>?iXrX|MxZ9wP;&tUp&qO$YTKjo*TSzXDjF`D%@SHmjd`l zWRHBxm*0N7zLjzR^8vLQ3=tap&k6^@A9fI&5x|B9+K=YD&?10hhA7Jc{ZPe94npql z+K#&SMCAm8VJU#wLp@4hC8yEY3LLnQT<2gJS3!YB=R@IBfez|@tX`dmL%qD$1&`kV zz;be-Dmi$g;E^LZ_`NUj*^kl~2O0>^H3Aft{efStPI4{&wnb?IC=j?DnRzw-p4=~W zurlh$jY4?thJJf4fK~A1@CcOq7=0%u5J#3$_umU3 zFwUv9dY1>X6V}XHG-^g$%)$!r91naX@nHd$Fu(=EeB@%Dl!>aqqp&>6u`pW6$qf!YR4;yRg%jxu@AVRGHUcLt}P06;YoOF z!_@qCcrPfRzzR8r;}vlCR~n7eX>&;dd@0yd$)zT7E1qmnjYxsU@Uw#88Pj}*XYCGW1z1rP!*$Q{7u zU`<6PtzD;LJq8Ez$m)zLA4>rg<~czBI=fFuUi5zR&M|uW@%c0ITp!A2if&R0Nr)>e zqo%(sgnSxELL8_c;@6_g{UFaODS1>M3&oP7TpOMBO{O961?obiGXluZo_1H2+IHku7|F;w%gAnPB>;YE)EYqaIF7Q%LD9|yuI(Ml0tj_* zPY1k1WA@bklhIHpR3Y2U@p4@f)z>#5j#(-y+#0Rd-qh3-@osLq+@1`H$U|9obcawY zV_@$1;4D2rK{7i?dYJ74ifx!0TD9H|`IT+JT=JwT;x0@9mjYaXgI6HH`A^ZUHv)iu z4sWw1OYSskwaJ8Q<*Y1S9MXuL7;_%Z81)J>M)0XSW%volZir#|i6d98%nDC6M+$FV z$LER^t_l0qrF%BYn#x{ni(fmIz6a}~Tp9|FSR1K-lS%ZNRt83EmmmO-^!2@2SeU~( zoVgnlixaYuY~fGn@_jw47-*GJI4>_x=(OJWPs?7fePF=*f`(sd`BCzyEg4P+{}jYK zZ$^W-O$RSw7RNHrbl=7lu!6N~aT~WvqXh8p2H$DWKk{%n`X1iGzwC(%Mp8@#J3j2k zW$EYc?)@qnj)n_l0RHyCEh&JI&oi0=4?H@?hr92~)*^O$lhf@)3?F1Y(LF?1r9}$g zyKW$c8AT3A03@$KNKil#w8VQsqzX8kYK{7d00y{9JQI;CAl_}uYRM&CtOM^+WEibO zqjB48Dst6l9Ko z%KOj>rS2sp;Wr@wILX!X4ITeSHA)3+rd~DThcP#5b$Y#C%~-X1jhOZx z&gEk=@uR;ee!Z6t?LRUr7nd9eTLcJyF7wXJhyiZq#XQ}zp~UZb$#7kLD3(U~L*Gjj zPk(XPEksPu_fxz2`XC0sp)SAa^V5Vvcx*#=aLkY{N}*FX6RS5KJ$jBWC578*;q`IJ zh8^10l*nKE)skVd`{Rp>ckd{G@RMt8)_ToHFJ+fvA%KOpe3KP7zcEIYYC{U(%k@oD zVY2IL$<@@8(J&-}sDB*ffcvlw6Ca9qP-hjoN2l&0fR`~_jLHDKwfR>WfI6dE4;7?? z1ran9c}#d+gI)vGwnG(Zs%`Q{T<$IRRwi>+l*70fm5GUg6v2{{-~jJOMFo@qNZ~u4 zQ}!w{LDGe(=WCGqQy-nGkrlz}Mh36zBv;hYp>(}QZSm-ES5gt)mX${ajJgH6qisKW zG(wRa<3HYe^w6HF-_OqGXp1z6-!$m7PCI!t_CTz~M%D2U!&QMhduSUbW-;CrXPF}y7{2D z8}}XT*PAKU@PaoAU^+(bEC2vg2{c(8 zd9y;CR?{ofD_Ia%=H^ff`{Pp(hZms`UVVGAJ~5K$n#@x8e4EufvLbn2q)^;H2>O=_ z2Qer34e$p5VjE^u&EibI03gkp3tbhZw!&hQOKsL#b!v?w2UL%C34;{FOCgM}m@q$(}18JvT?aFsMEfxz)7GT-6KA!`g z`ss*05?R~KxHDUx?}vIGJb1ucUkQeP7Ea>uMViNcNgq&5`x5`J7TFF!{vad^U?9KP z?SUc$YqVwtYY|+M&#Da;{2#Mg&AvQ(%1av1Sb=n&5Y(?Tv2!PUq0U3ZpLzy2wv~?I zbG@pBP!f-&Qb@YMkI6!WT>Snfs9!88;D?vYq`5Rn|3Cr5p^$%)q<|QLho*S~iQ`n5 zyF7m$6GNhfcOfFbJx~cxI9xy3x+}3neQ8Kxdk%%$C5G9<-zYeL=|Ma&vXxp`dgUst zn2>@}YRyIN%{S zgD+@-PqWkHRB?KZc4X(yot-V^3;azyq9?F9KjE&b~)L zaenHNBZntKRY_dlG#a?~h9-@^AL5tidCW7{)DOFkigV%|02rH_qX3pmgMi=4$=$6@ zNdjrjv()}eo6t8UEnNKiX-@>Zxq|a)Uhuo!ojHXT{sM*MrscIuB>WhU7S0+za=gVV z*H@K55!2&VjaJiK0}$)RXJ`AZ9=oT{99HSWW>2fjxevf;W#dEzLVU_#KMEgaLk|2# zF2~wfxV3O^Uqo{|AKo@q2^#i8x>~THM2r#2(`S;2JjkV#kM2 zjf4K3Jh}Uv07%R2H>JK0YKEm!w@;5PJ=)p=00lva@YrTe8ViH&&cR&##``H$1j#k` zudS3U7NUlayFmWlJ}>7h0o?ddY{l^=EhBgqEXBb9;6abaddL)3s|+0-K8L5y1poaX zoo&k2?tC>SorEkc$(2>KvmDQYZ{50g1QqaRpAtY&z?98lvvu`cJ^rg~68AkB^_+2R zOsg@n8jZ2a@^C1aa3U;qUpYR{&s?0BH6Z zj5_16jua!{e0Bs7mml|aFltVvH&_q#g_R2U{f{LDeet#%=@cG{jMJmIz4CxxA2@%0 zV_{?C%fpxlOzl^|nPg8-vS-}ZCw!9BsZ>~WqZ@%|XJi?(&uLOK!?+=sbF@2546fA~ z)|i|o6RX9MxGgjQr5#gFk5eBW+rcPhCo1eIU?k`lXqre&p$mBWVjXqwIRma81xo6{l{q99{h8k@omee0&9tA;4JE1AaEjDEKH?3 zi-Bk{Q1B+_XaJH(q!P(;=_25VrG8u6k0^ICfZKEk!l$(htT6(J3OJv^FA-4`f!_3U9oNLcCeZ-*|DY`1|M|2!G{rxk>>n6s@g#BPa_q1PVxp63m!m_GwEO%&KS|+7+mlR=kF8`1G!K*LmyY5f5|Im1zg*b3wXu3yjO_yu zf{+<{h%yriWxmjYZDouqvw>+rW31MzeJZt{V>LRbt=$HHqe4gD+1l#F5v0T%6BR^D ztToxK%!pR2Gx(gE3lY&(^&4;)>%s)^c@8z}%h-NKWGL=iqTj zBY+loBN){x1{c_&(KUBCoj5F&(K9|DZh&l>rWG*LQuPZ_zuDz14u-}Fm6KVVTuCRH z_gW>|7CH~4a1ytkc=w=HlAb5X70Vmt7HoM)?%Hi$-j?=VuDMHq7-c&1X z`E++Mne!L1vS%(y^3kb8_S(_`8NdS+z^|`tEc~#NOU|WYYYG6r|K{61skGA@3eA5p zqG5anv&re|&|`xw!x}lG5qqVK9=qMz(b2&oZea$r(PtQLAsap|WFjQkJWi!%nl)oB zpqMI;x2Aw1nqavgKLP-bj=m;WcO8cBzQ{>jke1TmkIH2B0oc-l8)U&%h0q-rUT9es zb5_m1R+rxA#3}i-#V99fAHna^ggl=T8-n>Kxz(F2HHoOgm_PXwVm4j4XBSme93f%Vy+ z(fx}QW6=vAc`*Az`6B>|pnwdg2c@y7mI1z5vLtFb+kVh)x7$qc+Jc?YnjLij{y1y;{ZL$_>yr6hoWU+J(Qzly8^AZqsY%WOBez6NbPA?6i>$1C}F< z$>voa1!v@f=$MetzZ#V;C59Ip?Qc#p!KJ}OEe{>ar0Wkt#Fi24M#6ar90W;YxK|qs zu{eXXtF;wwSlxtuPg0W+Njc9hOABcR2C~^9-1rOD_fY%cqXQGYM;}JW6Apoii{R)G zG;r`A1>@_36v8*~@nJoL&*bU$7<-h{e6+AetS{ns;zS^@Q>Z*CueeKjcezxJc_T3j zASxgQ5D*-F{s<#o3Lgo3x3?9s2q3t*eN0wBxW8aB*)y@byL;*{GdE|vxQFxg4E9tE%VgP?#m zH9US?Z)3Nal|JCN7gEI-czv|cBqe>u5|f*Y=PzGgyo>-|BZ-)$r7H`6UH;@@EC&Cu z4nS}L>356%P$-?W;6WUS2@@tGrx?zx)?jK7^sSl2T#Q+bJMpwEge5kEPS+w`V;cA~ zOn(>|0-)Kp7lep=Eg=NJ{Ak@pF?{Vl-GCu7NKfLVVyuVYeAgAjL`2m{3)wZG2m1i` z1#cT1$e}l=Idg~0W!4+?O&I>>Rw;iu$@Y>V`IqPvP+X+hhs&lx2@m%rNuhNxL!L7^ zf)=nlln)Agd_68@J>F1RQ94&r=(_^yH&;~R_s2DNrJP#{W;$2q%kZqd0s#;Oa9mbE z^6L?ver#>YamXe$$#Pa&RzQI&U??emHgWFUxm~<^J|h%*1)jW2NMXoND69a6GKJ-z zZbVwy`-9ywiqR1KqoUN zAslB)9(KgcX(&FV50h5qOqbG;R_Lse z0RZca9B7=t8tM&X%G-F_WMD~OlfXk5;%#?YO;+qwq)X%Kuu=$-2!k~g zGj}Ld(+uOMh3fwVU=4>Y?}2-GHC@w>s&)gelnWtM0LCHm#aVQ0%jfi59Z0r-HDNnu zj|3gOZ9xF==ogynm+I9vG?1;+lc~w>lP8XM0Dq@W0)TF(rGtRy_n=Ml;rU58iz4C- zln1{Ngfkh4S4MO1q;sa6u6A0k#p{I+ZqZ)IND?I6)@ueBb+h z`u@X}AcQC&=|v!=;Qs<(HHQ?#tCd1XsHPHEod#rhhB49&u{wCvNAi+&4XvmahyVZ} z07*naR1iiPcr!Y%{DGrdyTKS0KXpygiQ&oN)bJ_v{yLm)H}0EuS}d(@a)FelTVPs8CnogqY)~E1VAqVFd6dQ^?x__dzTrA(QoRgM`9&Hs0CTn3|bd8XNDtCt+J%OnVMO z@lQo1a|}H|6u=b*8|cu8fu3PW6_>%&_1a{?as6qV&E{mx7>P9Kg~N>|mMn^EKr?9O zd7~c02drUGf3T@q0kM36NtpOC$^Sn9thUPM!72|_0Z0lV0bebEdLFlY>ji-~g6ahi z_G3q?zTRbW@SuzETOCNNZ7-MTLO8l64&<*l)!VJ%=OmZSVr|kCP|X{O<)$(bZ>f)n z3R<`GkEwA(2dngYy}1;Kg}oBZJ7;o$Usrf@p5o{Cj3vkM*rkLL&6lKV0DbXfacBz> zeDPvyc0DTp@v?Mza(jC$^#IK=k;1A_gaAk@As4#$_n#FW6&4FXVPT0%A)#>i?%>0R zAy8}7LfM*xLB z96aP5&W`FJMo|900IUXaZ#EyTDg`IrsKl|ryO}dLum&A?tbz`c&$usGFu4pm zW3Y*>J3xC~E?r8I#Zz=!;fdp&lid*eg7u~N!3PWYYj1TqF})G;C%tj)(jcT>AzWzN zlz`vwTPQBH0EA%N7L?fLNIW!8I{w1A*1W6dvmC@8M*zP>Vqk1%d|+TeNhBAF(NK(9 zECQf6Qraty0)kt6>*p`UV<9o*4Yge!yl`oIclc}Ud;=@Iy8J*LOjH2`A8@dHX=(c1 zxk6!M^=6>}92P(eD^l32Q5Xs+eoS7&LwO{Z3s1~%zAC$a#ZnrN;PGSt!1)~5J8X%z z_olQML{&g1_<*?n%H%MZY5=s|lO@#()Avd)8)DTbln2Sq*6km!UGu6xmgQOio13!} z5CVgD*Rc?Cu!uf6dKom3;Y_D3PNy4u0{B|rC$w5kK{6AGl_k=`V&d7T8fkKY^ndeyHqDYwIDGLp8yPq^QxS z_F{{~uxSwb0}!)iv*JX0VWB0N%xs3|b2%vzCis2SGt%=}B)yO?DR6(21F8L6Pj_~v zcLv@Y7?_>yjL7Bt>kWABb+S0tgo?2Ki^C@b+B|Kp&PX>1j|PLOp2y-a{K4T{`1M$8M~922rzLTEodFEB zULaGARrU7|CAD!o*x$Yq2 zFx9&ZtN|SXyUvaoBt7dmaFLWYG4RFpn8Vm|fXg%SU!>2C^jR%nej5)r9Yz4Dje~pU z3rP?#h$@5#yow;D(5s|9UYvp$*(B%tg(I;Xs-KGAdg(|S)i1Tb|NQy=`}d!(?d;sz z$|P7V*B0{OF8t?gDT zgj0>JhYq`3O%5Azp8Rmv{9ZBci7p()lt~#vlyMEhP$1zAA(C<0@e-EjyFmTAx;ABk zU)CQO8&~loQ*O8u{Os2|`~SH7r#p8jfPr{6-;$V(DpE|usX-t3nu)9;9W4?EvpN5- zv(MI+mzS=u?fi&&LQMgagTqr-KDcr7(@(FUm$*1RJvY6!1R7X)bPlv|4cx+|>0d{; z?}i|}Q~``3fRTyK&u7aDSPEzW&QE0ET?9GdgbIKcFM|Dbo^YU3gO|YcfByQlHiLe~ z-KOy+t3x3&q6QyY@~wDW6GHNFqeR9g7Mg#l0Qk+zrop%@p#VaZCieFQu?&n$V|44e(qY7vl7*9t z4O@c^l&&sSy3cynwCOa1`6G~kc%x0?Lg?Vu+Q_JqtVV) z_M{~yX`00R&j0y%pO0Q=-v9-nFs3^oGzO7VYgh=CGTR3LQlr$uu*y= z0WjPi%)z(PfP68Ze|HuIL;%H;I1foghk_jdCc+W9esXeBCxuBEGEp?hFinFpYRnWv z(W)Nc@9NbF$@v?@tc%+{w!AtqHcX-pr_E+__Bx#apv7WgL;(3v5a?^VLd8aLF0gG! z2ongrAEd&r#SMc;P zrvNS>fbL-}C=swJlTDk=tAPgrT#NqSe|>Kt?Qq2GCR_3*UgVu|f?hn?3Q?qwr2~PV z+vR|G6b!dD=t@Wk37JPzifLLUlN*gwdXO?R1|L4Su)P+5qgaNl#G;2B7D{F&{DCkk zW$+u9LHMHaS*v z*2iGxR86r~P0xrJ_KuBW?ZN2yuooP^(W{pxyu|GG+xl(r2h`7}^=VnEucd(gDBs9$ z=btni4S>)-XHQ1sF&wcerr7b@AppWlI4!n&6k;3T{uRF2EH*PdIQPF_dVezWywtsg z8Qy+g$J$bW@Z1mgAAi3UOKjmGKKN^~B>bPL*xJzuy(jpE|=GK%4^kU7yt9SqsPH;NZ=&^$xV{D!R5*E z$2L(wjLk!Ztw?%n1MXW8xoK({>w^}S$c9k27tDp0fe_EEMq5Xx0)KYl$)@Yts(`mj z4D4;IAMVuVqSGA1CoGN`8mUrRLa^}1j<#Tkq|e28)IS2?KW61%()1vLWa1B=0nN3IYG+-ohwjfvpuxO7;L2v}q zfZZJ-K8r@L5RU^XEUDVQ^}^VqX3VCbU$k)%zDcGCyP9wj2nXi^ktBk`^P(i92`0bVG^x6}l1>zEoZr}Z z#TDoH)WUC9-;2(l*wOJ)Z1ZieWkv{(-yffxB>sByaV)VnvIibYP)PZc>yr2P_UL7O z_i3(PU#aY_?Y!`eEd61j6TsZXJH=-J;9Z;vH4lO~fBkwEbBMLwwUyGHkCob|2NB*M z+T_A~TLI&-SG+hSelsru2ntvrCYYwQ3=JlDSqeai0vg8M0}fiPmN8a%hE$5xITx9v z=Nb&y?SXX^E`K^6O-EZX2We6#{sqa<#FLUkC^in0-r-XK|BjJ#B8UKnhyv_=NCv*W=NGCSVZ=6p+_}k=!TVQ?3bPchmvSW#gxabml-RdPGg~un6AHKf)FgCHU z5Q^FNr8i9 z2QrweRjZY!A9p{$T}J>jB7i&sScpbnfdcN&x%fd8LV+mYRy2}MZ%{s`(<)QZ5`ZXy z3+^GWX#i`H8Hdx#Xk=5D06=NBEe`Mr1OjvGTnL^CtZ$46eYtPjkUMG-;DjZda>>p zEg-sus%cO}hB~c9XwAkVk4YZ-_3Q7>;sZ))z&%L;yAMLNEY=+OlvofUmB*3?;Ka(! zG-Fn)6g}hPV-SCU?+5&mbf3xX9v{Uc5CaOJ1^8oWZ2Uv5x6pk-QDS15{C;zN9qxCy zS`Zcqgxhl=e~|Zwg>D5bL=(}iD=}~Y11<-eL!4?a2K0l$=_@a9K#ED z7PFNq0N8kt_!7Xa^bM}~WF17ubqe4{)RRtc(O?GpElP?2DDF#Ma`%}`Ue-*R9nStC zTB$JtfUZ*jB?|3>0T%}Z1*2l2SxoW_CFzSvZ@0=8Iwy1dk{QlNmKekAl50I$zv zG8nu7ASPk@(DstgrNxV3w3G-S@7hc~*~F$1@@yl7IIF99PLLJ=oUzWYA_^n?k@T?ZlI1b#h+Wwg%TpDJ z2owTzAK%m(zj=EN?}BR3MEZV)BRSPgVk!ydSYgAR)<^;;iZDD^hWruKts%O)vR$= zG=T7G7KCW(^e7k&XR9YE?D21tl?-P#!F!SdcE%u{1OQ0BJH5`~bUHz;RU(3wsl`|+`3m5NLSL;pUIMtZ2dzvX|i5191({pLZW(DJt;!S?J$gt zdWs(MAU(t+4wAtHVe7$ICVmTy;y25_;0-f_5==2FbzM1lgA@veW>3Kn88OLTHdc1d z`Q0nYZfLVxYP*dCCi&d&`JVGTzjKH_NPFQ44_z9CF9Uvf!vr*boQ4xbmnd+0UNnso zfU(Ng@RK5S?|^U>v*HBAwF>~w6(0S)@#WVIYCX9BvK*!9?X?wvu-0sXo5PuFR1s86 zApF-cSwd1m#1Z$@x8D2{lV6a(dVL-U1i}ul)mx`CQ%j(LF=`I0BtH10`mns+Y_|dJ zdb2)Xk8T5m*^M(HP?(AsP-c2}u%Nj({Vqq4pByuUsxk((6)sJgx&EEq1Rh>;?^y z42t@t)AnRqr(<6Y_<+B>F;Mt%4Pd%)};3Ok3!Tf#$x<-72n6pj9p10R`NqsZG(^LakiG z*+Zy=Z8l~IQ)2}>VsWFl_))ENm9--u3jxn;@szxllMP~o0z68LTNntmeR#!VbMYq88vu`}2N!{z3>srf13Kumg1*4ta3r+X zXms%-Aygprh0qGFZqW@DR<_QnS@7Jgwe?&C1qKvwWt-+}M?b;k7&zb#x18_pf)cWc zFB?a_INTkG1)tlyD=V!|8&nO%4;4_ZH)R>p;0HHmm&V5lz~cR>XjN{udr=*ySsvHr z*1|S5BDd=MU~xeKFnFFoF!3OQ?~@6C1{QGd%dIRc;$-rZ#d848OlHz*?u#`bQ3^W-!NsPW8eW4k zNXOR$9*VqSJaU6i)^Gr#u^(ctU;vvd^3=gi^)5Iv@PNJ? z-Z@e7kWjD}iO)SgpK1>qsD%@y7#KaO3~rwN@vN5x-=8fhIY<#a;IKubA9T9Fj%x}u>8JO6?}QK)0K)KErlM+SjQw zw%3aQd@%*e*9RchS`6TfL>(2O%^VFu$6f?25GZ*i+=UglbZ?}i;fFMU_ljO@W_5D# zW8}fWSgO=Ii^*yIC zWyIzjyXbcL^*Fg<0HGVfG#TFFAqVzcnM^!HTer>c=PW4=C-P3JH}MAe(&9z{W0AzY z)z`0I-@A8#L50K+gyGe-$)X}IbAOFLMXOq<-)* zX}2E?dLVc6c&<1`tp0#Wlq8c#9#D-13V!Nq8Kmhu1Rz5&sDA6YyWWlep20r^;GfPu zT0#IR0t0|wSZE`i01+6k^?-yJ9gZOz#3&8c_=G^fZ3405wKxkwp^zH01XsXsPFgHl zr$*2x?ZfWz-ej1*Ej3D+yfCRo;h%`ZAdqiY-=1$ry#U}?K5kF4OHp_dr_~xjvax9h zyHa(cuj>%$Xs0N`A9R2*i}mpun@&t(rb>|Vm2p#UCM@|<}o7wj(! zs6|0$1RJzoqgN*E=TG@HJV?el0Yu?HUOXtF`J*cfr9|ZmGj_LQIKmro;N?=La2RqQ zlZnH^3!VY{L5MkmuX`gH+fd>{%8tqiaXO{f4_>^Iq@+LUS>Q}=YwKsC@Ch~vui|Rq zp8#-1k__s-JS;)8>%kiArm!dV5M(*6c5na}4U7Z=4u=&xUi>2Vtn!@X77e1w?Fa;1 zqM$L8sW9t|2B&wDRwR!5)>o;u^YyzS42AZ#8f!|0BbL3%HqYeNeX&Yu`S!~no=2za7wG61U!bIMkK7U{B{7lm+(z*ih%s2bpZ*H#BfErG}>XHy>i*BrFUgu0|Ps-?DIVDImt;z*;i>Kpw;;E|9rg9$FQM09t=5go*P@bdD!Z#LUnw(lk`nDl#wXXbSPtv1#k z%!xR~3w#5P=M=|~iq%#LSyid#!0qG(ym)gvQxIQyeQL_>7BPUQ7~ZC&BtHW%cF>`! zPLSz-2;&BT=jS79dVq-l0)p#nt>Y(O5q=2ZDL{wqL}Z7l>l_KpkVB}`xb*nN){7T7 z8@dTf_~7xYx8E%_8(?=EO$>nBudfEO*X-&}m%l48!vr96|4=p?kIB$yGED-I1tF}0 zfdDL)m-_)+t<>+Ym&X>13onNme={EV2lxw4CjFDtu$2sYRc{DhGN(o+m<+F;B8{2V zu-eT8_V6RyOta7EUNau=?IZe9=PyS9VpE(A+;?z@(5|8kVyB}G^w*2iIndp+grdQq zXrGz!7!2yBPXO6O9hv1qsQ@p}^|n=m4>-kI;@Es4rtS$glmGxA07*naRDyA~H2roP z4C>dRmFfr8smprl?v4-$%|yjwoi&EkAbxi04xodr$^s~$>P>_r0e4Cbf!YZ;NLqpq zQh})IpG-&+W;RjAaVS{I7hwRVtF_wAis=j}VLX0$S({!p0SF4XxF5Ut+m}DnR>AlG z&FJH<3|ElABLLxnQiR3=`pgzYCU|rA_YZH+mYO>ojZL(|JMCVY<*+xo{QKXw55Mnu zegt6~lQkOv;0~=sH2{2apL{@8!2kdr0e}moejl(tcXYIvE zugx&_E|&4xD~OswHg~WrdI#skLFm)c8S6HDkKny}E z70d&ED+DAksTKt+uYzrs4n-5NZOk7Cgm}t!IBXUfo)L$w^Bx00yFM60w0M96iDoK7GXZtoRal#sr;J^6w!&hha@SN?7Vu%JM^9*9IzIF-Z2%CIbWW$4lb zNumaNUIG9k6nZ#AA>JVffoRmti;4iRX38%IoPuV-(ns9J97>@;$~aUYo2_14_Df(- z3F8dHc-3J>7&KH zLat2l?~LvQ&c7VLN9{5I;Ak+E9H02L9EnE2f6+_;>UWbSkFbBnBLO(@boUlH&J-|5 zm4K_c>FGb^o>bGC6Dx^riX@3H@By*pS%mn}r>fov{dzGLfw08Kb2h7|n}Y-T9IPbX zVnyG}=_9%C)E9tEOI&3yEkw}EV{5xoZ z2v$aedMm>&PMfiU+sdbgqH-b>;5n+ck|N;BxFNpMfJD_d>hpyl`gPbX93MyooDwfc zb}u#l<|;VLZ~#7C5q~@;2)}5ZkEE$OiUD}EUoOUKHw-_Nz|&nEuyM-Pjb=8#`;L9A z2g4|RD2DKeo#)8r*4Br&uXeYZAbvZKo9&GavcaYWUVY2FOxZsW&Bh5TU}I-#b9)y7 zJh>IXy>jsng*qxA1F(`_U*9WakBC3={^)@p9}fo0L9B=Ns|jy7IFa-vF&ZTRM|uEK zIuPH;1e;Kcn{qL+ehKU8x_ zBr)uDMx$yVB|0qgGYmk?8Dd(-qTwJTd`9lOiObGm8b;rBG)FyxbLm3<;sQIAIxD}p ze8Y2jaao~H(R*`m>xrAo;}q)v9Nd^`#TWupfucY&{=pmIELJHsQOH05=2oc^b?S@hPoF-09RFc? zd3hlvSTwAAwmUS9KF~zGy!Y{-AV?s`LG%cb28fDCU7Rkq%M%2XN4tj=dGc5(-&+>E zHq~obW!3C$f4cKmT`c9(Jp2HNIl zhi5TIDFT2gC#s*ohg9r3k_6sv;d#I>krKcc6gkNm_4^V53Cyv;OIiXgNYH zD|a38RT+TU`&|Ib@mlA7R|4Vu=fl50oSmKRG6*RGKBdeIrlr9IZ;}Fn0cMPDp$WbQ z|L>&H#9HU=-RrvhI4Vp9lGXj2k$A|Zprj~jUH z4vRf3Csa44d@)MFYgmvTPMo)55xmRe(t=nitOp_4SiPP_8=UVpF|(K?J(g|_WTSQG z?*inn=lqSauHZ3j2Jh<#DY#rVy)_RzW;6&p(EJKG)zHo=Xf0M{$d`ypJiGyU9Jcjo zHbGKlUohfKfvaKTG>A^%hm*akQ^7y7FaemWuB}3x`|#n)-G>2~WdP##8Hny{t(zWx zn94kU^zPle(=$**-3iQ)*pa7300M%{6?_afm;eO)8XG4sa1$gh9>5Cw>oy#azt`=n zzG6bg9~j>z#=uQb!6kjg_{pnXOhn&L513$xf5tWF^?k;lN6){wW*L8F#4ia^ zuwV9u!>T$yF*!c!12Y&_{=xtpF#*W#D2>~8XlgV;cOn! zsTPaH67^z@<Ftkm<`|^EDHB{k7j*&9 z!T8<5VQs!90A*k;LJ`j6a%n>|xxI;K6kOQ={d9_ri~9Yt>b8L| zEAlokQ^0y<>f2R{lI|2i0C0+Kj!6NJPywgUYn}JT`RV4MR{zby-s0~kPftIdf;ry( zA7kee(q^8m19{(;lX*(GFZkowcfm1#T^2wzHoxA$kk^eQ zzB@27gcWuHm&?vWNi9W5=?pefEW#ZWuHirng#*2_y)tkS0HSMy-qx?)zHTJj1%-G% z!HOr*D&kQoCLi(;Z0+J02TE5q8#<-0dCU|olhvDFAOJfSEf!U&_7^uZn8r(DY8ETq zMZ*n39*%^0cxqWkcQm37gTi<0{H0TToUoO^>aduJYd%t=SZx-E1Q6@7h_Mc?Op~c~ zB5mK{xMpc1)pOcO>nPY*2!p-Eds;==sz^!uos#USLBfRD@oeoEH z*jn&$GyJ5~n-*{GGS2_*ZY{@i6gz{!|Ni!$KVOzA&x?He1N= zi8wf4k4Pkki9{iLaZCWB3y=ZiAK$ohXBA3F93EzOzJn5Sdo{ujiayHgA^GGe^p=kNBT+S9hu&DKVK4l54U*}B@aamf0_Ap>ea=?MWL{EG$R5LKJLhMVrK2Z z-p0k@TKNkBAlc+BC=|!R?<9!9EV+}1M`Vp3pTiuNUzVYK>jr@229~oMg$)${4j90u zAS4`Q0FzPyk$>J!MU$L>-ruhmfXBwQz!=Q0*E=#!$f1SO?H(E#Cm7vs9{?PX0M4TA zw9$)DPqVZZft%pF0;~Wq6Zx!30EKJ8K^Og{8CtkBxxKyZM+w0S@e|<*eTRh|IN=1N z*Qxq_els`jpMGWR?mq#An;9Mrl@tmL+04bB;|(rh2alkT-qK>d@)mo~1Ya$Lba&gG z6HbSSMC2Yh3syLwsG)dBqCK6YfT}WqQ{Y$|Vl^pt4bz!@B$5ht`6^DI&pjUSiHj&C zqE72zgcm!ev7HY6s|sAq5PlixEz2P6wp|CX154rFcm4$Ho^4=xg2)4eAFUaAeBs z=008!I5?yY(l_?VY@-S?+dI%0T97tY*53L>dZx)8Y^ogBtH``KF#-?pSxajV5AeTe zGRc7O$A{QEI|;v#)WpW&iCHz7+R4r-H@kgg@|<>@)^4{bXFV;?NscH?3kpM_Y2b%F z#=+opC^`)YC59MSD(cbq+`oD$xD`PCx&_;vyDg;0ToyDa#Ii1O=*)_9!fa|I13aNB z7KdfgWc4^vVfSiX6vSh%mZ{U}b75YyOPx@GpGsosY5+JL3uAfEB`3_^a{-@J`f~z6 zeVY%!ZKaY+>E~yqv$Im=EH}r+5!s6y%uL79@{B^yNvW3K+e40qJEoC}W&lMVW`_VI zb2^i_kv}YCXC5S23z@|S!YN$K;(YVY4z~=V08GlagDl{|5n;WW$QNoGO#o&9V317k z765!iQE;vpBL0?%KTx;tSP(V1>sI)G0pgDc9Gb!uA(|+;pB%l>Uf0B*X8ZdGnhSBQ zH8|np4G2fDnapPX>Q!U`;AdZu1%4rpavQ_bJf!fuR>$xS?s2^#w{UKby(Nzg`3`ll z-O^#T6MP=t5$Nbp_IrCi@SNZzRa!*CgrV3$9}Y)?yv_J|g(;*6WO=wL`CJvNdFjJ& z_5FtY>kfK-G&djFj#_{@M#l-mzVEKx!`6*bSS6DpF&Dk-;FN?E7N)< z{Sa}-cA?9o5c zy)|i$6FAIFcAV2M(7*D!5W#Z!0P}IRT7Gro@MSB2K#&2{=k%h%UrZE$_l5r5TCi%~ zZ@n4=7#JDT+!_Pe;7@bi1b{4c&6VH=X<`^esAEI+S_w27ItBn>I`fye;!M1eXnIk< zk!;-TmjC;AfngtsAye4NIS&i-ac$ zsd~pXmyh?2Sk2a(JSaTqrk|+b&uO>&yS)(sAfd&3*pky{^ovOdxjTmF>C?725P}9(62ILQEP#(DgT|lb$&=CBqf?_(Q?Y8b`f4w~w?R@kBPzop5h!i& z3~I!yfRE6lk24A5A#1~5($(WG81 zhE}Bg-LHFp`?pT-QKUJ7`WyC_jEtcgJXjY%W>D*c4=DH>Xa%s5_>%xOyMhCak(ws? z>}3GI{P$t`y!_qzx$F<;LDfbR(2HksqmH445qdW5JfS2$A^YAm$zF{$m1gi((cB)yewBdBoCmgei%ygMZMMYE zWMNWjAt-c63P}S^iWOaU-S*RB&o6m4GbDydUfvMJWe$FgM0Yl+Pb?ahqetAw73HIw ztpKJle}{WIUF0WY$BWg%dpTr@T28GHfSf1ycyRNH^iLz#x?6FY$=&n&T|=7IW%v7h zek2YljPl>~1y}(i#Ug}Rsvs{aj}nAJ2$8QWRVu82K>;9wU;;4yNZu#hTG93R)=FFt zL;mj9iVsX;lzupbK%IAr}@3|euP{6!FAku+?M4ZHh0@BCq8o)bX`0yMY zWhs_9JQg|b+VK$pOp~jV$z?dP$pG%^sYkIe^OsyY-M=?4ygvxxzQ&7+5dx2mcXd(N zdz%X)Fv9{t`tDbs&$f<98z1UFkomygE2WY;dA*HNo&jLCwo$|3>BEiVqw{r&t}x)& zSRT<5oix9NeGDRm=^84-Tzy9+-95HzMODOCIh3O>Hg2U6~8AjOnaffV% z7hgn&4U>Gu2mC){XBW~|n#OS(qfo2HlQuDFtVt}1921kwBoQMUONJE|f;N;mJ4l5> z$mC)c%#FjQ90ieF^kRv{KncAmy{oBE7MUGPDeTfR)@f_Oi(W0g=`w7gy({eA?el-$ z_ne&A8P>PosjbJH-+8`2vUzJS2cCO|u8_(d35>X+nAwHWtn>N?bt16~1qxzvro}ek zi9~|V0oaB(ey7vvA8^q_GvFcweeO}kVfTg5Bom8ivST_SCQ^!Wp6v76Y!YI`o<F;x(+lRSZ63@rOa_L|{A|nOK~Shr@*BHE^La?FUwP925^}{TqY5?`wFQK=5J?rniwvZTmKMgmMS?RuSf-xjom2$ z^JEAvN&a-}Z;#%^y@Pq4Qw$e47`CH-!5>#cY6uNoid&b2q=LO2!cB-lZz^>{8k)-m znLvrD*Yq)|x@aFPqcoSyVRD_&G}wCl6lotZPwcmbNxamP;|SLLXZW9>kTCoc`6agZ ze?2}vzH|KUR1`KEWE*;8TB)?aSvtDWv65(#DoG4M-9kRe$rQ5_Y(>#5yT2%vb-Dck zMNzupmdg!_n3-VhI%}O1HQSbRPI%2D79PZABaegRHJa0-Wcx+kiqGvw+nme3!Xr+! zOqR?8!62Vl40CzY$@Ft#P+Lf#b3_vceoUy~%2J_n6JMu1sEl$L0+9TWX#$Yt-c-5Ts$LNCuUy^$l;oNK z!2Mkr1SI=!;t#Q-sUxg-Xkn=c0k|On+|mIoFn~?sZz-FZ_s;r%#2`L=e7;THl+0xtt0@P;sQyc zuv#SyTeZX1=2Ol-8ugFDEirWSgO?{|Aya7m-Iq76zMr`R0C|z$I|8h6DhwOf5NRIg zEZqWj6=ie`L1C>wJP}`9D-?8ms#`TkUPRgV0qI}zq@~%o}Gc5{v!RUb%+~SJKQ~d=zXYt4j?9Y zEhS0*eKo&lxFCDPUr6O1IF#Uf0)9maz*P#elSc21f?;v@_COQ=;_+kzrWKAQb^tiY0Ji%>u}sSE27oeS$fv7!j%44tVYlK| z0wB-E{x0|%@cI2d7a4ypn~&b*Kpo1~)1tV&OkdFbU!rmO>vFkTJ6tmW+}Yoq{^rjm(S1pmH}mO`Al$$Cm#tJOb`rqC_%_G? z4)(4L4b5K}67^RHSDc<7R93;{f*=7$0+7tUaGYFWyF&P(vxbzhZaiW;!nu?CYeH#K`|~GD~*k53t4j_qz^S1QxR{0&r4K}_*{fyfZlnBgNuNBzP(=}@{+NwdL2=tM28?u%Oe(H z(WMCh^Bjh$Y1I&l)@%1=QUra)H3ksj=lz|3&;DN1aIqpPL==AU=$9G!(3}7;e}nns z2H?G+`SUFQ&Xf8LIzZQ(1oULcDS1jz*3GBgitN|N}s)jHr307bi*?8Sn>zQFcg8DX#1^5X7 zM@IcD0$l?N9(1?jw>y1q#j@3C+%IYMQX-kIGlV6%B19y!ag*VtAX=lSZ)hOsLwcT|%Aq9%3c z*7|-`RKirJBz$XzB&<~lK<01bTTO#$pz*cV>wHP+nKWM@0~iyJ3ji$Ua>)hGf9Qwg z-+3OK=utTctp+hf0vb2q2(x9N21ytOxVe=xAwZ9hAPSqIz!e?Q3m`5~x z-vQu;SWmVo8C>J1tty0JtNMa{4iklPz@ixYDT#dW`s0tsW&jNerD1sI&Z#sqf6((J zq+e23$=R$a3}{1*_TZqH(W(nULeQu90~lsK!~?Foq63)JOLRE`B;xf^2L{o_Blgs!r6A16d#Y`T+8F{6Dmb4YsYl|km`oHZ z+lKRdJ2Dx8-$C%H^euuPi;I(DQx3hdxXLR#Jpw?k$KuA|^&R?Y8X5_AfVpF(%m@;I z>+836cB*)vwpMfqHHHwE#TG+M0H{mATyY@_{yO~+yVKzbdLj`I{ZNAtePl}mKze3X zy0j32Fy!L-71wvyApaP*loWejQ*}&-+iQx_csqOP2tdRV>#(f|0A)a$zd)&c*HFi^ zA$KzhD7kbEgEz_Oz%&T~AvEm+>6{4W9*88$OHSdv{z$l;STEio3r!R@PD5eiNtW)m zST>T>yPL)rd{G-FC5ecO1P~Q4nA+>Nensl{jHR!;3!cavw$R#KT=Q({?(6R!5Gok< z-w4{~0%$(vx?6|6`(8VLSfcw%N5cRCXk(F5kjf3QntMXO|~rFRA34%+lQt8301IVKf4rx4BTL@}c_Z(P6DzCHF&D$cRLv z6lPO@3manuA;vl+U@k)v@}(uD1k3=yrOJ4Q<1d#u@+So05Q2Op{#3+ZB!AGi3gW9O z=6goMoWCS1SpX>HUFw?mvVor0oaMbNV%6)691=mY4``zePczyKd_J6Oxd-v}8Z&G+{V0b#i5NW(8h>0Y`kOg3v zNBk~o1A9hmdXK(YvA+k?UJ<75vRKac&RHxT-23QoH>SUyIn&*3!>}Cy=;H8;-3j~8 zNd!7=_bxWtpZFQdb}jCetMT z9_s(algK3Dhbe{FN*rXj1KK#wFQN4UOB5F&AS-MGZob-G-}w1!(Pi|u>40_&1xG*B zAPGq&i=Z?BB=`66vyP|Li?}LLs6)85lF%h!EK_I_faxy}g!Lyw&{O?{vu@nc-fRh=0B(E0>Hw)5w%AvhFBX;t z&-dG-uIT)bsYh9?tPyotz1W;M-_vEqiU}un0{h?r_YL=Bu?Z|e`qx4V`g{mUd+g9V zcGb0Y^3xK8CD``NU|r+v2d8Ze0P_SOon}6l%O(rk`J&1BjZ98VhC(`Rf`8BdncF=7 z=Y6ZXTHR!}6OFdEDXV_oc{jJop!HLvJ5uG3@ zwfR_t$ia%j*ROVV8qJ109Ur6c&6_v>CxzslO-|0tN25LPozW;ZZ07%>Xq59Wq@7?Il(@4Ve;HXG;u*JgdDR%IcSe!lRq zYMzJx#V!C`o12=S_~O>$lK1*&W98g*F%9+Q!E}&8o|*&vRI$7jkLx*#h|vT?eZ`wX z4*zzr@z=*E`)@VJvMDy#Q4=3ek}B!CdAhj?b9`s>>%)`%KQ$Z83nz`9YAj7vB!mJ$ z7~z}PlJqiAet-=i;70eS#Nhj>yZW{RN%Iz|L`bYq5M7-i;)-Phk6 z>gUQ-4uu&)Bx4kj=T~`d9O}=t+ry2<1tF}@RNw>F*~8*xV9&nI2mp8Is<+l2?fEZ# zFkN0>EoV5`kP?{5O8ijauA<^e&mthk+DLBqj5h|KPyoDta&r3jT^tu_a~l0w&|MDM z5H+r3x9(isxbrwOHn#pvrr5mXoZ&p~P1UM=n^Z;AbaVICf^hrzZ6Nx|CsEy{`#={8 zh(ppiYZPocBo`o)@Qs)FRnM@P^1rA2=I_8%BdJx9Os{E~ke1%;d){HSC2 z>+tVjusJ*1)gL2CQ`O#B%-6shVyk>el;B^BMmxH?2f9_9UCp%Z!Oq_63}7z@!x0A1 zFnFy~6OkX?^vR@Q<($HXBSo0y2714nu;#Rt_R7wR4SVvF{Q-cZq z*XD6B;*k4F+3b4H9UlZ@VhNvIypx?jF%d&Nw$48F=1ES>PuA;|aS9%1mb|13|0}id zqZB^;^?y>hLnfGW&!$7+1I9EBcuDD@o|sU;P^fF5qr2yNsK-QtMURC0c;gYzq`~_^ z6e9pXRfkd3u^cDvdliG46A8OGy?w#UqU)TRVj-+;k6^h~0JwZ>ZMhZv{!koqi$w}= zr;9wE2^X33F#I7F8Z^d0z6!zdVT&UJS#Gsoo8zL==gmf7lJ3&^ZM@P@eCRC#b%jNt^J!k~DzwU<*q4-%ka8JXxIlC0-sHC+EFdYNPPo_bVUL!hjfFM&ZuTP=D8z zp@E?;I#o8O1c#ztyBhd;m?PHT(**@I9a&CPfcyynF&`;{EHqBJ&WljoMcP)R4m#vE zy5(#>x9YAphA%SMOifnhhzkaAd2MaM4?c#U=~^aVoGwp~A@_ng5o#Qfu8YgfkOMvs zcTEH%&ZD!hetiDb;nTy@g+$UwGH|wKY6x9iRXBkb^QU5c*5O}@euC}bG2UoK{M zhA)G#k@{K0A7TSK+VE-uFMW}2VT~82(_+O<8evC#UE|t(#k3u#u)5c_27-^5N`b_5 zOB@5=R|;mIeTxhL=`s3k^*vW%q5fd2MWGj&cZwH4@hcOo8N*wa@9hvH&t4g1yA%TjSR1@$2eZ2ql z?E)Q{FoxvuIdC2`a86CjOe(xP2qoM$kkMN(17a-Ny2Whz!NoccnSXh5jjK?fyo_q> z04%ZqS}Lk^(zay<0Q3s+b&gZWFxwFcAeSDL+5q$eUmw78O=VdDM_QnI0DgI|cKi0X z_4k6nAcUg7os`0W7H;?e-si@j{0#?Q&z-N&qyl;XvOS)d2vS(xZUmhwLE*|}(TSg{ zc?b*x6gCS5#bDa{dwXNyB$=Q>FB$}*M2mON_w>imnxm&bbUk4cQIRl4aS?&xP+vsE zzey%QV;?J@ODif5azH{^|LGh^op<~f2!n<=XvX7^leWAEydf6 zBoK5g+q7$Y1e}lDi2u&FxB&nILg_`!ehM2Oq8h7KtI*rM%IBYNud8Y8R5Ez9wGp6@ z5jz(lUu_FkJVep^P6Eh(g#ro|=O+I!H-|R6<5QD!b?<_>2G5WV6OIWR>!`f}#77gHWE#(Q(s`GuDJxp^(^a=~*N`4e*X96g)MvyIDG z037{-lYEgKskdp(Fvue??YrT=g@wC3#F&TK;gQhds-r2adc0smUrUf%%ZLzva6*!b z)NkPyCI<_HZh0*4L74i>%h_NF0{G*klb(i^RrHLW!9Gk~w_8RS1!~x#$!@EI$==TG zJ&E5^O9$HkYtke>0L z7N%FUeHXD{cH$<@fjnF`w* z;?h)kk;=bWv~4sE$9C4>AK8(NWC^K? zlpqbRWT_y#;6oY`C=7&_#Y~_qa~qZ%ddME!%aA#gWuUi7siBm;<(fV8&_kh6hJ_)U zUUMjWTiA2v-rK&<`{|S9G`lX8)(N%~J$l~fdH=pL2(t+>=kRkamzkj=; z0Sf?Px~$j|IN6b1#!F<>eQVRq)P2N$Jx>QIMuY zhX}qrE9C@)NzG!^1~ykDbj+}*Jl<(g6b~G3>VZ+krxmCUv@lG_*t^N$xOZp&PCL}7@2(sS26*T+8|{{D-6eE4*Kg$rfV!tC`t_8Cjgd^oA8c&G}CcI-Q6j# zZNtnj2j$5z7mRi$%dM@`6Pd&U3g3JYEO@&;xqAKY2K}Z&TLMsQ=U{GYV_D{~!+WdI zj#aau;u^KqdY59H=XF4Y9mnDsIJ%^k22Key6}*JT)X=u*D=H`O5SD#EkPxI`9ok0P z=)?~WZw29{t7r&hnm!^s%FY!OY5{)P*g$~f1_(S-7$6@YfZ4E8g`}Ggx8jmT>N}8# zmWlhsvgjYCjK&n!brml`#26T3%?kqNNfRS|EGu10pvU($Sf9|}y|Xcp)W;d)zLGN@gT5Yq@qg#cCH{Q>r`25H+glPfFd^R(`!U|8lY4}}ANY*A$2lhD z=HBTv-&I*f;pyqgS&70oK%s!(4HS|$<_>k>P%LQ!=XINTJ($<5uMHc0wcc9) zLyPe^Y}dMN91g5FIRL>g8U&VOs(_!t6h+F=4Gdf#0KxM_tCm0^JxMxW$sUZ)Rt4cj zoVWn3p@(;~!^1Jo$kuQ?iK~&s8f!@Yd5k@JFb(=DA7DpLoL;ftaB&S(!d556+mh<1 z=ZX3p1sQXWx)B9(+cD`6;o1vgx=*~6z-KOiNf+?5K!wOIi8M;2>^Ao$^)U}V5_UyU zAm0FitFuXpLbB*qkp<+GB}|h%Xb*Wnp#V2$t1))7^3Tm#H9W7DLn`?}0l*_Px}7ZV z+2TCYViN;_{?ET=zh>Dei69Gk(&d*=tJ#>F{`e*X?i?TIr_}IxFHrbRx!_7hWURm- z6dt2^J|!;PA{4$^;li5;eEt4vSZ~%`-yC*p-4cLZdepJ2p@}tFJ@}I~`i@S!hDFxx z8d?R_6dO29$IB^2rJ$#g5;Q5^Q1pclfj}dH6~|c&^tkBRqUe`nkOLOsfPixN?C@oo zbi43V9PUTgEJ6kb?FFI1Zj!<*2E7xazXhh>m4#x02;m<19b6L$BE<;|pPo<2_S!;_ zI@~~uqr;&dOv@gHqlgDt7M>fBPalurvMG9_!4YLe;&w}5Pz+N>=Eg=Z559wa)IauB zU1b1@LLax9`mpH<+OjDm=lrLO0uh*$Q$HkFQvzTm?NZDmZC48+A}G(r*S-Q^nHXH| z9iIpQE{~QIv8AF|1%k{$hBQ6} zNc;V@VY}XLU|U<)v`7jfN6`=p5cB9BAJ0slk}ezWI)o+9^vr-;_Bg`<&T`l^P{7P{ z$EcM=qeSz)?AeR#r6_%b4wpH!kmGGUvO^mQ7mA>MfQFYWwy@JbRZ?X^6oxK{T<<%; zA3@-vZiY|yU%p0NYK2#l#-iZPy*@1DwXiOK_ z@VXe_pZ9eJ{z;A%PsSNbBGZWCc` zfImcIkCj~1D3?!)M=u%~u4Zt2Rqafye_=MHi#_JfXNt*k9}$J-7rQ{UuDwTrwbMZ1S+Y(#0^tTsos~d9r*;0p~Er+v!D@q;J!G%z>G27B)lf z`T2QrO}qxi?1n)&bnn& z1kMtlM4Hcpq$Q|_pyAX4c5v`1mjT)MBDz}&U}l1mos<-sjW&3Lv?97_J3L6=Q24l6 zhM8!jpx5YoJY|9n&aP*f1q8j6CtXw=K#jd?m|4gPaG1~s4I>7i8{K8wDaeqIMq=JW z^fhc*2GK21fJWcGvHW`pxEy5&k4s_r zSmtR~QHVLOJ?!$|*%Px~#}}dweD>QVcIsj?Iv*sD|1$#tRFB~UH1YxS= ztvmG5E!EO>mIr;&O$&ZB>67rNiSBXI5Vr~Pn}D+CYW@9zm^>fst_vf)uiGx+PZtC@ z=C!B!<&`ZFoR%>n(LZKKfrWuVofXGOI}r?+6X0Aza6Vfp%B}bmSuvTfn&#P@0m%4U zJ}^dnj}q*-0}(e>#0mN_e7>Pq*Tfl|0{)x#Y7t*wXU{)~jI~6eWIz#u_x5%$z;-bC z=HOuGVDIws;_?D}*}f}137_PeyWz<#T!@1>_Lf_lM+DwK9h{z?p3KgE`xv%82jZyK z>#c9}LVW!8f9blK*0`}OYDsp1rIKYS=nJW3DUB+Wl~{(@i(0si16~=Mp>RVpThrsk zEVAiMgSP{-n`+v-?7Vd?LvIGmFc2Kirhmq)@*n1&^PW_4nvsd);IEg`(Y@!~&ym4$ z1OeeOwwI`hy=&u5!?t6OZJ24)aM)8+v?vVZ-Nihm5|37h>;v2vC4v{?1qljYUVap9 zLAI9ABQ4ogS))Xx2}>QP_CW=J#;S@YB17Z_6bcB$Rv0V5qUeg;6EFe%TvAWLR#~Bw z*-pSOb6DgAbHOK}DD}irM-&Xg`j##FSiJ7Sf64O#6p|q@tpeP5c+}-b-ixg+{-+8M zzIjmubrChSFVEn;5J2Wbm_Jc>wo&7-1Z)lWwBoV!<=84~mt}t?>}CTKIPc!i`ke0| zO*cr9Xv^7Yl-bUlQ~Cshi^X^7NXBN^2HdxfKv^cjJS*~oH=JraKp;EFn4Y=+`Tot9 zFJGp=cPRYFfBvQ{pmM=SYFY5b<;l~-@?V!H7;bh)6kh%L^2a~0!dI$}@L=~jE0hb{ z?7$7rF!1)`=Jx2LVOrvJ#Pebb3`PxQ=K6SSY;B*PZ}&aI;)K`6r^Z;k9`dYp=r^KV zgHo84%ej__aaak!RHqQXp2ub-v4~j)%&4ef=h<3l2O2>Ja5E)V73?5UP+21)ISEl< zp9%jfm`TfPG=(%(()}z!k=xQ`TCri6I7-|?T4RrnBiOD==%Gnyskzlw?A2ACmNb2W zNj2Mx6+KCW@_rU`^N=owE+NQSM6RB`_RTw8fc5!>@0Vx*DWHSl-PrJpYry%)0%3=! zMj*7BkRDr@;V8ilp=`&8@(^gbfKOa&c#t!#UA%`|8wh$U|yG=5j^t z@ljfoMa7COhD|G-{HFz^N-q69;4e)eOsQTVOOae@JqX%7#WYNOp))pO!-g#u8(jGU zH_JxFm{EdKL~@!|FlpHy*`>=`MjLc?06>A92P@$x;Dk)u{RFG-hDP7}rq(bZ0FwzX zoJ4|FL0nm|SuZG7tq45}M6k1A_W;x6KAa&Ms*1lnF6W)goe!@bZ8{1)?=*bfGF5$5JJ!HfBhgJ{JuAU z2Z#G2AP%o?3B8B;BPKgym(vm#Mv`k3KA!!IMH;}Ld~cU2>DBPT8RiF`bQKPV@>N$@ zG9$bwFFi~?*uZf9*tUWu5+3e3n_Hvpcd9;m%@a)s%j4u}ATO;iyx;W{w?cSV+@#$=Fe>4Gv`#H)kXjSAOJ~3K~$=2;J_jd+_L%}U6r*n>i~GOILukr*zr%= z;fBMyP%eZrqVIPpfDwySf!JEfCRMtQ&w*tNNc|5VE)NC(6zX<#aSh9N_pl)Fxa%1! z#g>m^3h#dDQTVivg)V1GhVZvsHbXshCUF9W-TEmT%cDG6=b#4y(KzPq{C|c*_XfO5Bw1V|qu9V2#_d zAdiv*K5?@5`pw(7!l$6tbab!^CYVB(LB84bGYlw(Q$AYu0{6YNJ0D!Zv4d62d_$*J- z#cbxYz9c~d@b>Q$AdfLXBNW%NymhJr^D34SI=LV+9&k7p=gg^h*&8If8ty(z`6ahL04EXV`LT z&#N$srWG*7iU~k#V0V+8iZ?q<gK}Cn;XH^b%gwiI; z(;zl89cl4#tiylD+eQ%uOuGb8E!HK084lh|QKX$RE{_R0eOE%LV8A$F)0rg^+c(P@ z;kTUkDtJf&mF?^Pss5S|YN3ZwYg#~znpo^|I2khR!KxDlS#C~h<)p%B4`c0KHyOqU zuviCmL^>-fU!wY|*!tlAc7%i)7wHOhdnx?y4%YAG%dd8Psb;3>qP%Pl7or(d=u_w`BPbQ{RZpFB@LdivUK#^>$8Dn-~+HrtMKmZ)f zon^QP?iVdH4Yu)&S-GueCJpM8ARAm1Cace&1cmz}OT=w4O0*FCiLG)gxa3r@Yyv=a ztLg__mE-VSDi~D6#&(J7K*x0}-`O0GPc7Fa{!u*!v!1BZL@_{RthP&x$7z!VRT*P3 zGgg!uh(DQ3sjy52{MG{iJ*Px_Aha2Ji9eP$W7GARl)eg&l?%)FrB~NK=i$zI~okr8s&bQUK&0@xznb_cQRnyN7T8IIM7G z3KuUID-?F7@b;B<bwIF#ANobSmeEeeG*Y&7QeNg1y08_9lVxb33k!%^lpIDC zZD|hi7$uN21Rvia0F$V!t`pXki?vLy8!P;Y>IMD`wM)WFoD}7WRpQw!D2q2O zr`grf!9dJ(ttDzm;K7CPpg1-$;T{uF;~2YvyD^m;8%82j-?z6;H#gUyJk2r`q8|E* z*f2+oo!v5$Bv4TO!2&_;!$_>W1SrZ{%uhh7B85W1T8FC8xe)QTtQQGWfuC2xN%(5~ zOg)9tDT`d3HbJ6%H_oXtFaKlgYF6V$m#8JR8}!$TWb}tLveZGkbmT|@JButFGYwjV zkSv-p8SXNH$>J`&$#5a~0kX8gPvC8OnYEcs@Z@d0xG>wPQ>AXJ<9N7ouyJg++x;C? z)u}pFMQBlBZ^`K!N{Agzyqy^k)X4;fqZVUw%dj&vm3y1px}lpP!i^+0&>|r6V26l( zJsiBI;L#$m!`wOAARpkr^Q_D%_A5OO0*PC}L8MSAR!s^$HV8fssuRN!iy#o@2=X$X zU(8Jj&9n~zm)`?$ML!k;<2XnQ?%svq^g_zO&xu4eHQTXX2}@pg)>C3oa9BF5?JRhL zlN1ko+~G+IjVF+D0k2M8A0DjVP7bD*=U2;b=hICS_&o*(C?r#Oz4&&1IsLbAnWud$ z`SZ(zTL`|6kq=W0j!fulF^2iY>{9TS}AfcHQg#EHUM>@8o805m=p`z%1UgZ@Mc*I zc}1oticE%Z>Or&IP6&V74^}Ba;P6#OM@t~834m_q&uS60BDq~*N~ZUL%pX5clxM|S z(<+nkrAE@%>eA-p@&4I0S&GHtZW@NMwp=d04-Wg}%kC{v0d_A=xD0pl=<$A&$XH;v zcdPUqQQKl&R^K0mF)lH!scZre90b-RRFU|w5j=IM32%=kvZ7%!Q4Gv0Cq`&&87eY;^!ibZ z?T9i}v26`Q%e_J<-JGsq8y#q+}e#4oH$aj-p7Tlp5+bS-V+6_9-@@s|X3b ziWwwDP^$VwHiGIFFYDt${}I@;22YKM#Pw6efAd$9IRlX2fBDl0SbF1CI8BNGb5_IB zAL2FpXjMT={z`Mf)9O|w?+p28mI?+kyfbjqxNSZ@eJZV0y) zw*Y+eJ0@pWtJVMkmCy2_%3IAU6n!k#81o#b#~5Sn4z98vr~(8wPY+~0EnM&^T=3Ou zan9y-zeAp0eI>{J^@@z)*~`NpSiq;Rkx?Voh+m#Uj1^9f2zW=>5ZCVr3CW_^No+Q$a@86uePC~ZgtE7UoJsO0oO+8P$w*?53f8UkS!u+4G1t_P z7%Yf+7b#-PBB`3anFk@C)-hVdx=H>7L7rhckQAh;*3mCE(XMBXJ7V?pXLMv(Q4r0^ zhB_V4h9}knlXXPTypwgHV8d)kh2}Wqsx1ZE?momZ;=c#I^5CbPS91yjcccR}4iX$@ zQfIs#1v$zh@sr0qE2%~wjLo`g24LDlFfW8*dc7_mcyy!KnSJ^Q5Uwz|+~ggb0NlNk z6XY+U6nt@ZvbTTy==okElGl~iQigYmG;BaN%B1GSD#-YGGFZa*Zj*~8m;uvy z^lHyE&D>lhEv>E5F~%wC()3n%^A#*ms0cnKwk0t!L?IEwn!%S1+66-DbY zVNHoJw3lAmA}gbg?HzrOO7TM#sAGEgju+Beyu*GqUJk_)%%g*&=lmZQudbrM`TWbD zJDE?8m$2uThyXq0H6zIo(Z49bXiDyU$=VOS)&i=FwC@{qMRta{2XN;OX=jv$yseh{4uIO(u;9^&Z$c9-YY(Ta%TDth~)&B1FX# z6#&Yz00!Xs)tlY>u7L#{f{^&g0!;Y)^5N${i1a>re?lZ=XaOnsLX6LhC~iYeR#@W^ zZ)actf&h<|*!Q<|t8nY4atl>4LkhQaBFSDrtWtGa)9S-|L}4gNL@)$!wjVT&NKTZ) z@#J7Ckt^LvEJ#jMR9(65Z<;xBpt+-gvQR|o)PWllvFPYI>AbiYrq6;s>#%4Uo4yGx z$^?yk*exMaNz`q?q}{&jM<5CWM#F^6X+uR5;s z)1doO3LrZ%d$G?VzV;b^am3*UdYK>thxK7KP1F}1S<`CwnnIQ&ROnK1`<9qeKY%p9+d+L&aM5E{5Xh6!_D%3 zKg_V7r(UvxEb;cfw}9vWyLt0py6#8e58d$D^z{1j^4s$Cmji5S1pxa_I{>iA@%o!F zckM$&-(p)VMS|N$N84fo>AXjwscjWy1yN&8-=oqo>vVSN$ZaCURuz4vq6Uc!RXE2M zM!?pP^i>>G1!AnxbW4vlfMf>f|A9M>&3@P%u@y8;WW)_H zfY^Rq=zZ8XpuqFkPndhS03i~jU?42Arm)sdQFevs0G&)^h*4|3G z(ASP3TnJ|Sd(VIU^!)S|glp6H9sbrbnm$`SB?EZ2?_x6v6qLt%J-u}c;=nvn0>3Yl z2EX;Z%miLogtCAnaOWd?@A8vuQ)x0qK)dMzyfEEz2g~F=mIC<`vIO~uOE-%Ta1(6sO z1of~|1V5=-(79lWC2?Roin0{-VRQ*0xsqoTaA8X_7z3A%TikkOYK9uQ`LzZ z7qLm9CgJah*T#x840s%M1THpPA^uMvTyWGJ?**-`>auowZ02@MY&*?j2Wc5L*$O8D zP3|xSUTlN6Zxk+&V04B^m-0X8f4%o#+Fi69tw&SE87rHp<7U#Ww2f=P6 zjq#bx=LqTw4KLgpJ*z~8Z>`3(?9m5m|VWw1mH6O@WtD=FW#;|_|GW3 zHHXvXx9h9(tFPCup^E;Q`7pn|eERec85m@u{oF|5Bw{py$Qf_r<76xpK;J@{F)wmW z)46Me%tj8Ki|5*UXt5JyV$4B(Pk~K}{&@ef)MVx%dYNdy%l<;@gC{`Lkh7(ZHw57wx4T$w;!)9J-EQIRD8$gL%V(g?j|;Bl;w)0!DN!^q;WnL##YLVOrbji9wf&#CZI zvy&AL<83V^k5cC9$WTMEfEK}z?HRJfglocTHRGoM5#^Gx8oYieL z|5@oS=)<78FHplA94;5>hJPKjXfYPI_7{4GsqLyDzPb7PyD<`OLh#|^{{nFLkUE%s zOl0Wdo=U9~2{FgPoD%D!+TvjVp%Ui+fCq_k)`J$SMHWufUhxJ1UkC|#u{#1#f$;3? zVgTVUe~3S1;oVOF;D=)cz##%k2>h^Imufu+VXB43U|C_*PaYyq`5bXjf}krkU>(O* z-@8QH#0#QS-aMhWuCKP1z<^yT=E4vYVJ}eaVssfh)a6AZbq_55lB5!rf>sLw=o*gK zv_gg;{m(F~l|icqUdspT1l3Uc@Z;fnUo4n7)FhxkMHSTC+@uGJgCaI2l@NvQEjXoCQ#zysq305dRJ(+-YAIjmU2=2v{_1Hu zM$&y4MGWe1cei)f&}6qzbsR3Ke1N{Pg(vVn(`>5y(qkG{NT*U3Hcz!YTwzEnoV<^e ztp@;j{CLst7E095j|d!K_%swg|3Ar?0DSY~(X|5LuxWDi9d<||gXf-`Wuj59rnRQS zAb28=9QFUiaJOKrW*e^GlLtg4ynCv78)mM+!Bz|y6Je>Mj2@%0fMW^?iR`(cZpLGs0{Kav(r3Ai=eDmt3}}p>PtSMGrvyC07s*aY9gja5 zm+FB(CoC7`GIb|DSE>*k%`WIH8=kN7@4lp6NN4~OAC%u<4<^+3+gQOw{w4kjq5OqZ zu?g^}suuTg@*Rdb9TA0KwR1$oqVg;)OJffJbGf=&tryGvb;`I`G*R7B!B=-tDb-A? zB?DTxFO0g2uHN0edrZgU^zPvikGr>b`xPWNxFJQrEn+nRY%ys^UAmyqy!pa1I3B|= zVA&L_bs48>mLf=4v;U&*h+iMS`6slfpD(_Ao#C(l2ne75@CTug0Q~gk_DBP8*sl`+ z9`18aSciJe(F0=@6k-Kkg+W}BJFyJ`U})v2xMnjUyIogD7&swsx;>aPP4f+O2ptm* zI*F<<-w!M0;Q~uYE^K4r!gQ4&D(ic*l0+%Q8eW6^fxx%0Rx7Y_6i$uV16=BIF=~Tz zB8{en86pvOsPOWgk&E{e%S#tR8vL2BIf&Ey{e&}OAHTxHg>;Miq+JG%GWK7z z1GyRiLwgVxX^BOoBVIXukRmTNgel(vx~33hEVwIhp&TB z07xQye|i51K$L*6ZC5L-c$6MiCUefOW6bYumH2>&S-;g3aXgp&D`_q>UEjhvnmoX0 z)}ntAB9covs$m3DqnkY$3CbZZpyi2_xoHx1RTb)Pvf-O1bo(8OM+40q8{w9<+{|$U zNZ4JWyAEl`Ha`(u9Pp98UDl5UI!8?AhA|X?ldPdY)SZo%OKi`e-m~yiY?I1F0?Cn* za%y9Ums#zm{$7Fb_w$yPegeQafeNtkn0nDNbj=Ze^4>|L&ioBF}46V$CfG$of0Zai`+7F zMNcIS`YK*1wcX6|0?U^~++m3b{g+@qZ>7LU09v6Rz6x4)2EOc>K3Ip%m$ry=Y$I=l zvUZ+r=<;rR`(!#jVO%zl!O`D=9HK1ef?q?!58u|Y+Grk0Y9=2ZQ*)mIH5r(OEx!Tp zOb7=t%xtQHs2lnUd#`6ZLje5SNf|SGXc=l7!%-&C+8-|4sQ?Hnmvi)0W8W^U=1tqU z&`^YPwAeV3qy4Jt%V9UaiZQ)QQF+P7lN*)VM{CsfC$w~vufa0R%}-bF-fYTfIKR8Q z`;hZiij;xr!Jd?u%V;p`Y7!wPdj}Y;we_QKH3bno>7=CEXuuQ|x0zC!c%`d!1mFvB zhszh=+z9|L{^TV91qlEBN>KRZtTu`8zn))f03Pc`-~tx7+*w0c0saB<&hlNXSihlu znsG6`-zsx^LeEs&&-_LhNR4Mn9-#_)lS^{KUnOfBFmUq%$uV_Efz~`hi*vD9FS`u- zz1|USYDsPur1luTAP>$M;3U}1CetuM%R~U;axOE|Cv?z-VYw!FllpOvrSDdrxGM=3 z1R4R^w!EUvGl0>zH+nQa!Y*Q=E!4`uggbKqlsOjgg?d}Faqu>@p?~|mUaKdk00_B6 z(#DmFm5&54&l)h0R_=GO48`?1fBbq_Pm=qxaV`Keib`0eYvfM8r zXV&Ff(Igvg?=d^vO>}cBApEGQFp+q7x*oD=vi_FmLorj*t?qOU=@rjZ)KAiIqGj56 z(ZfCAauuv-g)F85zyW{9*EkYF0G^$lU0nP*3K+*2Wn#6?V!h^1D~ynQafO_%eSzGS<%v+qcui2thz0iUjR_K zww8|o-)$GfJb*=A)h~A{I%Da3WaZUD0~F~emuRrJXIoV;P2?= zH<$p&hleN|5>N$p4kUi_+@Ac#(8t*)Hsapatly~TrHaa6-#eL19Ya3uCXU8QGIgdf zkf9nR^v4qa4(S-s9SH98CEKfS&3Gf--z#l}5mg(aM%{Vy3}{n_u)h-V94_;~j4iWIXU9}H<@z-BE6as|5 z{6GMz^P_6j2?v;RZ#pAWWcag;7xz;bdy7!Qb|Ht$oT)%*?3Tx-G(N z=X`sb$@h?8OZ>S^tW+m(7^WN#aNx;6GuX2Pu~Q>zi&oe|X8W5X5(9(@9$&L*55bO! zF^{k+n6rn$jMDp!8w|f;1GCWcUqnFH!nwmm*ULw!SB)n`LN?z+>@TB^K?|N88XEUD zC;~g`A60jH4hCFTN-0=@j-q=5)l87=FV=epB{FZF4=2FYmf&y`~JEa3f<>-&d~52hdYLkB_l-=6_M zhJZcG6@%&+KueMJ%3Xs{aE_ZernJv;L*_0@se-P|I`fqUfN0(qGZu;$lnVe`K%~Fm zj!D%Iz*!DDyW4kU>jfcdu`&B0^4m#;Y_E~@Q1A>B8rBUI{A|nVw6S)e3+|U?3nJ`V zLTHbE*R?Vy8*zhOBmtwPpz_85KB!xnMZ`k3A>7X-Q<;XX1c96!vBxaVjQb!k=(N!2 zyM7pUKFBkI=+1MT(W&c|2VojGU26B2(O(gG1wN(3Y2()E=|6G=RD@IdU)$r)ilG~m zpsMPW)TyQo1P}|*7*wGtU&(DLQ7k*ln9;i2EifTXXRX54Dp!5FcN0Dwx=<-@;aC6I z*1a6+e6!tMzPf_m>rjai3~sjD%d72zM3|FOput{h_%Q0|$wUCeuLwY5kPVER+nejx z_w>Tgei(y5;lq0Z@JO>38~Bn`L?|d@S<6mt?t`;e~Dc@NSKbn#ZoH_(@ z(ZLM`RFa3tZJrcaB*7UMS!;e6vo4+MG&Gp1fo8drq##`jE*2^vMuLI-FH=eh@_c-U z&Icqy0%v~&XsVe203ZNKL_t({H-l@Az)*U9xOo^0Gn7c$~2yNd6T!cemvA zw+!2GKZk0`(C{iLr&)2(iWn=Id9E8!TS4|;HIVXK%$b+qwE$U3N{XXk^&qFA9gBL^ z40^n9&70j0YrD@I!+uT5#no1K1xdh1MT8RordpH+QHWl?CKn46`k#9X2mrnn4=g_# zFZ|{EBf%2{elY;NxzQl-`svN*N`-Rey^BUH_j(@wo3qc{lTK?l z=CvbRrVCe?Qxk{LhFRoAJ~{EnR);-Vk^EMRI}RYi#geL7!@&WHg67(Ld^f5r$^cwt9U_g)k^HP|J9ogbmH^QG&Pf5s42qa+n6sw9 z2U$=VqXv+wFpx)?<}nJSDZ{n8tyIOoXx4%rY#9;Yyz2!OsUuPKiq%PDrrUKZc6xHC zN!z}Hit$3jD9jkG*U;5wpH;3ya$1WfO z31hk*^4pjU7PP9pFy>iEDsHoAV@ssI-h{qHi|*7|*U03xMAf7y5Zv=u^`hLEo3cD&QRws&zl7%-WbubK@uOK+zf!K9%wL^(TWvf%2 zjWf$07l|^#h6)d;FmUSJ@3}C-a*NL=0DODjD+;~-`wjJpel!x4hd-WJK>iZ|nysq5 z3zF@n*lw1mDzp9opJ{>5034~aQ~aUu=7JVAve9VE7#Wg76KG1pMu*Y@GT+J2 z8qIQGiAcItGErr=@_=olDeoLE`PjBIo>?;3t6#4W243!J?q1}EIx2MZMv~&e{Zzob zhECwQ(gIZ~PhR`QsRg|M@V3{}xc=Ld-U~nb?b-Kc!;imxdH??RhZ75UEf(-O)uNQ8 zQ$nSCyG?ahi;>cmJCN2N7Bmbt2^?*;KB^9&au>&B{&fUX>3d-_Y)%dw|C zpTGi{rmozb5=(hma0DPqe7@OCBK{lYLHN$QStcP<9*7B>jmD(cXco*?iq{7QUSJow z(`Llq$Qrxtrb4D{kx8i0r4gFb@9^dpX61sBH~VSU3s8=X2#1OP5)J<(0E}>pc@YkNIlEmxDuGAgsXN`kPvtMB-ydf0>oCmq$hC5 z024V(rE2_?6i(}YrpPE9t2ogPao}#=b6((t(RNM0IkXB>W0OjeF36X|doP5a&&5*ee1w^JjpaSTp!-IL9KX%VtHh?4t(~&KDS>kE5|WxcNhL zEOkpn$j+R&;gjs+Zg%%g{P)jIS|+QY^95~D3?^|?%Jr&qIibBvUO&h4!hnN&HmQ~9 zO=h9aCKZrEz~Y9>#e}+-y?BY)=afPcXVr28F1&ayNecruOq3VHKC*npkWljwjr=hA zcfL?{wPe^2&YX7r>&3;ztE*<)ixm z24^gYjQW{wl|z-t03yGG(Ocp)O97e zE(`*>%roHvSjlaM5xb#nmp0gNc5$(u9|3qYc-#!1P%)FO=nZ>~g%R$enkLd?0`S%t zzz_GR2^!#-WevZ)e0~JspP9mE%z*#(@bK}?hx^-`uK>s~)*`{61~(T>atJvz0>*bb zQ?8NmBwiH&;DM&Y)ZnzfHUG&>(!+=50f&KgRb@@f`XHwq;an97W^uSm{3lkE@vQ7FSXxD%t9=fi_X|^}21NS=6K`0u=vcP$WZ!p%PGm*E5!Yu}i^F09A%k z1XFFfQ>b(^r5_>z(oDN;Qo0VN83g+P`zCpSz31GI6rBuKK>}HDZ2cVG@BW-~uG+Q= zYKh)UKGM`+>vY)wK+f#no+98;0Jz)jbSy^%UiW*0f4%$qe?X}Bo1J0H7*bQFT-d|5?AT#Q;$1u(Q5VrzAmVxXnN%45peCLZdP52~dF-(`gPXw$jP) zsh{tc*qvD-su+@sLW1#688+VO=jSTetvT7lRpC340TiE75?OeZLuH(|i5jaaT!9)dmkO zW?ndfV{EM+i74}$)x1oL0e@17tjW*{eR>o6Cw&Rt@ZY&lyQ+1~F>}OX5IL1vbg28E zqPS!mLUQq0v?#g zt9elm4~|18vw`$vIDOjB^ZYJdWOB(aTeM&tT5h@f<+5Ftd&d$Sk6;A&u+O)R?`sc#BKN=-A@R?B{`B@J zS*2H+{xe$8pCnx54o+G~jPrdV5he9KwmH#)?$yaSLBWWK92<{MxJkRE&qB*Q8?j{p zPbcFl>$e!r6?8)PwKX^>oG35h;sCh{=s%+NU{re6x*{8*54dRm{L?QhQVdVyjjmc< zNXdIixk>tW=Kb)>A`ynl5EyAUUGK`FKotNACL@q$NiZxmyKmL&3-T9` z=+oL5YD1$pERB$_3ss6>^42gH3RPbMJAaZ|GirF-6^a`gY%FlOrA@~~FI#tVj?O!s zg=l0PSH3D+Z&KJaR9q&4h2q*WG<}-v&wE86A|Tsd@&3XI{ z2k!^Hk4L}WX(T-%aC;-McA>%n0#bXc%$Xl!|1k^(T@9n5X=UHs490D}T)UA52y1Log4_mBUSf!GO zdHYi>n>Z>ES6hT+RA=}t7g?8SI&lKGhaf_@>We|z(fNlqVA%gVj}oU*=OM#flDEco zPr{}k*t_w14`qqTKhST|_6k{Dsx9%^FIM#@W8;#hkS!xQS4+)GEKF{RIvW^1IU5@g z))gY>lAl4n#GFMRFP9CS49F3y78gHPoXw?l_SXoAyG6#8h26-2!4UDQO8NR}O6XOP z@N=WRiHhu7r@!88?|1hA+xFqbi;vKU5NRh6?gnKCC%d%!ySsS}5E|eCdMJNCzkU7g z^Nl&md5X(Vy9NN!ZNlyip1~XlvURX7Xy3I!NDMjE&F!;MwQv|gkhXv`FLM44fh`hR zIp({ihBUP3qy|}|Sd5jJ&+uf9^BjG;8Pr0q_LI3_1}$wjmV|kAxuice!PjdJ2@+2&AT%5!f`Hg#~ z!a3V1Ga4G^m~xwp0qg-uJ3_NWU=oAIb+M|E@abNkhC{GW0ce1F@|HzeS8%&POW8Y{ zEL}_!lV;g(({9zpg;U>*8YggmnLoz4m$Qem`Ozo7x$EPCqZLgHs% z^urcuzqg5?+!6@pI(NiL8~alK930h_V87C`)j2NkH>)myCbB%}gk+U8FR1;|;AGg` zWUNgjXi6P2A=!|Nqo`c;jkbsYgo}pREt=NG@fZ~>H6~Yv0t3zC2!cw3R^_MK2KQ4D z*q9ptR`%Ct&pv#7_3A-DC`a&%_eZXx>p^()Bogkfx0~&#y1hn-yZbE2`||$vb^pDr zrjOf!=r1`SmPJ=O3E^u(3fgrA_X)0W{dAIh)i4l}4CPGlc3=}jiOI;;rhp&T8rVI9 z#Tf^}+>)FrOXUgc7azJ?Up${m^ zs`EpuuV$qbcJb?HIh{n3Q+I`Dpw^ke)#y3Al%-g7o#A2*ggTFLE&Zu zLgf(}R|QqTF#taB2v(BoMj{|xltzq4SaV4H)(w<2SHymWLTj`$^VwuFk6EMQWhG7*h_0$sflaryJ#tK5iA3O8y#Y2YLhglJslgrVaaQE89*(s z;n!Uk&@3UWML)EenFGSeS`gr&cDn6bj!*$ld=KkDZ*QZ+$O8JjqW4CRLaD>pQdfQI zFo$%5$xQy;2O#`U_i}mWxlcY-=o+>-$Qo$P#2g&@_^7K@L*@;V=Dg0ZtS#lHr7+ht zV?dy97Nf)n`4h8c+YcoTj3>7CC6u3~T|w;Ro-aY8D>^p!GFl@kyG!vzzv`w=pGZvl z%0yezrwQ=_>hvCf&;I!1*@uVsFCXr(u<+i1@IgR$tsUv>aVXpj-Rf;W#oOqk0ze6* zN0S3?^`SduXz+4MNk?E8veW?_Sr@CTt9efD zTngu-c4D6dMw2q6X}ZgW$fJQsG@E#m|2-ZKNl(Lq1K=A0iIQIc!mgRFj?I za??PLV0HxZx?bBpSOjg%R;Z?72#LYQOF@1!xkZtNy5TwS5LnX5P=`IeVV`cm|>kM4{1ysKr;BY&}=r}&*giyov z8etsF{?})xn}G1&$M^3a;MqHX@c3|KFPTNKf>5hwfRKc%9+UlzYpaI{xV_%o$?KSR z0|4b&a{SY>hp!e-7w|H;sqi&}b0@w+h!deo-GPM1v6&ax zFgxHv2+1KKu+&|aw?^~^9t;GV^6@)bTuVd@d6|}Upuvfnc(_iAP;Fy=7__OpbDd%H z7GzBcoMZxnz*}pUJevIPabO}mKd)9*lU7Uu1%suV)RG;?NcN(q_+wlP|7)4`5X?e#(k5{zyI7=)(9w>SzL^xbsG*E*=HVQ`@Ate51nI_V zc!4~nR9%S@r0&pFspjYt&RGe!m;V4al@8>k+4oqMgDYG=6xJ;!WWktu@Krkopt=3^ zFb3ffOWKde?ICi!L;81);hXDD z7=(SKOaCM6T6WvUvS9cS0lvhCK#>eN3Yh^3sAYu#JiX{e+K2%yy%}J>Axm$1HOL3d zGK*}y>ksHs?y_R`Y(mI>jvZ}p&hyFWI+Ik z(IX^*9GQoadXkU|s+Z;>B{7*8;@H4_E6mmQF@l`HvMgX8d2HR%GTIWW6lyibArQ%u zi>iLvM&gviKR^}2#$=meuMk2NztjzSvQZ%5P5JreeEZXl5N1Saq16H63#|=P^@cbF zK;RN%=)VM@fbgq;@bMAw`@}`rIFA(wSqkgs^+y9fa}du1l@$R0+lo?NPk^R0Lze1+AgA3ax z793WP|3qbgrnID%D!4im_krMj_TkB!s7$8mC7)x>Y|;L^y|}(vYy#euIf6Z!c}#FT z87y$FeSA~f+i?$+RT})csV+hwKtlY3_mxfn5ALoS;8`f)j-$m$+ohvx5{bCUE8{7F zMJr^Q<;C?l6tQ{C3b8^)CCw4z_OPUniF&F08a2YZB2<}%4Vjk4V8qF0j33X4?1XX+ zw<|cPV3#6Z+L~KzTgd}E?a8lRlKhCibViCpJJkF0`3M8>j2IPpsAT;}x)!@YaIkZX zzX~qdtbcj>YXrW2dj0%Wf$$%Uga9Fv!p{nXCIOU~w_GL$ep&+%RfsBp`%dqE=Et4@ zYbdrM6nKN)7eN{S|seFkL9|AWJn=(v8qN@}NGPZ!m z^(qN00~*suQBuWKwA<)*AZDqY4p9H=hL8|8HKqklnZh{zQuj4u#8i1gFklZ_AHou8 zz4)MtD4)8fZK}SncYn_*oR^vfT%bFoS_gN4|KyCn;ozp;cIvAPrj?FV_b>pS!=V15 zkRYgx5FU!S^S~xkg)D*^PgI-U{z0@S!Ky0JP$+>j%T^V`zUk})3OnDwXb4*DYsUms z%X|-RcV&=qrbgC+)Asbb>LKRDl;yzlN}Hmy_=UGI-c^iJ`sN)JM|5B4^qzX+&qzM6 z%(BF=FyDuNJUu^u2ZT>gPtPbs2*Qt_=j!G$8iYM@%GzViX;{9MSK0SwWSrXePW`h76&fFQ z^W;|=(7<1T)*mxKd{hY_GL1VougN~8IgQF5*GDn)UEq$x4@5NyWL6mmB*bX?Y^lx) zOyZ7X4`U{aK((dZ#bVDe@QlA|e zzNnCsx;~iFk?+2A&=vU7WOu_JP8s55jk%>=>cMD!hgCg1=o6z;C)-?Pq!*RbBvZ0t zw5I6`{4pQc0)LRS|svAHlXLW4#f zysD6;%R+)~@gRHU4+%EgDHO}bMJ)ainrh74YQlQkoI7c5U;@&?wLjJ%T*;j3+UP^} z!tTmd%6jPQVLv8szYjv-@QZ*@<%AzUe`Z3cemxox&QTB$1OS(sSpDr8-mOEwRP

OdP!BwG7xyLpWT%(yu~bdk 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 LNkvXXu0mjf`w7!q diff --git a/techage/images/distillation_tower.png b/techage/images/distillation_tower.png deleted file mode 100644 index aa8e1db2fc507114c9694267149c069c21f2ff6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142093 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 z 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 R%k%&M002ovPDHLkV1kRy4|)Iq diff --git a/techage/images/drilling_tower.png b/techage/images/drilling_tower.png deleted file mode 100644 index 06945dc03b4c8e05e80ae09201d1696a2093b6c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129781 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⪙)XP79z~VLLHHj5QPmO# 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 N002ovPDHLkV1gZ;Q-uHk diff --git a/techage/images/fusion_reactor.png b/techage/images/fusion_reactor.png deleted file mode 100644 index 5b0f353964a4a906669ddd2dc310ef48339ef461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69025 zcmXt;Rb15V)5cMdQo1FUknZjuDxC{bN|!9%&C;DqE4d)CG)PHHcZW!K3+xiIfaw2u z58l%`x$FAebIo@qPFqWv0RJUE1_lO!s*1up42-7$2F8;*T+II>P5}S@e}PnO4LwEJ z+|6q@S`Xit`01PE*_-Hz8*y_gSqJL4sT*g{2uW*dz?D|X2NW}TxjP#VAHHszBp zsqTEIBIg?ni_NU^3{G+Ni;Im(B!`ffSGHEycE1#aqjr>$n(p1wjWc40wn&$FOl=h7?hk=%owV8o}7l%cbkA}aAk)Eb3gysA9 zZmaAdV~y8#Rz@=mYw+^ch_vzyW|rdmp183+O$jy)Z^*~I2$cZd%;L82zIii6!La0F zb#{)Zq1BN1f}Fx8L468eT6%k1i*Fs{@d=+Sbd(^4@gc$CMk-Q?Q)lWy;vO{!8&y&7 zuXQ2aWA9AuqN3CMn!lOZ*ebXS7B-K7!xaMCdLdd;%03cqP9JrG?Mh3kA|vDUW6jh9 z_e#pTbfdv^&de+x{7xR>(a{N_uFSbw@50A!atgoh4rqCMy4ZO| zg}qjGt$+tYV;o$)9DQSLTtmA`Rm>@=+&zQ0c28-7s0S<6-ttfmj?K3eDB9_~&g2vD z{GeEyEaK-EoFyS0z%Af!YfMN%9Tgduot^)JN*5v^D)U-FL2v5gD|XMw&-kQoTXRH| zz`B^Wei$;!7>sO~&~z5-+5}@8UO}PitT$3><6msphWhHhVqh?0s4BeC^IQ3~+U2@q zM2X=x&Y$|0WREq0czp>-Ew9N&G4x_ z_t`5C%|M<5^l{OkS*BWB*&|6~jEUIQha{8vC-IWOjWY$06oI{*RE@NJb%%|C+7w<`hILQrtJ7cM-U`oV0wO+albvtS4OEYo=DK9v=bp0Fqfgf0YwfN%W zLylTu(Y2`24;`*354Ba2M)-Rz!?)5Khd;3qb@5DJDeA;Z-EcO>Vn59zA}O625KJw* zs>^@x0joK?kHYZ1kvH@&Kh2B3IEym>6rmRLY5tbrOjCJWp!~&qe_!DEO=bW;B9LTd zDmhO~yDhV8C;f+kY=^;I54&->);vACQO@^=wXv*>Y61d~77@1xw`<}a6;w<)`J}Ks zuk)i_-JknkMPpyme0M!Rx4g67w;3)vJD)-Lmne<`m!r<5&s6WxboDjqnD}RVGt7o* zSE>ZH={!TOmUis^GQ9@aA7wb3*e|kA$FdT|53UkNbiFZze1_R$S~!iwYiN_ZvQn{u z4;eqcA3q1amjX?jg#5puQmIg*nqZ!}qhsQ`PPG*)!f`9Wyb~&wJ#9?;W%Di2)LhMe zn10U)6hea2_I6Zf!=pg<_RRwcSr&uP`^OnF*#qdiL^k|NU{vsMTFqj|KELRrTIZB; z(1)Pbr=v-E(_zRDM9R;uTR-or<+ggr3?&dR<88-YrZWSE-*L}Q_T41{YQ?Vn69GF` zY0D=885BpUD4FmKW$y+fm#7qQ=Y>BNU}%hc=3s91ZShbpVemUuLI~f3rGUd?ssSZ! z2V7rR=d?3mX9MAD4XvFcSy`^z<%&Y_$Uq-c1=F1zU%q{w77G@D zxV~IjHXEpI79?9?X6gAzHn{}-UUO9GIf7GGM*%?WanE>!zcQ67y94CLf1jrmt4%4qjtH4u`hee$G{my%t2OQrFoPluLI^key-EVb;|fzL#LLj(cnm07pBBGNCaKJarhgcnFfN1|IXkWw6-|r^*y2FsuK^v>~Qo;FfvVSW< zBi}I}E_Q5ze>dl@4;MuLI->rt5b_q!9(#o|9(fHBuTK8Ez1RdXY+-^x3NMDp>Hj;> z{Bblt?D6AIGD6?miA*buS$Z$SU3J5p9I)2P3u-N_UA=Op(`ENHBN_j5*r7xKN_^m>l3B%hA z$v%PrPYEmz`8Lr=P3Zfb`S?fi-fAS?3Gp0wAm$hs_%ssp*t5$k-yR7wCfxKjT|)T9 zJxc}Xc1nHz7E;Uy75TNkPev2&e4RK|96`kVO9|Vgy=Dk#{cX{3kFtKD*e zKi!7Gvk!#{-^$%!++j_`Q1Z8azwmNeZRCA!WQed{Zt<3^G5B~x5?Yyj+|H)3*uXn1 zSYDobn=NQ6Us2`FxG*hlN6kL#w-cY zLWE_a!1b592jDU_AeJbDaSt=p2IbzN(`xFQ36`^lo_KHL07JL$gPxAE*T;d`>v;#} z-LXK8Cq2=+`)+jOUt__|T)O7Mj`caoAKRHNGv*1P*Ak!@H1eH(jNl8&F(W{!d^nV2 z%c#7E$wJ@v{m$;gATr-KgpXo%@qsslbvNsr2Y;0j>8z zg@3BIt>0{|VvLF$2dVF^3oy$@GtH~{?+*yU9m->HDt0)&T6$$F*~#yy>|ugiF^A>| z(fTa(H{_3B-UY23npVnT^2s{fxbI&_H6wBjLE6IE8Y*B$w4YvxQ#CMw(;|&A5{~nn zt%fU;DGEk$S+pkqJD(MJ7De92o>qz3QkTGBElt0?Qxsh&6V;oQzBQ&h`# zSrH-0A1x)T0q0&wPmq_mQ&1#GC#+#A#t5?2zbUHyfaa2o&t{1{TV3C`?QQp>Nc!xT^b1oNjp*?oP6romt zBB8ze!gUJ3hjw#!ky_82Hv;*|pF7L%ae*V8y9pV)e8F0TF0_GmlN=ztB&nd9Be z;-Fk#(6OCXwk)BlP`)2mf_+SUJ5uqNdonw^2VxT(1t9|*4Irn2UfAc36rvy0IX!$w#5krGa=B z^vpHu*j&_{B=-l?ZO?5k=t$vbOzZw5!Iy%x_@H7AzfdBy*ArtW%-e45JCWRaOf;uZ zVd~brHK2JAfw*9_QyGk5t2;e)JPN@!2@#r(k=HOBL15PX1?+KwpMU&rK3EGmzE zzyl0O;g!zfj84yuAUa{p05+TG1Xr2<-XbH;2o6RcF+*~ga{n9ByYh%gYsO@4<&i_W z-?Pu5S>}uYg;atZj;tUMHLEgZD&cPln|FDLR7SoL{B`)FYj8z)1bQ=D!cfq4KKxTY z5UC`)XUzhNmC}P(e#q6TtGIui24MotyK4@675eqaAdnSO!Pz&}mtlQj|7o5wmWZh6 zQV`ElB$1(tCk+-J;YCdXqlQ1d1|szjPa*>IJdfW1ANc@n@0Ir<1EtqyuGgW^*0oli z)8FhUnms6+I@AJnlD=HBL6f`7Ic4j!o@;s2%RN>$cDO1&T`~6zm={kay|VW+SQJ9_ zeI513c~zn)Cr71P+*G@d`QGxyPqE`mPZ15p84KFOIi*A*deuw2U>W|GP^`{Qjyv+3 zFQ2a~CSDb>(85P6&yqV|Q1+)xX9*L}qg!rQ3lP^yhyM zj|>nC)2%`M!~%RUYE&>JokgA^460NCB-#=`b;fKme@b{RH`k2V221GG=MzubTRG=Mny z`5D@aQ*7JLT>6vabdVLe=41W+pF&-hTbKbE+!HU!3#$y+_5{nF3f;4AO7cr>bk7^$ zjih30od~KIra9ls|1kl}-M{1)Adrfx&VrkXB=k70S8$neH- zs)Du$)vffeC!P!2{_1(qq~YpO7P%)Vyc4l0^Ne?^CLH)*B zj7x#>#;0vrOWG1_9-5=$RVo<{F%Ks*V~GgW^fie~erGF%St7kUzRYmck}3d-ru!t9 zVf~TNfk*tE{u*c_ZkMNJY!|F>UQyQTDU8>Hh`sJ#qc2cZ;iOKD)0SQ!A{#%_Vy}%y zx*CUx7wb}ssXA=(R8^_L{Ea&~@x&J43x@dUk$5r$U|Gv);51XZRlqKuX`2|dK@^U4iM&-BYlj$XN0JPMw0-s zAzU0Oc9X%br}#5*)Nr3|tCMXv(%tmn2(Y1bp}Kf|G)#OOdF&6JTlj#7rlx(8EcIV{ zx>x%|fCuxCEUrM06x&C_LpMYKHYXa&vmx})9uMS43(gny0t3+J{2$RhL9_8gfGw*gCa{66feWOz|D>y0)-%tvXu1Q<#4=a2m##^7LW==5L7=x@eD`R$hnW`M&`(Yvvd2x))z{!Hf0b%ah$JnB8_PFhT&d9EGmYfn;hbuMeM0st`qXwWdH8BDBhh91Z zBhaZ)!A+JW9Y9t`n}3g`SIg`YdPiRLxSZ3Z2GDiz=|dWUar38Ui%gsX@?F~C{xBr7lO zjhy_Z&?6L%0#QJ;5E+I+Fwa@=nyUQpM{Nsf@xXv2=N{eP8d>a!Zh8_J%6xvD9 z&mOBj0~#89zo0DX^aX7Zx0gZ;DhF4VMrZkS2WIA;=^7leqM&$`#I2wqk7B@!h7HoWC}k|7EOV2K ztcmB8pjO;NuoFWg;qCDPce8J&$Wi}Ssy&CHXS1A%_3uO_7ZxCrR{P+dVYc(|RITp} z8bQh5hH*Bg41<2I&Wt9O!8j@2 z@#XT*hk+ZkU2f(YcYn`Gjzw`C;9Er*T~>nClD-xkeJ-&{(f5 z+B;)C$1BXg_o4%Yddh$6K-JuA&`l@>de99Q-48OT#C;E9Z~D4^r&7{+XTCz71O2%P zYbk?0E-vAv9+cQ>^ooOx%=Ypq5_6CkQ8JFGLkn0i@S6U*LfetukOeR#KkNqcUpplq zhJkDN&&1jr-Ou!We_$J?$L7kmWE;pP+UKG(_M2?zp^4MfNn|pBd<;?kiXy3f__np` zE)S}23q``Wh=tNA49}FgRpJ9T56;gH%kpKC!j-11p#CB|>KG129fS!%CO&jR$3_Wl&2xU=lK+TOiUn^bs8b?m z%XAhb`VnyR>*WltZ^%Q8%;O*OkU?eX`D04m-oyDCf2IiZ-CZsG;^Jbps}D0iSQ4w)(W~iO+KuT73WAx7N&@Z~|FO)T&^AasO;p!H1` z^u*!7a9UJxYRXj!I#OxMqyNU}r+)un(ERhe)on~=EJAcHAXle4vTB@|bn`Eo^h2>X z&=pGh!O^Vcc-?tst=_OjA*k$U%15$VTsWaJh}LIo!4L8R`io%m7JYOiZ2T+g4R(kI zMn2wF|67P!PCvpmx#AcZr)d|1C98=s76;CzmJc{AQ43*dU-u4gg7w*ygoeitvzD|Sxd%Z6s4>t@NUkfRoFz(<~ z{2BK>IMs2af5|bF&L%dC)c7CvNimM$v?#+6>fNVLQGp3TzLS16KgxEG_ypIVzt(*a zrV@pU{N`27jptTo+dW{f3TwfB1}o!=*hhmBjool4-T`PFr7jjFgL`(}3w z_bTuo4tFHO!}>vy5Z0!tNyjz9s%LR&xG$jtd z#iCrIm(xy>dh6IBbBk^@Y&)QMxB1 zRXTvriw&U9{rl~o`cbVLJp(3KuU<`!8;S&8c$pPDEYeU?ccBhvHrMf#i8!RE@4e_iW@eMy1k z#q>%9^m3t7o~PpatW~G+$h$9Sy`>1)!kQ^AP;@tHf1?E`a*Kpe2}b>=Eum6u+Rko| z;*PU|O}K~rDH(&JZPzOub$87E7}_YGG}#hMx22%87-~wP&$(0F(-xQ1grNMZlM)=c z@kdqHvrL)oZa_qDcRzK`|KY3=f(GJmTuMVCrs^f^YU%Qtfk_|U&v~yW_ywj z59k5d;!P7U9%YaiqPvdAsf7yIhGL>os5w?fkQer2qG8 zA5*zPxknjWlif7l5%ikSmrp<_6Lm=QCWv^DJv(^tr|P81pHTbf5y@F;YZzx`^`Ky? z`+RI2`~xXO2(u^`%JL!}-@ks2g#{`^9&s@EMoubvI>&b46^7~c$Z7g73@8P(+)Bp8 zG-!^1oOUb1YBLwO*gW{U;4x(roi0jYM-)n(hM%l?HM9;A8M2?4CaZdBCx>b2B8nOtGZl+BAF>EKoLox8L!;o)T z%ZtMoRGLJU=X1{(IF~z%x}91gt>TcQpBg(cw^Um1Bt#pNoK6#FXu?G|PA>M2ThZH7@t#$nRC)yNe4r`?&>*iV~ zc}f2^?m=itMzuvX(PIObvQ*Yq&l1Yzbm6abDo>Eo5BX*+ck=7c@W*K*l|}XHR|Q0DYt83DjQ>2wR8zjP_?w+g*BmA2TI+aFYQNAYGoCFFA4j_JT&dZZ5EN0JVj&0_U2v?8uhL_dP$5&iOaWZo zwZu89w(#WdRzx4cN#&|u5zBFNcu_{0tIXHhr}9th4|AT!ARNT`_$lDWid+kIND#0@qYYSIP!~vt8 z#Mz9pRYGI$XqO}^dbj%l_Sz8VZ_s6QtM7tDRvY%0pIp-?*knay+VN;@$s>LJj~`fH zCTf|UMoMRBYJeXf@R1*=0g)8B*M_LM{t^08Lwr0rX|Xh1ATK6>4}8%#nqbLM_C;5e z*O3kNjutrE|73r3I?OlTz9hDYtEb1PDJ@{7T(~YoeE(V z&|h6(vBr-|IZWu+hR*0kc z_B3kWCrL?}}G0y_M*OS_H!$q8wGRj`gZ13)PJ!v~iX8W&sj8XHoAkT%l)%i34 zcbO#MKZixNlH#sdWN2QZ6{n@GF?o-bfb<2`PVeOqTBnbA2+#k1GV%Yj0I=yK|G{>G z^};!_C@pAj9BQ<^bKd)#QPR?kx311+`y9>uu=1-R<()$*Bwh$Hpm&iXsnN|KblSsns>KkFh#yeA4o4Mb)k^kEz8^&(Gv0}1TCAcP<|>A7aA@5&3x0V z2=zO)s6$lldsdz=H0O73u zT@zT1;LjFU6;H{KMMBi!;E{^xY1w^Hf6UFuj%nXWH`TNBZn>S`UD8Y2MY~$K}{>a}d)-+mvgJs8avE zD6}UbT+|7>3ADT0plk-uYGO-N7b64en8f%ofx2;~?Z&l2zCTY^u8;eZ+n;Y?(!Q49 z^qiD$axi^tQT!eUBYUNuH`2fcI4`l3AHa~uKDkP4sNPg^4e#(EpV9zbmu-#p>!!S8 zS(0FJo3?Z;IJHZs%M5L=!qI@^94@FzMPI*4Xsxo{DD0cgsR%4PuhkEX#6HuGN_^EdIM{VLpe(b18a@ZwPQ8tVyzK^o}^o<#9078|i1Qyc4f=trV>NTiy5bak+-l*m}$=seSr8KRqaC-^gv$ zwGRTj^F6{oa8<{rQLpr5L~qGpK^5i|YlwD*(`6?6?}8<>^R{-=6{^nYN-JYCF1b#2 z-UbPn3LYeC%=y!6YnwscB8lo)g>_wKV}EEuO}Z}|Oyb1C!7OX#E-6VCS{+|@2(}_T z5}y?0R=!O4M3kU+e>i4vjEp@l4e#$Z&Tw_`&lu8`uieTbi`1voD>e#lu|QI^2cJct z#N^6D+WUU`3?d=@D_AfJWadsJ!yB4FQ7 zmVVE&jf%}0*tfsYkqYY}spb}m7lyu#pm2#KqHzC^*+d~ah_ioG5xY3+ZIE{Ca7nr!c3Q$XBcX z;J+bqW{L1pVOQpa8iZIzo_JnN_Mu!#pJL94Q@jW_#&>z;y)-O%CT zlXbVx$r%}gZ8LH__5NMlQp3CZApi``2;Oxtm2jjVQl4l!P`2%`6QL@Wj*VAgm{RA{ zq50(V!q#T)eB^FRMUA6h2=50DlsBhc7I01)#1%U+($XArknV~rehq^egilr5(|>fc zZE8Mn6~&elcl^l>k_Fr(zV3H*L!nJ$d>74y;PSVgBhx*HnTbo~_A{q60LR53TARTN z`nI5eB27UmE4nSw{-vFg=}kge{79{*d(=FVJUKIGMX!P^%FJynTdUq?zJiQbSy#L@ zzUMnln zHL*M$B>k$oBBVnN`Gz(1ANo@&`}3P}6M4NCymkb{qd^P-cVtL44LiKZj=p`W%E;#u@nk+@-cfScQPl<&rJh%?6<3X zRwG_A1nEcb8TIDp{3l!m_3&wt9eLT6#G8?>f=0)A+@&0JrYVU`3@p>4yQ{0w8fs<3 z3_WV?c-W*brGpWLHxv9Su2|ij*Y;-bec$KmMJj{8R~T8Dl3;VtC!H>`+#92(UOyy$FllDUc@0U4xspz z30nTRECAf0{9ap1me}{Q!~AnPNPF2EC8{mw^M!8`gaDpMOrV$qnfg~fNoqkfL%#R$ zSQTXn%IhCaXkVtB?#Kz$S)AOJ4$xboW&3U z&8XT2dIG!OLETL!ARAu~`l;Z|ptajfe_i7vd0Me$z5&CS;&RM*iD(Wv-F2brDvCGQs46A0wp{{9U)pDJtq%JRHF33=cW+1a)e z9(h!iKyv^7{foC2uORalA0q9YYW}bc_@!I$xZ3W92ueFYHB;EwJ1m_F1Wqza&V4@P zMVN{W2!^dC7vxpyeme=OJucsV7(Ub;fPBRUNHglq^h#*o50KmTA*!X~!Q;rdAL5;P zhEP2iG#2L6zVJ$e&-bkah7H<+SWeIR8;D)hH+c$3a*>MOrnKZTND9j~T(Pi68|Mhu zqnyz7V`sm329?KV{^EXrfv)GwgqoE+mltXK#Y?=gu~1XydwQ``2J+f8!pr})fZQfg z>6Lm}wL5TB^8CnzdDOu>U{$N;!EcZRj}V@F%00x6aeaAS1$z~&4CUH^eC3PR4pLLK zEZBAKwK2H#htH0@3eyWh<|eDG@)IH}5*9VV7K;O}bjXS;kG@^c--bvOAVIkg#M#lL zpDO;E_|KG3%Ey^!PChZF$xRm+RF3wtYB-^Ej8-AynN4<@{3(G2RFz7f_b;u=Y2Ebt zg}T3nx?U;9JpHZ{WK?|jtb^sqOi{-RV_Zc~B@(QR+TI8ETCG&O@T&fCG>Y_7q&vXG zwIhI!_k+)j(OwHUR4AIknBsfuvUBWtv1?l*7RaU5 zOR^d*;;6&#Fph_7SDbKKw#i;_F!FNrG_Jb{YnWT-cRqbxHL>kkY>4FwXy0s?xRMY?4#|c#`j^M!39o<=+G%Ehk)AT4+^m zxXXzQ&(r^=^4@kPOb#J?hvm6w&xQutc?0%hr%Nl6G;3MOKGWwOjX%+@!gA?gg=!Ik zx<_yPi9o1cis}`L*@n+qn%CzV7oXZcnuxFaE{H0V`R<_`*^jv8lF&PyzZo-X*^u@S z@*2VDW{gG1Ve*3tpE`A22P|ybYizmGG1(xfaBw=DO75D}@d` zK-)@qhy*&7=VL%M-}2(*wksh4T?C$NZ?WwU-@`uHYZHK?vC?+t+uX|3Ms}KoJ;b>%(?AR0_OP5VPCgIJ#ecWdaLNe{jqiL$2w zj)ttHqf1qo&;zHq5^pKEQ#><%tjqRdBXT(a(Rof*B{q_G$-i3c7X=s3kC;h#)gcBA z$6W{QT!t@X$82}R5P4ktp>E+YYJZMz1<2(CXQ}I!6_4iXs7v`xy`Z%{MV)K@GvrOf zJubRBNbKU?vbc&7>*^`o`vb4h&pWtteGD@?r6B=@NBvk9{?2UlfJY1)IA8bqc1k&$ zq!bS>iy?HJDtmQ`k62*(udAg%!1JD6!a|2HxwWFYt$07iNEkI}enK1LV)Q)sCW!3Y z)to4+oAA#3)SgDl2ci})Bc82BQYhN{*<)*aP?tWGgOslM@ct2W+nY)-evof9tz6s- zsn^%ODcUvQImyZBK{#ZqIkKU>eyw9;jCtOuNyvGSzZ(B9HEz(M?5on}oYX`Q`|Wd6 zD@54eC%~>!h+MW5GTBa&zua2AfL;ed8t8;!4@Gg(4*J?p2;dBXhDha%r5YiBloC^$ zUe@?bKh6mgBhnF0g*RjpoOsfI9IY3GPNHIusB*1fTzdCm4wZ?X z;sYz%0E`^AdQ5%sVVi~GxDJw!2#2Z{Fk;lPdtT+x zcFgz90O(JDW;D;by-%Z@;7YD@elL^lh!RP9^fq<_K3{*wsS*QlW~5yLSjKv@8Hj zgPx)Ik5Fv{9Mg&AVWqG&c1UkU(7Ct-;}1ec(8z?lfm+_%C%HZw{@>v{$z1r`0o8Z? znzC9LmumE`HkC#V7!gEM$haFwhS=|^Ycp|u-@Fb#SH}1?O`n_bMj@EV0bS$*I zH?upvwNpE|@JgHGUj#z0iH5)4SZ!GnjGcYn*^|tg+K$)-{`BRm&A9k_Ty87@&oze? zT7*TOfn%|W_919uqu-NQR?m}qz0l-FK{HAE;Y4aW1Bm?6Gd(I$jF_G*g1VVAeExKx zj66ufSy-sIT>jCpit9h;!l9Vl9zzsG=$&_*Z#d}98C@Qg%^x|->B}LVgjQeyH?kMq zrd72W&ED7$cwx(iL>8eVL3NU3GJ5d&!}&w9`^(++!ie5a8Imx=bI$qcE6M?^4CMUE z>r1iu_jgR(tkm!hyyPqUDWxivvlY6JBbh}mbHwb=a^smn{3c0JIjNihZ{3U6GAH;TIEu*Z<9K zB%rm0L4bB<%N4fH@mk6Y`FXsw(xP~Jeg1?rm1a)*dpCs&-FUL(^TwAz`u1yuHhGGD zE@17aGE{*IB#zVY^Svd7YpsdSn7?sp*Z1ZZfdmAuKVC+|=-thBx{e8$pZ^}|zLqvpQ{W8NMf0RelXWu(cfXqhd7lk`^+{O>hpKIo}nL;gcG7&(G~ zuWusE=PL6gwUI}sQFK1I(tc67E?bGoWR(gJwf*_sFl{#e;Z@EHwkXp|w=XWvzw(b| z=Uc{Z^qob;ZW;zS*&B2l^|^ooI*Km~xbXkJC$k?Eg($Ebp16?PV1||cMLJ5u{Ewy{ zJ^Sf(;Ir|QADg{%z28ZR{JyhQJVRST1p-Y~8aiX~+*CU;dE>Xq>_|sTB${U?4gVA$ zrQYctHEX6+Kk9{pH<#Vs<-Wsw{`~hz9{k_mX?`5FvbWpy;eiaTC+ zLRFmQBJIm+O*q54$U&od?6m@e?zL=Ga4E=BerJ?CZ=hXAumKd?H{!`1$1SpL6ESM- z{qNxIe)hfj57v)?t~|kU+nq$GoJ~?-9gWwBpaTlhgX3ov+rpOpQ<1s;URSvJhO!>N z%0h|2SfsnUFsij#9Yrcb$|$qh5idTLEqVDSvsi$bp6+gIC~9;Y|NN8&J{oxn%iefA zm@7Dw7EcXCYYx0G5So@#hKhJ@JlEM-6FoOe{?r~|))(`(k*d+t*OwmoVdEDA2y}6r zFueP?I@HK=vZ1#42($hEuZ4%+Vv;5Lzg)?=1P=u_4{ZzHkgCK(KfFhgC|5MeuO+)n z%hBz*pytWGeOvi)^RZ-;xh1*W%&JaBp1+yFQqh>T+C!R%5C64JQTuEABrb zkf7f^y~`!Dc$f882!P#F1uqQ#`4nP**UQ?=nbzx$a+Fu&$IEi%#e#p~$bk21q1ZwvXl)T2GEiRA)Q-o6e(2UTkZ$JfrHSLYP6f1 zKeO~8`XpJ3J$oA(-!VPBhX?N%?_F%I!U=A=FFfASgXDDmMoJFp{Ly@MQuChkgU~6o zn5%7YjtJG8ekQvfP`eL#iF_j4bSq53|HP5kDCK0!javC%)slMdSF5Aav-CH0pG1E} zrR>cAFtu}Oqysh&l~8xLpB{Swe&@C4S3C*jt7p#%)*T8uE_tp3)i387Ll*2*BI=HC zf!3P&#O3b1syJyg?lq!94J6;&d_4FP>y2qRQ65&rY3}KIofyMi!f+jIlm6B|HSIzi z^QMdDJW%wQ7Tk{(kn>dGV{BoB_N^eA3s?DyDY>6v0-bg87ffVO^rSSBrqa~7y<)=k zU?jv9>vu``>=h_kPEtDeM@t&di|1!eBu1)~Iz~-A8Y$I-u{72KS&IpwlJy1=4IFy;~#hbgwrtkHn?RBuC!(gvR_V}uVnJ3eT2c$}?`(OsooQ*SitrB?qm zN=oJcv)A5!Iq~#z6L@)}13kwDQDigc5Ee~Q!pplvUgsY?;fm%Cs6ILj{-Bd(hiw?E zdMOvi$7WK!<^c(wY9-Za=-fU0<22($$iZ@wNsA{L`g@uHAeaj{tD;F}zY3rJoty)q zhO2RI5G!3|3MT&LG=K2DLp4x-@HjPCphx<@D!z*OaqZ%~*~6YvbdkBio<08!H8M5t8`nk5`we3;d1= zX^H9h{9yAkYG3CGsgHys3L+8>`s+t+TIj@F%)H><$>K*(hW(~o*{$87S)t$!B2iqj zB7t1Blje0-&VNRRj}B)69%iqir_}LI*i1IVKvMQ3yT#*}|A9FUy~O|~&#H@mDZd}7 zTtfIfZ6#=V*Yv*XhDm0#6w%2li-_f7z=QuQj`T@R*1EC>&lZ5AY&b%Hed9{c-$)Q` zCUwBa(-E4ITrqn2Ip~aF=;rDTEPS8-O>89wu$l;lp(;EdXP0FTtlz+@`{5ZyE!NP6 z($2-hB~i4Wa;=XwZyY4dH5dv{X}YnI&fQj&DHCb+4 z@sK*<_QT5MQ`JKnWHI!5N+10 zp5cd)L?0VW`rq`Rn-=OPZ1-76@N>+ax^#@jwAX|HeuJ>|j(flS!fR_wQx1J10?F#3 z>W@dA@jGt44w;g6ItpUTVKDoJlg2iCGJU*4oe+fwk?7zKqETFC=s|+Fv+Y-WRtE|l zcbqF7qk`?*w8hZyFk8x6>#x)nCDo|UghjpJjyjH)P{Xu+-@v>)dD5r7IQcY*B+5HB z@A`$3ifdr+{)}wA7~|_ztB+u-oE9g_hf{;-650vguJdhMkMydmBKAvpvI`xaE2vS? zUvaI@K-%ohYqZ>7kfc_oaT0|@x%|EhyM3^`YwO6>WeHy6mh))LxX&W56w&#PFse<< zs8)$0ADq*Q&3zJcRiH8KyE+Dgc5{=4!L%5X?0b(=2rX4hZ&Q))rxgS|heWkiCP*~YNV)bYr=0bvjuQ#!4* zG*s;CmhcKbss7v{^6Xu=eb^abO6Xm{PAf3SPla7^qg{IZR3$7s(D|>l5#lmcPvsv+ zcV{E9Ypff`n9oLO>EXdvV#Gd9UbPxNeIFu8g|el%X;nKQjzo)KofGs?5Z%cYK>Z=g ztyzoR{N}^D|De2IFI7l;ZMYnV`(e13p3LC9+9uXf64CmSW8&#Uh*Rjjukq z-9BO)f%{^pjqo{?t*R4;j(fWA%;%T$uV{kqNIDcNZYyDDVeX;x z>m2yBBwT~tVsbfctAmqbSSu#(m>bb;O>|z?#}pm3P#p@N`QezxPSt(t%iU6VyjaSF z&4xp4*x-GKu1)Cc7@s+wmzgxVk2xcCxsofqyO?ABi1v)&p{HlZBg7w9&ln=YE2|XA z^vzLJNc}Lmq)VT!3NZmD?}J^%XFSH-3*A?*N%(LcLX+`nHoTLGjc|%jr<0QRaY{lF z$=p^5m-nXEYJB?e!3CY548+P%wqFF zst?dnmkQ?q03ZNKL_t(Z0OTHiWc@LLP+{)z_1D3lNoE0nASM7lSTt<8KaSgO2;|Do zE+6{EJyQwSX*BSh<+@|KcIMTBPEhjXm&+)vi<05d zwdh(^ZE%{M=VRxKF+L&BS#$RKWjFSj6tP*1j7&UorlW$U^BS6Q5D0QF7p7g(BRuo9 zx%PLA4>w~e^iu7G-^vc(Hy?(t8ANb&~Dg~P$ z%P5!PBc-q?w^FU>wkFmk?_=V<{T?5r+il8(pv=Rd4&5-F7U^y&jehzZ>pYzfeedEdJ| z`zO0gaodLQkl2H9djy#f{*pmVQM9*^QCaa-Ncg>#c0v* za4^es0)9qH&lI&sZSqB&YI0jMnM`q51O2g*`{zYO51KW#*OCA4)76}uCMn3 zKA?&4!Cr}!P*8n>Vo2VMj9xiAuQm9n502C1gXf+3>6%HoSFr0HbM+*v=+$u=z8wVK~~ ztvauo&7IfS@QS%J|JZOF$sh~wK(Z^og z`glXh#l+GxXY-zun1F-jS!+RI2u;{@94u6QT4Y5rN-q|?*XuZHp?YocYbS+p-srU& zoDFH~_WQ7BnLXWmk&Ke&gMG86XU#dqYwci6rOuw zCx+*@-#+_0afLLpxR%=s7U24H-jlNv&USWVpYs#oLvyS#O^bJS_UZf-rv?f>2_qZ{ zCS2=u>by2gd+=Z_J`L7UicK)cC>fs`C!VQES%&h(BtDyE zg(#%XgP(wp#!DgGmsJ+ksib1!WU_W%HvE$ljzn)Zxp)nW3)dzbtc0E8RTz%Z9Rvkx8DOsM9 zROS6)e46dn{t-Euf)TFSZ0*!{JU;4!D@RH%e&@W=E8b<80O$Dl!Gi}Lp_OAF?}Ia* zcgccoOS+gS+QXub*x(*UI$ujnNI!WU*1U|R_ zbnTWNQ5ni)=zmc$LU)!%=<+*muV4S1f@pPbmMT1GfAI^FgK*kub84o1m==D&@dA;)VX^%!e-}~*i z`2;2X;8kN; z4LarJg3lfB`5lYQA9U2Zy9YuJZZtHNy|m?!GW118oY6E4(Hjhp&jyWj6nZES(OP2~ zo~Fm=Ukjfe9FCeZ2t?5gY`Y^x^k_5!KJNQ_S|xm_Nq*EX^Vhq;i-*)B7A(EsA@RK2 z@_v*m{O|Fh8tt`89ePJEOAgH*LCMpnlb(*Y3qbjH@0Zu~r|vNmAA-C-%jX@s31WpS zr$Tj6huz>*X2bX~Ro1PBxyXjchA1LEz3AXsySZ6D6nt(LkHnDxwe!*LJx3qfFI7e7 zn!{&mhaxn6IWG>)U`XmB4L^cUvw8dq0KH2Ia7%74~`OX8GWxoXaGwRXL3&?7Y_3BM%PD z&4adB&Nx~)@NV24_;C1PSvt(TKA?2IchQHE)g9PDr*nkQr)fL_Lp~0@oX?P=r1%^k zzk0RjhNI`05PJ9HK=jSRbLGZoqDRL<1P*xDX9y(xgVPrT#=t9X@ME%#X(hZWfN6!}~)$!+Xx?uJ`4*%!!JsGN7Pk4 zK4^Ouad0gCkU~Oi;o%!;zHy>K`s+!Qu%x~iaEEv$)wkt ziBI4s|L<9K5DdMvWLjA%lzKf{etupsW|Z7C8@U=rZg6bprB1irghP((BpfX=A`f(P z!*)!EM;Tf95lu|@E9hn3`^vd1nyM6iK1|1BN6%OWy;X4Nw-3jmxeN&}#}`FnNAM~B z-Q9|u%-ZkTGiPQl`e@d=BzoRnHLtkzk?14QW-77AzcN00Jn&R3nyBZQ!%u7UhE|?C zh(23=R1#G#O%)%P+_e;V52rHJL4m>*s=3e4nM2Sg*7B>YJ|_57tfOfzTGlakUKOJo z&Jy?uLlo|=&joxQ3qC3-4>@@^1?zV2ztF@>@#$K8+!&56IdZogje(a($W}ushJ=@m z4aNuKLK(u?b2lbv-#wD}fSgMLr%A!5DeW1Ak16jH<5ch=eqc;+Cis-LC4r4vtxnb9 z^M<3(6Ks4vFJY6iPv-<->E#{aB7A}&T;2``&WgLlw+f8E=!wu{@rfBqa_DCFQ3#t< zgBhjZ!)BBf+i#I}gIf|6^I()Lc7fIqWpPm*EokE9W?qk%gB<}|5zzddr0Mva&I?xM z{lWq0;NZ@IGaSYU4Fg7a;WRe(HPWnNC}K!UAHwIE8=j$}AA5SE7*uaxT@^h(pFa~k zm;3w8eTUB5rqn**XJK~ap-~V(`T7ZwLV{YQ~1^Nw9|3Dm^@Yxc4sCN}T5`8h%u?F2G_M_AlW+_F(MQ?p~t@=c9^0ezl#c@sX=I*EQchQ`P!#=eT`DtGh`qla`td{ zajISPOGV8;7@qy+*XHFV;bWRX7WBU#>U~YJ9bWdKCs+Jn^McbC&EKhA%;7WIf;c$g z1LgK4K4t8;L&;tIkJx@KoAr%8>*31J!N-J=uJ()smIyo(O^4zpSR$1ukB?8K zksDmnk11#Tn7k00seK-K+0`{ZpzP=&JAxw>b>?G&jh(LN#^b}ei|`o?2E)YgDJ`NW zltwx&8>dTZ_a>Ci*DiT&=twiP$1}6Ny2Xdq3HSH+zf$Z$^f4VF3)86&f{Age`cMWR z)^-+rN`=wL`w|d7)Vxu6!p$_m=SewOda*gA7z$$2uGfsOdRy^{3ZB_9CwbJO9fQ-J zg^wTJO_01OV|>uA^MD&%%8yA^U?Y5lvNh;jEkAal=P@fAqCcJm!67NnS5~)3f8Od- z{MmK*3~cC;_>=f?EU_p>k*|khhO~6P06rM=7;?$W;&auM#6|c}>5QIP-b`CaW8;&p z${Rx4nYC4aJ)`2eL-=e{t60bJ!x4y9ez3Vj&PasMa%Aa+uA9gau2NA$FQ30~kD|{c zRM0;-YGD(g;1i~3X?(EVTLM1boOj)?>V##TthMu!g&przn!rajsF!kd^ze}IS)|(M zD3eiqH~<|qr1qgZxjg)Il|5)YeDCWFjp(sS64w{{}NhHcm+_wlIXhDq#pH;=D z?>(9Lh(l~B82q)RQOpxGBV+x^lR7?uS$ult3D5OXFjrk|kQrqqc(kh<9F}!*(pa1H zV@eq61Q+)pwt$1HN15!=Ao1u?Pn^5&|ghL}-u zr=ge$hGiWU{0V+c!K+m9S+j;H9-XC|r5lG&7F%8!=xgiQ(G;)s@$+{Y(a5yA&Wg~*`|*1S^i5$EmA80 zI?7`6u5NgGuBKHrH_}Z^Y}nGT)j%YN6O!@iX(We1nA&~{Y z+r8)5^HS;A`tHI{*9D)G!HEq#co~LwiA1LSjK{;-ktpC(Z|@ba=cO+G>H7Lr3ZEu# zcU@uP)igb_3uEDDVA-M1is+;1i?p3tTov;$!RMT#Pp4F9L4$4tZvw`r5ImXK(ksTt z5LB@a$#T_M(DcvYvs_E;vZwIzhF&-uV%-Dn>=A(`T9 zERxE|?pgdObv+||UNxHmA6G8#U(%ZM+xPE*PiS-e=cfhpA-G-(u~Rg~u=p(aY;Ha$ zZD)iZ(ug|mkgUAJXH*suOya1e_^2lnJHin@Nk_N{pIk5xgcHdR$zg#q`c}^%h|yUU zNqMz-kKF`;4;uHeq>~Mcg25+w(OW5aKc+=1+-vYrjRlEkyV+gF$4$3L60`pk_sY`- z*!{td>{-y7PnYQVUaJA0lYze_;i0#d+ z<0FBPKS#hvgu<86-*2URMY(s4J)x{8fhrZr{{1eU5+n=3MuR0)Ys}9b!$6hr(Nm|W(g(J+P2^>qrFXNg~=D`zTv-lqm{#15|lQ37-LtVWhzV(`AaxENa?Nyl^6+t>t4 zrupQ^JUYXEaE%!R$uU8WKdX@)9Q7xW7o~9%44G5{;UjD375tcjp$@xET7eA_Rgms8 zhmMOrv{BKh)R4V?>hIJPp96_LAjdtv|DUk4cWo<6!?;lA#<-FYks?+WL$G`sffX~t zvd5KVv%AET+sMnUq{0x~I0OQA5tBN#27}pIZ6IU`7)^=DOV$G(U7MU?^WX z1E0(5ySp!6{#U?I$rt*|k2eVT;KYU;-hkj3Da#LS^B(yo`W z^Qx?<0cI%LDk|JtF$xL1S@=HL|od zMtQKT_=x`8QVi*P7BU>+PE9Wg$0#Ya?~k2rT_ z6Ha0JBW*L8eCH&jHbatj_|cAsHeSca#Y5-l&uF}C^tlE;m!JItK3}jHAAJh*g#Kw& zT~)Msaq$8IW7vU*J1z!?LPV9g}2;Na&SlI8ZP3M7c9PB4=wtMHE3O40jb8(x4;B<)%E z^1x~vsv9@k!Fe}9k$P?DOfU=u!&K1Q8V3Dd)@@O@Nh1zLH^f{giN6BJ<8j(;_Y>jsbC?=p zw~Jl44;G6otlSTC?t5{W$|aF+(|kdV&v4eTaOj+G+#lxq_WdU&cLAf{-I70)EIKFj zq?~y1aykm~n1l~p3gC?5q7S*Vr+s&AYXO+f;L2Nu>=t6f|~TK4nFQI#m%~wT>2Q zN$^9!2NP%aIhl=jf{Y2y8J|8KbtZf&J2m6z zC5D1K)CI3-3u7F;)*`5fo~Hbd*8eTgYgyI#XSQ)K7`JGdC1 zFo&{ka1N42aPta6_});*J(Oh6+#O}!cy-|i$DJKMhuz)Xv5Pkpedbt#5a`k9qx39_ zz?n$;%1ksW3`MfhF^Rh}LE+}+VQ#~;2qE+*b`zM*I5p z>q!nDYP|kBbv-70;=X+geY;Or1^5);+#z!G|uh zUjQGxd%a%pWFlvGo(5Tb3_2U}IIx_@XEpc%lq2c5M}kkQ#qtOJNc*y*6KNqx?BF~< zFz2oMfkDH}pRJu&fuRluAaGm_vb-j~F(<(@2>yL|O4;IsAWyF+Kf=lFOl?%TKCyg|m2swcwdbEzQgxHUUFbDxCI z%vC@yDf&?M+UDb`?puT81^7Yt&iIT-fAW38;>ivbzIfUuM=u^nD?UX*hg^)!IIvua z%p}%>2&;%_%7nVosgc%qoz)AQ^k0wgaoDJZg|~y-^w!{2JtgQ9so~lCF?lUv-r1^# zDWY+-@RkJ3&r`+6(K7}&-*}ZD?@eiF5GG{ZwhxwV|co?Z;jv{;ptSq1Ox0`K;52-LU z6(85?z*MJQ_mgP$H{GbjL5IFbBI1H3ci8Zm+clS zH+u_87aFlKuXb?aCfMt;;XqVMg=0Issg}cs0Al6U*bv296722{e^~9}jt-Q-X}6t| z7iBE-6^%O&46#0>6n*eEq=6%eM5zpfQjJeq0clc;0?#wmM9t&#SDpKhOG9V$?QdvM zs9`6xU5ZaCk3ztl&89Pjhdzc1^SN$~IPyG2g-9v@~lL}$(>=;ib zc7${I1Y2V1uc(?(N3YnDX=B64u=3BemyV-5o{A4Tb~?X|@FUunBz@WGT0bvMVqJ9; z>~)pU{6SNm3mQKrrHAWcO`naNB|%v))4QkaKJ7lO{7k3hvDZGAlZAXrp5S41AGx1Q z$!qFXD&!D2{G;tNnr-TR&FZH^S?1Xx-FWDtKD+g$j|`pfi95db3Ha!K`!#mFXw>{U zw@O4iWvjEZDa9Ki=Il&=&shx0Vj`{zeLBV`am^RSpX3zyG!rz>RDPgu-ceH>Z|OBA zd_ra@OEIcG?(|uf4b&>vK5IP36BSl39k))~3LYQYuMqXZr0KOU4L(i3rNLfa+%u->aeOaj&h8{fzB20 z4Z5aA0M?QTUJ`T^P-Ixwtq8q{f6=A_;o~5!w?(~Bv@cQRbgUs0jTF_`l-&e7l1mvK zw#GzCS_?yEHPi`yIzf50k#n?I=R0RXZ>B;!?!?co3wy%@qUY)15l;;v?{mc3EKrDA ze7Ksqk0}7+DC7xBLqC?8U^L;>F_FOYjVhj7rl-XI0)hhWjsE(*)b-<1<8^t7&I>6F zH@h&J2Rzdrdf=BOEUAU&D&yp+L$?SC(u+y^nsZmi6r!K zg=$kxb&Mwy3TS^^)pRoPG?~xqd3;!g)%RZO8ie$4Vny@|S>KGs3uR8&?ixcT_46`z za5VR+n31xdDVr=>*^mOvEB8|R)a+?33BrB-U&>w4X?XB}MKOmRIcrE@H~t?003ZNK zL_t&sfPSM|XAhFRN3akCJG1F@c6D_%o9eonY9XY!q?yu_h9Mok8_H$TMSX_QQ~I}$ zKF7xo|M~0pQWxhg8+~qYT;s_;@VUIig~8{qUjrY?WrPne2a(V+ReqQpkI&iclt<4J zeNJ1WQU67Pt*?>8=e$XkG>&BTA!O+BNsOfz@QF=z%H^^@wQT2K2bd&LE>5fL7ZF&Phv6)~+8`?*KXG<&K$C;^H5HzE*w5$|AuZI%9xAk731Tg&un_7AOD%Aar#P^I-%<4W_U+ZHS77Is9dq2T=!$7EH1@FA@$t=mjL$yPqxi^fJ~G+eU1=7=%#?|l z%`^Z>=;8hguVRsMdfGztaV#Y+`ZSxPdeZBi!=W;f@B<-3W2)mf!s@;8vL}<@4kZ_x zs+w(^2~r%HVwjpLWtDd@e4UEI-+7Vt2hBJekx5$scx(ExpPjgiMx9 zGQ|5oVQ28tcDBWF$u67V>X!!73Q3S5#*LtbC(_nM!HRFF(M=Us23oLXAhQ`Ti@5)Z zn}Iwc(>}pR5n5g<^c93cM@kW<;L5+}-Sa)?+4%>lv3eLSDbDghqXtV9GZGU!IQ8b8)RuBld&+$IXfpUQ zLAsZdZFQ!q(!G%-0r1HP#qh5;H$}Pg4&$@7=JDzE2pDCDpPoR(p@*JRK9E^_`dcCJ zz;g?*WDxS__Iq~4bbJL3e2&bLm!s!U>7ga%a4{dZsR^Gg3ycpy;qcz}O+@DBH__%L ze5U7I@F}gYU`w+@r zLH&y+?q%Sk&a%`!WbI4Br=o^T;^*b<;K&gr+fvqT3C^OCAJdQ_3d~9^J`ZN5#y<0# z8idvep9{d#qJp8-^Dkg0s+}D;trN{@#L-rNSDVtxjvYKwkk znu8086&kCuL1=^zv`R($OT4cXAdzo!_;?}6N5BW`$k4u=^@dDhh@$Ch96mgh^-X2( z$Kw#+qfE_j+<{o<^XDAcDNXsz#Ys!^7QgjPB$5#1qLIKu zhjiGskrSZ6bAEolZxOOrRezAXtHI_ij0$lxP#^bWtm z=4LE4UxXn~jECq{KJlLbozD!9k2w6kna_W8f2+qd@p?lQ z(VrfLc*S%yLfMPXgb(Q>AoyUv-CoS6;32dnT@w~)D^?*;Cq%jeHSlYSd@L^$I zm7*)fraCkT!z4^w$)T6*55sK9BnRTV_{QZ_&z=5^qYv8?eTp7mQ6u_@cpZsLiPR&X!J|cZsz^wf&pTWnf=&b|^YC}(}#V=7A z-O}0_{LtI2gq|+7crLZ_`TF(in~!%te*9ASQt(W@36=B0_V&Mjc-_##dfZ=WAHxdqMSkN^_~*!h>4>JY=^9e(`DV}U;U+9!$)8|y@OnC?<^eDM zLoZDUpLUuMKp10CANODplLE!327ZF6j#zp%8q4Agiqo;*PR40iy&z|D+&P3BfQr}w z9|ihzS&P$UhY9DB?K0wJ_2xg_R zr3IAh3TQ{=1)t{TT1N9M%4)5E&=e|XA9ifXqt6M)pxdjft6R90xFGbIq7a3kb4TP? zeylb7rNzf{G7h0p_<$S)p#Lr`?1h!m7kj9En4bP=KaM}CrHJuK=>xGt_|%g&0?;B# zphiRRai_02RWe+Ltp&LfU=~iEOb#Eh^uin>I5MfuhD@|4*;5BPnmMndxh?@_UE6@Vy@ArovnSOVCL8NSMT4zE_pQ?L=hV*V_Qd}PbYXXVG>ryajNLm+qtK#rV@M}#y2Q0dfZ&7A~0cEf%298 z(F{5yiC2Lcv5P*S1=@u}hD?Y*WwnDNeB{b|K^uqux;rJ&j2~0%h=RPQ_}o3qOKWkn z3JaaHvwYG7JA9jY%5;QQGTosSI~>ba&V3C%=sxf4>|9-C2tp77LYFe>a<5$n&z})K zBMYAB;J!Vy-+suN&P2~qgb$vHzVagw8GZzs8%bFFTCdZWOI=L|QPQk8lix@g+?}%; zG-s-ndBjfZRCM77raHlsi8pl$>cb~9cePd%A>7DJLbShF#csx^H;J1O9@0R70@U2n zI)aZD%kyy5p*v)Vf$Hbw?ciqXb(LoE)|k-vkvnM^$p%B6tRo8TgeX2gosphlQH*Xu zPab;mxXS$GyZfi~L;W0kmP!((k!&)F3|b9Vx2kIcn%JA65ITnK^$REgay8V$ln72!CSz|xDh+}Zf3DmEn5U}TdESAYUOe1EH`R(&j* zo6j5lol-?4S88+GcM|ovc?>iHK4s}Xs~sHS!xfkrNfcN!SaYZv>UgVC2G}~Hz>R1yxS#bQ0et(kT51I}RQsIx=u>|D%P*bI%a@~r z5Fz9qcQAW<&)^eNGqUO2jql0BLx=eJ#^-jk*n#V@dlN)WKluenviSeS2nd$p~zacvq>Ue&{ z(gKTxiVv(yDf;9bK1nnA@L>a*h2NhDKJI7o+Tl}wT|Z7&#!toqK|TiA!#nU<+Sz&R z-W)(#gx+f&BY3W_ZP##^nxUq1eAkdInDpHK9|=CYMhsy>=#kjNFMR-1=STx~>cWr& zon3vyTF+oW?#j!g@x$jChtDFE=)9?p_=uLvtS?sNN|?=MXMC+=4#Y7&cm3w6*boL! z08$}?1QeWYYoZ^f>T`5mjK&ik%q!-CF}T>l&H9Oi)MIMrmGNT|L!HPd5E{y3 zLeTZK$7f|_dtB~{o6gZq=c5HIxqst{sbeX#kL;t5VTT?nfEb#T59#!YNZIP`(c4~c zZ`Zx-BK+)b-Tg?{SeFkD4j7+W8HL5NHPzuknBe1WB&0{j1+zCIp<;yH01_*NsNU}? z%I#IiNJ0#ya6|ONDpCtou;;}agiBmL*UIYWW$_Vf%tG+1iYdP@uIh=MIa zTr=Aw8T z)6=C-^wK@=oS$d%*zN7_*Vljj74#7@w|)NhrZeAEg&WFKomt3AhhLO-_y{jt0qJvc zasq1Fu2yzYC*-UD6LvPQZDmOmH{NL@w0e$+6B9WYW6PU>)C*$_f)gO8Z%sHK$nLrr$f-;7*phFk<2#~o_FT7? z7Qjc3r!qKo#)t03q;!I^nFCNl+)(%-hGMyi{6pLt>T2CgyXLZ%bXKiiOF84SyfQ*liD7lCVnTm27 z0TsbV6`&a2708Db&0c5mh1x>D!gMdt5_8_F#u_s_ZL_@;80r{D6wRI?K7i*I=WQH5 z$X}?M>E`wzNdOSXAly(T6vt6L=w-Ohyz%A;)0nA!4gt_t6NLn!?QNI97@r+q7V{4R zk51fQya={y{Dzj-zU_FG!n0;C86TgWevje~-^dFTdg^rm(|B*k5kk(9-pj!w2568H zKINVA8$L3;?BSCySW_LrC&%k3D4o}gCzCo!IF~-zs3qb}Hcw?len&;QGggMoK*IPG zu_eE#>T`O=T@>Y&V$YAMDDH;d`I{+ve0ZzE>aP@x0F=mw@sG9= z39{_%tm%v$T!4?-d6{2CbcC|Lp$?}`q|a>5C`uW8ZgAd42Gu^d2t$&;#3%58gHIv| zC2@jTm{3Fy>1~9`YkIGlE2ZyIx%{iGeSnZYtKs|M8NdAR|C9<2pUT72nU3j9DFl3` zB%OsGo_SrN^qCq9uK-MsdFgjv^?F|QLnGm0Z=I--gw;Tz;_=?w?{AMn4${e+$%JDN z<~7fE%GOjz>ETY8b@cLUh%$Kv@NiqP|+> z^-COoRZ{{!js`opDSQGuFA-tP1&$~gO`kcNI}JYI<>qEMycymg`hcEW90R1p#g7OZ z0SJ+Y5F&`;U`)@!tWP4EV~miVJ-l~MBab2I@DxQ*?Xb4J#kYs0d};S>H`uB=8+c|L zreVLm}>aVMRlZi9fv_%@q0RfB|Z71X5@?kzK!U%o|5(IsiW99TCD* zR}?Jya3jpeM?7b;u0x>B2z)H^haIi2t9*gr6N+*>6*9OIJlV8z8jtf1ADx70{MnN5 zW4tjLpIkQBFpDVYdJ@JF<$>>rg6yfgIc&$2kNOcaLk5WO!Bfz4uy+fR2%DC0GhlT1 zh5_>6*)XMa#cfgaQ`v_P_g~$2X7^t`f@B89UnkoY#^;3a*|GRoHFB(t?dLQs|bTobF$ebOyPSeR`@(}v%=?YN-+kuwY zbFsC+QRQXvWLjR{iM&<>ef&A+sgn&obyUwCg6@isr-DK7ECsFv%PQZ4gMcRdlmkZ{ zYsjP>)fG6REUGo8NuqvF0x2|9Kg>8si;c=pAwENlo4T@ddw>T7OPX{oI4FMHKmcNr z{46%loV7CJQ~&v?q%LHxlZUkvu70+@aPX<+ix<1!e0+YGyXG!Bt7ZFGHfxm5cm>)C zeVEUGp^v#%kCRo0k?GmGr(>%i!_QH8%Fzot4LR?F2T4NwOhiyDFRe*ys#9ReOxudc zX)nTWM)=)`4Xb1qs_%$}fO93Vy5J&&>EXkbS3$#%Gi0(IRl&#AVPQ`~t93Qh$=LkK zzcX(-7*{@c_}rS*MMG8%brw%iha*p#cGGUR+aB?72ywYPGsW?9f-Kxclv!zgg@Lmke#~Gwp#Zx$C>m+Zzoh9K(TQfhg&4+OjpX zp@(SVfrms-dgqQ;UpsJ=9BewX4@M*5$GM_dF907O{VaGcoHZLb0#lTYY4sgwa_6*u zospGCuM0WsaoGeP&l1HLG6jBKnnlDgh|^AJjr0B&!v8j<94j;LAIPW6h(8$u}?p1PxWd}>7xpGwKo z_W5A}{pm**%KIb5N8*D~UgYT0aWi$$(lKRpU-1DzlDJ*0xi+!p+IvBdY|uy&;)gRB zTv3dvP7$gF9zIfAm;-pyjPOlS3_e!JZqe5vQ(fgHA0IxtZq$23J}j?FhA?DWnep>7 zi4+a}?4t3-TyowTI4)$YH1wCLRE9$eJ@kEL@sTOJ#fK+gHw4br6_e6phFTPW{(4O8 zP&lGUlypH++?I(vJ!;0YW8;VT!0qnz*|TT#rgn*&6Rwykdwr>K@TnF{&%ga_=j{(e zeS~?B*+Mz=(n0j$Md#6Xl+m70!;!(K!{8us@m*h@3rq}>BGjSyg9HXzuH6<_v(;Wv zl0iW_MF7&3Ltc#`e58>YITsS=$>e$JxNcTt)OU=jg$j`wSAsxRzMu+FDgd?lMC8MC zJqZ0&(@>R;s*jHXX?BEoeoX68v=Jsyia90h?;?6WeDv|r>W53``tYWWz;k!kZne7Y zG;JpQH;72Yg%DjKTm7V_78)eMRO~!VW0i29H1HvM{zw0Q#ax}Jp|B&#t6Dz0u=u<< zo!#v-r(qfz!Cf#uW3HV?S>Pk}iNMnkeij&<4!F^PgRIp<(7B{9WHEkeK<_zKUQD@T zqtLZ`$``GTTtC^{6Hg1CH&f|Rlt!w>XI;%6mt-k<)>FsRi!-(aIVU7#jR`h3l^&Hq z5b+fn9zJjrbB0V}6IJlMF*DlH${JhMDMK9-c*aytQrZ%Je)6Kv5CKO^=Q_dCY&Q8) zB&{|B)S|og@i9jtdN86_5<;je6*XTo6h2sz*2KoC>^vZ77N0Y~^X$D-NRvrFU^QA3tgtx-rm840SZlZ{OF_2EYT9QW&oa^dt}PzMJGh2_?U>W z6g`nSosnPxFGfDhbJWReLsbo#e0YSFhwQ+ zT{@yJIS|pi8>OksSbh%c_c>z`GD))~*NHAok{s+E>o`Of!b5+@0nhAr7{1XVhP z8T}MzwkFdy-jGg}>=UQqqXJM0kX=a(4Vg?sK3~}My)iSoX_YC;*@YhL*I;&dFX02e zqC$@#bY&G1hJYv9h?*^`m)msHYI2~V(Um)biUwt~E4)PH&@1%SO`3GEn#afO7^{hV z`J}Gq+vE8B*f8|FUj#|?p&$R>M~_xa&+D-Ex>V(HRzCYBz-J1ZISo_)gtF{U<=8W# zpZmQe_(<3=9V@AQkeZYgDU>gjA3OiLyaYd&C;;_Tsvb>66l&1>ZQk8=sZQ+jwIX)# z2iQ%yRcK6g0#7C{068xJm;s<0!Rs`I{AQF16%0hGfK|B{t&SA%QC9-1;3N7^Pd1}X zub=7}GD%0Zu<6%f*i`5?geX1|1nCjuLobdi`;}4&_)zrmlh@77#zvi>;H1EF;Eu6ndKH$4$;;=jT2?Z{I$BBx9e! z;exqZ+uEvDKUF``mA28R#AZ5wmbb58i^vJXOzlggvor>DT+A1WTD z>0PJuu48BKm!J%RHq~6!mwS5SDW@vAY`Qwesa{ap6Mn3z4)Dq4f~7d;se?+VEXx2} zK%~EXkC$ig;bT~$fB^{%`bcHNhI1wG6?~xol=1qhSbSdQB3?SGd4rGo8fN?rA)cWQ zZ+a(w9uPkNS|8RcCi(<3FZ%!fPuTgqwvlB~*z`^t@kuVhXEiUx?dart0n9HhS1RjYz$Y(6_CQ5k=1RWtsqnEPEE`sWh0$x# z>OYZ>tE+576yK1kxSv;Pt`J5`VL=E7dV&Gd-8Q?cyC1aQ*U~D@4bWlsCEwxrH0C1- z3!)MqNr`)AdT83_G&Vg7N~F$)rwIiL7U=csHX0B4eAj4`6_OK*yQ4;fs?>Tp9lZ40 zp*&CA_<)?{Cg9n+JgMiyK4BZmZ)fhG)#L>|x06{?Yk7OWt|`gU001BWNkl93st7Uhy0eAy?PN01M6U30cZ}HO<1{#CXle!*p08)(Gtd)`{=kpE zg)$0|WOp(&xy5Ie<6(=id#T?r!;p@ywbNEPt$RfH;`p$b0t?-%j8n)47gwV}@X`jmBEEiMS51B2ucpKyGzfoS2w z<0;7zL1G6CjR8*z35pCGCF@MBhLV~%NycMMT*yqf+wQ2%4^f`*gB!yMYNhK8WTWng z{#?K0ErCR?(P-$o#p~Cv)fjvrP_0%B6CkoAKt7L} zm8Z+uc?i5}w$lVRs8|mx-K$w4yFwu{i(sKF_?6*f{78QmRZ7TAvg0ErG@okgIqqfq zd6lvWt-_2J#|tcC37`30i(wyt&gutO9~>V)ek_MSE8zL`DS`AvNrcBZhV-P2TQE0K zY9v{Y!l}I+qxEErQfpA}eNNjbh5Eoep@TAX1xTmy(QLa$39|#Si?{F8^Tg|~&B9XE zug5MXUU%>zJJtB?56xMGsR@k`zO(2xa}j7^hzeG@)9DkIj?0cNT{u5I9LzVWIM{CQ84y4&@Ri9B%0gSAo zX;uTHG^aWiUWG*ukFA1FUcd+Vl&n(d8QaAEGjRztk1p7FjL z5=4IRwY#cEzABduAbFoppFTZGLf)Ck0KowXC=GYI4m8(tSR>|HI#|^!) z+i;aDm$QW%KWWO#X4_vL8akI-2U|_hb9r!HKYvn~v-tV)@=s#d=UXVBG`qYdEz8^8 zAiuNO2x<|67s0s5B?d1Q&IaTK-veDDO#nw=;W`4CBt^Ytm`84X;8bnUk`&`q?-EG7 zRb_7tA*{GF@e%imtJfcHZ`arFFKUGagODfIHX-hNqJ#<V+u3BEA`18vqlkY{J$}lSX!A1BZa8{nN{TWy^e| zIUF@S;932=zLVwco3zaPxFip+z2?a2+Z3(gk(sox5@yUy@gbF^K)vDZQ@Z!||)spr%z`qAT zwR}Q83`^#-61z0f#K$B@>XU^p@?+lTtXhquR$3N8f=7BogA*~R<3mUC%Q)TNM?V58 zdSuH`jZ3RyqqGTL2lH^JYG-Y$H76XC{kJgyO(E*Pk-aT*#GZ%#NM(M$v-6wp$@EM{Nbo>@wx4a+Ys3fGX!@$+1u#5|UMN(O z@;XvpR(@f2uDYg`V8?zFvh7G&2?cy0JxlaIKFRUj+``(!hxvY9rKzcOIv_fpRhJx7 zADw6MOTu$jwYZan#C-xM%!w_0QgkRPOB#b82~Xn6gV&OuSl4yQt}4U8$#^{Ee=`(O z<0inUSsn5V88mQEW`)@6;d^_l26D_Eht*@0U!%qh7Z+e*W9zmt`BEt)qUtK5(9kxfX|4N zr1*fRtAB7bln#SdFM#H+dcDMiMny>{l$|%y2%md*3t(h-e->&OJPc*!y#|X)uq@i17N%dND@hQGrVt;Akx$6y z3yL(X!$aER^vutndCZ!3=Tog#TRb4DEe7r2oGsssEw%dRkES%%xe&ZSM#?s^5oi2t ze1k7#SdlXPm?AB;f;J@z{&}*FyiUKP{HQTCX90Y!AM=jELr#@$37<-Z;&Z&W_h2O( zbmnd-e;&K0OG6>?0zANnGp6R8EoAu^vta6T&Z`e$>5vTZagnh?PR#Lyl)X2|*wJN# zs&O)gtkj-VSF4=xw&JO9I>_~og3;0y?aUZ#5 z!4r@9z}!3z_~5l7`Au?qn#O8~cDtPz3G7ayMAGBtNJ&Q2ie!%V70)17OzTq)H*zkv zp@+sJ(NlJOeEk^l`7dME#>U3sq2}7JLC)qT={bh_+}zwCNA!lh5|mM2Qt+C zqf30k=(62c(YMuwGgKY&<9egaoY5rmV z=9<*wQHeKmX*b= zfJk3vSy)MlUYP=Q?9?R*Pf=_Wf|O}*gSL(LpwFpCx}YOHlOcfOM=jp{#L`K&K`!ul zwk<2|_-N&6P#-HLRVZ1f5(ZuvS5`=OT2vM{j%`Z~6(`Rtu&CnT+=4R{%#A(luFb1r zn#m6ziu73UI`g;%cz%o`K=U^NM0W5p$$}TU4BFu|QS^yUIcMrwJdN;Z$Q%@bs%7by zx)d{t)SM7=)bSWLpj@8zJaWwWi>FURaZOquuf)rN!e+CgoU49J^|?OZn|-hn<}A2W z_43=XOG{O!7K;HNFAmk+;A4^dL6cqC8EkG#^X4(!Pa;(nXtdLT9Kpkf4(BjbPSG6 zW{@2O9y^8}OhAiN=rodJg)k%(lvE%M7QNIi0og?wZ`@b}Yytt1g|aYSbkWq&_Mo z^{C=im1hg%K1U35e5gOh4@EK_n6r83@hAo{X8mob~Dm4Q)%R>Kw=vsY(; z%8Mf+ZGU@}Zy;ye4&ARPTX*s1;^oWbN~IWUXy)hR$N$&q&OVC=GkN1Jf;#LuFhS;=OLHP#iU|%T?n6i7O2;SyHzP_7+4zq-0?BuRD*?6=^toKi-6B9 zU#SZLObZ?;y|RasYOXXInBi7=sTI5rbjM%;G6+{OqHtF~yWN1#IF7&4@nzLIJ5785b{;!UP{K!Hp>Z6-1=1|1*oF00fE#k8kOwe_FlH_WJpf}qa_fd%N z;^m{?7c1Y2F0aEGf_}QO$Mo6?+(&^P#|LxEzSut>M5u8YbFw$~!&57e5iAd11n+zt zGBBejNk#+P1l7o|w{EPY)GyOc@CnfQt_hDFa6F@DK+>|m|MR+H7nWA{9*x^tu2w_q zIV+>mjP7KDmJo4AJ?t zmQJdcrnfC@nTSSFn*z!h+|f5HGOrHsi6Xi`hO(*H$QaW*(wnTqF7+udvdr#ThirA^ ztnq&GJ7~%#K5Fg}K&yLU-g_O^=WWuntxV7x!gFExJo@(STb_7@N*p&5RO&IEt;xIn ztj_f;I8yapqj7o$et?kV=j`3tTp=WGa0*!|%(86**C70gFO4k$lq49*f|mGB=BPwC z*d{#cO16X@#z-U$nZ{H6Q9QuS&$@Sr?P6IKExm*J5EzeBl#;riR|3)`bg+POa2PJ8 zDjK1NhE}A*6h+`O@5RO|w=9B9CO(+D)%wh!N_44}M~hxnka2bOtt z _=6<_7;xV{abQHdbZa{+k1UFC__&f$vP3Jto!2qE#hhL0~|s^To~b{cmY4YNN2 z=!Y*f&vPL*!Rauo8hL7dHWj7ZJ^H+wb+IHi1Q`+7;5c6~exF1L1Hea^(C4XXpc zjKgiZBkAF0&)5xS_&jm-F@8$;{K(N>w<c?Ld5J39>m)cEirEJ^kO_^_GT=uu}ne6ie( z?K`%cM2VL97y&CKL<19@q&LuJWWgVIkcyBFGt8E!$ABd!I2i1G`T3FojGohU2yOx; z+o(R9>%!;t#y!Uei&3D20o#~MeeIP{9FzFmHGW!{=f#;fUPL4CqY5mJk2Gs}fz6d%v?zjV5^$zz^tKptWj|DK83EN5p0iLV8 zu3>X!rD0q1MuL9&zQa`g?OFo&nHOjI-N3mce(F0rXJ`LrwJHU#0i@>aOfnNp4lqiL zlVi!y!2ZabPRhSAdPera5xGX`C^e*b%>g3y>zL-m@C#k}oHnheZM9nPL)c;GVSk^E zh=vc_pI>jt{cPOh+zj+NFh8%%=WAex5_WJgxG%IeZmX<3i}-jEjiLez2P#%V?StTb z^4z={)F-#kc1Kx0wCs$>?OcEORbIS+izXez*&JIP?$9Z-JAhobj~|7 zd3%W-!{--jPn`(WO^6yF&J3VAHth(HBndec46$hqKNfaCYK)}8ahi^xNXOb`7=azz ziC0Xr#u`N?IX;K-aO70*%<`N#BY-EuX81fcd^TV1=H~e}J3IqET6b{Xi^_*d=*x?f zFhQcVes4{y5_l1E?|fGUmIX93Ru)6u)J69`d1}SXT+hR}RI|%%ZT8vCEW`KL*fJb@ zV<8agmNV=vZ~N(@pUWQOQHUp32Lum&-X_5jD z$A{S$2Fic(|3ZL90w@q<&q@mk+Ggl9n?Q&Jtz0ug-z8pLOUKtjLE{sH+h?4T8X%FAe4)1BVJ3j3OV0?>)!?yCTE+vVN z9L+&XF@E|KbNXH?dSS$dhP7K5+YKcQwCIGzv3wHx;^JiD04=rdv7r6NhT{_!wa_f& z$+8y{a?8Z(2Sv*u3plol#H%XZsfnMcW;bkj{o+NN1}JLx@x$@?b9Ku%e!WYE?*sAz zVVMq1cBWH{ThpobGcEi2wGXPMeVU+a@Ccu+BuN2~9cWymINgObqW6m|!J zYrs8-Oyq|u3bhxS#G4T&U?H(hQkBfvJ5{xY#k^8LyL5Os^-Np zy96mk1v@!BO4qk~JsetslO{aO1wNlX37;Z-+L`M0{!4x+M57gjtnEev-nl6a(oSY# zda}Yc>Feslyxj|n!8wnlIFJ2beWy--=8%U2l>rm1V}+#wO%I4MW)gm$5v~MY0SN>r z;crM1Q0h5VUH0(|hcR+@dK?&LHasg1sJR4;wP`4DF6_3sxsT|@u|FI4Sd{~F(jRUv zl}iBupRj_#d{CbS;Dhx6F+hk#G`xmJj?ZL4GyE17CunFCKBZoXCD$KwJXLR|>Oy_| z14huFuHqK&rbIRTD%e?$q|lb({~qjh4^~$X4*I-=YRu@f>G?EMpSp=n=R9{r@lEhJ zly+!wRpOo~eigIa3w+81DS*j@NPU_s+c3>5g>`m-4jmwEA3rv(t)-JMV#>tJ-p}6Q zeLbj8<2?kZF$Z##OASV93?w4*W3n~ab8NU^kI4-g!qvb`%pTHI7YF{c^oI`GPD6Bh z8p4$w_w#ce{z&J<_SpsQ^3>_pKIq0lJx2#1(Q5aWwJ4Yy2 zTf&F(v!+q2SX(~F=dSzZyOUytTX#E%RsPf*Pc0`#Zdv~jxgv!!fN$TU%`84YdpzIa z6lP4um}aZV2jPiwglGSOqXtd3!CK$Ij>Rm#>t9>+J|4CbJfwMngtwn;TP-3hpTCg-#eO(71V)-oBwm!B5UQLY4`WKn?CIf6ihMo z!7_XL4kz8r3A%>QQCJA>=;)9C(RBqaQe$hhSAxD;xfpmEp6G01bR@y3jSDw!va9Mw z2;DXXDFYQr4-6F4ZWda>#?3S|11-+NrwgSQE?m#XojhC&Z#DCG-gnOVZYtII(pH(I zi|U(u&pqGyzWd#KSE~?9=5Q8#_t#^{pDlOOrH(0t zzo2qHBGqaX8MO`*WsOog1<@KP>!B>CZYAW{qv=w_4;?=L#QOAW_%OcR26;X+^- z@j}q&#-m5Y{J(SG`sAKgLGU#+u%}KBAB>|17!9*ggVBOYaf`(>A{v)|-*JCv&@ZTb zrqgf0hfR3Rv113~f^*{;D4oyK{XLUGQxVm0P<_ojRTalEY8D_u<>pqOdEIzer|B2@ zf%JKShPd{B5j4?pYda7Qz~lnj2QjV?RTJ^gt&MaIZel9G{rGsbQXZIL$Y=g-Z$Bja z5E^i|>|ZT=C6Q0@ZeS6Cx+JQolIC5=)xX|j!MZ|@b;_-mh?*aK4UMpb#{2i4++$zx zNZ4VjhI7xau8oNgS}vjmY(v@1!kev137SKDN72h5o!8nYw4c511Yf?JO^=R(BWAM4 z^v+?>DoREjGLMKouIS3v9@3BHzOzy4AerC2@sa~Z3pc(p zIq!I_c73@0?(ZwYCk%liJ&dWTCWN*ibC&MAzpN#I@oH)c9|m`HfMoC-%bsS2JX=+x zI=5%%m7_=UIgGNiNj&OS^e&AWKb<>K-Q+wP!_U13SYCWR2VLu&V#779g@}a@A6cW8 z^AH2*r?LC41Yrpc!sohApb&K2cwvV!{CTreEJW(@otcUHv`N?Tx5O;Jxz* zLtcVUP!V-~4nX9f$>bf7vFb_Xc|gz=anSQMg5cZVI_I~0$ocNd$YMSb6Xi6kJX<_Et#&@{e_>upg$K7b{ckL%)Q4Z}~b zYfy{5RGd>vAOj~X4G5_#6k&F6?8%dVzcL!(m{;4r;_W`}b7yuAKB9o4g={`z1Zcl3 zF%o|*jI@S9Q5za|(CH~LrQ4^aG zQfLGX03%ijJg*1vX<+RpPRAOLfu^^4{8+vXidFiXl2l)J` zS*HE;EzfhlapTv`a0zKLu;7C43i!1|3ocrdaY)l3LA3|~+1(yKQ!-LJgwGm4h#Q&< zX73+&cK-S+WMl;RBvy^NRb!IG5Y7p3l;CEKYxd6AJ9QuTk@Tq{Ib#4QZm5mw9zb`l z5k2F{w!Lw@ed2=I2Q7kX4xanQvW8(3Q)V5$q3y!Z=gCq=s|U~)qBkA^lwY+B#FJMJ z5tI=?GAdOW4K&bl#<2ESc;Z+(+8(+}SP6L?MNta6DVW#;q|DgFYz*^ZNkHnyPDxWq zC0sm125Vp+t()7=A}&Q$_@SP)Z%xS^uA~GYt!97k$F=tMEO@S)sFfpy1+AyI9e|!ASe#YBK6>}sJ zEzd)s(2dx{0d#9)3+3RpuLK|H<5T;`+>GBer2?}`w>+>Q^oV7IpYRx=grSIuY%Szm zUT1hjC?Dh645bIiK)O|wHJL(hGZ&-2u@0fF~>WBecldQSsnW*gef5A_Pitu{dRJ)75<`}br?|w0C6RU+@67XVJKkIutPY#f?olZ5&6~n zPS%icBm1$#I#sHnuS29QsA;S*;O4mRF6$+`LH(PqsRa`;28+4CXst!kESycJZoX3H z+7y&4H*en7A_z)WeSa}b4g_|DSpb1rXr@47v}=RX_pSpz75#}P#MWTR1@grhu7=mGhx!rV})XXRo* zKP&1Sl#as3UKW@=IPLbF{E|D`b1Ai@Eu} z?xsKMgR;HWZ=18hl;{>0|KuV!!s0#soqF-WugbrC1!m zGk&+bE7>gFGf~nHb@OCkyAHUE=_CXVKdpAL|2ENM7stoYJ{5Bbk)C|2@pZf0a&O`{llspJ^Cf(Zk0WYH!a9-os}T zKm+hR#X1%}f>2-Pt(ya4whII<`xQkdhTz4=Iw&j2KCk&>-1FrN`m-scC6!U|?PJGW zGCmj|K>IvoqN=B8tT|{harguTVG~?p3S*?c3FQhg=TFDSCrndTPHf0`rn;pFhp86tH<1hgm;K=&=+DXf8D@IjOZ%0}M4eKjeI zBNcswm_rT%GWm9u$ z{$=k82tP>zbS(K`b`uzKIGK}aHId`dLZ?%; zv%&5=x^d|2EuztZhmja+oG=2KUB1GpEgVw-~-Go z1fY`doq6ru{{DV9pJNs~QkU2BbnqL4Putqt9^fM-eRK{yPoDxjKfQhX_R4^QE?ip)+AxGL0mH?T{OAifDc z<28zQcV*EgR{$Cgm?BZkjyK0t&YBc)QggnIMkxTF^{7Jy_|lfeP;0;t0)mL1=jZ`+ zBn>UqXvnLXW9J_L3w-vR{A;X~;B(2POP35W9fe6NSd>7D(*>BR<4|^r#-|U?Supgh z{zupuytb{SQ9Rzr;06p%7=jDMT^VmGfg3{JGFf<2oOGj+35Ik6Nl*&|f-K*>*O-cK z66ofYHw%+&LZOe6ovB@u7KSi%@s|C2=A850E8EF~xruE>R^-I`>3rw=?!7X$$8qS` z0XK#;Oo+%iEzwi4v0%qJ?TE-j^}&iAO4iF+Y?EdUpjn}5(OmDR2Z(za3^EI)1QMb% zNP9iL1h`7@-=uSw<$a1@!Al6ARHF^2%GA?zK5Wh4!Tn@1CqX#fbY|9S4Eku)Zk~TS z2al-nNAsUSdG!YP&};_*-2(zf-DNv1J>qC7cEQqYb!XYR5#$!kZDbXbXATC^x6x!%GazT6A1MQ?-Q*Ax8L&$W@{t6Wn;ftj3;k_C|@i!IO=} zK+LZ}>?kUn5d8Pw+zQvD9y4-LbJ77_6tgPca>&H@-8%pc9FQHlXl&IJIgq5h!!UMt zp3W|nhc%)Mi9OS>d;y-<$FJw$c{SnVqvLrA;;Ba=YBV1B{0nEL0-58+e+up`W7jRq z`$vK0Y)3ps3SU-mY_;}Ge)QQ<-FXS>76Zg=`i^}S>a)X{6^0K&*Xj9?_!RRYIMaqv zN|TRIV4bZWf+FKa_xMh9{_&6!MJ-mgTsggN+5$-GPJ7G?VUtD>@K>m`cxuIB7bAO} z2lJ2wxl)apoZJpE>nfo$HsMQ0fD$MRH&`Y{V?(9$A|(fj&z@ckQj?Xq-?3e!rdg>y zje3#)PaG-$}HsGc_zcR?h}8XIb3IL5aU8ue$&S%#I3-?4uz^{hQ>k zlxHM(NRd50d{_V!1nqXIL|SUK2Th)gZ7bpzpPlSJ!SqVj=eFgFC%i$Oj%1#Wj;h;L zHp0{0<7F}TIFYO9rEmnzcrpnhKIW&Ds$0GJ^jhL`ZX+??X>t~OC8$4dIb~}Jewp6~ zE*jC}MAScoCj~1ILgNfcMHJE>>@~G5-yFG$MGJ~c84B9mEC^OsR_FuU%QA&g)G4Gz z!ZUF7LLC^NfFJV86K0BHCliQh@*UpNbS$C~5HBMNUJNr?$70b7CQo5HaB3FMv63X% zv58h{q9va!j;TPqivT4w*ZNDSQXOea5+<=ug!!vF@AAUDZg~7O&BfUr<+;GuXk^q} zcz7ldp+bQ~P^na@luBONBfNVao@1MtcXj3PQA86!ZKXPq`5p!nkB_?1^|-;(&dw}s zu@l493k@KT&(5hP=9~(j>uWjZb7fqG0BHin!CPfsP#qcNX1iIW;s+MAoVz)gDQQ!^ z>2;SHNPeffUU^<0iHXm zjwS_bp`hp1`Z(0;c9^0l2-r`lgJ}3DCK*9!-**Y!L+(cqvSG4*QhQz>EO+b6`~geKV1O65|`rmQfYe$Z|&TL6>1xD0EVq$p`< z(eW%V<1J|N))G$vJ*bAT{`%`ceMw=e3Jh>aQ)jBJ*a8Qg+7B)+S(OlL2cdgL0f@Og zjK-m|G34*u(nKrO-jzIMb9h3b`nCaZ0Rb8Ilc@vN;?f`v??dHXy*LWbS$d*9E_&Wc>U%e>w&dZf(jvcQM4yhP8p^C8s7MgpGrj*E9T zi}dZ={gWj|*CsP8dEquJJY|USMy?kDi8W8p4_7lJAwuzAbfVLEfQF~aPHEZ-S#sA* zD9BKa=>!-!wDPc7;h8l-3~`jWnonxI+^I&CV=2iKx1?VJbxB7Mh%8oIl4R`nMjp7z z1xKw*az|ZUh}Pk}Xt{n@g|Njs&@L13{!O2i9XVp`Dpq=KL$m(tt_l8><@GcXJpY_i zo>v~8(dd=J*TqkBO%ZHz$3~aSc*g)y5wZ-TH=18zcenp;xAzq>XcqLgBXCu#tzdh* z)k5srP{3MW@45mZ73XY=v#-y(K3kVPG6~w^s!NX#=^0*sL__cz?i)YWne|Rdm)cu) znJT}g0jlrU_kH0rvYhFNX4qGCpr(-%82-sM3(X~P@j#x40AZV!v`9B{L;I(=hGjD^ z>8#U%$+O8$UnzBH2ATmXktp@q38KK&;S9N_sGxAS$% zj_;umhK``FCrHDAAU>9XU7lLvH5?8R zV_o9+$rWL84J+9wzVq^FB%MeWFFLKkfg2c#M_NjGvi}Ub{G+lc0HYaM-V& zJp(-spW79BBp77fX66(C5vibhw6P)m84jOs?U}=QG~1m3a{ieFZS1W-w;UeogH(Ni z9=3g(JL(5ya9}(~_na)b%3r_&LWMdcw@f)Yut>x_(nlahV-VA5kd@Ukn&K9*qsRyz zq+GRHxeV0m&?Oaxkh4`3$nbRN(p$KR%m*(h3l4k7qLVAe@Yw4iv4e}_X8OTn2s=DB z*_rl%4v`s~tmKZPzT_uO51nceD`M2+z6?UC7WSg*UK%PXOTB76z7J4`B!*Vhc~4Zw z4j}J+2Gi+}9|b+X|9(7~6!19bO!s4 z<@_a6nE>IdS_M1A=Q#_4x*|q*v37L!ea|@`aVgHvS94hgiuIwS7#BYVv}$ z5}>l40wuRLB#Tza^r15=4~I^JKvmA%2?%MUK7P(D#KkuHCgUb)O4aJ6J~{!GOngzb zUU*;tPfw+TILoM7NwKv;67f(^C>CUa?kNzg4feplN*;NfyHB(rJYw|6k54n#{P59V zgslsv?;~e>y!%;9<{!@aXlHte%rh@NSG7t7C+P|ktzg@N73>ZdphYbG{A;_StM>f7 zv98G$SiBPnAwYXp8N#>vEYv{{hHQk!_1CY9^n4aUe(a#86(eC^vYxA`=(ciIz_xhN zF_)%LWJC)1S*GeVHaEE*tE57KoeHJW=4QEUiM%g4D|(52;p?m;fOZQCSl6)T!&#B8B`pv;FWMuhHv)7cX0eRnjLqPPP*M zDX`k0aGE5&fs?Jrcl*L%qO+{mBT4W$`LsXv-sdTN(X`k5`zN*;Kx>o9=)&L`Ie0E+ z@VpwyMK2~{^3fMtTLnNryk++4gToTAuEy+ziPrXZ#q{S$`0Kv>ScqTrS`HXAi z1nDO)Jr>2-ojPAh{BU!tbn6ZA0YFtJ`N5MXPbyR!0mPavkB~yiHYCX|J9m1@^lNWz zA#jnNH+0Xw9Mn~Yrr|+d;)C0_FJHcZpZ^hdHm_}DSrnHx5=g-Y$qVB^a8@CUQ4C5D zB8vvu%fU0=sHzagWRnp}LxW(TRt~XIEex%lHd%=7%`AF`Aptu>WET~KNv5;$)_=~N zbMAX3Ssu?+$CmX~`glK`bMAew)Yo7BerMAc^4KcWzZPmvZYnhi1V)~sQY6|cAJx_2 zCDfP-Q!p}hy{_hZl@iL!8+<9)bf&EC^d|4-xm0>~`o(K8-UIb|hWl30m|2CEM(m%B zv3yHClBIV~q1ZlukpyQ7>W@3`9M14zS(Zki=dA$x=R)J>obaqK!Q*l?p>f*e%x$59 z7d^kHUoA2tI*&%pCM|)1$C8A(nE%}KV!(3Bpxs>+_vB~q zg)L6p1wEHj{JS^>K&R56B?0nDnhU`STVlg?X`a|vGmMd*@`mpwlP#uUyQQirhUN-s zp|3UYF{t2rp5u#RF<*3r{ub{?*s6TZVzrGy?J60E)PjV#s5#7t!|EptX;wIyi3Y;6 zpCN81LIYG}``I&wlzf90*`B&G7|nf0(U5lz6;?u%EkOAC)$7ph3Y18;qAo=z3b_lD zEjrnLv#)gT}=S}YoQ?f1+`cI7ChKo z;z8lnZZi?oY86e&8$DZfzQ=Wro=Xs=Lu{?qOMvskbZ_sLYvI?Ye~d<#z{j-(!Ssq zKdKesOQNSrFH>?Tj))Mc`O-##0)S45%-3Bo1uo zn!3TTn;jqX6OZd0KiCC-0{kFEhXP<|y2ag-E4%TKCdt(~48giIT=f6fm-W=aaY`lMMZJM;K>fN~FeDYU7Nr!{===PLC_(bbt6^U&epOQ{d)@!Qj_>+9b>L3>7*K00%2wZ>z&I1%`) zT)sGR_{<414Y~~xs;`2Zk>FYjCl$yrNI4k!H7bqR!4qV7woJ6~fHhXd&7dkb%ahDajp(4 zmH0=|DVW(`t*Aw0D*HDpER_I(o4E9W1L3C2Fe@V9Ss2`i{(|}mgE=VrJx?Hyi-i*m8)B+*L7j8bAF;qoe2-|*^C80h1Fvlk^!xF7he9r8X20@%8<+A1h z-rkWQ55>cWxlx_Zed`{096d6xQKMn=i0!trBs z)^MXpvgOcjt9sm2Nd`PNJX~@>DwvZn?vcg4VjdsDcE7eZSe{uRP$^SM+5FKZgBS*QTSXg+j#%eL4= zYv_e*LZb}BJBJ^8^NLgZY}riq7=v;zKnTa{@6PjXw84X6UXY#zc+QTFMtXZWX~?O> z`cv@3e6y{BiyJ@KTWlDr;dXdPl(u0I=z;|r`H>^Xdi$0 zAoYRhP<~v1h78#$DzWQpi_ry=LNg&2o}CTNftFnprvl-0OE79~W9C`4{#8xZMqg4$ zk}|P)V>LkKDXIC>lpt|>Z&T$%k-Z}}96A24UQ;R}Hy=uLs1h8!EXx_;U{9O|rCG-D z+zHb-j;}bd2+SDs5Vr4K1;AT4snZE>Bw9wl1rH!X}6IRt1fLWvL*rNQMy-e zC|r^DG|`g^qXm5aov(Ce-HyyhV{iNKMCoAo?oH7T9~wP*BeCCq_tQPngRR*VJ^1u7 zS>k;y5}y(i4=KX&tn1U+>r9vN`SQi7j)~Bz zxtK4-%*8-Z!E!9b!e*+#5_>jPE6EvNs2Wx)xvaw_7!1WFH>trJY?q9>>w-WB|bmBDvWxHsLaFvmE1ca!5@=;vPt2j3z;RFq{il6h!bY(vzl(N3TD( zubAT(iLnun*VAloXli?R599Jb0s4t4x_|zELeJUdN8wX)%N809zWvQ6w>iUPhDVG->efXrDd?S2BkP5Ji1tn5H=(s&iLO@bx6Yg*c^8)lL46o~Eyw6c^TeZ zTQps|Qqi@g$e8EH*I-gD=YVpVZ?{)$b5;u2L}f@*`aU+0mnPb0>vOkYB`_LbCPCJG?@TdK&HQt z%2#jRTqP$6Tya9p$#}2s+(M(+lq(DYYX}DmCZX&59Qbe1dH$HMzS?FtSX!(lSFM&? z2EoqD{bksrN9Xqz>)2K(DGoPZf+y>P`O&`wF(PF7sWJj!tA2Yz*0eP;PYnpbW#}StlsgmEn3=l;TY8zHh z8fPn;u1-#Xhe~z8gzKVEzraV3@VeOyz{J1{zcaWOSYy(`KnDmtx>a&AbMvNfGwkL> zyO*@R`VU{%@7hS31*N0~(l7!^!Qx<1bVh-VVK~Hjg9Ew4!^VkQ!VJoG&4h|NSs!aN z6LcUh>0liQCYfM^#fCv}z7t-7Ik-tKSQz%txvF~a`_!^`wr4$S>*vT_s;c*1eV@MN zW<45TOaWT*(V55x%oRG=^jSsmrhHcbTX>=e!iUZ}H|kOUOT=2Yx0VJ+qu~!fSPorT zi7x}_UqAl%CF*&(CUguwHm%EJ0RR9X07*naR8MUBe33q<$#;1l#kx(gHTW7dqi$_Y zDK0MFUj66B*ym1+6INcFlON+`)vOT6=k|87Q~`FoT;6>O0Qwj@h&=wuVjckcSo82s z-`$Lk7dF^(#cdd;Xu84Cs8WVDj_7D;+EcBrBCHpBh4m0YYy=7;SiiN&7^|Q%gDzuyKbua}@8M7umJ1I?smxtR3$tAK23Jg0cCg_rLdHM7+1!Qi+kMq; zbLe<-Y+LGh81w|i@!!8}g1)3%Yi(_@=0d$zi|^U+%MDVMv^uEPg)A@=*Ei$4OB1e( zYQ?T(s})^0=Ug*bH9bVoso*mley?!iVtLDS{2VBPgnjz-=^zRC`MALkAq4#VyGAq8 zucUX9*fkb@oG__Ko|2xjPMwRm>V zWJqQ_^Ii_+UJZ?3^E?AI87*=u0VC%COHdblJrqS=6lIa8X*zigKV4ALC_9rB%*7++ z1FGB?zloAqrg1Pa7USK=J`;$C*Ew?)?_|07_~Vq^mvJqi>P(zH!l%{hXl=j9=e<7E zG47ent#L=AKL*ef@Zih=Jj+||$4&UCP*0?jEg4hbM@cLN9rO!j2|o~czS^FzE7~gM zy1Ch6oS`!jKXP($B}9Ec6nq%i0EX6UqUR9BT=E--7AoOC#wN57R3kdnim8W5gpxZ3 zYU-`qfr;wiHsv$lqF+h1W=*b z2jpuio@2R>o3s2Eb!o_f2cG4C->QH>%CYCUULWPUFJefncCf@AtaD{YCT-Zh_lE%5 zMh`rPR_HC)U>}^y&AVCeO_~MbwbN<04L;rGE;~S#O%y8edV>#z>xK*eZ0VpQXk^Z3 zcxt&0XP>#i+`X;BUHqmP4KxDv28RhK!&PZE<3_N`5m=# zn!)ch0*8^sTmel3LtjbreLg&gr!IlUN;J688)?mTsVdAWC!RV&XO{8g5d)+JiddGV zS^9wg6(E_s$io4WNI^uPFWDvX7-v!>qYRKi<))S(E;z&21MWO^&vnLqm`8vUPYz4%Bu}6t2S6z?^XL#UG+J;|2T8h+Fj^Z-xDuZHY=bI1E;A;2m>6cVf|3tR#R`pwh-RI4&I zlc<63Z1XPml5H=n_5J-|*QGf+F>g!3h`<&eECV{+J z5x<9cg=N578+skXWIO}V=g*%j=vnYnLk&HLhf6N z=x1YjE;jjk#-ncndU%|I1p|Uk#X&Gb^D7IN8GLxGUmAE61>q(KN6H)%N(4~!&$Xl< zqhB802}cxK3x9ch$MdUozMiDv6VqydwG}ikBv`j1to^D(k2PA*z~)(YMoEFXyb&d! zVg{>>rBgJmsp@k(a0P4-z9!T$B8rqGPytckuIWAQIsq<9NR}WeLCWs$MP_tU-8z89_$LqDgj5LE^=1}^IU?v($w2oJ)bQr^=H0kcW2Ngc+QXKrza=dTY70W-`P) zd-w;9Msxi@0R4%)L;N^;KsyO{mg6jBFi>rhUf=q-o&Iz)a zNDhzaJdM8uA1%J_*xq2;3?fXexuK2$=p<;EEh;}@ol^zS=T*h@*z!D_Je}v|;)*tQ zYck!_L|VT>j;%fBne?}|aN+l!ZzX*2o&^l52%-@qul)r1;s>8x%}2vM0ce4G@79zH zx8qrFUmhLVB=*wcMOw}AizBF}u~hGQ$sJ@i;GF3l<)W+UFWyl_*-lum7JG$31CtOx z6g)HoseGbIn``1Om_D)f-{UeB^miQ}3 zL_ouo$O5Rw@)8HuT z@*dLBpu%Gz=Ftn8dPk4pGc4k$tm44q^Ndko^2bMho94tp3F%4Qz)Ywlgp7L70t_UM zrCOScrHFxyKa2sGv_y4J8=et(pb_BZ`Z~v>Kl+SAv?P_%vysV2b+{YxSF+U|S-7P} zgm!&UK;l4kmwIJ^eQZajq1NX`5A*~;i^WL=K6j|MNIe_y93I{|e1aX&D0<)HS-_9> z8>nntx9K#;Z8!)Y4?#PAE}v@Ho;Ya!jnauj+OAtKxh^mJl&mA?9A(p(haa>ln7g}b z=hPJaYEob;3fqke8^d2shQFSqzxH*rYWzz8tBT-GRRnty!46Q#JrlHeFs|b0*~&tx zAkOuyT^+#4LxlK(7rcc96of;9-pbu&etbjA8!D3x=^ZB z@VUCXQ>$lD0T0+`ZSe87YD4h`>AeNC_`80!jUK~~RLgd8d28s_0nK?%L8qdi<&t6s z`XPLR?cq%aK1MST9jN+}BRTSoJ!+Dgc2!{2AT)us@K@i$UjrM11(&n0u9fGXNgUlE zf-gd)sf{&4rAdP6M-|kL9B~y#ovS!(8HcGL9m#c?UcXLLx)>3PPPf#B6D}GQ=^NOh z&_NP<@F1DY@?(G%phn-U&Je&cp|7I-$mf!+x!*sZEyeIlgD zy|4~Uu`~0zmFMJVy#7Ac6GpqE1A^l`UR$+|7e|;&OAZ{{j#$Q4xQ1>ziZU<{{Ck0*#bT| zVoGetLU|ON5NH;S`O(VyF~BDu;nU~t4N%EwSZKn>E_Di`j9r3#oO@t27Dnb8tL5ZlmEFhtQeqo^USQOg2@9787x8tlL?wK z2;UAfY-0{k%S7=p4lS~5+=94JwDCI74Bd^Xibt~<&^K{PTRCw7 zt*Zr|3bBqo3{bgRkrB1(fkD2#*5Wk!zLK)G&pPzD(hI)xtE&Le)o1L|@m*dzFB@g- zx&fcf=5ICdyuZCY!8fs9uIK@?)>Ddt7t1X9by z#6W=_lyQS(GzY}BVQfksyCfNmwtu*wXQ}-6$w1!u{<-&kH$L!P%LBe zWnPtCaF=naQNZV;kxz|!-rjyZZPC44uiI_N&O4md`DXUAXH>nQ8I+(nJ44cFL zoXmq~RTWH0W|{%oBZGiokxbA{8SL7D#KBxdu?HYPKrOcLxW=$F`35YY_yeTyj?ckG z$hlOZ#%&QqQTuKe2%N!5O4dkd%F$+EuJ2iV9Oq|zSFDvQO~+_CzL#_Myx12aeCWDD zC07f*Zq!4#;WDpl0m#QXFMYuvPkHoVxvf*rj~_oC4L)mQpSHKuSUo!dZRhkj+%)aX zhMw0*x(q$w9Zn{+*^Ni^GNv7IPV5jr^*H)6aS!4g#LA=SY2qF7OEZ#+jK^5qZScWS z>xXM%P<0N5b&$TCnst!g!7RLkHS?f=xFds|e#Ha5D}!kas2?&&9fa0Uq`(Li9D@%; zMGaDb$1cz$2EKrWd_Rbi?C&dxpE1fJh2Fr%cdFomEer%x6D4c*C@Zf>;;#36H$#o} zCnH^2jdB{aKBiD3ych#MSgP|83%xF}&g&-izI_{90uXiy`YOS@rNQT^3LZnx&!2>k zv5!52=#Iyz-^ZaZQ0uvAQjc9?fmDyN3Zn(AuG1O?uNf2S3V{$1SMUSyT#U!@Hpw_? zXAmE3#B?bi6N@9TPjs^S5}1Z_u#;L5U8Yoj<{hk?2kR+jC(IiAWiaVrCv47}w=Os^L z{X-^@;GbT<(q=MB&-p=;&bxFM4CUiP=zRH)qobW|a2`Eh`z}E(GQ~vshs{$}w}2kO zXT7$A&d88uY}O|qWFH{cIhP0YMqm=+cspn`ta$~^-*)g^XTETc<0k~+9inpz&_iha`uvX zD)7M}veZCX+`BT)-imG|=U`GZ!zQp&h z>mY+D%9K$G_~hkf6{VcG+|QJU`&EQJP@t)jbENDRKUI>gi9)5R;6r~RyY#pnVO5U_ zVLc<{a18e9oEFEb^W-C@#lD$a_({I=+6he5{|0<~863*aciaVsWnOp7C&fM$>iPNe z2dd5npX7xf@PoxiaJ(64c+kvn&ToTH>^J>N zDry%&WhdG}-g4JON`s2SedhU2nCBfop+|0?Fa7gP1O1=s;I4Ol`icJ}z*6L`lPSHN` z#X4NgRNJi6rs-;ZSLYoA(RM5N_$o?cAm2pE(8pq*^-~I&1s)5XiJtY?y$HF^lwtrn zs@uXay#D%H!e^iY4LOE+NuCn$oGHA^g|QFt(=Icz3*2kYE`$)oEP9;&&fLq>E^VXg zwbI_pNJ0<8JfGF9IVso9D)xE#=esrkd`$vLQNqy#RsJi3=9t6ZAy_n;u3+$ds_Bl#ugpG=Zz?M*I+4 zQUOMy2qJk$pCIo5!kd8F=1YyVkx!ql2%Q9ohatv%`hW z2aX-fywGrhv@oVYk*cc_x$_Uh9>YwLmS|QIdImU(jfVE_$7R`vu};rNwD`Gzf$UAU z!f{htZaOvdyegh_&NDugFFG|I4pW+alI_#M+7Ovq@G(W!4jtStgheTYaLF^jQgMfY z@iT8Ae2hDQ3=f?btBKlSGanti6@L*wD-{AjR*AhTmvf&&tEYsAov??we_=j9@d0yu z#fLmJj4t;qz@={aIxiC|p9TKJO_aZ1{jNQffKQcr3`vhqf{z_mcLVp2?P~YozY0DN zuNMFOVFwp2mDE`9&LsB>5*MCFk78G4G9gR4PU|uxSuLVa;eK1i7b=-<&p$ z7p+~#jXd+`vGK>zlic&}C1gsgax(R)bPtw7n3X#CmxM4Yg|JKrp@dTa2&{s<%CoSL zALor)Kzs}MOg$Kyq}(5YH!(&0P09dUy{?0PnG)7Yqvsu8(TJ@~Sj(hOv&)Z^N$pVR zxvX^%_*<;h*=m{K^_5DCAFe(H`z)7F%k5*L9-`;{-Qe>`_JN3Sq~k=6)H<;NJYOG_ zb-lhSrf18$$K+M3y;Sap)be!~p3jeRy>PEWYon#5TIz=s+VsKzYRvA1{WGD5m;R_l z!%fzyIc|1*r%I5j#?#VynuWZTB>PebM|^Be@)e3UxW>HZ%%lwrA+oRV6)LyrdZ2l3}m@+ zm-`+rcOvE^ttBw@JeA7?xpa^rG&fNSJ~irjf4>lXHf#6y@rWPQPmz+)LDk-!;YhpycV+id@TGs~<6*X1Va5QSkb?SzjaNPK! z1fNll)v0bgEtjXtdD^s|9yEloQxn30gwT~R2_Y%zEDe%nO(h%n+WV`jGFpH$nUcbdYdG8o!&Qb)4r538i zcRFb!h*qUt;yK<$o8Axr}p6vE?}z@RL2_b8#yU?e4Mq=XAq2d9yA zt-PDgqK%7?b|s)8p*97o&xo&GqU7dT_(0gAls`UIv9CCq@q`R{cr|(g&&cCF)<1?i zAJU$vFM~W1fKBOe7GZgO6m#tY}Ok-L8>!X4H{ax;_#{V3gwyM7K?#w*a(yR1Q1Jy zu7>UQiOM`I0#c5Zjp6;MQaDagk#~yI26FP*X)CJp2gA%KZi<+_s1ILo`l1ul7aYGx z73FMa{-QpBQJ=u@5sYp{3DY2A7K4a`ETk~ncE$0+2?w1nBvW(-8Y#WJ5F^t?GV`c# zIFVYBU{n^2L`z+HRv=}CZ0r^}tCdFw*a(MKQ=2i5c6#yK)s3xQ^ZA!A1W@g=eTZ#> zU>}{6*3Z($O_bavXnFg3{aB-(3yRkxh8`Hsj&{88O1SX&44pe!EDdzi%sJC5IEC^) z%GO1ynWwE@n6M5R!MIH*%d-*grhFOv#Ar>)~C&U5Q-TD#jEz9?rLtK%1# zzUaewdZ_t}<8920Cj#6J!<(hAyf@3Xt|YGGuT`px5cU+(6H|Hp(FP*X+P}HiRL&J zdF_nTbg8WIW6O=wG|(qC-iDeAE&60x**je;`tFu1b>8iKmO;;FA)ZRBS>Ti0=Nq3? zQ;B*q70wj@Ooc&-ShJ3@Xq2>wNI}vlmToZ*;HZH=8hk(w^0tn0!4P1!cvZ4?{=pFX9x#MWxG1Y2LGGNv$tZ{scF?=hgb`+V)GPz~r) zD&!LHGMdn@P4Y}-Vj>w)idd)@p{&X1%N7J2x~B^H0K{fUy)&kKUaCu9k{Ey2?+5Kd$Tj+!f= zjONkc%xVP;TlM9^zkZ{IkbE22OxlK(dp4JadREf3^3qt#6(htNPZ@Z=-@ka;KS6H3n}wY_Z3n#PvFrX`37u;_2gDrpYkn)2Hck$ z-_=(6V3jaJtkL5Q(3B*mKv2cmS6#0JJ~PfTNy~w?Oi3;Xr(H%{KIScxxO{@SoCG{T zPmxGt#7-G=A%a%Qg>|93Shx^exZ1bM!w_oeA4(L|Ifc+K$Uc=K8&wdc>46JoWH3Ah z+>7ogZ1yynKaJbLt$O2!S=*ti(!|KHb4U>=)VmZ8s*Qz|&Sqsgl|I*Zch^rDc=r3J zrw z+a}Ivw4O`-^8f%K07*naR5UUKX2mJ_3*Bfq1dYm`lm|6Eq78uU!v?@!!MI3%r)#6UZ@s{E)^ZT<1ln@5K9cXaekUz3h~0=P=vbREZZU8TPbT6CDxNOM zc-}osVX51$8EW2QC?N^yOOosepn#<`)*{_ru!dl04R&Fcu5+&mCHBN-2nZ$|hWt`0eXKr6iifDnP` zB}me|J_sNSJ^N=9SBgCE>1Z~v!=mIXn3q;|TRIC_OKE$aUFBgj&SPD|&u=>2=w4(f3=`JH}gHXV%}a93~sA^i~Azzg?Nr zx4y+ENLkZ5>9ER2cll7v%56S)C#L#ui)j6tOfb$ZUX#?J<5f0;Bsx7X98KsUWZ~>k z%v$W#g?AQ!A#YN&;*3y_OJP8u>>1>Sqy+DR4t>jI7JamizMD0R1wenf68K2;3E)ux zvFbtSxeLS596k4no*gXlrWYajNkeC+U(Ke@(@P=M^-^zMbqE>V@?ogQ>4mN+RIh>p zX}1HA)W*Bz0J%B1EX*S zn7*P5o7e)#y^2}SDqDq7toid4183 z@y@!d$m*`7s&>*lOyt3OPkAceexWgm3oyb4jQTR|z(`9lum$6?u{{{h_^V6=RkT<)oe~M(sZ4OrgEl7go6Z^V&GSw66J2(^)##vM{3UN5`mm(6_23&K!atsP z97T~=uWoKW06hwtA8u~GW)Vp8)=Y+@$MtmP(qN7otZU=gIrshxbLZA5Sg0a^CXe)Z zyK(Yjxy$H;2tnHc(m`8|KCM<=i}FvZE`|o7h=Cz{$x>UwtV5&rDaOB^qB)YdIJ30%qF8exb zEdS} z*U`SJl*a&yU{0)xgJ<*q!)r=pJ?pj$(Zl3l0vY9gOvimPcd4)txhrq7v6VC~@R>8- zL(z52d2e%Kn1=XBa4?30J+)aEA}YX6Nx)`=zg!IMYH03*qWrvRtzUTiR*BGBJwF)B z>|M|ToJ9uwsWy9A9QWDLB1G2*#F-?|;Xil5_>RR$A%&p;x;k7v&d3&bza;eh0Q9^( zKcDKI03hoTnoRXRLl4f+Mu#7UWJKEg;5kg53!glbg|#*t+!O6~<{(^*HXWt7K|?tn ztyhFivzV1!V@7!|t(T_ZFGcub^*rmHm3}ejz0ZZv>yQnD6x!FQXnNgdYUol`VET+| zkWZ#h&kza8B>V$?rlo75V{4)G-a_cJ2YV12QHGKpysM2&s}t8jUdj$hRWleWXFY%& z!XXTJn1!A_|LElj03{h$teSgKwKh$n!w(I(J&GXI1bqKk=wkfCt6{TeYqwu=fnS^Y z?Mv^sciwN`7KvjMQlgxY7p!Ew;>w7A1R2lqTw&^@cdEa9cZ%{G!uk~5pW?jtAcWRh z%CjLgV151+RRpG;1w5nWHq(JMLb{O71y22TZv->^RD*9{36Ag=g?Ykf1(hIR5xkbY;Hqtc0=wn3b70PH z0Hn5o-oOrMiJ-XEMy6C#o()$#XO&V+Evsygn9}{o_bWXe7M(2<<5S983vx~nGm&Ml zwqWAK8i<5%LT@4M6=QQjdkfDr7ec4KFds^u(5bdCu8hi9sMZubRsGmJTSMQSXL;-2 z3_S-to{2zNr|>-xgZpeJPFwP%x2$Fp0VXX$hk@j}=n8j`2&22#CcG{%E57_R3w0wZ4yfPWoR8{NM)XLouw{7D4 z0VA=su=Lgf@zV()<-&77D$HeT9KL-6NUs01xe)e;(XVdq-m}i+Q&PLxDLa?X4V6i2Cz)?ChZe6|7n=91wrZ)Lz1mu~Id=!UcM>x`tRAR} z&GesNA_gB75Uyv(s&ARbKW!P2+y`1+knC0llqw-r3R1ssJ*Lg*SoR&1q- z2z3?DiRMCWSt#St7tV8Bdsuy@yYTK~bmZVH8pyLG?1#qn8xW z_~M%hP=~9l@4mgh{%fe58GnBJ?Qj%+Cj3bFxwqnHydZ;1Mbgz+j^bE1J?rWDUyeDG zua@Q>I-@y#fvol;F5eNE&x!3-wpSq0`J|#+gwAoDth&2mCYYEhCR{Qx*G%N{!I^4e z6)KBhzflx3vS`o{W+FmwE{wD0!kOXcb&{H%>MrE%g{C;Rm&w};X0&E5rp|L{aRv3{ zK4p}j%(qqnL@(0=XBTpI2ZFx2I(+xH@4n3d^wI!i;CX3<5xda$>DWa=@)9#l1CRlu zM*d0`q|W7AXC|cJFU$!H)r`$|MCUu=^VK-X$j~B374#C=R}lphQ8Cf2nq$d?YbH*K zCcJs&vWcW1oJ$B@Lzs&QNf;fxxex{QO?zgE-)N|9P*2R{6UDr}K!2IS+Y7P3(Dk~5 zK*nrH0;04SH86W8X~Yy`Gyaska3#~|>`U_3|2Vsv);6*w+P&!}l0c7c5#rXS@xmGz zBN~hrUIkr<|73|DHK2Faod?qr(~OCa#JXG!>Qa5%Uw8)DElQyBx*KRSjR+Lr&}u`n>hE} zRXyUabb}Lhr3`tcV$rr!JVkdro#$}*s6`R~?`FPhSAYNgXKmaQ-ab((z0j5(Pc@!j zh#51)!b1Hlqje_M51B4eTfQOD17~xEA1Gp#2h`904jyNrf(!)ujk%xX;QE5a^Tg#- zwQ+kGrJAxjIlQB&0oakO#tIm63Wl77LAFw?79NErq1>3tP3m^M$-yfvL?arv{d5Ae z^c!d#6BcGMmAP`B2{KKX^-XvVl$N?8IMu3D)N)s%6&10lvJ0)b?KdJ5KzafH08qcc z3mVKJ-i`Q$o$?EWua*NZHxxi+2nMozBh3nL&4B0&gEmC8+Q#6&q1|jH33rR%rR4Ip zzrymlfC91*2ny(bzW0RM`53Dw!W3vfy^2Ti6TsjxuAZpp;}C>Y!qD|Jv~e1S#VVQF z#LW~PHyQnklCxd60t^MzQ$XoR4lIUgk!aN$n57_VN#qcfQe-SPtH<0r{LEFt zfOWmyMp2x^7R|KTrc;|4j#E>2gtJHVw0jf(3*ObjE<1_aP8y?%F$+&r7PCzfS9qS8 z=dF12NjJ|CSFIiO<1=E~s{I400oqk~UON zP45$w&t?aw7gP@oLgLvH<4KFF#&B{ROK9K-oth z!47H`${k}GP>qb=ZOAcf%K3)E+))pzIkqYYrKt_87%2I~+9Q?-GiT8sfpZ&YkVqU7 zMN&*vz^`43@<``{7NepK9$(XlFEvU|eO7&xztIkIgnMejpFxXHA z3#b-eAQJ%Qj^|*=xwu^hnsr18E)ctK=a(Wf=q4^ z$r!9ZLgqFa>+T0Pt+z-7FjU~Td$o!PtLbbkq>5sUDrQ@c3^!^%W!9>WC!+J8IsZTbbdld>}(f^i(y|NCpe27{4f>B8EW#mFi=>K*kSjSRu2TR~l{;KC4haXnTjF zi_e3emKqNd$VHa&@Up_yE0j;{KKuwL*qN7&Ve9z-#RJ_Zd}P=G=+gs!a)XB@{KOXo zqEYBcJl)yQTXf^1Y)zJ}ncJu+R2&js61L~(mB&-@wmk+^eL4tqfJ&`5JPMqv_r{uUX68G%?cbc(;M2pWg0tGq zJQfhj@iexLGn6Iw1Y(vXMY)$81(cp$;p_+!wUw!l*WJWg>2TZr)Hc^IlP(H2FIu*HXtiYHL z|2A%oW510x+|cGYuAdZ~uNGs^&0L{#A~R0TL<6WKVaNfhAsqzf5Y^25iN<_09tCj`b= z5&I9659cW_L!AsbaK}4cEMj;;15vo`wYKv_7D|&F(_keI`N-&o_RrC705WNr?EtI| zEsVUlR@E3itiU)bj1`&_`Yy>KRC;V~@KmKnkW^(n0jLaPl?PN^W)3(;RK|M~^R2Rz zz|kl$&TJ|-vuUsCU<>D9EFb%5)a(m5w~gzJD4&bcT)uJld3bnyc!((IGeV&AP(Xit z5zHKZzJ8?c!)e^aYD1hdlV_w9!z8+zVyFq3&=WVh&?zO1QHD;Qg zTm{Cp3XE?mYh6Y}#l)Y1=Gz2NY0UOCpmJ#*Hkw?ffTtj;E=5#+4!AN2S4pmiP6Fvn zOrkwH8UfFRXQcSaq=1Z5e0eJw+#Cpqxh}vzgzf{N=kZ|;6?DPf2OH4&)z`0IpR{^j zUa|XZhsvaJ!?la4d(Z$d#WPU&9Q_wPo0XTsbXh43-Lpjt8kWwUq5ii|UW%E*kx!fX(gnwYbQ%8dcX6xBRG2Q-k127#RH zQBvbGkZOT{Pf11uLXb3`xE)mwMsQOGcP}B_l)^3DXT8P(qT}l`{IWkk9PW|q!Qu%I z>^?)}3^yB%gZE3?qvm3sehR^FY!(A1Vm*`%ob5GMfJ;&%FF?4GY6Ehjd3%J zof%&{S5GbXtKE*`lUiA#MqeRHXp*foTk1Y{7g#=8K-_|U9PYVzE<^Er`t&I@pQmNa za-Yp&^~A?O-&pt-!9ao5)WKV^NY_djF$`{&$g5$d|SoW_aZ8UR8rCl?kEXcM1eKfo_v70$1E5Xc^_qMK+Y#?!Q) zFS2>soTxpP!_-8wPUvCgX4BFLRu!|XnrhMUj*@9i&Uz|pKFrtNc*B-MRM$B~HOoP& zG!Et+kjgr@Qj+RdFx6OFMX6$a4BwW=uI2o8NF0N}ZAx(OtDYm=;m2%yMHBZ&D4%;S zpoiFf_UAGHX_e7dX?S~u z3>U?>x4TyI+Xv!kZsY34fhuZC)kEFqo(kyU@%j0V2_U?(zrGlAX}HO2lsncs%GIQL z0)UxAe8XI9)W*wY)x|W}RyUW`7n4;g5f~eXyiphvtWsQ6yaSN;IY3UlRF3DIO(H6n z#1}nV22vr@Sw>9dsLm`&^-fGx<}g(hRwXo5n*&uXpRzDPMYRhgAM%NX`R!0W%b5R< zBdei;{zK(+LFMzz1@!z(#}{><*VlCAN$5bct?6`>PPvQK0|*$OXp>C;bTx??|78Tm z6AI&u#Mo+#Bd#ir!SM-k`kQz>+Lup;RAmlQb!El_e>$ex<}ei%p~Fn(d)p@6=lS_3*3SbUUgvx0KCdrpV=3esQdl)0Vkf9Y z3MT@fl%7$~yukQIf=uH0*ru{uiLnd-oyNGVyvSH^Rgp;3PePTGG*usIs&|8`J_D*K`+vZ|TVxX{l8gF5FPX{I6kCqu>i1kegnfQO`2hN% z=5xM3gYNV4vR+HRCMN?y{ZzQ41gfVVcxr+T<(jJpmA**Bnn3({saudK(?0_qA5{_no1gwf*h2m}Pu()&kO+c!X zNzN2gO$?9U0#(`Zu_3Bfd7>&a`kO#iE7C{v{fFuh3#eb(_jT|A4h+cZ4keLfm)p!cnm?>ap z3>eDi2ncVF>+o!JLhb0yMT)7)+QlbCP(>na8=#N}RW3szK~<%os&X1tX-K1=9h;m+ zugP=Mzq~3Bmp5W%qvM>*$Lx-vsBKgS9#m}jNCh zpb-jhpsJGMWNY2UY*3YfRVxRpYLnAA39F1I&%`On{Eu+efG1o}i3Ru@JyQbcp} z=mc{EUBTcB_&V;)h{$*mk=2?Ruzzeko{^MY_437gUr4dRG)3u9pttF|4JxXD{t4}d zX1#&W#RxzuOQdq0QCY>TR+a3GMl6-eDtVeekX0JVgZW?Iz*Cj?VtJNQ?~;xyag*1l zH9h5N)HNTVln>DM{wmhb{ru!7(3ze-c?^$FpZE8Sb+w(wMHcHUZ--*s@3YM?vzs8Iq?#Jh>$ERMx@chs%@UHNoM+!w!Xp#aCdvsk=`a&UGRX)Hc+a{$3 zAY&y!S{)odeK|IJqMYHBrWFscu_|i1qLlpi@C~AG__`=K<5(Ci&r|*K(MlipWEC<# zSyoxfC-g?Ur3L!rKvg|GFH?)gL9|ccan!9N<*Aro*t9m{RyRkK(!H!6$%G9(K>wzR zY1TgF>GMB(^*aBH&(C{Zzg-Vd`8bli*B+_jKM??`O;U0^0RdXOr2K({GAXx7$IdW1 z6w+~^w}F^MQXK_xISR`qpC18lsQ4aJ3%xPCIQRyrDv#f&{0$?kE>~IB<`5jn;K0r( zP&jI9w87!vXIa!$w8_-4I1u(JPam2fUmcHwbk&?c`=m)|ID2~%B*&@PEHWj(zP^eB zbU#M__%F4-p8rMz_xryU;an8ZryiyE^N+A7{*qR3JPD+W{7+sh4oy-Y*R>Pzh1i|BHU%IA7)(A0U5OyTa{B0$-+(n+#! zJn%HUydIa%&XOynW8Mzyh!mIn87)6W4sezPXL&EKsJsP_ryFSuQkPp&r_QaViLQ9v zc`H0K0Gg4OdRr~h447sfYDQGE7S^l*Hq+2SJI&c1Aw!-McpQvRUvO&;uB~AvM_1lv zyt(E&l{*+~==_i8e0(J9{PlJHeE(DpR8>$sKR;YJj|R!gQ#YQ~r8n`siIg^n>C7mZ zX34Y8l3T;%Lx^v3epBvkBL+Bi&ut^Y={)gauNX6IsLJW^lt)t60r(3C^jlY4iDpZ;LO3aIkcG%bJ7U8Jwq12nay)9Qqrc64WA!gTT{l)ITZ9nR>L%0 zpXCi^Mqarect1U-Y0``P`K;&X+}QHv(s?vV2B12Ol5dV7O94G7J=BeDW|+*{%GDl@ zhn@H)<~PTw72t$cOggskcu+NlVoYepa0XdC@kZRh6^=vRV9>yU2M~wELHT``0*Zw! zXR2Aw-rRy?n$z%N`_>e>eBA}e!N;f5=k{F+Wi@pF`8-{xVcN?1`TL*wUw{1b{_tU{ zM($UX?MJG8;P~(XviC3(&y!Iy?5BZ%UbFOo!(@o)LG2+-lll0}S64EY_@?c|0Jnwz z6g9+C(+~$oT)M`#Yz&q-w~ZTVgJgCUXxu;=$Bn#!cRP~{97MY_WI6p1nLkLF=B!g> zjdRi%d7y{YQVro#36j#V@Ba9?ow|~4&wpW+(0@L^a>wiI>x*!A_us9@=M4AwvlGD^ zv_aoW8w7~UkbK^tOpLpoBxj9sR=3=+Twsb^!<=S} z3_KU!c$9GG(f#;#ZtD@xKRZs|ohKhE{l|ni8|h8shC|P|ZHEK9CHUc|>H3rW@b!@)?umHEK7_O7O)B^XPcec|~c}(QuPx>#0mv^Y`SHfpyPx@%s8I zk~ObB;`ixUA3Wg|W>)2n>Ux@Ca?ADH9Vf4K9O(A`nV23!UJlIu!41igskmc?d#+;B z4aarKYKJeG#c6qX0K}u8>gr_q1yV(w+MQF=?yOwA#GgGN;{h6v3{SAefsS|V`vxEH zk>gn{Pi}G0Cw&0S_Du^nr}Bi>15{kYuY7v$m+2?nebg^?`0jrF2tLrr)8qxG$>e&@ z-8Z)9GLCMb{H6nCh${l*<>f%*h}jVp0ja1=MfSpH^ujAvQMro73?D&PSvR~7ZaCTD z7fu=&BpxyGE?C-TyVLlcUGO^rG+ar;q9}niJoJu^_sH@5*77{|4w4r<&!bB7{CX@l zbbfi=PYBctDP!YhgBD1L90sqp=gF1Vl`g9$U2w96RCJ2t!iWa3YGO>crGJ4 zp4(%`ldg-$mgOnivS3}786_LfGlA#HOS7!$`J6RSIXv~*_XMl6md@V2&PD>+Tl~#3 zh+jH-|K(}WK7Q)O;2c9IoFdSp8t9O%d8g-wkKY^@F+bzKm2q>h0D_zleo&c=ID8jfl8H)f}bgrkgtRiU9^sJ2Ssj$W7`|EzF z>y}BoZj;342FF)N?268N!~O93LC| zU8_tA*E9_N;v%)0p{ZtAK0iq0te|rsopaRV*376V?VLj@Ck?3(@I0hcLQG{*Wv)3D zcDc~=WV6yb=D-3nY^)Lk&S4VS0Rq}QEp81+)#li-l1qN);|R13WKeBhW1g}QBnJ{6 zo*(;b#=RgCNuUq&PS!JoJ-6^i*9{?EIX+NOmrL5_FKMZcP_PcgYnppZ{!VXGTRckw;1U9cUmC(0i z3B5f&jT_oAZs4ofDC9C@Kn0Y!xH(e&^g7Kt}H1`BV@?M2_M%Xj_@##5CREG>NJT2;Gd6mlk}uLz4OkmA90ca@*F!f zTERkj-kDfJB_ZtO5{})WS;Y$%w0b%iabULa@%#iS2f%U-%6tpTy!Xm{)Qg?b9h^`B z+CiCU%?=`k6se@r95_;3YaEezz}oz1wE66{c@^iP%`uPgg5rF{KtfBLub4>ClAfsZ zNz{42Is$rD=ieWo4?RGG>0n_h0p$5wJ+DSC;SE$`&%uQIo8T}uyJMoS{q&@teH+h0 z4l3mU`go|!g>&GPd8p(GDBnu+$+7aM%8)V;DZ@M9h|2AV+PoKS-g|9si02IGtjzN$ z&O7YqnLvWUblOBhgVbpw30p7XJXKn!t?A{@$F~Ql7UVw$x2zB4x#SY^V;l+9+QY&k zmRmA&h>3BGjCX!`Qp5`T6jz!biD;i6$>L zm|#}Sa1$$mw@6j2g9(hYqFdKk#jEZ&&Q5fPBb*-@o@@j=25D}lCoIjEhtjdkgas2HkNNRm5a%|LP$T4&A^!z+p1eADp#)eEYFm1`r!P3r{OiL;}e76;JvGt@sh{Oh{pM?q0W<4=K-G2Kd>Or!8&ira}yU1K~_CL z;TG1`=M)(Rn*IczYK$h3xCZ-tpyOlUzZ@8UkQh%G8E<9A&FI8nfW0&ioD7E_tJ)l( zuBgpXoP%o~$gYpYc_5LII0to(FtXoN=W;Eq>O9Ev`Jp_gxNukM;NYZ8PM%C;+)hq9M31SX3)(z2w0R2JJP^p1 zF^KaKX&Fs%p4#GENn{2^W`0n!$&Xugo^CEdj(b9ZNcO!v?-BOOdEv1`^ZX_1^WXq^ zFb4$6OlFt`I$$)SK(|DF7aJZ9jZD+gWSZvH12P;T!yq#3;KYxX=DA4>i$0GdjQsQac**@ z;+qf6Y?Jabep8+QfAHoxS_2Dt=$s38^PC;Cd5+dTmm;Bkj&<}LHTfVlhcHGFp>1g7 s20DCY9lV8()If*aq>VX%4jF_101s6!+6Gm`Y5)KL07*qoM6N<$f)Y2P;s5{u diff --git a/techage/images/melting_furnace.png b/techage/images/melting_furnace.png deleted file mode 100644 index 2c5f614da9aec0e58fda9b139d76726ad30f8188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57241 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%0DgvSdl;JHJPBPzn6! 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 M07*qoM6N<$f{Ye%`v3p{ diff --git a/techage/images/solar_plant.png b/techage/images/solar_plant.png deleted file mode 100644 index e17ef73f230f7dc738e8bda2ba8babb9a66be0a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190445 zcmV(;K-<5GP)r> zLc5h#t%paqky5~%Te_B1v5QN$l2OB;U!r|FpnNyNo?gVEVZohTyO&m@e>}aJSjMAb zrhq=DfIh^dSDt$|znWRNl2fXLM1+Nsu!~8?#?Q&7S+|l>r-DGoqhq0aI?t~`U!Hh1 zoO(l{d_bk9wx)qayqr|Gmr|K`J%)#r$);vmSz2{;fK*dgqJT=hno=__M3;3orhq|m zaec_6RcUE+wv}F}gGW$JVXTKsZf$uxHc>bB1C zg=aQLM@&jbT8V5uMn7nxqOp~8J%xmaVPR{WeMx|TjKQ2y#Gq7QUt&&8RzpNawUtmt zKwyG^g?xH}jcqcE0V|7(nU8Qkxs*)3mra(JrjnAN+1uiQf{wP4Nh2a6e_}C1K3lDg zSh15&X=iFqPE9p0PXYk~Jv=@)HaEeZWYDQ=IWkzMsl9-Hfml^-ot>+db1vfK>yUIu zvyDSOJw`k=UyF&0dUtwc03Jg?Qcz23qJ&h;&DP7x$1Ny9!otd6U38iOF3zf9a&dF2 z0W;#fVzIHmNKDEY7#Wy-R2?CObz3gHyuWB=dep6MfdMCzkdz}KFpGO?b99HOTtYiT z(wK&Ber{bLD8)rGBcqIFIV2UCjee&&J&{T_FEfp#95-xigC!}JQa~!Kmv@9NI66PC zPhlcsO)zd?Q?;gyb{s3UuBEecPGV!el9a$FF1ydSczAE6hO{{X001BWNklgn;H4Y_5<6yXkPXY79r7 zp-ZajDu$99;;q&XfWA18RTh`oPJgpCV$#e~ zC>#%WMFxRk3=$z2&1WjHXb1tQ1fWs_b4X5BCCydLyb_R(7C#K1NOI0|l2)~f14a5? zr5F{72m_RpA~aV-;38JYV3OV#+T8`z(_y|_&|K$e)$FUPW-Ep?!4EhBiKGB40aqA6 zies)xVcFjZxR{v%=?ut(Llu<57#0Aw9m_irT~~GuLo)2-G9_yT1JT{Jh=1JAD6s_s#oWulMF)SL^MceLC2Gcl~9zepSEvczRkt z^`rhRp}y=7f7@PepZkfw|NHCh=i5I%|La+cv>1~!Wto%4TPM&8kCe6fZN7$$lS`BL z3s`{~&lH&@HZ}!@!6?q9iNLHFfJ+b)q~bst45XP^5l9j+5g|)lfXHQ&Fb)GrW;Tv7 zFhk~foSV&OXG`LV0&FQ}Ms7H*3r*q&eBr2IMMPo}kHxuQh0CXLL)A^EZ#ufH^O{uE zysGYKj_rEjj>{_jlw>w^|I8imz&C(5*LOa_o2!F^PwzK29v?n^IRDe1AO5s?AKPIO zP%L({I7i1YA~V&Ea1lI%PKMt!To)&attQ_{kOiBXb_Y5~!HZ~wUcv|$zWq=mQsa@21&O`S#M)ufcW zycjhhHx_BHr%@`mUtAgz46Z$*DfUn_(P*Q#cJz)4`QMK9gK8 z0--HWo0J^8$}5+;%5Q44LA|SJn4W*(?92-lrvj~#M7YhZ90mX7TN#JY_Sp#qwLZY#7m!%gNY^}E1 zk_Q7RX-IZ;Xqm=EL@`YP!fV^fNF*FY5P=Gzbl=&U;4l`90Gu2OR7OXL4V>r(WeyrK zO&O`OHhgaInl(}xDkli!ATOnjWHXj{N%c?qqZ2()POv3NyoZKKGK!H<9#Guvi%WVg zyqcZhtE$0YO4yOvbcafM{<&j5*f@NAxclqgZf|d6zkU7o-0x)nY`wPXz4_+B)o8E3 zcXlRU^^V`29USk!JKjI=30|F^e*E~o4gODHyWL*)mwNl{=da%c-u~y;7%7BAppc7C zOs_HacqnddD(H#cP^i|=(Sf8hQGgI2B03ixyAQ#1)0=^JBnjCuP|L(dMqb}Br4*74 z>vEExOvd0%CRQ;UbJGcVSXit^6j)xJ!Z{(}R~Q5E&V`<~s*+&#hbNxcTG3k}G!Em! z_`P+U8ACzO4ZVUZ}M(#?%v+reYrb) zw)bG~(fs_6FaElP1vw-TWWp2-B!tAv2q?y}P?$nd20}#tCS&8Hj$g{9mahHXOSOWW;R_?Bh0s;!oManTuT zmZt$p!SiNdq{9@iNBsXBE25>~#1b6FDk442p;#OtK{ynk*FzwjLV|1(MFF@h)!{wrmGnM5zu#Ym+iY5?jw`v3JWl5siIK(0FvGSnrt60_5}irRImXN=fcm$K zFYDY{!57951Da}AUDw)JYTh$DYSPpeT+Q3XXJI^oL!HzKD=s#8XgF}3c!!Bj2X2py zmZ>Zo2@zNvV~kXqvaEz*0-C@{bj_+nWlIb`;^Y_WiuYo(^?LKoo7cYFjt_U1o_>G- z?fUuI`;+%SuU60Bl#bU{kB)@X^V8Gw&7;HPH%ERdU4J^g_OZKx@Zp+I{+@4JFI-kqpcfH&)O>>^1<9w@SC59F|7orEGSB zAj4rYJQ61flz_lJA~+r%MX*GKvV5mWilm5`X$w_BwlxVUXR{PmD8_H$0bo2B3J~oWvG7Qk1tP`JCih#u->;z+Y+j(+vBs_=>;*te) z(e*p*%1Ti;_cDvXK8r)aSSbC-F9OgyLq+%ns$kh;dCJk%<{7VRO4ZO7JV6=nr=W(9 zp{yUjJ2=?fY%RTOZN6Aqdv~xqw`E=n-<$VeAD$c?RNmC>t1I>Op)bJm^FyD%o9p`e z+F!rD{qp6148Hx7z_*|N_Wb$3KL7ZNeEse7`{QItxwoH)K@5c<(0Yh7*Vmwbqulktb_g_qMio=PGl1V;C8xP%w}$ zp;I7+h4~!5F#pSXqEwEd!E%c3!UdG%2^a{D(WRN>%UpIgh%f~NP6;}v^m?_LZ4R3{ zC;E|Z^TaO?CV|li`HCtq2udQz1Q28dZ#xUD2XggT8BKzjj1`R<%NWP`&nO8JNP=TB z42{M{B2@AN!s5~T`1;0pkV>Tf&eW$^B2y-aI0_VB@gLaf4GaSk*sSTz#)+gL&hPU^ z!{u?79x@uH*-qaQFFp5??!iU421h`yrzd~~Ds5+Ky;`b}Cx%c`Qhp5;iuD2e?j=?;-}SrZy5Z`f>(#n|8ceT+vm^W-@kshx2tmF zMQe-95TkXBMU*P7G;u@eJ6uQ^m|`1>))}k|z&M_mjHHakg6F7usarL1{Y;hmp0TTH zem`$0vM6*0p2ql&LgTR@Mlv)~2eEd9jL*hUIM$tcfEL40{ElHFp@&4ek##E1O4PT$KsOlT&7l3)p7 zUfP#Asb<=WUF!*F>ZNTqBvsAlZ==DdNIT`3(qLnzUpsjjnxpH4-w&jrm8b}{ z6kM;t;NC_Ooe7Y)Ldku0w~H=<3AoV=E7nBGMJrKrS?Y}Wb*T8zZv?xzbI-XTgY)hD zD=}>tfbID@oDLCem&@4%>gXv`aRZvt5EONht7@De_tl2g+Pb&8_Uzfx&f4aq)zz)` zqYAM%cfzTCQFbg%l4_MkMLs?f{0aEe(V=g_qnk9oq44zP55@Hjh<;zc|M6xnx&Kjk ze{TGEcX@zc{pYf_!^w>byaYQCM}NS=GM#c&OZ10N8SDhO^?V3TK=D5~E`!#_%>)d8 zk|j%WBs+>ETXyW&mOY9s#21eh$%A4^S&ueekJi6`pT%7~XhB+tXu$m#gj&ML6xGuzW-N47KoHTVGj z^^dN|jnsR~Lm)v-diYZa-3a>70dii3A7sLSGAKJB!6O906jXmD`fCKl z@q8_l-|1QyzRB@GDR3_!5z7D6<7e?!YYZdVFznULbcdcblD*z3dMUJ%-+g*|@$83- zm%Mn&jlVG=bc_!l7vUOitJUp&{ZZ|-kzZf@^?N|wmo_4TJu$tXz@_?d=xH#a~3 z`s*Jd{Ll2iqu+l2z4yy+SMO!}YxrzxMi;LC=BscZDo*RzofV-T$?;YeW&VVg(p;`c z=dc2*5bctKIeGzF8`+QJ{wPG8C{eS%3^NItrWc+&VY9=2isowlszR`0t~~(i86tMn zl#&4ghm`p<_KjG2%Cqs@6XVsU&e?u^YOY=X+wRb6Bv-Kd7Pqmg@V6q?QV^JDK9ZNl z+O@2OlT@-}>kewq9szm&<^buEFOTt5p1}7w8dWx!@H$;2YMm~cmQvhdGe@!{&WrW^ zNf$3c*r$+XRx6PiKMs9+I3+-br+Xy=9uW@5P(z~ExLZje#CwV^l8&_;e%;un&tMPQGmM6@pA!@7*r%PfMKy0tpugY zxQ3Ag!>Oe_Do8X{;&=|lkTdpDc;h~rrbOB^*P3jN2m%|*uB*9K=y`H>EcMGG5K*)< z&_;bF@TYhHgCOv_(c_|OEtGRaN=y(>rRWxQObjaNEFy+_wsN5_V-xCz>|3U1Pm~lO zb|$_Cuy0IT>^(kR_{R=hNBH?i6~$|!K5T(?>E*V^Z{%#E*_yo?S~hH$y`DLFs3BR5 zdrju(Cbhi0%#eF$JUAHHQ_GMcG;BMHr`Ftq+TH!ncS#8EuCDGsKexB{*Vk892@|hw z5*Xg!++Y1K5qIy;wZDJ58Qoq-@XOhkt5pzKa5xJ?4I|a*aJ}(;=)ioamxj<(Xz8eP zf&vj?0L{}4H@k^XHxG1*c}SP7sTgcxSN3hWW?CQSw*4?r>rSzSafR_ynky6tn#=4` zISfJneS}io9HAiNCd1?HT9*;pTPZbX^ zCS5*3@j_Z2N@N{aP8z6F8TVlgf=v0~a6V_nnyDwXlbrn-fxQ4kx zlUbs|pd!@K7E;9v(&tYj#Lg@#lHoilt3;Vb?xprf7~ZPMDj1M*yA!^q;3beh5cAl_ zWp=O2lcbt&jpr$q13J=yf4qF&QC zM~9ux@p8Pe+OI*J9h!0mI!Is+Jy4TsbOW>;WWcL3Awv~f7<5d}Gdw;tdX{bX*8Le? zWYKEn={%2Q1e!?EI7{a(GqMag>W!dmxt=jg5cKN#+pq6#Zf|bi-+#LK=_)csB~ z1(N=*(>T|}8Ule(%ko*ZQA`c+l1dzKRW6wL$C4-%a|xQzCXuh)Mzj_5oysm9^X#7}3};x0{WI> zo=7ZulfsDeMSS?Jlx_6AT^yH<)!T_}d25}P|A&3Py8RZ<-GA?&zW#py_37p1<^KNZ z<$n6@{{G?N;qme5;p5;JYx<{cjGE!a^X850U>^Nv@4Bm%joY?0emg9ewx54hkH<`s zfH?gaN;H`9`=PB3z-_R<(wwAIsLW+&>CKkjJZ_%v#AfPvcz@rEtX>@uI*BY60HWar z&DF%Z!48vBZaHhC+$;xD@ZhI}nz5rTlvFHnKMIYX7&@jtnJ}U?3u| z6*6+JA;)5wxNfFOJY>PKLwE#KCD^^HTMQy8 z8bD$tQ(`<(@+bkUfV9F}KS11%p7j%M?j zi_E+{Alg~Iqx-|Guw8GWcfaO5!g@^yL`VWwf{rkDy=@AfNNvelucc){lHw!ih)#bmlG zXdwbak|1;y8BO%;(>vU3YCU~h9V`ZKZYFRFqvW3rx3f6x`8K>awt*X|@g*HC4~Nk* zut!UmODV)%iifiG8=a5@lE!HPMk|FIF#+llK`4L*ThDT?`;%EeELgdJnw*e1BhHTCW+;`LAyPKqGbu5pT=JQ$BCsfqb6nV31{esQZ+)u_ z(iZ%E{&C}a5PF88cubv6i<5B1KwuQuqV21}E1Q$zh$i7#L`SdjW>zxIq}HaO%SH}s z+%EWI&-v-q^1tu@I)BU1Tv>OhfBHySWYPU7U-i2Pt{9}02zSv4BUpvt6bHM&SO zZ#w$R!?zz_*H6=b{r)n2oPPLaI{on5mw!ISgW}q8rr+(XZG3D;D|N84)wkBlT`iOS z@9yQBmCbc?3Zqo8qNo8ai==3bW}JegZ8j5cJ9pSYOCR{TQ0A+jjc0!28j%|Ls`cCp zJS1bLICE*S@F@TS1s6p+8AC7XL`Pg)Q0t0NsO35>A(QGbIgr8tCMy!7gcXRT`5FVC zriDZZA#|K(5-o<%<(PpwLd9#ecKbS)G8h#LE(Qp=%d`IW^UyFzNL86(qz1jcEqQVh zCa6@dP{T-!Zt94nD7o`=D&!ji=x$vtt=&GK#+*C`2 z^0m-$mQJTmLmCt|AUOvRAe9+NVG?12UMFF`O#!N%1Yo{&om_ut`Gz;}jedX3sY5Q0 zNuV6R6U!eJOL8pdH#&>tD6@#N36y{`HAc%}WLVARIZhHnR=CND^l4Ez4$%V8_1S1F z;!Q-NLTrFXY{{&Nk#Tr8I5aUkSP{GBDu$#)PJ#f(>-2RTb@Zcb3T2NVG8S+e zCNPn#OwwFu0UAOW{+~j-`AwV2;{ZN3HlD%b7x3F);}{Gv#zMRVuq!8qeOLqwQN^iB z9xYV4AVo;k9#-o1l1SUADiXIxdPEL6^uTk;rMK)z)wZ>LN{{8naAAfs$ zef?^_xxW5-`F0!qr4`1=TaS8^$n#dad7Qiq($1G2zt6iJal8mg=;L5K-kvTFUkB=n12gap?F4V5ErP`A6J7FkvRr|i$)Y2&QQ zB}gj_C(q}C_gp_;gHx2ru#emF%gF0W@}sbud9Bz8kK4IG1FNzu2&y1(EJr~apY@-^ zOWuHr!$q2AsLL*9>21V6dg35680McRg@f@pU#~qNU8z1ZRiWIsB&cVE&YtR6h9dF}6G~)CcCJAQ6$wMS(;Apl3vZYa2RCaR&t(;MmKyW(^REQS>s9WdHKVB~0 z?FOq-3YFH)eAgO0{2{MjCjC!1xB+`-fi)9mYAo`<0Tq|T25(|e%kOPa@6=sRTX0;! z+7ipsz`3L$%cC}%yOkg#bwS3m>IGy48#%Rz001BWNklULMKTuK&bwy|1H*PaGOt;0L~6c-N59;u$?=)7ZMMX;nYSFp|{Led!n*>VQtuz4rfGjOlyU|N}C z)Es9CFL8^?_aD81pGL;!BBgrta(G(pHcTAtxaPePkgLj+7RYo_wOIvo@9zuTKLYjD z7b8uH<)xc`!ITan#*|?DG;BLCFEL0_B!HzxhBEDwg;Y6dpYnt>SiPQRgVbON=TJmT zm0YowEaQIiQTxP{>Umq@7{#^HIw2GN&3!lupO5qS>meHL^;>wO+YZYD(bfgP3CJvJ zbk6qQ{`&UaYiG_Lj;|kk!_{aXML*-J751v}DvnLhXD@e?6z$$5e~VhX?JZW&4V3r} zPwhz7PkBDLA9^)lDY7Ya)uz$|~}8l4?;aRP1b_P6NJDBRPT188o;t z8wy==s_Ox)PP!Xo*g9^)#09ic)yGkfzDP!!f;ZU0$$|6c$MrCzN*!PK;-&%r-1K}U zxAv+BFj&ug#k$gKqT@7uUv<|{JtQZ`_?_-m&6FU65Cc9;Y=zl(I7LWj6_YkjqG6** zLHh);S5TQYtM^u|k~ec*TcCJe_bXHyTK;@U7={2R5BX^tdQ{uQbb#*vyz=(}#go$I z4Q}eRapDLR8MZ(=w?x1+ zQU!4kB@csD7)6N}c|RXbcn?1wRx4ZRzE{qRu1xuyN?m~FQh7!Golgz$`M3L@ZjiO0v-DW*}`<)SwXjy;3hpDAgOyboNH7MZdoE6}u}Dq;+_{ z{few##m~Q{t@&X%jCOS zn2A+Z{gaCtLD08UL9N&4g|?{epNV@W+&JNJICn?}SfGjBhlCOirt+BU{qa1A$J^Ln z#1#NdJnww;F&|9t(=6*rac0iq?amuLQxG0{={Jy*c{D1?;kPKg9(=ui)mN*7YPC~7 zBE`Mt!I$is?#IciH_E@ z0%{tm(hR)`=`zBtBGPLti%Oif=`_tcbPN(H&Ubc0*?<;AvaIp2F?5K|5z8?mRhL>F zr^*&PM>WLD!%wb5N{;V$Aw%+r5cide>nayK?RQ}94aOf@x^?OE@azV7y}>j?W-@&p z#Ood=zG)owS`tp$w!^7n*#hM6@Ba$_@$~Pf|2{lDJ-)o~;vPx04cAal_!G+K%QVU4s`gg$RZz* zn;MJbOqUs7Lv=hFGHe^cwaUYQsRXoBEDyFDBf4}>3xy$2h zyc}IGvVOYr`n~KL4&J_>;p%bO%X;_mAB({@phY})-|)?&#QPfAss3$wnQjtpn%^kp z4I9YJg>@Y0pT3J-@#bwMxa&5u#BkDV@LYW6(uKFnN72YzMwoCy*`o;K8i^vy6C^-n zt3}8H--HA#3kD5sfie#Tonb|x5Y}2`lV=Q*mgHs?HN#o$_=r2yC*rYI-vto;_%e>t z-&#QSEr!keX%Q|k=0%0RVn zRx%&sWKkL{(gCJtjGgO6JUCdab?1u5qM$;_D*cm_d!e>J*uB1?$n842N=n^}_JWR744X%+E(F+{QKL-|2%$ve0cij=Z8NZUS6JBdTXW^5TzQLL^KV%7Vg;&YcOq= zm}nYDwH%uvu_Vi=(5WFt<_`VFN~u+yszP2chYr>vXMvB{nW5a8xGpw&0db;Og3$VI z_{Wn1DT*Y;09PWXvZibEA5~3PQx5fj-0rp88mkJbRaOjBRiW);Fuh2!pGoRbEEddL zt?MxN(U&ND?d9urdTPCW7L&rxXfe<}8 zYeB!*E}#;_*idMMX3+RiEvV{UG6axzxh7<#L#|VB{Yj~X4!HxB;C=A70oMq@&)2ZQ zrTxjeXZIs@JT4`@!8%D7JBrozhL&mmx<9qA2i}J**c&h3Z*wN`d;pj-sM}z_S@nuO1f%NZTR_aLb8>~@gn@4q)defbE~(@Z z;5Ejg6vAY#ItQ{qg~AC16$niefAwmHG?niVoZ+}b+z&}LWSh#dh^;|onvJsIx8D?u z7GemIE>TDvst!5hfGt^*Npt0@P2}@D84%qD1-PK;pl$Zn`+wQIjI;Y_=S_dDPj^we znBj(_7#uD&)XBddpB^6`KjZWA=i^^q9v?o@)doj#McHXlR|3*j)QV?nA#xm3S13oS z0|o{%#g+_J9J&-ovlgY^G9A}sRDoa-bMfv&o8SBLAz%*GvRRQj`Em&bTa+{MXnU$=LIxa*i^1*lBh1xmn&j;rd9$QbLbxg2OTl@ZmG zA-i4QuY3J$y&kNibw7!J{aW8$dGnzYuqXsoH#nf?*W7mboaW~CeEyYX<%)GXVZ!4> zM+0C}kR)HROhYceVNbeD5*4WF>CF3mLrd}SWz177{zSRiT#&pv~=UtL0`T_$* zg1oxK#`>Vi8#rbN$?^f%J49%!A%; zoW%EI*GtkqeqYq{qG%Fq4$evvnV+Wl_-DR0G(A#t?;YGupv(sIaAN6dfnMLIt;owp zX}_-~@kkkuTFZ#SeIQUuBE6c0G9epwm*ZH6f`>-%KMKv~#ck|><4>}mq-X1gHTvOa zd;ClGXk;NY^6$kX+l^OfaC}fNgDLUAl&-sj*^omZ^fHDp4KX8*$T2fByNxo`gf@j&|i`iQp_A(KUF0?QJPr*p!wY#>1D_65|lP9!@y znN{&_RNy1qpmn>d(-K(`RT_w;%!l=XuCg8jCmb*;^@>e2@ax@Jk3f1J?P<#CQUP)! zz9eGS8N4oAhKSU(g;gKZ2AX66EGgTCYIeJUj!k#95`)!dYxa7B^!mtqJ`aiE;zkK=j)0?-i-el1FNaTD2AFwK`9^2e$quQDx4{I@DT1EuWll5mK(NO8U zju~J>C7+L}sajT_u=!f*@x|A>+XesAcZ(hWL}g--qLcTupxD@O{6@njBRS>>2Hi_L zjyZ_j?HuAFvNqew=HoCJwreroCn_%QBM+{lkYzch;7#e&;Uu{=tlgC>#|N9+nY$Vf zYO7v*bw4{h8L!$wZ@YO?B=N=@Q3?>)v-2!|(ko5b22GzH9wx!FydDn`S4vUooNW{> zCs7kZf#fs@2b*ZHxfje6f;7Q`zUjH0jpmL4*uDc4O$jMZ5Eu>OI>jkzWB>dGoAWT8 z2TO@cL^SgP;RGA*j7Qj+wpxh16GxT({RtJfYplYw91C7-2lNHlp0(3_-Z&$D^sYJV zyR+_KFzgKP+cW)U#7M_!=>i9S&)Mi1Dt2knQ03T^jqH(xf%4_Krzq~#fUl8 zIHl*|Xe2!N`kR;6*RS9FU$eSF9B zt~>sG5{x^8-sjb-e`2nJ=8UY1Tle{Vn^+zump3XuzvLnTp3@rAV8!q}S^!p!R2hos zQqi!os%&%d43sg#*obb=@GuYN19k=IaCru?-Wv#V`leUF<3#gNbh63Oi zNb`}GN5>I?CQC1hTxM}!2bzc8y&HvdP&kDTN9SlyVKT>z4N|R^ z3iuJ?bL)rfk(Hn;SHnL4gjS*p&Y@y?hXw*;K}*3C{YXM3&0ar}RofR?DJK|EgO-T= zdfoBp*ji?ipjgpkHVF*F&M}H4WfYjQN}dr-L)*4xpcpfe;GsDnJ3HtO2!gDFlg>C2 z(8S3s_dg zmQ;B=l=ghThKdY;PQ1k%n)kSMu($30{O{lY@|VB=_0NC&?LWW&!~g#KbbEVyne8Q0 zzIhWDs@~a{_qUIW6Ys0ycHZn>;;}WDe{MS4plO-G-Apv%IMje*@xnSUVFns}+{qY4 z(ol#N$WbzhZMfQ;1l`VH{_D>rv%3x2rr8sl_2(ah$*G@om#K75mkx7z7_!;XGgYJ2 z^UMWW=EQ=L&*8#^z!A9MEW?V?N9XKsf@bXgYVNxI1td^>HSRWVhi<0ZOm=T1V!;|V z&Q&G@v*HpVn@ttqG(m-U=~*R%r&F|&SeYMx7p1#n@^DYRtZ!n(>k4C(D^`BwV0J$j zib2O}gTCM1#NYFa&*Ol6j~{K1v)?y2W;;s(mSs?JkE>j$@ulssdxC!`)o=}; zErK0TD5h?m4F>%tiR*rI&~#0+FwlgsRlcCvk*;W`k%knk7z|C~0a$+7 ziQ#v}Y(xnf5A~Yrqzy;r({d^#G(Z`S6k^eWOsRMdkKSwRV?WbMU;&QAGjVm5xSI{G zy2RG^?NvW8g4Lu!a*dK0%K(&?M+NjDx=c~Vqi^3_zxwp4RFwq3mCjS3m@sro5fT{f zg?gA(Vu+WDh;kB|*1b|Bd87&q`ai|y6WTVK#$id8EPb;4N0wyEb}ZY9Ez80vb{t8d z+S1UfHja1KWlEci3@O30!O$6cXjtgPrMO`|h*^5G+x4)Q{^;pTB(i zG*wg%pof+zC-L>?23&%U1N=Hl1xay zK?E?DvPO2Xqg{zbsgxFuSE^l1;8LG?tC82YjN&f%nn2hm z`^|=^btAFY!VZqpA&gK%cxFQ+@UozFlX0$y1-Vi{b2zn_DGN&(*%M=Y>YhO|*(PE6 zq<#v<6rQ4~AP+AS)Y`_8BsOvg6CJK4qga9$7$C+_bPdxCh3I%G*bUaaub%hkqIY2f zLg2YHkzf&=<(S5JHgpkd9UI@8Zsw9Jcxun=Og&}1^c}b9q4r38ltI^s*O>5nI+^G9 zK^ApRv^p_%8e?GkiUR~nYYj|mqT5d2u}yRGnWBtp1B4;vCbJRHwXFsyVCC*k zTEf9qBql`ww-YC$6iP%XnA03i6cJl#v|NqW1SY=Bd*;vzHWA(2uS+n3^HMgO$`NT= z4Dnmq)$QGx$)*{8IB1L;i^e|0XBfS8JRis#SWza4!;~z@(<>B-fC3kYVhlrNM1-A* z(@Z8&KAvAPZ{DBlP0Q-TJ!|#NVq*@-O%aI@g&0>XfkYZ+d<~DYNb}L%NB{jZ!DC!K z&IxF=m|+l2i}JMGBv{bMHi9@V;8kKhT+_W+VWH3zCT`YaSI^z#hYx$t-#&rG_ubyl zw{O3?@#6ZE?|*&p=6CmhdGO%l#}hRqr@tCGh8K0hX=`##Uvz&znc4kWdSLgLXHG#; zRJ|I}+ew0DihyVgM26+DC{3yWQ41NBPF8D3oL&dx_1(O$7#%{fjecM8;nDMYv&DFM zH|#^qm~FiUYL1bW!a*Ihu|^JuyrW4ujpS484vPZ`y)uv;y6F&Nw++|DFj}s6 zl?tlEY7k_S9k`9v>Fz{kkd=`#5Tm!E!}T5JU~bKH-Ji93?FEFVX**WO1?D+yZHy=a zuH2Pm0V}Q1wMaCSi;}S4XaNj}G!~U&fGC%>QnDbiBPHH9Yug0`(Z)^PtE*z`n(96( z0+7ie8~}WmMsSTg63IXg+{w-wetsIwEwb6(NGc%u=^vM~V+v@wt?dKrFozR`A*Dv~ zZnw+V)Mha}yh5N9Nfy&#?es#?;XtEUFnnjaa{+yEhVEPIFiEmuF{jb&fRN=zGLR*v z#uW=q><@V|6bTj3V1FOWWaX_yr6~&>koefu(v@_Z6%st+S*W9fqHec&{J79@Kfe9+ z>hY5|H@|-S(}Qt*z!+THv_U(UpvPr;A}nA1zudWZYUR!$Zg7siTt;N#&40t6nKFB1~So&Xw|1C50edF%x3e zVW0^S1|cf4q|dkYjt-|t2QHT4ySA^pw&gAf-6>+B_3SPy01(D-C~o-%h*yJH5>8TW z9!b)hg(-`qXW6s1a#k?ro@dYP**s><6*h&C`3ec^9FWNR#^F42Xdt7c()Wmv2-b@$ zI}9dkNkv&9qN7-CW!q_O;dnAZp;08JoUM>9dun=UmtXai<-pUGC10wFji4e2J=awh zKlJjTc=;S6ji`V|GfX1aj90Q!NIt0Xl0a@?q5uwJff@{ctMRZtIZ%!_2~7w#7fuh4 zX1o?f=_dX2oX7^0rux9r0tPdT;npq^4 z$7-M!W`UFrgK7?t1X|OkXq}6sh$tZVNP&~H=?o|_AV#P>D+(MZ^BJiqqj_S#ZT;x$ zs%qH1lYjm6{JWRe-`u!r{IZ*-^uvi;%+9`T%)#PbR|)S z76*@Or3RbdJ}6*VN!}=fLJlzbCP*CG{^d6zE8T6mwqkj`%YO?xzTMYT%UX&6ky0f= zN6XNLF&r&dD&=@Ono`OCQ*d^#jbmpRmt@IDpO$3F*71k@ZOInKU$P{s#C9>RjXi;w zgqg6^hRmj3vTnO21CuS?9fxJM;9xq;O>s8$?%pIf3Da~hwjHK7vqRXqOxfGLDfAzy za(mz$IOn|2^PC^N96w0PNTEs^B5p0dm@l+aOY4`%cZ2eh=xeQdt|!VVD5ptXjuN8L zTu#e~)3nV=NQMX*nrO}KcCX}?<^inSEt4|{-Sq^|qY{RvvXg%61MSj?&RT22xY6u@ zg=nh=7i8ijh9t)WcZ?c>Ku|`WBoA{-Qmm++-gH?{Z&NXxS4w*u9)3$IJy(lGKj0Bc ziUm6je7{g6RBU#KdpKdWFy!Z1$|LH&V}s_bzqv;Nh;d%sP#7kA0>*K}bb^*e$QNa; zYj+i6GEQWw>v20vTzimL z)5-eNaUZcS)g$3`OF7e&!tdVvXXohp(VxCO-TCZbbae9myX%ie=a0WWc>LA}J2*6z;NCr`h6b3S@<{dDUepH3I8hAPjC*}fTHfb1j)QJgjOV3_A% z)E|aC#T(gV&f5VDB&D$0G<`(6N0n7eQ8kCPo9mWiF9zkw;`x1i{?xu0q%7NEW?gdI z_SxE$6b-(C_%Ntq{)i$z*f+?Az@S4P8Dk{|fvT7EA(B%#0ckZajA`HOPsaBERzRu0 zAB=dfF0-ZiagYcV5t-m0s&pWM6z@zD$h zmgTZ=zHquKt;fS9sRkkXFC?8I`T^HQTz7oa^LQNg5X02miATU051dugp&h5*xSYX` z2TT~jO!{ZR!K$~}eR~su&9cTdFN2m_>d_H|3l!{T$X^M|NKGnYKrj$4q56zHkxTOp z46D@CLP}vsQC28HfP5n-a#bqKah*865uYaz!I%y58zIVSMJ;zqv`o9jxc&aRmj_vv zigciyjRGY~d+}Y>*Ztvf%To-hbZvKSYZeVw!R}etDL0>Q%8b*LgDD@NQ(0E>_dvDb zMU4?$8Z_M*`e1{jX`Vv>nq&)`3xGqWl)_Pt%;g|s5H*(0>AD_ouniL6{N96_MEIj5 zlL&JJA=3mO2?v(T2E=L5A$%Ce@bOr7(B|;VZn^tM^Ua4lM<gl$ZaRZTwd&X2zI93hynf5Zr;^~eb*J}{yJSE zuNM7)>a;Zb`D`NxU01W*rZ#jd}Co#OzZt0?I$%7A@VO2?2Qj_4@#2B-)Hxv(PS zjZ(nl!0~-==6!eSSaY0Amzp>}G48wnTnFQ+p`v(67LOSrvQSfe(QF|Q2Mnb1bTX0M z29cySyZC9KdAR4j2D+wwn7MPD>0(YO2!`kwV5QKc+*WNH8TXt%N)3m{h#YDdnwwqW z3-TethE-2s`eAY=>pUv4SrMac@4hK>mRU?IrrpG!o4LkpRY(0CUn6M*%~eHC0wjtd z7#X2a6|W0B3F%iw!zmyxHm%%VE_Oi07*naRLF(m1~1dRi1UzDP+C<{7EAl)53zlI z5B6v^h#jlEF5)!P@U)zWhFL#Hi#Q_DB9t4w9K&a#7|-K{5RIW+#TTwB5MaKkefIZ% z{`KwuUcNrxeR_JbHTv=K=|{Uqqm$j++mGMBIQe{MXY|>NcaIN7udly<^yG(^=LfIe z?Vj&^|HJ!#fBWI>C$CSQj()ZE-#4q@WbA=ys# ze!sf=HFzG=W80Zbrr>nvggr*ItELG=qOjb^%wybo#Zm4=<; zDg+zGIOV1E8MDehQ`^bf>Y;q639%r}gc1!zVJkisC^D77i`i!!%A#n{!$?qwZaS+n z?dM~>0KA*UU=f3;oC;K{f&rPLLKIX2Ur$^moJfv;Ic;iRY6|I5xx69nDFvAvsyhcv zoi5Y_kq1On4BBV1Y)xD2N+WSsZY*mnW>c9hfb{j50t&hT0QBL!7>=9nFqHFfSIsS+ zl^TP~Egfr(JG;g262vU-x36dNJ2idAjRL1P;9?4a5I1BOtT1mP+t3V?Bjiqo{iVFyB%QIcmEH=Cqg2t~1o+wDeqX9!(S4h)nMK!Drpb-y*o zgNMf#w_h)G7B;sJs)ze`mge5AZ67>2TWCMtSbOvAc;Wi`^8Dz@t7p~S>+Rju+l%+@ z&gH|uU%x&+yj|@aoUd)SC#x^_H&5EtM@J{W{Px?QYt3{cW%8O`QfJL(DJ2U`!qRFu z(Re5*B-R1m>NmF{5|J%Py6#N{4I^q8R(s2f*I7l?=Rr3QQ2u*Lu()z+giL&sG^?%- zq%|WYc`;>RUSu$kMo=6Qorx0bw1LIc*q$njCVc{33Cv3Qa&ybotMzijnJcyCQi#PZ z>6@KqnPT3KlPsU)gL^S%A{-Tvba&p%xk@m`#v+JM)mJ=0jI)Pw@ z&kwYVlB8vdi_#eDrxAb@e^oR_viXz&X!&d*Tdx5e3h)3YkCbp82f+%V@DWfn%>=@j zV8Cui8dQ*Q;x$8wP*RMvgzEjt7*gtp=oZyjA02QA5BaOJ#$+7p?=cs44b(4$N^c~BVp6h~IS#Flm zy}eX0@Ek#d7AuY8EJegbkD`~QSh$&<7EG$0p4KI4dMCw6g`F`~OBFE;1ZO0JC+r-; zGUBjOiQvwA0~DwTZp5PuC7l4<2L=Eu6-8z82iZ?CkwHELJN#Z-gR~2Ry+1zqg(#OI zoFhpH2+K35SvdhObB<2qT9|*C4s%u1PyxvfPlI=1M0W*^qN{9GkvR~cfV}i7$Y_$T#3OI zh$kS~5rH6_MPYpg;cHT(tL1x|ZpmmPdbwuY^ydGXO4Yw7GSREky&x=Y)gi0gfCpgP zdZ~VuB_(Mm%wmI{R%}XHRGV(Uso)Ssf9^UY7@sa?TG?V#&1)t?wz6V2t)-+&O|lQO zviqL`y=X|$R9Yhdz$h0PZ9M8^5!lHGA?9tr93;bjnPDi}KY>Gx%`8ol;Sdat21#hj ziQsO)izsl!<*D!-frTj8=k`w!1SoPC#GuJ(gw09C1O6inW(P#|Cyk5d6jpBxmRFy>?C5gFv!7>*CF zD^UofS;ky7X;*mOHyW!{V$LZ51|8$$gqy~B)?V=wGEXTKK+!m>#D$381r5P|e=;QS z%+q1@s`u&BFMs;)$%m7JrOP)L)yGR89=~~1T|L@eXm=JSKbp#M|Ml+Livu&A_uDU* z)*c-lUM|g@T+VHue0cDB<9PM<$=S=*x%R=@*S8m&?>hGIFiA{Cm(e6%E*-C%E)nmlluMvJNy(ngNmvdaN*VE6INE9$M&!DRajg;*oAMG1M!^EpR;O#E>^>80S&4*Me zsUB2@v$w0VC8=kJlOwg^l9X)+#HDtnY(7maqrg0o;dqEZWzo$i0P3cgaDJ5tV+^a{ z5bzG0JJ6p}Q)2FkWJ7#+xcV>Tn z^!UI3Jiq?o;l_*3)ZE&}@zt%lg$Hxy*~yLd^@l54-G$S$&6UZMz2oEWHxB>v{;NuS zq$H_rEj7=STh%&2hoc07;!u$H!wM4syb&Bi%o1^ejI~4tj71_C4D1jD0(OICY1(ze zF82ZvvL|h<7!ClU%+jobdyZv-Zdev06ob%%EN&@m2bXnEW2B&!!ad?H+^7|wNDVP7 zO1eiYRa@4K!k+x56}o*!=9V}XnzQ2_kez^4r@ zx>PtYH6)c(^_U ziS>GZs9v`wlUnL^T5Z%Dk~b8BXOu)g&hUndAQT%cQ=*Y@IGyye1%*X_W7s`FVz!w; zFN{F8Xwb#WGG(QseRun2Sf0#Lj75=hJqoGD(|T4i@6m@nMO`uhFRDo{m8$ZvP)hI0 z6c&s1iy{;AIS>c{Bq-Rz&+lWnbBqvrEpV=EKvtVU!vy!aC1+!Pfa%cj0)g^XBp4;>%mjmG!xc zvz^KA$>ic}bNajMsk7$JdUI`V!EDbLKmKL<&F0$i)8>{*z?I`W-JR~<{#NJgbfGi1 z(QMxN+v(KW##Xa4cjt$1CO13#v(0aguP>(GfBbk^t=`kJ4MnllJe=%%PN0l4;%5LU zLp|PJK}3TH>?X?qB_htjJj8o(6al@Mo${Gj2@W}Um*N+NNQ<)IHzQsQ4=VsNRgOjB zAmT7!lt6LP2U77NSZh!X%Pvg_JwVR4YELB37nO#7P}J?}@QBKY1zpPD9BTv_CSnG8 zP3ki`fY9iY8bq zZP9DZ|&V@wiTNr5pJ|Cv@Vgw$vTi7Uzn^`S7>U7v$t`P4Xu%IF( zO&ok?RFf4wJ**bf2g$;Os>ZXs%c?{ci^&FBklv<;c+%@Ia%Nf@v<(ts4CS8#r$U5< z0aS6{$A`39z=w)ur&hvzys?`CxK$|?NI&p~?JOLVAu7;s&{hZSaF@&O-PiH^AAZ^V zt$RLs@!iwu!?lg6qvpo-(f(ZX;<&T*?(ycy^~=e%2m6zoE600#PZwurS5CV7lUI9F z`-fltv@zY;I=$-d>~~K#HajoAe6;uSq_eYr)I5KBadGSHeC=?0|LEbu)t!yA!}HUl zqn-7uKdvtxzWLL;v)?{^H03J&`=!!tUGTfD5bVs|u!I#$kCXD6MGPdOL_e=2oP0+9 z_H)HeI+<7~5{-amG$xqor{7882KclFddRH17tNuB2oR1#j9@V6vLzs22n+kj*JZup zQ058Rfuj-FP8^iHnr&Pg&{8RJOjpw-fO*t7V~8V9D7(*#l+$l5nwC-X-~+5=|zdS!c53jtS9% zAyR!4p>2q_>vBu=(!Q}OOIk<>im(et8@F%j8zpEKWu;|7y+tqdMP;F{7JBcC3zz$H z|ATvcb2yyga2WWV@Avy*4rdOenrhTCy4K1nKk&ve;3|4vzVNe*i{ns>na2-5ug5PS z1oDw~%=Gu2K#YxXu85fq#vP6%O9nZ}k6K|WV8Vf|d(>&JK>pUjd1Tycw+e(O=KhVb z(k3B2{4L>N!w&^V$Cgg|^{xr^u;aypr5#XwtC!1_z1dIOgF(MN zc)EA=^}JnwTB+}DR~J7`ZvOknliT+F>;0D-)z#ar%JSKD`|H{B^OM`h-#vXZnA`aB zOJ#4jy8q~M`_q@p4=1C|%0r6e)N2nK-BF=9KJ786w3JvR#IZ zW?3y|0frb^UDLB=<=b}>P}MtcMTMBl?TJE+#s0wIW50ny$V|>OHO3o8uMmSg_?`B# zan9z7nL`XuxCA`@fJImfQPN`2G(zz-%28}`*iLucA`}|-S^c8ZRG=*4u<6$cpTNT; zOjy<91xurrr*uPS*@c?U97qL2<56lf?42K_@ew)ha|S3Ff9MH3oCv{!)lMMkA{6D~ zeocv@4KsDMlu5^mHwi%4kL&H0pw)8JUy;_GBqr zE|)WG%(zn+B^0YW!KKqU!->py{8KDXCs_f z$g|b$Ypb`epI_cL3#b#utzj`L`=X?s95;C> zoGwmb340iX#f~qWrWqWH#?~Arl3~RevJ=SUCCO-hev&s*S!qc*NM@QlPXa~*$A?no z!*yG+$4T0l#+S8}npKrlpd{&mY)EY8WlR=H8Zwo;&2mfmynNsc* z(1YL~Y^n_2sibD}pN;I@;n|F$N!gr|QF0nDNRq1dNMO|#+2=(d1Rfggz*vGKOcpqf zJ1H9SQ%=^~E9Inos+*1wm( z^M13kGP}Gz`DU&^s8^nEyxHEWpUpn6?Ctj-t!}^ivbepv``z2O8x>G+l@A|3zW>lZ zJ*`#;*ZcLY%B!<}WiY7r2YZ$4$<6lp`ODdxrziJ*J~>)h1kAkmcE36a{P*Z|?&Ra+ zw>Ryxjq2cZ@#^{!=*{(yX0P^79-aK-pJ|@;Pz8^+BZCn9D~T*XxDBFs3e81gR+q^| zaRlVT*zj1uGsf9ymbNDacNC{_US_R;#Qgp+C;`+ojA1xz!?`$~VB#bWxJBe(D`9gW z$zgJI^swAI{+prH*t^T!6iuu3)UvvuYqpda$dwz2g;@pXeG4!=aIFM74J5EV$6wPo`$=5Q<9J`81qzf3EiVNDEiWM`bV@TFffH9`L6T`8qZbQ_ z9>O^e7oMXVPc~tcZ1f~!h{j|l5gpMRz0t6v8%-uoPBOzWdT}xtbCRf$yO)vWC@B97s`8|COtIgMnO=7Vd$BBSC9+M zx%Dc9YQJX{;_+;kZYXc1jgy*^mLvEGnHREO-nSmM%Jl=a+`ig>bH1Xr6{riKmaT49 zR%YvUpt&kwr+@KqrYP-pq|Eu=WGzW9ts&dek&;LMF$m{AsvYb?c{ORXGa5_8HR_r2&v7^ z)!W6BH7`#P=Hcj&fgVR94gy2baRQ}SmzST{Juw70+lH8tWl<5+sZ>g;%FUXzA#1%R zIH-0)VefQGj4OmFSF4f~&q^Q&0_Q_IGO4VdqzH-$Fm4D-(u>g8*ooW_{%2sOin9ZZEmC> z`MX}1P=kzi#}J(yB6YMi67bL=zX#&YyqEDhl5PWwTigcYsNL&ABbkk^(9KFsmzYO% z!PL}WU+&S-tYY<` z!xUQ+KKJ`J>@S8lfsdJ8-1cVHio)CYVnpTE(1T-4*Eo8wm(m5;ln^Hp#F zM7OlNQrX@**iqZLa=E;*n_6-|EN8ikhp>_Up6i zN@;iV{BrA{UIu4w)pxYv<)wxG@z9tg%#3pQ-{WT{$&TlxjCl$>**HUzlf2W(1bP1H zI8ISOifO_=AH<&-kjW0@HhQLMige67EbfpV_QEz3NV{Is80!zAPDHN*LZ@dK6Nfo{ zY*zmncp4Bu01@eiP}KmGl^XAY@~l#=vFVNOVY(no8ldtCridA_P>=;#)MJ!U`{a<3 z{QlA8*%TX}Vv%nCQ0b&iO+6Q@DJ<&uSf(ug zI3?LZOb)>APKclkFrA=Tlry2Y-s%qdcmt-#?31)ZpR@<)#R<9j%ZH7WEUigm%G;2e z-+%c1^!orJ+SXhw$w%VipR!-}U%!5R^KE~B>7SLA!9nZlx(uirY+V69z5>{*12$K3 zce_6VgnH%k7lZqwoA*om{XwqMU$_L6)pvGFm;JIPv+7R0zVu>c_eHMX`}KMG4qRHQ zJp6ie^y=}u<@4WmTGv3b0dj4?bZ!Nl-B)MZt9^C3va<7V(eLFdgVpO-wYPtcpXxHs zL=8u3f~(j>yK*3cP^6u}F&sA`(GiL;VtA3m)+e4k^0?h_B<&ebfM*xPok2g5%Eo@r zCPyZrnV&nHJ`rN<2AjufK@vZkB7QfU<$_slbW;(k)s&pdvS3e{Fp@eGLx4yS14ghh zm6qe$Z+y~nv#RyY6jJGYMrc6F$r=g^4r`czGqISEo@mCETBakW_J$1Wio{ZwLvW9d zJTj6PgTf?m}2V!M^G67*A~T@Pw>F5d1AvRI~NIg2qVHk zz(MQ65gdc~K=_AKxv&wh<_iU&yjnwWDkX~9iC{*U@n;%Vy%{FB2`33XdKxC3pdwH> zW*h@=7&<-^3=enw9q^8wWG53|yU_5tvbCAyH_{&P(ITAW__?QR-P6T}VEgaIMXPo3 zynL?_H?&@_oB#kI07*naRCs>W>sKnf%egnLI;et`^TE5Ti`h>{&u^Com2I_rbq$ES z`=oimc5VRt;?i3)}DB|L0%qKa>xrnfMP-cX4me zs${A$2Tt0pkUta)5}~9gYA_VTFoM~_VUNWJ`4k7#fQGQ>URZ}j#c3`j;@+3p5EOO0 zP16;xzjukn86CxR$jHpYNrVnRRIE*otE;!`CY&TDzU>_aO%*wHcAbAO1KMfUcpwOVuG=`R~|-#85#Jn zS0MmH)=D$5Bcysgi2yA5RNXEbg$`zKpm4X4W4mdynQ!d_V;01QN;HL<%$bUuFF!~n zlX~)9Let};N;xTvj`=VYhONBU$2-#RqN)TwGS8da!YDh-OQ?mI zb(shVhb$0e!OOb@WC#G^w8NMc4cJMFvfDW;VRzDQH@i%9cxkhco23oCemttQNj+>u zC^Lj3TR}g+z)8b&#A*q3O9q#5Otg4AJ6(>|L8mw1_XCFm!WhGrTz@VrS|}v|!>r|Z z%YYG+arru5aM&C)g(CuqvwqsdQFd%k^9o0&Olm9;F6 z&(&5y$e5q_I{BzrpBi5|eBF5V`pfy#J0~j}&x$LL_b*Quw`*6w zot@RzPQTV4?G%sK$G6Wfu4>KZ*2_ktcsR9oXZxUW`nvvT{cvF&+-!aRaB~MB^K^fI zeCznI`Nt1WpKg5l``><+OR`~*M|KNijM<5~5YZU+LZJXBE%^*+MuNe^F~o?hhFApB z1v0B$8xt{sCG)qdniAzrBi-&17Q$gj3}80O8R+qeaY5Izs4i3zLaWU&n$XH#L5(`W z{IXu3sf|yy`ZZ=N8KAvRJ*ueyVx#E{lH84^{uI^eDul;X;abm7F$F1WvK$ozM?98& z7u6KLte9iD?(W_YhwwPP$}mvE^Aid?QIfQAeiJ0IL>NW7-KambR8oMUA6DdYwcrHM zRBQ>rphJZ$-|mAt#)vl}`L8}IDB|t_7k~^{>#vG|J{uO~Nsk>jP&C?!F#SN4O|8ad zrrn5ht5yPmJQU(`d6sF>BC!FKhtzn6_~;MI3EpuF^Su*PPEgFssAm`ru>=z#oCx7< z^(wVF(RNp85ck?)lL>)vobB#i#og2FY==Lorbo2`St=9~@p!bX>$_+a9hr8<)!{ex z5M;oI17I{T4h5`;C4h-G<_~*iIr{$n`&;@Z z;`QR=%f`fq4lUfC%Y*Dqf_A1@Z0pJtwIF3cV8pRCN+*CuAReq6h= ze{?jt`S#h>#;3)_#_RLu_EvLl>+$%#?fHrN_R7xI>(ja7a@Ktd4HFWGs<4n-{5-TaOn3mRsbQ~nJ(zQsDl#Sz-xK`Pg zo=)WiL5mBSq^w4P1B%Lmo=Ye{ZE9~YP!hLEAS;I(+Hf;Pw|gIUawP9IVVza~ zXeMHYOe|?Z05MTPDx4J52h{>rsf=j7uf%M|g~fGqRqyiL@5Ky+&1<*eVFPX%Y4@TC z2Ad*4G{O|pXW(g`@9623dQ(e2CI5d4&Nn8FG>_xMFat9P4lw)~tAHYmK*)fO;Kd4f z?o`vzJ%~LqmtvxIAqID8@zPu_C{3fANIVG1HUR{7-@qG;SKwf4j%-e;p_>?@F|jY$ z)V^qwP2V)xH@?2{-S5@&y!k%g@8_HR^4MJDKc)~|^(aJ5FFcCbm?cY}bTPjK7|jcq zhA>)XAS}H*01yNZ{~0V5kN^1n(~YnB^4)SsHa$GLMNYCrNRkvfEgRAyj*J2UIKYgM z-z$gkK`Jvwg-YMB5)5CQhMTLa&Bs4<*H0qBtE)qABAa}>()Mm%MZCG}{QgSL8@aCM z=Hn~5`NMjmTd9V-?dNT8vYKFRuvV)_*WWz8I1L_MA4HB4m3X|Gn?E{u7@p7hQptMc zsPi=2>4fjq=L?mUXFH8x>#QDb?k8A6ymxe#tDL?+y-3t*2hUeGR-eXw^;)V^{ny8> zl3p;qrBtX4h)P5Bj*jUN2?mM~qf7|{9wpc1QLC|H=({4L&D;D8Bd`TxOmR&4nxhqJ zmJ!(q!s4|agK+?~fXr9s(0zK&u|09$;c!y6iM-#jJCUAwE!Arg#Ehi3?JkP)yVwfM zDslA&JDy#TJVpvywk8f(J%ewGbSWp3NqLeKn|j z=8jJ2URad6Q2{0*W(Hzfo=PQ0#Um1hikQVjQa}NXi$NZ45%IJht4E>Tn;KKA(af?g_N&&ck zq+k97FCQQO`p1V)>%P{})x%cm!|&hd`5HCj8VzOK0m>FKX!|tu?&!i8$Dk5I;}`(| zOL>6w|BR-8{q!!{tepPz{-IeU_><_LJRe z_>e`qTH=TG&f|+i);C+>%1ZZ3*SG3DtRIBKJFKrIc9M~Ub|J`)(Q2(-Z*6QIon4&1 z>7GW9uCHouv$<|K+z39~sYfEYm)$qrPW9yQy7Bf|Bbj2o)mwiUtZn+fRNj3wr!yAW znuI$Dz%#f6SHTE?3|deOu`VE!{>hjWxl;le%9v*6Cdm;dUEXFuK%pg2h^sQ}iRF9& zUt}7W8%&6ryYMx1T+Woz<@1R-N_*bxKhLBs797La2Kd|PIV}!tZ%;1WdfUW=-A1`+ zn~Tm&u$?*Ybg={k0g_j*Y;=j)rD=+N)ePlWA_Jx2zXvk@v_NL27xdDe!5O0pHsk!; z?Xo?OKm>viXUGb1_y(>)Wx!)@7&T*f;65VZ8q8YQ&0C9kbdqHuC{*BsgC@?M8L=6K z;n{vZN5n>NkD+G><@PA~x&ai&1W2z&p|HBG{lcDs0kLst$f^Tjl>!-7tB0301AG*a z>H4tofx+Jti28gx;IuLHeI$QrmlcbbHs&(GiFqh3%3H=~a2(((P`3ck5-~1E1aJso zkH9Qih=+?r5DLJ=8hhNDY0Bv|$jG#+91v@m={&rR%HBG;Ga$HOw zzxe#&W_7>SYFzCf<`Ula^LX^bpVKaS7rCVWR%RUAHe7*|B+zHRizw9`T@Rtuvbj=Z zaNxT@$o}pBeBtaxHWzM1s)d#>o7z7(U}2zD&$sJZ>+a!CzXr$Un-R#+dpcpTsGCLK48ZO@txH#sl>hOc&BpnF`f4GeD%c0 z(arKvsfH&24Jb&6*T$4{OOtmO_Y`h%hWrbYag${;WmC`@RErvo*p$f=TOJ(i*NZIx z`28pfS>*sCR2Z#@aST9t z=pLdO)qq^>>>?k-Bszi^!|xCv0&?KqjA(H{H%5RkGBPVN_2BUBHyBnvq0@r;7;GWT zDuY~(3%RgvR;%FQsCCcOgAJ+_g9fQd1|j`0BtTGwL1-X2LImORdJzGD3}6FRwrMLx z0xX6|V&?R)JLV+IMMvzI2lSC#Zn<|96x(0{0>h?$i3)&5zgM$lVC3P3K0a!}!~nrp zAzF|(^BN}*KB2_rCez%c=LtRG86jWXu26=`3=ET0A4A5bdQoC_T2l^$K7YQsS#7u9 zKL5`~Dp5@qD$&-)Rj}2(`S{sIm#EOR)=zDhWXd_3CVIJhLjn|lAZTgM;gH4XuZI?k zHhSXt+kZEk&5QNsU#r2?!>i3?`?Ncsd>%;^SO_f4C#v2^&R1yXBCSZm7jEXF$<2e> zS>?@}_wWB(-)RM}PTnReQE$8vEVS>PBv1AW@%r;*e50BSvO-?*#iO^fJoCP+{P@G^ z|4BNZkVdjRj#pKxQdLPRe@s8nzi7i+}jE7aw3A&nL)2&OE zg{Z}nX-HNKLieK4j(u@2N_LDGMr<0|C~=`_l!4yEF3emS1}_71+4H`zb*oD~sP}!} z-}m!)f9}PPpMSi_-@I7)1@Os4qdK*pU)!$i97vtU$#!P#pt_SkSZXvo7axDTxc&0e z!_Oaf`3=TFJK=;1(V`T|E0m+8S{8oBD#J++FM9*{rOY%T)f>=v8gP)ZP3c77b$d~Zhk0zL)7Zs-Xt{$1$!58f0U zdk%1y8B}+WpqYM5s>E~4=Sfn&LoFS zYNxQZIcXm9qaLRm?<;3OZ{oprrFynBvMMeBP_0T6;`+&2CG*>w*lO*Zot%Th`(owQ zyW6X)+tbreXIEJOETCOroQ>u}K3{8{ovo(VCn}xVO0@$Jr6r{^&1|)OCFO4~zkYFg z`pwGWyNt9}lzpkb-2V6B=iMW{?kQ{T zvCk-3NacsrsKOJaS%30a_iQK^f4UgqxyXz*kve{E)Uq}^G{oQ-gBcNzpG5549Y8vr zR;$tAkd?7Q#{}-05l9unY6KFbN(y%nGXrdof+9(|NlzxD@#n$hP&63w#)7$UJXuba zQmN=z(pxT-!Aq)KE~P;FOO?HMcYpujWBKu8j@M195tvlT85_hvT4bxo#BoOGksq>I z12Ab|Y1*N%%s}7!{e~w_1)k`~cnm_H2oMU=pP$q_`x4LqZrv+;>~h?$=5UC_rh%^_ zI4QTlG^-*py}rBoQf6lrY9p={1e6BUW8)B|i|fvKI#f_Drm>CFgFecD1hCmRp* z#aw+(9gGR1XfLG@2>VL|V>PIGyT#)4^M z@MaHAPMY2EP;`%wYlruqMoP@gRw?-5pVz0Et5!O{eIhoppl?CREKYsyE)J;YYt?pP zb$x20^6*d!$LGAI{~s^nP{SxL;|3lhcsMmSn==JxH-EpF429g@(C{(z=byR~EWWsG zrNy%)Y2<2QJKLzYq39?-8@*o=-jNl`lWb!aM1>edw2h86biv=wVA@n=+JIzc1*~5y#O_0(f`g$)CQaSAy2bhmUANMJ78ypfdYIoj^$F&WdZ^=OcUlSWi84G@dq zKs0(}bY=(-Fo?zH^gsxOO!`=Y&c!GVCP1*eOu5b2h+e^Tf3iaCC{emQYyEE~5wQ+MOrlpqHXjB*KVqw3T7O$><4PsGu$QzBz z#~4eWj+8SR%r_lNjm1j<_q@SaxI3#F3r3^6(Fl;>>(kTwm8l7_0~D93)y0vibh=Vp z$gg%+5rFpI-oJfO2mHFWGu5mYvYGa(boKAcn|!;lpV`Svt%Xke+o?i*A)CoGMkcyz z7IwDZzOGB_;u;tc`?a?#hqra<{P6zf(*;mm1;rAqFrJ_Y zr(=4?veh>U>(IW0RW0LQ>Ji%{4dF0N$$U=WGB0Tht66?lQU)?wpj9x zLBl1l+a8NW!d|!g2k%%cnVbc`FzAk#L$gdY6pw@eh(z3TCR*Xct+ZSPk@IqFUe796 zb00)u5N41WHv8uZ96?AABI}3MYDCa6oYQHX>C?cL9)(i-IHAS#I0G`B5HMS;lgi6ew_7jL}9;r?uKy+BITX#6`DNWc5{sGJpK#a(^GpY<=x~^SUYba+!Wh zKIrb|lsrJcUn=Fxg|%G1IXG?2SMuA1`K!;ry!9!MyHjAagce;^5vYTR#<7v<>3Hgo z!*5ej@F&OPKHtgXpA+fCzpolcM~!EItIS$`zR)a{in;B=Zth0zmvhfLold>imuqWx zDH?gF1Q-L?_2O-(-OpsM%e`{pcwgba0tB&iFn>3$^Gv>3sO0v+uMbZf=LImXe*Nlj z;0+e%u_8@B$G%%vm2?9xD z62tLkLhFoJj2bTv4TU2jrqgF7nvOh&;Bgu^aU=pEqDF)8D9K>3lYs?hc$g%m5o-XJ z{9uXO0)Bc#t($zn8dVyE44WV%F#DRMGz+goTAy+#Rbo1wh|fkt>6sHaHgmF?NbbE& zgM#dfrC;s6;1R%^Cdkl!7l9E*8d2T_2nEAqSz5`BS-CN69JPx<(|u?uc8|M1ci(R_ z@(9g97=xo`GsU@_u)&Oly~;N!l(37e$?~x3R%tPe z(GA;>=NidFE|NIp@&{d*-saV5$xvd>8sq)0L@X9#4cXNQKeJ@F2A!d|e|ew*D^6tu z4i08j6c22M#ZI9nWRA7yBuOV}M=8|Jt2sU8Km?uwu3Z!(A|bgbhr!FKKhD0fy!fr= zUzf#;jrK$?-&H2IwW;J-GMQHX%jY8{*_Y1)_1G!Ncd3?gQLf~BvXW|P{%`etG~xP= z2s-^?!fr&~$w7<9gCJ6-`BbzC_x%>I)^8Mt!G8;B$Jo)BSXp9FR+yoN_Y9 zllI^eXjkFxZd2JbRsgBU#XH7!3%8xY0N{8523BiSfLvB`KnH8}T_p{ZY3*N5w4da* zGKH<{lH6*QfHCgM?c2lid=6Z1_ZzkC)_f+@%e6ZIcz|``rq#TZd%XhC&hCMHd%3dm zb;9fvJWhtUQ^P8lRx|4H5s}4BZUar=<6|6+s|5zM=n^5oCdw8b#xNajgjfdwLA=>) z7e!!riJ*j{tXqXG!iY<4vmwwjj}WBb4ZCo&R!>VGA3qFBj1x%Qo2i+kFPccrhNeR4 z#1bC@>v(Bz&z(-dG&(broEjG#ZeSz@L39XCR_oO>94M0dIrDUhTT~9v# zmTGBUmRh|on7+!^fBzGj9j-cUB!v+4B4u>|y?Yc3CE~vKzNn9m#!nu_Q_npB#wD{a zHutN>>CRDOs#QfR053c7BXAUE(h)X%KUXXxAv(4ioTN6 z%Cru;pX!@MKz}9Eya4e3bl91gnCJ{H33Af!59=S|9)m;UiI`k3EmWAY3=gvoi`&Cf zxJ6@fcu*uL!jOql-l*fHJXY~}#3?DKFl!-8fYbwLx=xcM<&m5b2%;HQEjSGju*eS4 z7SO8DdiwMoE;_75 zuwVcHAOJ~3K~w^624*Xf`k!2y^tWPmdano!i5! z^M32<^UC0~wgr3vaI>wVEZ583`Fw6ZQ`(W`ZNSI%&9~>3if0%5gTY3*58QLHw7qkd zsedTkeA%C9uMApwAe~#?TA9SmMnS8d*L9fb!MG!csUKSgI3lg66H@tJ{P7#!qd1{k#? zINA~Ckb%lqiXvSXC7?+OM$E}-jvvv}+O8Eh?q&~GFR)oy0wJk6f{0B{^kOyk2!VuX znpN81CZ^FeaW9&jo^x@M=G>g5S9`lJ7c=wTP3Fz>JpcbM@4U~8H0upo)P_nG6a}em z@_S6Hd0YVn9#RsSd?E=+N&O2JU%xZhLo+a@Ytg7Qog_hYbdVB&$kIL@fC)+fdqlJY zWfL({zRS{BN0{<)?kqF8JLPu!-1d35PjK3uF{iU7E_l6OcPuWr{D;zhyWQz;mXkV` zXiwfrc0m|q3=9$)m~AyeT5^IX$-nZHk?xYJln_M#Nz?b(-Pa5))?!jX<2`rr=}x0@ zz}I&kBYJ4L(K62O+c~f2N1x{d_skRPr&vb9?T*WoGKe+cy=t3^X=c%87MKLFni*u@ zi1i{~DM4V2gb18YnhcXJ9iJ623bsq0$2+h-i>VkTFw z2FH%7g;%fMzME_O+O$?GhSTMSAlIu)#Y!ktDFflFr=#VuNUfZ|1i{k)1mK`*%dh_S zPn(jKLmCV>Ozyfk|KivEzFomNuip?H zKndw+ehCCj5ioZ?R3Ewsf^jH3H<~!Eu8h@#%cr?S16UR=fVI16@a|ZtTG>i`{OQ%> zn|gJp7%6O25}CwYBpn?)2IE2^d=jl*Y=lCk>e}qPm#4XC@Cta@@Lb|7F?Ru8nJ-)o zB`#m?oi?KH=hHu^l`>uqV=&;~<`xLSc!bbdlo+qFh$)(3VA-2HitY)qfmXo~Yw2jm zFcSnd8QL|V_Nkg$;G}9$B4U^p^hE$8444*GKm;;KK@{>rFPDj7h-8Otog%S|1A6P= z8joF{E9-0=b>xi2<9;u&e&EUqPXC8w_mt1;3b10jY1jzgp%D~CNt{N3$!sE_i3#!b zG-~4!?euz5OE9d?CGI{1)9X5K5_h#Q$X%OEs$or8!RJ$fyH;$}4;;$kPC?+NIOk%v zWzpSF>KuRE_VgO?M~5bwmzqfwd^;^>Aw@5M)!yC~Elwky(-@+`dQH^C$TU0P-o~7< zM~D3aCpguIu|>{hSI+~=xOQ^{p=>CGw=HJ)sn=;+q9SP))~ z;K^~EMDc^BbNI`b|NiSrJ-`LvfUhEj* z2Dn9T%IXO0dj+rO+PFXOvbSLE?EL4izWL#PBLs7gH}aRY)k?kg{X;&Yo3r92)>Oa88ZV7Qy3+|)iMQ&H%{>tS>3|Emveiv^PK~eR#z-O z;BollzA4~XfJe4E&$F(03{g%B*AR?gS{(%|mA1P;a(kwk9)g5g3=pqsa%5=}BqOwf z7luU!H5VTlaT|5JUa1BVH&d2AlLVQdR6=&-PEtJYKF~bdj!B+79WKF@_4DV>$*B$~ zaNP_Xoe6*7h%?$&0@2V$vz*Wm5~xJZlM?1RW0njWAc8} zN=3q%t+8X28iDirgD;OOnj$9MmGdJg{ur#w!N6=a(=7MuUm z;-u99B*r?z#bW#4F8WakZWw(1ukZi<)ep1FAOxT6-6YP^M^_3#C- ze$~-RIT6gwt)>7eEUcAt;qXkRIyO`)U7o&u|I_JK>T2~ipDAsm zGfO+0sq|<*v=Ukvn%m0E%tUHqW2MXGcOT#1=~4YPIbIDdky6sg&U&+<@WYK80M% zsw86Ch_iZ87b(HfdwqQ>^+VvWdj@eJ2PDPzwn-UCPK)KOFC>EW8&#pjE+RKx9zTHL%+c zvADTa*k?@|>Eyta$g|zgPR$EM5|fTwy5HDT?1;mOJlg*txCI^OT7-D3RdDSe`m@ir zIainI`kEYw&%>=EYYdj?#BJ+R97l;j1M0Dd0aU3_pc*r6Vu!`;FBlS4ZpZACt(ZIJ zddPV=_u+vzYlVND^#7lva|=yl+r#)cI&m}_@6lY$#U|F6VRG@dw~1O(lVIZ^gKZ55 z45^h!W4eb#$UY}Wldwqwk)Q}W;AN6-*cdi7NUA86`f#ExW`jsVAm_ouZVN4x^HS)` zc|Oa1=5d(+upWMV|LLd zZP$PsH1Tt@ULQZzYm_>R)witCE4I|=)brt&o5O!1xDs#%uGgyBaxUsGkfk*$R1DhJ z*S(RXrx7J7YNL3zlU&a_34+Y$qDd;`&j;$I<`7<%vQ*8nUWk-PccfC=c~}g&J(ovW zd(E-uca*ESoiIs6s68_Bkjw%Q60UInHH7s~Zci?xOj3o(Vja`r zW*6`#Ac|;AdaKO>fV{zt&8r}7uJdthMsS=)?{P#A zTNPUxs~mwD+vhH`{t8!cZ2B4GPTRm;#w3S1*k;B1wvqVkfe^FpnrE?DBR)IFP|h~j zpW{%VgGQNFVm6CfF{`_YZ?V`y6zynb!ZHLzY=jBKUf$Zx=FN1WEq`m@`pJr) ze)sLuXLpj?h}_+d)qillybSVX@@^gfloc&jfc}kA`xx?hWDbm$mQoxEN$ve8+>a1xA|E* zjhi(F0|MC$H>Pu!;l^OYW;hJq?@ODT!^4}Kzy7-PbR`f7T)#*pLd6heFZ#(7XQ<-M zCy7R4kIXkG=nBbbBMV@vodIQjxBBRhmAc1Uv3uMf-(-`Hlkgq^H185<-bpl^&)dsX z#_M(1DY8U*oKf$Yz2^70F9X>^F;@$E>PMb>gOMw} zDmH`2y6(|Usb%XG!s5tg+S(ASYG_GQF2$(dH3ZY>GGyP&z0MWSgzGIhl zd(t*9Gh1}x$w{#b$4}YuIBdm_JNsb4JR*hoaIaK(d@Sz6QofiKs2{utnmhts8I4NQ zg~4Y!=Nu?Cu^*IX(@h5l<}kpIRop?=_QC=UMTG)b!BsOxy9L_}UN`Wc&rWY*i(QWm zyDp1PiJLT6Rz0q?V!L`lO7GL9*gaz)e{?(;>$vj-l87WQEKx8Yu+S}8%Y)akRP6K{ zps!r5UR<$%kLdP5DAAnK^B9zd&FL%{`1@G`k&jE zYl$~&U+eX3xRMK&n>z=Z6S!WYS_p@VWzR__p9S@~4f}d6x#IpXKPb}vWgJ!W`Q7)e zhO4XI&bSUwN$*_gVoEWOg{FT8@NG6VaCmcR>FM`tPUq?`fqKJR%h+p#$Fo|GQiTfW z$s|dI0ak#WNIn>$0*yzH>h+{O<39sK@;X;P{=C*$Kbx*q_7cv}t8lR9_Y+j!K_y7? zGQ3l~q;|;g9u zK61P$5#d(GeWjI$DP70U20D9Hsy6xS4z_D{QJ|Yl=>X3fgN23f0%v6Q;U=5ZWwXUD zZhYq0cL%1}GF<^N-?)dxLB6r%QCN#Fj~gpeKgef!U+|GLZJ;ivAf zHyX)iDp`*+Svw1Y?im5mw?H)4W`kZL@h()!=l2}7oxC$iMTk&72y*V5wNmwZ<@%K*R!FgAiI130TZ#heRY8t0!)8L$jw?xuDHL zjD!=7_yL-1bQ5c+LgcJzvq?pxo17S%CgL9p{>?tBb$P9R$+M03v-eaQDi6}JhcY$m z^Ll~+Ncbmd0!o132$*GV56P z(9rD;v1zzRb32Av_`KU9xJ&7WU&xV3XiTje?r1Z@m;h=sEB6?lWrL&xFLNGGj3x6< zpgCtQcoZYaoHLmB#9WMzBq7X~RF=sKL73#WZok4j3HhxGp&6Q3`d~&U^EnSo4Zq06 zCLN4YF4%C0X{X&nRA@%8M!2(K#2x$?>nbzP*b2!V8cYg=Zr?@>$lOc0z$ada+$(#{ zjKk!gQ6kEIwbs7m*C+<`b^}37sx5>T*T1m0j|uzL8XS`^HJ#t!#*B3ucht2>6U#@WLriY;_crG4;q-^A{aaveCU%kF6ZjUxnhuK85 zUZ1aCW-kjX^^r87ky1LFy#$&bT?~a6>Y4dX;D_mv!_%u@{`q;9-`kH%M0-39Pb2JG zUcP085Sbs9pd#yAAi)1AkPC)?K6p9@oOo_7^XM`%9cnB_YFqCzp+Ye`T{=67rlQA> z2hZQkH%Dvrlf!g)B~iF8#^+n3hmA&U?f87>-KWz=I-JU;E{`)&Flw=Mmd(@}+woGV znQd0j>V?MEyC27Q#s~lLuiaOF|D)GS%ydxHo&?902C}k|6T`q&`a9jhFWp}9H`ER7 z5SoD!g)enCIc-tBd&&)f(|Ex%rf4ae4qju8G2t5q(DF<14l916?@Q@PbMi$GBDBE>nC_{ zzZ_SHI)oSm^QAncZ2)hV$a{Ghgy;xFkYr-u5^e`;cQO>80w_&V1mBlz5AIn}xuR1k z0YnDtJ8)Qp$h-HF<=>ybo?ki1Zf8b*2v-w{`P1ubdZL~P)tX?~Wun&Fs>eg&=E}#OJ9_0xNxS6cyQkkA zd~@&xME)BE*T>h_GMj71nTy0?iIdn>Gr_IMOrJ(yKic{DrqEn$r4~lc!fVI1YISi0 z*ng(jxXf_t!iCj$<7`WtMdYXXzZ4ob}~dA6K~S<^zt(-`j9H$|}BIqp`>M zB5UjhwrEXKSfaqBT}TIb-D5BgD<3YI)e^r5R|@Z9kf5{Mk0WwF0znFie%LH9SyWwZ z3Y)dFlMhQ|PxLWr-{^Hnmx8p1JD|rw`B<0J9q_R}%E!35K9HV3yVH9VoSi@|bZ}B{ z!|g^$Ytjn%7}P~TV}`r7wuys#p-71;db_Rn@7r{` z_p@((gfmDkFS+Snr<-!Pb2Le@-Cnng^m*yM{n=-XOQ$zN{I&-Vm%uF$$inXwXf#Fw zxUmq&5gkvh67f}1_(8zsqVr})fOS!HasyzJi^MRBRNXj}Lfb>WQ7T8!}NGyaNuU5m=Y%`RK#Lq7-xMK#g*-)(*KbtP4x8k+xNru})yAaw+B&t{O zYzTzG=cj9{7rR#lFzun~`p4bf%vLqj%r0`fD_g}xyc#;;>P*7v$U5ioon^IHAhHeN5CTFY zUnvt~9WZXv5rkNFySq;=?GfGq8Ze^76MH{8CNX~y3@Kq)U}+-|fWAp39aKY2L%8{p}tVJ0e&Y z*H(=5?GJ$KFg-eqN8C4w!2b!;>fl>AhT`4bs6}RcA(lvB1hI%Mu^2F2hr$sEuwFOI zI2|m25jVAA<%4g`ZPL?7^gSv8vHy8|HTrLwt}do+^$god>^T2PO(1^`A*2qZCLk&dXQ)1$0EDr-q^N*d8g zQ&rT9U33?_-1RPZxAzO1bK@`mzR!~V_<7zh@8dVMVo~^?jpbnj;E@%?Vp%wqAAbE% z+7JpTjhcOUc2>)x6z^hjcOGS6kwr-WTs7wF&C0uMc{wi#B6O_Dw@TI0>qV6B%GO?- zJzNqOvxP#fxSVUil&#b-s*O>Db7fD&A7uXAoH9|b{OeHDOPbA$gP{qZe-I~0LZ|in zzrVA6_wM%gHqc;eHFCZtx%AzgpLQPu3+~>keB}9Jp;oU}ntNL(;wz!Z*YYSaeZq^Y zTVo>Z%Xw7(0NEzSc%hJA&b=$u-!+ONUl8P6c^MtMCko|4vw9uSH+1t)Q;(*mrnm!1 zqVeFU&x}bd8&gSAY$x?ToXBueTuP-R7AT1grc#MS$Q9$(8F%pWigeHs-3&jQqv&?y z^BC9BYbWf4j_CFnJl)!`N2S&Ja6=d;JFzRIPNz`#{9WczT(@b~Vrr9Bt-_SEfC`^k zrv$h%Tr?Pf3=xt_;D(o5z2LfuZ z#>9;F+k9OfOx@?ljkIZWI`Y&;*n7NoYS=Yvv0(~}l~5B}h0%!3DoCP!4=pD=q7WUgn zVv}J^BW(`!?`|28@3a(+Mo^i#V6>Y9048@RBb!J&x=Ba(?KS4_6K8uU$Dif-tg!K6 zp@9q{*&;8?t%5A#QsY*=UM~tQC(G(SVne=$()Y_hh^uhJinVg3+N>`CovosLY!3Pf zTT9|^zE-N0jn*7Ie1WJSAGlVyNe)r=Ny482wu9gjhJu(VQ}|mrF^qmT|gCy0AZ-UOg>-R z{b8((tT19J;kLI3GQ=-V_htR$9H~b z7`c3q;2aufSV4QQIsN8-XIH?ap=mdx@IN3G-fpYe?rtaaZZE7NyI>)SfofXSIMJiS z^ajetxV!16U$}!1x|I=BC??LOA}j1cJQ_tsQzGlI;UlO#bVtVO#jb4z0>D1KYC?xO zuzm&E+hgv*OdT3euR%Y3mu=i)VN|xOw;96ZQ?zMSI`l5C!hRsJ z3XH}nDIM@6`tbD*D#5WTN|FHO@uW09?3#;?dnTQxfKIpR8uq%s(e%>B0Onwn3XMV4 zM%igB?6a;JoG%J-diuwSY=$-F;0SRGwdB1pyY$jQtJ$YX|{aC(U8G=Z%fQ(Lnm4%_dtX*(> zCjA$z?Qg~@+F-cg-~994?Yk2Qfj^yZEd;`6yY<7&(Bl_?!N=8d%bv9)F3ndT%Qb=L zg|}rnmz{@GBil?ZKM%*U^K!nB%LBi^LJqI9X0vp3R9+JKlkC?L65i_*Lzj-H&f)iH zN=k%6k;ux%igbU<|hr zGvDq+HvN;X!FFs=g&X>v!(LKJkW3rq_Tm_(H4#d?OZ$%=o7>AIW15Sx5PoKGTh!Q-9NhE;T)K9nFFfdK za~lb!9ar15%vH>7)G+RWfh$;GmQqn|0fQ2|Y%-__B?O)}s!ii{+tf1@j!_1kT5B30 z=7N-sOsA8{@wK?r!`h7Xe6BordCq;puH;@#a(TT)--FeT*O8ODYZ&R1)Tm# z&jYj0f|GC7uHGgB6hY38_`L1xfv+ z>}5GCqK0^~EazW>(DK3}glr=6;N^vd>!oUWkw=Y}x!e)|s!=%F-}qW;*3YsHG|A%Y z-TC=EOmYt*v0eEjyMZRThsJHa5>K|~^LzQ+QSntnfJr`;UOdt+^r-*qpjN6i>2%lFF*+JR(!p?EX${jF@EuF`Q_2O zkMikacI@XDXQk%R#-|T0^a03^k3oEa0FRIV^XL&=b~faQvVE2vSPgQqIW~5{W)kT> zi9I+-#Z0NgXDKe|uIX>Ft^E`Alj|@ji3-G#H8mgE}r2 zJ4j^Mxo9ZEBCp!YN;C!1%Y|Z@sKTnlX|m604qVh3Y)*sj8v?i4RC-0f4x`jl#)mEC$@7CJZ*3R(dEa*-6iF0srJkB9Tnp@A zh&``xkyI?2NUnUg_|+VzAZe@BVAXro9fZ1{*3e|HEf6-SVeO9(w9})3uK&_>wJ~X= zd3+cd8ITtd!BI;=sw_~0FC)x$DzNFH9EL=KN^@O}RZgZVO$qfhJBG2pdfc zjM${nyQr}R!tBy|A1XDl2{ARjZ%x{}6P}AxGn9xCcckw_{#f|uW#S}*Sj;etAJjh&YM-r$pYi|xEO{ls^R0YP%y|Y z*BAC>e94p_1Psr~>nDLsqMC{y)XUinT|0ffcy^YodYNFw9W7BgU!veEMg3*Bi^);j z`K;RyY*w&XUIoalWsdlb;z2)lIS}5{?dHHfQaKm7i~`tCkKIJA#yr|jS(8F9c*uOCMyd-bJNH^ zkVpct;Sz~f8(WqmB(78nbQ7xXVNMr3f*}wr>rktqnL%hkC>TV+c(uqb*}jA!)nrpw zZ_mSC`2gEUrQ<=U3{!T_JZ!ShKDV+{f9#uE`&ug?Lbm&!B(2(*k;E^NR$#R(>lbx> z0j{Oy8cO(Vn`$B^W`F}LkJCuxxM4iC7E6Ui(v^5QE4oHg_7VA0?6wo8mGk5`*3XTqhcrBSWwD$H6e}_mVfBp9@cfHY7zyy2? ziC~ItF{lH-KGK+%*y*b6EC`}H1O_MPEN8#5PgB1 zux2+~9U5Tl0@G0k`*7DF_gj@~naUn>@{AkISKGyjTe^N2lQ|T`rE53duNAJKA{i z1aRM#y}f_@fj*$Vzu$SaFaFawVeUunq?hehxe=to5yGOiV(GUQAitJnr!#GhSxoDM zbKhuRU$^6LomMqaXq$v|pazH5`FNDHg8@T0ts|UX17D%%X@+zV@Ojwaj8rL>Vr_k` zDsKDGvWbIoN3Mwk9QH+Bq^lD}U>*YLP?X0XC9QKLzHGB?ZCREl34F^G(}EN{x8)>A zU_upof&Tud2DG)WO@y>`D}I8y6zV=6{9uBwficBHL%STpID8%tRehsUXw(l|RB9D; zT_zjvzCPL72{(&{Lb+UlUQiB51u_mFK~P9G0u4P7nhC4pm1%ZP>rAJCyA`BylbW2f z0n}?vW4yMW>CYvh1dl{%yT=87InDZ7k*#m=R zW+DGRUrJOOMI>=}SY*OSm#@5AUC14N04^=WRH?us`!Fvu6)Mu1K+Q}0Jswv*=l$h> zpZ7^Vg+=n_rDu=M0SF-2u!1ZM_Zo)q?&b5z!Fl!}-TdlGI1^sk2-i*nrTALebsWeA zJoRXn3ivWK#kl2xCH1aMstyUaAFQ!ef4=XLT7g6|*W_Xk>aJb8-%YvOX7 z5kw~ALmirKl|rU+%o)u@$MY?R!(x9vYjT*)vlhDv?O1>OxzS0aVQGtGysvk>yN%n< zQBDjguR)0TYNuwP|9UT?Zl6&pA=!h8iJ^&~`lZUAnQ?4X_JssCh?S$?X*7zP%A2Zo zLpM(;hNOc6ZXecnh^Oa35{%cbLPWhNS2}LsC}ctuz1gK9c2P(!80c^7x}@U$`IkU`^<5zZ zr1hZU32z@&k~HH9Mv^p@t1zXio5}(!R*Kf$xl)4iESzjs>Ognhg@xBIpT6G6xIlT} zuWX(rD^wxwt{jwTss#3|6_`*Z=M5z5l@J)?@@d}7?zvW(Dy-gm-#E*ZzwA28A5C95 z&BW^!7fsg=U5Q#PLC4EUI!Tp5K?UfN=a_bT;=%Hi@7MqQ_u`ueFwEipya#|c{l|9i ze0%h$5l0${gf)bB_bxxZyUMcQ=Gn<>oq`(TP<{JC?t2neiRiRA{C}pdE~Jfg4Nt~o@;7nJ|3r;Hshz4jjHzRiHJhK}CJ}4E z5H+%(tf`o@RW`>2JcqN|ghMPCNW5aI(7^sQ-u+@|eD zgVk&{noK%yUkCfyLz?}1<@AgU*GMG7*;$=jjUq^ostx5MT3jaL^I=sNA3+tG+bWI* zhP!#)^Z#s`ni}oxZK5!O; zPtr+GhPg=Pqky3T{>7zt)#^&(^7RUvRkI0T*nGiU9wg&1lTB~VF@;bu;0;$Q$xOO_ z2Egd`R0_%98n{O}<4jfu-z`?xz-8`jRjWrUXBD4ju?r(T{p&RgqfmiZ>`H@Q=^60 z9~d>;xTCjqDzy@6lJ*EX)w3K-#0OC86;JZk+hJHK*FU=Rcp>r%*9%aX19!{zzU}Gj zRoE8b?i)&++bsHdouV9+-M(Nn8I7h9!e%9mc9UrYM@HyI%roz|oZ1Xs4!Wn%yvco3OD3dD7y-K-TVtBN(n68*ORP zj|xOhYN3lOhjb6gNmr*{*rQXSy;4lu4)hn`QN!in{80hk4u2@8H!d^9Aj5b(m2fb) z7FuSqIS_GKA!IuhS)aG+Pbbf!2Y@(^&(H5yOPfr^6MF9iPSBr81)0-S-d#w<^I0D_ zDKN>zX))w30%QhL)j2?d&T(Ka=h8kuQwV#auKyxojyXZyIOy={m$vmV<;$g!roZ8vJ$-#KD2de|^xG{#1ZG;Nx(St$U@b>sR2 zo`cTP$-qOIsp$3?vRHAbA z4c??h*uxh!K#CtAjfkfm>Of?ZH@O%o6!2kzqCw5RDh3`W%4DJ(W?RHc58Eg^TlO5L z9GIm28;~+0{R(wAKG53LOTL_Z`3T|h5jg~r4?AECmg6w5n0Z55N@RjX zH;AgqY`XN@>&w+*;2@A%Uh}W`fL41$;bmate4*31RGcXU&fLr~J8~6IM1Ixjn?=YX8E2Rz#g;QSvc+hY* zQ!0J@X#M-2`1^c(sl;1X4U%gmzV46!2u^ISq!%w2?*}XHs5cKFT}~gruXx?g)#by@ zrTWeei@u5HTdaA!ZZJQ6`i$-Ku?+aHlRsVovcgqw?N-`hj?CNb#5`el7!5u45i4cc zHJU-#09MFM+Uc1Ww1eHp-WD?&%r6|Z5!yOqG7Em5Ce%i%QO(7n9u#eFwyER@j=>1T z=cA1}xIZ#9zx`;^zA!y)cr4uOC#>^7xYRgzq(=W`l(5HkIglLb`L%7IC*oSRZ&-Hs z4TKDYa@ye_BAtYx7PF4&B@)d8$koAV)HP~IQqw1I)1qWw_su2@IKnQNBfBlbX1d=yuwH-R0wq1X#71m0cxcq6h#%UrJ zVkVY@VH5rJjF|%ehhG>+Fr`Y!!Gs!2kLjmyG0fo%4XHJ#5^Cp*8(d>!_nw8% z&zH9D0|70bIsE`oL&IM zj-N)^9`S1K@Obh5&bxX!>nv~lc2qBhF6QF7T(;m#9IUcKHNIeJWzL%qEqkM@6;I}J zF_$YuJH7Z)q3 zT-3Q1KhCZO^1jRZlb!3-`$aMFiapu7_E%R0=#x*f-YMO~F6&4wMiIk+gLc2O#;iuu zIz3OtXlrcx1?4cU8-@)vwi#gqd6Z_=*9?wfYs^RyR+CLR4_rH`ZbSrvh@inBXM6at zRMXas%7tP%Mv6_+I1nL&T8VHI0B3rGX*w#Xp-@2LyU#+u-$Y04vPxm2`q#@ zVi6iaP#{sjEI;<&pTiv_Z4Bvs2#WXuyap&EKZepi{p2i0U<}3%Bee`CZV5s-D2!)> zsd!k50kIE{i#CjlXZ0veVp>$A?*k>4#T;6V#bk0gD3jNw3p^e)ZKAxv%sPQa5B2a5 z149~i7-c3+B=-1m!0oY}yx(tpt0wkZ^7dZg-DxggRnmK{VsU#{DLze{owOHzX_nI` zYnPWY-26SwrPDA+01R)vTxl#nTL%|3xt^F&(#iExWo_>-d3{ZhQ;9_WbS+W;>*95~ z_)fmge_LLtT&2q&<;%-d>f-aKtA#JuALaGE%T%#mJw099D}PL#)$8eWVI~35OuQ~u zH}ahnK{W?Y^f*hx1oheHN}~x0T3RIV`S`h z+~u@-JT_nm-l)}P{sGU-nnD4_h;`8j^KgfGJlU)B7(yn4qqld~YB8G!SiY|dNE`BC zs2@Z0z}*N)VE1*eM>r)ntKLn0onfw$9uY=j_itL~wZH>wa7<5L0k#fI4zsL?^F z5tBzV=M8v=bQ%qABwu)JJ_iB_th8kyQmJjw{ax+Xi#L&!MD?WEZdTw~LWRBU^NrnW zcydf#o+(#5M-C}UvVPU5te)kQ&r|uNl53<}H)Av8e6_uyB;W{^z_Y0o9_!LIhm{~8}*~pciV||xJ}$rlr*GReww_H6(z5v6Xo^P^Sx@W zm`{EiZ8n#$zf>S~3!U5l$sjDl@ZQ-Vd3mdYK+;|=Y#bf!pL}Z<<-%pFz0iaym(hiP z-GVpYslPAp-KD(X(;FB3?_<|1JI+#+mbyO~=ry9Cl6k`6s1IW)S}T0tWWPoLfQ(;= zPjP|-x-*9;3LJ+WOh+=D5C#--rGq6Q>~we6rra)eJPs~5V(Y;iE)R+mIEvP$`V0qx zT_d`j(p&S_aD0j}W#ZYf=|kbIfwTvw8FM&>^obG4hhnsbwV1m7dS*qE4t^c!XL$q4 zkXi(z3D+>j8xb=Wu=;lbp&o;Z40Vr~%ovW)daJ!RglK&}3Nw%h;nRAJM&qFFiMtE4 zVG|aHaJwBCWyMJq);+@XOd@vj)dZ%abt(kWY9rz4urywa$HK9U1dl8U$HH)5IvnZeu^L3Yl=LiF)yZLhv4q2ASxlRXD1mt!9FyF#?{o zLmvOlak9VPT)x~@;2|4DxvHe#RE@@HyKz#!kmclh3XWiDpS1RhGSI-(OgX3I>PZ+S zX_XsSjW5?pICKSot5nZmj7Cvl$O@*cJ+G`9o(Ei$ z0U8+JE?u`?t%hSCbhyLpa_@LtD8}^Y9X3A1s`NlB)m>)u$mTKraX=Krt1}rro*@lT%E!8| z;Q_ZOIA>#Uc1kT82Tf!oXbZ=+e@t{P3^0HrFyaW50E$2kEwt$Y4QisnO0x;3BC*k$HHCzeY(>e2 zp2P`(c+%!nRP2p=ae87ZL^oZ{CRH1~Xqq;?Y;t=H`>;o?A^SX8JJ0)Jn!?o z^M3DVQ7Z{Zp-`(Km$dUd(?M9O{vJxMlOqrgJPxYI0N-?(&1Mp^SX5d!WbUKY!z;Zo zQtj37Hdy1ygiGeK4q9|Q;I5<@(ZUBxx1{{~ff61_OCls!D zhrr7M#t(5A!OAHX#Yh5DJ9N_!g=*wlyMuNiDpv1yz$~m#Q7Q*9tKnrvJw=)O09T^@ zTA8x5)7Uqyt?n&7-CkHLBo5Bjo^Q`Q|1h3UNOO1+7gH{z87~(TQ#KmSY;HqpUji&A zj!MwXW^3n%&rgp|MlXTd0(g;NTyBcz5@wc89!p(ar9@V`w>}P{b~<~o3t(K&kCz&! z+uLGFY84Q33wup)R_a!1?k>EkOEWfrA(<$hOFe}%Z|dMLCUP4IAXOK$yT#NzAhG%R z3lg09P6}T6;mhjuZ`Z!7%m9vC01yP%KDttR7i{;9EWdLiUl>q#Yo(KsQ?ybE^bBeO z$%e5`(=OC9sO|UjnP7Z1T(w7H5s)BkN|S=R!j(b z<*ZkDITU~WcfmV$x3hBq-J;~Z5H}=4ViB_^_C6X3W-_yaAZ;9XJ80dC1p~>TVALnW zT2=VLlo7lAvlB(HSBF`|%xhT;BlK3zO3>uUbp;{AD4MkU0D(Y$zreF%E&^d78OQq+ zFvp`Bzh5&qXaddyrt}8GFr`ItV~5j5TO9tXf<{mTSl2!Tcj0um2j<2muk#%|qh=sh z<8VWa-NHj`uf`O-8Hxd06^cFxJ^0HGAi>#}!C)v5@KQ3a8`WrSR)Z6@b~`cfBrAa4 zrn`N5n$Y8j%}G1eC`~~-ifK~Tg;{1#Gh1u# zHujHGsnUUXe)MGKhsK#is>ShANnBcLY_tK63+`TwHKufN{;>PW5-c#(@2 z7Vg};_J!)c;_mA7MR@NU058gbbQj$tb5aP*QkuIgX+Uld!zzUyRgcZBS1KRl-iYwA zl6+?S7@t~wu^tFSSG{;-OSrj(M1pz(GD}OFg^e>v!lIjV2=0lC#6IpT`QN* zE^s{ld9+nOD<>|Z`{|8+@g!daw3(luKiw90KTniX_e+UfqXE!Y06L(3mfo+QKRKQG z;py8{dox!TOXa$_mfbAmYURi6@zHX9cWqu;dh$I4?_5=ki!0g-N zrfYraU3xyt5x>b0b8Xc9k z(mE@bYisA}&BCYo)5G)n=kf-?W^HqE|6n4O|9k*g^pC?gOK;mCC+APz*0S%OZfq6` zz$KlfkN4{$xVG^2@yw@(hw~3FAvp6V2!64|j~@N@=Wle^u8!_~JGl3q8~I9!f4i*0 z{P#7tGPc6=X41-yxD_bl>tl3sih!wp80i<1roRd|E3t_5VZM@-HuFw?Od8%l`$xqa zoBHQ!IA-Ht2*GGzXej*J4p11{B5uW^>+-qTxJMThYxK}+ag`Ec)J9MLpaxNE91O%L4IJWD0&8BKb9;dMbg)X= zave251V))O^fc zxEo;+T!t8|R^oqLo$pT?c^=1Sh8gCE1Bf%gphaY~2onOd3ak{N+oc#Pi9}b-<}|m~ zNGxWFaA~u9a+pS%&@>P(HY-YhJb_EJF)G1}x1`A_jXWTv#)odY>4STGf5UyT*4yqg zCd0#5-tW)*^Zk53V-R)7MYK$(o1}OJr?q>`j@9+sEPK6g(1i6_WfXe7Ll_)n7pR`z z8;t4BXp&SXsdmyeHi!y8AO^&hL}`$?Z>Tx$mPIP=bgI0g3y@oMy?@Z>`!}Ms;2hqg zmFw71#fy; z4rZ(M*-9)In^-AVo9|xLn`;l2o@WljC;Qo_4Zvn@IaAp@sk9cftWCPuMkKa6En;-Byr%Mj62bi_q zL+jlmc6;ma>&!EvcaAOC%o5ZQX@iU+EvD|)^|zA-$jU*K0mk`zMj2rwar}mC(kfVS z3j#s+q#}$%Nkk$Vd}dW*#ch@oG{4&PkRTIWHWf#LjKF9V2(Kjxh(v_Jsi{7nk5L#I zwhQfWiOJ5^DGdgRMJP!qwreDbH?CZg-WZXKKzE??|CtN2E5tqw>#{^1H*dz#b>F(Z?jo% z-!8h<3wf_b=^Sx?-;E(U&Ln%*CFU^!ZR=x1?Gi?b8C2Xgnv}6J1V(sRW02z*j*)7u z$$%laeB19HHFc=W-gyWGw(543wkI(JK{Q;OScxMF#y~?5%;8Xfzf~fEjfkwR%L)sy z212bIWo?&mG^u7~hTgRKF)N@jA?DHE-focuw<;L162YWO1H$87w1%d-`X@)FMuP7q zOOACBE+YirdjI1ps;cN>cdiV ze}AraI+rPrhbwcrr`g$!Y$E_dZ2*|*(8gQ~wdVQeK@|9FDi{xJE>|~NgE9clRHHHb{NwV;K_CEL1q+pIB^9ba z4aI+}Hvjr+Y3crh%g*2hfq&1UZ!jPTj7zNTjD@G^zGr;|jaaR6T~ZC{5KLy2P>2YkK=PI1q9fk5P#DA#Y>yZujmq1{m^p_#)=P z4!s-eDyG-J`~9^l7%etOt!?{S>@ZW%OZ z`6(IKhIM}50rN^;p}<+LhtnuwIBDT2i5BmWp=~A^*NsSd`Vk}dStr2*C++g-BDi^iMA*RGc6Gfrk*o)e@RZ~)f7{f*j}O*Y(3 z$PD54ndjyAe1Ffg;q+U>R>xG4f*=(%zdiLU7{ZR14;6f?2wQy8F%wMj)uGMA*F~Zrq(#Lb)#CLYSe8~bh zkB)QciPL>y6ixPF;i9w+SiCIO7QoFeXY;R*vU6L4a0`Tk^>@G^&TVfUyk8R#oSOPS zCA#Z`8)zVY5OihcHCOwYI{hB?rM`Q4qormeyNZvk0w3_&s{Vy&=61 zi6#|$nZJy?A}&Hut;nePJ_!M$L1VW@?HEEPm(-FG(}2>f?_fH{IeW7mfx5bA9Z59- z#>Nr37QxIUfiX~*Xn=4q;9pT|72T8>m$G8H9G`6Nz+@U}YgCWRkx0_(A8DBmY$75r z%!|b+R;k#$1mp_t{o?FbVEr2vT!v$e7M8OJ2K={vylY5(fA4SW!o29Cg@xt#b~;f! z1+1(-6oSH|!;^AVI9-`remNIAo&ihUI6VcX@+_A~Re@y$aApg&{O6ge`f>a)onO5y z)$$id+12F&@apBYiBhpH*sI~f*?#Hd-9BHX;@f!pIKaC-AQ=w2fGyk@*_{64u8Uw4uteV6tuuBCb2*_l?#UYm z4q3bHvL~cMO6x@rOhbfO?Qp2AVHMnFk?W*l$sI<`-jYe$n8l69&wFhyj`Tr%ar|C}nNIMR?~*H~NNE zIykjasYIhsqL@qsm}-VFX)D?m?K4{-TxISPv2q+iWdzrA}Ri5y*#rvQGS{#t`=*d<7(>Z zLhSe=4TyN1PF%IQI4hk`Oq>8zYF|Kp3zCjl{83}|8qS9=^NqFhL|Ul+4#soU*?fI? zE_;{&_G(*DwuVCScs8AmozA99$GJjiA$xSbbJCb9Ue3J)kk@K!Yab4_W>@PW@aSqf zaVF3gD?S{~Z5?J~@el|+FH*(Jd}<*C>}+B1xRjchsn$ZFTQk;LKune4Tm5shC`5uF&a6Iwvyz7k260-l9hmSbaXT51<9{()1@SAd=iDY zJ7)O`Es?Y^1otY*2i!qNGBXuh*0Bq+iVCG-VE#69gluBpjx3iIj!8 zH&Gd+>ys>XsqBvs)dk0GA7 z$ednrWz^{Kv;&l8X{6J*Vlq*}K#+MvOcEdi2KJ1xuc#n{8j*@Y!Xlk#aG6nu zm}QblD{3G+B}P+sr;5<)tsEy)8^%!`h(Z}mXVw16E z*wXNsVP=>a7-q)d$AAn2BPz@#6j5Q-qBjOGP!kMZCApEbNZPA5X{sBVY;g61n#d(J zZoFG7E%2rNux;4YrlxM2o7}w``(e}6^!xrDoBM6gNPpezeBva)Oft`Tp7%ZHIq$3F zZ8nR?$-oPvQJ4{nio@?ye7H_WilGh~=(@d}h^a{~$%;HjniMP`_+~<(-ek4ctvFSc z>%arK&Kbo-*af3MKvG?T4krkbrbWAsbPfy{U#V7CDgw0b8t+rVQE59$;V6}gllvc@ zgBI(c_``d0HB zXlF7vcXuut&DV`eYyA?AFIVcNVqq$~{Bp0^Y!o3M77Mf4dZlnD3oosRN2`81l&!BM z5}TT5qE*;y)>;}mvs3G}a<&d14T5d)?&96gYclh{%ZNX3(miM&r2AM^;ZI-AwST3> zA9vz@d&*IL<7rgcN{e7-%|6qa)2%r}2+JTNYd0Jw9VPdnZb?S;D26c@P7e$)>9ivf z+0XzOfn-JpqS3L@NG$RY4r61Ut>}{3f&v{O5S%1CBGHYQ237b?Jd=t=dV0p<(a~5c z66;5wLEq)Zrs5zNeFEq0h09l zXr}7v1iG-ttbe$lS=*1#&GpBk5q}`H^evoTzl4W7mj?SEs(rzYCzv&oqAZd_ASj*A zZn7$H3P1T#li_#STHBG5s23hhFITdQjb?K(Tc|y6+okGL#d5QFbXnpBvQ@p@C_*DS=-J_@%N?)_zt%H?$mxxWjH{| z9IjL4R8Z`J5;dHUMK9Z;2YX`q_%IyA2w&=?*PdvQkMl-aKflJUCp^~bQ%2=ilAm1=EPE3z-``6FN(6=1}EtU2+}2EvYvHg zNyx1HRUMk-c(U8cd3wz%$I5b_%u9GL2|Qkp;#PY4C+1>3bCFDEBqj)cYagK|{}>4x zgTb->#|!%#8^8QKmI@7+yJQ8}E!QMH227Il^vCi~GuQBxcrx!4QykDp%rjP4Wl|t*h@G`NSEhQ4i_159p+36dta#5)S|Knd;8yP6+ znkt`{AD!>k3feHS+Bzyenm*rMY`ngN**t{bT?oKW2>eQjzx&ED_;GFU_q!wQfbh$f z$Yl)p{XhRp6F84sP!tCMV4UTZ-!o!XaFkOh8nII_HbWSJ=%)On${~8vz>wp8W;>}; zKVxLh>EsyPAUgT?+wS4K(x;~h$tsEn!Wu9O?X4nPX*sh0!!xMDJ^8Wz?bujgvBxfpFW~IGrlTmF@%LsdEJ9FzKjb-F#ucjp$X3Ce^zfn3 zRf}v5aJ*BL90Wz!EyN8RxYGXchz(#M9(?k{(|(%;O8o>-Nw*@oQ3RM2!S821;iNZd z7AT{lB-xIT;&50Ai)6InK5GXfrDbn#uU&>o386P&q(yKGZmXf{f$^pSVA6wH&;TPM z*0kSi16SOXVzfDv&YXI4bTmFUF)=QQ`uM1&3pK|-WR_AcYRdc;8Afsv0nQ1*7H`Sym#81zkLhx-exJg zS}PpBnJv~f@_sPUh-l^0OQEA`53?Wm%8wU$>Co7s2Q4|kS- zom|%v>cstn3(cfIwD{f7{NnA~cRycWgm`Fv{{M{%ZKuLFpNhO)|H_om{`9wx61;Ch z7#fBs3@>iUPSno(%?1Y512-Y!dcWJI$dbuHDg>#g^pv7ES|ztRr^3 zqJ*Et=LXkUa1G;lmCs@LNQcTGj#pdb4vz}VAzoBWJkJZZnT`~EF+sV{tl3=0w)evw zB94Ph5+e^$A=f5Ms6``t%!}8!5XV3{7uh7O zvZ~!}3OS(&m;)UM4j9HJSy8_Qz+4x&ts(h;WS##{8hIMWX9ngg1H+e@VfZo(A|enJ zuxNK%v<3}%PK`qbdwUVES?-+e=Gc&i?rS`K!0cD6gfL7RH;OZVx4UX;1!ZU7#{ zhA@Q2CX$MYu<_A{BMq$8wzfvzN8=k$7E1BW2vDb5da-o18o!XLx6lJR7Z+9+`y!Jo z#qnfvBeJks%thBy8vxeT)!D6^Pc{?7$y8q?vbMN=VREKcTRQmm`f6zf(3b=PIa$ah zmiAVjlb^g;X-0DXrxu4Sj5?!-qtU zf_NOzrziD@FzvT-Ok0E99wTrg8E`W(+#-@_$dBp0YCHMLm8S%fLogLd38Sa<7>Zw} zoi@FJ09J+b5QxWUBoIPQzL`+eTLW1PM}pTbJ$l?eAlUo@dDnZE)wmgoMHnqJ_}~)T zD2p{~Sbs1NHB*Q@pC{ZLZ<+Sv_*qk)6l4Zi3(IsWOcHH6lJ_*2f+$4GAk^f+C_zWM zI6?tYh-a$%$M&h;WsJa_K7C1|FhnC~Q5BETG{IVc+8#$Dkv9UT|X zU>qir4^Q_#yy)m{U%o%!aCEdgPMzxf?fmGuu5kG5L@;JHncfhbQo%B2QQ~d)pMRLE zjxEhTof|H19QQ}9rE|sV)e;c9%GyzTRIR?XUy;vxgFT6|CqS4aK)%D4E z@%vONk~v(RJ@|DYw-e9yN5*$8D|NL103ZNKL_t&z7x#8^i-mYOmF=&rfp=A_yR%Ez z>rwZIpAK4X-$~CM;a7hE0LT9LF*x#NiS7#okCTG8kD69bS`$tTF}R)`r2$_z{n$v8 z7EuQ`+kF_sF>WKGrObYMkO#)tCYQrH)(j&`8ON&C3J8bYN_$(L_BLoBSgT{@0*pg4 z8RwOqK6gHB6|JJtiOC587W67BZ*-DAJBBC)#vFrbhPOhrS~J>uv2()hu~SVHary1# zW{UL*`XPs7D75TgnkT|xn=P+o=YfC$IzI!Z9wtn(F92W94aC*gVxG>vo*!9YB9}w0CqEf054gJ|28b;)2%N;Pw$PC6S21 zO%dugjlAvt!w>%iBKS0Mn9YulXVzz)e3~7O1H%!?exE#?+1sxrO4;~ECRMCge=C{w zM6tS9iI<-YN0XcJ$@N6Fx?S4a+FGc07-VLu`&(CTzF*DmM6&&<)MjCLueK6h%a-e~ zmiw+QRQqz#nQS}~NmS=nz*A;BQOxZR&mQcRN@YM}A<_3~WH?tJEIl629H#fi>UZ>h zdu8O{^|O!n{?>A@<=K36?pOyuLwNl}2ak%xUu9*E2|TI~zc_KjC;g~LD9#^G=J=2E zu7&1@07_w_An0gRLs6`*0UCe<45=V+l?AK+o4M$6De}IsioYu;-4h{2P;xp*@aeE$Yl@ z!KDv#q+SNQyru^E^S`G-7~b8OEG25SXeqOvE>$AQ&CI)KF1PzWv9c3M6<6xetgp>g z(}hSpo|>GDCli%)?Fh!yPU-6E!NN>+cmH5^f4`8aR7(BvRGqSw+P~%s$(?L}7HqSL z!tPi!RWGU)i;+mFus#Fmi`EB)><(`o?5(GwwL~6Pmvca}zO zj=gC4Ys<$Lu{5?s`%pbKP{Q31uR0Gp0 zn&i&oXJbB83NT6v7UaDm{!*q;AhKYyzEPG6-AY^v&+k9 zoTARw-hBgh1QE|**UPsu?yaqN(B-zfDTCXtP?%t~9I=~C&04ueN%F6zZ(Tw)p@|6% z8vMX0)G`Yo!>FO4pbKb~1CyvE zu&u3ZPmiVbVG8x&m`SopgqP%8M7Tfb=QtS;gMXOnze_xigd8F04PxR5E9Z#e4CM zwQ6-|L%FUz-djwk0eCW_mH6%%AeFh@{ruwM?Cfmyd2&B}7O3>#+U7!J-u;fCKm^wD<<>F%61{0%k>ru>FV<*&13m^Jf6z|MBdt7`}O&SMWw{= zcJtcXG2qtE0R~hc_`@H+{`Z4(M-aSp`1>;7V1dD=6jpo_5Hj1)iYFG^uFe`|ph}pNWwy zgn7Bn0e;TrM?Y1om8Y}i!r94A0Ks&5u#$haSy;~&&&;F&=5}+*%#4zL$*q?MljZdG zLHuQMvb?sS#HY4be_aCbTUvU)e=l1E1ecy3Tv{!cCzUpi-aJ$NXFIkW=X;BNI1Cm9hTstbny3xf z99CKlBd{Py#^7rhxnd*r)|e=qpNOdw0v>7zSX3fVcVLQSgP!e~FcZ!agw_~IDF{&x z?o@jdhhf9+$h;@oelh}F+aBw4lM$bfWFz6OE}fv!xG*S)0pG5siMmwnh>lj_km;L8 zfB&gkd9gUXpIcWFDN}bg2XAa2L}d!a^`XkS^3=1=LVCP&GXD5ZdG^)go$1L!E}M;S z4ld+YFD<>BZ_hE2sZVa&C zSO5B2kzoabpO59o#(w9CKS}X#0)wBr6qIws${D%?{`-@%g;DBxKYy@d7D;=ewQt@R zzS*WnaaqR?yM5+hxP?l2qrPF2;El0-*Ub^kYb`azYSn538Oh?2$y@rbBpAPB=L*+@Z_ zHfIU#?uJO)i60#*Ki7V>@sw}xFI^WU|0%L53SoPvAF&Qqd*j7!g2xe$WCBwtCfDn= zW{Vy}ORdM9KzqKgRz~ly=94>9o1KNT*;|>4(r25SPUfd>Eew|LW#gUkTy|PX7*vwm zyLXg@UpD>XY4eljooa5sGk0%ejt|}cQuz-#K0aRT>|C8)yfC_WU*W#yw*YO7gkfK~|PD8x`PFbB30xEhK6rwo03i1#Xuj64xT{3oeP%gpu zW7OjgqgR@m+BDor_o?Xh`KHELV-q{EwHG}(Z^9u9>8U%e*J=UNmTIjqiQ>lpl67^x zO{8aZW<1}XFWX~##^af>#~-n$Y_NkvlsF$%cH<~ujh5 zD5MU~ZU{>P>wuc26?C((QBYA*DMCd>s6~rfY1QpT_Xef>0WNyi_cf;7sa2b_IFE7D>9>xMl9_9c8>XzG$si>gj2nO+xj1e$Rxac>WWd)xn zXY(kJVu*tPAP!~QYO=%=h-iDkyG{`};@RXh%20l_W^wtcXrV1j^DLuHN5d?puS2*w|l6I398eE!Ye>gtm}Tp0(jtBe(ghIUGi>!roUBAjxu2qOgm zeE^KGZ+5oyc<5qf`%HKD)!nD-H~ukn5*{w!-d^0;*w|ekAG%lsHnzA`-|eo$IKxbF zrn0zR9-o78o3o9@x$*Oj@|B^J#qD}^vi@|ZT%M`SoIihYdvbTTyV>gPe*fj>KbMzo zFD)-G0|>r)b@2M23?O)9ZS~x*nk4wnpPxPZ_OI)!-{-)VCH{{iZjDrUzq?fi{;b7< zZ?*Uh009O5+KusYI5=$|ACAZSW!#of@9DlimG7kzKHvS}czd4iZ142xT}RjK8fhkF z*3I)Yg)j{2I~0tjL={n72=B#Qq~McN(}XJIB@><2I)W%JqH=6>Fv%n_K@oLDY%6>a zU_=G+W;h%f4cfGRufWnqq3uv13yOftALWymySmJgk+8<~U$~x6BW}qwOoEA69+jZ- zjzq#RfHOX9dT7S96sMPW(sVk+=*H}<&P#|wM{$-%2pVpO#w|;Zrre^0$Wa%tM-*mp zDvBvd((?NwLLuO@yo?t}v@J3ODp(;$Xg)ZVRPd-I)@nAw`}KelvQjqTW~FdgVN^60 z1Ef1OrPabI@Jm^Vv`+laGf`8*TC~HTup$HR=3RM9)WTWDLmG_m5szm=9N`IZNEqcY z;K9V0B)M$(kEBB-u{235MnJyxC%4D?&yKlSIM{uD{r94?)JX^Z?C%F8fIS-}; z^EM3_zk!F;t6!BTOZDc1Yj z+TOXke&)?0CMNo6EdPtgvD%l z3NvcCpG>=XOUvHr>{+|tr=n<1PdXeVhB|?_=Atovumg)235H3}Vv5Hw{hR|q7|W@T zhI5!=UAko9D5zi^NLy4@Nw4Dey4u=gMd3Y&8zoSjaxi{I<#8gddq^dhtGR5u=HMcc zdVK4B=1_8Bjk$%Q8;WqqC!m zM=1p4iC(kTR?7ra?LD7iMBmqgy6#XNegG}Yqt9niM5lQir&-C)!RzNt!xz*fuQGUO z0wFb?XT!Pu)%7R48xLn--UY6$xmktVHvpHFOZEEtP1uwx4$UQmSbh5?uz zIB%oWC_-6=gE}_$9^ELFwzi7nbBm?=STn=`E-~4F12~!qtRlGNgIiZV1`ZmYb02DK zt#5R9xA3>Ja_!p6?UjYiO~8N43k%=uFD-9E2p$}qI0l4x@4KGfe?4o`Ab9))K=8p^ z9sXZG(h4fHjL6-V6=^Ck%uU0m-!}=6O&fxjNJKb?BOZ?v@xH!xZbWy^6?NX4)nR#ylkJwpP=$48;@TPrKIEuKzHOn6zL`XXn!f zVdFFJ6IsPVpIyJB-Y`8;RoDFFre_2cqb)r0cFZETok1^aRo!%NC0IK z1o0*WQ;!sSKj2-5DeyAsRsA#*Fa?JzYBLB&O{sKH3xoQ@9f|i(-}%eETuiNnDMEER zMVAN+zfjX~)+X|aO90)YH5N}|nrIV7L`jKliO^KGpq~aZy#8ckyeZbl9)})|)ywBzG@Hg1@U6K$Aj4Pp9syj9jTI{u z@Hx1-XtIe^0LPQRodK7uPQq;?)j9;{R->_dYqyy)c+$Q6?w7y(@WX2hD+?=23k#bI z*B18om%sQM(Bjtz2M>pbtE&&5zr1te?mNHToqe%mpYQC{ z=aX6NU|=+9X+q<&B(0INyr@u`j3~;4WW_;=)Y?f{MwA&tnkL~TkOb5~wYJcNjI1Lt zQ52K}QB<@^NPtGapo)+1VMG14=NwqKS@H*ed32V3{=NL4|Nn0i?3nlDJhIm~^3Ij^bbjXS>}+un+xF${_gjWK zs=xlaMpVIV(62FWhFE8a@?NQh$44$}NT$6wO+peS_X^*V5+xM#-9ud4f z-SoR1TQQ8;y!j8)y0m56_kFQ#zZWZ;y1w7G?K}}_!f-}#B2XE5RIsNjW;sQ%+iXD;Se$s&(IPkl6iGliBic-ouMUzU^ma(X zN^p{dzVTW)k1C}u%3lIK9YJ!KRkCX$&n{)JT)A zx+4w&uu&w~V6gHl~QfvY|r3m?CvzB0m=s5FUkDqBD) z0e1l!$HOG1gMdt{ULNskG;6h5gTZ*vhPg_3Rb$K!#pMr(s3sw_OSY((?5xw2P-Tfl z12(I@e(xz#q+J%CRV$T(paU96R)CN=!y&TjBPuAG_tPd##zS46crr?IoQY%VYAk3K z3NAb`DuTxF#g+U_x_x!=Saz_n*pae2*1a;Ze5-pgV}R*WXKn4}scY@~FE2v2go$J{ zyL4%0thxEvUk-oOy#3b`6Kji*9rNjIcJ=1vD}%MYsZ?V_erB|L<=SGVVX!e}w7ae~ z-+N5R9DVckX_!Zro}7AT z=bm3KWUu~x)1e3FFTA+D>ClJwtE;EauRr`hDc(pUuPV|fULx>|;!Y!DeyPZSpI$fj z5BG^g%+_Q@s8BS4$6^tWUQy}tG&Px=vUkhoEwW|DX5CJ)uB{i|^*A`pWG^HbD?`)u zEu;!q)rHUm>*Uxr73bVuOPO7@a;VvXFbNNJtW-FwOIfQh>?H27p^8RRL$UDw;O2PA^Yc z0!{*#G`BadBdP?LF8CXWa~us!Y=rF#GiD5zI7%N#+U$_}g7zqkz9?d~3GmB={alwP z;V838c8mighhl!;pI`gi78HefNoA9Pwg68`7zT+|#Sz(O0XSDyDlsU=I0}^v9|o*D z1_;&WLgQUR+{3(e@`s`k%;&SstHut4#xqk(wGC@)-772GyBCh_zm#jp^!DUxGx@P} z^S$;%m2p>yNMJ4Qyvp%J`jSi!lYyFQp6 zIXeI5{Ih3IpZ>FBq+{ok$pimd`02rmFTZ?o`@8QB9SQB4U%z|cXES)<=Ro`lfd>3u zF1OrxfBg9d0GWQT7mA${C6h@?$9P(ZcS#6_1(W81VehoD@UdK{+S>dPL6j{}WAPH2 z5lD^KTy-#9VVjG+}Fo)RtIzTrSQ>1p!DP&-u)!yln~5t}pM6$#Sg ziSWEePz;?+a%PNRjr(2>Ah-+1DSFtl4I zk^CmaENL`+76^S6iA3BqRU%=OnFeNzscQ3zIN+TW3jC@IsG25G2*x3j)6)|4dKu8> z)+z*2>|^n$RF4HIm^I8gu7Cv#`q77$?pHE48AH0 z{^qy;5#f(tt&-W8VlM*l`lr_;{k)I1)<>MIisNd1WkodEB57ur`fBRJZ=R$gx*Dr8 z0kSEi)Vusr(8^d*4(WqIgndLrHG7jspyHmO=GGHRC9Q-)RTj#p68~oFdSjb7&-i=i zJKrCleRsJ(KF2O@aA&`#-~FEF zdEejjJhiG=U=b=xrA=tW5W(xn$Od6}7)BT5x@+UKa@^?!W~&G1L_ zr|uNXOO@%_<>m45`M%?o;!-hd3tViyR4Kn;@8)L9#XF^*bI0%HAzMOdotwS)yDVh4 zg;J?B`sl*=yj^r*vQ4%c001BWNkltirP0!^`O!Zu4Gj(13a(P$0~o2;#MJ+* zOK(1J*LM2!7f%aY2G<{M+p?u?@X(gs*AHLs==kcyS7Vot?Vi}#*4cUNx|&C}DV*BJq%}aHd$TR#D4} zMG6rbn!sF6HYN6{D(^QO3ZMol_}IzvS4%_|2R#ImA{rTo^*TDUXkEi;A2uD0r2bMo}(~`P4eK zz6K(&e|$bWeP((5u3f=pI=?Wz;b?hlxiUIh`gT4)uvCUv8ro`Cd^!73&nbw_Y!-4~ z_WUo77EAVkc6a&F-EX$fPM7oWG+(TI{_CFUa=BQk%s#q#Vf(I?#Ew5)I=#}X(pIG0 z`r==6gNOFFZQ605rEOD3$EGpc6NJ9t*x2QkjceDfYdP8Q)77_cU%uAS(D~|~wf~;p zxM$1bucxX{|NFOh@56ER(C_bmdL;i@-;ZSqFG_j*khl4L?j}5LzhcAh)|Hw;=U^lL zPRJ<;Gb&1laSTu}hST9gLK_+;DGHDA(8Y;ZI6^3jBmtmc1ZZuQOrR$O%%b57Zc!j0 za%uP)GdlN%K?8SOR2c%P_xl4l2)B!@f(BKSmFAk1aI%1TYpa1mAZ)psR*`JXBMFI+ zzktRCCrVR*6KM^%6gV7)$Iv~Vghv+)Ro8+-6xW@!z@~aJmp0R?k${OJiWH?IT#|S5 z6pBTFPT>h(p=!}$%;B>|D+GfgkiKLlYBCJGua#+z1OmBSuAsPFXo?dgBZ1k~vYeC; z#Het9sfF?PENh*_&(j-Tmg#>};j-<-q9qGjA_t7i=tzRzA0j6%B2>ksZyK?v+OEtnuu& z4?Y;OE5r1B)_<;ar;;5imn+#*%NNGCmljI!Yq?y`PESuC9sPEB&G-uX_HDm%>DE8K z@7A`Wi~oz**mz*?-k+~;Z0xwWd2DA#%lj9voopF9Hqp5H)y}m$AHKS-p=09M!^>T5 zlW(2;?#bky!^;n@o|yXNKX2ZDcX6@0|0lLmW=;P8nBg_MUQXM5j>0350U-fG2-df~ z_sh0HXSA^mC(|OCM&}eX!Ppcem$qxPVK9ND1)C0~ar=tw2=h_J|uz zi5x31&Za=KYU-A)UH` z(HLXE9}LPgP9Rkf^2jwAAghGLqmo~wX#zvEVL5~s3MtH`plJkeXGM_=c`2`evzCsh zFq3=h6#`9jBrgU6e$z5Bc4L><*G#Pb*~htL+~3P_28<>^m}kS8_T1b^w;pw>l1iaO zA>;rIF1WdRyF&@VT5iDb5lPd6UWZSZIfx>O?%+xeiUA#E0jOAkBv2q5-4cqEgev0- z0w|MD`aMc-48=y0DZg^{pZ1F2`0|~j8@?PUXS0KR&E$U`_D zuT-+df!VXOcaFY&qj)Z#KYs5_PkCv;7R8i@&Yyd5cYNQYauJ>n4HcIbZualGaMR8z z+PCY_j(;mUK6ZLR+!r}q!JORTB!(Ht@fss&|Y5l0kORB&3u$>JZ>z25*Wf|8Kcw=9*QmHnv zD2oE0710femVi`KXG(@ysW?*Itj1~#!Z>0vFLwAu#fWHrnM9F7tN=ol03!-bv?#K( zq;I_zpOr(Qiq8iSE&}p-O{ud8#54`A5lAS=QFv?fEcMu}#~fZ9A9rW;jy^0MxpnK% zIrmKY93<}c;?>@JD<@u$xXi7s{cZu$cX8o#+tEkYN)zz$l97!-Nn<9vEuIm0v5K6B*6qs8BLwoQyrUFn`{gO?sY`0m8Y#nWx4-Qx4y+L3b$GgmHNZ-cjb z#@yF%jE@~Yys_cdTn>+Ye&40<)tX)xzaNK=-}tsK8pBYiW@IWeI)7kva&mqon;q=x zIy1Qc%qR0_4`!DKFD>n?A85Vwq@`sn7KE3qzlf}iyyH>xL{^bup zwMQU={~eWi-4)qv3!l34>dmUXpT7C-sZ-D2hYU~NX>RS$PL7sm6PYNbmF<7b`fvb9 z!bV8jCir-`Pl^kE8e`>HOms`bevJyFC`wWyg@_pvmLe3~&Pb-K-_)x}Ykf~HcZ`f*AMN-|`kaSqDbn;}!mK|R#Zy$O4 zk1{mil!gRQk8Tqjh2q;ChhhB;P#gUjL}uiCJdApmX6p7-sZ?^$VeVTyG~RvX?mbedFVoQ!a;p@#*{bH^F0eDbLnz>{lSAvA6$4mFpypT?Af!w{_4fGzjrMU z4?iAz>-D6}4}W`e^Z3&Lh_G9Y`I%c2gaE#Ae{AgeAO8IO`L6c8{d@QJ_h+-&G&h-* zT65vBOlq>Cph-sZ(6l7ddYw)J!jsGuMVp4H4k}4h2m;jT3j}D}Jw%JBwS-`;D}Y4Y zU}#HhQ@l^YVjhGK$6_b}FrG!jP~s5=@y01zMARV8u%M>K3P_w2G_`~n(IZ+W=?#lK zuOS^B5sGvKOt65TM}g+WBLS65CV|E}QHBbt6o&eFCZ5MIinnVzEZG+=Mx#Kri9N-N z0Z=IFq)h}uXi~;~Ho*pnfW~4l<-~Q5jG4M_I*b?-9jD9!z%?`&eoXM!H#A@*L8xkd z!`8@dh1+@7v!lMA)76+DFc_Oep-(V_bTSc6#AJcQNr!yL4y{e$33ASh;>~-@d6s?xEnG zsRf8*_g8Br_f0PFi?{#7)cM9Xai4Mg{`h?NJNtZhKHvH7?7Q>Xv11<|wiAaM3|WFp zOr6?Upb2D7P~3z$8>Ez35C%(WsFIWfwXi1IQl&6Kx2hXyV46TpM3xBvz)JKjJpZo!soEo z194-tw|6uH%Qf0^grEjZP9Gbpc29Qa7AlpmLc2m=9lW-@d=N(8`TOJRxk_bz{(hyf zzCQl9C)Zzpy7Bw&k>$PfOE;RGGR;1Pzg}v#%DnrWz~?Q}A8yY4I(>TkuTTGPuK#g= z|9|@beQ$50t1&&*H8pjsQ69=$T{}|~fwbm>=z;@tuU1W6^Gqa^|h_+$-4IU03P2&Tl5P$(ZTEsG&| zEo*8c`WOiuzqHM~jPLqESjuBs>CZ%!&{I3}ehd zw(S?MZ41*KTVvL*+6#v}wiZ{D6jhAH+S`lCogc=m=#ChUkVM=A3u+QcfVc$;{%|!rGY}Dd?i>-kyTo%Uy zk2XujGuq_LOtoAt7lg)C6-q%@S7YYfx#}ql61a5d!KSOm+P-&cwa;ob+ec&HKHH4r z#9*yf8{D_{<4vQEH}{X(CNi~mHeF=a)&|GUuASH%Bl7%!#?=>Lw^{f$74RsE`6$fo z@R^oRfTI-_(PzUr zA23~rLI|ZeO}e#+OcDr+VhI6F`~zuAIniXWbW-zSGOP|r!Y>F3j>9q;`RA`~OXgvT z=l`Hx{=B1OcqHH}4tJvM+uGYZhKK#Y9_-XPgW`nE7(5 zp3mp&Gn4nq<;i1vtCRJ5_2|)4%$*}ED@&IjoW1x_?aW7;b{vDX&(@la3TuOdm&a<& zwwWK;wlQmipImunD|B}M{L0jF__>)NdacH zh$5&8=<>}7Q;l3<=urL8q3Vv|)rDMT9B$E$^$W`j#gXylh57kPWqq}J;n8^I=@SUx z#)^#}e4M%T62bSsICA91GYx#+sQ*^+t<7n$Pyx5h%{_ehaIW8$!Tx_j+GmbVHL49^ zre2>AZc&zfvqFw?K9VXW+cZ6q4F(*fXa(|!nP;eMTQCVTYB4O7B03<0f&6=bM8ld! zIcUaDX5nu%o6%G?+X4`9d#B|zk}d>>NRDy?X;u;d*%~Zi7%dYhLf~#Uu+)r30QY;X zt-XGy8-d|DZy`RKa63f1T|n_03XEumY5<-yTi7%MNSHdNX-BXx0^_(7#{r_k_j2zZ z$Xm%^pDTD^u?2nyCM@jMJ%Hc?K@(vZMb!Yy5g`u&fTF8$1@{+=W@{+c8UNr%vS`F& zBZ{jy91id3-1XgEZ*(TLk&$AolXCC&$7PO9!;69ASe)?N37sRW;Gy^gHjTZJp)o^}kRFpFyK-WEXu41@mk&W1 ztX8X)di7SNTzf-(D@#{CdGP7)HX*zCy%RUbKK<>R=hy5mgX71~4xVY^cpl<7 zc;fiYGdJyIasQsR^H*M2xm?-aJPG+6z)N@UZh1ukBclY$$0fqc@;vL3c`l>6b+t>> zZ&4G~y~ifY^?*@a&8=7V4tExZSC{9@=&#{b)aDm!0gDvQjytG zX7}zz-tu9sW)GIpbUDoi+;Qc=K%Xv1_I#{}Cu_D)k`s5cZCTdkvIk1~61U~Je1I1T z`&L6H%m zMP*pj>xIOl8EF)Amol3sSEw1Vywr{my6)7 zgj19{w%(RxDAZ0_4yL`17M>!wv=v|(6hUPar6A`-n3)I!ST4%(UY1ZunF<-Ij)=fX z;(jtLwYEe?b(lXh6k^eG$b}l243@I;!Tiv%W7TT;-VjuPQ%9ljomwa_bRR0$&mH{J zH*ar;1U|TYWY3=C7j0jTpYA!kvh?RM+Z5G4J%0S=*#DV2-`FP3JC5HyzW=%N*}1cQ zv3>q?aT5Em?6cz#CvpDR$sCgeXA=unXaZ>nArSJ9h^{5zk(LOE+eRr#TB@`XP{Jyq z29QQXN!3Xc>(Byh<5fj9l{XA&+C(Q!u)f-3Cro`Tzwryd@O}0DeLsGFzvtO?`rId@ zyCI(x82R-ZyLL_7IoE%F%lv*>^ZBa_IxZF1V}5?$(&w83%x{9+K61qcs0d?XP|B!b zCQ0^-cVD3yh{`IwM z@zv+go;`ayRgmDq)T3|j-P_nGIN`lh+iDhue}cj_^;)-ppH$}x=HXpGJ1X__W{4#4U9 zth6N3vPr^P z<5ZX)aD*fY4hBD1_jL;E^3oI;vO4sni3x`#QM0=RT6P3&o=7gILI7e2U&u@%lf-m$ z^wzCkz4rFbbTm3Laxk8br&0s)5kvfkBj5gJW&BY8!iA}YPy2s<^XNp!i4*yATizOn zF4xg<^w`9S6CJN#xW0e)A8y`+A50vZ_*=)+^*iI|Ki$0Q7uw9e!VF|#C>%QA{QCT* z_D&w1olaoyl40?Ne8X9T?dq03g zGMip)XdYOE0-U=%n{IAhji)caJ2#MCeEvM&HN78_2Qdg-p#M?3KD$qk0-6E6#OMpBhjWYkRR&y>e~Kse8j?j>*nxs)J#$gX0tZXl|!{$MwASK+1FR9U>UoS2qG@U zY$)S}QnLv`tlnjd&LwnOEr{&Z2?9&7CImwPN%2CP*^G*Q9KrQ8Z*gV2>b|ln`SxTH z?&xGRl}a6aE&gUR)Lt|V^%ov^@xy=f18Aq#$NT#i zpb36?=;Pm>ct77xIy%_#-olN+iA_0=s`N8TMf?tfG0a@myM@xr0Fo7YO` zOYr*o)uqkj`u1%GLHN48h{Y7Aqf{ZR`jc9hig^Veu9k^rfJr<-2b;#4Qm*FR*)RxKEJO(32(laxHJfq}%s@-k}ilV6~qFCGO+(E0;$(mu^r|=N0 zoLYv*IGs=8yF7-&RlOm7ktpCMf~RI;nB-I_!~rqHzyL8)7S@cwV!@JS{E%d{+sIr5 zV+>f3ecUD_1cX*|Hl`wpAqUDU0|CxJ>}brkRLQkafYlF$!1f)Dy2`4S>c3)P%t+M+ z8YHa@ar!VpkxM8#NL$}vC3Bym02AbR+Q=|Q#7Ec}fJknWECZ5PQ8P(0C@UaIW4oWk zup-H33)?UW1)PNX44Nj2CUIz}yL+fRl^RNoz(<)%#lJW*8=rmg;vQ7r#s;*H_2J?E z;p-O`{`~uYog3Y~dvI{@^y$IV```QZ&)&~>8H^78>F768Q^$@%Io`hy)%RsVef==# z|Kvo{&AWM*mNqY#&I@q<)fVsIPoF)%u~2ZqL-UVL zZMxvb#;J{~=P!&GB>4TSzhjnG)>l?muDd$IfW3rRUpoqa|W`Vr6CIHdsj)k18N-9pw zz|#)v|ERj!*e1?9{@nS_cW3*2Ip6v2?BsHHwu8@CH-5>BmlvlAq{dkq@&yP1lDI4c zLy|fzYRS4{EkGMe(jij9i$H)zpfrkj`7jV;C`e^nQqroUUk0l-(56+TqUtK4wEKYe z@Fjw?001BWNklRWnLtoc|6U(wkc-OKm9P1!l<=yN znsqFn0a2Pn5L+DODCt_UlvWj`W0ExL2M6=vTs}RXj>06l>g36jmo5#j>448uQ&VeJ zHT-pYX6oN&8}W%Ny=Dn;eboooXBU6S-18Ua{_xyk^JvUJp(;AP5CBd5oj*VO{QQ5u z{{D~OJ$(56GYCFx&*%HwbM-qT1@(}Kp{h3%iBf(yPTOk&sH$SD%ZJl01VtmNE>J>k zGcJ=1q}vkdaL|@8N~sE^Q;?4D_Od=Ag<^4=h`Wt|;;^D9?hsUGOj{SmacgceQBPoD z8;k2Jb=nwVNU5BrTpAfFNHI<;ARH?Z2F5EB=@%eXsKM$%JW9N zEt*mC8n4y5AOJ}_NpPG`6pCY!=2~6CeSm=J+6Gh%0FTqhN%0YjZV4lr6wVitd~nhn zQ{7?M6P3xj70pA(U<$54kjBz;XKt;yluRVbh>q$NP03^OHLBd8NG8ZyblGRrK z(AKT<6k8El;p7;|huds?SaoC3D8X6GePgKNt+kjnBw9Tl51>R3V$CQKcm;|xfH5SL z+|<&N?(ZLJ@9ZCh;^RQNZ?K`eWxV&$QtU8w@rIU-6M?cpsCcAS0y*N*@Q z#mdKDeO-3zh7A$0C1CRz{ zXDqd?H9#$mZ6+b-x=BAu?*SyAX%e8YmZ5`bf$rWH65?#(o~t0T&Y_T+Q=t zDNFM8ySbgY{#C15_6(ZQZ^H(2??0WM*}na^hh`UiSj@-l0s@ai1b#Ho)AJgnf$#o# z-``(+*|dh~>ACZ#E%&R|E|_UR;`iZ^UoMYB=vp35Zu(#>B5~Q7wChEE;|y{6?%cf-X4<8aN)3{OuF z&zv2dK0AHz?5NpDJZ0u#n23MT+k2z$?%uCHG+mA6W`DSKYyQIL8*d*jKHc|apBV;C z0Ddr^d1`|5YFSg$!-blRDT%-M)GQ1>e!O~hF2|ErP!mN-OmtHy!f`nKK=djWKrwF0 zDVnp^+891tn5tELii$HfwhbYiF<=v9+3JZX5uFxk-)JR0v|aZq z=wzwAT4*HsK+)D(7q4-$RA=_HYpY`-NGMRt_fnAR{ZQw33?=Fz>SWywZQBMf~jN+;T1XsT3&vShNluDMx_hDB8? ziWju4D+dUM;^mz8n&7Zf2<7J(kM7UsTSH#IkEdx2eZ_-{GHh}__G5W(h!7WW8D`oUVN}+U|{3y-2X}Z`NIPPy@!uq zzWo07SJuC4?hWsI{dFjS-|KmG%RtqVnMPIBn@5&wElgj4lV za^z;13m6t0p>fm4-Hi}FO7#MiL@40pg3Yn)&28J#H}`a=+uK_@&kQznHgtE7K?uSx zJbZR^YIJmF7zRLyz|rZ0(`Fz0lW(tl^VvUce>wQ{Bd9`V@7Fx?2z^w!o<)5@W{@J7zG39O5#n z6njIdA@%vYc)c-ryoQW_6<=;^vsb zID{ixopjY4oir$5chTXX1`skzx=MH`Y5)N&I4Y@%5DIa5!=~^>xYHS9CMpvpMN+W? z!Ic;cRdpR$i7p;(tOL44I6|926zcM5u+Rt)DkUxSiP{M_1+p}O@;;y7V_Awa+?=bh zz=gw`DlCQ?D-#r9byTme_E$DGD-~sxi3BQ^HYV#Tj_pV^H95qlreudNWMeckA1$IK zV?}tnm!E#;trOq-;mF9P%a?0&9V4esz5gm|+j{qHB5Pu}4InVV z6Vxp0)|AS=-MVH7tr*$a5XSAHp zm)G*ue13UtZE=15`t_xyS}ujfJM-1`M^-wIe*sJU?2GBMEe}t<_x!KVA3p{islCVU z{_d$>db$PR?c4ue=}VqH`+9zH@qaH=&}y3qmNbOYK&TNCMF*FY+EYA&gxI+pP7tIC zSRw!&b=j1m*`Wl1IGA81n6hU5c^)2Yrx93=@(3vyQ7AfQRdD8DRTamC*Ihmlij+zL z#NBt{(+`r3ln;^-Ah8?@`8Ad^MHrPK-N)J#Or7&bWFy<;XlgPrJ4>xJ$9C_=BA6jS zy}ikBbJ5D-yV~}P6ens(v20Kz^9DP#^YoCB8}3`fcYL^Q@( zJYWq)Av{mhbv#0O&=iL`WrvZ<(mV=O*lqubB+FC~2yKJ6-dk@UY$ACGre(U~-B)y} zX5-W@e5$tcX}YJY3%GxIYg1&`@>+RqW9I3zBgX-O+Y<`+?_W7@Y2d~4mqu=U{PPoU zzV)LYe|&u8?)FUY_iLF*Prj(j@!CfpZ4tOxBIYHCFQSmGb^~1)z4`8g zCr_?kyY?h`cKy*9;JJT#;p;zcT4I3UpK1vHdJsV65TcZ1s&lF+Y0-vCP=aJx7ZK7R zC_f8FD)+3 z-?0$<$8YYn6&@ac*qPk80tEg3^P@*U*B_U5e3P^QoEsRpb`?DSn;vMrli!$_$WKg^ zm$wiE%@V=A|JnOh15h4S(N$5`ON2L=Kp@N$^vZsobQp-w=W|nTO2nVjk$`_Kr)l2t=W1Ven z9Qd%hS_rosnp}yww5IgCvsqH&vpns=fY7__6iN^TPDNa9#Y*`Rhd7oXz)dGb-56!J z`&pBsn^HJ#@)aW+^d@8i3F>~HP?2oZAs9q3G1RlGXLx9+|GOZvn z+%m#705>;-oO^o)g6pk;aswu42F<1z&OFpfT4^Mls1_knufT*14h@9}43p*IWBBaM znaQwO8-iX~Tgz`ObXBYK2LOCa>sB(4dkY{gxqcnk<0UJ#TQ$@7aQtp(=ftz)w`%}? zrhlft^UbH3rw6Z2e0b>ERZ9U|(mSgg3mc==(V4Zw{gYpB+u^^}5Zt@>D|_bEVKdoE)`)f+23%5nB1TcR9OslHK1K6*R2z(haFeOS+4>-g5k_|| zXObi%Lv+F~IdcwRAHyFehA#{}Xli#f1ljrq-eu=R7w*%2u0+r~*cNU+O~tv8Ao_eR zPov##x{JkdSc~{OdS|ghp)pw~_7&~TD?58X5H7@Gx(*3W-KBybr`&Ovlv&m1$B2Lk z6VZ@~qENTD0vyb21b~Oivb8@Rmc*iU%#OZHCft(l=pDS!+=&O$$<<;ZX5+Y(STi}8 zP9GhU7z1%r9uG&$iW1j=qk&ftnr{ii#P6TD5J{pBpo)PCjKaoa*0TuvP1)c5rwDtX^mO0a z0|&Z&SoVvzx;uf8r^$ui_q+VRFaLjE^ls^9^d?ZUQfZ-~z1?g1FIpNOA1{^0*TjLn zfo0$W!L_iw+^EScH^}f12=db5-gocz+q&Mr{k8$XiP0Os{m;ha_a^X7zTe#W@aWNp zofP1|3cQfX(!4U%ilGu1$8p3f zZ%^7N{uy_@*;2j|Fv1v|&BhH1)=1LHK>G?xsuhgPwdm)(j4d8FVi-(gWgTh}ZfTIL z(~0hnZ|t;&E%bE{O({8ODBkLFTNt-l!rO3j&qiopD=$){m%wtyq>65rnElpF#;pxG zcB5ZqGGlx=6D~5r?oeVo_aNcu?S-2Cu3T==%l9tYhJal|Xqxufctpi02w`zikD|o9 zGwzZiq{Pqh;M0LjFB>Vw9I;rqYosTX=^gyArq3Iv}PC=>btpr_%s`dvi-5T2>A#OIwHOH`D)zz&p235qRU;*~p@a z(TVe>;HL;Ka=6APHHi68l9BTF*d2i>h_zYU9d*s zlDQ?MmQz4#O6rD5R&C`>gxN3Sv&xyN0tmx}0$4bJwJYMldLFz4{8a&{%RgMtR}K%? zR}a?@m)0J}BAK^u-zNY7M<*tJ_-WFyxjzG(#lQDIJbGLmD;^(<;=1T?ToGsXmcbG% z0b1RwY>E1xPxeL{iTHGv_~pw_`2PMTk2ImUU2Sw4EGDapB!N#Ldv9g&Y;Q8ax=|V8 zV>M>K-s!P94J&q=Q>qn6z1hT=K^)E*e0Dc5gTBCSy}ph5v$zCX(WhcZ+uH|2Mgs*y zO;Cpcx@EFz#|S`Ng2KPKJ;_S26fke7O5Ng7yhe3qQ#cZYFh|NczY#fLlas+r=iQzfKsi!D?~Bt$+aNbIv?6d8iC|U;77(X$Y8$VRF?O55?4p}!*d+)M z9*jBK+A_gZQQO%TYnw~}UJZx8N^AgLj08g=RnilRrBWSD;3gJM+3U}`Xr64vV0F@o z`|K?`U8CwqQ?OPCtJFM*HeQ#NYY(hgbV*=&Juon|5|2smf-wjM;$f}L%4TL}p3dEz z8@MSp#H<3A{@&c&vItDzDp0i5#$sC=k} z((NLYT%mC@9yL^(nz|Y7n;ITo=SL=NH!Uc`?0S0v>Q}Z4DrCbqlcgy|sI( z&dy)ny>IKTe);X_^j~MYW1IWc7q9;G_|byryi+q4@tQ$l9cnXZ1EYxFM13rj1MG}Sh|_UJRb1YI7}n3T#fUpCSIYH!X!z6m52hJ!wjBiUpx>m)Ml&E{(@Lp=m#tU zlI3i58L-IG!ot$Y#_GMll-^ALaHDassWb~^+DzgvU7<~&3#Sg%|By*%vo zx`Bh>do(>g*9&)_R;zu((Moz@3)lw$pL{-FSzFyIEtT@%i<~q#il#=EfB7!dwfgS; z^gn;9R*R|B+~eba9e?N!wRH#657!sA3M0U6JEF_gfkrg|EXTQWG+kKe+pnGM5}&B? z*DwEZQkMDg(3Bq z4!s79>_#!Btc1LJrO;}y$V?E;vks7N+i_#SmF3hA5{blvv3gLtc@PW-J4X_c2*6_| z6Nz*e_cKRFN0F((U_GR1RYNi*g|HnQh#?9d+}YGPYYMH*59%y}0820)MtwF~BSl>@ z870&-FwYZ$Szs(6kNA~JDa6_gwqaXfI64!J&ddz=7t*EvzB%CJMIb(+SlL@%Ti-i8 zJZuzqm(p+E+_>@O{Z|(i!54SF`Q2#;me0*d&nFa}29fiY;1|yC_J6s$y3oYZGyI+7 z`E@)VjYmEH>xuCXM-zWT#=nU+Y9t8@wMmHDu$YduBPj&NY}-hUELoC;g|OLJ2xVY& z=!BB(Rfc66GSI7Dgis2h?XVXmLpwW#Ww#e|u~+?0GD&9Zx$r{pz&X$RywCG}@AtlM zjqnHW+T!b-5U2qsnVLloeSWFn0oGR0fI6{~*I={_%Smrxtg9bcG?R^bK0i}{sl{s5 z5Q+&@eb`K|jIO0tmebSA>GXVMbQLl<6cW|xgWTQfc4ZT$N+yn*t2)l`^Ox zQ6M_S9iw4iuZ8*SmS-uNZ;xj){ejcdVBcnx5LSlG`1(WG@@~BD=*r1LK9aAeaLyNB zqDd6NB~bbkC}Yvf3^ac<>x7&Gqm`#anr^?B;k{$=K^0Ddn1>xOZUG)XEQV!dE?mmC zynqy31E`J+6^k=ke9z0Wo^B$XpdX-?2Sh-b;<@EnWhZIU9`!oOY&p0a?`3>-->EMX zw!nYy?Rz}%hgc{?2udl#0KLx3$1ns}xu7e-fyzqbmcbD@NvcfxK@{`qaGVV(DP({_ zL&&6NO;8Dzry2rfc^0Jtfns`os*#3o4%*=P#wetYKw!R_o7;pO@bF=E13F0PDIaYd zKU#kYIq(93R~Y>BXTSXUJIx>=2;aX!;17Rs)raq*6ybxLo#6ii;PtVPFPaamvkhg< zTPo3rS)vLlCXisJKWjKDYXq}78jZ-cpw;T;qXM8g)?goiaqU8Q5K^cnrj}JJYcP^7 zVrg}?d4D>$xw^Uvg~aCF?YX;ig#vVUm7UFSFe_FIzIu6n?now=9)HW7VEX%`^)R^G^Yfoq)-eC@p=a6 zOdpy|YR+f`)DVLz0z*bO4j9a0meG2N9pIGIJ~5#bPjX;(_(guS`#dq$s(E%{>P?J^ zBL&0Je1;qHqN9Fa(&4t^d^*zU$eXTwG@n#Cuq9uHfdJM?ta=xYwUj(NVZaJ48*sBm zl|TxBt9kleZqKnqqNEhSTe{ua5gBQ*G8pZd7*-4^Zt1jIHpF5qXAc>Q&d>nMDzkgp zU`8E_6=sI*hFPa^Sm@MOB(-{Suk45y!)cRSO{}Tqa=P74k!qKk?)nOLOiJN0R7wpg z)Z-`%ghjlil~_l{O#~?{%2cR|#sw>;pfExubI(diptjj3H7Mx;4CNw82B-)s;PIvp zQ|tY|$2Vf|a)IWZQ%P3WQK7rL-`{H$fcN=+kEifV zyno~&EqXNxAOOv1ES!i(BNEaD+zf*;G|GgIW|jCPu&K-|?M96nZ66*^O|7P;mvamA zm3tS4J~!QLX3M@{WNznvz7sqad#o-*>XB&VtH+1+aA^QyK%Kudl?aFX&kJJMRVBfo zKlgCGTFot_r_*9+rgQV7t80*96E_Qk5QCx{dGGZsU}rFlfg&8pO#FuFt@P2-bhbRSLG-OApig% z07*naR5n*P5ALre#c`qQ>zk2$_v3?|zkRcjDa9j^Z~q;Pb`m=~+KeOL=|J_dx>@%5 zMmI$nGL>5yZNsd-++JwZ7M5Y6Z>}ZgzI&U9FG^NLOZ=LkDF&0eB{~25=9fC1ZZH~*2TR#$DTa?q}1SPz2&mFdN}*&igm)V8UG9o}F9*M^lzFEf@Qdb*3Q0!(N7mKFwr!nJk|IS)CPmSrB#a(-@9oSoEAW##Gm?ks7fbwC>;-Ml#Dlh9!Z5!2ud1#*o0Uw-;v( z5M;m#Gy~S4=|j+Mc_~m}z<|8=d6)i44UBKn3wbZkJ>NOJ-~GPaG*f3d_D($GGMbg* zo$prL=}KWW*DOMa^e9(@iMFTCq4jQ*kqFW$J{Hl1-cjHP36>c{Y>Rt9R16J`FU^nr zdT1zLJiRnCmtXSdaza&^T|b@8s^jmLPTtR#1+^S+Kd7o@%lb~WA!M`JrIRO5?^vee zyYDRRm4E|YDvg2AFflQ{GCQ`sw``9VXZu6ve*pCNVt;%1y_YXu+^4wMnCmYvEXeHA`j+-4zBGNC@`U)G4z$ z+)cx%grX4M57w(%YwzZSw3Q}2R?3NCOgIfhAKRS{2fccUdt<<|WC54UwL>eDd8{}9{}->UmhJ1{&J~XqI;*~ZBN3E8#9^AniweS=d>_f z0?g2fKw?ijmus)ASi|WgK@%*?Qh|X5jwPL=L98$GbaXU0+-gR~0c*{cR))S<$=2wdLvA($lA4iNA^G(<0xV|&|Vjq9^Ucdgq;EjxWLF_R?2-Oh{j(T9$Y(}DX z3W5;Gj0T*T3&U9ya{B{3X<{NCi4A+un2is~@yr7>TxXpj2OvPlzf+1ZrD@tDQU(u^ zQzesInQm+XpR6<#A=H@43Y;p)iY8PwRh7#s1^_17Ongc)v9TUsmkHv{n8_hJDaLDU zhAR+Z=6Zd8(a6zEB1ub+R#lpGi*6#)8TLdlhtEVs+Xcl2aencUni&{a=#NBVqQwFs zF`*#{s$2y@hw6blJ0g4G2w%`n{vXVx3IvVp;cK?XO(B2Iteb4wTuY`9fHVhEu0 z@KbWY(PcN8aATJn23l}(I04~qlHw?e;ApFL)XPw7*owoq+zgHtslV?0?c3je{qYB% zeR6i>H>dt`>CfNZeAV2U*?E5Z_QuBcHn1RiedZf_p2__mfe`%D{x|8PFEYRU^jLe2 z{gU8^<(Q9Z0PTn2D{oEkJ`#U*7>%zSqrfHW@^Y6fJm~W>PQQ@JNZqi!NoboU6R9W) z-WTzDT=9$(!RZ79W59L-=I8xu6k{;pE+4@x_wdcW$Y@_ASz4K$n;Xja4$c<=y|0vJ z+_{{rX=N1scd0p=W3=A&#rzB+(*8cA6l8o7nk=I z_hxm8Y%G@8NY9>o_syG^FAw1duGdfl?l%Q|0lv!@tcv)-2<6wULJ}JzSa3QxrNMQ!I=l)WCobJf|fh8Ew&GB|U!gtGmCuG&1tZxeKRGT)uqy!nwO= zzq$G3KlvR!ziC5n)3Lq%?7j}gXTXgB4!m{ip9cx<|2W7`c>mT%$KCJ&1-^f*U-Ui# zA09B@ApnoIg^vMn@6Pxl0|1yDrcne;uq{9;8l-8as94psE{ES?@q_utAS4Px8Bo=t z=nr5v+8S)}Mz$4X!mVVT<=Dvb;(Rk-8XC*bj_KiesI;!sa(6Us|8rJW5X!mi^#Y*0 z)OlsGP>44aps@-{7{gk!S9P0oPEljgG74GCnBaaaMxzw~a1g@L4g`a-mN%IUcb3a-iQ*E;sf+;D zFAOfJ4Q`2mdF!uDGgKwaUE8MVN=?{V2KA)d-P-%puE9PLZ0)v;tR`gObtk+`=dJ`;Tby_UG1rAx` zpSFmOX1ev{$yaC2o)|fG=G4fEKU}zc?%Wx@c+9+&22CLDumul}9@8%Kv4i9tU98baT8Z%UCjI!Z2A7G;LFu z#%)nqjjO6kx6y-xl*liI=x358fXh!SSuxH zwF?EYVB;2xvwg*hiHV_O6OEx-TE#vn24w|c7u2fTavA`0L*+iTlnLg`^^~frl?w1q zJzqR_?BvOh78bSJWC}JQ)0xEu(IyCmNb}zSyf*y-{Jv}B?^VF(bULcZDxv2fC$gxs zVbcp_Bw`b*)ioOdv0&tUm7y>S5J)0Ul%qLnuotYE7=b(yRQksRnkH&B%+Ozw(>M4S zpRccLiD?g&mxDP-{pqw?$z>{quYvv2s+x1cBFcy5V7ju>(Fq^9H2o~;3Uh48?Z$OB zml)m}^az{9%4GC8ts;Yt-qa z>&<3uJqRn$>2SHsHd-sM!%4~2Axu`!dlR7$&-neq;9!)XW@eXX``Slw{7y_&`40|g z0L-O=a`XN7n;PnxsZu7RT+X1O>sdvfma!eaYh3kwSzx40O}dW7<; zgF6*5ZSBf!N)6!SJP>fcF3iB zd>EzSdr&CCulFGiSdFzZK@i|G6(w&@a;PNf$SdJ|dUMc_uvje(tA%x-bl7hvS2 z4(}k(5qcd>o4ukPOL`?QY0ZW#o#rsSI*J)EN=Kp&v)#eO-N1PU3&N2k%X6^$aLQzG z0C`3&9UJIr*FV1h>ccPh4-A|*arp55)kCWnAI#4mJ$|{}fauofhbKu*FlJ%YZrzAg&GN-Y8MB-K7MiLledQU{_ORB%r*)XV+LgZm^GCyK$`+!wM9i%yj^223OxtPRmdZwE~VBZ?wc*2)VM$=L0ZCK7lz zqSG5$gC8`+Vva|n%f;gCTqmT6g~#tMsp);g2f#tK0azYFg4*qz06?IcTqSnrU2yuD zOr}|1d^j{SGc-QFFg`q9m>H&uh1sYz-e`=3JTCxxPe0qipLV<$iBdT2b6XSoq?AM& zQFqqw^@M!>PIJ3WhbVc0Gu8|o>SS17uO0Y;<@_#5hjDlpV&mddm5PjXdU3;4t%ltBHqE!V zwF!7Q0(w_Kxt9PyCStdf7N=fMaL?2<8mARG<3)(c006vMm&{}{lV6wfwOU7qlB;Dh zUMcJ_i`3p~RRkoNNPW~Zwq|KqXeVOOLNjIpf!0|Ca1uQDAIKdEe@_%)dm&EaK(}F0 z^qaIAgNP$+cA3p~F`4u-gg}CKL=rfH&|Xm_;u~!D(9FMn{KL`D_g@}3J3o5q=qJDV z_~OTB=e5(D#}8jx9bJXfLw|ep&em@==Xd`;JYK)PrR~LBgFtfswG6*Dg6(;MXa3I! z?pVS1-fT+W-6;{gaAB7Y@0Q?)`zAgbu9e~EZrHsD&IeQVK+9RyVjw`LD`8+Qtf_0g zq$F4Y{7AcLl!507hUdGwI=UC4C*8>e?D>Z+*xg^ z<>;f|ZGF_9RM}SGtzSI{9s~lsb{{wpqR1(2M%Hc_ev1Qljf;L`1KTsox9<`L^1HB8 z5csAZ@W#UMa!P5QoRLJ4r22EgTCCo$Z9-^GN|FJWNH7uK4OLyj3C5pHRvb+ zB4fgA40sSH?eFYFIUy?8MKid#@!{-naeQca2^6&TdAY|ITV&&ZObhy8Z4JUv|^IM4Xq+2^~n&wq|P+h_1$IE;P1ddB!4 z?1+tPJNCd%h^jdZ#qOMBb{!`HLX@skz!C!*TAG43GDzYNtpKTGksSJ=*%U=&S{0>A zBDzkRlCGK*Wm2S0>xU}i!#?djAb%=QvX1`n%lL*3?()Z}s$W#!y#iVk=k# z;Oz%WArbN?g68G*wW+RkD%97NPo;g77A6ojNr__9V6|iL7kB@4@#57D$QodEF&HT{ z7LwUoJ_YrYQtwyAZn%9l;Yig|qL?!ijX^*!0#>OwtEqg>Ar(55nj}G*1OThH&gMoF zLDMueHz1-sZ$vO93mi==qrf15uP!YK1g{n$S{hAeL7_!eoxH-x*vs}Z1w=Z*6D^#e zPAZkH-hmd*L>tNVrBhE&o%n9CGvN{deSsrdLZF$M;X4IaC6d?;ZZ>=jTcQ z3K!lOJ2QUrck}X5h&-ZbXIkavJos&HUVFH*vb}hH@#NoL=A`d`asR~m#UHe!AAQNf z&r7uA%7k4v{JdBi1mK_cItBi6?bN9bPk8;;&LivyU;)jq7##1%|Ddm{$)AmAjU(whvFy-C=D zpy0jJt2HWxF>Y_T{m#?7Uw*wfeQ$g^Gre);4`ajc4TI<_WlEWi^QC{@k^8+IFWtMc zF}<*GZaOnQ{^5sT{`~L1S-Egw{=%h8o0}^iJiNB&Mdo)g@bKvUm*p{EJbG;}A2a$Y z4exfw+Vvqj!^(fPcP{cG0AKWHtG)mFTfLsu(`SME%;j=^AjUl$kmhB(Lq4VtP3Q;( z8VLpoZHuYU2B4lSbSjv3inJKikkzNx;&?k8v#B7ROJ39r3~b2hp={4&yq=PBiBPya zbf8wR$$5^DjEKQp_fR$ANbCflyIxBqq!Hrmgew|nyNzHMv}!_n{69dva;q4?zB|tM zoA1A$Ezmrox87omnxxy;-b7J2WTX^@84NaQy?V?bw%hGV997X66Hw!m4O?l!-mc=f0w7ng zhkg<`--5sz3EE^L43u7hv$Vl!g<&IWaK$);b?F&c(6ZnL$%@G=lSY$D78v0<(Z@iD zDth}i^YrQGUmv?Oo{@(X9U7m$e(dJ(;puxNa5+{gT|NP>4v*b?BQw2l`0|-gKONs` z_;TmyZ|4tOl4oSyy(G`7y!KH3#NwK~ez3j$;N*EZ0`KpAu=Jx(9*w?i$NX|c;BIxo z9tZEvhyMNZ2>gKtjQ{MwY4B>s>+$$xQQFBu6p8Sx23O@Gkx*#1G0hTK#1k}82+8pz zVn)(xC1xNA7UBAFQLA#fTcH^aWq?r8V+=+ZT}FgTc6S$o5r@ZMx)qdCuplf|E~{Zy$*9#zbLR}F#=Qdr z)#_X;0{aHgKsM0M8Z}z=fF44*t(3}w=K5w$WQ(oPreH(_YJ`+pjS_=!ciNqDNPTO! zD>aW~DFb6HAefOBcw2K}&W)l`f!*A`a}@CJ6<|VIZdLcWd-i#))|#AY?-lp;PWe4% ztd<6U*B|yzaKTEiqcIVbKga7T;+7*z{=R)wcF^9=-Jq!E0_sjzEhrXyI}MSj(xOyr zMA0rP4UC{t_0OOz#*1F(K&Od>A)4=i)JDuK7-@u6K%LDd_XMd>X6M{u)U~#@`sC@8 z2RHw`e`8~MY#Klw2(FvQ7E6CTv(w)tb9H$5$JfD{$sAf($YeGyUXf>k43{#8O5gqE z$>v8F0RMsj+?0<*R^;{rKnTvSY+iqGa&h$0Cof7900@r0QX_cc#ax7AdndztQ=(-M zd~L5<|J49I_~z^HEIU#Mfp3U|kc&v3t+YPjaU;5XUM>trvsInK;rCm5s#U{aQ@h zE6)9%Vln7R1f@u?KM^U8v_6vXo=6JSV{L5%?0M-yh=#=Eml8(~)>C=0Zckw8&c4-*6z>tq;I&~eS? z|Fd3RZ{JE1(x;x!TI^9Wkl687H>-F$tS+7Nr>Fh3HQBtK1B>9liHgRBY8Nm%JNuiLg3`Vw$j?ux$Ap0=P*vCDOWm}-s*jXvCD9+r(7);!EOTvZz{R$a29Cqzw{viB{^ z?$*qA-y!rZjn2>gyf*RGS0A7~M-RTOFK&<4SL^jvwC3o+w+NdEeWUgI{o8jhU0y|7 zjo|T5?|iZI(;cJ%e+;Sc+?P8jEBN>^>NVR$9QelTFJvGJ!>1=+T2Ay*eazmj=x)n! z*Nt>%bNu@7a}oIE$!t+<1uD1Nio*d_AEGT>OeTkxnPRb+O2uc(jZCpnDor(eV%}_4 zY)l62E&`_p+&XtPBuL&eP4b$swdn<6U^W|ou?pZ%eQ;J>&$W(SgcKMF6d?fPDRK6d z!E`F0E2Y!WMHbt6DErg#*lZ;k=zV*3|H$%w^YpFRe?0r<(WAYhgAV+j{Z-0HCM{`Y zNePlL#ZL>8lrWnN28&Nm;e^1s-5LtRft3n5LW;2(Y_7>VAn_6gqdBg{>@4eX%M6Y| z;xk!reE43J?Qxm}K&xUePf>O-tS?(e{*8NsX5Z`63+- ztP}#tfO$9yzut5l3}4R;CdqOU<#ckDO5e%WU|{VDBafUJGqFI+kx_!uxvHd-qx}-) z8Y}M`a~pYRHH@w*FQ}6Q3lyGL=mdw+X86>+RuW8{!33;|i??eu{r%#{pa1>o(?f?g z4lK>1MMw3y-yNEGxbc&vrTW6^ff_{Msfn#q@HjfZu(*hvaD9H_)Yikr+Qb}!A39z- zetzfb=Cx~(0zY|t4zl054gsRX;5k$xxOjZ8K(J#)et)<-k^X;_U`GaaV(`tqjNnZ) zH0E`bhVG7N`|SIHR-iSLpPI@;s}P9{P6hIBB_V2hzpiw8vj$r;g+d^o(WxA*1!5=~ zyqE1|cpDRfVvCK&NRKQNfY)K1*<^wqC1h$i6aE2Z^7C{q`HQzA>p5t5^Z7t7o@})W z@mxEVQs5z8xdoA!TOa(v5_s z-mmuzjSRtn#+CgR3uX%eOAylm1~9x)R@@<0$YT-_C|>kyF_Dr8GZvP}W+IXBlL9T6 zfD}4o3u9s?9?!n*$OI~G#|SRbtPYnfLBIbolz+D&_I7t`wQXPuMOiM0M#=#ANM2Am`1ei~Zp5zVU_dcVRr2U|1^O_Q_9kd%tf%bl2?m4CNu#UL5TbxJY3Z?O zned2mSOZgcaGm&+}Jp~G&(oGur)uvyi&*rG| zR;wLaUpECj%38JuN;8`zu?CXVkd{PwOkjUGWF9D_uSdO|_Wl&~!|C->C#BXd<8@S+=fk8n zEGiDs9#Uw%UN+k70_TgVLR9scMUBqp5yyNMvoi}RS!33R!VC|>vLY*3@5qx7?sa+% z?vTc3HnUdRKtiQ2W{NF6!R_nG_W1-2z@(@EFo0&eSSXu3GUAg$8RlXRD!F32&x&a@ zqAskPwm|sp?ml=A;cs{My~|)^jdbp7$cj-n9WSMem7;L+*b20E0g6r`O?+%Rl1nB_ zS_yu;srB}aTs|L9r{N#zpgklsJ&Nk|`l6FTRuA+zAbD9{t12GKjzdxedZWAA@Ot~* z4u#f|S}3~xi5^JO@=y#^jfy%MG+h7e{L|B059?m4oUVC`q($aysxrME*x$)J7U%m0OcduOebbNH-wbipwE?!2PXg)>5?@xcYgUm3r z!<)zqL+I_Gl+4cNC!2q`jS%>~7c<2@W(zc(Uv6D?hZ zM(@_t{#Sm`E>5*`g=8d<$wUe{hC%>Ds7VK=D$N*fFhIc+3qK+B9tvu!egem6reAQD zd%SX0NkGXi>G1?JG(<`RULPmf>_9d2X*C1xV3TY#onoJVY%r3HAL-5IQt472UCSm{ z(rJj)*m5;{@Y%CRkDk}ObZ>phlSQKgC@vY`n3ZR23LuAh*$DZtgLm2oB_aG}-0aB6 z07aWP5|cQ!$4je{sPSmDT8X7Gk)ZHt4r8^XVv}8tXcMgI{FuIJHn0-Gvigt_vq*Y9 zuFp-`Y`r!)nsv#Xm8T%j@Qj4P2W8wwMG;vu7n9t1kC=-WWEbzF{nUS%y1LjjvNJl& z5Ay@V00YAe%m6d|Q!BwX*byxD#uj*CqZ;AX-c7M&ikjv}wPH(nwY4{X$XdHuXX9NF zS0=Wxs&*eXF>)NG+LWZS+C*t8wNj->R{M~LeTuXXt3K_%_TIrxGT0BuLK-}0zVDp* z&b=p~L?QkF`2Kf)Q%B$?LOW3)lW0F-O8N&21E9Y34_qA{N~Z$u)hzh(!*3%O2LTrb zI(T@na3WnuRr&`D<23(~mQW2?(&O<^@|3DDCY%F3zL&7lmA4wsh^|TyC!1u1@NqMzif} zXYSN$_0kvRiF2j78;jLz&1P+>q|f5Y4{mgt?d@D{sa&3)ICr_Rc71(ap9!yZha<2a z9$a5LJp4oR=3R)uH_QqDym|9A5!Ca_U#(TrGs?RjX@JAyEmFHbFF)Hm)dk?_Pv0Be z+S?nRPNl+?N-CQ*$Eb~s4WM7gDqAGsF?$7*CP;k-G#|1CSMxzkLb*8jA90i%3EEd9 zL6gl!nKfZyMJ%qEBMyhiC4$NGwASm(Tdn7VXfz7COg7BNq5()CrQm8X!JGMXcJPnC z=Jt*(FUOWE@GFWHKkXs`}YXNjgcCLU{tQ z2IZ-7Eorrb(j}f(^9;*7QMi zysG-VZa(I*5l)lJ*boEGT8hOH!fBh5?Kp1g8O#Pbma~gIy>K0Zu36pRZ!SXo{b>^k zhO8{0m88hHEZKo9iKGkRjjO5t{_#FxAT>Nt`0D-C;6N%I&Yl=96h2)ME*8>bLmtM& za;k~7W*7uTNJR-Knn3okG?Qegyb6#>i+O7(;lOcO4q4^A!xm4_f<-|^Hmg^mL{2o75g0%2!hTSp&mBRh$M~ zkN_2efT^E8n#B-FbT}LgbX?GeB+?Ed}lN7~qEN-?GNt~4Ahz$5l#^aHrf=7+p z9HO+<^mMYGe$ds(1$ zL>ocI4SbC5EsjKNW&(--#k^7^C>;86Na7@BG#afzs~cWECuUA$A|6$ejK-LVGqLeZ z#6f{WRtDB$0*Z%(I{mo6pDq%E+kvPQ&UI0L+Gn(z;h!a=)SGQc@ zVW8@I&R0_DYzhDnG?z~o_>IAV^z;~OSW)b_nsA~~424Um%zm6g!3l~Kw78fgiDoDl zCIaRggccVZr$l^YrHE7XYmZC0RIT3X=E#&MtL-P9#@(eOG)`7q)k%me0Kd`_z+9R7H-tEFv#zIyx2M7>r8Xxy$pY;-z1JFUa_o`K`wlLMeZJ~@QN@bEx4$*jR- zqMH|vp9bnh@W03Qm`ktyF|Xz!zty|2{#?2Xz-|S6wmu2~IDHJjvG-GZCr(sGN2iA> z!~Ol?RC;f3XmG>`~yorda%CfwQz&ISzqb&4$|NQ*Xzh6B6G2qssKEapCsIi%EkGS7!(*YVV`(-)l zAjOflG8sb6L|883Nvbx6ivv1mE_xNd#{)qAmXkD~0LOSJFJeNk7Bjj60fmNvS(4G? z5~7%20UVMr(nbUU)l>lD2}OAxTv!})dwqm9LvthFC{Yb+U;T(%Nr|=yyu)N-P#RML zoXr@+QCjkQ1B#-!10yJ6U>vu9sDbWPt5r8Q?^ho;@52(u%;)vUv&Bkq1 zWo*lO@oHgc>|{DSFg!*uNE*OzV4yHKlpexpaQFKRZn&vBm5HdBpb6kSXwC!>MoKQs z;-`&jL>?y+any+-9LEy`0@%0-Q!H9&`itBU5`?Us~ST zY21aDtJ%fHGWb*VR;jJ$9o4tnzia78)vIH!U46WB>p}Tr7zme}s4bTM{qsDV1oa6e(BBG@S8MHU#qDzLHJDOC*Ar7 zMaXBTx2Ct&-+?Xo^y#g!v0tR#P5}U(Is#xA05ALAx{DY(i?!jV}Z6aIAh}&lhvBXd!3p$ zKt_v2!elau2!UH+LU25f&?G}aD-8z|IBaon%^9a)768M{3!%KtkhdS~fBx5fAbdgP zt9Eu8Hv#^Bs3MG4p*2NtgZnVbq{HDY&{j5p9v-ZWxukG^rSk4q@Zl)5ybiPB@Q~)3 zt|ZL9e4aHptOndbqNr8#Swsp!h*(sJM%@9Q-!s$8vjViF^E9}PB!u<}iiM`RQ0SeH zUVh*C*S-3g<%zkno+C3mx%l(}jFG9=8#|2)f4k9a&()W6OQpq0h_ShA+d$^d@7E@} zAzM%3`~B*E7mX9S?Q4xj>%z|--upjUS0CHNd57=Lced|x=d*KX`x3{oeRljsaBO2I zkPid-Fb%PimNkU2L~}@DC8Le7B~T%ON^1~>gpc4rNSZ;{Lbb6pHvMA^R*AKVfQn^e zLP88?7#b29f1v#_A#Iwf{a!neN{b>(XE~OAdEV#uJn#Fw?=P8X+4j5a`TMtbpkxf% zC5(=pdVs=NpMx2he=wh&%FYa}eRB{v+PHpiDqH9m{ThKQ0DOILQQ>#Z3jZMn1OR4E zpWd;#e{=ihEs^fIa8uYvHy!Mbbo-hM032v&h`^{*b24an`1&3wiIhTNG1lpTYgi8$ zMiq`lwUUujY25qV0$ma^b?GP_uhTIOM1B-O+vAEV!}LP? z{QlFzW)FDG$NkX5f4;Yk^SVwKs5!UHYASVFZxLyAV|8_|GRf^R3pCISbulzShE1~B+fk42B7FTghTfxyqWTVI7U@!_Z@mm8* zf>BFF;5so7bsnxFsJjIAwzK>2`qNA%5xB~hL=#d+-2eebR=sTcn)uYcAQEHDD#LVG5&{`99i(0<$| z7_AxSF=x2vt+yxuV4eY+yp_%f$iOOz5n(u51lHs6yMhEZSQg@Cvn9~xx0!GkNc+PU zbrIDFnhhhA3IaT)`;nXE>qIrJp(K@nUH)zS-`8>of4TI9+-C&{e(a-n})dX)g z&=^3FhUZijLOf7jN-G7HFqH)XjDx-tfBDK}czKzv2>%z{CFld@h&g#}kCgXJaP3nkmK=L%V z*0}XhS7@UQj$I~1zPz;Dz^X9OWeQ4+e~=dhOL@7%=5T}@j*fVo<*9>gqwl@v3qvno zCK8F*Sl{+k%jlO!^L=DeBgbROy(m=x*Si3L*_OShPNh<*(a~5oJG=d60xfkUlgZhU z-ycP2MAwPbmEKRjS-y2)adGJ3w}~r#A0`U#G2FLjXz~7;GZXVij@&>sIB$s`pehVk z4^S1}es=9@K!-m9N8azB>#03< z&N)yiZK;jao^ytMPKAVp!`*XpR<=r^*PAtNT7=37j$g}*6s4dwW;4)J)NfTp+!r}uzRz-Na*KD<2#2}FYxiEPWUf}c$BU=m z(?L!~GbZp4DXk2eTn??PnCB!yA}MoYBdel}^*Ck@x8brv=;*BLWUO(!mgfK?j8-B% zN)cmpx>AJ)w*~zqNgHhb&N5f$A*$FEGF6&MQCThs<@VCJ3O5B^VhI?MAaPJbXrm6c zG;Rm+D9dK0qKcwQWOZAqhEkQsVL*92vVm557|LS6^b85!7`)e}+UfACzr)R*nE?Vs zbAcEy%5k@%B3NNH#3_1iZf;Ar&)Kv7Ty?82+}+)<4on`H;0WB?=IM(AKBtukH>|T7 zNwwE&v9omfVNj9#8o|amcrYBiW6NOF9eBaW$llS>oB38WcM{n&nuIxd`^b%n0s)?!xN$qbHa9uJt6bPhrC+=U;%>%_U~MQACzF!l=aM+_Q(J@kz@V+aIfKsX6NL_9lsEwEd22JCmtwu}>p3{Tt{HBm2Uc8P_x0JhZ_d;$lolfV@Pk!+wwn&89 z!Ehc-Ve2$eU1j4sNzacTqA*@X>bht}Fep`-TnyHbA+>`Jt?2i=>gbZLGM;DDRl?SN zhYeEWqedu~gh#8@5m+E_m9jDXxMa3FTrR4uT!RiL^MTpv={&4e6!DB%;m&rYU;{Zez6w?6CU;rr($CTZd`tt zUR=sPOpe|`?>Uy*-uH{)*+Ot85zD4O|M|o`3TEX)s`*o6CRTPU%^(E6`@=cuwZGcA zIwM$+fvYEH<>N7D_rK=9uP5&x0i10{^*7VgV_jeG42Qv+)enTvg)>c=hK7cXHPb(7 za@N#P9$rTpSe(E;GR-jBE>~NX6jhZl#kvk#nFA*Ty-LksqF*P93WezPdZW6ij_0Ey zPE#cm@jt50$ES%jjpH-zOy>tPbjtL{6d0zRvhC1ogwg_Dpu zSC<{e&NF#tF~==sV5o%%Y)AzJFXjO0j8K?Uh2`=JN{BTGDHw1~cfRSAICa~)^tz`f z8XfuZM?{CwDz#!x(|f~$5}4Xivc=;E2v*yR{Y4dapTDx9+EeT=uB`M_`hbTy8gRZ> zzNNCdkyJJUq$-Wm3o=kW(9xs8Fl{c2IMYxzqq{pRTu_FdY@1$QhBYqF?*0+D%tUAB zuJuk>!g72Bzy!hB1!c6D8bVPGmj{CXxu;Muol z(qEt5`&JA8OyDMhn{wpLCVk-1|8(Nsy_?mC?_IkFkE0tJj{58kcJ+Hrhk-y#6~`16 z-KgBS;JJW*0-_>Ra9K14n3~PS5!hv(;SEUEVkxaRQ+Wu8`wT+qBB`RCBw_%p!UhF2 z!J8D>ylv{$o5A1TdD6cEgTOnJ&;j280pS7&M#nbA$IF+sDqfN$MAb%_fVVL{c%Y#j z4y{3CEE!xHn+KvI0jDek4kYSrk9B8lnU_=}sE*?V3{kOqQmZ4<0}m98!u9PYwX3YG zwl)m2tHE3q0b~ZI=b7{8BQmbGMXQ7IxbKnqi9jjOiID2b9$gAytYPqni+Vqp|T zEwD@;i;;R-h}h)AAI=>c9z3>xvL7P2vbqX5Tv=J@f3k3A|7*zK4=mk9AOmnPL3c98de{~WmG2!q#&3ihM~j?XZFo%p-{yT@RC$szQI5M8<3QEH`p~YA&!Pf|wi$OURk)NKXMR3w#b!3yIjSON~8Zfz9w5G;L z1~f>a20>&x$muyGrxCBqvSwRlyxWmgAjvpylVnQFj98pjtHYI#;1pTtvR8I3&4&Jj zfPXtDrzi%eW&;U_rSvwr1dx_4+1foGkI(13G4<_^RDQe|rpRx6d+yx1>2Mub2)P9X zvWSyGFKf(ah zyeh1qSVnFxmqDW{Zy_f0*I&H>k^0QwiT#t%508%n{vdt}lfV4Mi|5b3e~FX}dI5+` z;My!=KAszHNAzAUL#yRD7RM1JjS@vF?YgJJqc9>vU5K=`e`Aw)K98XhisCUEHKD9g z3b=8Cpu^cawJL3}l-`-0?PU!reOabtF;O@Xlu6o4vQ{sK=Yv(SN$1pSv+A^*BP)n; zS^)%zH4;WV*vPVyn5v+g^P)D%od=Wvr#0oIbB@xi0>&t(%e*YgT3vTIpP?9vrwE2o_OOtuIz<@c92Hu}`1?bh3pqS)Mul9MAXx9@D= zRrulJVuQoV=~<3N3~feM3qH>o#1xTH1N`uO_4M-RE8jit8;mBaT3X^A0F2Su@tM09 zA&o7Gj*iazEeD7CE`A1SOziI46|D~?0Di~suEncn2FAw@Cc(O;wSHtRHhN$-5r_1x z_Z~bkH!v{21~!SqO=7!8R)+x7yQ_eXPE#K7@buuK{j z>i+=-fzT1p49);4@@O*zOg$f+-McAF_dcFmH<;gtiOr?A%g(G%ZDx< zx^=DV>b`x4wqM%QFmdF_hwpCNy6yDVZNK_$({DZyfl)ExykgKbIki9;rVF`2uh;1I z7SfrbEhk+~;h6!EC2`puQKOWF(O3jFi14f`5YX4D2oxs*K)l|5`p;u9eK<4NJozLQ z3a%_XS@_+Z_up>@7VuMNxdxaymK6l6wE%WG*211TG)oFP8rWI0+58`-&NsGc^p4}U zW5;&>IZoWfjqM~(T9Wt}O>(8srd+wwq(_b(sY{b9?Ml-eM+-N~AEkw+g=0`5O`3SIH@w*EJx?fbR^CL3p4iIAzvuUT z{C$2uN{7+|rnd9v+YAb8b~jM$<2l7S;BcNv)zria^)Ws~vQ%AsD%6UQ6jQ_MS%0ew zXMI8d1MyDda2gB_g5%vZX{5N#I1aK_0*zTT7<^=18^ak2*HH*h#9JlsQKUOq*WDdS zr3wYl88M~+RRAP_lIpIu+iY}ofUdGRF^X*VmE!;aAOJ~3K~zJ$4k;L@B2atttxeR* z+#F&w*rr-}yy|1Qn<@Bw;jr)4`8JBBVmo%Pw6`}MPId2{bWH}Tz^zjSE)<(|J6%;( zn8CnvI-Em+-eu(an5)$v*1K%psWZ)X4ITf>{k4}z65n6=_Fnp4_AGR@{3&-dF`rIO zyr!|@a+$xIfw2*;xkRJji%IBffrb}#xL7K_I9_>wBHDF4mrm~a?z?j1aOvukKPTst z6J1#qFb4)nfXm@uI1OEhJpg|U-r7?;M&?YB9(4^oz(YE{i3d;&% z7ouI)(~uJtx?C=oFP^=ZzMf5dU9lfzua}-IEI?OP;=P_d$uYIUbVfZ3n9E*FUoL+Q2FYY$J1+IX+9=q$L9LXOa;J4k7j0PkIe6TzOiArvU~k!1irBbzO7mWX5jrdhR6T=zoloNRtlmo zE?$A1nm+5lv;F?quCI1&-!(Gw#aM6e4pnVK|PYVqq)IP-xH`R18)F zBQgq)N})(ZR(#zBvnUE-jmfMyVN(jP*BR2uf*3)x$O-^(cKUbIv#{S&W8;neOUui! z+W+u$Y5e7!$s;)=2i*S!=5rpwKrUyp8gbN61v9spDdf;Pypppu6l!^YCCIWo)9}qV zTMiC20~A~cXT)&^1KB9h-T@w`Xp_e^P?vItLV5y0c?*SCdr+)~b{RO>2N|PneiQ9- z*&;r#XDEo$7=~5>*a74i<}&$B9ww-827{rlz{)f#in4$jeIn<#;6_$qL!&HfCxtTz zsYT)04Y43K{CG=W`(74jS;Xa0bS!V6-4Z9*CBGnt0f0?+s=1cUSl_m7zj4KQnl@7i z3FHbYY1m*S5;1t44!s`8B#bayN8= ziR)=qg*2)Q7b=c}ochMrvXIE7E3T?&*9G-@`e|{k_~P3=YUO#asty*5Ygdm|YI8s< z0*H9!T>7Y*_&nN`O{OywYW8x)DKi1-OsI+1qkutXu0VH8KEDo27p=p+N|i-vxI7KL z33pFF|HWIIDmWg_zD@(*)$rYD=kW01^6)=jb#`_xKLYgS^H(nA|8T9p|ErEecRuOp z=7>$Di%�yB0^9J(oUySG6&iEy*3+{ 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%0Djt4Y5NZk9C>YExmk&g) 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%0A#n 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⪚o6RyeCvbO(aiY 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 z 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%0D`KI(hoF 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

Xl4rOOUKK3vLpq}djKwV;H_nVm}-nE@a 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 diff --git a/techage/images/thermal_energy_storage.png b/techage/images/thermal_energy_storage.png deleted file mode 100644 index 23527fb0913e0154552e0b77e99cdc6b0f50aadb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129983 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

K@K*~9PuLFH8)Oe64ni^|5DSpR zB?lUGtd2wJ*I`~XQa>-^v<$+`vt0!WM#Tt(e4Xc_)76A!ZH5u@A-70dfB|hLLLwcE z#Q_|GKZJRvq9HO3?h&KnFvB9}=BNAb-W~kY0Z_dtK@|K=Psl~5ZNvdIELbhYNtDTY zR)V*deYbd6a`@w0bZc* zMQTLOp-TolL5(aLSqUXL1p(d1(kM6TLM|$3vIq#2V?gt&o>ss$0{{ow;x#ndhun~I z>8_c{EvCePM5pntvAaW45edqBWP(`D!7`5RX6n|nvW-2s8EP_?7=^GJVW*5rn+>;c zn}8l9!fd8t170J@F)SDm2G(;t^9ZW2)v*afXY7mxfMWq#U^{G&w5%~uXBkCK7D1Qm zK&f*q_MNjf3xi?I>=x{-ke_E@sq;9%i4j-A(4s_)CTH7h?+1wveZd{F!a5wrPHde+ z1ckwd_2ExEXtVK8o7IRU!}oeD&&5J|%{TZShe8)=tO4DN8z? zgnQjt?#Pc^PMuEw;ciD@m{|RX%ctjb5U)Ro1aScou_#t{yrcHW z-7ExN5=2i^tD02_LgISDdhE%oy{o2_HFI$*gM20+Y*Vi&K2}GmT{bE9-}TEXMS28G zcZy8m#z{#9Vqu+(;VsMXu5#uMe|W4pBOH^pNOdk4aDXhU);F@klTP12OHYP_MLf|R zuoq1qhx%YmbFPb$U?LC#3RA4=<7c*C;tZ8qWD*3w0HDWADJBQ7ARy4$EaLb9Wehp! ziTR$^_mNH@5ZEk}!Un#UvIJ}g#}#G+h@J6R4whMpPQTM3@GQCOXjTH53dmBlxLWVx znQ1~aoe=ZLZYX8J8hqptfU62XS#b_&RrVxV6m6OM1hAXF9_Jx=wAJvz%m4lNKR>;F z`}Z-!K-;@Z#X*{%OfCXUT994qJCS@UmL)MYz=tDPwj2qu`y@d*j)(n@wJcBUK782k z@5-9($;tWoi2(86pMJjiG9S&K|E?>a;dp#i<$1a_eYutQnkMZ%xfDB_ihubsuG<$A zeo@n8V=qrSKU(;j?sGcXQea!Npq*93HEPZ&IlW)*xf zNO)vuV`pr7JIO81icCZ{3yVS@JR}gplGFYLTkqA^PUCdc`q4l1JypG`?^P+ulO%Ux z1C8@FshB~bPMC2>A!i;JlT9N?^cmDHeaGzL`c);*U~n}Hi!kH*BAkVlqX_uMLjGn{ z0E)v!E@i-e%KBiIu6F2K6M+vtnJx!S;Q>H4#=sX*CMf@UbpWdf$13BMi;x#KLl6%o-6a$NweX%ge4$;Xc$K0W#OZ)&6i z4MJ8}6S6O7WR}PBofTWKZcOT=Hl8DaUhK=a=1-9gemrK%hfkIm*BsaH?c-&A>fZK=VC~K_jVpNXm z>Ad`|%PNVOo1iS4X)2sCyO5X8q@ev1078xR{In)(%5lxJy1Tiuz-Vt;YN@1(}l`QGy$!}1~*Jlabw*mPkulfv~`^UhTB&C(_npfU?vkn zok(ST0Z34a5kMoE1hoO6;BQj^$TAz{wg^>*#UNZ9-E$04VU`# zMEW4@R*VZ~yM%@FO%!Laoj6ENFwhFpO=AccBK=^!|M2HN~_h zRdVWQv$FtjK##vOSU~tKsJ!Y%tZa9Mwt5gUA%mGbiCnlW0Houw;G`1Jb}`Q`A-KeB zBO_Ig%wT7wCOa( zYNZaE#K6?X9-Qev|M>9X)8_>4)V6)kZobrn>}+q&u-5Z^kLdLKaIdx-_xpVTpx{yd zkH<)KV-}kIXwVf2S~1trr2x8{fX*$M&r|t(bT0Pr)vH(M=ckvyUncO2;s=|kL1eLZ zfEM|vl5NDz9*DD^Oe?FYnkbP#q^gAf6=_#lRa+IKYI?smBgu)7XUA})IXIW0(@BRW4G8>cmZpaP#YxA>wp?>8T`*iV>J|y9b(U@zA@M?RjA9pczE~P)3CymR z9cYasxmr(U?E$H3fP9?zrI6(B%XDjT2$ypp@Y~;hSSV9em&*u$7;qkp$!ErrFoeLJ z!8WnB%bt>7sJ}_pgj9nD=rR;w){$om3@=D2suGm>FoW=3u`H4b8oReJlJbo4_ae16 zz*6iBd?LYpRd8-aUhI*6+Q3dMW=sz7e9xDiT|&5+)FjJ-F3oA;~{NrTz?`DKO)kc!E105cKt7DUtACLtM1tlHUr64qUyPA}5uy zI}&nFDT8J=vE=%PLAJj!k%~OMdHegHlc5BhLR0p%EO>wCaINv|z5OQX;6t#{001BW zNkl>gGHNR* ze;VAtdT(P zNXyaYePDV}%C$2ufvWxSey|Y~UAYt2H-3HbzdvI3ABVxH0*ZXN&z? z3^p7eZIG-N!s5!#o`3~L6Z^Js!8<#9*Zjx>P-F)&S~!Al5_^ESE@07*5xUZVdA9w- z6Wk!=XF?fb?DtH=iWLe;qKZEt0FkETBs?aB1f zQB~e4t**$KAy0j>)Dl5ygJ*#cn zj&htN&lw5IKL|H~zZ~I9o-Y+zaCd!R)OJkdY0V*n3Jo}RRn*ioWj@@bk%AG=p^Qgo zF-$NJUe)Oq;Z+@OuNbcJ9`T#vbPn#;T6?B325ZwySm6v+8?V4Z&V=$i$E1AaT2D;Z zNXK-+?Jc-I*F%HJNjl8WITVSyv=N9jTre#mQ{&hl19gCw7@RSYq{!qG#y*zSaEoH* zfW%g#;O!Q>d9acZzzZ-6nESHeVL`SMfe}~x*YL(s|II&MKK|wLrL0?C2GHW>#o9ee z^1nxs!kL;p5JVCL<}d|pBu+pUj2{M1%^X(+P|2zSETClszYn104zLltfte~0QPBR} zy?Oig&6^vi?*xX=kF+d!=ixZd$NAS;mW@_V?yRh3Z8f!bCtY*@-qz;q!Co_MCs~u+ zJvf|hG+hTZ)|ptqoRN<(z_zUAyA-QcS?%q$c$>R>Me$RUMP*h^9|f`^+iHaK6p1v5YFH}vc?bPQ1+^)mvP^63lowrC;RIDzQq!2-I zZ9FJ4Di3hUQ-Ha>R}U8x`XO&OWXK}`2cDNubr5P%5bWC!9qCg?b2USg`%p)W*%LM* z4Ji2$gtB16Ww%HM0#;%S24EVdg89tE&DMb?9 z;Lmjxeipnepd>GbL>(*%y%|kosvvVyWPAdyW3dXaJml@+p5@o)$j>|Tjd?d`YZ&AK zpBD+Bv30|f>*7emb6lGgwRzA&6o7^JsKmv25CYF$@(Ub~rP_=Ga ztH9DR!oW>7cD2UU-0xsr!;W3*QzY_pG;8co#crl?uO36aQ;^B32mpD>Qx3EJsKz_& zvVF434jhdl9F(oWvjzb}n!se)08EycImiI2F$}avX^JkUgj>ofM~MzFG^FYzOYlfY zw9t!zIFcmM#idk~+7T&XADCMPV3heUgN^B*KWK)GaT6 zwJgVB4?&{emsf)8{_BsQ-v9D*>MPu1TU;>j(y*pAAK&{$AcL1%iV6QvaJ7A6~yZg%*OQ5QYddOsTUl?k1}^8E`r%(2&5RGsd8WJXzRH zH4c`HK@TB;W@<9ZD3Y^iXbnXtMKaKX1}_2=2>mnWo^zj^nAp)rsVwWAI`^J?&wEdc zEfrU{i`QR)17A>a-o_eq4YePDiT-T0!G#_2e=Q z##-k^@i*oX28BPv+#B(g$+zKZ;q3Q7bl@J`@x1N>3<+v>3{zE%QjD&+VA9vANZK=I zk`nn$z>4Iv7RZkbCXW<1x_O%_ct00Z0)vw437x545ZD!PE23&B;&~!j0<+wc)BO8? zAAkG!A@fm7Mx`$X0M~Ou?%cURvkh$qGQgIvD`C`=vzW&L{wAy-qd=GmB)&+C`d9 zj>>r{ANZvt?+EbZh{g1%RNA^$(Fsvl1We~oY+w0~x7F7v|GB+3Dpz}0RoKB-?6Ih* ze!UtjqUx`!DDc>I-*H7eL{09^qf^t5PAaa8P}ODSHLG(5Po#WtjWUDbT>xk>KO+Ek zkmB(A7aCDcCe;?P|0=)6W z4u|7OE+JU*y~#@OH^?IqE+?@_=YdVVQI@CHB;n&uzF63F=H~;OXIZ`+CCOGgSX|SP zTcNT2dj~lbq)B!)^$lyOMXl*IS8aAZTCD{@YEzEv95O7sDjswNy-AM9|nWN2xykYBn(q^)6)nxmU0=Kv0gLq7-}J|s;kq-yj$fC2}q6r&MG6AA>EFOx( zbUm=+tV55&HYbXJz+S(6_U^;4M7qzG3<0Q%@e&Xi~TQz zWy_vEs}Lk=6|=r!atQJ6Do-wvl+#xAlvLm?mOQ(AIw$GLJRw$jRpMrH`OVF5Za%&E zFIy^a-v0Ua%?IOg-3}*h;k)4wsGCk_O^Ly1D+nq@CEwe<-I?v#SW>@EEXZ39EPM&+ zU?i%ejhLQ|&x7X<6QT)4HBS@%BgK!hNR1BV3_RtsEBPa9z5FfL#( zx1ld|IdI?(&xH)GSiPCkGFXS;WJuD1C=G&yO_+_@3E5vMM}-c1z_O=Ar^os3?iy-HGYhX@9{>3KW|u65N_V)razvlX z=P_rYB2>|fF0i9cE#L~e3WY}Zi^BC{+2|Vz*;(~8WczpvWJ92kf2vPVt$C1B_Jr15 zLg6(8fOJ9#0O=3VWAS0KyPI6zyu7?zy?XIV=&+uqo2iumJQU#BW^*DxBp$chw%xRL zW<49NR{6A@TDvY|W;Qk;^M*d*b$U8P)N+Kxqw=od%%NJiQ^LD-z1|-V9 z*4m0gpRnNxCo_-$KMTJVS9U=Sj%RZj@r`%K-!^b~1mtKPkRceKhv0xOV=}7V7vf*R?3+@*;3xfJ|GJC4o?0x7a;&c;MiUnH59cPYZO_{(_U}VgiYHHZPO0N z!?q-^!}_Mg<2EeZlF-e}(eylf^!UMQvnNLl1`l_=EXoCdk^nBYIzoO8`LVIJ$aj~L z6fQ-AEEmWDQC`7>#cj7;bLCTO?a*yGs>|*j*3_NC6)6JR-j)Ac`<6gtQ6|t9n$abG zXqXF(Zul}H08hC*%x%$6Znqc8TU7VCyhTiyq4-kuRN5w%-4?rj8><|viwiY#bs2k2!&GJxJFQ?;DnF~`%3 z(bF0$YqAs~&>=?ey2MUPw)`-a7Ze(>VYo5zsD3>f?KHtsI%J1`Edz`eW}Le1COJAF1N(56 z=egO z#0|JQ8GHe>&5>a|hE&BPo3h#hqwa8_xZm3VOi=YX7q+s*c z@k|DuU0;{PMZPKvtC{F4F^pk*Y{fgd3od6yO)1z zIbDqqd|t<#kfzQFVGbDS(L8I!Ms=w0g9{K9#8!!bBPv4$j@*^MNAxyhtuOMtRA&2T ztBB$ev%Vq=mjb(jsF)(EL){e&(ZYZl`^nOV(U%_BFkG|wkl0VpNkAH5a z^`oPe6*aOB&T<)FTW{y>gl(1o%4(v4H z27C&7N=^|k(S`U17gY~!J zDvCCuNHRFW6sAGHB+-=bzgTQ-Y@iBB)S+s$QADw*h{g?{^~Qg|3oVQ4Qc;VhsD8CFT6keF zk3uj)1YDtE5JOgOcOcH-%w`M)9?@V1C9?>jAcIwn!I~x}a?3L|ns#@fA(|BF7Qx^~ zUiDv@d(M6GjIiv|mu;0!oqNx{=f3)FG=4rD?t=gDeKP7C-$AHgJmBK|6h4EV&;i(W zEVHPVYE*U=axB#GWX-A@oD~3eIGj?FcIN^GI;}QCp$YQ3r+`MH8fW1sAZXO z@dbre=TNNECMPQtK1&mY+IkXIBaD&-tI7o>M4^cj4`U6bmZm>2hk(fvwTP2e+0sum z&}A-STm2BodT@g}D$5jruiw+8MiL7b1WFY0Hba@HA7UOk(R5Q2Nlr2y2iqKhW;{LVeMgmRBwtJXS)X$qzoiJMqs zsYJbag}ShaImT(qTbk9hb_W|l{Z`LUde|obwR_2-BRV}=4s6R_(l!o8YKwvuxW~PNG;8lGCfG*Iv5tg%_i$!Br6z?8m$R~CPqU;i*34TtSbpl>KiVE;^*@A+`|xkTZ~-bAvy zy*VRqQ9?LhTwPqSr2est;%H^voy?xG zSGbVt2llvf@;Y^cvYQ)hfD9$gc&%j{*4a+f8nCUHV|zl~7|^pilU8t*sRb9rLlvff zT;mLDt!;-k*Zx!sh@K2^x%L#1i44sv6g)0qK!89wD0UzRkr4TA`slt+!Gqaqxt2(> zu0&_ujVx`(si&axmF%oq@T|in3(Djygy7mI%zUZ|!51uq1Rd_jcO^v^PA&Yd)@1o0 zNB207z^TUObB<*y01rpK>Pgjg4{RSTz3(*pS z;ZX&(aXQG-;AMfnj2KKwpLDV^?n?}fBfKOMW(wn|DS;`NpX|3g`^-p=cMdP()C3{8 zDiEB7LAVCy>P7;hD3AF7`hK#Z2#a|Q$!d6^8T zbLp=JplQ+{-)yESur1A#Nw*#gz$Tr`{m!g2>fCmY_jY&p5Pyf0J^6Y*+MMeEB07&+ zN>5;QgDNh5xA^R{#RW3N+uQf=e>?x;{Nso3L@nncn4{Uz>~uDHx}v9~;Os?jLr+z| z;Z8D7)NvKt^^J$xUR8qz1rwSfL?1d}oXTN87B=-nYs#DeWkrw9NL8)HlLO~J+BsY> z-*a6D*NsJqn0bG}a%$ofg;x+{Gr_O8y^#Qn&_ZO;=DQuMT5D zXak$8t0c83ZB_y|KsLYz*pR3cltPT;>XU%W5&voiI=h!A;y@R6w! zOX!3|CBTlequPwG=UeTw{k{6=#pLWo=TwwM_jDH;STHylO8m{_X!R4h`lUv15Ug9mQs{XP; zMM^`P%2#Y@u3Rj)*yObL-2lNCi@K7XF%<*(0WUO)TJC5GpN|_=B_C_`=uz%l$R$uat<~AUVdugcYzU(3A)*_v0C|nUfVma$py= zW_5!J-j?2MgLD)}i2U2wPZS{?4Z(7#W%mOLIu|4QcQh@h^HDN8nAV%~Cud)6?*97b z$Y8M;yp|Fe1`xW{7vcVm#peyPJ1^$_Fc~ zv)qrwGSG6UV!7S~*O|a=Y6SKMRDB}6V%Q7y;B6h+(Z&~?0u-$+ZF*r?rlme35aHHa zuF45h{R_;U+<+-vxq=c)LDurpqkHjWPOp+MH5ML925ESw; z-($Ii!WD^*XSA@asBJv1ga9A>Bp;xUfe{>=8SAPNE69I9pn)U0{+UHP4Z(nEWG1P} z(5c#=&0fxOye5j)1axwh+zs?ZSi}KItEu$F+^m}Y-%QBP;fo5qw}wXT;;_Sr01hZhAgogH3U3#K zGMsth@Ta_DemWnQrw7;NczW3$71OWIZinr0$(n%4xX)#ez%#GW&>;gR;r*fQxTW?A^#N%ZC53KpsR|MN^-pRRP}BsFs88v>qwi)2d_NBuKp1i{ z9ver?N-gq!6vncpAn++gHP7>nY6Pbjkmh7oi*gjNw9f;#&Bytms(yNuRAI)rFksMS zj6m=mz%nw_+{O1|2$E~}M3)Gz46^Mzx ziNMDLYdBEA5dqmPH0&6dWc`%IX=7yHDgGn`b1L)f@N&TSn&C+El^#8B+Rp6E9NFum z$^7iP{pa!7z5wxko+jN~+i;5vygl8~>Yz)=jtH>c>Cr})eMIWY` z20E?4%sewNJa{mx{wMRD^IiAN(8RH2S=7?G=X}4#l0TkX3oN zT-J5DX_B(H2p-)cS(oy9Rm&TjSU4|nVX-;xNiTL<10k&ipwwAFT!qX8fO?w-wMag~ zT`(TIk__aVUrD|+qc28I1KK;I!d4&3_s6aQgM(3MQ2**9$P!r4p=AXKjL3)V?&I^& z*Y&midd|Y6(~szl2?T{eP{<@owE5O_n<#6N`>*vw)%m*o`Ja#PH*##c`c|&HwwJJA z-jAz1+HaieOaO4<{Gf19wJQ$_{e(THiId1#OrCM>olbJnJGI!J{zIEgJ3L_Z(;KZP zK{TyzQ~ki+p{D;?`_$h@kM%)kB{O}Y1gC`}uiuK{&9dUt%j@4>+tfQlc^dBzyP68a ziG|R~)j;wHln@}erT|2A-w%x#JP1*okR&`WrnE+~RYb{k0_v=sS0lP;Ohm^)5GhAC zu@P4A;kbGoFX;@P2F_D26hnm$r6Wr;fn`tI-s#EJE}Dlt*AUXx=AnK(shz?p>vFd& zZyw(k<;&h;eN+@x^}PDh?1T?j+eK^8;Q?atat1W-dTnTHrvsmLcl&=mA;PL+BC?_y zOa_c0w_#w)1%`G1usQ?7W)oRqi7bj(Bv*bTBc}#PW0AIeNs-|YXzPL@_dQbDZ{;h; z2e)jCzrOr{CRLnE#t5O>^ZSQoGtXwL=GCxWPhM>%-+~ms001BWNklj~ok?8QJ?h{=Elz+m+X~95EhFt)bqNY&y#vEl=PG4wZ zumA$742Ze>0)FTrq)CI`b%d_G#KtaSyB9JD8ZU#fZ{VOJN6@CX7z4pZqi9~c=gM+7 z=Be}a9}lF<8gVv zT(4g`Rh@{QFaCJ6oYgnw`U@(HB7=Z8xSXaF3$yM zz9;8E92~HrAWJs;Y_=mvkshIEYnW-nvI=PGQ!6z08_Bu@;o~iMNyM3*_)iTHf zJ2#$Xl|qodS^6G9vC>gxJ8&EeaS@Kj6Ic=CK)3yth6;t*?<%ZAV^L;HZ2 zi))g=NJ5aJ$L(!5iM_<&8GxxisG%$1zzl1<@E)C>MI=IPvbiHnweU{pZ~`o%4GZ!g z{LMwLd44>Zh+O8lVeswM-$wFklID{<6%?jbS&2jVd_7LfyV-hNHEn#hS}uA=Wm1>p z)$Gervond9KOU9|ic#c$p6s+KX1aI|j!M9g9M4>&+1w%-iyxgVBWjX(8wV4U{ zs>feGUH+AgR4f6H(1I^lN%=1d3BXXhSpjc4G;`mIFq&SWSyonxfKV(f5WQ#G<-_WM zsfD8U_)IPIUhH+1Wj|;gJeX>p|Iik@vr2{Gxv7OBMOA~#2ewFr8C-Ex=Wjpjy@B9{ zY@^V|enaL|nevJtIz9`BfE-3v>H7hIvTS;;@)94gcn`K=s&-{6}5SJ%*7hWwYR4(q69^5%%_=B&`D(X%`}yqt^YgzCC!>FVN`0Ea_-q&6TcBegU|j;U zM7l*BWVX=pHx`X#J~`(>z-B?XAg~E(SUqFk_6zG}Ob_>u(>GJa;Ttx)u;{U`PLP^x zD2m^gLeb4d6_2eqh_OduopF*FEaW{KCS5e$#Xci zxA@iOZXP(LAI%?&V+!lzI$d%aM?g1!gb{II;n^cnbben9|YFoI9{hB_M!(h&`~2y<7^H+ffmAPP8;!EzG#6c#T{8_<>%t*X|P)5d48UYxird0S)Pk% z-HQo08BLC}w#^a{WlIGjgFgA5SF_vy}7yBl*Nfx#^Po^6emqt z?Pe(CoJGcAGK>|`xJ|JT?7C^dztWy8GOpC22 z`$d@R0Y4^DlMu&<1z#jSL2_brYK?3a3sfuePk8{tgNUp?tY)()oz>ODL8oukHwk=&(JN2=)V=HGvQUgQty8&_3h>F)OTJrG)uyidlm5UOh{;92th6T&d4iN3tta#9)~ z7=(SK^dX>Prc-(W4VHC?YT`c)Is`zG=5%GNXr_lEBqxbQi;=uSbe5qG`7`Liu2WJ3 z*cN!@$Sy7U9A69PwL0xyr_I1_Yavg;ssk|KlW6dww^)tRNiIke0?fn$%roIZ5npjf zusP3%`SGy`ae8x6iWjmQS8gz0?o2uNo4aN?FK;gDljh>$X7oNjX?71mG%wqQiB~5+ ztj7EI7JzigKCr036?h4lJke?7i(QbMz|yFv;p@0Kpg^%58v1 zkFjY0Pkb5pGk}di9P(WFryS8Q(D$jx2mpz{vY8aKCRjz)B00IA8sS2+F)n|8CMCA#w#;@I+4etAF}s@QxR^zI%+OLfCme3o?uhn6L1a`k~l=W?Jcx`X2X&Ej3#3d;5^OW zPqOiFOeIe9&E~&UT}^8nSr+wX{(xYzOCj`3tqP}V6Y#RZlnXCRZTjgiM5RSUkQPM* z2BVD_)ePP=TDc?wlH3>x38op5A^}fYV3Jgu*$k!^A^&9VIk)8QQDR%RWLc#;@7#0l z$J0gva$3I3*KRIBHs8%{zAnbgJXwx6=_p;a<}cUf+z2tuW7p<8bi@4VZ5j}QJ;=Bi z@=unY5wU7`fbv25LOo01B`*ung?yphU1&t^VQ8MMrwJPvXpd@;a*?kRoENh%1T z9`OLtcAmSt&9J#?ok!*Q&E|B~ALPB^B(73D;5^uIYITvU^|0C=!q;8J!U*Y=KuaV6 zvfF@Zrjc7m0w%~1NRSb7BseP#cw9}8X+_u3nGfy|>S(?XL`S|=tkDItEe0J^)ijOc zJZ;BJOTl^AsPP5!gK){TZ z@WOPI^54}}nzoa6(nl;7O?WOSYn~p#9=Yyn*ezp`3C*@zGYg_w+6z}2W~;FBu`5Qg$NrVk_3_F!J;Z?_z>0% z)3A(goD0Lw>xX3`3g7?4U?Za0x~y7(l$(;+Y_&fn-iF72qW!TvB|b ziJ(#9F)VNo-lHR^l&?UcNWi<*yjxCMw-g%;;Zt^-sTxJ-VML+6vb4-KNM|=bf9g-6HHgK5Q;$ zv>6C0RjMa;E89b#KkB>Cpb=9s3NqtvzG-O0LFbFgcc}6Dh_-_oN;lJ%iIAfCfr#KrjJ^h3?=lVs{{e{WKf1RI57sN%_X}WtuPLEcf&-#)17Z+dp?yyu7?* z9TBJ!0Lm*Yq779o6#kB@`TUmm`E z`}@y7|NimQ;wMj~+&0E!zDdzB7BcYM08N>_*oPmTv9Dc1vK zO2KMu&;|=6g8b#E8v?p_mukk`h)Yw&qFL&zq|7$r^jJ@p35xPA>o@^wG(M3M>nX{Y_G}zl_LIQw9SQ}aAi{e0fwnl0bpnX< zbVuAk@W|Pxm9<5lTY&=enp)Aub*7My*z}|dkNG}SY0&k=fv|`j>jFH7g3b-=Kq`1g+)L)q!$6dbGu|;T)nGD?lZl`tSY_@L7Vc*;XrkPb48L8QD_C&LdF{p z3%koG`I5L2SG!cu)V2uAm0xlU%vc={odT<%~{^;&pp9k@7LWg z|LP_^ytJTNysYvXE5?}IVZiY#wTEJ%uNiHgE0Urra*KgHTNRZWFFtw!La?XVe$P9& z_|ehLddH6QV|8sz6guOhiz?B#pS+ewgAC)$qE1{_^VboBta2geAbhqvY4>p$RwFy? z3-yE5z9(AfKVUjb4vR_S8pMp&K_eSSQEZsh$0D?BItIb{2&!QSu=!ll0gatXySOId zSXQCLaR?x*1$+<4lM`Xo=wDn89bceEat8KiOn0m(gg^Zs+S0Ik(&VuAJ@4{@vR`9__qH^W~?} zsV)E5CI9+zaI;7kyJ4Cy^80@;C(jzgnU)IHc{1zddA^bZ6T>7=?@*p4+_FLIMF56_ zGieGCU8WCEh4dIuu&fN)Gz5O8iGu`_5{2<~H5U9zR$maT=8N^bJ#!bU^Xu1Xi-q{%!t`!@@9mK z7jI|cAHwj=-E=PVA0(rNMTnrHehnBm5Na>7d1RH*kRpwX88cp_n5Z6ja37am+N5%1{jg+b=AL`LbH4k1S9ETykMkhX;ApXnE=3w1nR9|EjAa3(6r&7W zEYrDEl}t~7_wX`#9YqmY0Ld0CEGP`7j48sDyhHfJ1v>(Of<8D8_zy}!AhF-?Ca@g| zEJ)hWf|77Ho1O37-`mF)kLT~-UpHzIhZc85Jf8HT;Z&dMXtb)=eoD?d#m?!w zz1~b5G_(nLEQ0bTs>!h}qX1jR?ZEE|DTXbRnxGJBo1_G{oUL#f;EMGsF(MUj0l?>G zzw)myW*2i}&~)4y>Ov-x1jxcV^Jzm%?8Gs7K>P$fVPHw{6{9YTB}j^P5Ej?s{O96w>Wf3!8$h?MhtA0qQfi*@WggmadW5NrzBFx)J z1_1%yg>W%>7a1mShgK|2LB<=174c*_IKc?QcuFFk>rOMdJOc_7sz1RW(Fp8yyZuhO z2~`i$v@D?iANOCsdM(262lHUXZc#0-k$2RvoaWz#bCjne3G|iqv^u(LIXn>2Q^nW zIeC=tkn1eVlOvSFbJ0MoN%oA(WK4P15Ksew5TW?aFeNKH` zX2%n9{T~B<`xOqq1^uy~78LjxrJH7fd&%@q(cW(G(}&06kH@$`hh>hD4Z};?0{kNExJStL*yu^Lhv9eY5Z26rHI0G zBYj++NeJ%tx=A`c#85jj>~aH!Wd+WY*RLOnF#LG_?&|H|fBxI|f6zZ%UtZ>d;_+o~ zx0){8Iw|u>{Z{v@lKdx=$-u5Ag;TG}@;b|b!laWv9Ze)O4~jxY?BdgA71V_%v+?Tq zVp2>okoH~Isx`6PBkZW4^MwCI1X8-Go{4T^^pE>~=pq>J1MyDtF-CpkQR0xv2kbF-ySM0V;q1Vw&6Jhmg|_VXB!Ho7a$W zeGzOpz#0`gswxS@b%5~3Z~u?`3=Gi>HZLQcds+#=s0P{y=Y6v5j1}$!+Dr>9>UBcY zESftT<{z^sp;4xIWs4zr)qGmg-Vvsz!!{mhE}2-7Z?Y;r-7GlH*aRl|JqLLc4^Z=* z&uaisa7fc4=%NKyev`Zqr3@~!Dqz2e9g6@uG^a&XgvT)7GRqx+jgsDh3d9p2HVhgH z45P!cC`w^MCS&9V?3a#<2zhLbszgJUiD^NiR#@ws?X2zW!=C)}O1}Q`wQ*H3mE4?c~(v#nur{GvOB@=-W6kLhpGn##EC7S{>wRFgZw*XjQ5e z&H>1fZHmp<^UR_nT!QMx9CmH=B7SwjGu)VtUA8QM@c2O(X4`KD958Qh6B7Z5oZFnNOj$m75X zL*l+@D8Zmxa|DD9aTeoeOvEHfT59-GziDZ!ZppaH+nqr@Mh!$$*Yu!@*Bi6hl=kGq zJKB@?KUTl_U0GiC53+8al(jd!tO`NlMN&+J2a8JMk^A71+tTJoagCTLx!>nf~Nd=$P1_mtnr8&mRp%`!iBD4Xm)UHa#qw! zu7teY_fE!rNZtV}59%PD8COe=TDwFAEsti?N{yeqllQcrw zZ05w(+`9N?4W?!4Btl})H5+wF3}PIou(#JFq9`AGkfh`+pw>i_70#_YW?!?n|>tzS*4U$t17( zTf50_lJ$%DW-LKBxacel1{e7^7weO5dXN>#FzaWdqg#vjPFE_s%70zigS=Q=7$;eF zI*o7Myd#0lL}km!YD6q1LLSu^2+V#Jzoj~sa8 z`IpqkHf(eIdDosc>jVsU3KO9!Cp0ma%?8Z*@f#?Q3}`BJT5Mj%A8ng!TSOOM8Nr0C zzQFD~bFGgRb5%4IvMqsy^ zP0OjVX=;IO*8@AaBjjfXh=%w8YCx60vg24@5!Z1ih-1BX^!mj)?8(*JtE&}H z&FsG}5`dsUm=FPAZR=$ErjuPJTOFai$v3~6BnuVfUtC>ume;EbvDA5yB>n8NTYht~ zm@dmt(gl3Gi0eg~q>sjni_4oLuI$*pYq|3Olo_Q^2X0Ax#t~!f8&i=k7)r=nN!yLl zH0|w9&wAzBG%x$d?|Q>XyEw0AwgYd^0OFylC0 zx8wELesy&8N0^iSkK&Pce*OWN#d&i!6dx z5&j2N(xS46q0P8@VX`r#ndx1xN)iROrU?o%Oo16s1hHcny5mYOrh39GhWwK`=RReo z#uZXVc49|5@1Aq+yZ8D}pL|Ti`SAU3z1gIeufAFB=Fu@s4w(MpG+*weS?tDpkNZZk zy!ae=?5C-*gqTdmtqeva`GNra9B-f-6(y4?KmY(B07*naRNHA9L`TswTSFQaSOZm7 zKmvQJXF+yLAU=HES-<06@TCCIoKH{2kE7Ng%)hsL!;AaN{De;;16Z=AN#ZmzYPf^c zZFo|}K{A$$QU*rc@lKeE@q~wEn^_VyynY~WN!K!7O7hT@G|Z1B`c&+b&rANj8ayV> zmIb4SjxZL-fN`(6QKtN;=}M_bc*#*!Q!jll4QU`G5FOPE`9g;BG@DY1E5kY7+iK7l zwZEfMRt?5`$FDR0?wqJ7=&?wUXq1MIx=PnkTeBt8p>GxY2O8B8+B_1j2s~d-IT+Tm z>27&0Io!*w)?Y z5?osb9)1QG00=HY+3v8@4pGqPylHp3H9Sys+iyk(uSVAo=hwsQyPwa>A?4DbaCs4= z)2v#=qgj?;-QJ{=c`FRVANsxNB3-1tY8+=l?z)TqR=f!hvfN1_CG!dJn2n-N(e4^a z*Nuy)_%2P;n^PP<@PR_S?k<*z>oMxHX-jNMnT7%RJ9#vjPhQ=O)|2t$avdFC2WL|@ z$kcfnCDu`l5P%XA2|3?Ign+juUrP4d00D3NAq!DUm@Ee+Lsb;tr;JW&b;4@K-z{0TX8 z2MkB0h=M^7q3&2UW}dSfo4rBhP#uvPEDkuKj==e1#S}N;J(b3?#J)Pjn$I*I<)e^< z#k7M>(MM;&b3#(kJvEw)M2gjnaOc^;6^NGibrDFq&xa+MtCOz~Dm-}*LeR0Rq+gwI zwJW<7jUf+IOTyJPqXW)0IzS!p*WqzN9dHL^f{HusHVy+7Bw+jupMz*w10>$;!=3!? zdN{m%nv&0*@jrjJ50@P#vut%VS^4wn+MMMY3DHpPzfx={y+R zUagL94(8Lr!|_89uCU;_=IF(IwNSZ`abitRAIFsf^x$VKec=bW{WjVoNIo-G^(>J-xXvrR}D!Ac9jItIR9^-4( zhDFZxgoqoeR?2xgN_0x`B)>Q6(u_EilGKA(m(C1dRDyU}zD21}aio|Ci;r0-?|(ZM zv<3uCox&Q=Z}Eu+e|K!@HB`fkL!`O7hJW*tK;L| zu^H{#)i~{Gc`XW3*yC)H^^<-y%iGCzw_ALcz!q<&o#k>nhe2tLwsyXPLE)Q+Losbl ze=i@>a5+4`ipHz(cD8j|ulPys9S9FQ8!`v)`HwHkxp@sWarSwc;*)5{E(2Dz zJA$Srs{-XAaUc|SplG-ZS`5;z`gh2}MCE&>wOVSQh-3x8R%=KE4rd%erm;1RJ4yH} z8x4v(mgaLRsI*X8%HH}+=wYex3|Nw72A9?;t*PovPm-;$6<(QXpmrhNNYLaSoI0KC z16e1*Pbc@uQ=|NU-D0&?waoVr!#_8_#L$Vh{=|vLE#-A;-2q^qA zEjrzT9%eH^C~Qsl_II#MjIWGJxAK-?VIsK?TAnh#0G zsQUzP1mGtn`7f`p zug|aV@9yt^`u5wO;^MmxAJQo3KMod;)lqA8b$r{ZZXcb6QFs$x^uqpXnJ=fY`F+~g zs&SM}A?OE5nrnj~8e+-BR*b7fp5xE)G)oLnl?ks1eq)eBXWC-<597J5}6WSx$< zjuMid^lvp}^M)0l{NFn+Kdk0_hzRJH`Cv=@RFmtDa~+wvGAZb|#STSGzvXk2R#(9v zvCq*Z`Z;Em6-mAzlB7Td0@Ftj+G2wRd|*IkP<+XaiQ%o{`M?Ls1|bPR1ZohoDB9>` z5y0qPLA$tS1g^Jyw4YWt3@_vN~p8NzwhlO z_2=c=^Fh#?t;gYP9nFU?Ti3l+oy@}10y@D8#Yy&65(?|ME~G2jK~qv$mc&H?2rnSc zFtZAL2IY|iE>rEFn9@Q(O&E*pdTkQTfd1kxZfBXvl0O24$%VV=#5hBp4Gswun3K)T+>DRi#^4C-DL(np;7T z#Ba2BIU)0e|^hmQn`g|~i=%K5!t@5gG`8(Q6zjXuH}g2p!zf;S2>RI)5-`0QQJX&Nq)X8XTs2(+ zkX3Q#tJB%y=qg%WhByBq>Iz=l$j_)RbFrZ84)U<1p6qI7P!D4 z4-%=cB3K6ztA`*T%$h>)B^u!(E5(eE4+c}$g4&%+62~oMw+MB41Z?j-WrDLm=h>Qpr zvUJA^k+MLVx}LbtH@y)pb%t#CE8AZp?!)31M`+4sp}%K-hC>4wOsl3NnL(C>$Xa22 zTe&SeNLyy*Y0;EZV2%vPyW0dX>w_S|d{;9nxhmvE$^ix{PH-(wq8ID2IJUt`EiGYX zvvT-YBja_brZ|c^9u~ZnfD$-iTtx=KgW_9=raY2ffV~LvAUuy5aKK|mF=hpd)S$dF zgJ@*eh$4r1MSDG#&I9W;9)R&^r$`JkvtWV?DQ5?T#sm5S@+O|i!qY|s7$8Z=;kP3C zI>I8MSv(ATu`P6h^!B)E5C{OidimOM6N^IAb?xLIYS-le$9H%CdHXjAshzdWqoc`q zFzEN1`TWUvwRM;VXYijAuiNcpUVnlYHp!=6TI*-&D(P`DIm*V@gQLmhB3{m} zm%5Dj?bYe70pQs`r;EkzIPdk2pZ2>8TJSi;7QY9^8gK3WXz+Xj>_@r~bIs%0mM-6L-I>7p*McfdG}hGGya5B`vlb zo55yPjUy>mqo_5U;dpynNv>$lkR5L%bd1@jqh=iy3#lU>eO{Oe0D5|TiC&ehraUqk zS69+fsVWQMUQf<)L5wZvMqPm(Ed{xH%w}9_B>K3*(^G>3Pq5vF~UfHPuP30Qm zWKAwI{kt$K<3>z%$NaWU(6xs{QD77Tg&}+rn7A8aAVdz-9Opu&h!3$=cIqqJsJ$Mtx1-7LARTw!PYptcAQ0LJbB+4-<(}9 zvzs_x69>iwpcciA=8eU4Iqw}_cHTT{ZY?Wq%j0`MEb%-mp%3cGqIc4bJjI1XGTC=I4wn#xx(gD%Z=2)PI2((uo~~L=L`b}v zAV|4plG$>^JMB`5E()lJSqDzeaLBp^3%PMj0&FxQ^T(tZbf%p^E7}9bU?&VThz95~ za!>2udE1EuCr(`84%@{KYxc8crKHZB#fUxA5seTW2(UyaeuSKvI?LPh=P%ChUtWz~ zeYm^3`|!gbe*dS&@|W3o))^d)Pfoi1+h_iGI?eNLemmbEb33B(O*ZIcskb%DvLL-& z%r?`T$*iBPcNl_kNg*IN5Q2C0p(mG%X*mCO(nB!czmc^hrpGG?133p;s&CPk@myZ< zejp9VxI&(w%oaQPwsJjL7Ct+J5Ur_@h&^9bd)p+DEl<_Z4UKSLQ8P=u{?If_(SRnk z(OFSdU((C+)LvXPRek>@>1b*F853On4DpDRdE4+HG0PQLM4!4MxR?eY!uv@I?}1rx z%BnxAuup(3}Xk;)>6|OK;-(g_F5u6i+&X-5j4m!!BeglfrLke zbePE63(PksED;zcxrj}o(TGdTFd*x~HuDO?uJNF7@fe7i5+f&OAf?c=YN0Y*`YKUj zu7KuJqD&FC5($t1r&|Qyi1>4q<5-3@arUD8Uyt_5e`?8p`dZA&(jFdFt1 zBqN&ZYAXj}$aR(B1PI1Z!A+WK1CWEvHs6P)O{A-;kl%7T+D zs<;RW({fU7BC@FG0>*QZ7l(8OuE7$~i&gm!QXm_QGcCv*)bVTi+~FK;TvQ zRpW}d8Yg9^Xa;|U%lero>1Jw_WNJtSPK|_YkiRxO7*^uSa0vP)s{u^pP#{c`=v@;a zs5BUP<+dbBJT!`p!(r%qkW9c#CAuqgmQ^Q<%VCZ1UPs7<#w$l(v7S-F`62H`!jo$i zk}YL8P3)*-!X-`T zj_Z(UZ35M1R;{EZ4Z-7q&8&PUNp@&mjriGs_lU`F@3yPA^>4rW<wxgCwcxX z?<}U%!)zQ}EI*_=g)T~mX!my<`JmYZEbfBe0FeZsdnIk2_k3ZJWhpj_nBGJh z+023kH-kHUsg_o)Ga;?wWU8GhQRS|#%5F_L(Mh)X3BCAjMZNTZ}0PsPLoMTSzTB8#1-m8JZSn%Xwrf{{X=3hBNm!Iv2KRqA9tKwRjVu*JyA zZgXE6uvp1q5?|cjU^N+7@u8p@?}#MESgr3i_A^J|5LWV-`S`jf*CFseG1X{I8DRa^ zR^J3`wAE@rSrk=jrW@hqXf%5ILGU*~-nt$mjm)pI;)xkftuA5&NG+D3Xu-NRgVF6l5c6k8wcNP}~j4xgd0cQaN5Dou6jp#LDT z4i&*#YC3aq|OV*LiLo5SY48GNdlyhO{I__KfuX>wKV0 zQ5SRTccDvkUK^k9XlS;5*Z$eE_w9+C4_?oK))B~)5wA@Qjm%o_(A8lX9+>O*JFY!t zwe31TCXok5i1?c7(d7|J+(^q26o*;vair*^G8B}`&ISp3Y815 zqUJiV4vTtK6P#mUav-HPAZpZvk%mxjL-cxK7tmul?()7!U@C(y_Y{X?Gorn-Fp;r#sY z`QeM%$?2Pe#q0X%`S}4=%KP)hqIulR=JRHMzT2GH?rh7)^X3gy%L!vT#Wbn(F&uXP zb%XB8q}lZDduD!c2pRhuA+T1*9rZhBj3(_bc^+sG4pgjFpLpNMnt6^tnbh34OY2F+ zDpn;#a@a-fgR-t^9HGY;0|z5O*+lDXCx)$Ujf?AvmIVoolpoN)gNQd#3=JkU$7-e{ z*<)Q_bvg8-<=(nB)~2DPYpSmnf_Cx4X*+GR@wLy`Ot^zrNbebdkWoYLTQV?!yc(H#*uK0W^EgOf!&Q?8~8{(1!<3XNU2_cXm?+G zQ?vPSG$nWrKPfri0LS8iO56{8h~B;9&sdEji)m1R6j6Lx&z-;iUnHL*g#BefWEL8u z+35@n2$`Io zxUc7nvt}`$kLUAQGv+^(*zBGyx$P!*-bA5(!+D|{0@Q^>m0@U~r>Ym=KQ=4W$Dlz? zi4yz`%!aB7I|3}Ab!h%gu75Mi*}RkCUiMHzsl}5}nm1(Lp^iRMj+A1ADq^5mXJlz~ zGMSv0!H(_I#3>uGN2|N$W?`E8O*B+vou(Bi&A|#hAop<&5Y*NfP1CgiNb_q&04ggl z4Cbn&eYW&G{1)=`Vb)f7vB#|m49bt3?>=AXATWCcr?hYs8(mvc#6B*VkHTAt$`Pj} z3TzxFd~5O6`5tr1USw1FuG5o8(~%J8WHLp7g)}ZCeDUZ2BfUPSV2gY{7g0EX`U>%7 zNqQtRvXV2QpSzg47A!~`2RGt3fS-~;F7E)SP0Ejs=mR?G=7O!BBNRd90GrQQxFu== zJx<}*e1Jk-DVo+`g!gUvMDm28|4%pn{7-*p=XN+eeZKz!g7`%doHUEYxM{|VD{Z(r zJ3BaNnuD`tvkM3=#$({}>M`K?MH#DHFj__c(g&ONHmgm3i=XxG5IMb%0WmQY$h#(g zfI<8;F)Lmcq4w*RUprt3SW|;LD`zs;_*@>$P8Vt6Ko>w0VA*N1m`36_t^(Ro+K^mG zaA_+hEtOa9MmO04je%l`=m_aMT216`xIE7u?W%Ghsoh@LC zE3Rs347XKVF;5rN>N)Dj(f%_@M)6U-6wUd97f}c z`sSOrZ@D7*Nb2O%zwwb>e)tz>#ryNcZZn@Rn)wxAHe0M9LLQ$TEqBLrZvHx(anH@> zYTo?xZtZ2gNS2vzZFLzZp+n)YYopZ}CS43Iqr_JWgsOx0KAG~`BPMY|*&k}+&T(>N z@uQqM%nh^lwv{bl<)w40JLDjkpssD>M%%cDqYV`4$mVSmTW@Lz)Yy;Oh0DD;`DbW{ zresY<7N1ZBvQfelU*D$@z<`>g5k`|*9x@KiDU%$uZF_uNwZCYOhdyH%sMKcoLBC%@ zfsD#BQXSU(%BdTPQiu00R`8O!54>k+_!NS(Df~S+%qliz074?|elYO@W11DkwMAdCJ0v695*W5RS)lsp*{wNV`V(v=0yT$1@1Eup8(EekInaBQpe zS4Xd^%?DweS=}x1coF(OupHr9g5_NN8KVpUvkpm(Xu+T7Ky{%8lnL7G8Po|g|4X9q z=F^|P{PG{`%b&eJY0kK%`kXjq$vr~>etfW6ehWM{^Zhw)*xw&tEf$BT>r(aK6N6B1 zvC6Q4uf6*U5ZpAmJPgga$wHN897UF>x9)oWyw{9ZZ$@81 zCD>AMZy|!YLoU}ilE|d2Cg$h)xIJ!J1$;b#ly!U{8UV}}~2?m=c6g9&LNa zg;lTZT0_xbCCe~oW6iOq-EtS5l&6gc3N(`%*crqrWY|2fH@X!Yn&)mS&LRa&GQsKI zX6%7$=s3?+W7nB{lWlGHWhwf>gvFNLkJhd*KSi_0;K&6SI4PM7-Xh_O9szLojA?`? zN7ri(bVP##W3{FoNcE{$C zmpLJbo-eGXyb0<$0n1!qZ2$lu07*naR3&VhrCVgx7S7uiPFU|jH4FovOkdwe@>vRA zRp|S-wi5hC4{Va)?1Stwypo|BE-@;YkxmZF@F*_}NpM^@F)tS!yGlG>6Bj_a>+Aa2 z#l_KT`PKK|e|6O`OwC>X$3$8)o{i~+tq#;0E_Ru<1~|D7@%egWSE$-h&d6yKpo+w_ zr(2;=pXJ(6rl=FFhCSLf3GP{$V#Y^2RC02v*$O}8qUD-zXsL|fp!gu5cDlgcL`giG zsYcSU=A>8&p48hKXmIH_QAV#CG*=r9N{ZOJAg*@gXA%<&Sw;vdwFwaQ4S-A>EmzlT z1y=fe&d8j;Je6!w8=Eu8nM={Lm&n;6I9F@FQ3f=i0m>S^kk3$g)%$_*WEF5R+BC$w z1WL&YiyMGToOnd3Dbk>~_zDGvQ%M#Q&DkU7M0+^(@{w_}9VKsB@TZC&kb&^TfJ=eK ztqA${Zw;q$$nFz|&`a1c;jFND^>{r1fJqEu`@cy35dp}1lT)^~HrcNx!_tEf@v~%W ztE$4V+6oJxK(i7&UECce%QRoX2+BoKF-Nb_u}>&RU!=DePgb+pLBq}b4^e-c+2RT^ zWFIXb{-P;F6F5fmhyPun67SF6ttGYYhBB$iHD64@a5xHG4Xndfj)(W|;eV+*f7Lj$ zG>SW^sDdq;TOHINmXaEGP;;q;g$VmF;ZYqq8G5W2+SIc zLCHkREDXC2{Rn!NJ->5XGpuJUY_%+PRh>HDIp_QCEeD9YUxw}&4JHCSVtI&8uo6a8S$EB7XDdW@4}w~e+3|8VWu zfR;`v{Y;@lH-}@@ae@oB4gUD>{^190k6DV9*K0?cNz-!7zX%~p#0T1(xo$=L*@D4(i$Mg92rmugfubDdOCd?Hj8{>^jKqX7N;4P0gh;*2 zx)9Ph)sTc8mPK@D@`+-IT*S2;%03sa99@(pCwnQzE1IfW_5?`>!H5Avy;jw_BL6p% z|LZS8-eGB!Hc8{FAnSTA3TV{2zovwHax8E+LEE9XnTjxQ9A-%&1V@P~%c=<&^KQ3i zkJkOgcE1O5`l(w#Vn>vBNixVIpH!Z&F1NQA+i&+-@;1qM$1Yneii|U1<`vGPcU2?=dXbjyK9E^55-S-rIDOp=Eo|8|0$>`vPdkJjV{6Ez9a+d| zs{z+hjN!Qvf5E!Q6Thgo_>c1Z- zRO+4EJER>r4Tz2sYww#qCw>eSu#CeU-XRQq!LVK#ReJg$!Ig$B^WcTL!5bD(YY`w; z)zjo#r=Hy#TuAR*=XZUNi^Gf~M>qJr8)Ci2n7L_k&5-b&?h%^|KVZF=B~org#c$We1+{` z1nXQ-Gi@znhVpE$EIF+9QqPAU#$H!P;z7@aZ@DH62G@zhypNea9?_yN@)9ww_aIW;hiG) zY&sBtr^kJn*aqUnQpKKd@EWn4{3YQ@0`o(f#CU)GRwa0r424lRGEp@#4&CC86TAn# z4)`>>_aRLXN!YLV+V5>kE1;#AKmV0e2kRDcd03@&m*ZgE)t-ctd7Lfeu+ zV$*^l{jB$Bog^IvE6q&xjP(J>KF@r`OpD2F>fHCO zEhh^2ErG^flOX*dGfRalp-OTl&Dnm2BktKhP ze6I^pU6~h)$KQi!iIMkT1hiMe82~g9Rw{7I^6>ho`se%z{AVLx6(KetxhWUrv|mNv zG`R0RMAgkS2VtMz{`8!P4WFh^?oH9|r zE>+jXA<*?Ah>k};F**6XPcHcS?e+J>dZ2F1yq+>kbEP8_%%j8S)kL>+`#gIw6@%xT z5>a@rt67&r8G3L~(lH`zi4c@MMVlq9p81lffD+~&6BQ>WPBxiK{*%M0`}xGn8Dm1q5JcX9FQ-UqDT=wo8X zs1n1Wc3!2LCIlnhP3PZ%9he9gLOx7Yfb>OfrVO^u9mnMMNy=@i1x(7NN}T?}o}qP& zky*Cc$I}B|r#%T-9QxA)?S~Kqdu%2^m)YsG=VnGjk>zTmcV~gk)~vDhipIQi*HuN< zBa747?Edp_=j@1bEdc)DDSj2ZrXW;8p7n{662o*Y+H!ilqrFiS+<{$%c*fgTBvO2h)N*Zi*i%^SUgV$i^ zkqxTSNWNUimnGkr>Pqo?1#l^9g7soPXC6&I;czJQ7tjyQVwM**`g0+F(gb#A>!(h- zr5|kDC)4j&fBST~Q~BlTCRf{c?=JUu;=0@2{^9c0Pn@`v{`-w`yxXzs`qei8$akVByNzZL(9Q^F-1i z7a#S|AgZF}lg_wjJgg?gUvK~JE^g*|2{K{q2i4bJ#Ndle;p^3vc&X2sZYjn2QXd7; zsE*8Cx3bWU){!?tx{mgQB##2%aw8NG86k~wzSP+`1J ztw388O}^DA7BF@LVM5paF!mZK z#Ub^`b)CDs5+W%QgH5WlI~YtqHB4<12m6WM%n-3it3jofJ9lLPHMQ?>{1*`MnS~(% z%#fE|L4;RS&9VVIuMdt%q^r65)x1KY>D}anCek>CoRD-;Nf=m`vESgB5DtE4??mwSD4gm1!_VR9jw!M5Or?GoS9&_>L;_gY>(7XQMvG?$H>nHI1 zXS!l)0&C6bptAQJDGYKZ^xh3oyys?P=0&N)OhpE=AfNPlgdv4EoNqff0tk8lD&U@} z@hqnF^JeH?i2Nc;93m_HXH1Ju(#!&rtmG+3n{3Q5P=A?WX$`eN^67YRv>U4oWW1t=2p*BSDh;Gs6t(&5}0vS_hB$V-$~);#I#7 zQBAff3C;0j*kBQ3fK?N0l4>zgUnxXqyu(-!26c^g1RAkgV_777lnt#btG=o(GNtSG z2*@2($Irk1yLOKLK<7IJVHr_hL`{!f$B4_(0P=d`o3pQgSRw8X!)8vCUQ8gD!sv04 z(8EgK_5F5Jx6|tr#D!$;$*Z%gv(3lT&CfraZcoaaPCPRTJ_81ML&nXa545!GO_f_2 z|M8!g899sGXnBN&da(oB0kLm0qDKqL8bhhG-+^@R@)Pfwz8DpAzhrleqGU8_<_ETm zTf&=K9f6=aWw~cXKhR~JjOL$mP~L})pM3G9kBj))AGK)ej=?ewI3s-ffpbpP5aDEV zgAGEpPN!+9?pj(fahT`NNf86zBb0{9GrLYbEkkkugBA@Ti2lVzsKmf3`|r)1h{0rz z0VCw^_v__@7yAIb3(WmMn^zB&DTWF!u-!b8r6#R&mo7fcWmR3ug14NdZTgM|%GDP0 zuZqr?EYP#2&`m}4+4R>FSM`Z+geK(9g=b@2T2Y`}g&GlQZ%8ngvJkQUHInZ{wE4XX zUl<72@9A{O_7Z|CRKh~xTPN8SN|zTKM4#x@FmjZ7mQJx-*bF}tBvy;tyW8u-P+y-( zfE+zKdHmOt)6M4bV+Gt7%T$XwXj6v<2@-n~qcoZQGj0iKRuFS*)1!gndF+EJEE){W$1ZV)ZcaD2L63 z{m{IUS1CChXZbKH)Qa^vedT*-6p=hFRXY-Ij(M5c=K42Ok{84Aa5xcMiNfJ-%@=y! zB3!iMW;edP)I*<1en`58Fq~I~y$QtBTN6kjFpJJ)vk1I?%1}RVD5i?#-iHyM`mV%+ zfa+{2RER7%sy}P&9H<`c`0(|GsC4N?Wyl*_{tV|2XH?-s9GuV9ksr?Vf^W{gzyIO4 z^MAa#y85_P1KvK`oE~kq&n`}mpKqu=_1>%f+tEJbji63n-Y@Ah%xx63mu^*Ky=(6X z;ItuQ@5A`LWnE^OYi7~f!9GvQN|Ts$gnZ<=CJc|K;mH#^vnzoRXMqps+2k4*ou8IN z1RP#kmE)Kzy0E>K6_-LXs(S+5agbwW?cw9eKBUnz8W3CPksXX5(7r~a(f)8`ZcA`) z^y1GLfqu)@3%V~FXi$y<;Q)?kiCEJ)FWENgxmbIm{lSEMh_fjPfCm-(64NwCfsE8{ z773Rw4hH+6h#h6?H5N86A4t(i@mi1I)(Sq`mJyd~QZ<5~BRZ$Ts)it-y6xoh;dqE4 zyjV=s0THIN@sRY2N=`IauT2jrs>x~(3OZej1QJr0s>m)`W;NafEb2K5-1Y_Ng-`*m z@w9=>m~42&9xT)kUF`)G1Mwv_p;0mFyD_j^*rpK{>PNj^OzSa~IM&Cvckg!dm&14O z-hB9Qx7}Un~K z3{N9Rv|Ri7ZE>*(idaMo4RKnv41^jozq<%#kC%N%jur2L0BLFAJFpjniYV60%JYpU zzR~rQ=s*RpeDDOx>*8z6T~j`!q1MGvf^IG~xer*v=&dcBt$TqU$e4>6%$kk5Jc~GET zEieJ)QmojmRsKZx65#?ibbVM=qH#^5mNuM^C%|7=8*MIqI1jsj%uH4oOxmGaH!2U| zRfSWi!qBU7>1g{^=n8#c#7jM;M-{28!o4o9e~sj871V+ylD%ycQywTq4k_Ao)2gPP zuOVK>w=hVH6^a^k_|m(tW=v4no6UM{XPTVgcU9<`MuDIjD(RMV(7RDd~`hAET^ zRT5tfIU4&YIEWznNw1`GpA9LmZ~rfne|#(i46a*!8SM!1ND5V@7eke+CI+%Ge1|Ia z&RsyOS)&kwaISnqL3#)3i<`3d`okTZ`y;?hdOMHa4{dvz^ebUy#<*lW-<3*9Rrmn0jB_L+KG?`GW2$$YZ2|%jc}JD$Un{5KSKC z)v7fVIyTUjyDt#9E!C$*>zj&phtuaIO205pgqD*o?p9cU4u2` z&tbj6QWQ<32g3_1DZz!R=X^ z?M?e^wi>g;ck40K5A&BPa5Che%zAvfi1VjiS=%_!tI*c%Rc+d=V4Lq+!NOXS4gvPm zE^FYBLe5K}6m2Co3oBlspfu+1^&nM*O|_VfJ@O)9(};o!^i)1@jYL~b0dq15^FhF> zVn$WEanEO>N+oH5)lK=ms9P14_+svUjpVZs->g;I0A$5iHx~?zzHVH{3?T#yV}p_j z!qtwYZusTOGKa1mDoLaT6O+r^?KK5B*}a_o>Fm*OZvJ(8cedSbzW&Rr?Zq`Sz7P7# zUAQp7t7j+Y_v;71nEnz7q%z9X?#+i#8^J-Ft5}XR*k@SQXg95-2@kH-z8%x!4ytk)&lOa9}^VqpQfC%cbk|fgeub9Opy^aVhWr|7#vleWG#v)biTNtL# zt0X%8w+VF9SPIZ4;30$-N4k2yPeecUZL!~|`czi>Y8XlZh>V^3t`tt-T|lT_dOaH2 zUmAF=JEHc}Nuxn&AbU1$-|LiC~=Aqp&L zvKpap;ITJZ*oy|M7pAoc^k;}|+{6wvGR|TkVA^0$yvZW731Pm?oZo$(p_4eaWm$i! z?z{J#bI*OXK!%UHIN3FgXUUd67Jhv zjn=sJGTZ1f3Q3v(sSWG*D-#SYAUBXqs(C+TJm$*nf=(pD_P1QN>JjA45e0?v8u+eK zV;_B+9-6o7T47UJSG8>VA%=5@gThc>1;J&qVr~K>63bli(SNxUu9md>%kDXCkkkgY z!|-F;5dBq3RQy#9ijT<-69r#R#e_68f)5y?W!(&eE-AH`dZG83l_{LGvO%Jf{9hBH zWlcDS30&BwPrAKn6shDy)-&t%l1RX>n9Y{I4K|DAtP2TNz|l`r{FErjSTidh*r;>h z7jK2Ip&}_DXx%{K#iEHH5i)wA%!4Rk9CSp?y{ zDYy^KnILU95Ni0HIjI^KMuUb;1!pa7^f0Z=-^U}+=BRKo3lESMJ6A_Lsywzi$E$f| zcrPUp`m`NrM~Vfjv`PmO&%HGl45SdFz!ELZ)Ynzu`yIgS$lG)p_*YpD#Dpe8yr%ZK zva+i?DkoKj(gg5CIC>KVzlDqSl@dsAT+F^&PM6!;+tVJLL{KZoaHG`Yl1%SV!DOt0 z*vg3xWJEol5eNP$c;FwjZRm?AVysfC{u067KL+5RHYxw-uqNxpS?0X?o>lK@{Qyk) zUql9M;pl^RoIq%zJ10K2rzjs+1NU6OKW=ZrTb>|VHyVK;JfEZM%^$~>1ocw3AZ3!6y>2PB z7I&#R2bIT8Pq*}oA`D7XG%za^VUKG`s3i|dNI!I0Y778gK%u{VX&4bTWG7N``i~#& zVzq3}@oG+`HA`69A1M@TbK3*ka!?n4Vve;nu&Uq{U@3a@7L<8t-ck>0N`e(*RSkX8 z^Qx-&4qsLHIRL;YS1zNJ0huBUYu#RA-z=5y1mnlu@BcPi&Wg>!Z?kb%IYs4D=Q%gm zbw2XOKB&MW$7!pQ*py~lExFMS$}#mCDxv6bZ2d;6$`WEzkp^|WwoS_aZ^^f4=4Gks zmQ7LN1v#4MP*E5Ar9~2(Bnk+?3l{qf-*;&%o$4Z9%79O&)2q9ycRJFq zukY`F+&S3){r%-~HZHo12PhBrqNs=>M8obRd4j)2zpf<>5y9mzK&5qMW;L?fkUARH zG16DyB8Y%^L_8xYm1RMb6maZ%+YARGmg0`+(h24cG6<5j0(he|7gnIMN^AY}8>_bV z{Tv;J9ndXDlJNkF^Ump({XOlUwn3{90n~!LL)V^HWH_|_XvmvWN%g=ra!=LP($Km( zy$aWhXN$lvj8wJZQYqcvMxXGZ`1*Lt`ewia`N9DnNMp!5Iz8r(0pzJ%xY9}oXhkOo zcvzPXc@%s|vJ`_GmUZnoegg4R7c1<#J^MS!9o;kpmu@s!&Nc@teGCc}v6UMd_yfza z8YsP17oBoX8P@;+AOJ~3K~&XdeKJV6h!+8wF}#!eCJ?S98Wl;2vt-yD`6RJyPT&k- z!GGSQd>Yfq^R!`vM^&lw(a1#x@f6}FEl>rVPq3mmH)6?y2~liRgHa3JD1W*0_Tloy zaQ*D;+3?-Y#r5l>n}e6Fv;7Yre%U)*ujn5yyR)JYWyVCYOcZ^+qBkj8SpNw}y|1BF zW4-5`$%D!>9$zY_)oDO-4Q#oYx3*@5M`0MoXDZuT(>9D~5D>!h=1ojh-!X&u4&&Uk zmwnh#qTEQ?V%kI&(_GjEmzFJwE~GoNH&cqkI5Aga-a38!bITkqV2AQzy{1af>Pcb! z=ihWHQ&g}(TSvDt_M&>5iWy(owL*_~aU)Q0t@CE)l$4=a7IZ*gY#WI@0!7ps6Z)vI zu_&$_s0G3a#;a^*m#&b$^v02Gu@a+A5t%y2c&bcT!%Sl(ym%_QQOs646_}Z@xzNdv z;@)PjClt8a?DhtO?>7zhm)6kr7KZs_vBUJV@Nt$XB@t!%VZyP zm;KO~GTGE654K79qb2|N&6HsBP2ICXQ`9rie?(V=;)D*e@oyK~98?o<;H?z9I76UT zkWXLUJ-fcX+!vxa%dYP3vV)7uf7R3V-lv1}J=NcFR|KnQDbQN2XgMxS@` zmBb0d8`zp+H~wOK`@30p(j9!Uz1SWs2yia~8pT6r7>t~ZQsOf*9Az_WQeb^RXi-e( zLOg+lH{|*3Rbz+a|O#IV-PZYB}kZ<}>)Jb@r zJZZw9p@EVXpkC7A;l1GB^~sC;S$=kLxUMf=T)kbtygu36JwM*RS%_<4;~I>|#cDSrm*B2Avrpn|!P6gTcb!FmBksO6Y{15u7sPS2n_CMg5fhjPUf))U5(14t@hhZ~JrmUc93Z{0rGHU*xxD z`4C!h`7}{w0E4snhVVgKj9oMWZj**x;ze}v8o-Pdm{)Y+kso$<5no`kbZ1p5Il39x zFVP44RZNwtoaq3z-(y`pTG2c+TdC2jv^M6ZQ&0n7fO)h;=(EAaD#z+nZZU}qJ1`j}ZtBBwHJTq1 zj3)rO7k1TnG$M^9mae$b(KE3E?gIw=;ot|`F8loW4cD87(&QsPagX?^l4<1vXYnRt ztAz7ZMvm<^aiQjD)XezKS3jqqD^dwOG4=228U?9JOGs!?T+9{~j36s!$Sq9KwX zQY#`wU4<^G03Z@h!-TWP{pG?&i)p%H+Zi;%RFYk2gTW-mj?#7-+C zz_%T)5x3)<3}l9^h9S%TCUbu0?@ZEk+iE}b zs5*7;Ip;nUM*=6@Pr-aZ3RfbJ-4FPCOa8Rv$EO1t5K3rfK{@0&whWH_H^R6qfZ7l^ zRtR~$9%~mG312S<*K>CmdRHx7vZJ79wR+ycDYj-6MhrPd)PM7xFM{P_Cg`g2Jqef;oEC|) z2J9q$8fV_qo!C|h`Id1{dv%@A7gitihf2Yo2BRJ3)%#=C;NewPQ52=o0Og?wrGUgp z<48wMD2lN}t047TZYQO=K85Bsz8=vc# zjyTdHg`@M76;V`%mi(}!oQ~+}FhhW#<7}yzM(P=nZ1H4p zx}lN8U(@5Mb#EX8dVb^j_37iivhQ}gX>@OAi~F1T;_Bw(r~hu=yt+KS(w$p z!U&Ads3_Yag1Mq$dzC-u^F+c#QShX<5(pLl+PSVz9jkn--%kReITjjq4YbU+k-HVv zg-h&x*P2S)E)o_Jgar-Oiv6e2FY*&(OQiMP9k!AhfS$>8$DaVRixKSzxM%;E*w^u9 z7DMsiq6UIYrgA=t&#`OiKB2-u>!GdXJq3R64MBm z7F7CkX8U4YbM(Cwfe#bqkiM1wNP+3);||zcCeJDsavAD{>NWR$Nmfs;vlWS;FYcwk zcrERA(rou&FahlP`tc2^ho%vaT+U6!uzXuFsWZ>I8HZW_Q^i0O*eBab%0osk%tqxfP|p2Up>! zK~}K==%|;b;hWG=E{W;(&BL~vU4IZVH|574@3yxO^ZCtaxcpTDcyY&*#1uCPDFAU( zH_BwR&JiZhd${i-%8#oy_!A6WS{4MECK4E*pX9nqqmov$4%C*(6P=79=OH3VRStdj zVK@gI_-?-zBFI8CAMn-4Q#x2ROup~H{4UOcmp2m8XV5wStqr?5lUyde87Q~fnvpRLUN+?uJ zBjOwounW?Noixdf%E{oc3qw@aM4BK{k;V!@{J<1EWm`I;Jrwd4KARu`+xp> zxg2z(A|4ohil51d(Uy#^A5^j8UN7&BX!hxy?5|dih`LFCSDPO=X-ha4N=SLTAbFee z04py5NjV92Wm(9HM^;13@%(W%(pEfx{OOxhPw5XH{PouO-O+~&ZCZiK7F zVtzJ=O2!?FqA{CYpPn}3u|yd%gccHf?jZ8@{L8*OBl}s(bOO{)SO;N!+)_(mOlk`0 zr0yu~4@w27!t5u}6Mn9AL$j6AaHg**+SnNBD#LV%CCTB@;biisFM5ZEhey3}_C)<0 zeS|CQIh!GPffCdx(rK3nWzz#EJ2@UMM~mKn&IR#TAP8@n0~-NEGhqPJWNT| zS#dlh1*gOQFwwmg&CD4&?V3jh&0~ikqxNPu((!L`*{Fu`W}qCtSuSpFuC}L(A6`Gc zod4(h<$PN-l96jGF(g*8e>FN0rV>;~z7`W+={`pZm7(4W7wTlizg3=iGP$h~sUK7z zr0>6teNAP6iezcW5QY`U_+X|;X}_+$K%fduA7rM^ZnqV;!ulGJiLssT99Vx`gjGV` zK#wg=nCpayxA*&Z_Dm9MLs&V9DLe5r8a4EwsZC_NmF&}Cw$>_ydYrztS9{#neGBC3 z4kF|YJ1M@pnqMuJ^Tp!BwmF?9$>VtX?)v&+6Aim0J*ClOi&^{3e6*9t2$EucRAqG< zjs#`5sMMpoole|vNVcrgA*fVjZ9A>ESr#Udq!Xl8km{eM5; zQ%nA+(Zp+xB*B^uw`2LCp@obiNPhssel(0|MAQY7@aQRZmbAOQI&HptJWlT}n?-!P zxSe19ID5GH;qLb3zpj3LGy7lzW^{5QUX#QU{3kX9Z9wm@SCjq8dd#dS;jxhr5GU(g z)EFArBO!-QucRTdCd5APAyEXyKHe0g4XMj`5OwOJZvD2I-4|*1Og~ed;PI)5+VX4@ zDYy@}+Y1qn@YT7v2qoW;gz0nvj~-eNb_u~ni03Ufym48;rtntR9--{Gzm(8fIp(1* z481Bu#LAO8=Y{>bTm}{y}uqD-$mEW*2no> zdiCaZe)G4@eDU-5m$Suo+$b=ab12@ZY|~krh~0s#)q1_oS10SFES#3%-MTn+m?nyg zQpq`dnUH8+sI;8hv05Qe5Yjp_WzA4cO@l|b&pU7!Vhs&-bWJ<>i4wW-A)-HZ zhn zmJ6?JLM+jW;LKdJ@u1bZTb}ZcnJnk{dOn-69bz`0eOhidzlb12784HW{;=tsg>XKG|RACz8iWo(PNzgs5T~#Bpw%m!Cb;wdz)( zP%nWNMl9|~-CAgZsLzpuBrOD$XK{3jc9;P^=%9c*!E5=lW2O643_f@7m2H__GkcpE zo*bKc)!Y3y_g>lVCf7Q6FF}ke+!=8EclYJ}_8*P^QFS$~jbm9f0cRrxSqhSIOV2#aR3jQAybx%iT`)#qL$<;H zpph2iMQLG>H%)mlP`{y_P$70f;h=1W0@DHKV>3O)^r9JhS^s3txk~lWhE%00c5KT> z=bm%!eNS=zb+I{5dcA%#$r5!ES2iYTa`wp3(%O&$J!Al53Lu-sZF-;$)=f2L)QW?~ zg>L@Rf%6a|dY!rJ+fqRze8MK=on*$e9Tt;hx2d&mOM)gPX$qSiszDNwX5i=Aq7sC8 zaBSW`1|}u+fzu=#+Lq-udG#zZ3|3>)OyGjQO+<5>u#Y4B9?LXaEg9Cra{_H#6Y7z} z9ddM{m1fHActdDqpwD9jWDZ{@lQ`Z#T(6B8{71R}eDS>hZ<(EM)`#Cd&FA%u=@4WG zGZv0onEv$i6r46)g43oybXU`GwMy9$3B!>)Q#ge{=r;2Kw(M5nw97=sPf@eOY3ehv z;VO7rLPH-?5)Xy8F@29YSqH*(IpowUYL3yAp4uFVEr{5&_xc$dbk6Q`75u4G} zV!2LC_G&%Y18#(0B$MpyLqe%D{&V}%3wgK_UX!j{CR&dREB`FMEbAHbzaFDVICh4B zsJO*kHV6HQ=l+MPTwF}b=Vxx1Sn;x>~9Bb_L zHA>z80r(RqqQ~G~tt~n)4^9T8MeyN?4ZaLO2v#a~8gv4S^ua97u6nu1OS9fQte;?D z*2Vqo_OMQNRrd79yZNub1Ai>k?5Cs1q7E~4UUez)XvRjXn;Rf-N^bO9b{O&y;5?X# zL{ZFQ*&R1ZN=Nw@ya@o!Hp&u|$Tgw(YPSOv7OmV4S#BtCbTsf4(8#eu6s_!p zon#tOwwGOf)QlXQFmVA?F29ZVHDgyK!i-K<<~*se`^{hxds@nTcxdLLP6TWK+NI3( z!6tLM6rwQWNIW-J6D)%M-kj9+eL1O$YA*f{@Pqz2&x@Q}H%-m~%z053hEFqIM?-NmxF%qs_o~yyGi|de!naKGymmZ2lx+3v~4!kK~htyxlnxX zaw=cA-F*K8iH!l3NZ6PwSh!UUJj;y3xIB4mVs{0@;!9Ay3{vJaK|45RIrrI1V!ChR z*9Tl5V;B%eAU>1I`@3MEO-&8QqBW#El)-j)NlP@WSrSX5vGKWKAhX8`Zm?oJuE;Xm7U5P;zDSqlJP zFPh322Gx}>63(+bO#>C+ENQXJ#4!(L#Q4UtITmTN2y2p}q1;hj?H{&9l9X`4{m=8w zi}Ad_z1Zd3$?rdYC=UAv7<=89wjhw~0D7wt*l$Ubg?h|=j#jJX4eBi5HBIT&p@7*l zR1PH}9>?t7=I-jYxVY7Hxe8MbGoXx93&PBVHmAGz+Cypb`J6Vg#(kDz6|!CjOCJ2O zj7@UQgy%}L~Js4k4CR3OKNJ1A0@yVE90isa%sZEBg~&kQCwP!@&JD8hS3Y?z^J2k;)Ok@P z@$Mvx>dn=#^Z2y>TC6|542N#QTIt_EUVy%YfdIRgV7(`G4F;NcIQ(wn;ew2p@{i3H%hSK!YJCrvl3`4Yr7t z_>-2`bV1mIfr}w4doPFmu)kf;*3f{~rmW(NyJF*>-*2~fzm)T`hAsu=i1FdlIUDf7 zuU?@BuU5^1_U2+NT-`qMm!fiK-hjH38-zgX<5?|l#^zzba}VdilJJ|d9*0tx$=XZC zG$B*NRCHlDg5^8b60~v!KamTpPFVm@Wt!>#ECK+9?0QZ27p9}h{m$48AsVFz#~V9n zngxgUQH>SLduP~T=U>n^kd_A>&I#9uFqFwMnLFSrtHDXq+uQ+IWphOoUM=8H0RH%? z;1zrpT)GeF74ORr6JQZlxy<8ueU)_T?a=KTJMSsp7uR=pvCHv1$^J-wGJnOvA&9|* zS&YF5#M1V$kHX8WAPANtX9Vv7`NU$$G2*7#0K(IeXC(SH;bRfS9TL+LO=z~L*?8XR zF&JTd%;>=;$b4JJcF##o zzfMGd?4E)$eO5RoZ`4`5d-xrGISn!uoN`1xw9J`;A?9>zeb~>O{`P6N-@|{*cX##M z`^V}f{xbjPum1)DV^203!OdnNg=_70)9LE_?{5e|!0`2=3ml9A1&%#Ke48c1*RG~?Vii>)^SU=xhe#tlvFK3Yq112(dVHlCtP#G3KwZOqKXftg{Qy<(FIEHQE zgq8!_w=6-MZVZR(#hPigrsn4$Gw`Q5!b~clC}gd*J#NlN0Fqh3uWet{nhh}Xa%$;{ zNk^L>2=0U$hf)f9@clNv>*5B!02rs!Q!0YxUp6TR15Wv<@TQv*dnpl!PbwuD;u)M) z6BE;@;JI;M3rtW~Wj)fv-Q248j}R@lFNf-L`IyDK;*Z~cu8Ml>;2qGhODbe@ZT+en zhJ+vV-wpp*j?_|GZsCd|mKF*SmrPTcedtUj<7F0mgocrLEglJ*g%)o@-ZC}Aly8jb zcA5rk@X4NWbjUbD+*8gMaB}1oKXWWOhudxC9`$4%zhS%HS>u5j07ha)BvbD7ngLzb zB0O4>R#_QIk3pD6gqcymNk&R>rDRCql;h7j=jLE_mEwnS9V6Y&}F8CkJNE;YP>z7uAYHux04MKAdXg&6i4{ST9+1X(r;< z$Bk`SYEh*$!o`qu124IWszmDYIKem5cH3v$jms`-HGI|v03GiQiA^(oEnVOJ-zMen z9v5C>R-76i=H!hLKXnR#qK1ciR)zdsV%?{ol6p6I?yp|f<5GRI9%lsL_4|kW`{rc# z9Dg7E``6KA&t9Se&V*v9lx$NowbW1XR{(j7#Uc?D5{pi1aV09P7|m6EY?Ka}8@WGA zMtA5Mc}N`vx?<=TMvv)9+9n7`&7&HGKTbJg@kK!JFXSI;*5SE*Zy^1{L`E<&$x9qg z0qZm&d6CWg&sX^hk%sJb+HC+*Fu`3}%!ogP(Gk8rva^6p*3KGNth_@W+=k*iyy~I| zx~~P54Yzv*JzwAn@+GPe=w41fP`POF%W^Zk<6C2h%?* ztKNLRin5!V{pv>V?1OdZc%9wszRkDs{QWaG9@Pmt$ihxlw;>A2R0E1Es$z{)gOUjJ z{D?Z06sS09Y{0NK$!}afl;=>W*7Gj2k(&=ZgcB6T^$Yx2mgZSST;&R{Gf1Fn;(t_W zgyE`#<`^oGjGb3&rzpuF2h&PxZSWr;rGYVOc&Kj{ymbGu|8tY_yT3lBj#)7M9Dr>$ z=kPr#5CZ^~{W3Vl2k^~8oxaK;l+*oo|4Wz+l&5(%##I{a`u*){v;6O7{mPr?d3+ld5FQ{uEfPrY}6G7Z(PQX zIenxl(V+_HH+q&S!V*uG?Hp^szLUv)Lf}AhEy4U$4XU`4J@H>zmFd+lA57r(u(e2s`i~upX4`ED&PEJdY}y)Wjw!Gh>Xq z17#ouqK>(1X{6b%UaH!REXdtnw3SM}!i+Wr^aoD}jYq!YkF`|PREq%A9JONo{AC1N zyY1n1tfANfmIovk=S zXLqz&DO%iH9RjC9mUd8(Q{00!8fv-`j*U}FVGi~1<-|%P@G9yUcn1K_qy)=W8;!rn zS`HGRpt7NZBB0k@Ly_ihkCc4g z(R8w9`Q?7tMB9k%z7Yy>%maERK}>uGGalv$DHC7LY!KA6A1bY!MwJa0p*fU4C@yNzVFQ-ClY68uTxyHm zHqZfpm(o<^y*H08xXmwv5TV0li{2lJ=)XU7%=O2)_O{8ck&YQmt3(hN|Z4ttzSoAhg?Q+6DnG zT7aLEF4}C&pg42iRqaqg6G>cDB(2eud|1!fUUtS#oXa4X{H z`Dwz$gN%@&{yg4PDZq%|Kzx>gLohL~<|{G44Gw6@esWX|@R*wkg{g1dWtI{jC~Q_h z)s;$&6@UbX!+fD$H`j^q1BbUffZzgvt63DtDU8wNQjR7A1zt}Bpc2#`~^(}D7~c&Br|FpK(oL)8VC+AM>{pW zr1vwB`tjqt+=S465UzX;S+-Lz_1_S)_zWT|)j+T(ATs>VezZ%==`P%yoF=Pp^ZrBn zaKBx-$}|qX{No+*S1cORVUqUc1!o{07}T#N1ju3`WjG}oi9jZV_{&-AO+0(q5kha4 zq!s|iO!%;83N$kjCQWkA#hYRcnhMvr@=1%;+FgK;Nlk3_1TJ{Rvs( z%DrkFx-bm_D(|>J(H#w4Ho#E$C4_EE@R{px^nB$IX^t2aC&EPl>^e(1?#SHa;D-N{ z%|3jH0Iw~K1y5<@iBOa6WCR3m>51u#QH^^Ie2?f)fEeQeCLgA0tmhy=zg8yD zHDOP@mGQFxXa93=y8@1qlj+HuO}cxD%j^5idULz%$9J>1t0C3DH zyh4jq;3+&beJB-)WND!EE>M;<1Ku|ksSFZK*#zhRzG_Iw?`n7`!m@?#5!agG$p!^;h88Fjcl5iUTQx(xhv(-oRKeJIB_FL%Q?1&W!E5qROlYi;T+M>@Q>% zZCX`JWwk~Pbu6Y~BoTdiEyuN{1fQv$vTY6k)4s!vv|70#@%=x5O<96H=k3Yo{dTol zl+$#+Tbw?5;b^(Ok5AUw{CRWvJ^J!>O8mk1_Uxisw{5jorSr4^UI5Q$8yfC+Q9~VW zeU?frO(GE$cs7Mf6QpM=WH?1y@gzaE>=|?E^kjS_t5I|zCGPCn)upz`2(e_KU|ewR z7DHVFz6Qn^B%nzEJFzU06|B#W^XlsAO1T)64r$ZI(OF}txO5)wkOfKBaj|$wQW6% z#-J3QoY9|$RXdV`=rG2ZywHV;7N(ovF$M?1?25m^RN8o9F9cQ=p;`p8=@+O*JQKUn zajLU8LYYk=-(=3YO6ScO*Z7a@)bjn^d(OS*-XATkHgdaEp3U<490vG&zTQ>+m)W*&wP%~z zW4K;j0k}6yxR1hi^; zh5{gEmRh>U{GVdzui*Du#By~4J|V3P$BmTrQ2~2m{-P3b^db*#ccjcJRVr5Im>_Q~ ze(jB9NVy17Kc;Pi_Q~T7qd~xlfXl=*9crEN7)Jk$cG8+`Z#F;WFr)eGKCLd7>*@9F z4ZGm(=VKV)hu#)`SGQc>)9{@wpE(l)Vc3Ottx5Gm(k~z&;sqxuKRo5U1VsL%?34HM z&D8O@QhiV)R#3*{No}M|#kOS>&7l^hLkJWahevVc!VWbm-7NPh!A~sB>;$D=05*1u z+cHX3Z|A^(L#`*5eI$99gCnn8B>f1#@!2I;O5;YEpuH=4cOt-IemKW*72){J8)j>| z)XmT_9{tS1#8LN`{Qc7`_LyVn5QJ|cz`(IMx@ahNcsrD&Gb|LiZyZPQ7>3DhMK5D8 zmF`OQbC~WhynflOgv)uD_ug(6fw>9eZE!T7KUag7`M^-@OleoomVl1Et!pNXnGC1*aNM6!$7XPP+{@CENC3Fyat8!actcqBqBknN$|tXv)o=Hcz47g~*&DAHH`Qu5?S1}NI3Bgm zbe*nQX956N&?|RLKnhS+HbN(9@|1^`LR>SY_imCsAq?9V(TSSBpi=ftmf5Tqeb}5xXDyTV=*ox!i=CrVtdu+}2@PCiAPqP;<5Y)q+74F3PBKZ# zcB}q6O>Ck-4#PR@N`IIL&oza!u<<*UrS}4CI1rS#EAlFezK$g39&``8G69!>uq%Cd zcscmXy-ebiVZ`DL2R%AH@(z|hdSZbQnFlO148KRC%igCEKwvx^#o=)jhuihlU6@@g z^Y}Iz+=W-$aFNH$-uz&96J_~qma&&3kDOAH@7wJp$wqm8d2_A!ZpTnfQ*zD~RR#|D zJfSLnhk)7EGOHk#NLi?G!CkMSX{Jb^a43ERkCFjW5LguqOa}tn6MBKb3;S!LQQIm;Ya}o6me|CknpFDY%23ZkXmdP@G;ToC2?Fw(G{2> zpzJ;|VQU{Z`{2?wVaGK)^=~)pZS_8#4bpG3bTnS4(@}JlF1Opkr{8`*?TxDGK7AR; zGboVZ8%CvKlvvAl&WOMehKmw#l0KyZPo%a>5L;{b%sIhxB7!hsP(J(pD;!E-`k%wm-IIX-sl)o@_<*;i~nN@weFWhtq2@Q)}fAA5(o@A;O5+Qtc%j4hm{a1Fc96PTifs=s1A$ zlAH2~8;k}d9+G-Fz9kcm5q}w?<2XL;y}zVA#)A>}v5li33&Y1OAKyKHkxjF~D4c#9 zy*bP_@$6r;p@eB8blmeW+eqAR%V??Gv zogm+~i#Y>i&AP2K1<6Nx2?*T5Pl_0ByJm6B;*TNa=YK!HXc*!hV4svC19fV~zV39S z;-!h=Nm4r}>0&rfv+aI9uPz&#`{i^pSxwjZV!gZxPrrU0j>grrwpUc1nJwbd0T6H< z-)9BlByEs>Oz8e(>UtuqSd1Ijq|a|m{Web;W2ovH0o6s+-@tYZl{qT*_iJvUWMjvQ z;TS$SMHouAHZ!bFizE)O?bQNt1Bv;{jRdN1Gtj{BSl*>N6 zokq14{Gj5whUW(iIt~K3V=I7o`yjh}k|WX2=!s661c2bFX_NS`1z>HvEW9)0=C~T( zhG=a|G=|foBX#t%5@%f$A=Yr(|J4JsE%V(6so*<`t{Wx@q-$teiKSClYNpb-i@#BF zlI_)}X(P$DdbCZKcJ=YLlP<@le@4fPjD^n7oXLbv91Yif+sb>gv5Ur zg%G(FG}xRp(@7I6i^UoM1Vizp*#z;o8>qA#{C_+jm`|;Un&U+u%habfijfxo%9>gB zEt3MsiY#=FPV!}ZH8&3PsBI8D$u_#8x8G&tDeu&433vVBS#49;!br~yBaSvbmN{wd z2)@1~osW(R*T<^AFkJ#aKth#(51a#57YH5hs?62|&-3r^pMvlo7ox#SnqL@2vPB-t zaJY%Xckdp)p8tOSK8)TE{+bUiPOtLg;BFOW^H~^X*Q@L4v^yP-;=I>2V4<5R99^$E z+8iD)|Hc{+JYbfTjBVb3@p3zV91K>gMVm1d3mGf155l1pJw@sdeZ3{#-WT$#x~k^z z^uP`kW^^b+2dh45rS;}d%pmKWnpNAY)$6sQl_G7N?8!8hvy%LB6aumgDAFYW9S`>7 z*d{)`cn(G&3R%VcVSwDM@Wc5BfqV_8q&x6HB6NT)v<*!PfS}+qMow>?9p6M#Jy~zF zEYYXtv^UPLd!ubFT&3CV@c3&ls!pCYIbDuK33ROtHp5frfQTDN_nxb%()(O-1Hc-zqw(xeo!a}=7_+e_kMG{O$s8Llad1shqnFTx5_dKk4Dq!rEtrQgu z23v+T8emf{DS=aqjkLB6oTfXHrKXi>PSG+3P62kLvpA!iaqbFb3y3KiU$g&55e*P% z6k-Q9+`<?8tC$2T)tq#uE6P;svcB~2za@ci{+jcODF}%I0bG7prd<;{XcISUZs5ec3d*b z<#7o;G@FHgjONi_rG`-*G~$4~7F%BqxzMZq_JN2lXI@wU0l-5l0uNu@Fs*|Ru6x*e zALA6f>{Prg5N5Fu0Q5tYeH8rIiNMEo)2FuQ7kBjb=iOjC{OtFG%bSNAf7H6askd*U zAP!bnw@P#xUJ-E_ChB}M-^B5<-=665IF93a>R;Vkxip4`n#}J-FZH81TCbdgp4Owv zBJa>e5fotrlRZpMT8cy5gNPnoU{{xsI4nE?{)0+o-!m&{U9g+L+hy%}x41{y3Z3<_ z*D+L9T`277x|4BUQ(_GqRvc(9^hafSK}>{;KcT7gjPc@iNjdz0e*nK4vb7}Z8iJ?+ zF6~hHD4B4x2(2ME8q;u z4olp>lKyQ|SLB*+D3b!JnUp zes)40AJPNfJB0s_9()dkkOITA;GZXVcPA&`zPIm2KhNs@D|b1#Ty)pz>BECdfsvT+ zmxpm1GbG_~9`B9Eb9$Z8d~ri{VB{}1>Ai?bPVOj)g>Dy)j`H?=J{lz-FGT~F$x$3! zSjBZ@c3tTU_Pru%)att( zqE2i=REy{V7iZNO_k!th+My2_jMs?rC~Xl2JA$VVWUZ$c9ByICJZ(?egs+z7D%f8G zrjgZl+!Rp=Kw!lgLD8u2!#+f-&~p`jLJpf&3N9~U;Xqh=Gwr;cHvU~5Tjiob0HkoI zAPrzQH&0izFly8yR*PmG6d3N;)mV9PS^7iW$ITA}Ll+U!Rj@x3xmf?}E8g%3Ee2Vb zwP`*eZwR@0;NzUo0B0ss7)%zuhmXHMKc9Sh{{DROM9|%iZhqfhUZxLqR}U`bWFF7s z%iAOz)h`LN^T!{X!C>>_?AIWf~j|9!su^ocmhw>rKyXf^%Qh3gDg z_ouqQCcHlS6!PYS3xC*+{86JR?Zv|&zN#8$ zle2LZGDF3wu(^?6CF33*CkkVwQMV!fab|TSHbo*qv-&A&A(o$4&- zx{jSgQm34)IB0rs;)SwTa}O1s`EU<^!{{3_FYnA~9Vkpjh53Xi0A7%z@DK6D-uo~;SEV1KU^;B7vD8ugTu*1p&Ii!4R?85!)5xF!?Z{HA@ zghla&xK>dmjK4A2MgM^nL0uN0!3ZaYp| zAs2O{4E=@$8dd7{N9lO6YAi<;x&yup;?eCo?DzfgV(@e__}U&V$CR`Q`zH6A>Dz;O z6jA?WdO5d}5%0=)Am9}lhD8G6^$bntS(#`)-FWCS5{ou1lXod9lv2@`6*BLwwK?8t zHjB=LFz5z4c2r{_Bfx0!*fL#D$jTao8cRlR$tvY~c^;ys5Sq`1OWqij<09NM6sf0U z+opObPmeG+wDMSS#r-v~iflaxO1wkP#JuDHD;8LJrqD_VJbX#ZEX>#r57A&LpK|v2 zax{0Ai%|{|#TaBP1pkNy2a!$R2j)=Q%_%KR{+9lA{^{=d?&SG@cVT__GrS!6-TKv1 zPq%tw6Go4ZXJIm3Yy&^)(o2OCr`8*UaXc8s2M>9PxbkKr<{L}4dvOAbeI%%)j{I;v zcvvV+Q&)6{^;JcdDa%j+h@lZ(m@+|6@}MxIbgxJz4`QRuw#Pmj1LjMjC`5A!suKVZ z-hcXKNvec!N2rtuK^F4!1W%O&(kp>UE8ui@9QK)YLV&=Fi%;jog3$$m=FAGLF4)7x z*u!|-SiWe-VLDE(5`S4yE4SNZc6$*;+ayjdy61m}^>C@vYv>jWI8;BVo;j}URp3gi z7NKDl|4-EQv?j7=(NuSJ!~D!t)o;+WRv8N61(6W4s89=W@q$PofouoAL0-9W5f@=f z7tPD!K{ojUPo#tTprhz6j3m%yWT1K2vuK*$H26*CoLhN}ba&Kr;-9*nd(OS*-g-xO zDUIZ!^=iXspjCx86wk;(YaFX!LeKWZ1PH>1!!k!mrY!X2%F*K zSgGXzXeVgq(L~J-Fn+bcbB^(xi_QO^C*%Vcb>bJ>fdFbimA}OfuwjaO)a4bn@Ng5K ziOb_(h2Asb&$pC^^!9Pi=tzMFk}=+w7tjWRHUm=xuw+ z)3RNnND<6c4<^g4giuzd9k%2lle5_-+w2?&+dAu(^VH&9a9v;8R94PM3eBF#8b4y1 z*b0bhtnvNhMfZXc%KiW3c@uau1S#C-d7w`qg#ctA_$=gTM>;rGu5_3r1IppQaRgljRPphoRzVZ@3@o%zoBa0bX^pK~3`b{=@e#$j4W=?eVu>Y%a~y_Hr`SqrrOI zA4J24?y5CgA@HvHi}0z~PrkL|&hbO($sZsFlc#YjhZi^CLJb3HJe#beO{+hgm5>-r z$YSkqvjJp?V-z^*YWM7;w?{I_#<4aj5?9Lw$+yVOWkQ-Q#17v=$~J5u9ug+v&a{h^ zt?3#}kBY<7;xe#I)39CquX@p`H?wtdMAHuV;rI8y{x0Ec0#Ct}m+<-k03ZNKL_t(B zt4O7YW-rrVil-S{$8r3WY{CXqaDVPTJkMt8IW~IlmT~KQyYv3IGdF?M66}t_DHZnq z92Za76ujmn0c86%Dc~K*9%AwSCHdYX77>GY`5La&YWJ^RBMR~1`x~M!ZzC#L7uQG@ z8J#Jb7BMZ0?fB^bAy4?YNZm(+R^M$-yHX%Ap6FS0k#1AcwXatMl z*oA`3U_)k@P`|V+kh{4KP5Wsv4{6kK`3Cfmnh^trNpq2jSRjJFtmwTI1iav|iGgnz zUePrumrc9Q1)z<(YdY$@JsCBZ8#RFl8MJ|Yi`gjZ=HuE`l4IVs8(cLH}0 zn;D>hVUh&{Njcdj0TznuUQ#XhlZqnQ4GD~4T976clv_5- zl`R|~#v7mL=dh~HK;@YP}9XSp{D+FS_*Ra~-x&rRqn{66pnvp9Ra_!V^U z{hzIN>-J`_+{}JCZ;X@av^j2_Pm@9PX*8RkN23Iwded1sZoo~ z0rz?bKtQW888IJgD(MZI*zP3N;RUz z1~Y=Pbxq3@*}ztXObZilaMYi=ft7nE&X)89a1teJ>UQe6k zYJfEyC`6Sf-8)IQ;B&wZC$O1KZI9pViBX2l;W98&c0|*Y&obZz?zOAz_?>O%p|oA6 z$Q|4yjP>Gayr?(krR7FL1-lQQ7SqKv4(8Ehm^{br_s8+vEBEk(G_aU;ZUKGSAn+yOI4t_D%3|J$rw5eMCNwZM9FnP<^J07_MZIEGh5Fq6eD zJv;5L0c{Mr?rom>3ZZ8s0DCSS%>X-7e!#VR27eS6=5GWu6_X#|9e#zC5coP(%TN;`&wm^6J^E~r&5kQHi{E<)Mz*k_dN=BHOW zq+^xqV>ABN&dyE=ip&vf@WFmY(2tP!W>?ZL*P5p|_&=tur#Edh57*#{R6}jQI}os8 zWc7d$iqIY$`CxHq#3Ce+dR^rkr1-)iK154=h{7RK=CEI2S=7jI2p~9&R1IpRLUL)l z=^Uykmyz;K_IX}stF5LTKoA1{`T6tvXF0GWhl1P5#7CP2-?mKD?6tv_dr)q!VA_)L z2kld3F^lVBoml?;==j#^d!kb{FjGzdVjlHa9l{ z1U(4WA9^?ChbcVI_I1A8qO*fL23EC3V)JnFgeNH7;V{dYH@XkJVHRje(FSD$b`|o{ zEhR=4J{8c#qzQqr)71je6S9p#$Ak;$l#UtCQ)RFr=qy7{#_5b(9WdDa(G9}@Jdyxt zaW1%4c~z^*0$wX~m}%8NjjBBa;AA}wwk>@SY}VVwbQNx4uEIaQ1>x<;fD%C5G4*4y zEKN0NtFjM~5m^$ZZ&|o)_&+n@2NXou%^HoOBoa!*LD2|EZ5zp^&XQaXrh=DU2UMq$513)qD+p6q?6* z9B#IQIDGNbPckQPXgX$wmwo`1!sbe!D>HpRK?!O}n*ls;Df8A{Be?>5A&K_{F?!wFC4_TL56-HXc zse?zD#9$)LC@}kB_{HH;{PuWu21|1O<&5>bPvL4E-}aZS_~4*7$*elP%lZ0~w+V1~ z!Sds2=4KSC(_V0LeL+&5Psii(bbg4FaUA3$wKP&&&BFde&>v6UE^FP|E0$5gq()@Z zxJn}`3mdi}`w0+pOt=8tELvYX!cmb<(ICv>!*ejoEIkWGnh&37fy2Ta4w+mjMcp3_ zsa#NUWcdYzeeLH8xNyJAA5Ek*O6AV_Gz!)&dnGnc&fy}Q$J@zzz8q!y_p8rgCm1CD zSH3mN$Ip}UW&yzu8&XmLUUI7glqq`~uc+}FSFj_qbY+&Br5j8_HwcKe+AP(eBTl6l zm#-?E!z)q^Lyh3X%o+|(9;a-wJ=|8hMZ_T92_6_gnCwgh9^#-W@XOHrauXwz7gx)% z^+3>gI2l)tDhv7-Q1EW+klXRf1V*{ukM4q_!d$DyFw4o=Bi1B**%9P0ULk*Dmz+_-(HVO%Y$Vcti4-r(uX#mYk?d5ISzhwJ6zC1FQOqQLNEfT&OrdKT}n&hjGw&tyX? zv|>q>Q|XnirIdU&B$Rx&Gs2tq=BK0Zbn~>FJgqqZH_v?t<4ySG+xfTmgGm)%iNI-K zFwQ7HZBEML<)+RtDx4{#eX=nC!S^dk0q&}iPFE^vh(LD8G-Q1Qp-2W!r_-rfjYwJS z?(gid^};Id%VLn<=bPS@fRTqv)OJH9AQ%OmR%N$9aEFTOkhKi*W5gZA-L03 zmXqmVxTS)ZxRU|cY(h%9w4K~0-A*=ZFx~PzWyJlGzi{#1b333XmjTM$3!xCO2F4}^ z!bW)Dc79ex;c+o-rW?6e5p2&Lk~xi+OmJXtnZ?w2$z@IRc;BmQo+tZdHG(33H>gEQ zQkV6za+P&4UjcHkbC`X~<W9o9t}Dd?PYV*1BGqJ{k%|&oYA<$Q^Hs1PP;stSC!?~l8SwWPFUc??58G=Rvac=Oc3M`=r+oCST&w*`Mh>3QAsPM!UK%+#>ybWbK@WPrl@sJd+`Y$LH0*EI87)`xJziy%)uNIOTm5cp=VoO8Ks z8zJYp9vNIP_rhC_4omE@g)DUS*0c}La&L3md{_uJ zm7T)rbaQ&DJdA_zX%ff&DIy;1t4enf6)dZO2MA9-0!6h7viMf@nZhaHIf@}UmzOP| z>mVm05P3!lAgx6bXHv$th5G+vnP=xmIF23C11_#-p`?B`j_RoPCgeb^( zpZ(NOUJkRqT3L>Es53868N1HsW#_6*~3`QL)$?Bwi$Y4UEwgjm*dI@$W)gT zDDu9Saa@`Fqm>4kd;EoAp>PM965i2ZY85(Km;gnNn`bm#cSWmNT57*No}Zn4|NimI z?IoN>c)c9A7OuN}isSO#e~G%D) zzd?7^#zkr&qqPXhq9L340$mgxv>qgiG7JckfyBsz?xx>cG}4;~`6hGDHM|K;=bsvr zI^KKEz31LvkK5knGjB9|XifUp&*yR6oBek`O#EIyy7hwMrWW_(B%iC)o+o*$F^o6( zOShvzE{we1;&xUvfiInzS5<66NM{aZAX5rJip-!JmK5L${6Y@QLjfPNsg4_l6kPzQ zeb$H-A~fXShr+qw7e_Q3A@7kpsg!NG8|_|&iq`T2#||r%sJC?U^Xb!UK56-WciKO* zl5anrK3_gW)x4cfLq}SY_Yrd~iH9mc+#n~^@kA`~;^T)Ky2_-PuQr>szLX{F-rQ8# z|3K7h;sa^NRT&9SQg51Nn)>sNoXf2Y2zNC^Igmdv)#h7{Wo5txMJ?~rFWzY2xnAw= z?y`oDOe~QwT~uT@g~^jHAcVJ#lPs=2hdu$ozt>9y#erzszY$2UMbmC~>{0`>A17TA zO5t^#lush1b|B|=AyDErzztHX1N6vxJoX~-&y zWK5qHnDoQ&I_?jq6}6J{;<&%rkOO9h$;L%2 z3(5V%l@E|sf8PgK4pQ1 zMj3zsM69AJR^u;6^e1k|vM3w)8xn?WEW2iRvI%HRSgyR~RXBbc&t}tLc{8PV=*Ptu zKM0~!xlxq!`tTppFP|FjfRv$!_{lcy5c~=o*QDlnY^zeRIo1M}*SsU)t0LbrCzp3p ztjHkxQ5>I022NEov~%46vncJal=w*?BYeI zYwQGaWnR|QvyS#Mhr?W~vm~g#`sJ4c6Ws53yVXTpEySPXULJ3=1tBROi!FyzkCB8a zO<;U>RHFVp0Q?*pu(YCUfE01?77SDlYkMiKNU{YHlmef8qDf7#&iaeSlzW7T1}eyA zNQqnf98Fhw(Qp9`Mi@vM1`^=hWTn#t7)v@}0YsMC>tFwKzttocgY$p=>30W*vt=vj zjzVWT8?7VHi{_91+8ne3Kj>c%g8sTQ943C>e@JH0&E0oI#$;0&w&O?flEjQCt7Mpb z|Ni_iS+C727hz7&L5bxE)i1EZvCs4yvd95QhLUf$RX=>H8tj>x4iH+flrUrn#4n-% zv;W@_P5ixAz|<&Xpk6Er;GuawZYTcAwxd35xX9j=b&fhb~7lvfI8c^UZb%6Ok54ZLga zm8Bkd0vzHynd%$7?YVAs4@x+fbNAllcgxMUyJEP`Y$vsHGEld-NB4#cl4$U~+c1l5 z6WBw@)AVA=N$;x)q914oJ;dhe*L9luKEbf1q~&L2ms}9aWX1t&rTguot;kQms@AOMsX?rKFiQYpBK`!#vf=FJCGzF@3&U|FJJoC z*M2hpxafuEsQcv2hqK$6H{T@DY_M88n{f|;Fp3A!)m3f7W9g>TV0E?GY~q+}pq03d zh-)Srx&oAFvq_$x7mM}K-ip`|XhEvmXMLPyWriH74)Vf7H6VQ#4DvD&w+#c)upqT% zOKyf3q$u1G-QAv3gEu5=C<%q#3=lYD@f0;y!z3`HRa*(Y#h^8--nM$J@Ww6#(XU^B z`_hki!W&QCNh1fhJ6U!V((EY|wmO?fxG|Qp5s0UfV<|=tLkMjE(Y08gw4f=VHJEgp zAbnfxAp!5~+=&iBh-|VdbF$NPuMD?pL3vcARpeGGnHq4o3(Ck+OnFaMD{y)tU)^pb zZde(}7Pp3*aifH-a@N`@;co^pf>@HL)#%lcRPhdl`5|73=ZaaD(T&1_N%ItP_!vx2 z1~2PkH)XL#6LnHjiI*b6t2C@sN^BN*(x(T+6=K=ZDJ=#^ls5-kFdmgmF5*kG@*|P( zxTI^2c(F@tz9BO^>elQYvSx-r!uFD`=rRtyUsO~s&jDdH>HN}6m81f2H`|4}!&H3n z^T*}a%f5H*dEP3!o|@1hqp=^aA0}b!1udo1P9AROehVpha<|t{_BNguoOO%s{b+-1 z{AhT~p`~^nlc8P++fmq7Y8jBrahEu0R0tJL?y4q3p30o3Qdkto0u{Z|2rUpXgDRA< zk_8dsis8{FNLdqq+(REi9Zh;p&k0q6IHn#40@|8 zrLqjp{{6={8W5yrLu**JlLhk9>}j>z9pDQ;lH>%aD~K~k&9SU4HA;p+JOzjp4xJ(r zt9jO981mQ!zDw<-c4!IQIcWl#{4!MW$*#q2at^8^pEI_nXF~c~JjBq-<&l78k6bPT zy;7w*wy0b3v@QY4!4k)|DrRyQJJ#9N-F0ed) z{rVJ4tt3Vns1FT*)EIkoa9YtU$sqoXc71v61zGp%k>g4Op}CUT2`9z2&MWl z6bD-%nmAE$7vPTm7v0o!gIaOa;H?E6jAj z#GN{HCEFz5zH-OqwfAv3i-YdNV&$LDG}D}Tu~)0bq4P9oMg76RJM*J`_h!Q>_lMb)F=EN0-;KbD)=5N zBq8%(0l$`t+v08%AuY1Nb1|eEOxuPw}TokhD7kFeyFjHuhxOgBS zS?DCZ(6^*r1j*)se3SQ_J8hvR{)t9&=H7GeJ@?MZ$-`{gGj5m3>c`;M&&&R-6cNe5 z8uF>-(KYkl^;&QK%H~pZho&(aQf(G6X=G#-LCS%w1+gJWh=!I|-zMS!HOP{i1BSmF zX@(#OZWE3>2!mYJ&&Wr&qy{`G`nx)vh?Wg@&g=CeH>;CF?{ zv~^JED3mTfG6@L1Nv|#NR)I9eyP(Dw8);CeK$KKXN>sA~T4?Th{>Ojrn2gybx%~3) z#i%#9o9@keQ+;Yq7fEZ{i{s5`dO1(KaWWsRUhg)k>i7D|(_}Szd@P)`x|3nNRsbNf z?OB|*5Zj_jtL1_w4p!~kTiy2&o>{$ffi+7?ckKV@^gL^jx{l+D7GZ^&o2~#mjZ#_D zLPSxWz2Iy|^fx(iyd`Nol4SjL)nBl!8%_o(#L0DUHeG#NwI@@2leF)Dc3=MPFMYO_ zL(Pj=`60j=;{JMHDdE`}=TxM`I6-zQvIYzk@ldg1gyhS^!^1&h8IAhQ4zvc?-pv7W z?hTQbm1A(zTiOSA@<1Gvg|9+}PrL!TG7##SV%ak^d`>VR^&ZrU;DoiZQR66{5tcy= z$DA|CvtHORxOJgib~I3X;2Du~i`i7PXj34VnNVe~h5(Mu4he$dJjlW%o%a;Vg=#5a zn-6(c`US`_2w3JGCsA0;1CQghz#GOl>9;lMiDA*_O`&Pp&4Tz2044@B_J5(4@lz)2 zY&b+Y*agYu_>hH6V4e*Ii$i%YfT{v^3sulR20|Ke%zyz==U^q%F?eIk{`mPE5Iq0> zNW!g_8a|Ci*Po}|Wg|(3 zajdo6$c-Z((L=>RTBWt_$xO+|&*KimpcV;86;!SO03ZNKL_t*l0}<5p3~;(;3flN4 z$O$zz5hK16UyDK(W{|B_ZuVzKw45*xIt8GOBIRp$4@kWo#MNcoOa0)qKL{SawUb3M z>h_ZU=+{gCytninrgFYEFJ!GzX!)%Q0GyS6@Jq3B#Nv>qWSGFzl*V!rE8UhOn}G2F zLsJ}x`v5>Y{13U{A&b$tX@}rLY&_h~eU_5VtlzZP*&3yp>W5au{v zq-1-OoT?|6EtP{rM$%WI6E+$K3pbus=lIi>04;04aoksSJ|D9@LXcIPf5IPcAV&WT zT>?9t_6T^+G>de7M)MfwDZqq8upy0EpeziaO@+wNxG13oceNU{n2ZAY%FCAZk3S|iszs;bF>v(ZoXi!1yIC`ze$ImbK z=bv7F+&_OuD(=OTH`9lsaneucx2x`Yx|#Ij?zJ9{y+v}3T#N|loF!=tWOk9QTdjyw zO^M%%Cu}097*FmXF9t5O%Ahy73pxk{Lh4-4(QJ*OMyfG1)BqZ6Jm9T50KOeMj)63J@badCh=$$^dPe;Ac zj3sY6Bk;_+Cc{qDIBZ-)-|$#uxiVsN1s9%jI80!=;;J$=aaNGG;x!SGY7+MjnQ^zb z4|2E)-0>=82tbK{2Zn>}D?|7Ik**`^nI#V#Qj;w=7JW)w>LClR#ns6DiDj-Zk+nLU z$s3awk`uCj93pz+A!7hg90lAGEhbbc!W?H)N5@&+j|I9yAoi@R;em%CKa%^IW{E-- z64avLAq8Tw$2KV>0557_Wa?d8y1gt&v+lw|3qs_s^ntVKQoxU8>H_qH^s=C4e9c83 zYlK$AP&~sVJK9orsUpJh?`swiX_$qpILs-qn4TekG@FfZU7X^c*EFF?&hMX}?|)qm zyThl8_U&}jOWP;Qr}q5HQXA&thLvpQtJ9OX-;LvLI&uAm>h`+r)AzHaqt3x)duWq1tW0|2%M z;>o8Q<`a%Mhw>EsFS#lMfNHTGLj_;=N4Md8HJi@b)1>?D`{~Kcx52U;u^`0GEKA+Y zuo}&XCSCn1dr@jPi>4fx`~_FQ0&zr(vy4swh$~$qJ-a%{*NO)_B86|Zr40HgMjhkIiIaUT(udlZeaZ`Eo=Zc!}0&C4mGWISFr zV9FU*fK_Esw`{%3AV;({kAD-tW7+TWjwim#ywA;M#tEBJiYYXMK({6Qi9r|_FTHWN~1B-1bP;YN;?% z9rjUeyW;7{&eYiWue10fsn(WSpk@Xoz!TIEzf{F09yv=><(Rn^eE0{s`2K|x?yK&< zUnZNue3>sNZ8c+CVRqXePByRe$?4Ksbo+~oVQ;R|)^M^04P4DY6+(B?P13b;;uij% zNWm%Mu{(+Uv!okOPFD~%XOI_U_C$e_IEZLuhz&-gx4==MQYx2=z}GaZV<;nEPr0PL zee}nWN)+KBp0ARdVzIZZPu6(;e!HKXIVbJKJZdbg$>96><@05KGFBY^Wi?Wf?on7+ zCg7+@_cA!jCE}qk*DZX(r|N(rd0E%ar=3yIYWhCe-uAYbWU~6-cAoXOfJ4-ab{ zRaW%q(~T8^4DnSc>m#;;B8$^mEO}e(7Xy}^5Ggq-)8in1S9&bD1=vx!qT#Tgmm^~= z7Ry_rafSaCh%gYlcN7M{YtKy?H`*6#7JXN{;Dd;8fB<`BbojE~kC2QstlLeK&D(-d zz9uxqKBAmi6>_&vziA;$%)1;jI_A>^;-FFDp_m%(h4 zUOjE*=`}>iVmyDCcH_-var^l6FkerS?%-lH8!p%DaU5T~uG)`}abLyBFo~nHmR4H7 zrY`7r%u!(PecF8*ttRQz9fw*JNhD&=m(>>o?}H>!8H^N;W90Hiu7Lo7yK*@K@V6W0 z)A{*_hQSkZS$7Y!S}~6Zm~0O6SDV3TF?LQ?{bZb~_ECR$|KFc~_Y=@XMgNHcv?BetHql%j9`)LR)Lag!d;vn};6o|F zFgG`tQj6emVg0JMQ*U%KstYY4%b29>sEZbeIQybeq~I`XbQJB4Wdg947h6Nw$clwL z$pF4Jwq%!q^g`YV0L2cS)ttHeihdU^%-_xK1bmSGklRe|oR!*FcHGjl8L%8jhZP{V z`+uIUptWr^i^jGP$dxP`rB9ZV!7E|RqbnINTrCnxDYha1p!<%z@giOXWGzCo7|14n zAVxIUS~NDwVjvK@h@A2uE$%EHqML#KlR4+=%}Z(0Iwoq}_uTtQ-EV)t_L2o= zF&K!0tJ>hHV~kLCIz&vjg$uI3=5c6(C8_}f&@^pT=QV^jED`&VTBXuL;&;E)1z`#hqVkT~Li^^Yj2t=K8^` z=Nta`F8qADzJJUfcj?NWem=hZ+K09N2AfBUV-DLJ~0^rti4K}H?Wv@v6p z%G!zQCWRS=$pC^b0uV+mrA{6I*+S4Rjct|#EuZO@HE5q%7)V$?qBij>M$;V{hGlfw zxGPuQ`*`^(`6ela3}%@%kDd$`(z!3OxPTx~$j;-YjsWys&5(7n{9_{vOFa5}V!A30 zxqMd`U5YXER}z0jJx(OCG%eLS`j$PJzB&~92ZPUsz(FiZQm(R%;nCf|GEAG!zM}6d z@A?QbG5sMb#UqW-Zb;(|QRs<9wtB$XY`i%Ut43s)ATV{wwjS|~hgd2MH_q~k)T~SI zrNIFN<&e@7afqz!arq>Gn(_sY9o#5s$`bYY&*zWN&zF}$yt{vT(1UQboUOCjr~CA- z7fL7xS2o<$E-m4bcR;n!m zdm?j*i;{-LAkEw>dr$j3Z2dR-uIRfEZ;{hsmyriIOD}jIc+>uUzo;)u*Nv@TPdqOO zum&-&+NiY^GC;;+8yt(D_xf!RL_Dh0pcz@nw3&SmIN@4~>QuE=?k3@y2!s>FGeXRx z-b3sXdKs1_X-V*Ph(*CWL`<@{rjV1{kP#j?x9M7^!yM+X$bA$@{qL?RyZv9TjM_^50N>jMZ@tfE1JM=Po>UEnTW{}JHP z?P_C<9%vBl8ZE*t5k4&`a?^(kbbQ0oREKwn6rmaB_!>shv%{^aaTA=mCwNC*R()0I zkiP7J0c3f7;fJrpob{@x!t`bS2ob|etq2b($sYK6jsAcdVeWTomA2HJ+xtb$g>@Ej zVgVD8h3Q@?DucvFDi%f{yUC3zFsr2Ky55t6o*h#re5#(LTCll>0vrSo;@N;)fyG9n zO4U*05LTOZaIaRy9RV#vF!bso({Yh-CAhg;wXgpz)5Xs}zK18l)dV^qnkUJ8X{Jw; zMQK}G1i>skJ+0?cWdpbiCihW1jV9|Po*aj1^+g_R<2cE(cn+n}$|h^v@s7DrknBo9 z5OT=)pxFfT1LspUE|S_y6XApVaqD-6nFpE(SeAb8N^C9gu`9 zi+eJXbW58Ty*9EzhE+nbQrM=PKH(7Q%Its?OpxiAA1XjX%YvZj`qr@Gx<{4Qu37<1 zbKb6oWLW1)2!=w9?x04A%RsnTotsWN92Nvnb$C`8ehp^SEW~h6PSoo}dm?PP8v0$) zaTD(Mjx}Q$dy@c^5M?i|m;hk~`4Dnk2e)SRzrpU8*QOniPUh;1{XSxaCahw*oRshP z7arwrpA@kA4)MrJB8i_T)+|q=QA#Q`Xlf0NoW@F}5FR|Ms3a@%8bbMy$k}&eYnVY+ zlm)#KSPf-3i+~YcmAr8z4D_eeK|~{^N4nipySM56JuvY6%a0#_ehRLxrs+D&y{MBO zFYdO>)#E1E?WW->4<0u2bsV2g&ceI=S2~Y^1cGClJT^cG<6WHC^UfTac#iZ}kCD&p zjy+lIcERH!O}pKjrrz^4wbygqUJr0(0JkjFrOCM0beiQ%0#FR8A3mOU)lHb($kHP4}x6zkT80NQ{YeB*ILy6=eA{r6b(@PyyHHJRm1>dS` zSVO}Z>nx9OLZzdyUBYstq7*YO3_w$=lTfuLhoDS{jkluyEb7Cruml4!0&&u{ihT+e z$2MKdt?2%dPMXo;SrVoV03Z!yt-GjC0uCDpxmM|~#l$>{6Hus2!$y{Fcewm>pzIZ! zP7!opfqJ4t#D!3p65bVEH|Yu&y^ub21frzQqUoR`jH`Y?PeGwbp>rEmVSOw*7ls!W zonID@Rf}FQ!wt{n%4R<12}kU+(F<04pa8ZNnLjmaJTgULn*)f3)XiKgT##Grm68bF zMuV9a;;1B+fHs1z2*f(=Pt54ZhaF&qV*~%7Fnd<{{ZYEU=EkGv?@!Ms{|(M2@oA&A zGI!I9^lAODn5RjeEzXWVr%NvxC8JR=n=aN$@@5`GaLkf_rSpsVBH8WYET3#?+Baih zEC?6kbdcwlA)d1|%9Wvo%Z9Xb1L~uz1eh|dbryKwQFi@*NAx*3V0ZN^sod`J3oRLz zt>A7o8fEXdC*j%-^UXR=zWwLq`SU0%TP|11YZ^ii?-9?4xUObUUn2myT%&^6EkbsW z0Ec)W$n^^XD8=T&huW|HAN|8hc7EjVYJFr@5%{l~LqKj> ztq-hH2f^~;5gEJ7T#bHWy}>MtSv_Bd+S&irka|V@>2{pV<0R>10r=j|ydR7PdwaQa zX3@XD-Hu1&H3B9Klrv`|gsFWFGSa3||h46`_6Ls6ySdDzMD@CYt6w{i-EjuZ|- ziQFsYjC#5VhoXc-;#H3GaDpqx={aVF)tXEe)_#)8a_T|_6boEYPdiytkIV^L3d z@Lafx={}T3Nh{TfLudfwO)7NR(fEb5M_s`jvcO@ZG#jLZ2HvD1Ben#2F6MG+Es!N- z#Dy}w?j@OK0Ff(TJ;9Pf^B;srS?n$p8{o=fT7#zAPz)(ggBnvJL`slrA~7tMNU2&Y ztRkt*LyM6zOxJ5?GM<}ltL6fdbPoGH1qw8|>uA}+e7 z>UP-bYCuXN9%uHlqE`TTb^X2)ARcMctKS)BY}ysF8mF~iDSY)JL#uV5n z37wDGr)&%FT=8dM!`PE&)+xxqmY7W^1$4XF*X=)xE*{sbP03FN7GLD;qep`R&u zD{>`*Owvp5({bmsP zlbg|CylVyVhiGyG0b{IR_pDbRB6U7DHO`e-j@F8hhuQin2{>fz?40Zhl%xVFfRC#q zfy?Tv{q6q^sqe4XuAcSq2i9u0o-fDU<>h{`-1?uFVb6b>-u>t06Y{@&-e!oDE*YSq zW;3SgH4uDF)4>7hV{w5`&u!R1p+{tb3FSt<4++p>&o*pH-B7b?G`~U)pK;>hOk-$d zxNcSZS-T;$$KgyI3zSFr(X0USb6xrq@RfUxY?~$p5!30mc5$hNlsoL8a%8~@x$xb} zHD$p7_sMWb;Ea3gYE;4JN1wql|NHxw3z@w z0iLqiW|S#^8Cng(u_!fZ{*@$u)GEMUS!4+9PHc`^PT%5NT~fh)s*^W|ofQ*l59zzt z)@259xPSPS!z5SVzFyxw-TZkoj-!Xo{P9B^825|kuK!`}AGV{L*~#L0u?P<1OMepk zyLaWtIz*H4w7b}x%@aT~IXH9GPdM?`}IDxW?Y@=Jsy89rZS|-sNl?Pu43vzJ3|s{dYWCufS#O&g!PyMhrwG zmw=2=i<1fP7GxqZ1O}lKGF}$3*i~_!nYNCDW|4)k(>~4GpUThizZTAy04o@eJ7|wOmx5?I0OJ>QGBCRgc(~#+Q zmiKZ-`T~e&@?Dvzl%H}SM<$3g1BReY))FfM%d|5(;b+@zoX{C> zW$RvNxLSPq{reN(_wsW0();r_e;hrs5xXCZ_g%lgSQMt)IEs@+aS>SEE+om#4DuMi z5+{erc(nL+zlxFsSc@i*sg7ESbe9K7UUxwJp&j*Jw~GbPf{>^-SX9%r#{LQ+n01&> z^kdPbWY2=6(Xgh|(RzJ94LXmXZ`SK&@btnW%x`ZIJ5vwZjZ_{aIXYEy=cHA;SY!GS;?({1d_0$_wu2suL*``h3l&sID zX@dR|rT)_~;GT=YPw@8hap6W9A31XgW!p@d1}dQ_e56!?2eB5g=uB5B7YU`4ZcOwz z)=Sbe#NpTEs4o|2vGPnNJQo^lvLp?p=48a1Behi}lo_8~jVO}SrpOK(v2}WaY>sk!Sj_8e$4#({R+ZwRnr{}l;q(fF!hWHp3uFvi8$QG_qLX6 zeN_J1CgBAo4%_AEzV|p+W@nqn<@5b6-c6#zF4~S4#r=IUzMM=Cvr+gV@snsYnm#O7 z^LgSS=JFGs&m`OufLV~%+>Z{EAb9BRE7c0*f|bv!d9h;h!NDf>yU!!P_x<~1yqo9kyn{pz3Rl$|s^`(Hm&xdPmtbR=PUoV7Y&+#E#zzWn zN9T_&=-&}SRBg=$+VI|h4)K-sQB6f2*{HNMks}~Thyv$y?1Fb8gX!Z@in4)(9`TkeWpC9vphNyMiGB{G8Jx ze4IDL4s%|3!?H4-xGIXB+owYO*GP&(HZSObhTu_@w7uIb%AIo9B3In7`^y(pmbfgQ z7=wX3#BDrF$O5g#LDoF?oj-XUhKVZ6|_x9>m>o;bOg9yGuR3BV+N6Er!#FM1= z_4?biH{Jm?m4=4D<%lGRP*-(snKS{rY}U(WfioL0!byf0EP0|z{hDQe&HEouSMZ{? zzJ(_$fp`-gv6n=h;wlW`@>Ygf7#9lfQDVUVz{2 zbn&1dv#6Q3X^Xv!AhjbEA zLvl|Ju(iNP;&nKcWe+9|i?xPK2T+NY`Bok%aq{X&cexI_C^iHRaAXzWORgIyP_ot% zLx6PJ5Q5zI$w)W~y+x9biwh*d3g?6*uQ9}!AzM-a(xnC9y^w#%T7qZABFf2oMkeTKr0Le8fa;NdvWY}`35?77p;~+9s zN>-W;+K6iiF!8H7&+m9uauIx3zHf5zMwvGO{muUo>(;~7_wSRN@%42$=#TD~`k*&Y z7Y${5_c4ygs0fpNc%LkdkCV5P(PU*LKQ`+)K7@~bMBF-`#_=dktG5EdjtM?GirN3y z=BtV67^=mFBp~=k4oc#R-q*7m3;EABM|*SJPd2^Y$BmgJ_aCQ^H&4%l599vcQ7uaa zV4AvSsbVV8fSiVrLrF-4RPorLU@ILOpIWZWbAT-)2(@a)TL9Q7;CKs?m8*EQ8toA} zV%N}h1gBx>k`I&`rRG{&7h72^iq;u72E@}NEuF$Dr{y{wt3gv1tvGar08c=$zcI=p zk)F#Ef8|mnyNXL(>vNn{t%<_lXf@8uC$y<#Lr5>0Kc%+JjgLH7pr497qb2s!(-v6* zBQQe#De*A53kktr7)LVT#+%_l5SwJSt=C;U|9jP4*(

YK;{0NorLF?i(phNf_Vg$Y&&>el9I!1tg2O-eF*`Z}A4#TxKJ&gLR{bs%9nENzMB?H=y?!+;Qzd#RGm!_QF zX0jgy5^~u;2H@2@YmqueIz8M?Hc8YA@0Q8#G1>q4^Uvp}n-9pcuBIWB*-f&nz_sXI zz#DToCMg{eWGf~|aAAO}j&iYM=RT31001BWNklQHIYO;EttsO%{Wd#lOHY`SQupJ;ZIk^6~@)K zy>1RyyyN>U1pSa9QTTg>GJVS zvixB#lllFAH9CZ=q_ODtw&~zzJbGNb-F4To<{zd%#;fHYqqUQ!(^dQn1%N+GTqS zVQ@_gvz6(nj;jS!e-Vie{t53|<@rvaI=Z9Utl9E-%YaIhzZ7AzOvqNaFFFn4E>D!G z`W>O}s3vWMqH6_6XOT$>Q%5l~WOteaOWomcILuNZfOwd%73wG%Nv3512|iC`fp+aw zkzqVJod@_L24O|^2yn?A3c?iYelq_?Nuwys#gCF4Xf=6n@h2|7V3VfQyde0J^#*e=0eK zDj>e?R~_51K?fZ_FEe+@xb&76xQ30|5gyMA_X$liH?yawFWj1J%q?$ zX28%8uxiqqX?3=)gnWkNU>(y}ak!InT4%pYU?kPL8YK z0l+$EG}@e%xU4OWSVRX|A=eJonG6f;UL-V zCLqiEowH5Ho9d#^bH{dv)q1Us;&2-F2d(;knrbKx-D!M_NT#9(lnPf;2`s3 zaVTl#fU!rt!QFNnFM9jw0{QRo_owSOUj~!JLHa}0sB#y9Zn0ZHbB#qNL)^9GFgQ&G zokb-WP;mrL##0Pw+yL#7t2_X%=gHg8<%OTH3IRm|hbBb3b{?>-*{1q^Pa4%EWs`I>nx4?>G<;`+~1{-pTRxG z$c)-PbPuEW@Rsvyn@-08DT&k60tzDlQN6kJjp{!w`GX!0OntOi{eq|N!dh1Jz|j2ZjDfMfzDtIy5^9du+Nu~6g*-avQ$(Jy!$-4 zaW}^*&+q25{Rf~Bz+?)926dDw=rl=l$Dwb`u#gaa9~ZG*)>Qz=aF~}r%t1k;8Ll186%{XnI@a2neVBrKwWMT7RG%1mVJ2vmQ}!V}DRQ3?&gmNTj7<%}iaW zC-kW^GvF_(pf)*TKJRCAzlo47V`%hOhcSSqY!U~f+vgE?=XUGHxY6kws&8Kd!*I7lZ{&}i^pvC^zBnRo9qKx$y}zmkZ}m|7Dj;$ zjzI&UL6?ooWGM9=kHQuJP;)ty%SRC34`FFD?Sc&V2JELX5mJk^&07<&P`VXfsD!dZ z9%zIHB#a%1d(i<;4DA8iz}y(q8^~KvV0d66pIH&VVZ`N1O@;~-3BXd5J1v@3F=2On z*(z46*H{;1H4urh+pIPYRM}6aGyZyfq{6Tw27t0uG??;uJ6f$KHA{_m?Urdh<*I|0 z&_3P^_fE`xEJDAAnQXa&AfV?(?M66KUKyGODoAR+A9+d1X;T$8J$(=)UefO;B6pbA z0K=qunwBdJ=4ayPs^@9}f=ZEPc2b1+@zWqAY8Kd^%RO~Ajd;)-eZiVGI8bcsvE7f` zrs)i9t0tr4xf^M+1)rX_oWYpOj!FLC$!nmBy=!Qa2k4L7%UyWq?%+~w+V^8L%h82OKC0$B}!$bKU9M`#2Viw3m!(BA{3bP;?E zML$8PQ8t8}JOKun&|;u-fK$Y6-!b(P14qGt-qxL4+vuxmjg3bYu!?X4K078`d2vAh zc0WXfhxX~4A>mXy!vez~m*gxwHX6MIb$wZo$fuYTkA4FjryMd}3iTQnU`s7Vt8*IV zKsDTs00B4EZXto9FYf;@;vqAyG;%m6mE}NY|G{50Ts`b0CDy(gq#R zh(7|Q=wvoXh`kL)CsDZ3;U%^KKmjl;aLoxCSKuXA@|WyPj&3P!?Z2eIwO_Bstq&-50mZ{a{ms`?RoU<8(P5-R^$7TkW&S z$!xk_Z*TVFeY_v1qy5q|gJip98HQ!(?c{N?T)&Bs&%c~se9F(J)8ScRudL0=%CmLx z^uOP~OZ^YA<@qwy2|42?IrAWtw8;=75CeWKevHTZ3vieG5Fct7z9l%Iv@L6VCDjCS zcrFBB0D^7^Cq!^6dE9S1ZDnd`JNCglb^pOFfeG!_D5WslAa!g!mvx6)-Pgqj+s7X9k4_a;K~`ND!n4t%}-1P6fj5I0|Uxa32a#e;nTa~ih0|Gd%&@ElAw(1;_N<4#y z!#kl(-O=0gPFEV&T>nCQeT$1$IsB$EEZOUARO`g>swxfvrxA+WB*T4AEd7Nxq%SM7 zJsuFkt<(qiyCv+D1bpJyB9YBqk#4kpA@&HnMBkd!fGCPPc=33qcpqCe)#Uo(m$x>_ zc(zE>lT~pY0Eq{8E&?$3ZE6x|-d)EX@2^ju7gOFwwx7@E&l3b7^U~GL1aSkhHknP+ zboREQS2iOIrz|~h%~f%=*#zTp=8{c(xFWv{guVhcaL22Gb(& z*Oys_$Yc8gu^4$Qf(A6N(!d|u%vlaE>nictlsmcT?tJr|&K@%sK2jB(3o_zg!@#6x*_}k0qJcTCNtjDX>>Bd@R zm)Eb`!W~;ppZ2%gHF6<_tW`_tXdyqR+A!!ba$`D<^!Tafr@y5n+fYkl@OS#u&x#5XF(64|@eM&18@d=&kp-m)D8|6v zsjW35msOfvgY3iq5kD+mtWHOE<7l-0Npv=;73H2Ex#f{pjS#Ou?hcM#w+_*RAfY28 zyZD1u4Yp)DR_Ob$x8ZiVgN0KZVgV$szI%@p*OfIx9P|}6a`c|-!<5zp@?~0QG3~+Qa{{G|TAx+Idays*y zgc808%YGiUFkLa~myz(c7|*9u#wHk(15*P-tVm57fhf*ECoaWpsj%n{^e<;r20BC; zWk-N)$5|W$2uxZSgBCJl0>MqaZ-43ASIAMB1@fxjn zjiXjsiY;t_$N;z${aBEeW(ap8h~tj{TvnqZ31$DD$a;TuthO?0a;(lqZ^22W`}(LIZxm0zcSa385DQFvNNgllSSd z!@mw}2n^PrHDBDX&9cl!aGfOCUsRS8;`$7n7f7#9a?L6i>oiD>Uhv=huRnNM-TBkg z`M23(kzGEYfb@OdZj0Sy;TAh>xW3_3)9&_enXigC%NEmgvA(~u&8z2B;%_#YOo!8n zGNh^%z5glF_0Zk9#n9ap|9(k-e>opbp;(}L5odU~K=zP@{ZMoWl3awiWCais!HQU& z2`GV;Oc8=;7>N)-Q{G~sfiYrCR2c%$F&*~f;@A!Y87K}B>Q37NCyD{o2FuqhRks6r z*(^^im4-MHN`qHROc3Ji*eM|ZTMi3Frp{3mi+h$LLJ2RaQ{tGVlunaH81{`>1w<4c z$e>5%)stFzoy%kuuzMKs;3F_cWdNYxih);=5z6-sNrV*{@8zmeW-0tzRTi^-Kx~R@ zPpZ&e<%MQo(wWtu$Mg{BXM2DDbEj1Dyne|`{&J{$J>Ao2C}qIO>`6mSJ<)H)zFg&F zqg&4p)oh61u#^QEo4mY8%Uu&#V(NpQ-WxbNrwEY>dnDU5LHA01D_7mWoE(`LT+XF$ zDb_)jvvNG0K0Cv*^g>qZ`jO?@HfPC^C$*#>mh+2;hacyke;@>(78!nzXJ3N+&cDp8 zV6}61iWPMwAbiPQguF@cg!WMCx|FKZ z2K0462Z+8le14VZ%$6rCLPAfoa}<`Eh2hU=C{g~?giLnKb0uNLBeB)Kx%VFHFeQ&tu109=;g_a zAM$pVM^&DTwth(3VPYa)cwP!U7k^!(AYEfMn9!1K$p$pQAzV-#q%EP4(kKK zoC`bG2><7oW0`#|IEB@Mv6p2CP$b^UKLz;FTtPRODrqB^v!dck{PyYN z#o6@FUuJj9>HSHw@>-YmReW-NbuwFGEaQLqE55%PUXE{07W45!k){ZoFHY419w`LZ zgjB`kbUq%})6>QD^V#&IF0+z$HaGlF5vb5B^FR&OBxe7{q~-Yz01Op({ITw~TEDPN z69t7nmOjDDBV%GYIzN463#^1U@_ZXaRNy_UujuC!RP>&m%HVrZh!;noPdAH6Kldz| z=5~@bminDCr?y)V2FQ}Dk%AAIl%5q&zj%p;?;vfd9Phz2ZniX7Fxob@dhZT)*KC+q z0L8{XaO6Kap}1sz=6GVdJ39+_hr?*7z{BS->``16EG&%M@{+07sQ4s5b09K_+;DA* zWeHMWXw$Jx^>(68^5gD5N6BvXlYYYUNp?^s4c3YZ53WsV9meA*KB85dq0R9d`o~?(0_G@X6mO#rRmxpq}gIi zsX*KvG;zyN8qjDx_gD(CHuYV>LV>GNe{c|AT_JEch5OgzKYvj__^$irF56$MRu6Z# z_m^+ZD;45pUEZ$Z+qbL5VsSWUDAB*uSq&fXaBb0hu^68co!~Q5h3LCDWAZ4Gw7AF% zV%Et@$SR}($td?=`&idE0s6CfBxmQL#0Tu7oJsSS=>bxNRCId|i5X>(`6JIUs@d4t zXj3Y@EucwW0ai+ZAqy}Y!X!4rmksl=qjg7sIF7*uGE`}9jyU8MJyeB$S>v~g1!Nko zW)SS{ag&I}O;k*Q`s`sj)-49{0yQ=^^|MC2Ga-Qr*$!?O3)ZA=w-e=J> zV>JS7Xk!O}4uQATFelr7@@0n(yZxt{5MwM+L7gDvHWbM(!pJdAJ z?Qk+W*!ROE&$b-@IR$>{yUbT$LQW?L6=4S+!iIg#V!MSw5!n>~0|tjCQthqUZ8dzA zL!CP)KSp6{-+B!`>oZja2KbqFO$ZSiqbN07D>JN6_XH?oODNs7h*E{b0`GT3fBZO|svTU;=8JoM(Z}VJ9(}KSGk;WE+#jjJNuAKH+lurPL+LtN@o9GjiSk5MM1Af0}RAA^}1Bj0bGMQMh@~u@pst z)orE6(8~bl%*G?KuFmvDnQ1u`Ls+lj@8MW8Ebw46I4IQ;zor?55KtVV>JV%(o#aOI z^#jy*p~BA=csW2Jd>Xz{W{40f6q{@`)IgTi4eF|c;CKkvi^u6RgYNJv-La$4cDAkH z4L4}gx&UoX&}NG?^?u*8?J!P@GuU`eNPcJLR)sB+3p?vbxs>sva8?`z@?rhX7JCgJ zOZ>{pgl94L&y!SdvK{3i`=H35H2p%MVRnFILd9W&BOGJN_O@Hpsh`|Hq-@X(&erE_I@Xz?Zbzs6_nWJ8ok11-j+RwMnjAd<+aQ<6d-F)35F~} z7o}RI8m31*L~O*KG_?Mk#jA&1+ST#J*MFV8XC&c#?9=Io>o~cdUY|TE5nj%&T5e(u@l}Jq>9*}edND2*bl))|}0I?QVm|Hn#39Uj5 zxkz0fdM6DMbkB`g*5yqUx%{p>boG5l;z zf9{*agC?I{RI6(%(Sq57jV}`@xvm&GKHsZ?y#|P2VTa0CAL!P-cFZawVSL(bN-ow| zVc#7z4!fWU5TmNyPmsB`^F;4>;&-a70|)4!v%5F=#>8F|uCR?!)NQX{VLj5qIEzRG zRZd|}mV0S10s*Y5cC;Vrr{~Iq`&BtGx_wtMmO_IycCDH907GLi+jYw$lLiozLC``V z2Cl0{-ndI-Q>eocm6%&#c_YlNA@lUOlZo zsJ1HZ9!_RcjT$Pqv+*}Ff)P@QJ@{J?{OhB|oB*sB zBxpFO<`o{|W<+Cufj*yJF zW2b}^953CatunDngH0!XINiLHF-@6kW>o>qXa8gBjCI>avnXs?0s%Ut6hQ?k$ABv# zV6l~m6cmf38b}242I&o|VPO>p1QtP343H)-FjEA`x|n1z(=D*rLTgvq#mpALB4yrW z&v$+$SYsxzo!F+u%X{y+_nhm1##&cx`$H}_`f+Eu0`q00BkMG;n%P;?W^^Y%a-oCkM|M+&Lr& z_xHnrwAOC-_uclO3VY~wo9kbWgj9|Rxe_wo9%(`0=z!5Vv~x8;-Z2Y- z08(ljtR7)W&5%$n0pLmBktnZV!(3YNt2cY<^`mg6^1S!KUT#d8`hM)ZQsm_)C=}dWlk3q1G~n-;lyxBmh0;m_8g}v90?%83pHGrH!d61p*sq z57_30lNSIMW87XSw#UT?j01o#&PJrl3%kECH#YrmYK|%9-7an*yGief08_PkojXM@ z)~C3b4A=innHYn2ACAW%>mh=&L@wmRGoOkCMp9)?*k15hmd(70At0;_KNKl~e5noc z0{V3ipghb0U{qtbe<&5y3=FEUpJZ^#vnfE7k>ZkqS;cA{gk{{pbqqm?J3?m26Co9p zLbjeN>g=w+vYh10=U4y!bkp6uee?TYyL|4d(ZlkpLZom6_TY(OGTE5hc7>G1?vCWRAgbV$PmW}RhljL`iyGAfD_*iCMv=0~Rfz<%pVkN>E$(9&@vj6unLV%z&r zT_2GDMk51YIM8^r34lxokQEH8$Cq|jAcCw@_U%Ud)>OUvkp+F~Ff^^}HPgB}jbPy_ z6bIjwAbscn(P9Q6CT*Jm@py^zyVDf|z@Fxa%Hb6V-Cqq@NHJR=1+4I2xRt=QhDCRoH-~O56YPa2ev*=|P{F0VWD5V1=n=NzLwy?JL_j+ghb54YD zW;9ro6bBndv5{ovpt7x-vH#-lvxE9<4w$EHO86R1191z4g<}Kq}O&Os#N*y3I-@RX4@APZ#Q3F!KsMp%N~% z2fdC_%7~rpJ z_@$K~lxnw!Q`mI&?t*^;dqVA3j0Wjc6<`P|gB86fR!}llb-k{72I1K4P8D_+6)eCD z`wiK2W8?!t#%Pp1dv1~{1WcLr>bS8U(jTWQ=77oE%QyX6Q2jZmJUj-2fe%#kIoMOS z!I;_eB4j}r=SssPs+OImx)wx-OERM}6(C~-kcvTuZVjr8(4#3mlypdS{p*jcNrXxM z{B(WYD!1Jz{ycx)wuk$jaB#Q#PDsTckmbmsYj>c3J>~bLUjXxjKhS_TMcz|NZU|U+Nmh$(4nB3oUk-Up97M9 zI2(U+YhiD}#+d=HqM%~sRmStV>g3Z|{ec#wfD9SUvWB$9v_2lt__6PRWHo+V46AHv z5b}sF^SBcU+Z6Z#O%tG+t5CdpF+8;e5d^HFA5Esr{t_E5@PyGS20CExnb5rA@FSS` zh9njVb9)Qo39R8MpmzhQ<&MPMJW?Z5cry@{1_iWdB`sH}Oafpmiz6mM;r>qWgDluF zVF@6Z0NgMK+#Ct1FP-&TRceK((qo6-eRt2yP@if4pmQ&yOu!>?o4`q^SVF@^!5&qa z8>yULU#NlfYFtjlB#BWq+l;U>6Y8+ZG`M-eB8>{XAlH-p!bryu7=+(Ax{;jZkP+N_ z@{?mj|2YT2=~JkopgllL)YYW6Ge@MXP+oiL9RyJN5l)3rVu^elr%%js=QK}t6Pca= z)o5L?bc0rJ8F}dNmROyh9aWd4Ko)Vf8S)2SxPgkFke_U0#ma01`EYbzsXMV&p-d6k z3!B0Fu9?O!a;5B44@V6QnHUa@FQylmQ>p+8C+p=oA1#*`!6;$u3XJibS~rxGUJH1L z9}Qnv03!5psy=dr;f7ni35o^NObvt){p+E|IJUv041#o(*bYFwuc|2grL;_$S?WxGy_U3jWa2gU5Z2Y2evQZvPOhA~!S~OJ}ri3qw zIbDWIIOUYAg#LtSiy&#Z)cZSTtQ2iUWPS^Nm&SvNRMMaelndPJfWxu=%L3-zo?$U z2p1*pM4F6e3cmh3Dr>6JHwwCOIa^u8$gP?c?A=3V zNmCd6GV-tu<5k^pG682_m<_zV+x}W_sjvm6H>3P?yo(2 zCjAL}8~`dCr9*wD?QYuJ*MV+8-s9@55Q($KphW$ja6;ihojF+vDF~Eo{(fxEw1SKS z60oQtm6OodX~Mw{GoB^?&V`<(!uu9AmpKSzKF5qkX)P$C;_vb&nqF6aPbGocS&4Il zm&%b~N`Z6rEY6|@L&j*KS93VTmtnP@1lH3T z4I7(%rJOo1&9uk+01u9HbT& zgjv@qOqD8CsaxJ|Uq=)-cy`}Nf6RxIIM7517$>gMz`>7X?gxQ!v4XM)1(p>D!w`zF zw{5=45(Ar;*$wHPNxc-fvW%UbpE<+t4S2MEP(*Eq#QvGKGF{0iZF;RMYyn3 z*wuw3VBg^O7gD1lDg+4Z(z)>q>=sFp;@+1q;M#9+fqj!bzcb1PfnzzcM3KY!bLPw$ zk79fpS^B`;Tu3rX{pN!+ztjS#cMt!hL?HdU9!IleYLIYz_t{dFbEeS^lJuTDOZUjo z^_!(9BvF?0cvhKz%V`ne0LwCk4$&8f?(wJwNJiP4-sKN?k?rPja>q~s^BhjMJulIb zddXW2e_zm}ok2J1RP`G4t5JVR^goEM@LqtLqa!o8|24g@`$Q#7-QTA^p?jt*x6~~5`5nkD^CVhlgf)R=WLV4I$nx9w!`ri|1~Mt-bV>@h za*0s#ZGeCLX%|TYv9L61EiOaOPG=d1mFq!LNN-#*KsB zl0zYb0g!>nxYVU>DaFITQD-Og6-0b| zt+GoyV|m0NPvD^|*e^VG!Uiu$r#us;+NnNEI|iw08Y?_3 zf-oK3o%bv}JbW2j_StO__4Iru-y95_Smhbxjk+xzJTrFZBywnWRghw(# z1bxS_s06RrW{6QX!IxgyGTbkL*=&d<4*;ivkKjs1@0Otm;`F0MS&p+|W=yB@ALT_j zIUXm;SqP;cAaquRrJARs6GDQJ5S}SQ7GyPa7+hY!K{7m?`slh^-{9f5iDxaxA(k*1 zK}8r_+nIsM@z@f(CU8y1pF{GQc_Y&WgRkICA>LnEcXU5g5W&>Tn2lbo7PG3oT(&=Q zS!r;>Wph5m#B3et&66|-?t9ryHodUH^w&Wrm0~;Zj&&(oGhyXs{)?IL9c&Vb`l4OksNX(MMkN64^d8h+) z3A$=yA%dKa0~b1ZGh~(dJOc}QGQLWxd=Ccr)^A4xE6?8{q=K-Rltoc;QYm5@mZ>tb zy?1C?B!YI9DxbI8|9&*YHajDizokK8dt%5_GK|&^G1cL{EPWa!v;A|lNVv?Mg^S1t z3!EYK2Ps4sTP(r=c?fWk7ql%DQA*PnROE}-o3KSN*$zY4+0n|_-*DhNMofUXp zIN=JYvCTqy!T4{JFE0u;2*ReW#xskMe*D!RPcIdjWxT z8Gc5fY5KO6Yuj|DrRrj*&;YSqNA8hH>wCD-MpeR}(&?n{;?BulN%JJ4Z3-O*COchg zDebKy+ry~_aWzot4n(H_Kym*ri~o4!PSlIHnUA5e=oVFXtXiy^nQU<;4~VyFWn^^3A%4pHuC`t`IW%LhhO-2?ob+SjeSe8N{DDykh&^7N$7 zJv=J%d^#TX>-~Bs3zh$SIqKnY`|*t|t||Z|W+~EjgP~>G>mEaq#<8 zo94_TS+9fONkyR24a3M2Nk(N<+n<61uW(y!wQ)>0{|lU7!4?Z+>wxv&+$45q1PI38 zR9-|8$_$DC%!*cBK-n&^;padSRJ3n6NFDfUagjF6YmSuI-^S2TC^}PGT*qU$RR7oF z9eEj%XWe9(pQrvIiJ$u-ETRbx!5rmEW-#UdZdC}$i0DINNp!uNWkGYRsc6vD^WYs$ z&QhlXNY6}-=)q$)TQy8{pl+}V;n~^7D(;0vQ1X?E-`|;0MS!g-;XEqeGq#Mdn8)wQ z^bjaPc6;PT$PLVAIQZa#336o72lzaLKVq7>$9!}x3j=P+cQpNYQ~=3Z+nP_a&jBZV@Ka(CRJt+16H zBJo=qB}-NUgruhwjnOM?OP1vntejN~8*og%tH9w7y|?_%J@w1zA*>tCh^ z3Z&cT!nqfePpE&)W6pz1H5mgldkmPtj%#mMKU-b@Rks zJb*eGLG8#NR>ha++g912g5ofzHzd+URgbmZsO}(38aOKT2{pCWL-z9#qq$m5d z%G(}BB&bK$lo(%hdSsndO~7?h%TB7tt5^y?=zFhhsACqhtNR-of|EggU%N`F2V511 zz22l`j$DrVZ2+vY)#T!{jwS>Nck4vQxEzft5`T(d9aXaDEV>^bFE9A7)7pi|`YUt; zGD5k!)ARQ5eh6gxnfmv6f80m+gGR^+9>PiAvAjuEyxsn+5(u9eQ`{k~IeIJrVMmQu z#et)gzREgoMM_W=mO@7{L8;6wMC|UmHm}Tfb{Sig#&Hs3C4oVE*uAhnr)oAZWeDD= zpB1{?mP^d1)Vvevh(d}B=v165vmG>OM0pggzZw{~1%B#RUj01CS$6y2+|@hPe2cZPHX6Q^#LMg54vTT5XcBd<{D_SXdCT=p)}+TjA={>~i?mtYHma z!$kBY`_o|W6z#AC2AX^^`hy$p2UEtNO#frlyf3V70JF5C#an{1^iEV*i&n0@HvqBE z#?m*BT1Cn#xCEv2)n%(@dkctxPVTA28-O>7iVuSBIcxh4|l-;oMM0vChofv zcWwF~?#?436QhL=#BSTMxpEYXEpO3x8{Dn{orkJERK`vwb)~SIs{&aLm(X6ADwh!| z@_vH^aE=Qr7E|cM8jitxC@I3Tj(< zEhH}^ZL8heb|RV1L}8M&vhxI<8K4hKVWg8OM2xSUYdY;I`(5vK+3e zm^9H7s~8|4++XyudgII3$_L{RFo5DWC92ZTm{WV0))yJy^%#NE`C0qkKp_gz=4st| zNuf&RyDzX=y+5%}`Oy0iR;zMwH~%ylRmuV744X~td>F-Q%SkZ*ZlUBL2n>MuKc3EA zH;sLZ!{#C+oEb2}(G1uU6|$&3N&yt4BuM)W`~uLphzm;=T{@aP!`|(Ai7lPlWja60 zS>LzD$5CV(JFywotpB?FF2$inT&?#6x_~NAp;)28g*>&0fQXk3aIONShsbvQD!Y$y zUj{1hKQ%n>A|j(bCL|M$&~X8z{|N;Cb+fLb&n5#x!zkE^lH+^u;lH`F)8l|CSmJW01LsB+{!8SA;8 zVZ2@yEx=THSVd0v+qer6EASMEC)FhqyEmln+7-KBJOqjyOf0 zD1P4j{BX8tjK+p}&0xBOh)#eHy`l|U0wt)bq7~(fDh5C*1GUC=OlqX@7&(BMNW7@O z-ha1mQ3*yOe0@EA|6$u3p%;M$@`Vx233y=Q_3293g}l)KAG7?sFpBx}OL|8XNS2>jPfeMTTS(xf=kqfCQV{eYQ-FGS6D@@w(qZTy2ttq26#Ro=QL;J$?m%KLUimxMy%9Y#GEc4(cd)^A3OiI> zN?*1385DYr4G1U_>Z=xiT(1S@xfmNd5R{v7VEj9X0KAw1KOzFngO>=Ulkvxb?d|*b z7f$6!jX+UPM`5ZzSbzYDIbM#>uSVhP@eiB*?Xpb2;a=in(TX(l@wSVzxd%x|byFyF zjZKxl3@YzVfr9Q=Vg%v|wtW`MT%J77P_!WY^eR83lwie?Ym}iGZCJ8;qD}GDDOL&m zQZv1AU&pNROkFaFiiB&Hg|h?erpN_i^6C}Qy6Swj=ben$dE8#7)XTNl`h^(4NgAPx zd3hA&?B-3#^W+x4BWpq3KXfJRckbv#Ba2z-Gct+VZGavJp@-rDvu50luogt5fqXP^ z?gGwF!U)_E;Xw>o_PgG4y6l!5I+zR$%0zb^@I*q^1hKBfrbD?qGVcbHRoBbgf~a(TUADw zl^<(IFbt8?Yp`2@xTGIX+iGtp;urZrtILeKT7Ztpk0EugsDU)h^l*oHOWAzL&2rOT zJx+CNfG9zWD+Es!{kx3{jzQjahSwq;R?+nP@+F0z?K8fn%bT$K8wg5^i9=W) z)?`Pii^57j3Z{M8FqY|@)fc+Ixl5Bb{f+PFKl<>YW@ou;)wlrIOB#whsl*i}6^Xgj zIdk#VUeC_!^}648#W4r>g5+F(993k5US!mDm0V!zK$YC$^Espt7{Sb*XZcC$!yLx8 zhY+;mj)C_`gB;~bod?#itX0Al6q-f!s%aO+WtQ)}vQc*$2xe%?<@+3oHul;E0SGbo&LD_cj*Ln&OI=;5vq5%q_BOE% zM$)B^hu8I^ZiL^^*!c2I=Gz2W{3!Ik$%dO~q&Z3vR8$crs4MhQl~x4~6ewN0|9ND* z`x}+}ZGBUEWBfUA8IM~`PR@}IG$0i=3tZ*RQ*ZOsO{s(K(k@kas))xn;1m!&n(iC{(IX*b(g;!?`+nC5r=CH`sH+{Tz(Uw}fBhJM-Swr*= zU zD`H+nb3F%ydhXoK&ht)+AS6D<)7BQZl#f1OG~;NOcD#@oVVB|d9;E2WzIiQg#j8{wP>+qO%K&|;E0$~HP`kaE&Mg^ z^{a)l;@`ktWm;o{cKi4>0SH!qi*)>5B;e1cH5~_qN-wm@M8_VvH)^c0GRyPa@mESh zs>cS;Gj-LNyi9KTlbdm8-R%_>EK68JYDaR%6?LwBAW@~RJqr)JVP1#$yBc7k7Y#-H zGew`%-a~m8fEAr{@{e48sJ-z}aSlIJ?ny)`s!mc=Evt^1OVm8-p2RU#t;Lm)-Dvh8 zKeBlPk_7^wI7^^q)gMO@Xp=I{vvdh#q_KME*yV48pdVd6+hV$6io=(mr(71FqUw7A zfe#k{l@0Kb@$)e%z(3nPJ;rd^1FHazVGp%?r^)$lmg4ubR5qQBTh$jnt!Ax_YqHTJ03Xg2 zkL$G^iS6q^p2Tz|lDshmlkM2L*C|dhFx{z4Ulgekr9ca11JEZf|EyZ^?IeTuk2dLj zFo(Ht`d-L{bjGhf#5)%tkTzeRzq&^B*FOF>t>f?hs&YoXljFRWHS&+MAS4b zv;Ptcy!wZy?`TbQ^d19>|Z@(?R zMnwk|>Go6SMZ=lJLMz~unzSSNreNhn>H7s59+NDoI+{U{O=#DP!y2x;?v_yl-rP9# zM(~`BI2l7@9zYW4?FN+&Xjb^~tBJ+s?!uaJqd_AZ3M(Mw+_f9%ZizW%#X&xI9y$|e z%WJ1V{R~Cua}qz)8OI*1T4MtV2%pDs!)@$&OP5aUD2*>6&2}ARHh(Rl9Rt=13{qif zvni+rraEh=9l)5qi(l`of-jDuJ%KOTlUy#JnGkW`%kPN5pQyDx|NOx^LdWI)K}sX z>p`6WSpu^dT#fpvs-e>i!<5mdsV_QL*CQR^5@vwYCG)~IC>cU4lyGhH`#-AAAGeJ> ziNYeAXrMLSqKNjQNqYcCguz&Z1F{2d*vm8U0-9u!2?Q*dO{T<07{IA7u@_Ldna;BH zef6UUJFs^xOU8Iw)%EAqtM?v0tyo0R`y;DBqpBYV2fYun@*Fm1=)Elv+I?K^`fc^2 zO4)(a-kCm{ySKeERC~3cA{vv8AGt5 zhh#b_ok*OLw2t}PzOBR;gYPLF3e({nr?=yj7Bv<-57MP@C)QQOm-~*SiEM`{j7) zyY-MXFE}haX+ciFG%QI=>=cl;U`ReK!dmsdtT6ZM(o*kn6sP_RZ@8}#Ovo`QX01f?lBFJnBwo)fn%1)UK;U8Tj_ zV$q%0vUx*(8h5+#6fxJHqx3dYtNc%&Rsff@C1c?!jhmk`?^T&N&9V44u?^bbxngTo zA0pj)gwFJ#=r~r#+$b%bi4Wj2@nvELt&3&a9k)b7jliv3an9f<#dUTCjZ9>>RPmjO z??KU4-lcpbQ`|M5>IkQZj)7()(|v`COlP zH^iW>C+;Z6WG&g=w`@-VX!7`oIT{wumH0fVCWg6=1J|L;Q071Rh6}5o?CbhJI5-anKlJr zAQ^yye{75D%K>l(qlzoY3k8^Q+rdPGvyDp7t@2hi1grRapnqE@^@w3S21GvD+zvrR zPoWqAq`C|q_A-WnXnSa5>dU>H8e3pk` zr9CCqY_UXem==voy)K=N6#eV8Pi*aVuha}mrilM=1kYF|avkP}J%p^pzXm-H{z zNi0n6KC9>V;d3rMQqHf4yWHzMt;(b;;QJ!e`=lBwZq@2GrgA?!p9DjEP zO;rWly|2vk=%`x{gP8|6o(HWrtVQ!Comh0))J#$le)fIY`$gJ|36~bIgdYQOZb>2$ zx&etsFq*<=!Sr=u~nzVffL1kjEoYMoaoDU2jnExNyW z=2F=9NsXad9CUN)?i_#>6VD?gOEG>&%Ua(xG^-UeJJoD3b`JK=|_NWNGg4=Wzb7tB-FHa(02Q?**87 zwJ>K)zAz?BUVZuf^#z*Di&VhBtg2mJFe32CoWNCsFv_+=Y_jPPO|l-4w5FsgR8^Ua z(}LA;_b7H_^GBDM_U99jP4qJ5qxe3Y%6Z|u#HzrKG%$rdl2L>DM(3`%BvC81XUix| z%MYx}T7(O(2vOq|(zTa+JAP}ojud!D+N0#+F_X+bB@sTrfI(*nq1~dz_KT!H*jgIA za*y;Geu42fC^*1TR>b&HHBuKIgn`~4pHlK%-YGrfZW6yjP~4kJ_MN?X?Go>-o@Cin zPiDb%3Qe1y;{^dCj_kp$=A~Km&M6L1dy(!%*akJYy|Nsgyj62T>mb>6?xlJxfIXilbl@dSehDCo zc~b=ENZpPH44F#=+Rr62bICC{i^)9ew6jh`c|2Ld&t{xBa}zyJ7y23e?!6P1 z6!y9dTlqi^G=XJXedA=4m9fSGisxHl{UQuXww}}_I|e{7%86*PSy65 zh{7@P{peM= zeD}9=X$NZm0KWKaTp750e;(F>~NN^Qq`!ExjpTwnM)3Xq{>GcOCS5P-W}s=~rl1kI?*d{#aq06Ac@q zY=x-vNr?_D&F9P}{V4cy`TL)f;~N<4iL=gm;R&KQ;_Hm`@$NJ=S0`J~?2+3*3*msm z2^w89Z${!TIwJxP=Xg^AR(HE*oN(vc)$Gt(4kB>DT6;=MzH0}0T3*7jdQyqrYl`G| z=#~okz3sB78-5;(^aNnrX zkG69YuStdW_Xr=b5f;zfYk?Hg=7c76uOntM1Nnrr#>It*k(T`)Jq}G^ z@BhNVbTFQ0uhdmHVi%ebxK&Wk1-nzMoIA&QOhg|RwqO++*4H}sEnEi=Z4aw_&&FYY z9#BYyREh-tLlUBOTPP|8O1^y12gIewy?(#B$6ZMs$Y^0bV}djJ8tingcwK(E=J0pgxDh}S%Eym z#D9JN-WM+qM$x7jv%)r&lFyx+UILPsL^{2pBv;&tjHH%5I5XRheMd=#l?sd19EtM7 zJWYS++3H;q*fwUnl-ADP`&fK2<7+DZG%x(TN;brHx1B(|tAaPed5!QS82iRYw^qGv zSnm)_09HNQrtO>c-Wz#d+PfS)q_*g@pviRJ_Ofk@U()Zz@453}R?&);TzPMVazOI9 zNqIcju*<|`9u|*JA7^R1#YeO2gX*TMM>cl!VQA5uud`NXkIZOQmB`@sN8~vaUg`aa z!P}F#6h=tCzGxaXA~RK#?Ra>&$g_qYQW9yVKX)Mn4oFb)3*36HXj-Q3T4y^IagUaK z@uCT%M84$dEGAblH9YOaP|c{UtCM^vau|KnH)`U%by zU@+n`qAs~w-XM_z--wS%3FdxI4j#3@qbI{AhmIA6@hO2igpKF4u1JB?nvKM)S98dq zRb76)*_1VA#L_WU%9Sk#VsJt+I9=G;XJi%_n2-l2(KCNP}qC z#ESp>+goNpkm%QUpg_ms_m?cp(yxB|{kJzpR;p*^Nm|rYj)yNkuh*60seU4LG^dT)rZoZV?uIl4w&I2VJs9{jMAv6`z6 zl3^zf+cgR7w9u|emQ=M}Y?zI}Gj24SyVK%S=v6T6)1PZ|_m&Tn`>g)%dmWQb3Eo7A)$MR`+5gNr zBKH8&gTbPMIvjoACwF#{l%g))Kh`-A&t5rj1k44K;ONgDFd;$G;Mos- zLOXa`94C%Gl0D^nq*Fe(!y*Td_(qK5j6L+H>px;jTI{)2Kvn`^>)2LGAuv$HtA()l zTAx(JC)s2c`K!TOk=^670##*KLQdOqWraqb>EHDoxNqZ&L_eaY<>>}p9a*|`vb&5sCs21agBNM&0R45 zJI;v5rfCb1V04D8K2t5+57&6s7Y4;qDV6?s#7e1M zmgPdcW#C4y@$v1YtbtjJBrV1ej12g%Z{Kcg@B6+PMpUV(y&X*;?Op2tGBaxQK!YgQ zj0#k7@dmlkc5`g%j3<=sr7jYJ z2QvNv%2cWcqN2OF-^Huh$M1y0d8Im4_df~n{FVphNb_LM(Y&y$sxmr9A3kQ0c-o^n zpP%np$)!cZ;i5+7AFR$4n)Pry-!f**A#KuN|Lybg9Y|S+3@)qDA!nhPGYFP24IN;b zM5l1_kkJPdSXGv_W^COu=_`?y+?d6?``UIl+CaH7-#lMWB*qCi5+J6NV}p{o_irO3 ze%GTeJ3`%K-i)8OkKbU1Q4~LXk6BS;12fR^jUB{$uGfK=BL86v9AV>E&E}i=xD;{SrFoDIRPaXiquTG-~$XhC;gRNS&^qZzg2oPP*2bal)~!k zxL5rsdcdfr0L$BLp1!HU%gpP|?@5|q{9$~;lQ^N*AE#&lpYF8I;)a*NO97VW>sA-v zG*@xpmCHtLW*od+uYRp)biRBp#1uQc7z;Bpp`KA_r^7S9lnb_pq~B(O`x zF{vsoab;f7&!bblu~ z>jllgKW{YlJ%a5zjSajQI_9)Iln5?sz^2Z3C$XgOa!N_782UYmuFk2TOYt>Q_6C<~ z=3+~6hfrC^_gIdYR@*^R$D_a&I!slFI1xhxSs?|>XeICQcw|dNu$m@wZQZ!@69$TZ zxzcO^Jz&XPSx(pxQ=TILZT8%7q;>k8I%}ZQ5s)9gJc&G`%Ykf`haeVcNzfknMCjaK z_lbL~R?o8j7ORH`Y|R&jp7QpH5?tj2Xk8SU6I=2}q%xdc!02WwF&ad!(U-pm;CXU4 zG64imbN-X)w2vK&%?6d|YAjca(Fig(Helk>2QD~}x;&SYn`7UDK1ZhLV6o6K<7PmS z;8HdM?V9E+sv!t4F;mn^A|S<>8Y?l5q!_@ZAlHQ_!c|y3&YnUFbFf-)zlD8l=kj9t zdcGA@CYK?9zaT{P?^hlk?s>U!1J5m?=zuo%HE|a06E%>ZpTf*gLf4N985-F~`neHH z>g*gNdLb>)K}J}%YJa6#KJMO;E#ohV=a^~$tT7RaY{@H<)YSxN&r_a9OuS7tdsLru z(naK~yG-p&1LvvSNSXH8z$mA}Gkj!bL+&`L@w*ri-m5QEoPAFgVXuxvW8T71p+L{& z+=6U805SMhhr?#|IN-y<1QLS>Ge?x(Q@ShU0&e3-@NlnAL5#@<@fq$jk~I&LfANXQ zxJ_yhN#pBpKs3MPFhM86LxNS?`Xk#RWMSEKLVYI$Maj zluIQ58-(0(ECsbcxX|Cs&kN2&XFS}X_gnQvhc2{m8gQAI>ZAW38vB< zFzHQpPhDP>PO6wis6=;m`{C&l5VZV+Z-3ritKQ+j?)dqEd5)tJZd z(_Ds)860~Ov=$`KcT0wi5lHBHCy;yPu54P_D^@AUdX)aleAm503*mh-?+vYj>_I%$ zAqjSjgYnZ-0cMa4M1^Q0#vEaU1j72!6t+!U%ZG=UJ)SmtTOQm9!vVzDE%i4f#mFFq zz=wM=)@||EfHl`z&hOXh*CBX${;d|D3rV_i9G=AUzj_f-(LhSEsq`JGj`7_f=IozE zr@7;Z2#FNe?Rq4Rdo-?6$Y|*b7kxed{%F(N2krhsVoL2@2qu z#`wz%-sC8M1+o=KLlcL>h@DIK{d@CcHVewa|L0$~R~8*D{U4M+TE0d|R~J89f-*C~BIygQ}L8hu_O z%<%_OURcQ8eNmu134-x=pDDnb6Fe+nUSbO6hYK|Yc`JNUJ(61gCXo>;? zvgL;ZySNyf_xBs9DGS$iRPDoIul3gcI_KHLZ!pa7|H*`Jj-1{|`$E$3V#Gvk``lv{ zw|`8hkjKRyLv`JLcE=;GWymEp39jtw)`J>6>(zK^){Ps?WBsT?qsW1!Shg0h0@M!9 z!DwyJkSh8`Eo|Bvq5zYku;n?Ih|&X=@wO&2zEdq@ZX?v@TcHL1^`9TC1v~6~#g6N` zZ^rm?BlC>r&*FoT%xc_FEv(MPz$i!?4vZ4gr-lQ=g(2$SY(RV8$L$_sG=%!(bw6x!EJ8x#J)`v^@S@CGitaKSqZhp@%74~nWjVgwdE-Vm2k+#5afz|2hUf(`^v*@%8fD`q$+YQ5new^y8%9F77tHX3l8z!z-|}Ab$FT*9 zVgk0O>j8;a_(l-o^HvE?Yo8On9)4W$r$o{`&b^8bB*{^byjn_FKvSy`epYd^(;%jI zKIqc3&=#_5O}ywLyWym^H(l~I=@9w(`E2*b<48_Vkp_`xDcY5j@z+9sWlEXL^%Nn= z;}*XFsAW8a@)HIEFc%*b;LTIsA+6E^le1sX)ngR7Q;3q_d^&yHeBKy%-jd(H-2`nG zMF5DCUlew!zY<_pn4GUPxZIwIG-i`e6yTHr#EF$|a&@0Youj4gJ!_un*Nj)Ffy)9y zzx}Bz^8%H|Z-)znMAx(BH+2z^2)VL46PxFS_q}ZU0jLhmY=LHv4(;Sz_@XkqW}V4d z4a@Zl7jf_ul$zLI6bUyO>N2@b`BXlYxM38XrhIz@U_3HFRAcT6YZhE%yZ`_X$Vo&& zRE63psN8hN@AK{Ua(m5yL@2YWnRv$>Q`vx2vulg08^$V~rh9t4(WG^*>KJ;D?0uPB zdiErp*qo6Ew%jX~K!U>;qZuONbP8h6Go~YyptU_Gpnf-$e~P3%=Bii|+*zv+zEuL# z=?~1wgiJ*eVQ%f0nfME#mIKkrSZA}tgdShvotGYv{V*GRV%7F>tK^lYNTdHB`R<$Zn+@LI3Ks`_#Nz3_hSWLCrasW2w5MjZTU0}E z6S$=RdENK5)}@gqYIL$^nPn8YQm#BeGP18J{ACkoCWSd$)l#gLGvy}>R zV!2RX#eGip_%S8AZEHQzyWE7<(IsRcv3!vzC-iFR@nQQpZ19b{e%)QCg!;v&G_6++ zPzQ~0y>(6#-1xZ7(bT56dKFzHtV{+E9xrU7o5?FB2-eOM^Qem!w>j)vjqdnS`9gK4 zgnVP(tF)Ykx76nS*Xg<9L1vrOm$00sbz*H;@pNAA@@$#`D4V4d-QfNP+=M%U^;3HO zmS68LNq1uj^F_TOkqYUPiH`>hYvOM8HQwCS=Gz&8g@c#cx!Gs6i6Gs`b8S@q{H569_h^5F! z=LbCdjLrA<=s|;%uXZUI(P&9nzA|iG6SpSO9Bewr8l9d7b$XMF2<#3eqe4sO_GNXgmQW3k8SA|~SSQX#oax|}S*hz@~6 z9YkiaZ~2lo3j+<|?oHd8%?81?e-Rx9382#(swx=tDd@M4;TKiPeahU&Z(>}Iz`G1- zeMv~7KS?@_0Nfj)Hi{(7eJ*OUigQ*z$7}eXru+Eu&t;5{RvAP-aSHrTyuKtrYuk0I zzFhzu;!6k#U^$NPW5$TIK2J&Tp7dS4rW$RXv>LgUZT(5A#-+fhZBN^@AR_QYMazHN znjXcyI390LEOU0&uomVioU#h*sK zTwQK6tFUrp6sjFqe7#JW@x>>xU(s6BA|(1cGP(rO$zddh4fzvYV(1cK1AyeCP@0=6 zN8|2E-O0nd!Y?S}KdVWp8O>&Oc;9)9^9=m_^1fLFTLFB3{kGydI-XbOQ#ATtW84*Z zKRmnO)76(_-0JYQ8QyfbOeYXjiB_*W&w9flreQe4oAd@*&KK3qcZz460R?>&V#tqQ zGvBX&aHE@gzrN6zy}2GE1$`fy7C)dlR*@ zMRT)92GAtMR;AIJrzVUdrbSzEe;Wl_b=tngo7p(H%mNpjty@bfD`~R4;JWXc$4dIx@v)RkjOlj&TR zO4ZB?+Bl3A&OF_4GkZU-D)4|i37OA1`}*7GgZWU8ba=nJR4ZamU2r?a{_=R^M0H-> znlb5){@M+?9X>mJFk-M4WRsH?tNihxGSP1L_Qwz-iGm)wlc*@Iv&icB0JbvT{X6@YS2Ay7w3YIBQyW0#L1zOexXZ(MViLL5>n% z3`0j$RN-AEJC+G!YJ~a|`Iv|2!iLO8v|iC$%>td9?4Aud)jb{-)~upiINeo#lr%lI zvFT0hBK>bl=$uR2PX0;?yFNh%;p+S4kV-FJJ_^pNI0I9GSF86OFp}4=5E@snf)CCt zIJTqaf0xUm)vD~v_vbe&?Mg79@dXmgG#HH{Jd@1=)E_mh_;{l=J!)tYzX^DH9AmWO z=fsO(`URO#GT=wyi+rk;bwuJs&-=Pk4d&Yl{zq|q%mXm(SjV){>p$JqDQNeQ34-jC zxAHW7Yf_(EJqZ>wSdKj;{-$U1DWXv%E&!TnBH?M&9s%cOmPWzI4cFU?naL=pj^0TF zkW}V|z$pScYy(k3^GelMB}f-Vs@tPO#He)-h3B@#dCL5hy#U8Xy+Q6VXbzxkK(9AS|MudurZ<%T7%s*yv0b`Y-x{STZl}5Y8g+)}T zSik$+WHO@KHoldN8i4uos4=O9#hq>BS+t`kEYV2SWS$k?q=&`aBON`1r4bk7o&~TO zg9_cFJphvfw_obp&oi#dyd*p?Zf*dhRlK~t?b3WpYTTanb-FU}TXW@bxEuxt5tlOFi6zu8Nc1Aj zDY(IVE)%)Y;0Q~nwj>T=RdgpkBw;R-8URO6j|B)C7UzW`%b@ek8^Thl`5LWHMUQ>yepyd?^wxl`KpaGfg_$F^lx9WsKHLmyD&6 z<_nG?a+mN{lWGK?x%%DPPe zgjOD?HlH21%5_(y2`4dgpHSi)g+YEkX?&?h{`c=lJg+#1=r|)pVdvF%b8$x;F&JId z@;IUn`AG3cQsRM$VlNC|@~_c|R|s&_71)JHkINw@6w{y5GYkKXAiShKO)}OGXgl9- z%W_*@<9%JH4v&%vULd>n{?EgR%;9cM02?n>dqNQgyqWei^ax<25Dj9-KlwVU-q6A+ zKc-V(`pehH!~t$`zl`Ej>+#r}wx0yoHt)X=lv2lnmTBt0zFoyFP`Ab;;eI6j_Ktsh z{D+RNDvXUt6l?b2RNdY!UC+@~a2Rnzht=Cz@-DNit;g*8487JpZq>`)=UoO%#n%-Z z?G3mf3TO|ftnN^*?evJHJoCB#F(7+!(J^UH{v~2XR`=ex?5xe!!@Ma1S z7QabWONp+Wn^N9c7Osneje=4MhH2w92&!$gL)mr;bDmEws*yn=R6QuyEk9$F2ohrgFPl?gt-haE!RqnP}M?;IbH*oThG+mTGEsk<^-^Y8(@K&|g zrif*ur%0?R`EHR_*CcWx>qA~$9PVWj%JF)fQ$;4h3Na5S0=53@kH_t%N6U0=99Eq*)_jiKr<6({rF)TP0ZW8Ov&eSIyQ6wG4DH@Z=sr6rWis8L7qjEn*`nP2A+X`LZbXF z{w!ZJK90Y!f(zRMqPpB3Odw0d2VhQDSa-K8MF#Z8uWVt4J?Vmgqx*a7^br#&8HN&cL3(r60Ul%i%eW%7t9V&XLtB6vA!2rJ}xBYC6g zNtcvqF)p*zPvDGfX7Z{bnuc#8#%dy=j$Q+MH{pCH|4NcmN!Q!T+>2ABOw87QUM6-n z6Hb%Fk%bjt0_4>$Cu4_Yj8`X?jkT>Mr={Gi7wHhY)V?df=xI?DFaUwQ;F07CT1a#P zqK6myzle;>|7tpS6@-BxilUK#5FfCGE7~r>I;leb!0+;N{72`UiH%hXVTakdv-d&q zMf)3ZbeyvYXQRr|pkKDl@!_D;CDq2GTY`<4@c5n1X%onePG^iJ2}GI9GrYRGL9;&X zQmnTqSK^RW{d2pj$U?r!rPewxe%AqP+AL zg>g(#aoThUN($KlWCclgDH|%%n|WwxY!TbKp|612*?y16`Od@fKffw zM5X#p(~fBejLCTd6KWguLL4uuRMjV7U (meta:get_int("ignite") + 10) then - collapse_pile(pos) - minetest.remove_node(pos) - return false - end - else - if num_ignore(pos) == 0 and (num_wood(pos) ~= 26 or num_dirt(pos) ~= 98) then - collapse_pile(pos) - minetest.remove_node(pos) - return false - elseif minetest.get_gametime() > (meta:get_int("ignite") + PILE_BURN_TIME) then - convert_to_coal(pos) - return false - end - end - return true -end - -function techage.stop_pile(pos) - collapse_pile(pos) -end - - -minetest.register_node("techage:dirt_with_ash", { - description = S("Dirt with Ash"), - tiles = { - "techage_ash.png", - "default_dirt.png", - {name = "default_dirt.png^techage_ash_side.png", - tileable_vertical = false}}, - groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, not_in_creative_inventory=1}, - drop = 'default:dirt', - sounds = default.node_sound_dirt_defaults({ - footstep = {name = "default_grass_footstep", gain = 0.4}, - }), -}) - - -minetest.register_node("techage:charcoal_burn", { - tiles = {"techage_charcoal_burn.png"}, - after_place_node = function(pos) - minetest.get_node_timer(pos):start(math.random(COAL_BURN_TIME, COAL_BURN_TIME*1.2)) - end, - on_timer = function(pos) - minetest.remove_node(pos) - return false - end, - drop = "", - paramtype = "light", - light_source = 10, - is_ground_content = false, - groups = {crumbly = 2, falling_node = 1, not_in_creative_inventory=1}, - sounds = default.node_sound_dirt_defaults(), -}) - -minetest.register_node("techage:charcoal", { - description = S("TA1 Charcoal"), - tiles = {"techage_charcoal.png"}, - on_ignite = function(pos, igniter) - minetest.after(2, minetest.swap_node, pos, {name = "techage:charcoal_burn"}) - minetest.after(COAL_BURN_TIME/2, minetest.remove_node, pos) - end, - is_ground_content = false, - groups = {crumbly = 2, falling_node = 1}, - sounds = default.node_sound_dirt_defaults(), -}) - - -minetest.register_craft({ - type = "fuel", - recipe = "techage:charcoal", - burntime = 120, -}) - -minetest.register_lbm({ - label = "[techage] Lighter update", - name = "techage:lighter_update", - nodenames = {"techage:lighter_burn"}, - run_at_every_load = true, - action = function(pos, node) - local meta = minetest.get_meta(pos) - if meta:get_int("running") == 1 then - start_smoke(pos) - end - end -}) diff --git a/techage/iron_age/coalburner.lua b/techage/iron_age/coalburner.lua deleted file mode 100644 index d1e9523..0000000 --- a/techage/iron_age/coalburner.lua +++ /dev/null @@ -1,248 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Coalburner as heater for the Meltingpot - -]]-- - -local S = techage.S - -local COAL_BURN_TIME = 1200 -local CYCLE_TIME = 5 - -local function num_coal(pos) - local pos1 = {x=pos.x, y=pos.y+1, z=pos.z} - local pos2 = {x=pos.x, y=pos.y+32, z=pos.z} - local nodes = minetest.find_nodes_in_area(pos1, pos2, {"techage:charcoal", "techage:charcoal_burn"}) - return #nodes -end - -local function num_cobble(pos, height) - local pos1 = {x=pos.x-1, y=pos.y+1, z=pos.z-1} - local pos2 = {x=pos.x+1, y=pos.y+height, z=pos.z+1} - local nodes = minetest.find_nodes_in_area(pos1, pos2, {"default:cobble", "default:desert_cobble", "default:mossycobble", "techage:basalt_cobble", "techage:bauxite_cobble"}) - return #nodes -end - -local function num_air(pos) - local pos1 = {x=pos.x-1, y=pos.y, z=pos.z-1} - local pos2 = {x=pos.x+1, y=pos.y, z=pos.z+1} - local nodes = minetest.find_nodes_in_area(pos1, pos2, {"air"}) - return #nodes -end - -local function start_burner(pos, height) - local pos1 = {x=pos.x-1, y=pos.y+1, z=pos.z-1} - local pos2 = {x=pos.x+1, y=pos.y+height, z=pos.z+1} - for _,p in ipairs(minetest.find_nodes_in_area(pos1, pos2, "techage:charcoal")) do - minetest.swap_node(p, {name = "techage:charcoal_burn"}) - end -end - -local function remove_coal(pos, height) - local pos1 = {x=pos.x-1, y=pos.y+1, z=pos.z-1} - local pos2 = {x=pos.x+1, y=pos.y+height, z=pos.z+1} - for _,p in ipairs(minetest.find_nodes_in_area(pos1, pos2, "techage:charcoal_burn")) do - minetest.remove_node(p) - end -end - -local function remove_flame(pos, height) - local idx - pos = {x=pos.x, y=pos.y+height, z=pos.z} - for idx=height,1,-1 do - pos = {x=pos.x, y=pos.y+1, z=pos.z} - local node = techage.get_node_lvm(pos) - if string.find(node.name, "techage:flame") then - minetest.remove_node(pos) - elseif node.name == "techage:meltingpot" then - techage.update_heat(pos) - end - end -end - -local function calc_num_coal(height, burn_time) - local num = height - if burn_time < 0 then - local x = (COAL_BURN_TIME * 0.2) / height - num = math.max(height + math.floor(burn_time/x), 0) - end - return num -end - -local function flame(pos, height, heat, first_time) - local idx - local playername = minetest.get_meta(pos):get_string("playername") - pos = {x=pos.x, y=pos.y+height, z=pos.z} - for idx=heat,1,-1 do - pos = {x=pos.x, y=pos.y+1, z=pos.z} - idx = math.min(idx, 12) - local node = techage.get_node_lvm(pos) - if node.name == "techage:meltingpot_active" or node.name == "ignore" then - return - end - if node.name == "techage:meltingpot" then - if first_time then - techage.switch_to_active(pos) - else - techage.update_heat(pos) - end - return - end - if minetest.is_protected(pos, playername) then - return - end - minetest.add_node(pos, {name = "techage:flame"..math.min(idx,7)}) - local meta = minetest.get_meta(pos) - meta:set_int("heat", idx) - end -end - - -local lRatio = {120, 110, 95, 75, 55, 28, 0} -local lColor = {"000080", "400040", "800000", "800000", "800000", "800000", "800000"} - -for idx,ratio in ipairs(lRatio) do - local color = "techage_flame_animated.png^[colorize:#"..lColor[idx].."B0:"..ratio - minetest.register_node("techage:flame"..idx, { - tiles = { - { - name = color, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1 - }, - }, - }, - - after_destruct = function(pos, oldnode) - pos.y = pos.y + 1 - local node = techage.get_node_lvm(pos) - if minetest.get_item_group(node.name, "techage_flame") > 0 then - minetest.remove_node(pos) - end - end, - - drawtype = "glasslike", - use_texture_alpha = techage.BLEND, - inventory_image = "techage_flame.png", - paramtype = "light", - light_source = 13, - walkable = false, - buildable_to = true, - floodable = true, - sunlight_propagates = true, - damage_per_second = 4 + idx, - groups = {igniter = 2, dig_immediate = 3, techage_flame=1, not_in_creative_inventory=1}, - drop = "", - }) -end - -minetest.register_node("techage:ash", { - description = S("Ash"), - tiles = {"techage_ash.png"}, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = { - {-4/8, -4/8, -4/8, 4/8, -3/8, 4/8}, - }, - }, - is_ground_content = false, - groups = {crumbly = 3, not_in_creative_inventory=1}, - drop = "", - sounds = default.node_sound_defaults(), -}) - -function techage.start_burner(pos, playername) - local height = num_coal(pos) - if minetest.is_protected( - {x=pos.x, y=pos.y+height, z=pos.z}, - playername) then - return - end - if num_cobble(pos, height) == height * 8 then - local meta = minetest.get_meta(pos) - --meta:set_int("ignite", minetest.get_gametime()) - meta:set_int("burn_time", COAL_BURN_TIME) - meta:set_int("height", height) - start_burner(pos, height) - flame(pos, height, height, true) - local handle = minetest.sound_play("techage_gasflare", { - pos = {x=pos.x, y=pos.y+height, z=pos.z}, - max_hear_distance = 20, - gain = height/12.0, - loop = true}) - meta:set_int("handle", handle) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end -end - -function techage.keep_running_burner(pos) - local meta = minetest.get_meta(pos) - local height = meta:get_int("height") - remove_flame(pos, height) - local handle = meta:get_int("handle") - if handle then - minetest.sound_stop(handle) - meta:set_int("handle", 0) - end - local burn_time = meta:get_int("burn_time") - -- burner hole is open - if num_air(pos) == 1 then - meta:set_int("burn_time", burn_time - CYCLE_TIME) - -- tower intact - if num_cobble(pos, height) == height * 8 then - local num_coal = calc_num_coal(height, burn_time) - if num_coal > 0 then - if meta:get_int("paused") == 1 then - flame(pos, height, num_coal, true) - meta:set_int("paused", 0) - else - flame(pos, height, num_coal, false) - end - handle = minetest.sound_play("techage_gasflare", { - pos = {x=pos.x, y=pos.y+height, z=pos.z}, - max_hear_distance = 32, - gain = num_coal/12.0, - loop = true}) - meta:set_int("handle", handle) - else - minetest.swap_node(pos, {name="techage:ash"}) - remove_coal(pos, height) - local handle = meta:get_int("handle") - minetest.sound_stop(handle) - return false - end - else - minetest.swap_node(pos, {name="techage:ash"}) - remove_coal(pos, height) - local handle = meta:get_int("handle") - minetest.sound_stop(handle) - return false - end - else - meta:set_int("paused", 1) - end - return true -end - -function techage.stop_burner(pos) - local meta = minetest.get_meta(pos) - local height = meta:get_int("height") - remove_flame(pos, height) - remove_coal(pos, height) - local handle = meta:get_int("handle") - minetest.sound_stop(handle) - meta:set_int("burn_time", 0) -end diff --git a/techage/iron_age/gravelsieve.lua b/techage/iron_age/gravelsieve.lua deleted file mode 100644 index 3bec992..0000000 --- a/techage/iron_age/gravelsieve.lua +++ /dev/null @@ -1,212 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Gravel Sieve, sieving gravel to find ores - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local get_random_gravel_ore = techage.gravelsieve_get_random_gravel_ore -local get_random_basalt_ore = techage.gravelsieve_get_random_basalt_ore - --- handle the sieve animation -local function swap_node(pos) - local node = techage.get_node_lvm(pos) - local idx = string.byte(node.name, -1) - 48 - idx = (idx + 1) % 4 - minetest.swap_node(pos, {name = "techage:sieve"..idx, param2 = node.param2}) - return idx == 3 -- true if done -end - -local function push_items(pos, items) - local pos1 = {x=pos.x, y=pos.y-1, z=pos.z} - local node = techage.get_node_lvm(pos1) - minetest.add_item({x=pos.x, y=pos.y-0.4, z=pos.z}, items) -end - -local function minecart_hopper_takeitem(pos, num) - for _, obj in pairs(minetest.get_objects_inside_radius({x=pos.x, y=pos.y-0.4, z=pos.z}, 0.2)) do - local entity = obj:get_luaentity() - if not obj:is_player() and entity and entity.name == "__builtin:item" then - obj:remove() - return ItemStack(entity.itemstring or "air") - end - end -end - -local function minecart_hopper_untakeitem(pos, in_dir, stack) - push_items(pos, stack) -end - -local function keep_running(pos, elapsed) - if swap_node(pos) then - local inv = M(pos):get_inventory() - local src, dst - - if inv:contains_item("src", ItemStack("techage:basalt_gravel")) then - dst, src = get_random_basalt_ore(), ItemStack("techage:basalt_gravel") - elseif inv:contains_item("src", ItemStack("default:gravel")) then - dst, src = get_random_gravel_ore(), ItemStack("default:gravel") - elseif not inv:is_empty("src") then - src = inv:get_stack("src", 1):take_item(1) - dst = src - else - return false - end - push_items(pos, dst) - inv:remove_item("src", src) - end - local inv = M(pos):get_inventory() - return not inv:is_empty("src") -end - -local function on_construct(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", S("TA1 Gravel Sieve")) - local inv = meta:get_inventory() - inv:set_size('src', 1) -end - -local function on_punch(pos, node, puncher, pointed_thing) - local wielded_item = puncher:get_wielded_item():get_name() - if wielded_item == "default:gravel" or wielded_item == "techage:basalt_gravel" then - local inv = M(pos):get_inventory() - local stack = ItemStack(wielded_item) - if inv:room_for_item("src", stack) then - inv:add_item("src", stack) - minetest.swap_node(pos, {name = "techage:sieve0"}) - minetest.get_node_timer(pos):start(1.5) - local w = puncher:get_wielded_item() - if not minetest.is_creative_enabled(puncher:get_player_name()) then - w:take_item(1) - puncher:set_wielded_item(w) - end - end - end -end - -local tiles_data = { - -- up, down, right, left, back, front - "techage_sieve_gravel_ta1.png", - "techage_sieve_gravel_ta1.png", - "techage_sieve_sieve_ta1.png", - "techage_sieve_sieve_ta1.png", - "techage_sieve_sieve_ta1.png", - "techage_sieve_sieve_ta1.png", -} - -local nodebox_data = { - { -8/16, -3/16, -8/16, 8/16, 4/16, -6/16 }, - { -8/16, -3/16, 6/16, 8/16, 4/16, 8/16 }, - { -8/16, -3/16, -8/16, -6/16, 4/16, 8/16 }, - { 6/16, -3/16, -8/16, 8/16, 4/16, 8/16 }, - - { -8/16, -8/16, -8/16, -6/16, -3/16, -6/16 }, - { 6/16, -8/16, -8/16, 8/16, -3/16, -6/16 }, - { -8/16, -8/16, 6/16, -6/16, -3/16, 8/16 }, - { 6/16, -8/16, 6/16, 8/16, -3/16, 8/16 }, - - { -6/16, -2/16, -6/16, 6/16, 8/16, 6/16 }, -} - -for idx = 0,3 do - nodebox_data[9][5] = (8 - 2*idx) / 16 - if idx == 3 then - tiles_data[1] = "techage_sieve_top_ta1.png" - end - - minetest.register_node("techage:sieve"..idx, { - description = S("TA1 Gravel Sieve"), - tiles = table.copy(tiles_data), - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = table.copy(nodebox_data), - }, - selection_box = { - type = "fixed", - fixed = { -8/16, -3/16, -8/16, 8/16, 4/16, 8/16 }, - }, - - on_construct = idx == 3 and on_construct or nil, - on_punch = idx == 3 and on_punch or nil, - on_timer = keep_running, - - minecart_hopper_takeitem = minecart_hopper_takeitem, - minecart_hopper_untakeitem = minecart_hopper_untakeitem, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sounds = default.node_sound_wood_defaults(), - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, not_in_creative_inventory = (idx == 3) and 0 or 1}, - drop = "techage:sieve3", - }) -end - -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() - if inv:room_for_item("src", stack) then - inv:add_item("src", stack) - minetest.get_node_timer(pos):start(1.5) - return true - end - return false - end, -}) - -minetest.register_node("techage:sieved_gravel", { - description = S("Sieved Gravel"), - tiles = {"default_gravel.png"}, - groups = {crumbly=2, falling_node=1, not_in_creative_inventory=1}, - sounds = default.node_sound_gravel_defaults(), -}) - -minetest.register_node("techage:compressed_gravel", { - description = S("Compressed Gravel"), - tiles = {"techage_compressed_gravel.png"}, - groups = {cracky=2, crumbly = 2}, - sounds = default.node_sound_gravel_defaults(), -}) - -minetest.register_craft({ - output = "techage:sieve", - recipe = { - {"group:wood", "", "group:wood"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - {"group:wood", "", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = "techage:compressed_gravel", - recipe = { - {"techage:sieved_gravel", "techage:sieved_gravel"}, - {"techage:sieved_gravel", "techage:sieved_gravel"}, - }, -}) - -minetest.register_craft({ - type = "cooking", - output = "default:cobble", - recipe = "techage:compressed_gravel", - cooktime = 10, -}) - -minetest.register_alias("techage:sieve", "techage:sieve3") -minetest.register_alias("techage:auto_sieve", "techage:auto_sieve3") diff --git a/techage/iron_age/hammer.lua b/techage/iron_age/hammer.lua deleted file mode 100644 index c760b61..0000000 --- a/techage/iron_age/hammer.lua +++ /dev/null @@ -1,246 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Hammer to convert stone into gravel - -]]-- - -local S = techage.S - -local Stone2Gravel = { - ["default:stone"] = "default:gravel", - ["default:cobble"] = "default:gravel", - ["default:desert_stone"] = "default:gravel", - ["techage:basalt_stone"] = "techage:basalt_gravel", - ["techage:basalt_cobble"] = "techage:basalt_gravel", - ["techage:bauxite_stone"] = "techage:bauxite_gravel", - ["techage:bauxite_cobble"] = "techage:bauxite_gravel", -} - -function techage.register_stone_gravel_pair(stone_name, gravel_name) - Stone2Gravel[stone_name] = gravel_name -end - --- Pipeworks uses a fakeplayer based on the owner of the nodebraker. -local function is_real_player(player) - return minetest.is_player(player) and not player.is_fake_player -end - -local function handler(player_name, node, itemstack, digparams) - local pos = techage.dug_node[player_name] - if not pos then return end - techage.dug_node[player_name] = nil - - if minetest.is_protected(pos, player_name) then - minetest.record_protection_violation(pos, player_name) - return - end - - if minetest.get_item_group(node.name, "stone") > 0 then - -- Remove item from players inventory or from the world - local ndef = minetest.registered_nodes[node.name] - if ndef then - local item = ItemStack(ndef.drop or node.name) - local inv = minetest.get_inventory({type="player", name=player_name}) - if inv and inv:room_for_item("main", item) then - -- item should have been added and can therefore be removed again - local taken = inv:remove_item("main", item) - else - for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do - obj:remove() - break - end - end - end - if Stone2Gravel[node.name] then - node.name = Stone2Gravel[node.name] - else - node.name = "default:gravel" - end - minetest.swap_node(pos, node) - minetest.check_single_for_falling(pos) - end -end - -minetest.register_tool("techage:hammer_stone", { - description = S("TA1 Stone Hammer (smash stone to gravel)"), - inventory_image = "techage_tool_hammer_stone.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=6.00, [2]=2.5, [3]=1.2}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, - after_use = function(itemstack, user, node, digparams) - if is_real_player(user) then - minetest.after(0.01, handler, user:get_player_name(), node) - end - itemstack:add_wear(digparams.wear) - return itemstack - end, -}) - -minetest.register_tool("techage:hammer_bronze", { - description = S("TA1 Bronze Hammer (smash stone to gravel)"), - inventory_image = "techage_tool_hammer_bronze.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=5.00, [2]=2.0, [3]=1.0}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, - after_use = function(itemstack, user, node, digparams) - if is_real_player(user) then - minetest.after(0.01, handler, user:get_player_name(), node) - end - itemstack:add_wear(digparams.wear) - return itemstack - end, -}) - -minetest.register_tool("techage:hammer_steel", { - description = S("TA1 Steel Hammer (smash stone to gravel)"), - inventory_image = "techage_tool_hammer_steel.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=50, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, - after_use = function(itemstack, user, node, digparams) - if is_real_player(user) then - minetest.after(0.01, handler, user:get_player_name(), node) - end - itemstack:add_wear(digparams.wear) - return itemstack - end, -}) - -minetest.register_tool("techage:hammer_mese", { - description = S("TA1 Mese Hammer (smash stone to gravel)"), - inventory_image = "techage_tool_hammer_mese.png", - tool_capabilities = { - full_punch_interval = 0.9, - max_drop_level=3, - groupcaps={ - cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=60, maxlevel=3}, - }, - damage_groups = {fleshy=5}, - }, - sound = {breaks = "default_tool_breaks"}, - after_use = function(itemstack, user, node, digparams) - if is_real_player(user) then - minetest.after(0.01, handler, user:get_player_name(), node) - end - itemstack:add_wear(digparams.wear) - return itemstack - end, -}) - -minetest.register_tool("techage:hammer_diamond", { - description = S("TA1 Diamond Hammer (smash stone to gravel)"), - inventory_image = "techage_tool_hammer_diamond.png", - tool_capabilities = { - full_punch_interval = 0.9, - max_drop_level=3, - groupcaps={ - cracky = {times={[1]=2.0, [2]=1.0, [3]=0.50}, uses=70, maxlevel=3}, - }, - damage_groups = {fleshy=5}, - }, - sound = {breaks = "default_tool_breaks"}, - after_use = function(itemstack, user, node, digparams) - if is_real_player(user) then - minetest.after(0.01, handler, user:get_player_name(), node) - end - itemstack:add_wear(digparams.wear) - return itemstack - end, -}) - -if minetest.global_exists("wielded_light") then - minetest.register_tool("techage:hammer_meridium", { - description = S("TA1 Meridium Hammer (smash stone to gravel)"), - inventory_image = "techage_tool_hammer_meridium.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=60, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, - light_source = 12, - after_use = function(itemstack, user, node, digparams) - minetest.after(0.01, handler, user:get_player_name(), node) - itemstack:add_wear(digparams.wear) - return itemstack - end, - }) - minetest.register_craft({ - output = "techage:hammer_meridium 2", - recipe = { - {"techage:meridium_ingot", "group:stick", "techage:meridium_ingot"}, - {"techage:meridium_ingot", "group:stick", "techage:meridium_ingot"}, - {"", "group:stick", ""}, - } - }) -end - -minetest.register_craft({ - output = "techage:hammer_stone 2", - recipe = { - {"default:cobble", "group:stick", "default:cobble"}, - {"default:cobble", "group:stick", "default:cobble"}, - {"", "group:stick", ""}, - } -}) -minetest.register_craft({ - output = "techage:hammer_bronze 2", - recipe = { - {"default:bronze_ingot", "group:stick", "default:bronze_ingot"}, - {"default:bronze_ingot", "group:stick", "default:bronze_ingot"}, - {"", "group:stick", ""}, - } -}) -minetest.register_craft({ - output = "techage:hammer_steel 2", - recipe = { - {"default:steel_ingot", "group:stick", "default:steel_ingot"}, - {"default:steel_ingot", "group:stick", "default:steel_ingot"}, - {"", "group:stick", ""}, - } -}) -minetest.register_craft({ - output = "techage:hammer_mese 2", - recipe = { - {"default:mese_crystal", "group:stick", "default:mese_crystal"}, - {"default:mese_crystal", "group:stick", "default:mese_crystal"}, - {"", "group:stick", ""}, - } -}) -minetest.register_craft({ - output = "techage:hammer_diamond 2", - recipe = { - {"default:diamond", "group:stick", "default:diamond"}, - {"default:diamond", "group:stick", "default:diamond"}, - {"", "group:stick", ""}, - } -}) diff --git a/techage/iron_age/hopper.lua b/techage/iron_age/hopper.lua deleted file mode 100644 index 745b301..0000000 --- a/techage/iron_age/hopper.lua +++ /dev/null @@ -1,92 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Simple TA1 Hopper - -]]-- - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - --- use the minecart hopper -minetest.register_alias("techage:hopper_ta1", "minecart:hopper") - - -minecart.register_inventory( - { - "techage:chest_ta2", "techage:chest_ta3", "techage:chest_ta4", - "techage:meltingpot", "techage:meltingpot_active", "techage:ta4_reactor", - }, - { - put = { - listname = "main", - }, - take = { - listname = "main", - }, - } -) - - - - -minecart.register_inventory( - { - "techage:ta2_distributor_pas", "techage:ta2_distributor_act", - "techage:ta3_distributor_pas", "techage:ta3_distributor_act", - "techage:ta4_distributor_pas", "techage:ta4_distributor_act", - "techage:ta4_high_performance_distributor_pas", "techage:ta4_high_performance_distributor_act", - }, - { - put = { - allow_inventory_put = function(pos, stack, player_name) - CRD(pos).State:start_if_standby(pos) - return true - end, - listname = "src", - }, - take = { - listname = "src", - }, - } -) - -minecart.register_inventory( - { - "techage:sieve0", "techage:sieve1", "techage:sieve2", "techage:sieve3", - }, - { - put = { - allow_inventory_put = function(pos, stack, player_name) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv:is_empty("src") then - minetest.get_node_timer(pos):start(2) - return true - end - end, - listname = "src", - }, - } -) - -minecart.register_inventory( - { - "techage:ta1_mill_base", - }, - { - put = { - listname = "src", - }, - take = { - listname = "dst", - }, - } -) diff --git a/techage/iron_age/lighter.lua b/techage/iron_age/lighter.lua deleted file mode 100644 index 8885f0d..0000000 --- a/techage/iron_age/lighter.lua +++ /dev/null @@ -1,89 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Lighter for Coalburner and Charcoalpile - -]]-- - -local S = techage.S - -minetest.register_node("techage:lighter_burn", { - tiles = {"techage_lighter_burn.png"}, - - after_place_node = function(pos) - techage.start_pile(pos) - end, - - on_timer = function(pos, elapsed) - return techage.keep_running_pile(pos) - end, - - on_destruct = function(pos) - techage.stop_pile(pos) - end, - - drop = "", - light_source = 10, - is_ground_content = false, - groups = {crumbly = 3, snappy = 3, oddly_breakable_by_hand = 1, not_in_creative_inventory=1}, - sounds = default.node_sound_dirt_defaults(), -}) - -minetest.register_node("techage:coal_lighter_burn", { - tiles = {"techage_lighter_burn.png"}, - - after_place_node = function(pos) - local meta = minetest.get_meta(pos) - local playername = meta:get_string("playername") - techage.start_burner(pos, playername) - end, - - on_timer = function(pos, elapsed) - return techage.keep_running_burner(pos) - end, - - on_destruct = function(pos) - techage.stop_burner(pos) - end, - - drop = "", - light_source = 10, - is_ground_content = false, - groups = {crumbly = 3, snappy = 3, oddly_breakable_by_hand = 1, not_in_creative_inventory=1}, - sounds = default.node_sound_dirt_defaults(), -}) - -minetest.register_node("techage:lighter", { - description = S("TA1 Lighter"), - tiles = {"techage_lighter.png"}, - on_ignite = function(pos, igniter) - if minetest.find_node_near(pos, 1, "techage:charcoal") then - minetest.after(1, techage.ironage_swap_node, pos, "techage:coal_lighter_burn") - else - minetest.after(1, techage.ironage_swap_node, pos, "techage:lighter_burn") - end - end, - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_string("playername", placer:get_player_name()) - end, - is_ground_content = false, - groups = {crumbly = 3, snappy = 3, oddly_breakable_by_hand = 1, flammable = 2}, - sounds = default.node_sound_dirt_defaults(), -}) - -minetest.register_craft({ - output = 'techage:lighter 2', - recipe = { - {'group:wood'}, - {'farming:straw'}, - {''}, - } -}) diff --git a/techage/iron_age/main.lua b/techage/iron_age/main.lua deleted file mode 100644 index eb2d59f..0000000 --- a/techage/iron_age/main.lua +++ /dev/null @@ -1,28 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - -]]-- - -function techage.ironage_swap_node(pos, name) - minetest.swap_node(pos, {name = name}) - local node = minetest.registered_nodes[name] - if node.on_construct then - node.on_construct(pos) - end - if node.after_place_node then - node.after_place_node(pos) - end -end - -function techage.ironage_swap_nodes(pos1, pos2, name1, name2) - for _,p in ipairs(minetest.find_nodes_in_area(pos1, pos2, name1)) do - techage.ironage_swap_node(p, name2) - end -end diff --git a/techage/iron_age/meltingpot.lua b/techage/iron_age/meltingpot.lua deleted file mode 100644 index 498df82..0000000 --- a/techage/iron_age/meltingpot.lua +++ /dev/null @@ -1,517 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Meltingpot to produce metal and alloy ingots - -]]-- - -local S = techage.S - -local SMELTING_TIME = 2 - -local Tabs = S("Menu,Recipes") - -local Recipes = {} -- registered recipes -local KeyList = {} -- index to Recipes key translation -local NumRecipes = 0 -local Cache = {} -- store melting pot inventory data - --- formspec images -local function draw(images) - local tbl = {} - for y=0,4 do - for x=0,4 do - local idx = 1 + x + y * 5 - local img = images[idx] - if img ~= false then - tbl[#tbl+1] = "image["..(x*0.8)..","..(y*0.8)..";0.8,0.8;"..img..".png]" - end - end - end - return table.concat(tbl) -end - -local formspec1 = - "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "tabheader[0,0;tab;"..Tabs..";1;;true]".. - "label[1,0.2;"..S("Menu").."]".. - - "container[1,1]".. - "list[current_name;src;0,0;2,2;]".. - "item_image[2.6,0;0.8,0.8;techage:meltingpot]".. - "image[2.3,0.6;1.6,1;gui_furnace_arrow_bg.png^[transformR270]".. - "list[current_name;dst;4,0;2,2;]".. - "container_end[]".. - - "list[current_player;main;0,4;8,4;]".. - "listring[current_name;dst]".. - "listring[current_player;main]".. - "listring[current_name;src]".. - "listring[current_player;main]" - -local function formspec2(idx) - idx = math.min(idx, #KeyList) - local key = KeyList[idx] - local input1 = Recipes[key].input[1] or "" - local input2 = Recipes[key].input[2] or "" - local input3 = Recipes[key].input[3] or "" - local input4 = Recipes[key].input[4] or "" - local num = Recipes[key].number - local heat = Recipes[key].heat - local time = Recipes[key].time - local output = Recipes[key].output - if num > 1 then - output = output.." "..num - end - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "tabheader[0,0;tab;"..Tabs..";2;;true]".. - "label[1,0.2;"..S("Melting Guide").."]".. - - "container[1,1]".. - "item_image_button[0,0;1,1;"..input1..";b1;]".. - "item_image_button[1,0;1,1;"..input2..";b2;]".. - "item_image_button[0,1;1,1;"..input3..";b3;]".. - "item_image_button[1,1;1,1;"..input4..";b4;]".. - "item_image[2.6,0;0.8,0.8;techage:meltingpot]".. - "image[2.3,0.6;1.6,1;gui_furnace_arrow_bg.png^[transformR270]".. - "item_image_button[4,0.5;1,1;"..output..";b5;]".. - "label[2,2.2;"..S("Heat")..": "..heat.." / "..S("Time")..": "..time.." s]".. - "label[2,4;Recipe "..idx.." of "..NumRecipes.."]".. - "button[2,5.5;1,1;priv;<<]".. - "button[3,5.5;1,1;next;>>]".. - "container_end[]" -end - -local function on_receive_fields(pos, formname, fields, sender) - local meta = minetest.get_meta(pos) - local recipe_idx = meta:get_int("recipe_idx") - if recipe_idx == 0 then recipe_idx = 1 end - if fields.tab == "1" then - meta:set_string("formspec", formspec1) - elseif fields.tab == "2" then - meta:set_string("formspec", formspec2(recipe_idx)) - elseif fields.next == ">>" then - recipe_idx = math.min(recipe_idx + 1, NumRecipes) - meta:set_int("recipe_idx", recipe_idx) - meta:set_string("formspec", formspec2(recipe_idx)) - elseif fields.priv == "<<" then - recipe_idx = math.max(recipe_idx - 1, 1) - meta:set_int("recipe_idx", recipe_idx) - meta:set_string("formspec", formspec2(recipe_idx)) - end -end - -local function can_dig(pos, player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("dst") and inv:is_empty("src") -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if listname == "src" then - return stack:get_count() - elseif listname == "dst" then - return 0 - end -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 - --- generate an unique key based on the unsorted and --- variable number of inventory items -local function recipe_key(items) - local tbl = {} - -- remove items which exist more than once - for _,item in ipairs(items) do - tbl[item] = true - end - local names = {} - for key,_ in pairs(tbl) do - names[#names + 1] = key - end - -- bring in a sorted order - table.sort(names) - return table.concat(names, "-") -end - --- determine recipe based on inventory items -local function get_recipe(inv) - -- collect items - local stacks = {} - local names = {} - for _,stack in ipairs(inv:get_list("src")) do - if not stack:is_empty() then - table.insert(names, stack:get_name()) - table.insert(stacks, stack) - else - table.insert(stacks, ItemStack("")) - end - end - local key = recipe_key(names) - local recipe = Recipes[key] - - if recipe then - return { - input = recipe.input, - stacks = stacks, - output = ItemStack(recipe.output.." "..recipe.number), - heat = recipe.heat, - time = recipe.time, - } - end - return nil -end - --- prepare recipe and store in cache table for faster access -local function store_recipe_in_cache(pos) - local hash = minetest.hash_node_position(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local recipe = get_recipe(inv) - Cache[hash] = recipe - return recipe -end - --- read value from the node below -local function get_heat(pos) - local heat = 0 - pos.y = pos.y - 1 - local node = techage.get_node_lvm(pos) - local meta = minetest.get_meta(pos) - if minetest.get_item_group(node.name, "techage_flame") == 0 then - pos.y = pos.y + 1 - return 0 - end - - pos.y = pos.y - 1 - node = techage.get_node_lvm(pos) - pos.y = pos.y + 2 - if minetest.get_item_group(node.name, "techage_flame") == 0 and - node.name ~= "techage:charcoal_burn" then - return 0 - end - - return meta:get_int("heat") -end - --- Start melting if heat is ok AND source items available -function techage.switch_to_active(pos) - local meta = minetest.get_meta(pos) - local heat = get_heat(pos) - local recipe = store_recipe_in_cache(pos) - - if recipe and heat >= recipe.heat then - minetest.swap_node(pos, {name = "techage:meltingpot_active"}) - minetest.registered_nodes["techage:meltingpot_active"].on_construct(pos) - meta:set_string("infotext", S("Melting Pot active (heat=")..heat..")") - minetest.get_node_timer(pos):start(2) - return true - end - meta:set_string("infotext", S("Melting Pot inactive (heat=")..heat..")") - return false -end - -function techage.update_heat(pos) - local meta = minetest.get_meta(pos) - local heat = get_heat(pos) - meta:set_string("infotext", S("Melting Pot inactive (heat=")..heat..")") -end - -local function set_inactive(meta, pos, heat) - minetest.get_node_timer(pos):stop() - minetest.swap_node(pos, {name = "techage:meltingpot"}) - minetest.registered_nodes["techage:meltingpot"].on_construct(pos) - meta:set_string("infotext", S("Melting Pot inactive (heat=")..heat..")") -end - --- Stop melting if heat to low OR no source items available -local function switch_to_inactive(pos) - local meta = minetest.get_meta(pos) - local heat = get_heat(pos) - local hash = minetest.hash_node_position(pos) - local recipe = Cache[hash] or store_recipe_in_cache(pos) - - if not recipe or heat < recipe.heat then - set_inactive(meta, pos, heat) - return true - end - meta:set_string("infotext", S("Melting Pot active (heat=")..heat..")") - return false -end - - -local function index(list, x) - for idx, v in pairs(list) do - if v == x then return idx end - end - return nil -end - --- move recipe src items to output inventory -local function process(inv, recipe, heat) - if heat < recipe.heat then - return false - end - local res = false - if inv:room_for_item("dst", recipe.output) then - for _,item in ipairs(recipe.input) do - res = false - for _, stack in ipairs(recipe.stacks) do - if stack:get_count() > 0 and stack:get_name() == item then - stack:take_item(1) - res = true - break - end - end - if res == false then - return false - end - end - inv:add_item("dst", recipe.output) - inv:set_list("src", recipe.stacks) - return true - end - return false -end - -local function smelting(pos, recipe, heat, elapsed) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - elapsed = elapsed + meta:get_int("leftover") - - while elapsed >= recipe.time do - if process(inv, recipe, heat) == false then - meta:set_int("leftover", 0) - set_inactive(meta, pos, heat) - return false - end - elapsed = elapsed - recipe.time - end - meta:set_int("leftover", elapsed) - return true -end - -local function pot_node_timer(pos, elapsed) - if switch_to_inactive(pos) == false then - local hash = minetest.hash_node_position(pos) - local heat = get_heat(pos) - local recipe = Cache[hash] or store_recipe_in_cache(pos) - if recipe then - return smelting(pos, recipe, heat, elapsed) - end - end - return false -end - -minetest.register_node("techage:meltingpot_active", { - description = S("TA1 Melting Pot"), - tiles = { - { - name = "techage_meltingpot_top_active.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1, - }, - }, - "default_cobble.png^techage_meltingpot.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-10/16, -8/16, -10/16, 10/16, 9/16, -6/16}, - {-10/16, -8/16, 6/16, 10/16, 9/16, 10/16}, - {-10/16, -8/16, -10/16, -6/16, 9/16, 10/16}, - { 6/16, -8/16, -10/16, 10/16, 9/16, 10/16}, - { -6/16, -8/16, -6/16, 6/16, 5/16, 6/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-10/16, -8/16, -10/16, 10/16, 9/16, 10/16}, - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec1) - local inv = meta:get_inventory() - inv:set_size('src', 4) - inv:set_size('dst', 4) - end, - - on_timer = function(pos, elapsed) - return pot_node_timer(pos, elapsed) - end, - - on_receive_fields = function(pos, formname, fields, sender) - on_receive_fields(pos, formname, fields, sender) - end, - - on_metadata_inventory_move = function(pos) - store_recipe_in_cache(pos) - switch_to_inactive(pos) - end, - - on_metadata_inventory_put = function(pos) - store_recipe_in_cache(pos) - switch_to_inactive(pos) - end, - - on_metadata_inventory_take = function(pos) - store_recipe_in_cache(pos) - switch_to_inactive(pos) - end, - - can_dig = can_dig, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - drop = "techage:meltingpot", - is_ground_content = false, - groups = {cracky = 3, not_in_creative_inventory=1}, - sounds = default.node_sound_metal_defaults(), - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, -}) - -minetest.register_node("techage:meltingpot", { - description = S("TA1 Melting Pot"), - tiles = { - "default_cobble.png", - "default_cobble.png^techage_meltingpot.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-10/16, -8/16, -10/16, 10/16, 9/16, -6/16}, - {-10/16, -8/16, 6/16, 10/16, 9/16, 10/16}, - {-10/16, -8/16, -10/16, -6/16, 9/16, 10/16}, - { 6/16, -8/16, -10/16, 10/16, 9/16, 10/16}, - { -6/16, -8/16, -6/16, 6/16, -4/16, 6/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-10/16, -8/16, -10/16, 10/16, 9/16, 10/16}, - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec1) - meta:set_string("infotext", S("Melting Pot inactive (heat=0)")) - local inv = meta:get_inventory() - inv:set_size('src', 4) - inv:set_size('dst', 4) - end, - - on_metadata_inventory_move = function(pos) - store_recipe_in_cache(pos) - techage.switch_to_active(pos) - end, - - on_metadata_inventory_put = function(pos) - store_recipe_in_cache(pos) - techage.switch_to_active(pos) - end, - - on_metadata_inventory_take = function(pos) - store_recipe_in_cache(pos) - techage.switch_to_active(pos) - end, - - on_receive_fields = function(pos, formname, fields, sender) - on_receive_fields(pos, formname, fields, sender) - end, - - can_dig = can_dig, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - is_ground_content = false, - groups = {cracky = 3}, - sounds = default.node_sound_metal_defaults(), - - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_take = allow_metadata_inventory_take, -}) - -minetest.register_craft({ - output = "techage:meltingpot", - recipe = { - {"default:cobble", "default:copper_ingot", "default:cobble"}, - {"default:cobble", "", "default:cobble"}, - {"default:cobble", "default:cobble", "default:cobble"}, - }, -}) - -techage.recipes.register_craft_type("melting", { - description = S("TA1 Melting"), - icon = "default_cobble.png^techage_meltingpot.png", - width = 2, - height = 2, -}) -techage.recipes.register_craft_type("burning", { - description = S("TA1 Burning"), - icon = "techage_smoke.png", - width = 1, - height = 1, -}) -techage.recipes.register_craft({ - output = "techage:charcoal", - items = {"group:wood"}, - type = "burning", -}) - -function techage.ironage_register_recipe(recipe) - local key = recipe_key(recipe.recipe) - local output = string.split(recipe.output, " ") - local number = tonumber(output[2] or 1) - table.insert(KeyList, key) - Recipes[key] = { - input = recipe.recipe, - output = output[1], - number = number, - heat = math.max(recipe.heat or 3, 2), - time = math.max(recipe.time or 2, 2*number), - } - NumRecipes = NumRecipes + 1 - - recipe.items = recipe.recipe - recipe.type = "melting" - techage.recipes.register_craft(recipe) -end diff --git a/techage/iron_age/meridium.lua b/techage/iron_age/meridium.lua deleted file mode 100644 index e456444..0000000 --- a/techage/iron_age/meridium.lua +++ /dev/null @@ -1,125 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Brilliant Meririum and tools (mod "wielded_light" needed) - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:meridium_ingot", { - description = "Meridium Ingot", - inventory_image = "techage_meridium_ingot.png", -}) - - -minetest.register_tool("techage:pick_meridium", { - description = S("Meridium Pickaxe"), - inventory_image = "techage_meridiumpick.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, - light_source = 12, -}) - -minetest.register_tool("techage:shovel_meridium", { - description = S("Meridium Shovel"), - inventory_image = "techage_meridiumshovel.png", - wield_image = "techage_meridiumshovel.png^[transformR90", - tool_capabilities = { - full_punch_interval = 1.1, - max_drop_level=1, - groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=3}, - }, - sound = {breaks = "default_tool_breaks"}, - light_source = 12, -}) - -minetest.register_tool("techage:axe_meridium", { - description = S("Meridium Axe"), - inventory_image = "techage_meridiumaxe.png", - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - sound = {breaks = "default_tool_breaks"}, - light_source = 12, -}) - -minetest.register_tool("techage:sword_meridium", { - description = S("Meridium Sword"), - inventory_image = "techage_meridiumsword.png", - tool_capabilities = { - full_punch_interval = 0.8, - max_drop_level=1, - groupcaps={ - snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=6}, - }, - sound = {breaks = "default_tool_breaks"}, - light_source = 12, -}) - -minetest.register_craft({ - output = 'techage:pick_meridium', - recipe = { - {'techage:meridium_ingot', 'techage:meridium_ingot', 'techage:meridium_ingot'}, - {'', 'group:stick', ''}, - {'', 'group:stick', ''}, - } -}) - -minetest.register_craft({ - output = 'techage:shovel_meridium', - recipe = { - {'techage:meridium_ingot'}, - {'group:stick'}, - {'group:stick'}, - } -}) - -minetest.register_craft({ - output = 'techage:axe_meridium', - recipe = { - {'techage:meridium_ingot', 'techage:meridium_ingot'}, - {'techage:meridium_ingot', 'group:stick'}, - {'', 'group:stick'}, - } -}) - -minetest.register_craft({ - output = 'techage:sword_meridium', - recipe = { - {'techage:meridium_ingot'}, - {'techage:meridium_ingot'}, - {'group:stick'}, - } -}) - -techage.ironage_register_recipe({ - output = "techage:meridium_ingot", - recipe = {"default:steel_ingot", "default:mese_crystal_fragment"}, - heat = 4, - time = 3, -}) diff --git a/techage/iron_age/recipes.lua b/techage/iron_age/recipes.lua deleted file mode 100644 index 4169811..0000000 --- a/techage/iron_age/recipes.lua +++ /dev/null @@ -1,237 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Meltingpot recipes - Bucket redefinitions - -]]-- - -local S = techage.S - --- --- New burner recipes --- -techage.ironage_register_recipe({ - output = "default:obsidian", - recipe = {"default:cobble"}, - heat = 10, - time = 8, -}) - -techage.ironage_register_recipe({ - output = "techage:iron_ingot", - recipe = {"default:iron_lump"}, - heat = 5, - time = 3, -}) - -minetest.register_craftitem("techage:iron_ingot", { - description = S("TA1 Iron Ingot"), - inventory_image = "techage_iron_ingot.png", - use_texture_alpha = techage.CLIP, -}) - -local function check_protection(pos, name, text) - if minetest.is_protected(pos, name) then - minetest.log("action", (name ~= "" and name or "A mod") - .. " tried to " .. text - .. " at protected position " - .. minetest.pos_to_string(pos) - .. " with a bucket") - minetest.record_protection_violation(pos, name) - return true - end - return false -end - --- derived from bucket/init.lua -local function register_liquid(source, flowing, itemname, inventory_image, name, - groups, force_renew) - bucket.liquids[source] = { - source = source, - flowing = flowing, - itemname = itemname, - force_renew = force_renew, - } - bucket.liquids[flowing] = bucket.liquids[source] - - if itemname ~= nil then - minetest.unregister_item(itemname) - - minetest.register_craftitem(":"..itemname, { - description = name, - inventory_image = inventory_image, - stack_max = 1, - liquids_pointable = true, - groups = groups, - - on_place = function(itemstack, user, pointed_thing) - -- Must be pointing to node - if pointed_thing.type ~= "node" then - return - end - - local node = minetest.get_node_or_nil(pointed_thing.under) - local ndef = node and minetest.registered_nodes[node.name] - - -- Call on_rightclick if the pointed node defines it - if ndef and ndef.on_rightclick and - not (user and user:is_player() and - user:get_player_control().sneak) then - return ndef.on_rightclick( - pointed_thing.under, - node, user, - itemstack) - end - - local lpos - - -- Check if pointing to a buildable node - if ndef and ndef.buildable_to then - -- buildable; replace the node - lpos = pointed_thing.under - else - -- not buildable to; place the liquid above - -- check if the node above can be replaced - - lpos = pointed_thing.above - node = minetest.get_node_or_nil(lpos) - local above_ndef = node and minetest.registered_nodes[node.name] - - if not above_ndef or not above_ndef.buildable_to then - -- do not remove the bucket with the liquid - return itemstack - end - end - - if check_protection(lpos, user - and user:get_player_name() - or "", "place "..source) then - return - end - - -------------------------------- Start Modification --- minetest.set_node(lpos, {name = source}) - if source == "default:lava_source" and lpos.y > 0 and not minetest.is_singleplayer() then - minetest.chat_send_player(user:get_player_name(), S("[Bucket] Lava can only be placed below sea level!")) - return - else - -- see "basis/lib.lua" techage.is_ocean(pos) - minetest.set_node(lpos, {name = source, param2 = 1}) - end - -------------------------------- End Modification - return ItemStack("bucket:bucket_empty") - end - }) - end -end - - --- --- Changed default recipes --- -if techage.modified_recipes_enabled then - minetest.clear_craft({output = "default:bronze_ingot"}) - minetest.clear_craft({output = "default:steel_ingot"}) - minetest.clear_craft({output = "fire:flint_and_steel"}) - minetest.clear_craft({output = "bucket:bucket_empty"}) - if minetest.global_exists("moreores") then - minetest.clear_craft({output = "moreores:silver_ingot"}) - end - - -- add again - minetest.register_craft({ - output = 'default:steel_ingot 9', - recipe = { - {'default:steelblock'}, - } - }) - minetest.register_craft({ - output = 'default:bronze_ingot 9', - recipe = { - {'default:bronzeblock'}, - } - }) - - techage.ironage_register_recipe({ - output = "default:bronze_ingot 4", - recipe = {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot", "default:tin_ingot"}, - heat = 4, - time = 8, - }) - - techage.ironage_register_recipe({ - output = "default:steel_ingot 4", - recipe = {"default:coal_lump", "default:iron_lump", "default:iron_lump", "default:iron_lump"}, - heat = 7, - time = 8, - }) - - techage.ironage_register_recipe({ - output = "default:tin_ingot 1", - recipe = {"default:tin_lump"}, - heat = 4, - time = 2, - }) - - if minetest.global_exists("moreores") then - techage.ironage_register_recipe({ - output = "moreores:silver_ingot 1", - recipe = {"moreores:silver_lump"}, - heat = 5, - time = 2, - }) - - end - - minetest.register_craft({ - output = "fire:flint_and_steel", - recipe = { - {"default:flint", "default:iron_lump"} - } - }) - - minetest.register_craft({ - output = 'bucket:bucket_empty 2', - recipe = { - {'techage:iron_ingot', '', 'techage:iron_ingot'}, - {'', 'techage:iron_ingot', ''}, - } - }) - - minetest.override_item("fire:flint_and_steel", { - description = S("Flint and Iron"), - inventory_image = "fire_flint_steel.png^[colorize:#c7643d:60", - }) - - minetest.override_item("bucket:bucket_empty", { - inventory_image = "bucket.png^[colorize:#c7643d:40" - }) - minetest.override_item("bucket:bucket_river_water", { - inventory_image = "bucket_river_water.png^[colorize:#c7643d:30" - }) - - register_liquid( - "default:water_source", - "default:water_flowing", - "bucket:bucket_water", - "bucket_water.png^[colorize:#c7643d:30", - "Water Bucket", - {water_bucket = 1} - ) - - register_liquid( - "default:lava_source", - "default:lava_flowing", - "bucket:bucket_lava", - "bucket_lava.png^[colorize:#c7643d:30", - "Lava Bucket" - ) -end diff --git a/techage/iron_age/tools.lua b/techage/iron_age/tools.lua deleted file mode 100644 index 3316ebc..0000000 --- a/techage/iron_age/tools.lua +++ /dev/null @@ -1,102 +0,0 @@ ---[[ - - Iron Age - ======== - - Copyright (C) 2018 Joachim Stolberg - Based on mods/default/tools.lua - - AGPL v3 - See LICENSE.txt for more information - -]]-- - - - -local function tools() - minetest.override_item("default:pick_bronze", { - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=20, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - }) - minetest.override_item("default:pick_steel", { - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - }) - - minetest.override_item("default:shovel_bronze", { - tool_capabilities = { - full_punch_interval = 1.1, - max_drop_level=1, - groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=3}, - }, - }) - minetest.override_item("default:shovel_steel", { - tool_capabilities = { - full_punch_interval = 1.1, - max_drop_level=1, - groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=3}, - }, - }) - - minetest.override_item("default:axe_bronze", { - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - }) - minetest.override_item("default:axe_steel", { - tool_capabilities = { - full_punch_interval = 1.0, - max_drop_level=1, - groupcaps={ - choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=4}, - }, - }) - - minetest.override_item("default:sword_bronze", { - tool_capabilities = { - full_punch_interval = 0.8, - max_drop_level=1, - groupcaps={ - snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2}, - }, - damage_groups = {fleshy=6}, - }, - }) - minetest.override_item("default:sword_steel", { - tool_capabilities = { - full_punch_interval = 0.8, - max_drop_level=1, - groupcaps={ - snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=40, maxlevel=2}, - }, - damage_groups = {fleshy=6}, - }, - }) -end - -minetest.after(1, tools) diff --git a/techage/items/aluminium.lua b/techage/items/aluminium.lua deleted file mode 100644 index 0c34069..0000000 --- a/techage/items/aluminium.lua +++ /dev/null @@ -1,128 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Aluminium - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:gibbsite_powder", { - description = S("Gibbsite Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#C6DCDB:120", - groups = {powder = 1}, -}) - -minetest.register_craftitem("techage:aluminum", { - description = S("Aluminum"), - inventory_image = "techage_aluminum_inv.png", -}) - -minetest.register_craftitem("techage:redmud", { - description = S("Red Mud"), - inventory_image = "techage_liquid2_inv.png^[colorize:#F80E13:140^techage_liquid1_inv.png", -}) - -minetest.register_craftitem("techage:barrel_redmud", { - description = S("Red Mud Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#F80E13:140^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:canister_redmud", { - description = S("Red Mud Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#F80E13:140^techage_canister_frame.png^techage_symbol_liquid.png", - stack_max = 1, -}) - -techage.register_liquid("techage:barrel_redmud", "techage:ta3_barrel_empty", 10, "techage:redmud") -techage.register_liquid("techage:canister_redmud", "techage:ta3_canister_empty", 1, "techage:redmud") - -techage.recipes.add("ta4_doser", { - output = "techage:gibbsite_powder 2", - waste = "techage:redmud 1", - input = { - "techage:bauxite_powder 2", - "techage:lye 1", - } -}) - -techage.furnace.register_recipe({ - output = "techage:aluminum 2", - recipe = {"techage:gibbsite_powder", "techage:gibbsite_powder", - "techage:gibbsite_powder", "techage:gibbsite_powder"}, - time = 16, - -}) - -if minetest.get_modpath('techpack_stairway') then - minetest.register_craft({ - output = "techpack_stairway:grating 6", - recipe = { - {"", "", ""}, - {"dye:dark_grey", "", "default:coal_lump"}, - {"default:steel_ingot", "techage:aluminum", "default:steel_ingot"}, - }, - }) - - minetest.register_craft({ - output = "techpack_stairway:handrail 6", - recipe = { - {"default:steel_ingot", "default:coal_lump", ""}, - {"techage:aluminum", "", ""}, - {"default:steel_ingot", "dye:dark_grey", ""}, - }, - }) - - minetest.register_craft({ - output = "techpack_stairway:stairway1 6", - recipe = { - {"", "", "default:steel_ingot"}, - {"dye:dark_grey", "techage:aluminum", "default:coal_lump"}, - {"default:steel_ingot", "", ""}, - }, - }) - - minetest.register_craft({ - output = "techpack_stairway:ladder1 3", - recipe = { - {"", "default:steel_ingot", ""}, - {"dye:dark_grey", "techage:aluminum", "default:coal_lump"}, - {"", "default:steel_ingot", ""}, - }, - }) - - minetest.register_craft({ - output = "techpack_stairway:ladder3 6", - recipe = { - {"", "", "default:steel_ingot"}, - {"dye:dark_grey", "techage:aluminum", "default:coal_lump"}, - {"", "", "default:steel_ingot"}, - }, - }) - - minetest.register_craft({ - output = "techpack_stairway:ladder4 12", - recipe = { - {"dye:dark_grey", "techage:aluminum", "default:coal_lump"}, - {"", "default:steel_ingot", ""}, - {"", "default:steel_ingot", ""}, - }, - }) - - minetest.register_craft({ - output = "techpack_stairway:lattice 4", - recipe = { - {"default:steel_ingot", "", "default:steel_ingot"}, - {"dye:dark_grey", "techage:aluminum", "default:coal_lump"}, - {"default:steel_ingot", "", "default:steel_ingot"}, - }, - }) -end diff --git a/techage/items/baborium.lua b/techage/items/baborium.lua deleted file mode 100644 index f82f0fb..0000000 --- a/techage/items/baborium.lua +++ /dev/null @@ -1,51 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Baborium - -]]-- - -local S = techage.S - -minetest.register_node("techage:stone_with_baborium", { - description = S("Baborium Ore"), - tiles = {"default_stone.png^techage_baborium.png"}, - groups = {cracky = 2}, - drop = 'techage:baborium_lump', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craftitem("techage:baborium_lump", { - description = S("Baborium Lump"), - inventory_image = "techage_baborium_lump.png", -}) - -minetest.register_craftitem("techage:baborium_ingot", { - description = S("Baborium Ingot"), - inventory_image = "techage_baborium_ingot.png", -}) - -minetest.register_ore({ - ore_type = "scatter", - ore = "techage:stone_with_baborium", - wherein = "default:stone", - clust_scarcity = 8 * 8 * 8, - clust_num_ores = 5, - clust_size = 3, - y_min = -340, - y_max = -250, -}) - -minetest.register_craft({ - type = 'cooking', - output = 'techage:baborium_ingot', - recipe = 'techage:baborium_lump', - cooktime = 5, -}) diff --git a/techage/items/barrel.lua b/techage/items/barrel.lua deleted file mode 100644 index 226de59..0000000 --- a/techage/items/barrel.lua +++ /dev/null @@ -1,114 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Barrel/Liquid/Canister/Water - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:water", { - description = S("Water"), - inventory_image = "techage_liquid2_inv.png^[colorize:#0b6eca:120^techage_liquid1_inv.png", - groups = {not_in_creative_inventory=1}, - -}) - -minetest.register_craftitem("techage:river_water", { - description = S("Water"), - inventory_image = "techage_liquid2_inv.png^[colorize:#189dc3:120^techage_liquid1_inv.png", - groups = {not_in_creative_inventory=1}, - -}) - -minetest.register_craftitem("techage:barrel_water", { - description = S("Water Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#0b6eca:120^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:barrel_river_water", { - description = S("River Water Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#189dc3:120^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:liquid", { - description = S("empty"), - inventory_image = "techage_liquid2_inv.png^[colorize:#BFBFBF:180^techage_liquid1_inv.png", - groups = {not_in_creative_inventory=1}, -}) - -minetest.register_craftitem("techage:ta3_barrel_empty", { - description = S("TA Empty Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#BFBFBF:180", -}) - -minetest.register_craftitem("techage:ta3_canister_empty", { - description = S("TA3 Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#BFBFBF:180^techage_canister_frame.png", -}) - -minetest.register_craftitem("techage:ta3_cylinder_small", { - description = S("Gas Cylinder Small"), - inventory_image = "techage_gas_cylinder_small.png^[colorize:#4D7481:100", -}) - -minetest.register_craftitem("techage:ta3_cylinder_large", { - description = S("Gas Cylinder Large"), - inventory_image = "techage_gas_cylinder_large.png^[colorize:#4D7481:100", -}) - - -minetest.register_craft({ - output = 'techage:ta3_barrel_empty 6', - recipe = { - {'techage:iron_ingot', 'techage:iron_ingot', 'techage:iron_ingot'}, - {'techage:iron_ingot', '', 'techage:iron_ingot'}, - {'techage:iron_ingot', 'techage:iron_ingot', 'techage:iron_ingot'}, - } -}) - -minetest.register_craft({ - output = 'techage:ta3_canister_empty 6', - recipe = { - {'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet'}, - {'basic_materials:plastic_sheet', '', 'basic_materials:plastic_sheet'}, - {'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet', 'basic_materials:plastic_sheet'}, - } -}) - -minetest.register_craft({ - output = 'techage:ta3_cylinder_small 8', - recipe = { - {'', 'techage:iron_ingot', ''}, - {'techage:iron_ingot', '', 'techage:iron_ingot'}, - {'techage:iron_ingot', 'techage:iron_ingot', 'techage:iron_ingot'}, - } -}) - -minetest.register_craft({ - output = 'techage:ta3_cylinder_large', - recipe = { - {'', 'techage:ta3_cylinder_small', ''}, - {'', 'techage:ta3_cylinder_small', ''}, - {'', 'techage:ta3_cylinder_small', ''}, - } -}) - - - -techage.register_liquid("bucket:bucket_water", "bucket:bucket_empty", 1, "techage:water") -techage.register_liquid("bucket:bucket_river_water", "bucket:bucket_empty", 1, "techage:river_water") - -techage.register_liquid("techage:barrel_water", "techage:ta3_barrel_empty", 10, "techage:water") -techage.register_liquid("techage:barrel_river_water", "techage:ta3_barrel_empty", 10, "techage:river_water") - -techage.register_liquid("bucket:bucket_lava", "bucket:bucket_empty", 1, "default:lava_source") diff --git a/techage/items/basalt.lua b/techage/items/basalt.lua deleted file mode 100644 index e3fe2f6..0000000 --- a/techage/items/basalt.lua +++ /dev/null @@ -1,203 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Basalt as result from the lava/water generator - -]]-- - -local S = techage.S - --- Replace default:stone with techage:basalt which is less valuable for ore generation. -default.cool_lava = function(pos, node) - if node.name == "default:lava_source" then - minetest.set_node(pos, {name = "default:obsidian"}) - else -- Lava flowing - minetest.set_node(pos, {name = "techage:basalt_stone"}) - end - minetest.sound_play("default_cool_lava", - {pos = pos, max_hear_distance = 16, gain = 0.25}) -end - -minetest.register_node("techage:basalt_stone", { - description = S("Basalt Stone"), - tiles = {"default_stone.png^[brighten"}, - groups = {cracky = 3, stone = 1}, - drop = 'techage:basalt_cobble', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:basalt_cobble", { - description = S("Basalt Cobble"), - tiles = {"default_cobble.png^[brighten"}, - groups = {cracky = 3, stone = 2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:basalt_stone_brick", { - description = S("Basalt Stone Brick"), - paramtype2 = "facedir", - place_param2 = 0, - tiles = {"default_stone_brick.png^[brighten"}, - is_ground_content = false, - groups = {cracky = 2, stone = 1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:basalt_stone_block", { - description = S("Basalt Stone Block"), - tiles = {"default_stone_block.png^[brighten"}, - is_ground_content = false, - groups = {cracky = 2, stone = 1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:basalt_gravel", { - description = S("Basalt Gravel"), - tiles = {"default_gravel.png^[brighten"}, - groups = {crumbly = 2, falling_node = 1, gravel = 1}, - sounds = default.node_sound_gravel_defaults(), -}) - -minetest.register_node("techage:sieved_basalt_gravel", { - description = S("Sieved Basalt Gravel"), - tiles = {"default_gravel.png^[brighten"}, - groups = {crumbly = 2, falling_node = 1, gravel = 1, not_in_creative_inventory=1}, - sounds = default.node_sound_gravel_defaults(), -}) - -minetest.register_node("techage:basalt_glass", { - description = S("Basalt Glass"), - drawtype = "glasslike_framed_optional", - tiles = {"techage_basalt_glass.png"}, - use_texture_alpha = techage.BLEND, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("techage:basalt_glass2", { - description = S("Basalt Glass 2"), - drawtype = "glasslike_framed_optional", - tiles = {"techage_basalt_glass2.png"}, - use_texture_alpha = techage.BLEND, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("techage:basalt_glass_thin", { - description = S("Basalt Glass Thin"), - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -1/16, 8/16, 8/16, 1/16}, - }, - }, - tiles = {"techage_basalt_glass.png"}, - use_texture_alpha = techage.BLEND, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("techage:basalt_glass_thin2", { - description = S("Basalt Glass Thin 2"), - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -1/16, 8/16, 8/16, 1/16}, - }, - }, - tiles = {"techage_basalt_glass2.png"}, - use_texture_alpha = techage.BLEND, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("techage:basalt_glass_thin_xl", { - description = S("Basalt Glass Thin XL"), - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -1/16, 16/16, 16/16, 1/16}, - }, - }, - tiles = {"techage_basalt_glass.png"}, - use_texture_alpha = techage.BLEND, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("techage:basalt_glass_thin_xl2", { - description = S("Basalt Glass Thin XL 2"), - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -1/16, 16/16, 16/16, 1/16}, - }, - }, - tiles = {"techage_basalt_glass2.png"}, - use_texture_alpha = techage.BLEND, - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_craft({ - output = "techage:basalt_stone_brick 4", - recipe = { - {"techage:basalt_stone", "techage:basalt_stone"}, - {"techage:basalt_stone", "techage:basalt_stone"}, - } -}) - -minetest.register_craft({ - output = "techage:basalt_stone_block 9", - recipe = { - {"techage:basalt_stone", "techage:basalt_stone", "techage:basalt_stone"}, - {"techage:basalt_stone", "techage:basalt_stone", "techage:basalt_stone"}, - {"techage:basalt_stone", "techage:basalt_stone", "techage:basalt_stone"}, - } -}) - -minetest.register_craft({ - type = "cooking", - output = "techage:basalt_stone", - recipe = "techage:basalt_cobble", -}) - -techage.add_grinder_recipe({input="techage:basalt_stone", output="techage:basalt_gravel"}) -techage.add_grinder_recipe({input="techage:basalt_cobble", output="techage:basalt_gravel"}) -techage.add_grinder_recipe({input="techage:basalt_gravel", output="default:clay"}) -techage.add_grinder_recipe({input="techage:sieved_basalt_gravel", output="default:clay"}) diff --git a/techage/items/bauxit.lua b/techage/items/bauxit.lua deleted file mode 100644 index cf3102a..0000000 --- a/techage/items/bauxit.lua +++ /dev/null @@ -1,68 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Bauxite - -]]-- - -local S = techage.S - -minetest.register_node("techage:bauxite_stone", { - description = S("Bauxite Stone"), - tiles = {"default_desert_stone.png^techage_bauxit_overlay.png^[colorize:#FB2A00:120"}, - groups = {cracky = 3, stone = 1}, - drop = 'techage:bauxite_cobble', - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:bauxite_cobble", { - description = S("Bauxite Cobblestone"), - tiles = {"default_desert_cobble.png^[colorize:#FB2A00:80"}, - is_ground_content = false, - groups = {cracky = 3, stone = 2}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:bauxite_gravel", { - description = S("Bauxite Gravel"), - tiles = {"default_gravel.png^[colorize:#FB2A00:180"}, - is_ground_content = false, - groups = {crumbly = 2, falling_node = 1}, - sounds = default.node_sound_gravel_defaults(), -}) - -minetest.register_craftitem("techage:bauxite_powder", { - description = S("Bauxite Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#FB2A00:120", - groups = {powder = 1}, -}) - - -minetest.register_ore({ - ore_type = "blob", - ore = "techage:bauxite_stone", - wherein = {"default:stone", "default:desert_stone"}, - clust_scarcity = 16 * 16 * 16, - clust_size = 6, - y_max = -50, - y_min = -500, - noise_threshold = 0.0, - noise_params = { - offset = 0.5, - scale = 0.2, - spread = {x = 5, y = 5, z = 5}, - seed = 41524, - octaves = 1, - persist = 0.0 - }, -}) - -techage.add_grinder_recipe({input="techage:bauxite_cobble", output="techage:bauxite_gravel"}) -techage.add_grinder_recipe({input="techage:bauxite_gravel", output="techage:bauxite_powder"}) diff --git a/techage/items/cement.lua b/techage/items/cement.lua deleted file mode 100644 index 8d9d2fe..0000000 --- a/techage/items/cement.lua +++ /dev/null @@ -1,70 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Cement as ingredient and alternative recipe for basic_materials:wet_cement - Cement is cooked and grinded clay - -]]-- - -local S = techage.S - - -if not minetest.get_modpath("bakedclay") then - minetest.register_node("techage:cement_block", { - description = S("Cement Block"), - tiles = {"default_clay.png^[colorize:#FFFFFF:160"}, - is_ground_content = false, - groups = {cracky = 2, stone = 1}, - sounds = default.node_sound_stone_defaults(), - }) - - minetest.register_craft({ - type = "cooking", - output = "techage:cement_block", - recipe = "default:clay", - }) - - techage.add_grinder_recipe({input="techage:cement_block", output="techage:cement_powder"}) -else - -- The block should not exist when the mod baked clay is loaded. - -- But this block was active due to an error and can therefore no longer be deleted. - minetest.register_node("techage:cement_block", { - description = S("Cement Block"), - tiles = {"default_clay.png^[colorize:#FFFFFF:160"}, - is_ground_content = false, - groups = {cracky = 2, stone = 1}, - sounds = default.node_sound_stone_defaults(), - }) - - -- Needs to be a techage recipe, not to overwrite the clay/bakedclay recipe - techage.furnace.register_recipe({ - output = "techage:cement_block", - recipe = { - "default:clay", - }, - }) - techage.add_grinder_recipe({input="techage:cement_block", output="techage:cement_powder"}) - techage.add_grinder_recipe({input="bakedclay:white", output="techage:cement_powder"}) -end - -minetest.register_craftitem("techage:cement_powder", { - description = S("Cement Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#FFFFFF:240", - groups = {powder = 1}, -}) - -minetest.register_craft({ - output = "basic_materials:wet_cement 3", - recipe = { - {"bucket:bucket_water", "techage:cement_powder"}, - {"group:sand", "default:gravel"}, - }, - replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, -}) diff --git a/techage/items/ceramic.lua b/techage/items/ceramic.lua deleted file mode 100644 index 5bdcad6..0000000 --- a/techage/items/ceramic.lua +++ /dev/null @@ -1,84 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Ceramic - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:ta4_ceramic_material", { - description = S("TA4 Ceramic Material"), - inventory_image = "techage_ceramic_material.png", - groups = {powder = 1}, -}) - -techage.recipes.add("ta4_doser", { - output = "techage:ta4_ceramic_material 2", - input = { - "techage:clay_powder 1", - "techage:aluminum_powder 1", - "techage:silver_sandstone_powder 1", - "techage:water 1", - } -}) - -minetest.register_craft({ - output = "techage:ta4_ceramic_material 2", - recipe = { - {"techage:clay_powder", "techage:aluminum_powder", ""}, - {"techage:silver_sandstone_powder", "bucket:bucket_water", ""}, - {"", "", ""}, - }, - replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}}, -}) - -minetest.register_craftitem("techage:ta4_furnace_ceramic", { - description = S("TA4 Furnace Ceramic"), - inventory_image = "techage_furnace_ceramic.png", -}) - -techage.furnace.register_recipe({ - output = "techage:ta4_furnace_ceramic", - recipe = { - "techage:ta4_ceramic_material", - "techage:ta4_ceramic_material", - }, - time = 16, -}) - -minetest.register_craftitem("techage:ta4_round_ceramic", { - description = S("TA4 Round Ceramic"), - inventory_image = "techage_round_ceramic.png", -}) - -minetest.register_craftitem("techage:ta5_ceramic_turbine", { - description = S("TA5 Ceramic Turbine"), - inventory_image = "techage_ceramic_turbine.png", -}) - -techage.furnace.register_recipe({ - output = "techage:ta4_round_ceramic 2", - recipe = { - "techage:ta4_ceramic_material", "techage:ta4_ceramic_material", - "techage:ta4_ceramic_material", "techage:ta4_ceramic_material", - }, - time = 16, -}) - -techage.furnace.register_recipe({ - output = "techage:ta5_ceramic_turbine", - recipe = { - "techage:ta4_ceramic_material", - "techage:ta4_ceramic_material", - "techage:graphite_powder", - }, - time = 16, -}) diff --git a/techage/items/cracking.lua b/techage/items/cracking.lua deleted file mode 100644 index 52c98f3..0000000 --- a/techage/items/cracking.lua +++ /dev/null @@ -1,109 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Cracking breaks long chains of hydrocarbons into short chains using a catalyst. - Gibbsite powder serves as a catalyst (is not consumed). - It can be used to convert bitumen into fueloil, fueloil into naphtha, naphtha into gasoline, - and gasoline into gas. - - In hydrogenation, pairs of hydrogen atoms are added to a molecule to convert short-chain - hydrocarbons into long ones. - Here iron powder is required as a catalyst (is not consumed). - It can be used to convert gas (propan) into isobutane, isobutane into gasoline, gasoline into naphtha, - naphtha into fueloil, and fueloil into bitumen. - -]]-- - --- Cracking -techage.recipes.add("ta4_doser", { - output = "techage:fueloil 1", - input = { - "techage:bitumen 1", - }, - catalyst = "techage:gibbsite_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:naphtha 1", - input = { - "techage:fueloil 1", - }, - catalyst = "techage:gibbsite_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:gasoline 1", - input = { - "techage:naphtha 1", - }, - catalyst = "techage:gibbsite_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:isobutane 1", - input = { - "techage:gasoline 1", - }, - catalyst = "techage:gibbsite_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:gas 1", - input = { - "techage:isobutane 1", - }, - catalyst = "techage:gibbsite_powder", -}) - --- Hydrogenate -techage.recipes.add("ta4_doser", { - output = "techage:isobutane 1", - input = { - "techage:gas 1", - "techage:hydrogen 1", - }, - catalyst = "techage:iron_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:gasoline 1", - input = { - "techage:isobutane 1", - "techage:hydrogen 1", - }, - catalyst = "techage:iron_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:naphtha 1", - input = { - "techage:gasoline 1", - "techage:hydrogen 1", - }, - catalyst = "techage:iron_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:fueloil 1", - input = { - "techage:naphtha 1", - "techage:hydrogen 1", - }, - catalyst = "techage:iron_powder", -}) - -techage.recipes.add("ta4_doser", { - output = "techage:bitumen 1", - input = { - "techage:fueloil 1", - "techage:hydrogen 1", - }, - catalyst = "techage:iron_powder", -}) diff --git a/techage/items/electronic.lua b/techage/items/electronic.lua deleted file mode 100644 index 5139bec..0000000 --- a/techage/items/electronic.lua +++ /dev/null @@ -1,102 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Bauxite - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:vacuum_tube", { - description = S("TA3 Vacuum Tube"), - inventory_image = "techage_vacuum_tube.png", -}) - -minetest.register_craftitem("techage:ta4_wlanchip", { - description = S("TA4 WLAN Chip"), - inventory_image = "techage_wlanchip.png", -}) - -minetest.register_craftitem("techage:wlanchip", { - description = S("WLAN Chip"), - inventory_image = "techage_wlanchip.png", -}) - -minetest.register_craftitem("techage:ta4_ramchip", { - description = S("TA4 RAM Chip"), - inventory_image = "techage_ramchip.png", -}) - -minetest.register_craftitem("techage:ta4_leds", { - description = S("TA4 LEDs"), - inventory_image = "techage_leds.png", -}) - -minetest.register_craftitem("techage:ta5_aichip", { - description = S("TA5 AI Chip"), - inventory_image = "techage_aichip.png^[colorize:#48b9de:40", -}) - -minetest.register_craftitem("techage:ta5_aichip2", { - description = S("TA5 AI Chip II"), - inventory_image = "techage_aichip.png^[colorize:#de486c:40", -}) - -techage.recipes.add("ta2_electronic_fab", { - output = "techage:vacuum_tube 2", - waste = "basic_materials:empty_spool 1", - input = {"default:glass 1", "basic_materials:copper_wire 1", "basic_materials:plastic_sheet 1", "techage:usmium_nuggets 1"} -}) - -techage.recipes.add("ta3_electronic_fab", { - output = "techage:vacuum_tube 2", - waste = "basic_materials:empty_spool 1", - input = {"default:glass 1", "basic_materials:copper_wire 1", "basic_materials:plastic_sheet 1", "techage:usmium_nuggets 1"} -}) - -techage.recipes.add("ta3_electronic_fab", { - output = "techage:ta4_wlanchip 8", - input = {"default:mese_crystal 1", "default:copper_ingot 1", "default:gold_ingot 1", "techage:ta4_silicon_wafer 1"} -}) - -techage.recipes.add("ta3_electronic_fab", { - output = "techage:ta4_ramchip 8", - input = {"default:mese_crystal 1", "default:gold_ingot 1", "default:copper_ingot 1", "techage:ta4_silicon_wafer 1"} -}) - -techage.recipes.add("ta4_electronic_fab", { - output = "techage:ta4_wlanchip 8", - input = {"default:mese_crystal 1", "default:copper_ingot 1", "default:gold_ingot 1", "techage:ta4_silicon_wafer 1"} -}) - -techage.recipes.add("ta4_electronic_fab", { - output = "techage:ta4_ramchip 8", - input = {"default:mese_crystal 1", "default:gold_ingot 1", "default:copper_ingot 1", "techage:ta4_silicon_wafer 1"} -}) - -techage.recipes.add("ta4_electronic_fab", { - output = "techage:ta4_leds 8", - waste = "basic_materials:empty_spool 1", - input = {"basic_materials:plastic_sheet 4", "basic_materials:copper_wire 1", "techage:ta4_silicon_wafer 1"} -}) - -techage.recipes.add("ta4_electronic_fab", { - output = "techage:ta5_aichip 2", - waste = "basic_materials:empty_spool 2", - input = {"techage:ta4_leds 8", "basic_materials:copper_wire 1", "basic_materials:gold_wire 1", "techage:ta4_silicon_wafer 1"}, - ex_points = 10, -}) - -techage.recipes.add("ta4_electronic_fab", { - output = "techage:ta5_aichip2 2", - waste = "basic_materials:empty_spool 2", - input = {"techage:ta4_leds 8", "basic_materials:copper_wire 1", "basic_materials:gold_wire 1", "techage:ta4_silicon_wafer 1"}, - ex_points = 25, -}) diff --git a/techage/items/epoxy.lua b/techage/items/epoxy.lua deleted file mode 100644 index 26a2ae2..0000000 --- a/techage/items/epoxy.lua +++ /dev/null @@ -1,45 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Epoxy - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:epoxy", { - description = S("Epoxide Resin"), - inventory_image = "techage_liquid2_inv.png^[colorize:#ca2446:140^techage_liquid1_inv.png", -}) - -minetest.register_craftitem("techage:barrel_epoxy", { - description = S("Epoxide Resin Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#ca2446:140^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:canister_epoxy", { - description = S("Epoxide Resin Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#ca2446:140^techage_canister_frame.png^techage_symbol_liquid.png", - stack_max = 1, -}) - -techage.recipes.add("ta4_doser", { - output = "techage:epoxy 1", - input = { - "techage:naphtha 1", - "techage:needle_powder 1", - } -}) - -techage.register_liquid("techage:barrel_epoxy", "techage:ta3_barrel_empty", 10, "techage:epoxy") -techage.register_liquid("techage:canister_epoxy", "techage:ta3_canister_empty", 1, "techage:epoxy") - -minetest.register_alias("techage:ta4_epoxy", "techage:canister_epoxy") diff --git a/techage/items/filling.lua b/techage/items/filling.lua deleted file mode 100644 index 55fb0ac..0000000 --- a/techage/items/filling.lua +++ /dev/null @@ -1,14 +0,0 @@ --- Needed for the trowel - -local fillings = {} - -minetest.register_on_mods_loaded(function() - for name, ndef in pairs(minetest.registered_nodes) do - -- test if it is a simple node without logic - if ndef and not ndef.groups.soil and name ~= "default:cobble" and - not ndef.after_place_node and not ndef.on_construct then - table.insert(fillings, name) - end - end - networks.register_filling_items(fillings) -end) diff --git a/techage/items/hydrogen.lua b/techage/items/hydrogen.lua deleted file mode 100644 index 1abce56..0000000 --- a/techage/items/hydrogen.lua +++ /dev/null @@ -1,43 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Hydrogen - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:hydrogen", { - description = S("TA4 Hydrogen"), - inventory_image = "techage_hydrogen_inv.png", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:cylinder_small_hydrogen", { - description = S("Hydrogen Cylinder Small"), - inventory_image = "techage_gas_cylinder_small.png^[colorize:#00528A:120", - stack_max = 1, -}) - -minetest.register_craftitem("techage:cylinder_large_hydrogen", { - description = S("Hydrogen Cylinder Large"), - inventory_image = "techage_gas_cylinder_large.png^[colorize:#00528A:120", - stack_max = 1, -}) - -techage.register_liquid("techage:cylinder_small_hydrogen", "techage:ta3_cylinder_small", 1, "techage:hydrogen") -techage.register_liquid("techage:cylinder_large_hydrogen", "techage:ta3_cylinder_large", 6, "techage:hydrogen") - -techage.recipes.add("ta4_doser", { - output = "techage:hydrogen 1", - input = { - "techage:gas 1", - } -}) diff --git a/techage/items/lye.lua b/techage/items/lye.lua deleted file mode 100644 index b69894d..0000000 --- a/techage/items/lye.lua +++ /dev/null @@ -1,44 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Lye - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:lye", { - description = S("Lye"), - inventory_image = "techage_liquid2_inv.png^[colorize:#7fd44c:120^techage_liquid1_inv.png", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:barrel_lye", { - description = S("Lye Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#7fd44c:120^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:canister_lye", { - description = S("Lye Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#7fd44c:120^techage_canister_frame.png^techage_symbol_liquid.png", - stack_max = 1, -}) - -techage.recipes.add("ta4_doser", { - output = "techage:lye 4", - input = { - "techage:water 3", - "techage:usmium_powder 1", - } -}) - -techage.register_liquid("techage:barrel_lye", "techage:ta3_barrel_empty", 10, "techage:lye") -techage.register_liquid("techage:canister_lye", "techage:ta3_canister_empty", 1, "techage:lye") diff --git a/techage/items/moreblocks.lua b/techage/items/moreblocks.lua deleted file mode 100644 index 0204e67..0000000 --- a/techage/items/moreblocks.lua +++ /dev/null @@ -1,99 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - techage node registrations - -]]-- - -local function register_alias(name) - --minetest.register_alias("stairs:slab_" ..name, "techage:slab_" ..name) - minetest.register_alias("stairs:slab_" ..name.. "_inverted", "techage:slab_" ..name.. "_inverted") - minetest.register_alias("stairs:slab_" ..name.. "_wall", "techage:slab_" ..name.. "_wall") - minetest.register_alias("stairs:slab_" ..name.. "_quarter", "techage:slab_" ..name.. "_quarter") - minetest.register_alias("stairs:slab_" ..name.. "_quarter_inverted", "techage:slab_" ..name.. "_quarter_inverted") - minetest.register_alias("stairs:slab_" ..name.. "_quarter_wall", "techage:slab_" ..name.. "_quarter_wall") - minetest.register_alias("stairs:slab_" ..name.. "_three_quarter", "techage:slab_" ..name.. "_three_quarter") - minetest.register_alias("stairs:slab_" ..name.. "_three_quarter_inverted", "techage:slab_" ..name.. "_three_quarter_inverted") - minetest.register_alias("stairs:slab_" ..name.. "_three_quarter_wall", "techage:slab_" ..name.. "_three_quarter_wall") - --minetest.register_alias("stairs:stair_" ..name, "techage:stair_" ..name) - minetest.register_alias("stairs:stair_" ..name.. "_inverted", "techage:stair_" ..name.. "_inverted") - minetest.register_alias("stairs:stair_" ..name.. "_wall", "techage:stair_" ..name.. "_wall") - minetest.register_alias("stairs:stair_" ..name.. "_wall_half", "techage:stair_" ..name.. "_wall_half") - minetest.register_alias("stairs:stair_" ..name.. "_wall_half_inverted", "techage:stair_" ..name.. "_wall_half_inverted") - minetest.register_alias("stairs:stair_" ..name.. "_half", "techage:stair_" ..name.. "_half") - minetest.register_alias("stairs:stair_" ..name.. "_half_inverted", "techage:stair_" ..name.. "_half_inverted") - minetest.register_alias("stairs:stair_" ..name.. "_right_half", "techage:stair_" ..name.. "_right_half") - minetest.register_alias("stairs:stair_" ..name.. "_right_half_inverted", "techage:stair_" ..name.. "_right_half_inverted") - minetest.register_alias("stairs:stair_" ..name.. "_wall_half", "techage:stair_" ..name.. "_wall_half") - minetest.register_alias("stairs:stair_" ..name.. "_wall_half_inverted", "techage:stair_" ..name.. "_wall_half_inverted") - minetest.register_alias("stairs:stair_" ..name.. "_inner", "techage:stair_" ..name.. "_inner") - minetest.register_alias("stairs:stair_" ..name.. "_inner_inverted", "techage:stair_" ..name.. "_inner_inverted") - minetest.register_alias("stairs:stair_" ..name.. "_outer", "techage:stair_" ..name.. "_outer") - minetest.register_alias("stairs:stair_" ..name.. "_outer_inverted", "techage:stair_" ..name.. "_outer_inverted") -end - -local NodeNames = { - "techage:compressed_gravel", - "techage:red_stone", - "techage:red_stone_block", - "techage:red_stone_brick", - - "techage:basalt_cobble", - "techage:basalt_stone", - "techage:basalt_stone_block", - "techage:basalt_stone_brick", - "techage:sieved_basalt_gravel", - - "techage:basalt_glass", - "techage:basalt_glass2", - "techage:bauxite_cobble", - "techage:bauxite_stone", - - "techage:cement_block", -} - -if(minetest.get_modpath("moreblocks")) then - for _,name in ipairs(NodeNames) do - local ndef = minetest.registered_nodes[name] - if ndef then - ndef = table.copy(ndef) - if ndef.drop then -- this fixes https://github.com/fluxionary/minetest-moreblocks/issues/19 - ndef.drop = nil - end - local subname = string.split(name, ":")[2] - ndef.sunlight_propagates = true - ndef.groups.not_in_creative_inventory = 1 - stairsplus:register_all("techage", subname, name, ndef) - if techage.stair_aliases_enabled then - register_alias(subname) - end - end - end -else - for _,name in ipairs(NodeNames) do - local ndef = minetest.registered_nodes[name] - if ndef then - local subname = string.split(name, ":")[2] - stairs.register_stair_and_slab( - subname, - name, - ndef.groups, - ndef.tiles, - ndef.description.." Stair", - ndef.description.." Slab", - ndef.sound, - false - ) - if techage.stair_aliases_enabled then - register_alias(subname) - end - end - end -end diff --git a/techage/items/oil.lua b/techage/items/oil.lua deleted file mode 100644 index 02c4614..0000000 --- a/techage/items/oil.lua +++ /dev/null @@ -1,136 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Oil - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S = techage.S - -minetest.register_node("techage:oil_source", { - description = S("Oil Source"), - drawtype = "liquid", - paramtype = "light", - - inventory_image = "techage_liquid2_inv.png^[colorize:#000000^techage_liquid1_inv.png", - tiles = { - { - name = "techage_oil_animated.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 10 - } - }, - { - name = "techage_oil_animated.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 2.0 - } - } - }, - - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - drowning = 1, - liquidtype = "source", - liquid_alternative_flowing = "techage:oil_flowing", - liquid_alternative_source = "techage:oil_source", - liquid_viscosity = 20, - liquid_range = 10, - liquid_renewable = false, - post_effect_color = {a = 200, r = 1, g = 1, b = 1}, - groups = {liquid = 5, ta_liquid = 1}, -}) - -minetest.register_node("techage:oil_flowing", { - description = S("Flowing Oil"), - drawtype = "flowingliquid", - tiles = {"techage_oil.png"}, - special_tiles = { - { - name = "techage_oil_animated.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 10, - }, - }, - { - name = "techage_oil_animated.png", - backface_culling = true, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 10, - }, - }, - }, - paramtype = "light", - paramtype2 = "flowingliquid", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - liquid_renewable = false, - drop = "", - drowning = 1, - liquidtype = "flowing", - liquid_alternative_flowing = "techage:oil_flowing", - liquid_alternative_source = "techage:oil_source", - liquid_viscosity = 20, - liquid_range = 10, - post_effect_color = {a = 200, r = 1, g = 1, b = 1}, - groups = {liquid = 5, not_in_creative_inventory = 1}, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "techage:oil_source", - burntime = 30, -}) - -bucket.register_liquid( - "techage:oil_source", - "techage:oil_flowing", - "techage:bucket_oil", - "techage_bucket_oil.png", - "Oil Bucket") - -minetest.register_craftitem("techage:ta3_barrel_oil", { - description = S("TA3 Oil Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#000000:120^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_canister_oil", { - description = S("TA3 Oil Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#000000^techage_canister_frame.png^techage_symbol_liquid.png", - stack_max = 1, -}) - -techage.register_liquid("techage:bucket_oil", "bucket:bucket_empty", 1, "techage:oil_source") -techage.register_liquid("techage:ta3_barrel_oil", "techage:ta3_barrel_empty", 10, "techage:oil_source") -techage.register_liquid("techage:ta3_canister_oil", "techage:ta3_canister_empty", 1, "techage:oil_source") diff --git a/techage/items/petroleum.lua b/techage/items/petroleum.lua deleted file mode 100644 index fe9b53f..0000000 --- a/techage/items/petroleum.lua +++ /dev/null @@ -1,173 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Petroleum types: bitumen, fueloil, naphtha, gasoline, isobutane, gas (propan) - -]]-- - -local S = techage.S - - -minetest.register_craftitem("techage:bitumen", { - description = S("TA3 Bitumen"), - inventory_image = "techage_liquid2_inv.png^[colorize:#000000", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:fueloil", { - description = S("TA3 Fuel Oil"), - inventory_image = "techage_liquid2_inv.png^[colorize:#7E5D0A:180^techage_liquid1_inv.png", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:naphtha", { - description = S("TA3 Naphtha"), - inventory_image = "techage_liquid2_inv.png^[colorize:#AAA820:180^techage_liquid1_inv.png", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:gasoline", { - description = S("TA3 Gasoline"), - inventory_image = "techage_liquid2_inv.png^[colorize:#EEFC52:180^techage_liquid1_inv.png", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:isobutane", { - description = S("TA4 Isobutane"), - inventory_image = "techage_isobutane_inv.png", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:gas", { - description = S("TA3 Propane"), - inventory_image = "techage_gas_inv.png", - groups = {ta_liquid = 1}, -}) - -minetest.register_craftitem("techage:ta3_cylinder_small_gas", { - description = S("Propane Cylinder Small"), - inventory_image = "techage_gas_cylinder_small.png^[colorize:#e51818:120", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_cylinder_large_gas", { - description = S("Propane Cylinder Large"), - inventory_image = "techage_gas_cylinder_large.png^[colorize:#e51818:120", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta4_cylinder_small_isobutane", { - description = S("Isobutane Cylinder Small"), - inventory_image = "techage_gas_cylinder_small.png^[colorize:#18d618:120", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta4_cylinder_large_isobutane", { - description = S("Isobutane Cylinder Large"), - inventory_image = "techage_gas_cylinder_large.png^[colorize:#18d618:120", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_barrel_bitumen", { - description = S("TA3 Bitumen Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#000000:120", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_barrel_fueloil", { - description = S("TA3 Fuel Oil Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#7E5D0A:180^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_barrel_naphtha", { - description = S("TA3 Naphtha Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#AAA820:180^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_barrel_gasoline", { - description = S("TA3 Gasoline Barrel"), - inventory_image = "techage_barrel_inv.png^[colorize:#EEFC52:180^techage_symbol_liquid.png", - stack_max = 1, -}) - - -minetest.register_craftitem("techage:ta3_canister_bitumen", { - description = S("TA3 Bitumen Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#000000:180^techage_canister_frame.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_canister_fueloil", { - description = S("TA3 Fuel Oil Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#7E5D0A:180^techage_canister_frame.png^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_canister_naphtha", { - description = S("TA3 Naphtha Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#AAA820:180^techage_canister_frame.png^techage_symbol_liquid.png", - stack_max = 1, -}) - -minetest.register_craftitem("techage:ta3_canister_gasoline", { - description = S("TA3 Gasoline Canister"), - inventory_image = "techage_canister_filling.png^[colorize:#EEFC52^techage_canister_frame.png^techage_symbol_liquid.png", - stack_max = 1, -}) - - -minetest.register_craft({ - type = "fuel", - recipe = "techage:gas", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "techage:isobutane", - burntime = 40, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "techage:gasoline", - burntime = 50, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "techage:naphtha", - burntime = 45, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "techage:fueloil", - burntime = 40, -}) - - -techage.register_liquid("techage:ta3_barrel_oil", "techage:ta3_barrel_empty", 10, "techage:oil_source") -techage.register_liquid("techage:ta3_barrel_bitumen", "techage:ta3_barrel_empty", 10, "techage:bitumen") -techage.register_liquid("techage:ta3_barrel_fueloil", "techage:ta3_barrel_empty", 10, "techage:fueloil") -techage.register_liquid("techage:ta3_barrel_naphtha", "techage:ta3_barrel_empty", 10, "techage:naphtha") -techage.register_liquid("techage:ta3_barrel_gasoline", "techage:ta3_barrel_empty", 10, "techage:gasoline") -techage.register_liquid("techage:ta3_cylinder_large_gas", "techage:ta3_cylinder_large", 6, "techage:gas") -techage.register_liquid("techage:ta4_cylinder_large_isobutane", "techage:ta3_cylinder_large", 6, "techage:isobutane") - -techage.register_liquid("techage:ta3_canister_oil", "techage:ta3_canister_empty", 1, "techage:oil_source") -techage.register_liquid("techage:ta3_canister_bitumen", "techage:ta3_canister_empty", 1, "techage:bitumen") -techage.register_liquid("techage:ta3_canister_fueloil", "techage:ta3_canister_empty", 1, "techage:fueloil") -techage.register_liquid("techage:ta3_canister_naphtha", "techage:ta3_canister_empty", 1, "techage:naphtha") -techage.register_liquid("techage:ta3_canister_gasoline", "techage:ta3_canister_empty", 1, "techage:gasoline") -techage.register_liquid("techage:ta3_cylinder_small_gas", "techage:ta3_cylinder_small", 1, "techage:gas") -techage.register_liquid("techage:ta4_cylinder_small_isobutane", "techage:ta3_cylinder_small", 1, "techage:isobutane") diff --git a/techage/items/plastic.lua b/techage/items/plastic.lua deleted file mode 100644 index 1d68412..0000000 --- a/techage/items/plastic.lua +++ /dev/null @@ -1,35 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Plastic - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:plastic_granules", { - description = S("Plastic Granules"), - inventory_image = "techage_powder_inv.png^[colorize:#FFFFFF:180", - groups = {powder = 1}, -}) - -techage.recipes.add("ta4_doser", { - output = "techage:plastic_granules 1", - input = { - "techage:naphtha 1", - } -}) - -techage.furnace.register_recipe({ - output = "basic_materials:plastic_sheet 4", - recipe = {"techage:plastic_granules"}, - time = 2, - -}) diff --git a/techage/items/powder.lua b/techage/items/powder.lua deleted file mode 100644 index b5b445e..0000000 --- a/techage/items/powder.lua +++ /dev/null @@ -1,90 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Powder - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:leave_powder", { - description = S("Leave Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#71a157:120", - groups = {powder = 1}, -}) - -minetest.register_craftitem("techage:needle_powder", { - description = S("Needle Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#1c800f:120", - groups = {powder = 1}, -}) - -minetest.register_craftitem("techage:iron_powder", { - description = S("Iron Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#c7643d:160", - groups = {powder = 1}, -}) - -minetest.register_craftitem("techage:clay_powder", { - description = S("Clay Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#F9DE80:160", - groups = {powder = 1}, -}) - -minetest.register_craftitem("techage:aluminum_powder", { - description = S("Aluminum Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#A1BDC4:160", - groups = {powder = 1}, -}) - -minetest.register_craftitem("techage:silver_sandstone_powder", { - description = S("Silver Sandstone Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#FFFFFF:160", - groups = {powder = 1}, -}) - -minetest.register_craftitem("techage:graphite_powder", { - description = S("Graphite Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#000000:160", - groups = {powder = 1}, -}) - -techage.add_grinder_recipe({input="default:acacia_bush_leaves", output="techage:leave_powder"}) -techage.add_grinder_recipe({input="default:acacia_leaves", output="techage:leave_powder"}) -techage.add_grinder_recipe({input="default:aspen_leaves", output="techage:leave_powder"}) -techage.add_grinder_recipe({input="default:blueberry_bush_leaves", output="techage:leave_powder"}) -techage.add_grinder_recipe({input="default:bush_leaves", output="techage:leave_powder"}) -techage.add_grinder_recipe({input="default:jungleleaves", output="techage:leave_powder"}) -techage.add_grinder_recipe({input="default:leaves", output="techage:leave_powder"}) -techage.add_grinder_recipe({input="default:pine_needles", output="techage:needle_powder"}) -techage.add_grinder_recipe({input="default:iron_lump", output="techage:iron_powder"}) -techage.add_grinder_recipe({input="default:clay", output="techage:clay_powder"}) -techage.add_grinder_recipe({input="techage:aluminum", output="techage:aluminum_powder"}) -techage.add_grinder_recipe({input="default:silver_sandstone", output="techage:silver_sandstone_powder"}) -techage.add_grinder_recipe({input="default:coal_lump", output="techage:graphite_powder"}) - -if minetest.get_modpath("ethereal") then - techage.add_grinder_recipe({input="ethereal:bush", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:bush2", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:bush3", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:bamboo_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:bananaleaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:birch_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:frost_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:lemon_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:olive_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:orange_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:palmleaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:redwood_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:sakura_leaves", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:ethereal:sakura_leaves2", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:willow_twig", output="techage:leave_powder"}) - techage.add_grinder_recipe({input="ethereal:yellowleaves", output="techage:leave_powder"}) -end diff --git a/techage/items/redstone.lua b/techage/items/redstone.lua deleted file mode 100644 index 202e811..0000000 --- a/techage/items/redstone.lua +++ /dev/null @@ -1,70 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Redstone as result from the redmud/sand - -]]-- - -local S = techage.S - - -minetest.register_node("techage:red_stone", { - description = S("Red Stone"), - tiles = {"default_stone.png^[colorize:#ff4538:110"}, - groups = {cracky = 3, stone = 1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:red_stone_brick", { - description = S("Red Stone Brick"), - paramtype2 = "facedir", - place_param2 = 0, - tiles = {"default_stone_brick.png^[colorize:#ff4538:110"}, - is_ground_content = false, - groups = {cracky = 2, stone = 1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:red_stone_block", { - description = S("Red Stone Block"), - tiles = {"default_stone_block.png^[colorize:#ff4538:110"}, - is_ground_content = false, - groups = {cracky = 2, stone = 1}, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craft({ - output = "techage:red_stone_brick 4", - recipe = { - {"techage:red_stone", "techage:red_stone"}, - {"techage:red_stone", "techage:red_stone"}, - } -}) - -minetest.register_craft({ - output = "techage:red_stone_block 9", - recipe = { - {"techage:red_stone", "techage:red_stone", "techage:red_stone"}, - {"techage:red_stone", "techage:red_stone", "techage:red_stone"}, - {"techage:red_stone", "techage:red_stone", "techage:red_stone"}, - } -}) - -techage.furnace.register_recipe({ - output = "techage:red_stone 3", - recipe = { - "techage:canister_redmud", - "default:sand", - "default:sand", - "default:sand", - }, - waste = "techage:ta3_canister_empty", - time = 10, -}) diff --git a/techage/items/registered_nodes.lua b/techage/items/registered_nodes.lua deleted file mode 100644 index be296da..0000000 --- a/techage/items/registered_nodes.lua +++ /dev/null @@ -1,75 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Collect data of registered nodes - -]]-- - - -techage.aEtherealDirts = { - "ethereal:fiery_dirt", - "ethereal:cold_dirt", - "ethereal:crystal_dirt", - "ethereal:gray_dirt", - "ethereal:mushroom_dirt", - "ethereal:prairie_dirt", - "ethereal:grove_dirt", - "ethereal:jungle_dirt", - "ethereal:bamboo_dirt", -} - -techage.aAnyKindOfDirtBlocks = {} - -minetest.register_on_mods_loaded(function() - for name, ndef in pairs(minetest.registered_nodes) do - if string.find(name, "dirt") and - ndef.drawtype == "normal" and - ndef.groups.crumbly and ndef.groups.crumbly > 0 then - techage.aAnyKindOfDirtBlocks[#techage.aAnyKindOfDirtBlocks + 1] = name - end - end -end) - -minetest.override_item("default:gravel", {groups = {crumbly = 2, gravel = 1, falling_node = 1}}) - --- Register all known mobs mods for the move/fly controllers -techage.register_mobs_mods("ts_skins_dummies") -techage.register_mobs_mods("mobs") -techage.register_mobs_mods("draconis") -techage.register_mobs_mods("mobkit") -techage.register_mobs_mods("animalia") -techage.register_mobs_mods("mobs_animal") -techage.register_mobs_mods("mobs_monster") -techage.register_mobs_mods("dmobs") -techage.register_mobs_mods("mob_horse") -techage.register_mobs_mods("petz") -techage.register_mobs_mods("mobs_npc") -techage.register_mobs_mods("livingnether") -techage.register_mobs_mods("extra_mobs") -techage.register_mobs_mods("nssm") -techage.register_mobs_mods("goblins") -techage.register_mobs_mods("animalworld") -techage.register_mobs_mods("aliveai") -techage.register_mobs_mods("people") -techage.register_mobs_mods("paleotest") -techage.register_mobs_mods("mobs_balrog") -techage.register_mobs_mods("wildlife") -techage.register_mobs_mods("mobs_skeletons") -techage.register_mobs_mods("mobs_dwarves") -techage.register_mobs_mods("mobf_trader") -techage.register_mobs_mods("ts_vehicles_cars") - --- Used as e.g. crane cable -techage.register_simple_nodes({"techage:power_lineS"}, true) - --- Mods like cottages add the function ``after_dig_node`` to the dirt blocks -techage.register_simple_nodes({"default:dirt", "default:dirt_with_grass", "default:dirt_with_grass_footsteps", - "default:dirt_with_dry_grass", "default:dirt_with_snow", "default:dirt_with_rainforest_litter", - "default:dirt_with_coniferous_litter"}, true) diff --git a/techage/items/salt.lua b/techage/items/salt.lua deleted file mode 100644 index 7a401fa..0000000 --- a/techage/items/salt.lua +++ /dev/null @@ -1,50 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2024 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Salt - -]]-- - - ---Detects if the salt node is registered. -minetest.register_on_mods_loaded(function() - if minetest.registered_nodes["farming:salt"] then - --Adds salt to powder group to ensure reactor and silo will accept it - local def = minetest.registered_nodes["farming:salt"] - local groups = table.copy(def.groups) - groups.powder = 1 - minetest.override_item("farming:salt", { groups=groups }) - - --Add the water -> salt & river water recipe. - techage.recipes.add("ta4_doser", { - output = "farming:salt 1", - waste = "techage:river_water 1", - input = { - "techage:water 1", - } - }) - - -- Add salt recipe as replacement for the minetest.register_craft("farming:salt") recipe - techage.furnace.register_recipe({ - output = "farming:salt", - recipe = {"bucket:bucket_water"}, - waste = "bucket:bucket_empty", - time = 8, - }) - else - -- Creates a water -> River Water recipe in absense of the farming:salt node. - techage.recipes.add("ta4_doser", { - output = "techage:river_water 1", - input = { - "techage:water 1", - } - }) - end -end) diff --git a/techage/items/silicon.lua b/techage/items/silicon.lua deleted file mode 100644 index 5c89005..0000000 --- a/techage/items/silicon.lua +++ /dev/null @@ -1,45 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Silicon Wafer - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:ta4_silicon_wafer", { - description = S("TA4 Silicon Wafer"), - inventory_image = "techage_silicon_wafer.png", -}) - -if minetest.global_exists("mesecon") then - techage.furnace.register_recipe({ - output = "techage:ta4_silicon_wafer 16", - recipe = { - "mesecons_materials:silicon", - "mesecons_materials:silicon", - "mesecons_materials:silicon", - "techage:baborium_ingot" - }, - time = 6, - }) -end -techage.furnace.register_recipe({ - output = "techage:ta4_silicon_wafer 16", - recipe = { - "basic_materials:silicon", - "basic_materials:silicon", - "basic_materials:silicon", - "techage:baborium_ingot" - }, - time = 6, -}) - - diff --git a/techage/items/steelmat.lua b/techage/items/steelmat.lua deleted file mode 100644 index 5c158a4..0000000 --- a/techage/items/steelmat.lua +++ /dev/null @@ -1,29 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - pillar - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:steelmat", { - description = S("TechAge Steel Mat"), - inventory_image = "techage_steelmat.png", -}) - -minetest.register_craft({ - output = 'techage:steelmat 16', - recipe = { - {"", "techage:iron_ingot", ""}, - {"default:steel_ingot", "techage:iron_ingot", "default:steel_ingot"}, - {"", "techage:iron_ingot", ""}, - }, -}) diff --git a/techage/items/usmium.lua b/techage/items/usmium.lua deleted file mode 100644 index 18ce3c4..0000000 --- a/techage/items/usmium.lua +++ /dev/null @@ -1,28 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Usminum - -]]-- - -local S = techage.S - -minetest.register_craftitem("techage:usmium_nuggets", { - description = S("Usmium Nuggets"), - inventory_image = "techage_usmium_nuggets.png", -}) - -minetest.register_craftitem("techage:usmium_powder", { - description = S("Usmium Powder"), - inventory_image = "techage_powder_inv.png^[colorize:#46728E:120", - groups = {powder = 1}, -}) - -techage.add_grinder_recipe({input="techage:usmium_nuggets", output="techage:usmium_powder"}) diff --git a/techage/lamps/ceilinglamp.lua b/techage/lamps/ceilinglamp.lua deleted file mode 100644 index ecfae6e..0000000 --- a/techage/lamps/ceilinglamp.lua +++ /dev/null @@ -1,66 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Ceiling Lamp - -]]-- - -local S = techage.S - -techage.register_lamp("techage:ceilinglamp", { - description = S("TA Ceiling Lamp"), - tiles = { - -- up, down, right, left, back, front - 'techage_ceilinglamp_top.png', - 'techage_ceilinglamp_bottom.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-5/16, -7/16, -5/16, 5/16, -5/16, 5/16}, - {-4/16, -8/16, -4/16, 4/16, -7/16, 4/16}, - }, - }, - -},{ - description = S("TA Ceiling Lamp"), - tiles = { - -- up, down, right, left, back, front - 'techage_ceilinglamp_top.png', - 'techage_ceilinglamp_bottom.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - 'techage_ceilinglamp.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-5/16, -7/16, -5/16, 5/16, -5/16, 5/16}, - {-4/16, -8/16, -4/16, 4/16, -7/16, 4/16}, - }, - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:ceilinglamp_off 3", - recipe = {"techage:simplelamp_off", "default:wood", "default:glass"}, -}) diff --git a/techage/lamps/growlight.lua b/techage/lamps/growlight.lua deleted file mode 100644 index c592eb6..0000000 --- a/techage/lamps/growlight.lua +++ /dev/null @@ -1,224 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 LED Grow Light - -]]-- - -local S = techage.S - -local CYCLE_TIME = 2 -local RANDOM_VAL = 20 -local PWR_NEEDED = 1 - -local Cable = techage.ElectricCable -local power = networks.power -local Flowers = {} -local Plants = {} -local Ignore = { ["flowers:waterlily_waving"] = true } --- 9 plant positions below the light -local Positions = { - {x = 0, y =-1, z = 0}, - {x =-1, y =-1, z = 0}, - {x = 0, y =-1, z =-1}, - {x = 1, y =-1, z = 0}, - {x = 0, y =-1, z = 1}, - {x =-1, y =-1, z =-1}, - {x = 1, y =-1, z = 1}, - {x =-1, y =-1, z = 1}, - {x = 1, y =-1, z =-1}, -} - -local function swap_node(pos, postfix) - local node = techage.get_node_lvm(pos) - local parts = string.split(node.name, "_") - if postfix == parts[2] then - return - end - node.name = parts[1].."_"..postfix - minetest.swap_node(pos, node) - techage.light_ring(pos, postfix == "on") -end - -local function on_nopower(pos) - swap_node(pos, "off") - local nvm = techage.get_nvm(pos) - nvm.turned_on = false -end - -local function on_power(pos) - swap_node(pos, "on") - local nvm = techage.get_nvm(pos) - nvm.turned_on = true -end - -local function grow_flowers(pos) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.grow_pos = mem.grow_pos or {} -- keep the pos blank for some time - nvm.tick = nvm.tick or math.random(RANDOM_VAL, RANDOM_VAL*2) - nvm.tick = nvm.tick - 1 - if nvm.tick == 0 then - nvm.tick = math.random(RANDOM_VAL, RANDOM_VAL*2) - local plant_idx = math.random(1, 9) - local plant_pos = vector.add(pos, Positions[plant_idx]) - local soil_pos = {x = plant_pos.x, y = plant_pos.y - 1, z = plant_pos.z} - local plant_node = minetest.get_node(plant_pos) - local soil_node = minetest.get_node(soil_pos) - if soil_node and soil_node.name == "compost:garden_soil" then - if plant_node and plant_node.name == "air" then - if mem.grow_pos[plant_idx] and #Flowers > 1 then - local idx = math.floor(math.random(1, #Flowers)) - if Flowers[idx] then - minetest.set_node(plant_pos, {name = Flowers[idx]}) - mem.grow_pos[plant_idx] = false - end - else - mem.grow_pos[plant_idx] = true - end - elseif plant_node and Plants[plant_node.name] then - local ndef = minetest.registered_nodes[plant_node.name] - ndef.on_timer(plant_pos, 200) - else - mem.grow_pos[plant_idx] = false - end - end - end -end - -local function node_timer_on(pos, elapsed) - grow_flowers(pos) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed < PWR_NEEDED then - on_nopower(pos) - end - return true -end - -local function node_timer_off(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed == PWR_NEEDED then - on_power(pos) - end - return true -end - -local function on_switch_lamp(pos, on) - techage.light_ring(pos, on) -end - -techage.register_lamp("techage:growlight", { - description = S("TA4 LED Grow Light"), - tiles = { - -- up, down, right, left, back, front - 'techage_growlight_off.png', - 'techage_growlight_back.png', - 'techage_growlight_off.png', - 'techage_growlight_side.png', - 'techage_growlight_side.png', - 'techage_growlight_side.png', - 'techage_growlight_side.png', - 'techage_growlight_side.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, -13/32, 8/16}, - }, - }, - on_timer = node_timer_off, - on_switch_lamp = on_switch_lamp, - high_power = true, -},{ - description = S("TA4 LED Grow Light"), - tiles = { - -- up, down, right, left, back, front - 'techage_growlight_on.png', - 'techage_growlight_back.png', - 'techage_growlight_side.png', - 'techage_growlight_side.png', - 'techage_growlight_side.png', - 'techage_growlight_side.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, -13/32, 8/16}, - }, - }, - on_timer = node_timer_on, - on_switch_lamp = on_switch_lamp, - high_power = true, -}) - -minetest.register_craft({ - output = "techage:growlight_off", - recipe = { - {"techage:ta4_leds", "techage:basalt_glass_thin", "techage:ta4_leds"}, - {"techage:ta4_leds", "techage:ta4_leds", "techage:ta4_leds"}, - {"techage:ta4_leds", "techage:aluminum", "techage:ta4_leds"}, - }, -}) - -local function contains(table, element) - for _, value in pairs(table) do - if value == element then - return true - end - end - return false -end - -function techage.register_flower(name) - if contains(Flowers, name) then - return - end - Flowers[#Flowers+1] = name -end - -function techage.register_plant(name) - Plants[name] = true -end - -minetest.after(1, function() - local function add_flower(name) - local def = minetest.registered_nodes[name] - if def and (def.groups.mushroom == 1 or def.groups.flower == 1) then - if not Ignore[name] then - techage.register_flower(name) - end - end - end - - for _,def in pairs(minetest.registered_decorations) do - local name = def.decoration - if type(name) == "string" then - add_flower(name) - elseif type(name) == "table" then - for _,sub_name in ipairs(name) do - add_flower(sub_name) - end - end - end - for name,ndef in pairs(minetest.registered_nodes) do - if type(name) == "string" then - local mod = string.split(name, ":")[1] - if mod == "farming" and ndef.on_timer then -- probably a plant that still needs to grow - if not Ignore[name] then - techage.register_plant(name) - end - end - end - end -end) diff --git a/techage/lamps/industriallamp1.lua b/techage/lamps/industriallamp1.lua deleted file mode 100644 index 5fcfeb4..0000000 --- a/techage/lamps/industriallamp1.lua +++ /dev/null @@ -1,66 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Industrial Lamp 1 - -]]-- - -local S = techage.S - -techage.register_lamp("techage:industriallamp1", { - description = S("TA Industrial Lamp 1"), - inventory_image = 'techage_industriallamp_inv1.png', - tiles = { - -- up, down, right, left, back, front - 'techage_industriallamp1.png', - 'techage_industriallamp1.png', - 'techage_industriallamp1.png^[transformR180', - 'techage_industriallamp1.png^[transformR180', - 'techage_industriallamp1.png', - 'techage_industriallamp1.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -3/32, -6/16, -9/32, 3/32}, - { 6/16, -8/16, -3/32, 8/16, -9/32, 3/32}, - {-6/16, -7/16, -1/16, 6/16, -5/16, 1/16}, - }, - }, -},{ - tiles = { - -- up, down, right, left, back, front - 'techage_industriallamp1_on.png', - 'techage_industriallamp1_on.png', - 'techage_industriallamp1_on.png^[transformR180', - 'techage_industriallamp1_on.png^[transformR180', - 'techage_industriallamp1_on.png', - 'techage_industriallamp1_on.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -3/32, -6/16, -9/32, 3/32}, - { 6/16, -8/16, -3/32, 8/16, -9/32, 3/32}, - {-6/16, -7/16, -1/16, 6/16, -5/16, 1/16}, - }, - }, -}) - -minetest.register_craft({ - output = "techage:industriallamp1_off 2", - recipe = { - {"", "", ""}, - {"default:glass", "techage:simplelamp_off", "dye:grey"}, - {"basic_materials:plastic_strip", "default:copper_ingot", "basic_materials:plastic_strip"}, - }, -}) diff --git a/techage/lamps/industriallamp2.lua b/techage/lamps/industriallamp2.lua deleted file mode 100644 index b0f3227..0000000 --- a/techage/lamps/industriallamp2.lua +++ /dev/null @@ -1,68 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Industrial Lamp 2 - -]]-- - -local S = techage.S - -local size = {x = 8/32, y = 8/32, z = 5/32} - -techage.register_lamp("techage:industriallamp2", { - description = S("TA Industrial Lamp 2"), - inventory_image = 'techage_industriallamp_inv2.png', - tiles = { - -- up, down, right, left, back, front - 'techage_industriallamp2.png', - 'techage_industriallamp2.png', - 'techage_industriallamp2.png^[transformR180', - 'techage_industriallamp2.png^[transformR180', - 'techage_industriallamp2.png', - 'techage_industriallamp2.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/32, -16/32, -4/32, 8/32, -9/32, 4/32}, - {-7/32, -16/32, -5/32, 7/32, -9/32, 5/32}, - {-7/32, -9/32, -4/32, 7/32, -8/32, 4/32}, - }, - }, -},{ - tiles = { - -- up, down, right, left, back, front - 'techage_industriallamp2_on.png', - 'techage_industriallamp2_on.png', - 'techage_industriallamp2_on.png^[transformR180', - 'techage_industriallamp2_on.png^[transformR180', - 'techage_industriallamp2_on.png', - 'techage_industriallamp2_on.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/32, -16/32, -4/32, 8/32, -9/32, 4/32}, - {-7/32, -16/32, -5/32, 7/32, -9/32, 5/32}, - {-7/32, -9/32, -4/32, 7/32, -8/32, 4/32}, - }, - }, -}) - -minetest.register_craft({ - output = "techage:industriallamp2_off 2", - recipe = { - {"default:glass", "default:glass", ""}, - {"techage:simplelamp_off", "dye:black", ""}, - {"basic_materials:steel_bar", "basic_materials:steel_bar", ""}, - }, -}) diff --git a/techage/lamps/industriallamp3.lua b/techage/lamps/industriallamp3.lua deleted file mode 100644 index 51d27bf..0000000 --- a/techage/lamps/industriallamp3.lua +++ /dev/null @@ -1,64 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Industrial Lamp 3 - -]]-- - -local S = techage.S - -local size = {x = 6/32, y = 4/32, z = 6/32} - -techage.register_lamp("techage:industriallamp3", { - description = S("TA Industrial Lamp 3"), - inventory_image = 'techage_industriallamp_inv3.png', - tiles = { - -- up, down, right, left, back, front - 'techage_industriallamp3.png', - 'techage_industriallamp3.png', - 'techage_industriallamp3.png^[transformR180', - 'techage_industriallamp3.png^[transformR180', - 'techage_industriallamp3.png', - 'techage_industriallamp3.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.1875, -0.5, -0.1875, 0.1875, -0.375, 0.1875}, - }, - }, -},{ - tiles = { - -- up, down, right, left, back, front - 'techage_industriallamp3_on.png', - 'techage_industriallamp3_on.png', - 'techage_industriallamp3_on.png^[transformR180', - 'techage_industriallamp3_on.png^[transformR180', - 'techage_industriallamp3_on.png', - 'techage_industriallamp3_on.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.1875, -0.5, -0.1875, 0.1875, -0.375, 0.1875}, - }, - }, -}) - -minetest.register_craft({ - output = "techage:industriallamp3_off 2", - recipe = { - {"default:glass", "default:glass", ""}, - {"techage:simplelamp_off", "dye:red", ""}, - {"basic_materials:steel_bar", "basic_materials:steel_bar", ""}, - }, -}) diff --git a/techage/lamps/industriallamp4.lua b/techage/lamps/industriallamp4.lua deleted file mode 100644 index 2646136..0000000 --- a/techage/lamps/industriallamp4.lua +++ /dev/null @@ -1,64 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Industrial Lamp 4 - -]]-- - -local S = techage.S - -local function on_switch_lamp(pos, on) - techage.light_ring({x = pos.x, y = pos.y - 3, z = pos.z}, on) -end - -techage.register_lamp("techage:industriallamp4", { - description = S("TA4 LED Industrial Lamp"), - tiles = { - 'techage_growlight_off.png', - 'techage_growlight_back.png', - 'techage_growlight_side.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, -13/32, 8/16}, - }, - }, - on_switch_lamp = on_switch_lamp, - conn_sides = {"U"}, - high_power = true, -},{ - description = S("TA4 LED Industrial Lamp"), - tiles = { - -- up, down, right, left, back, front - 'techage_industlight4_on.png', - 'techage_growlight_back.png', - 'techage_growlight_side.png', - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, -13/32, 8/16}, - }, - }, - on_switch_lamp = on_switch_lamp, - high_power = true, -}) - -minetest.register_craft({ - output = "techage:industriallamp4_off", - recipe = { - {"basic_materials:steel_strip", "basic_materials:steel_strip", "basic_materials:steel_strip"}, - {"techage:ta4_leds", "techage:ta4_leds", "techage:ta4_leds"}, - {"techage:ta4_leds", "techage:basalt_glass_thin", "techage:ta4_leds"}, - }, -}) diff --git a/techage/lamps/lampholder.lua b/techage/lamps/lampholder.lua deleted file mode 100644 index cb7dcaf..0000000 --- a/techage/lamps/lampholder.lua +++ /dev/null @@ -1,115 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/4 Lamp Holder - -]]-- - -local S = techage.S - -local function register_holder(name, description, png) - minetest.register_node(name, { - description = description, - tiles = {png}, - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "connected", - fixed = {{ -4/32, -4/32, -4/32, 4/32, 4/32, 4/32}}, - - connect_top = {{ -3/32, -3/32, -3/32, 3/32, 16/32, 3/32}}, - connect_bottom = {{ -3/32, -16/32, -3/32, 3/32, 3/32, 3/32}}, - connect_left = {{-16/32, -3/32, -3/32, 3/32, 3/32, 3/32}}, - connect_right = {{ -3/32, -3/32, -3/32, 16/32, 3/32, 3/32}}, - connect_back = {{ -3/32, -3/32, -3/32, 3/32, 3/32, 16/32}}, - connect_front = {{ -3/32, -3/32, -16/32, 3/32, 3/32, 3/32}}, - }, - connects_to = { - "techage:ceilinglamp_off", "techage:ceilinglamp_on", - "techage:growlight_off", "techage:growlight_on", - "techage:industriallamp1_off", "techage:industriallamp1_on", - "techage:industriallamp2_off", "techage:industriallamp2_on", - "techage:industriallamp3_off", "techage:industriallamp3_on", - "techage:industriallamp4_off", "techage:industriallamp4_on", - "techage:simplelamp_off", "techage:simplelamp_on", - "techage:streetlamp_off", "techage:streetlamp_on", - "techage:streetlamp2_off", "techage:streetlamp2_on", - "techage:streetlamp_arm", "techage:streetlamp_pole", - "techage:streetlamp2_off", "techage:streetlamp2_on", - "techage:power_line", "techage:power_lineS", "techage:power_lineA" - }, - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, - sounds = default.node_sound_defaults(), - }) -end - - -register_holder("techage:lampholder1", S("TA Lamp Holder White"), "techage_streetlamp2_housing.png") -register_holder("techage:lampholder2", S("TA Lamp Holder Aspen"), "default_aspen_wood.png") -register_holder("techage:lampholder3", S("TA Lamp Holder Acacia"), "default_acacia_wood.png") -register_holder("techage:lampholder4", S("TA Lamp Holder Apple"), "default_wood.png") -register_holder("techage:lampholder5", S("TA Lamp Holder Copper"), "default_copper_block.png") -register_holder("techage:lampholder6", S("TA Lamp Holder Gold"), "default_gold_block.png") - - -minetest.register_craft({ - output = "techage:lampholder1 2", - recipe = { - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - {"", "dye:white", ""}, - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - }, -}) - -minetest.register_craft({ - output = "techage:lampholder2 2", - recipe = { - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - {"", "default:fence_aspen_wood", ""}, - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - }, -}) - -minetest.register_craft({ - output = "techage:lampholder3 2", - recipe = { - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - {"", "default:fence_acacia_wood", ""}, - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - }, -}) - -minetest.register_craft({ - output = "techage:lampholder4 2", - recipe = { - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - {"", "default:fence_wood", ""}, - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - }, -}) -minetest.register_craft({ - output = "techage:lampholder5 2", - recipe = { - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - {"", "default:copper_ingot", ""}, - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - }, -}) -minetest.register_craft({ - output = "techage:lampholder6 2", - recipe = { - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - {"", "default:gold_ingot", ""}, - {"basic_materials:steel_bar", "", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/lamps/lib.lua b/techage/lamps/lib.lua deleted file mode 100644 index 4ef7676..0000000 --- a/techage/lamps/lib.lua +++ /dev/null @@ -1,183 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Lamp library - -]]-- - --- 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 - -local PWR_NEEDED = 0.5 -local CYCLE_TIME = 2 - -local Cable = techage.ElectricCable -local power = networks.power - -local function swap_node(pos, postfix) - local node = techage.get_node_lvm(pos) - local parts = string.split(node.name, "_") - if postfix == parts[2] then - return - end - node.name = parts[1].."_"..postfix - minetest.swap_node(pos, node) - local ndef = minetest.registered_nodes[node.name] - if ndef.on_switch_lamp then - ndef.on_switch_lamp(pos, postfix == "on") - end -end - -local function on_power(pos) - swap_node(pos, "on") - local nvm = techage.get_nvm(pos) - nvm.turned_on = true -end - -local function on_nopower(pos) - swap_node(pos, "off") - local nvm = techage.get_nvm(pos) - nvm.turned_on = false -end - -local function is_running(pos, nvm) - return nvm.turned_on -end - -local function node_timer_off1(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed == PWR_NEEDED then - on_power(pos) - end - return true -end - -local function node_timer_off2(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED * 2) - if consumed == PWR_NEEDED * 2 then - on_power(pos) - end - return true -end - -local function node_timer_on1(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed < PWR_NEEDED then - on_nopower(pos) - end - return true -end - -local function node_timer_on2(pos, elapsed) - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED * 2) - if consumed < PWR_NEEDED * 2 then - on_nopower(pos) - end - return true -end - -local function lamp_on_rightclick(pos, node, clicker) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - if not nvm.turned_on and power.power_available(pos, Cable) then - nvm.turned_on = true - minetest.get_node_timer(pos):start(CYCLE_TIME) - swap_node(pos, "on") - else - nvm.turned_on = false - minetest.get_node_timer(pos):stop() - swap_node(pos, "off") - end -end - -local function on_rotate(pos, node, user, mode, new_param2) - if minetest.is_protected(pos, user:get_player_name()) then - return false - end - node.param2 = techage.rotate_wallmounted(node.param2) - minetest.swap_node(pos, node) - return true -end - -local function on_place(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end - return minetest.rotate_and_place(itemstack, placer, pointed_thing) -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -local function tubelib2_on_update2(pos, outdir, tlib2, node) - power.update_network(pos, outdir, tlib2) -end - -function techage.register_lamp(basename, ndef_off, ndef_on) - if ndef_off.high_power then - ndef_off.on_timer = ndef_off.on_timer or node_timer_off2 - else - ndef_off.on_timer = ndef_off.on_timer or node_timer_off1 - end - ndef_off.after_place_node = after_place_node - ndef_off.after_dig_node = after_dig_node - ndef_off.on_rightclick = lamp_on_rightclick - if not ndef_off.on_rotate then - ndef_off.on_place = on_place - end - ndef_off.on_rotate = ndef_off.on_rotate or on_rotate - ndef_off.paramtype = "light" - ndef_off.use_texture_alpha = techage.CLIP - ndef_off.light_source = 0 - ndef_off.sunlight_propagates = true - ndef_off.paramtype2 = "facedir" - ndef_off.groups = {choppy=2, cracky=2, crumbly=2} - ndef_off.is_ground_content = false - ndef_off.sounds = default.node_sound_glass_defaults() - - if ndef_on.high_power then - ndef_on.on_timer = ndef_on.on_timer or node_timer_on2 - else - ndef_on.on_timer = ndef_on.on_timer or node_timer_on1 - end - ndef_on.after_place_node = after_place_node - ndef_on.after_dig_node = after_dig_node - ndef_on.on_rightclick = lamp_on_rightclick - ndef_on.on_rotate = ndef_on.on_rotate or on_rotate - ndef_on.paramtype = "light" - ndef_on.use_texture_alpha = techage.CLIP - ndef_on.light_source = minetest.LIGHT_MAX - ndef_on.sunlight_propagates = true - ndef_on.paramtype2 = "facedir" - ndef_on.diggable = false - ndef_on.groups = {not_in_creative_inventory=1} - ndef_on.is_ground_content = false - ndef_on.sounds = default.node_sound_glass_defaults() - - minetest.register_node(basename.."_off", ndef_off) - minetest.register_node(basename.."_on", ndef_on) - - power.register_nodes({basename.."_off", basename.."_on"}, Cable, "con") - techage.register_node_for_v1_transition({basename.."_off", basename.."_on"}, function(pos, node) - power.update_network(pos, nil, Cable) - end) -end diff --git a/techage/lamps/lightblock.lua b/techage/lamps/lightblock.lua deleted file mode 100644 index a874452..0000000 --- a/techage/lamps/lightblock.lua +++ /dev/null @@ -1,65 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Invisible Light Block - -]]-- - -local S = techage.S - --- 9 light positions in a 3x3 field -local Positions = { - {x =-1, y = 0, z = 0}, - {x = 0, y = 0, z =-1}, - {x = 1, y = 0, z = 0}, - {x = 0, y = 0, z = 1}, - {x =-1, y = 0, z =-1}, - {x = 1, y = 0, z = 1}, - {x =-1, y = 0, z = 1}, - {x = 1, y = 0, z =-1}, -} - -minetest.register_node("techage:lightblock", { - description = "Techage Light Block", - drawtype = "airlike", - paramtype = "light", - light_source = minetest.LIGHT_MAX, - sunlight_propagates = true, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - floodable = true, - is_ground_content = false, - groups = {not_in_creative_inventory=1}, - drop = "", -}) - -function techage.light_ring(center_pos, on, large) - if on then - for _,dir in ipairs(Positions) do - if large then - dir = vector.multiply(dir, 2) - end - local pos1 = vector.add(center_pos, dir) - local node = techage.get_node_lvm(pos1) - if node.name == "air" then - minetest.set_node(pos1, {name = "techage:lightblock"}) - end - end - else - local pos1 = {x=center_pos.x-2, y=center_pos.y-2, z=center_pos.z-2} - local pos2 = {x=center_pos.x+2, y=center_pos.y+2, z=center_pos.z+2} - for _,pos in ipairs(minetest.find_nodes_in_area(pos1, pos2, "techage:lightblock")) do - minetest.remove_node(pos) - end - minetest.fix_light(pos1, pos2) - end -end diff --git a/techage/lamps/simplelamp.lua b/techage/lamps/simplelamp.lua deleted file mode 100644 index 197b7f8..0000000 --- a/techage/lamps/simplelamp.lua +++ /dev/null @@ -1,53 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Lamp - -]]-- - -local S = techage.S - -techage.register_lamp("techage:simplelamp", { - description = S("TA Lamp"), - tiles = { - 'techage_electric_button.png', - }, - conn_sides = {"L", "R", "U", "D", "F", "B"}, - paramtype = "light", - light_source = 0, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -},{ - description = S("TA Lamp"), - tiles = { - 'techage_electric_button.png', - }, - conn_sides = {"L", "R", "U", "D", "F", "B"}, - paramtype = "light", - light_source = minetest.LIGHT_MAX, - sunlight_propagates = true, - paramtype2 = "facedir", - drop = "techage:test_lamp", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:simplelamp_off 2", - recipe = { - {"", "", ""}, - {"", "default:glass", ""}, - {"", "basic_materials:heating_element", ""}, - }, -}) diff --git a/techage/lamps/streetlamp.lua b/techage/lamps/streetlamp.lua deleted file mode 100644 index 945b84b..0000000 --- a/techage/lamps/streetlamp.lua +++ /dev/null @@ -1,70 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Street Lamp - -]]-- - -local S = techage.S - -techage.register_lamp("techage:streetlamp", { - description = S("TA Street Lamp"), - tiles = { - -- up, down, right, left, back, front - 'techage_streetlamp_top.png', - 'techage_streetlamp_top.png', - 'techage_streetlamp_off.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-5/16, -8/16, -5/16, 5/16, 8/16, 5/16}, - {-2/16, -8/16, -2/16, 2/16, 8/16, 2/16}, - {-8/16, 4/16, -8/16, 8/16, 5/16, 8/16}, - {-5/16, -8/16, -5/16, 5/16, -7/16, 5/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - on_rotate = screwdriver.disallow, - conn_sides = {"U", "D"}, -},{ - description = S("TA Street Lamp"), - tiles = { - -- up, down, right, left, back, front - 'techage_streetlamp_top.png', - 'techage_streetlamp_top.png', - 'techage_streetlamp.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-5/16, -8/16, -5/16, 5/16, 8/16, 5/16}, - {-8/16, 4/16, -8/16, 8/16, 5/16, 8/16}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, - }, - on_rotate = screwdriver.disallow, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:streetlamp_off 2", - recipe = {"techage:simplelamp_off", "default:steel_ingot", "default:glass"}, -}) diff --git a/techage/lamps/streetlamp2.lua b/techage/lamps/streetlamp2.lua deleted file mode 100644 index e07aa73..0000000 --- a/techage/lamps/streetlamp2.lua +++ /dev/null @@ -1,128 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 LED Street Lamp - -]]-- - -local S = techage.S - -local function on_switch_lamp(pos, on) - techage.light_ring({x = pos.x, y = pos.y - 3, z = pos.z}, on, true) -end - -techage.register_lamp("techage:streetlamp2", { - description = S("TA4 LED Street Lamp"), - tiles = { - "techage_streetlamp2_housing.png", - "techage_streetlamp2_housing.png^techage_streetlamp2_off.png", - "techage_streetlamp2_housing.png", - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {{ -8/32, 8/32, -16/32, 8/32, 15/32, 16/32}}, - }, - on_switch_lamp = on_switch_lamp, - on_rotate = screwdriver.disallow, - conn_sides = {"F", "B"}, - high_power = true, -},{ - description = S("TA4 LED Street Lamp"), - tiles = { - -- up, down, right, left, back, front - "techage_streetlamp2_housing_on.png", - "techage_streetlamp2_housing_on.png^techage_streetlamp2_on.png", - "techage_streetlamp2_housing_on.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {{ -8/32, 8/32, -16/32, 8/32, 15/32, 16/32}}, - }, - on_switch_lamp = on_switch_lamp, - on_rotate = screwdriver.disallow, - conn_sides = {"F", "B"}, - high_power = true, -}) - -minetest.register_node("techage:streetlamp_pole", { - description = S("TA4 LED Street Lamp Pole"), - tiles = { - "techage_streetlamp2_housing.png", - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "connected", - fixed = {{ -5/32, -16/32, -5/32, 5/32, 16/32, 5/32}}, - - connect_left = {{-16/32, 8/32, -3/32, 3/32, 14/32, 3/32}}, - connect_right = {{ -3/32, 8/32, -3/32, 16/32, 14/32, 3/32}}, - connect_back = {{ -3/32, 8/32, -3/32, 3/32, 14/32, 16/32}}, - connect_front = {{ -3/32, 8/32, -16/32, 3/32, 14/32, 3/32}}, - }, - connects_to = {"techage:streetlamp_arm", "techage:streetlamp2_off", "techage:streetlamp2_on"}, - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("techage:streetlamp_arm", { - description = S("TA4 LED Street Lamp Arm"), - tiles = { - "techage_streetlamp2_housing.png", - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = {{ -3/32, 8/32, -16/32, 3/32, 14/32, 16/32}}, - }, - paramtype = "light", - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_craft({ - output = "techage:streetlamp2_off", - recipe = { - {"basic_materials:steel_strip", "dye:white", "basic_materials:steel_strip"}, - {"techage:ta4_leds", "techage:ta4_leds", "techage:ta4_leds"}, - {"techage:ta4_leds", "techage:basalt_glass_thin", "techage:ta4_leds"}, - }, -}) - -minetest.register_craft({ - output = "techage:streetlamp_pole 2", - recipe = { - {"", "basic_materials:steel_bar", ""}, - {"", "basic_materials:steel_bar", "dye:white"}, - {"", "basic_materials:steel_bar", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:streetlamp_arm 2", - recipe = { - {"", "dye:white", ""}, - {"basic_materials:steel_bar", "basic_materials:steel_bar", "basic_materials:steel_bar"}, - {"", "", ""}, - }, -}) diff --git a/techage/liquids/filler.lua b/techage/liquids/filler.lua deleted file mode 100644 index 21a1ebf..0000000 --- a/techage/liquids/filler.lua +++ /dev/null @@ -1,159 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Liquid Filler - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local liquid = techage.liquid -local CYCLE_TIME = 2 - -local function formspec(pos) - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;7.8,0.5;#c6e8ff]".. - "label[3,-0.1;"..minetest.colorize( "#000000", S("Liquid Filler")).."]".. - "list[context;src;0,0.8;3,3;]".. - "image[3.5,1.8;1,1;techage_form_arrow_bg.png^[transformR270]".. - "list[context;dst;5,0.8;3,3;]".. - "list[current_player;main;0,4.2;8,4;]".. - "listring[current_player;main]".. - "listring[context;src]" .. - "listring[current_player;main]".. - "listring[context;dst]" .. - "listring[current_player;main]".. - default.get_hotbar_bg(0, 4.2) - -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 - minetest.get_node_timer(pos):start(CYCLE_TIME) - return stack:get_count() -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 can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = M(pos):get_inventory() - return inv:is_empty("src") and inv:is_empty("dst") -end - -local function on_rightclick(pos, node, clicker) - local inv = M(pos):get_inventory() - if not inv:is_empty("src") then - minetest.get_node_timer(pos):start(CYCLE_TIME) - end -end - -local function node_timer(pos, elapsed) - local inv = M(pos):get_inventory() - if not inv:is_empty("src") then - local taken = techage.get_items(pos, inv, "src", 1) - if liquid.is_container_empty(taken:get_name()) then - liquid.fill_container({x = pos.x, y = pos.y+1, z = pos.z}, inv, taken:get_name()) - else - liquid.empty_container({x = pos.x, y = pos.y-1, z = pos.z}, inv, taken:get_name()) - end - end - return true -end - -minetest.register_node("techage:filler", { - description = S("TA Liquid Filler"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_hole_tube.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_hole_tube.png", - "techage_filling_ta3.png^techage_frame_small_ta3.png^techage_appl_outp.png", - "techage_filling_ta3.png^techage_frame_small_ta3.png^techage_appl_inp.png", - "techage_filling_ta3.png^techage_appl_liquid_hopper.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_liquid_hopper.png^techage_frame_ta3.png", - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -1/2, -3/8, -3/8, 1/2, 3/8, 3/8}, -- box - { -2/8, 3/8, -2/8, 2/8, 4/8, 2/8}, -- top - { -2/8, -4/8, -2/8, 2/8, -3/8, 2/8}, -- bottom - }, - }, - - on_construct = function(pos) - local inv = M(pos):get_inventory() - inv:set_size('src', 9) - inv:set_size('dst', 9) - end, - - after_place_node = function(pos, placer) - M(pos):set_string("formspec", formspec(pos)) - end, - - on_rightclick = on_rightclick, - on_timer = node_timer, - can_dig = can_dig, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = techage.CLIP, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, - sounds = default.node_sound_defaults(), -}) - -techage.register_node({"techage:filler"}, { - on_pull_item = function(pos, in_dir, num) - local inv = M(pos):get_inventory() - return techage.get_items(pos, inv, "dst", num) - end, - on_push_item = function(pos, in_dir, stack) - local inv = M(pos):get_inventory() - if not minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):start(CYCLE_TIME) - end - return techage.put_items(inv, "src", stack) - end, - on_unpull_item = function(pos, in_dir, stack) - local inv = M(pos):get_inventory() - return techage.put_items(inv, "dst", stack) - end, -}) - - -minetest.register_craft({ - output = "techage:filler", - recipe = { - {"default:steel_ingot", "group:wood", "default:steel_ingot"}, - {"techage:tubeS", "", "techage:tubeS"}, - {"default:steel_ingot", "group:wood", "default:steel_ingot"}, - }, -}) diff --git a/techage/liquids/liquid_pipe.lua b/techage/liquids/liquid_pipe.lua deleted file mode 100644 index 2e94efa..0000000 --- a/techage/liquids/liquid_pipe.lua +++ /dev/null @@ -1,205 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Liquid Pipes - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local MAX_PIPE_LENGHT = 100 - -local liquid = networks.liquid - -local Pipe = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = MAX_PIPE_LENGHT, - show_infotext = false, - force_to_use_tubes = false, - tube_type = "pipe2", - primary_node_names = { - "techage:ta3_pipeS", "techage:ta3_pipeA", - "techage:ta3_pipe_wall_entry", "techage:ta3_valve_open", - }, - secondary_node_names = {}, - after_place_tube = function(pos, param2, tube_type, num_tubes) - local name = minetest.get_node(pos).name - if name == "techage:ta3_pipe_wall_entry" then - minetest.swap_node(pos, {name = "techage:ta3_pipe_wall_entry", param2 = param2}) - elseif name == "techage:ta3_valve_open" then - minetest.swap_node(pos, {name = "techage:ta3_valve_open", param2 = param2}) - else - minetest.swap_node(pos, {name = "techage:ta3_pipe"..tube_type, param2 = param2}) - end - end, -}) - --- Use global callback instead of node related functions -Pipe:register_on_tube_update2(function(pos, outdir, tlib2, node) - liquid.update_network(pos, outdir, tlib2, node) -end) - -minetest.register_node("techage:ta3_pipeS", { - description = S("TA Pipe"), - tiles = { - "techage_gaspipe.png^[transformR90", - "techage_gaspipe.png^[transformR90", - "techage_gaspipe.png", - "techage_gaspipe.png", - "techage_gaspipe_hole2.png", - "techage_gaspipe_hole2.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Pipe:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -1/8, -4/8, 1/8, 1/8, 4/8}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2}, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta3_pipeA", { - description = S("TA Pipe"), - tiles = { - "techage_gaspipe_knee2.png", - "techage_gaspipe_hole2.png^[transformR180", - "techage_gaspipe_knee.png^[transformR270", - "techage_gaspipe_knee.png", - "techage_gaspipe_knee2.png", - "techage_gaspipe_hole2.png", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -4/8, -1/8, 1/8, 1/8, 1/8}, - {-2/8, -0.5, -2/8, 2/8, -13/32, 2/8}, - {-1/8, -1/8, -4/8, 1/8, 1/8, -1/8}, - {-2/8, -2/8, -0.5, 2/8, 2/8, -13/32}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, not_in_creative_inventory=1}, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta3_pipeS", -}) - -local size1 = 1/8 -local size2 = 2/8 -local size3 = 13/32 -local Boxes = { - { - {-size1, -size1, size1, size1, size1, 0.5 }, -- z+ - {-size2, -size2, size3, size2, size2, 0.5 }, -- z+ - }, - { - {-size1, -size1, -size1, 0.5, size1, size1}, -- x+ - { size3, -size2, -size2, 0.5, size2, size2}, -- x+ - }, - { - {-size1, -size1, -0.5, size1, size1, size1}, -- z- - {-size2, -size2, -0.5, size2, size2, -size3}, -- z- - }, - { - {-0.5, -size1, -size1, size1, size1, size1}, -- x- - {-0.5, -size2, -size2, -size3, size2, size2}, -- x- - }, - { - {-size1, -0.5, -size1, size1, size1, size1}, -- y- - {-size2, -0.5, -size2, size2, -size3, size2}, -- y- - }, - { - {-size1, -size1, -size1, size1, 0.5, size1}, -- y+ - {-size2, size3, -size2, size2, 0.5, size2}, -- y+ - } -} - -local names = networks.register_junction("techage:ta3_junctionpipe", 1/8, Boxes, Pipe, { - description = S("TA Junction Pipe"), - tiles = {"techage_gaspipe_junction.png"}, - use_texture_alpha = techage.CLIP, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, techage_trowel = 1}, - sounds = default.node_sound_metal_defaults(), - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local name = "techage:ta3_junctionpipe" .. networks.junction_type(pos, Pipe) - minetest.swap_node(pos, {name = name, param2 = 0}) - Pipe:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir1, tlib2, node) - local name = "techage:ta3_junctionpipe" .. networks.junction_type(pos, Pipe) - minetest.swap_node(pos, {name = name, param2 = 0}) - liquid.update_network(pos, 0, tlib2, node) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - end, -}, 25) - -liquid.register_nodes(names, Pipe, "junc") - -minetest.register_craft({ - output = "techage:ta3_junctionpipe25 2", - recipe = { - {"", "techage:ta3_pipeS", ""}, - {"techage:ta3_pipeS", "", "techage:ta3_pipeS"}, - {"", "techage:ta3_pipeS", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta3_pipeS 6", - recipe = { - {'', '', "techage:iron_ingot"}, - {'dye:yellow', 'default:steel_ingot', ''}, - {"techage:iron_ingot", '', ''}, - }, -}) - -minetest.register_alias("techage:ta4_pipeA", "techage:ta3_pipeA") -minetest.register_alias("techage:ta4_pipeS", "techage:ta3_pipeS") - -techage.LiquidPipe = Pipe diff --git a/techage/liquids/pipe_wall_entry.lua b/techage/liquids/pipe_wall_entry.lua deleted file mode 100644 index f94afd2..0000000 --- a/techage/liquids/pipe_wall_entry.lua +++ /dev/null @@ -1,57 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Liquid Pipe Wall Entry - -]]-- - -local S = techage.S - -local Pipe = techage.LiquidPipe - -minetest.register_node("techage:ta3_pipe_wall_entry", { - description = S("TA3 Pipe Wall Entry"), - tiles = { - -- up, down, right, left, back, front - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png^techage_appl_hole_pipe.png", - "basic_materials_concrete_block.png^techage_appl_hole_pipe.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Pipe:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - groups = {crumbly = 2, cracky = 2, snappy = 2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta3_pipe_wall_entry", - recipe = { - {"", "techage:ta3_pipeS", ""}, - {"", "basic_materials:concrete_block", ""}, - {"", "",""}, - }, -}) diff --git a/techage/liquids/pump.lua b/techage/liquids/pump.lua deleted file mode 100644 index 34bf43f..0000000 --- a/techage/liquids/pump.lua +++ /dev/null @@ -1,420 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Pump - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid -local Flip = networks.Flip - -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 2 -local CAPA = 4 - -local WRENCH_MENU = { - { - type = "output", - name = "flowrate", - label = S("Total flow rate"), - tooltip = S("Total flow rate in liquid units"), - }, - { - type = "number", - name = "limit", - label = S("Number of units"), - tooltip = S("Number of liquid units that are allowed to be pumped"), - default = "0", - }, -} - -local State3 = techage.NodeStates:new({ - node_name_passive = "techage:t3_pump", - node_name_active = "techage:t3_pump_on", - infotext_name = S("TA3 Pump"), - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, -}) - -local State4 = techage.NodeStates:new({ - node_name_passive = "techage:t4_pump", - node_name_active = "techage:t4_pump_on", - infotext_name = S("TA4 Pump"), - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, -}) - -local function handle_pump_limit(pos, nvm) - local val = M(pos):get_int("limit") - if val and val > 0 then - nvm.limit = val - nvm.num_items = 0 - else - nvm.limit = nil - nvm.num_items = nil - end -end - --- Function returns the number of pumped units -local function pump(pos, mem, nvm, state, outdir, units) - local taken, name = liquid.take(pos, Pipe, Flip[outdir], nil, units, mem.dbg_cycles > 0) - if taken > 0 and name then - local leftover = liquid.put(pos, Pipe, outdir, name, taken, mem.dbg_cycles > 0) - if leftover and leftover > 0 then - -- air needs no tank - if name == "air" then - state:keep_running(pos, nvm, COUNTDOWN_TICKS) - return 0 - end - liquid.untake(pos, Pipe, Flip[outdir], name, leftover) - if leftover == taken then - state:blocked(pos, nvm) - return 0 - end - return taken - leftover - end - return taken - else - state:idle(pos, nvm) - return 0 - end -end - -local function pumping(pos, nvm, state, capa) - local mem = techage.get_mem(pos) - mem.dbg_cycles = (mem.dbg_cycles or 0) - 1 - local outdir = M(pos):get_int("outdir") - - if not nvm.limit then - local num = pump(pos, mem, nvm, state, outdir, capa) - if num > 0 then - state:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - return num - elseif nvm.num_items < nvm.limit then - local num = math.min(capa, nvm.limit - nvm.num_items) - num = pump(pos, mem, nvm, state, outdir, num) - if num > 0 then - nvm.num_items = nvm.num_items + num - if nvm.num_items >= nvm.limit then - state:stop(pos, nvm) - else - state:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - end - return num - end - return 0 -end - -local function after_place_node3(pos, placer) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:t3_pump") - State3:node_init(pos, nvm, number) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Pipe:after_place_node(pos) -end - -local function after_place_node4(pos, placer) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:t4_pump") - State4:node_init(pos, nvm, number) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Pipe:after_place_node(pos) -end - -local function node_timer3(pos, elapsed) - local nvm = techage.get_nvm(pos) - pumping(pos, nvm, State3, CAPA) - return State3:is_active(nvm) -end - -local function node_timer4(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.flowrate = (nvm.flowrate or 0) + pumping(pos, nvm, State4, CAPA * 2) - return State4:is_active(nvm) -end - -local function on_rightclick(pos, node, clicker) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - if node.name == "techage:t3_pump" then - local mem = techage.get_mem(pos) - mem.dbg_cycles = 5 - State3:start(pos, nvm) - elseif node.name == "techage:t3_pump_on" then - State3:stop(pos, nvm) - elseif node.name == "techage:t4_pump" then - local mem = techage.get_mem(pos) - mem.dbg_cycles = 5 - handle_pump_limit(pos, nvm) - State4:start(pos, nvm) - elseif node.name == "techage:t4_pump_on" then - State4:stop(pos, nvm) - end -end - -local function ta_rotate_node(pos, node, new_param2) - Pipe:after_dig_node(pos) - minetest.swap_node(pos, {name = node.name, param2 = new_param2}) - Pipe:after_place_node(pos) - M(pos):set_int("outdir", techage.side_to_outdir("R", new_param2)) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -local ta3_tiles_pas = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3_bottom.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_pump.png^techage_frame_ta3.png^[transformFX", - "techage_filling_ta3.png^techage_appl_pump.png^techage_frame_ta3.png", -} - -local ta4_tiles_pas = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta4.png^[transformFX", - "techage_filling_ta4.png^techage_appl_pump.png^techage_frame_ta4.png", -} - -local ta3_tiles_act = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3_bottom.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - { - name = "techage_filling8_ta3.png^techage_appl_pump8.png^techage_frame8_ta3.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - { - name = "techage_filling8_ta3.png^techage_appl_pump8.png^techage_frame8_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, -} - -local ta4_tiles_act = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_appl_hole_pipe.png^techage_frame_ta4.png", - { - name = "techage_filling8_ta4.png^techage_appl_pump8.png^techage_frame8_ta4.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - { - name = "techage_filling8_ta4.png^techage_appl_pump8.png^techage_frame8_ta4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, -} - -minetest.register_node("techage:t3_pump", { - description = S("TA3 Pump"), - tiles = ta3_tiles_pas, - after_place_node = after_place_node3, - on_rightclick = on_rightclick, - on_timer = node_timer3, - after_dig_node = after_dig_node, - ta_rotate_node = ta_rotate_node, - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:t3_pump_on", { - description = S("TA3 Pump"), - tiles = ta3_tiles_act, - --after_place_node = after_place_node3, - on_rightclick = on_rightclick, - on_timer = node_timer3, - after_dig_node = after_dig_node, - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - diggable = false, - groups = {not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:t4_pump", { - description = S("TA4 Pump"), - tiles = ta4_tiles_pas, - after_place_node = after_place_node4, - on_rightclick = on_rightclick, - on_timer = node_timer4, - after_dig_node = after_dig_node, - ta_rotate_node = ta_rotate_node, - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - ta4_formspec = WRENCH_MENU, -}) - -minetest.register_node("techage:t4_pump_on", { - description = S("TA4 Pump"), - tiles = ta4_tiles_act, - --after_place_node = after_place_node4, - on_rightclick = on_rightclick, - on_timer = node_timer4, - after_dig_node = after_dig_node, - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - diggable = false, - groups = {not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -techage.register_node({"techage:t3_pump", "techage:t3_pump_on"}, { - on_recv_message = function(pos, src, topic, payload) - return State3:on_receive_message(pos, topic, payload) - end, -}) - -techage.register_node({"techage:t4_pump", "techage:t4_pump_on"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "limit" then -- Set pump limit - local nvm = techage.get_nvm(pos) - State4:stop(pos, nvm) - local val = tonumber(payload) or 0 - if val and val > 0 then - nvm.limit = val - nvm.num_items = 0 - M(pos):set_int("limit", val) - else - nvm.limit = nil - nvm.num_items = nil - M(pos):set_string("limit", "") - end - return true - elseif topic == "count" then -- Get number of pumped units - local nvm = techage.get_nvm(pos) - return nvm.num_items or 0 - elseif topic == "flowrate" then -- Get total number of pumped units - local nvm = techage.get_nvm(pos) - return nvm.flowrate or 0 - else - if topic == "on" then - local nvm = techage.get_nvm(pos) - handle_pump_limit(pos, nvm) - end - return State4:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if (topic == 69 or topic == 21) and payload then -- Set pump limit - local nvm = techage.get_nvm(pos) - State4:stop(pos, nvm) - if payload[1] > 0 then - nvm.limit = payload[1] - nvm.num_items = 0 - M(pos):set_int("limit", payload[1]) - else - nvm.limit = nil - nvm.num_items = nil - M(pos):set_string("limit", "") - end - return 0 - else - if topic == 1 then - local nvm = techage.get_nvm(pos) - handle_pump_limit(pos, nvm) - end - return State4:on_beduino_receive_cmnd(pos, topic, payload) - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 137 then -- Get total number of pumped units - local nvm = techage.get_nvm(pos) - return 0, {nvm.flowrate or 0} - elseif topic == 151 then -- Get number of pumped units - local nvm = techage.get_nvm(pos) - return 0, {nvm.num_items or 0} - else - return State4:on_beduino_request_data(pos, topic, payload) - end - end, -}) - --- Pumps have to provide one output and one input side -liquid.register_nodes({ - "techage:t3_pump", "techage:t3_pump_on", - "techage:t4_pump", "techage:t4_pump_on", -}, Pipe, "pump", {"L", "R"}, {}) - -minetest.register_craft({ - output = "techage:t3_pump 2", - recipe = { - {"group:wood", "techage:iron_ingot", "group:wood"}, - {"techage:ta3_pipeS", "techage:usmium_nuggets", "techage:ta3_pipeS"}, - {"group:wood", "techage:iron_ingot", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = "techage:t4_pump", - recipe = { - {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, - {"", "techage:t3_pump", ""}, - {"", "", ""}, - }, -}) diff --git a/techage/liquids/silo.lua b/techage/liquids/silo.lua deleted file mode 100644 index b18c367..0000000 --- a/techage/liquids/silo.lua +++ /dev/null @@ -1,358 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2024 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Powder Silo - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local LQD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).liquid end -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - -local INV_SIZE = 8 -local STACKMAX = 99 - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - -- check if it is powder or techage liquid item (migration function) - local ndef = minetest.registered_craftitems[stack:get_name()] or - minetest.registered_items[stack:get_name()] or {} - if ndef.groups and (ndef.groups.powder == 1 or ndef.groups.ta_liquid == 1) then - local nvm = techage.get_nvm(pos) - nvm.item_name = nil - nvm.item_count = nil - local inv = minetest.get_meta(pos):get_inventory() - if inv:is_empty(listname) then - return stack:get_count() - end - if inv:contains_item(listname, ItemStack(stack:get_name())) then - return stack:get_count() - end - end - return 0 -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 - local nvm = techage.get_nvm(pos) - nvm.item_name = nil - nvm.item_count = nil - return stack:get_count() -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = minetest.get_meta(pos):get_inventory() - return inv:is_empty("main") -end - -local function get_item_name(nvm, inv) - for idx = 1, inv:get_size("main") do - local stack = inv:get_stack("main", idx) - if stack:get_count() > 0 then - nvm.item_name = stack:get_name() - return nvm.item_name - end - end -end - -local function get_item_count(pos) - local inv = M(pos):get_inventory() - local count = 0 - for idx = 1, inv:get_size("main") do - local stack = inv:get_stack("main", idx) - count = count + stack:get_count() - end - return count -end - -local function get_silo_capa(pos) - local inv = M(pos):get_inventory() - for idx = 1, inv:get_size("main") do - local stack = inv:get_stack("main", idx) - if stack:get_count() > 0 then - return inv:get_size("main") * stack:get_stack_max() - end - end - return inv:get_size("main") * STACKMAX -end - -local function formspec3() - return "size[8,5]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;0,0;8,1;]".. - "list[current_player;main;0,1.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -local function formspec4() - return "size[8,6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;0,0;8,2;]".. - "list[current_player;main;0,2.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -local tLiquid = { - capa = 0, - peek = function(pos, indir) - local nvm = techage.get_nvm(pos) - local inv = M(pos):get_inventory() - if not inv:is_empty("main") then - return nvm.item_name or get_item_name(nvm, inv) - end - end, - put = function(pos, indir, name, amount) - -- check if it is powder - local nvm = techage.get_nvm(pos) - local ndef = minetest.registered_craftitems[name] or minetest.registered_nodes[name] or {} - if ndef.groups and ndef.groups.powder == 1 then - local inv = M(pos):get_inventory() - local stack = ItemStack(name.." "..amount) - if inv:room_for_item("main", stack) then - nvm.item_count = nvm.item_count or get_item_count(pos) - inv:add_item("main", stack) - nvm.item_count = nvm.item_count + stack:get_count() - return 0 - end - end - return amount - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local inv = M(pos):get_inventory() - if not name then - name = nvm.item_name or get_item_name(nvm, inv) - end - if name then - local stack = ItemStack(name.." "..amount) - nvm.item_count = nvm.item_count or get_item_count(pos) - local count = inv:remove_item("main", stack):get_count() - nvm.item_count = nvm.item_count - count - return count, name - end - return 0 - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local inv = M(pos):get_inventory() - local stack = ItemStack(name.." "..amount) - if inv:room_for_item("main", stack) then - nvm.item_count = nvm.item_count or get_item_count(pos) - inv:add_item("main", stack) - nvm.item_count = nvm.item_count + stack:get_count() - return 0 - end - return amount - end, -} - -minetest.register_node("techage:ta3_silo", { - description = S("TA3 Silo"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_silo.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_silo.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_silo.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_silo.png", - }, - on_construct = function(pos) - local inv = M(pos):get_inventory() - inv:set_size('main', INV_SIZE) - end, - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = {} - local number = techage.add_node(pos, "techage:ta3_silo") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", formspec3(nvm)) - meta:set_string("infotext", S("TA3 Silo").." "..number) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - can_dig = can_dig, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta4_silo", { - description = S("TA4 Silo"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_silo.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_silo.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_silo.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_silo.png", - }, - on_construct = function(pos) - local inv = M(pos):get_inventory() - inv:set_size('main', INV_SIZE * 2) - end, - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = {} - local number = techage.add_node(pos, "techage:ta4_silo") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", formspec4(nvm)) - meta:set_string("infotext", S("TA4 Silo").." "..number) - Pipe:after_place_node(pos) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - can_dig = can_dig, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - - -techage.register_node({"techage:ta3_silo", "techage:ta4_silo"}, { - on_pull_item = function(pos, in_dir, num) - local inv = M(pos):get_inventory() - if not inv:is_empty("main") then - local taken = techage.get_items(pos, inv, "main", num) - local nvm = techage.get_nvm(pos) - nvm.item_count = nvm.item_count or get_item_count(pos) - nvm.item_count = nvm.item_count - taken:get_count() - return taken - end - end, - on_push_item = function(pos, in_dir, stack) - -- check if it is powder - local name = stack:get_name() - local ndef = minetest.registered_craftitems[name] or {} - if ndef.groups and ndef.groups.powder == 1 then - local inv = M(pos):get_inventory() - - if inv:is_empty("main") then - inv:add_item("main", stack) - local nvm = techage.get_nvm(pos) - nvm.item_count = nvm.item_count or get_item_count(pos) - nvm.item_count = nvm.item_count + stack:get_count() - return true - end - - if inv:contains_item("main", name) and inv:room_for_item("main", stack) then - inv:add_item("main", stack) - local nvm = techage.get_nvm(pos) - nvm.item_count = nvm.item_count or get_item_count(pos) - nvm.item_count = nvm.item_count + stack:get_count() - return true - end - end - return false - end, - on_unpull_item = function(pos, in_dir, stack) - local meta = M(pos) - local inv = meta:get_inventory() - local nvm = techage.get_nvm(pos) - nvm.item_count = nvm.item_count or get_item_count(pos) - nvm.item_count = nvm.item_count + stack:get_count() - return techage.put_items(inv, "main", stack) - end, - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local meta = M(pos) - local inv = meta:get_inventory() - return techage.get_inv_state(inv, "main") - elseif topic == "load" then - local inv = M(pos):get_inventory() - local nvm = techage.get_nvm(pos) - nvm.item_count = nvm.item_count or get_item_count(pos) - nvm.capa = nvm.capa or get_silo_capa(pos) - return techage.power.percent(nvm.capa, nvm.item_count), nvm.item_count - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then -- Chest State - local meta = M(pos) - local inv = meta:get_inventory() - return 0, {techage.get_inv_state_num(inv, "main")} - elseif topic == 134 then - local inv = M(pos):get_inventory() - local nvm = techage.get_nvm(pos) - nvm.item_count = nvm.item_count or get_item_count(pos) - nvm.capa = nvm.capa or get_silo_capa(pos) - if payload[1] == 1 then - return 0, {techage.power.percent(nvm.capa, nvm.item_count)} - else - return 0, {nvm.item_count} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - local nvm = techage.get_nvm(pos) - nvm.item_count = nil - end, -}) - -liquid.register_nodes({"techage:ta3_silo", "techage:ta4_silo"}, Pipe, "tank", nil, tLiquid) - -minetest.register_craft({ - output = "techage:ta3_silo", - recipe = { - {"", "", ""}, - {"techage:tubeS", "techage:chest_ta3", "techage:ta3_pipeS"}, - {"", "", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_silo", - recipe = { - {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, - {"", "techage:ta3_silo", ""}, - {"", "", ""}, - }, -}) diff --git a/techage/liquids/ta5_tank.lua b/techage/liquids/ta5_tank.lua deleted file mode 100644 index e41b3be..0000000 --- a/techage/liquids/ta5_tank.lua +++ /dev/null @@ -1,111 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Hyperloop Tank - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe -local liquid = networks.liquid -local hyperloop = techage.hyperloop -local remote_pos = techage.hyperloop.remote_pos -local shared_tank = techage.shared_tank -local menu = techage.menu - -local CAPACITY = 1000 -local EX_POINTS = 15 - -minetest.register_node("techage:ta5_hl_tank", { - description = S("TA5 Hyperloop Tank"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta5.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_tank.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = {} - local number = techage.add_node(pos, "techage:ta5_hl_tank") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", shared_tank.formspec(pos)) - meta:set_string("infotext", S("TA5 Hyperloop Tank").." "..number) - Pipe:after_place_node(pos) - hyperloop.after_place_node(pos, placer, "tank") - end, - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - if techage.get_expoints(player) >= EX_POINTS then - if techage.menu.eval_input(pos, hyperloop.SUBMENU, fields) then - hyperloop.after_formspec(pos, fields) - shared_tank.on_rightclick(pos, nil, player) - M(pos):set_string("formspec", shared_tank.formspec(pos)) - end - end - end, - on_timer = shared_tank.node_timer, - on_rightclick = shared_tank.on_rightclick, - on_punch = function(pos, node, puncher) - return techage.liquid.on_punch(remote_pos(pos), node, puncher) - end, - can_dig = shared_tank.can_dig, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - hyperloop.after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta5_hl_tank"}, - Pipe, "tank", nil, { - capa = CAPACITY, - peek = shared_tank.peek_liquid, - put = shared_tank.put_liquid, - take = shared_tank.take_liquid, - untake = shared_tank.untake_liquid, - } -) - -techage.register_node({"techage:ta5_hl_tank"}, techage.liquid.recv_message) - -minetest.register_craft({ - output = "techage:ta5_hl_tank", - recipe = { - {"", "techage:ta5_aichip", ""}, - {"", "techage:ta4_tank", ""}, - {"", "", ""}, - }, -}) - -minetest.register_on_mods_loaded(function() - if not minetest.global_exists("hyperloop") then - minetest.clear_craft({output = "techage:ta5_hl_tank"}) - end -end) diff --git a/techage/liquids/tank.lua b/techage/liquids/tank.lua deleted file mode 100644 index 9b87f51..0000000 --- a/techage/liquids/tank.lua +++ /dev/null @@ -1,298 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Tank, Oil Tank - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local N = tubelib2.get_node_lvm -local LQD = function(pos) return (minetest.registered_nodes[N(pos).name] or {}).liquid end -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - -local CAPACITY = 1000 - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - minetest.get_node_timer(pos):start(2) -end - -local function node_timer(pos, elapsed) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - return true - end - return false -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - return techage.liquid.is_empty(pos) -end - -local function peek_liquid(pos, indir) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) -end - -local function take_liquid(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - if (M(pos):get_int("keep_assignment") or 0) == 1 then - amount = math.max(math.min(amount, ((nvm.liquid or {}).amount or 0) - 1), 0) - end - amount, name = liquid.srv_take(nvm, name, amount) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - end - return amount, name -end - -local function put_liquid(pos, indir, name, amount) - -- check if it is not powder - local ndef = minetest.registered_craftitems[name] or {} - if not ndef.groups or ndef.groups.powder ~= 1 then - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, LQD(pos).capa) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - end - return leftover - end - return amount -end - -local function untake_liquid(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, LQD(pos).capa) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", techage.liquid.formspec(pos, nvm)) - end - return leftover -end - -minetest.register_node("techage:ta3_tank", { - description = S("TA3 Tank"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_bottom.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_tank.png", - }, - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = {} - local number = techage.add_node(pos, "techage:ta3_tank") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", techage.liquid.formspec(pos, nvm)) - meta:set_string("infotext", S("TA3 Tank").." "..number) - Pipe:after_place_node(pos) - end, - on_timer = node_timer, - on_punch = techage.liquid.on_punch, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - end, - on_rightclick = on_rightclick, - can_dig = can_dig, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta3_tank"}, - Pipe, "tank", nil, { - capa = CAPACITY, - peek = peek_liquid, - put = put_liquid, - take = take_liquid, - untake = untake_liquid, - } -) - -minetest.register_node("techage:oiltank", { - description = S("Oil Tank"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_metal.png^techage_framexl_ta3_top.png", - "techage_filling_metal.png^techage_framexl_ta3_top.png", - "techage_filling_metal.png^techage_framexl_ta3.png^techage_appl_explosive.png", - }, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = {-6/8, -4/8, -6/8, 6/8, 6/8, 6/8}, - }, - selection_box = { - type = "fixed", - fixed = {-6/8, -4/8, -6/8, 6/8, 6/8, 6/8}, - }, - collision_box = { - type = "fixed", - fixed = {-6/8, -4/8, -6/8, 6/8, 6/8, 6/8}, - }, - wield_scale = {x = 0.8, y = 0.8, z = 0.8}, - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = {} - local number = techage.add_node(pos, "techage:oiltank") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", techage.liquid.formspec(pos, nvm)) - meta:set_string("infotext", S("Oil Tank").." "..number) - Pipe:after_place_node(pos) - end, - on_timer = node_timer, - on_punch = techage.liquid.on_punch, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - end, - on_rightclick = on_rightclick, - can_dig = can_dig, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:oiltank"}, - Pipe, "tank", nil, { - capa = CAPACITY * 4, - peek = peek_liquid, - put = put_liquid, - take = take_liquid, - untake = untake_liquid, - } -) - -minetest.register_node("techage:ta4_tank", { - description = S("TA4 Tank"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_bottom.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_tank.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.liquid = {} - local number = techage.add_node(pos, "techage:ta4_tank") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("formspec", techage.liquid.formspec(pos, nvm)) - meta:set_string("infotext", S("TA4 Tank").." "..number) - Pipe:after_place_node(pos) - end, - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - if fields.public then - M(pos):set_int("public", fields.public == "true" and 1 or 0) - end - if fields.keep_assignment then - M(pos):set_int("keep_assignment", fields.keep_assignment == "true" and 1 or 0) - end - end, - on_timer = node_timer, - on_punch = techage.liquid.on_punch, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - end, - on_rightclick = on_rightclick, - can_dig = can_dig, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta4_tank"}, - Pipe, "tank", nil, { - capa = CAPACITY * 2, - peek = peek_liquid, - put = put_liquid, - take = take_liquid, - untake = untake_liquid, - } -) - -techage.register_node({"techage:ta3_tank", "techage:ta4_tank", "techage:oiltank"}, techage.liquid.recv_message) - -minetest.register_craft({ - output = "techage:ta3_tank 2", - recipe = { - {"techage:iron_ingot", "techage:ta3_barrel_empty", "group:wood"}, - {"group:wood", "techage:ta3_barrel_empty", "techage:ta3_pipeS"}, - {"group:wood", "techage:ta3_barrel_empty", "techage:iron_ingot"}, - }, -}) - -minetest.register_craft({ - output = "techage:oiltank", - recipe = { - {"", "", ""}, - {"techage:ta3_tank", "techage:iron_ingot", ""}, - {"techage:iron_ingot", "techage:ta3_tank", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_tank", - recipe = { - {"default:tin_ingot", "dye:blue", "default:steel_ingot"}, - {"", "techage:ta3_tank", ""}, - {"", "", ""}, - }, -}) - -minetest.register_lbm({ - label = "Repair Tanks", - name = "techage:tank", - nodenames = {"techage:ta3_tank", "techage:oiltank", "techage:ta4_tank"}, - run_at_every_load = true, - action = function(pos, node) - local mem = tubelib2.get_mem(pos) - if mem.liquid and mem.liquid.amount then - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = math.max(mem.liquid.amount, 0) - nvm.liquid.name = mem.liquid.name - --tubelib2.del_mem(pos) - end - end, -}) diff --git a/techage/liquids/valve.lua b/techage/liquids/valve.lua deleted file mode 100644 index bf59c35..0000000 --- a/techage/liquids/valve.lua +++ /dev/null @@ -1,176 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Valve - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - -minetest.register_node("techage:ta3_valve_open", { - description = S("TA Valve"), - tiles = { - "techage_gaspipe.png^techage_gaspipe_valve_open.png^[transformR90", - "techage_gaspipe.png^techage_gaspipe_valve_open.png^[transformR90", - "techage_gaspipe.png^techage_gaspipe_valve_open.png", - "techage_gaspipe.png^techage_gaspipe_valve_open.png", - "techage_gaspipe_valve_hole.png", - "techage_gaspipe_valve_hole.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Pipe:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - local meta = M(pos) - local number = techage.add_node(pos, "techage:ta3_valve_closed") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA3 Valve")..": "..number) - return false - end, - on_rightclick = function(pos, node, clicker) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end - if liquid.turn_valve_off(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") then - minetest.sound_play("techage_valve", { - pos = pos, - gain = 1, - max_hear_distance = 10}) - end - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -1/8, -4/8, 1/8, 1/8, 4/8}, - {-3/16, -3/16, -3/16, 3/16, 3/16, 3/16}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2}, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta3_valve_closed", { - description = S("TA Valve"), - tiles = { - "techage_gaspipe.png^techage_gaspipe_valve_closed.png^[transformR90", - "techage_gaspipe.png^techage_gaspipe_valve_closed.png^[transformR90", - "techage_gaspipe.png^techage_gaspipe_valve_closed.png", - "techage_gaspipe.png^techage_gaspipe_valve_closed.png", - "techage_gaspipe_valve_hole.png", - "techage_gaspipe_valve_hole.png", - }, - - on_rightclick = function(pos, node, clicker) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end - if liquid.turn_valve_on(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") then - minetest.sound_play("techage_valve", { - pos = pos, - gain = 1, - max_hear_distance = 10}) - end - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -1/8, -4/8, 1/8, 1/8, 4/8}, - {-3/16, -3/16, -3/16, 3/16, 3/16, 3/16}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 2, cracky = 2, snappy = 2, not_in_creative_inventory = 1}, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta3_valve_open", -}) - -techage.register_node({"techage:ta3_valve_closed", "techage:ta3_valve_open"}, { - on_recv_message = function(pos, src, topic, payload) - local node = techage.get_node_lvm(pos) - if topic == "on" and node.name == "techage:ta3_valve_closed" then - liquid.turn_valve_on(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") - return true - elseif topic == "off" and node.name == "techage:ta3_valve_open" then - liquid.turn_valve_off(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") - return true - elseif topic == "state" then - if node.name == "techage:ta3_valve_open" then - return "on" - end - return "off" - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local node = techage.get_node_lvm(pos) - if topic == 1 and payload[1] == 1 and node.name == "techage:ta3_valve_closed" then - liquid.turn_valve_on(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") - return 0 - elseif topic == 1 and payload[1] == 0 and node.name == "techage:ta3_valve_open" then - liquid.turn_valve_off(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") - return 0 - else - return 2, "" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local node = techage.get_node_lvm(pos) - if topic == 142 then -- State - if node.name == "techage:ta3_valve_open" then - return 0, {1} - end - return 0, {0} - else - return 2, "" - end - end, -}) - -liquid.register_nodes({"techage:ta3_valve_closed"}, Pipe, "special", {}, {}) - -minetest.register_craft({ - output = "techage:ta3_valve_open", - recipe = { - {"", "dye:black", ""}, - {"techage:ta3_pipeS", "basic_materials:steel_bar", "techage:ta3_pipeS"}, - {"", "techage:vacuum_tube", ""}, - }, -}) diff --git a/techage/liquids/waterinlet.lua b/techage/liquids/waterinlet.lua deleted file mode 100644 index 866eb5d..0000000 --- a/techage/liquids/waterinlet.lua +++ /dev/null @@ -1,109 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Water Inlet (replacement for the water pump) - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe -local liquid = networks.liquid -local water_level = tonumber(minetest.get_mapgen_setting("water_level")) or 1 - -local function is_ocean(pos) - if pos.y > water_level then - M(pos):set_string("infotext", S("Error: Not on sea level!")) - return false - end - local node = techage.get_node_lvm({x = pos.x, y = pos.y - 1, z = pos.z}) - if node.name ~= "default:water_source" then - M(pos):set_string("infotext", S("Error: No water available!")) - return false - end - if node.param2 == 1 then - M(pos):set_string("infotext", S("Error: No natural water!")) - return false - end - M(pos):set_string("infotext", S("Operational")) - return true -end - -local function peek_liquid(pos) - local mem = techage.get_mem(pos) - if is_ocean(pos) then - mem.liquid_name = "techage:water" - mem.liquid_amount = 1 - else - mem.liquid_name = "techage:water" - mem.liquid_amount = 0 - end - return mem.liquid_name -end - -local function take_liquid(pos, indir, name, amount) - local mem = techage.get_mem(pos) - if not mem.liquid_name then - peek_liquid(pos) - end - return mem.liquid_amount or 0, mem.liquid_name -end - - -local function untake_liquid(pos, indir, name, amount) - return 0 -end - -minetest.register_node("techage:ta4_waterinlet", { - description = S("TA4 Water Inlet"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_waterpump_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_waterpump.png", - "techage_filling_ta4.png^techage_frame_waterpump.png", - "techage_filling_ta4.png^techage_frame_waterpump.png", - "techage_filling_ta4.png^techage_frame_waterpump.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - Pipe:after_place_node(pos) - is_ocean(pos) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - end, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta4_waterinlet"}, - Pipe, "tank", {"U"}, { - capa = 1, - peek = peek_liquid, - take = take_liquid, - untake = untake_liquid, - } -) - -minetest.register_craft({ - output = "techage:ta4_waterinlet", - recipe = { - {"techage:ta4_carbon_fiber", "techage:ta3_pipeS", "techage:ta4_carbon_fiber"}, - {"techage:iron_ingot", "techage:ta3_barrel_empty", "techage:iron_ingot"}, - }, -}) diff --git a/techage/liquids/waterpump.lua b/techage/liquids/waterpump.lua deleted file mode 100644 index 6911493..0000000 --- a/techage/liquids/waterpump.lua +++ /dev/null @@ -1,167 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Water Pump - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local Pipe = techage.LiquidPipe -local power = networks.power -local liquid = networks.liquid - -local CYCLE_TIME = 2 -local STANDBY_TICKS = 3 -local COUNTDOWN_TICKS = 3 -local PWR_NEEDED = 4 - -local function formspec(self, pos, nvm) - return "size[3,2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;2.8,0.5;#c6e8ff]".. - "label[0.5,-0.1;"..minetest.colorize( "#000000", S("Water Pump")).."]".. - "image_button[1,1;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[1,1;1,1;"..self:get_state_tooltip(nvm).."]" -end - -local function can_start(pos, nvm, state) - local outdir = M(pos):get_int("waterdir") - local pos1 = vector.add(pos, tubelib2.Dir6dToVector[outdir or 0]) - if not techage.is_ocean(pos1) then - return S("no usable water") - end - if not power.power_available(pos, Cable) then - return S("no power") - end - return true -end - -local function start_node(pos, nvm, state) - nvm.running = true -end - -local function stop_node(pos, nvm, state) - nvm.running = false -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:t4_waterpump", - infotext_name = S("TA4 Water Pump"), - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function has_power(pos, nvm) - local outdir = networks.Flip[M(pos):get_int("waterdir")] - local taken = power.consume_power(pos, Cable, outdir, PWR_NEEDED) - if techage.is_running(nvm) then - if taken < PWR_NEEDED then - State:nopower(pos, nvm) - else - return true -- keep running - end - elseif taken == PWR_NEEDED then - State:start(pos, nvm) - end -end - -local function pumping(pos, nvm) - if has_power(pos, nvm) then - nvm.ticks = (nvm.ticks or 0) + 1 - if nvm.ticks % 4 == 0 then - local leftover = liquid.put(pos, Pipe, 6, "techage:water", 1) - if leftover and leftover > 0 then - State:blocked(pos, nvm) - return - end - end - State:keep_running(pos, nvm, 1) - end -end - --- converts power into hydrogen -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - pumping(pos, nvm) - return State:is_active(nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - nvm.running = false - local number = techage.add_node(pos, "techage:t4_waterpump") - State:node_init(pos, nvm, number) - M(pos):set_int("waterdir", networks.side_to_outdir(pos, "R")) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -minetest.register_node("techage:t4_waterpump", { - description = S("TA4 Water Pump"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_waterpump_top.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_waterpump.png", - "techage_filling_ta4.png^techage_frame_waterpump.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_waterpump.png", - "techage_filling_ta4.png^techage_frame_waterpump.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_receive_fields = on_receive_fields, - on_timer = node_timer, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2, not_in_creative_inventory = 1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, -}) - -power.register_nodes({"techage:t4_waterpump"}, Cable, "con", {"L"}) -liquid.register_nodes({"techage:t4_waterpump"}, Pipe, "pump", {"U"}, {}) - -techage.register_node({"techage:t4_waterpump"}, { - on_recv_message = function(pos, src, topic, payload) - return State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return State:on_beduino_request_data(pos, topic, payload) - end, -}) diff --git a/techage/locale/techage.de.tr b/techage/locale/techage.de.tr deleted file mode 100644 index b2cb77d..0000000 --- a/techage/locale/techage.de.tr +++ /dev/null @@ -1,1582 +0,0 @@ -# textdomain: techage - - - -### akkubox.lua ### - -TA3 Accu Box=TA3 Akkublock - -### aluminium.lua ### - -Aluminum=Aluminium -Gibbsite Powder=Gibbsit Pulver -Red Mud=Rotschlamm -Red Mud Barrel=Rotschlamm Fass -Red Mud Canister=Rotschlamm Kanister - -### assemble.lua ### -### firebox_lib.lua ### - -[TA] Area is protected!=[TA] Bereich ist geschützt -[TA] Not enough space!=[TA] Nicht ausreichend Platz! - -### assembly_tool.lua ### - -TechAge Assembly Tool=TechAge Montagewerkzeug - -### autocrafter.lua ### - -Autocrafter=Autocrafter - -### axle2power.lua ### - -TA2 Power Generator=TA2 Stromgenerator - -### baborium.lua ### - -Baborium Ingot=Baboriumbarren -Baborium Lump=Baboriumklumpen -Baborium Ore=Baboriumerz - -### barrel.lua ### - -Gas Cylinder Large=Gasflasche groß -Gas Cylinder Small=Gasflasche klein -River Water Barrel=Flusswasserfass -TA Empty Barrel=TA leeres Fass -TA3 Canister=TA3 Kanister -Water=Wasser -Water Barrel=Wasserfass -empty=leer - -### basalt.lua ### - -Basalt Cobble=Basaltpflaster -Basalt Glass=Basaltglas -Basalt Glass 2=Basaltglas 2 -Basalt Glass Thin=Basaltglas dünn -Basalt Glass Thin 2=Basaltglas dünn 2 -Basalt Glass Thin XL=Basaltglas dünn XL -Basalt Glass Thin XL 2=Basaltglas dünn XL 2 -Basalt Gravel=Basaltkies -Basalt Stone=Basaltgestein -Basalt Stone Block=Basaltsteinblock -Basalt Stone Brick=Basaltsteinziegel -Sieved Basalt Gravel=Basaltkies gesiebt - -### battery.lua ### - -Battery=Batterie -Coal Equivalents=Kohleeinheiten -Digtron Battery=Digtron Akku - -### battery.lua ### -### storage.lua ### - -Load=Ladung - -### bauxit.lua ### - -Bauxite Cobblestone=Bauxit Kopfsteinpflaster -Bauxite Gravel=Bauxit Kies -Bauxite Powder=Bauxit Pulver -Bauxite Stone=Bauxit - -### blackhole.lua ### - -TechAge Black Hole=TechAge Schwarzes Loch -TechAge Black Hole (let items and liquids disappear)=TechAge Schwarzes Loch (Gegenstände und Flüssigkeiten verschwinden) - -### boiler.lua ### - -TA2 Boiler Base=TA2 Boiler unten -TA2 Boiler Top=TA2 Boiler oben - -### boiler_base.lua ### - -TA3 Boiler Base=TA3 Boiler unten - -### boiler_lib.lua ### - -To add water punch@nthe boiler@nwith a water bucket=Um Wasser nachzufüllen,@nschlage mit einem Wassereimer@nauf den Block -Water Boiler=Wasserboiler - -### boiler_lib.lua ### -### heatexchanger2.lua ### - -water temperature=Wassertemperatur - -### boiler_top.lua ### - -TA3 Boiler Top=TA3 Boiler oben - -### booster.lua ### - -TA3 Booster=TA3 Gebläse - -### button.lua ### - -Access:=Zugriff: -Button or switch=Taster oder Schalter -Change the block name (infotext)=Ändere den Blocknamen -Command to be sent=Zu sendender Befehl -Infotext=Infotext -TA3 Button/Switch=TA3 Taster/Schalter -TA4 Button/Switch=TA4 Schalter/Taster - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### - -Access=Zugriff -Button protection=Tastenschutz -Type=Typ - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### gaze_sensor.lua ### -### player_detector.lua ### - -Command=Kommando -Number=Nummer - -### button.lua ### -### cart_detector.lua ### -### command_converter.lua ### -### detector.lua ### -### flipflop.lua ### -### light_detector.lua ### -### lua_logic.lua ### -### mesecons_converter.lua ### -### node_detector.lua ### -### player_detector.lua ### -### repeater.lua ### - -Insert destination node number(s)=Gebe Zielnummer(n) ein - -### button.lua ### -### chest.lua ### -### command_converter.lua ### -### detector.lua ### -### doorcontroller.lua ### -### flipflop.lua ### -### mesecons_converter.lua ### -### repeater.lua ### -### sequencer2.lua ### -### submenu.lua ### - -Save=Speichern - -### button.lua ### -### gaze_sensor.lua ### - -Destination block number(s)=Zielblocknummer(n) - -### button_2x.lua ### - -TA4 2x Button=TA4 2x Taster - -### button_2x.lua ### -### button_4x.lua ### - -Command to be sent (ignored for switches)=Zu sendender Befehl (wird für Schalter ignoriert) -Label for the button=Beschriftung für die Taste -Momentary button or on/off switch=Taster oder Ein-/Ausschalter - -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### player_detector.lua ### - -Destination block number=Zielblocknummer - -### button_2x.lua ### -### button_4x.lua ### -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label=Beschriftung - -### button_4x.lua ### - -TA4 4x Button=TA4 4x Taster - -### cart_detector.lua ### - -TA3 Cart Detector=TA3 Wagen Detektor - -### cart_detector.lua ### -### light_detector.lua ### -### node_detector.lua ### - -accept=akzeptieren - -### cart_detector.lua ### -### player_detector.lua ### - -TA3 Player Detector=TA3 Spieler Detektor - -### ceilinglamp.lua ### - -TA Ceiling Lamp=TA Deckenlampe - -### cement.lua ### - -Cement Block=Zement Block -Cement Powder=Zement Pulver - -### ceramic.lua ### - -TA4 Ceramic Material=TA4 Keramik Material -TA4 Furnace Ceramic=TA4 Ofen Keramik -TA4 Round Ceramic=TA4 Rund-Keramik -TA5 Ceramic Turbine=TA5 Keramikturbine - -### charcoalpile.lua ### - -Dirt with Ash=Erde mit Asche -TA1 Charcoal=TA1 Holzkohle - -### charge_detector.lua ### - -Command to send when the energy storage charge@nlevel falls below the specified switch point=Befehl zum Senden, wenn der Ladezustand des@nEnergiespeichers den angegebenen Schaltpunkt unterschreitet -Command to send when the energy storage charge@nlevel rises above the specified switch point=Befehl zum Senden, wenn der Ladezustand des@nEnergiespeichers den angegebenen Schaltpunkt überschreitet -Storage charge level switch point=Schaltpunkt Speicherladezustand -Switch point=Schaltpunkt -TA4 Energy Storage Charge Detector=TA4 Energiespeicher-Ladungsdetektor - -### chest.lua ### - -Allow public access to the chest=Erlaube öffentlichen Zugriff auf die Kiste -Inventory,Pre-Assignment,Config=Inventar,Vorbelegung,Konfiguration -Node label:=Blockbeschriftung: -TA2 Protected Chest=TA2 Gesicherte Kiste -TA3 Protected Chest=TA3 Gesicherte Kiste -TA4 Protected Chest=TA4 Gesicherte Kiste - -### chest_cart.lua ### - -TA Chest Cart=TA Kistenwagen - -### coalburner.lua ### - -Ash=Asche - -### collector.lua ### - -Node number to send the events to=Knotennummer zum Senden der Events -Node numbers to read the states from=Knotennummern zum Lesen der Zustände -Send an event if state is equal or larger than=Senden ein Event wenn Status größer oder gleich als -TA4 State Collector=TA4 Zuständesammler - -### command_converter.lua ### - -Receive=Empfang -Send delay (s)=Sendeverz. (s) -Sent command=Sendekommando -TA3 Command Converter=TA3 Kommando Konverter - -### concentrator.lua ### - -TA4 Tube Concentrator=TA4 Röhren Konzentrator -Tube Concentrator=Röhren Konzentrator - -### controller.lua ### - -Cooling failed=Kühlung ausgefallen -Magnet detection error@n(@1% found / 100% expected)=Magneterkennungsfehler@n(@1% erkannt / 100% erwartet) -Nucleus detection error=Kern nicht erkannt -Plasma ring shape error=Formfehler des Plasmarings -Shell shape error@n(@1% found / 100% expected)=Hüllenformfehler@n(@1% erkannt / 100% erwartet) -TA5 Fusion Reactor Controller=TA5 Fusionsreaktor Controller - -### controller.lua ### -### heatexchanger2.lua ### - -No power=Kein Strom - -### cooking.lua ### - -TA3 Melting=TA3 Schmelzen - -### cooler.lua ### - -TA3 Cooler=TA3 Kühler -TA4 Collider Cooler=TA4 Collider Kühler - -### counting.lua ### - -Your current value is=Der aktuelle Wert ist -[techage] The limit for 'number of commands per minute' has been exceeded.=[techage] Das Limit für 'Anzahl Befehle pro Minute' wurde überschritten. -is allowed=ist erlaubt -is allowed. Current value is=ist erlaubt. Aktueller Wert ist -per minute=pro Minute - -### cylinder.lua ### - -TA2 Cylinder=TA2 Zylinder - -### detector.lua ### - -Counts down the number of items passed through@nand only triggers an 'on' command when it reaches zero.=Zählt die Anzahl der durchlaufenen Elemente herunter@nund löst nur dann einen 'ON'-Befehl aus, wenn er Null erreicht. -Current countdown=Aktueller Zähler -Current countdown value.=Aktueller Zählerwert. -TA4 Collider Detector=TA4 Collider Detektor -TA4 Collider Detector Core=TA4 Collider Detektorkern -TA4 Detector=TA4 Detektor - -### detector.lua ### -### electricmeter.lua ### - -Countdown=Countdown - -### detector.lua ### -### logic_block.lua ### -### tele.lua ### - -Blocking Time=Sperrzeit - -### detector.lua ### -### tele.lua ### - -Configured Items=Konfigurierte Gegenstände -Items which generate an 'on' command.@nIf empty, all passed items generate an 'on' command.=Items, die einen 'on'-Kommando generieren.@nWenn leer, generieren alle übergebenen Items einen 'on'-Befehl. -On Time=ON Zeit -TA3 Detector=TA3 Detektor -The time after the 'off' command@nuntil the next 'on' command is accepted.=Die Zeit nach dem 'off' Kommando,@nbis das nächste 'on' Kommando akzeptiert wird. -The time between the 'on' and 'off' commands.=Die Zeit zwischen den 'on' und 'off' Kommandos. - -### display.lua ### - -Display no: =Display Nr. -TA4 Display=TA4 Display -TA4 Display XL=TA4 Display XL - -### distiller.lua ### - -TA3 Distillation Tower 1=TA3 Destillationsturm 1 -TA3 Distillation Tower 2=TA3 Destillationsturm 2 -TA3 Distillation Tower 3=TA3 Destillationsturm 3 -TA3 Distillation Tower 4=TA3 Destillationsturm 4 -TA3 Distillation Tower Base=TA3 Destillationsturm Basis - -### distributor.lua ### - -Block configured items for open ports=Blockiere konfigurierte Gegenstände für offene Ausgänge -Distributor=Verteiler -High Performance Distributor=Hochleistungs-Verteiler -Input=Einspeisung -blocking mode=Blockiert - -### doorblock.lua ### - -TechAge Door Block=TechAge Türblock - -### doorcontroller.lua ### - -Insert door/gate block number(s)=Gebe Tür-/Tornummer(n) ein -TA3 Door Controller=TA3 Tür Controller - -### doorcontroller2.lua ### - -Blocks exchanged=Blöcke ausgetauscht -Blocks reset=Blöcke rückgesetzt -Click on all the blocks that are part of the door/gate=Klicke auf alle Blöcke, die Teil des Tores sind -Ctrl,Inv=Ctrl,Inv -Exchange=Austauschen -TA3 Door Controller II=TA3 Tür Controller II -with door sound=mit Türgeräusch - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### node_detector.lua ### -### turncontroller.lua ### - -Done=Fertig -Record=Aufzeichnen -block positions are stored.=Block Positionen gespeichert. - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### turncontroller.lua ### - -Recording...=Aufzeichnung... - -### doorcontroller2.lua ### -### movecontroller.lua ### - -Reset=Rücksetzen - -### drillbox.lua ### - -Build derrick=Errichte Ölturm -Depth=Tiefe -Drill Bit=Bohrstange -Drill area is protected=Bohrbereich ist geschützt -Drill bits missing=Bohrgestänge fehlt -Oil Drill Box=Ölbohrkiste -Remove derrick=Entferne Ölturm -item output blocked=Ausgang blockiert - -### drive_axle.lua ### - -TA2 Drive Axle=TA2 Antriebsachse - -### electric_cable.lua ### - -TA Electric Cable=TA Stromkabel - -### electricmeter.lua ### - -Amount of power to be provided before the device turns off=Strommenge, die bereitgestellt werden soll, bis sich das Gerät ausschaltet -Consumption=Verbrauch -Power countdown=Leistungs-Countdown -TA4 Electric Meter=TA4 Stromzähler - -### electricmeter.lua ### -### formspecs.lua ### -### transformer.lua ### - -Power=Strom - -### electricmeter.lua ### -### transformer.lua ### - -Max. power=Max. Leistung -Maximum power passed through=Max. Leistung, die durchgeleitet werden soll - -### electrolyzer.lua ### - -Configurable value@nfor the current limit=Konfigurierbarer Wert@nfür die Strombegrenzung -Current limitation=Strombegrenzung -Electrolyzer=Eletrolyseur -If the charge of the storage@nsystem falls below the configured value,@nthe block switches off=unterschreitet die Ladung des@nSpeichersystems den konfigurierten@nWert, schaltet sich der Block ab -Maximum possible@ncurrent consumption=Maximal mögliche Stromaufnahme -Maximum power consumption [ku]=maximale Stromaufnahme -Storage full=Speicher voll -TA4 Electrolyzer=TA4 Elektrolyseur -Turnoff point=Abschaltpunkt -Turnoff point reached=Abschaltpunkt erreicht - -### electrolyzer.lua ### -### fuelcell.lua ### -### tiny_generator.lua ### - -Electricity=Strom - -### electronic.lua ### - -TA3 Vacuum Tube=TA3 Vakuumröhre -TA4 LEDs=TA4 LEDs -TA4 RAM Chip=RAM Chip -TA4 WLAN Chip=TA4 WLAN Chip -TA5 AI Chip=TA5 KI Chip -TA5 AI Chip II=TA5 KI Chip II -WLAN Chip=WLAN Chip - -### electronic_fab.lua ### - -Electronic Fab=Elektronikfabrik -TA2 Ele Fab=TA2 E-Fabrik -TA3 Ele Fab=TA3 E-Fabrik -TA4 Ele Fab=TA4 E-Fabrik - -### end_wrench.lua ### - -Biome=Biom -Node owner=Blockbesitzer -Position=Position -Position temperature=Positionstemperatur -Pump connected to no/empty tank(s).=Pumpe an keine/leere Tank(s) angeschlossen. -Pump connected to tank(s) with: @1=Pumpe an Tank(s) angeschlossen mit: @1 -TechAge Info Tool (use @= read status info)=TechAge Info Werkzeug - -### end_wrench.lua ### -### meltingpot.lua ### - -Time=Zeit - -### epoxy.lua ### - -Epoxide Resin=Epoxidharz -Epoxide Resin Barrel=Epoxidharz Fass -Epoxide Resin Canister=Epoxidharz Kanister - -### explore.lua ### - -Oil=Öl -TA3 Oil Explorer=TA3 Ölexplorer -TA3 Oil Storage=TA3 Öl Speicher -depth=Tiefe - -### filler.lua ### - -Liquid Filler=Einfülltrichter -TA Liquid Filler=TA Einfülltrichter - -### firebox.lua ### - -TA2 Firebox=TA2 Feuerkiste -TA3 Coal Power Station Firebox=TA3 Kohlekraftwerks-Feuerbox -TA3 Furnace Oil Burner=TA3 Ofen-Ölbrenner -TA3 Power Station Firebox=TA3 Kraftwerks-Feuerbox - -### firebox_lib.lua ### - -Firebox=Feuerkasten - -### flipflop.lua ### - -TA3 Flip-Flop=TA3 FlipFlop - -### fly_lib.lua ### - -Destination position is protected=Zielposition ist geschützt -Error: Max. length of the flight route exceeded by @1 blocks !!=Fehler: max. Länge der Flugstrecke um @1 Blöcke überschritten !! -No valid destination position=Keine gültige Zielposition -No valid node at the start position=Kein gültiger Block an der Startposition -No valid start position=Keine gültige Startposition -Running=In Betrieb -Start position is protected=Startposition ist geschützt -Stopped=Gestoppt - -### fly_lib.lua ### -### flycontroller.lua ### - -Error: Invalid path !!=Fehler: Ungültiger Pfad !! - -### flycontroller.lua ### - -Error: Recording is missing !!=Fehler: Aufzeichnung fehlt !! -Flight route (A to B)=Flug Route (A nach B) -Move a player without moving blocks=Bewege einen Spieler ohne Blöcke -See chat output=Siehe chat Ausgabe -TA5 Fly Controller=TA5 Flug Controller -Teleport mode=Teleport Mode -Test=Test -[TA4 Fly Controller] Invalid path!=[TA5 Flug Controller] Ungültiger Pfad! -[TA4 Fly Controller] Recording is missing!=[TA5 Flug Controller] Aufzeichnung fehlt! - -### flycontroller.lua ### -### logic_block.lua ### -### lua_logic.lua ### -### movecontroller.lua ### - -Store=Speichern - -### flycontroller.lua ### -### movecontroller.lua ### - -Click on all blocks that shall be moved=Klicke auf alle Blöcke, die verschoben werden sollen -Maximum Speed=Maximalgeschwindigkeit -Maximum speed for moving blocks=Maximale Geschwindigkeit für bewegliche Blöcke -Move=Bewege -Move A-B=Bewege A-B -Move B-A=Bewege B-A -Move block height=Move Block Höhe -Object offset=Objekt Offset -Stored=Gespeichert -Value in the range of 0.0 to 1.0=Wert im Bereich von 0.0 bis 1.0 -Y-offset for non-player objects like vehicles (-0.5 to 0.5)=Y-Offset für Nicht-Spieler Objekte wie Fahrzeuge (-0.5 bis 0.5) - -### flywheel.lua ### - -Flywheel=Schwungrad -TA2 Flywheel=TA2 Schwungrad - -### forceload.lua ### - -Area already loaded or max. number of Forceload Blocks reached!=Bereich bereits geladen oder maximale Anzahl von Forceload Blöcken erreicht! -Area from=Bereich von -Area to=Bereich bis -Block at pos=Block an Pos -List of your Forceload Blocks:=Liste der Forceload Blöcke -Punch the block to make the area visible.=Schlage auf den Bock um den Bereich anzuzeigen. -Show all forceload blocks in a 64x64x64 range=Zeige alle Forceload Blöcke im Umkreis von 64x64x64 Blöcken -Techage Forceload Block=Techage Forceload Block -Techage Forceload Tile=Techage Forceload Kachel -loaded=geladen - -### formspecs.lua ### - -Block has a wrench menu=Block hat ein Gabelschlüssel-Menü -Charge termination=Ladebegrenzung -Current output [ku]=Aktueller Ausgabewert -Maximum output [ku]=Maximaler Ausgabewert -Range in which the generator reduces its power=Bereich in dem der Generator die Leistung reduziert -The current power the generator provides=Die aktuelle Leistung die der Generator liefert -The maximum power the generator can provide=Die maximale Leistung die der Generator liefern kann - -### formspecs.lua ### -### power_terminal2.lua ### - -Charging=Laden - -### formspecs.lua ### -### power_terminal2.lua ### -### storage.lua ### -### transformer.lua ### - -Storage=Speicher - -### fuel_lib.lua ### - -Fuel Menu=Brennstoff Menü -To add fuel punch@nthis block@nwith a fuel container=Um Brennstoff nachzufüllen,@nschlage mit einem Kraftstoffbehälter@nauf den Block - -### fuelcell.lua ### - -Fuel Cell=Brennstoffzelle -TA4 Fuel Cell=TA4 Brennstoffzelle -no hydrogen=kein Wasserstoff - -### fuelcellstack.lua ### - -TA4 Fuel Cell Stack=Brennstoffzellenstapel - -### furnace_top.lua ### - -Furnace Top=Ofenoberteil -Outp=Ergeb. -no fuel or no power=kein Strom oder Brennstoff - -### gas_pipe.lua ### - -TA5 Junction Pipe=TA5 Leitungskupplung -TA5 Pipe=TA5 Leitung - -### gateblock.lua ### - -TechAge Gate Block=TechAge Torblock - -### gaze_sensor.lua ### - -Command to send when sensor is no longer viewed=Befehl zum Senden, wenn der Sensor nicht mehr angesehen wird -Command to send when sensor is viewed=Befehl zum Senden, wenn der Sensor angesehen wird -Input the player name(s) separated by blanks.@nIf empty, only the owner is accepted.=Geben den/die Spielernamen durch Leerzeichen getrennt ein.@nWenn leer, wird nur der Besitzer akzeptiert. -Player Names=Spielernamen -TA4 Gaze Sensor=TA4 Blicksensor - -### gearbox.lua ### - -TA2 Gearbox=TA2 Getriebeblock - -### generator.lua ### - -TA3 Generator=TA3 Generator -TA4 Generator=TA4 Generator -TA5 Generator=TA5 Generator -no steam=Kein Dampf - -### generator.lua ### -### power_terminal2.lua ### - -Generator=Generator - -### gravelrinser.lua ### - -Gravel Rinser=Kiesspüler -Rinsing=Waschen - -### gravelsieve.lua ### - -Compressed Gravel=Komprimiertes Kies -Gravel Sieve=Kiessieb -Sieved Gravel=Gesiebtes Kies -TA1 Gravel Sieve=TA1 Kiessieb -TA2 Gravel Sieve=TA2 Kiessieb -TA3 Gravel Sieve=TA3 Kiessieb -TA4 Gravel Sieve=TA4 Kiessieb - -### grinder.lua ### - -Grinder=Mühle -Grinding=Mahlen -Milling=Mahlen -TA1 Mill Base=Mühlenunterteil - -### growlight.lua ### - -TA4 LED Grow Light=TA4 LED Pflanzenlampe - -### hammer.lua ### - -TA1 Bronze Hammer (smash stone to gravel)=TA1 Bronzehammer (zerschlage Stein zu Kies) -TA1 Diamond Hammer (smash stone to gravel)=TA1 Diamanthammer (zerschlage Stein zu Kies) -TA1 Meridium Hammer (smash stone to gravel)=TA1 Meridiumhammer (zerschlage Stein zu Kies) -TA1 Mese Hammer (smash stone to gravel)=TA1 Mesehammer (zerschlage Stein zu Kies) -TA1 Steel Hammer (smash stone to gravel)=TA1 Stahlhammer (zerschlage Stein zu Kies) -TA1 Stone Hammer (smash stone to gravel)=TA1 Steinhammer (zerschlage Stein zu Kies) - -### heater.lua ### - -TA4 Furnace Heater=TA4 Ofenheizung - -### heatexchanger1.lua ### - -TA4 Heat Exchanger 1=TA4 Wärmetauscher 1 -TA5 Heat Exchanger 1=TA5 Wärmetauscher 1 - -### heatexchanger2.lua ### - - Error!= -Blue pipe connection error@n(@1 found / @2 expected)=Verbindungsfehler blaue Leitung@n(@1 erkannt / @2 erwartet) -Blue pipe coolant missing@n(@1 found / @2 expected)=Kühlmittel fehlt bei der blauen Leitung@n(@1 erkannt / @2 erwartet) -Cooler error=Kühlungsfehler -Green pipe connection error@n(@1 found / @2 expected)=Verbindungsfehler grüne Leitung@n(@1 erkannt / @2 erwartet) -Green pipe coolant missing@n(@1 found / @2 expected)=Kühlmittel fehlt bei der grünen Leitung@n(@1 erkannt / @2 erwartet) -Power network connection error=Stromnetz Verbindungsfehler -TA4 Heat Exchanger=TA4 Wärmetauscher -TA4 Heat Exchanger 2=TA4 Wärmetauscher 2 -TA5 Heat Exchanger 2=TA5 Wärmetauscher 2 -Turbine error= -did you check the plan?=hast du den Plan geprüft? -inlet/pipe error=Einlass/Leitungsfehler -wrong storage diameter=Falscher Wärmespeicher-Durchmesser - -### heatexchanger3.lua ### - -TA4 Heat Exchanger 3=TA4 Wärmetauscher 3 -TA5 Heat Exchanger 3=TA5 Wärmetauscher 3 - -### hydrogen.lua ### - -Hydrogen Cylinder Large=Wasserstoffflasche groß -Hydrogen Cylinder Small=Wasserstoffflasche klein -TA4 Hydrogen=TA4 Wasserstoff - -### hyperloop.lua ### -### sensorchest.lua ### -### teleport.lua ### - -not connected=nicht verbunden - -### hyperloop.lua ### -### teleport.lua ### - -Block name=Blockname -Connection name for this block=Verbindungsname für diesen Block -Connection name of the remote block=Verbindungsname des entfernten Blocks -Enter a block name or select an existing one=Gebe einen Blocknamen ein oder wähle einen vorhandenen aus -Remote name=Name entfernter Block -connected to=verbunden mit - -### industriallamp1.lua ### - -TA Industrial Lamp 1=TA Industrielampe 1 - -### industriallamp2.lua ### - -TA Industrial Lamp 2=TA Industrielampe 2 - -### industriallamp3.lua ### - -TA Industrial Lamp 3=TA Industrielampe 3 - -### industriallamp4.lua ### - -TA4 LED Industrial Lamp=TA4 LED Industrielampe - -### inlet.lua ### - -TA4 Pipe Inlet=TA4 Leitungszulauf -one window maximum=maximal ein Fenster -wrong diameter (should be 5, 7, or 9)=falscher Durchmesser (sollte 5, 7, oder 9 sein) -wrong number of gravel nodes=falsche Anzahl von Kiesblöcken -wrong number of shell nodes=falsche Anzahl von Blöcken bei der Hülle - -### inlets.lua ### - -TA4 Collider Cable Input=TA4 Collider Kabelausgang -TA4 Collider Pipe Input=TA4 Collider Leitungseingang -TA4 Collider Pipe Output=TA4 Collider Leitungsausgang -TA4 Collider Tube Input=TA4 Collider Rohreneingang - -### inverter.lua ### - -Inverter=Wechselrichter -Power AC=Wechselstrom -Power DC=Gleichstrom -TA4 Solar Inverter=TA4 Solar Wechselrichter -no solar power=keine Solarleistung -solar network error=Solar-Netzwerk Fehler - -### junctionbox.lua ### - -TA Electric Junction Box=TA Verteilerdose - -### lampholder.lua ### - -TA Lamp Holder Acacia=TA Lampenhalter Akazie -TA Lamp Holder Apple=TA Lampenhalter Apfel -TA Lamp Holder Aspen=TA Lampenhalter Espe -TA Lamp Holder Copper=TA Lampenhalter Kupfer -TA Lamp Holder Gold=TA Lampenhalter Gold -TA Lamp Holder White=TA Lampenhalter Weiß - -### laser.lua ### - -Laser beam error!=Laserstrahl Fehler! -TA4 Laser Beam Emitter=TA4 Laserstrahl Sender -TA4 Laser Beam Receiver=TA4 Laserstrahl Empfänger -Valid destination positions:=Gültige Zielpositionen -to=bis - -### lib.lua ### - -Block has an@nadditional wrench menu=Block besitzt ein@nzusätzliches@nSchraubenschlüssel-Menü - -### lib.lua ### -### sensorchest.lua ### - -connected with=verbunden mit - -### light_detector.lua ### - -Send signal if light level is above:=Sende ein Signal wenn der Lichtwert größer ist als: -TA3 Light Detector=TA3 Lichtdetektor - -### lighter.lua ### - -TA1 Lighter=TA1 Anzünder - -### liquid_lib.lua ### - -Allow public access to the tank=Erlaube öffentlichen Zugriff auf den Tank -Liquid Tank=Flüssigkeitstank -To add liquids punch@nthe tank@nwith a liquid container=Um Flüssigkeit nachzufüllen,@nschlage mit einem Flüssigkeitsbehälter@nauf den Block - -### liquid_lib.lua ### -### ta4_chest.lua ### - -keep assignment=Zuordnung beibehalten - -### liquid_pipe.lua ### - -TA Junction Pipe=TA Leitungskupplung -TA Pipe=TA Leitung (Flüssigkeiten) - -### liquidsampler.lua ### - -Liquid Sampler=Flüssigkeitensammler - -### liquidsampler.lua ### -### waterpump.lua ### - -no usable water=Kein brauchbares Wasser - -### logic_block.lua ### - -'me' has to be used for the own block number.@n='me' wird für die eigene Blocknummer verwendet.@n -'~@=' means: not equal@n='~@=' bedeutet: ungleich@n -@n is a boolean expression@nwhere input numbers are evaluated.@n=@n ist ein boolescher Ausdruck,@nbei dem Eingabenummern ausgewertet werden.@n -@n is the block number to which the@ncommand should be sent.@n=@n ist die Blocknummer, an die der Befehl@ngesendet werden soll.@n -@nAll rules are checked with each received@ncommand.=@nAlle Regeln werden mit jedem empfangenen@nBefehl überprüft. -@nExamples:@n1234 @=@= on@n1234 @=@= off@n1234 @=@= on and 2345 @=@= off@n2345 ~@= 3456@n=@nBeispiele:@n1234 @=@= on@n1234 @=@= off@n1234 @=@= on and 2345 @=@= off@n2345 ~@= 3456@n -@nRule:@n @= on/off if is true@n=@nRegel:@n @= on/off if is true@n -@nThe internal processing time for all@ncommands is 100 ms.=@nDie interne Durchlaufzeit für alle@nKommandos beträgt 100 ms. -@nValid operators:@nand or on off me @=@= ~@= ( )@n=@nGültige Operatoren:@nand or on off @=@= ~@= ( )@n -Clear=Löschen -Debug=Debug -Inputs=Eingänge -Outputs=Ausgänge -Rules=Regeln -Send an 'on'/'off' command if the@nexpression becomes true.@n=Sende ein 'on'/'off' Kommando, wenn der @nAusdruck wahr wird.@n -Syntax=Syntax - -### logic_block.lua ### -### lua_logic.lua ### - -TA3 Logic Block=TA3 Logikblock -Update=Update - -### logic_block.lua ### -### sequencer2.lua ### - -Help=Hilfe - -### lye.lua ### - -Lye=Lauge -Lye Barrel=Lauge Fass -Lye Canister=Lauge Kanister - -### magnet.lua ### - -TA4 Collider Detector Magnet=TA4 Collider Detektormagnet -TA4 Collider Magnet=TA4 Collider Magnet -TA4 Collider Magnet Base=TA4 Collider Magnetfuß -TA4 Collider Steel Block=TA4 Collider Stahlblock -TA5 Fusion Reactor Magnet 1=TA5 Fusionsreaktor Magnet 1 -TA5 Fusion Reactor Magnet 2=TA5 Fusionsreaktor Magnet 2 -TA5 Fusion Reactor Magnet Blank=TA5 Fusionsreaktor Magnetrohling -TA5 Fusion Reactor Magnet Shield=TA5 Fusionsreaktor Magnetschild - -### mba_detector.lua ### - -TA4 Mapblock Active Detector=TA4 Aktiver Mapblock Detektor - -### meltingpot.lua ### - -Heat=Hitze -Melting Guide=Schmelzführer -Melting Pot active (heat@==Schmelztiegel aktiv (Hitze@= -Melting Pot inactive (heat@==Schmelztiegel inaktiv (Hitze@= -Melting Pot inactive (heat@=0)=Schmelztiegel inaktiv (Hitze@=0) -Menu=Menü -Menu,Recipes=Menü,Rezepte -TA1 Burning=TA1 Brennen -TA1 Melting=TA1 Schmelzen -TA1 Melting Pot=TA1 Schmelztiegel - -### meridium.lua ### - -Meridium Axe=Meridium Axt -Meridium Pickaxe=Meridium Pickel -Meridium Shovel=Meridium Schaufel -Meridium Sword=Meridium Schwert - -### mesecons_converter.lua ### - -TA3 Mesecons Converter=TA3 Mesecons Konverter - -### mill.lua ### - -TA1 Mill=TA1 Mühle -TA1 Mill Gear=TA1 Mühlengetriebe - -### millboard.lua ### - -TA1 Acacia Millrace Board=TA1 Akazie Mühlbachbrett -TA1 Acacia Wood Board=TA1 Akazienholzbrett -TA1 Apple Millrace Board=TA1 Apfel Mühlbachbrett -TA1 Apple Wood Board=TA1 Apfelholzbrett -TA1 Aspen Millrace Board=TA1 Espe Mühlbachbrett -TA1 Aspen Wood Board=TA1 Espenholzbrett -TA1 Jungle Millrace Board=TA1 Dschungel Mühlbachbrett -TA1 Jungle Wood Board=TA1 Dschungelholzbrett -TA1 Pine Millrace Board=TA1 Kiefer Mühlbachbrett -TA1 Pine Wood Board=TA1 Kiefernholzbrett - -### minicell.lua ### - -TA4 Streetlamp Solar Cell=TA4 Straßenlampen-Solarzelle - -### minichest.lua ### - -Test Chest=Testkiste - -### minitank.lua ### - -Test Mini Tank=Testminitank - -### movecontroller.lua ### - -Error: Invalid distance !!=Fehler: Ungültige Entfernung !! -Move distance=Entfernung -Move distance (A to B)=Entfernung (A nach B) -Operational mode=Betriebsmodus -Switch to the remote controlled 'move xyz' mode=Wechseln in den ferngesteuerten 'move xyz'-Modus -TA Rack and Pinion=TA Zahnstange -TA4 Move Controller=TA4 Move Controller - -### node_detector.lua ### - -Click on all blocks whose positions should be checked=Klicke auf alle Blöcke, deren Positionen überprüft werden sollen -Send signal if nodes have been:=Sende ein Signal falls Blöcke: -TA3 Node Detector=TA3 Block Detektor -TA4 Node Detector=TA3 Block Detektor -added=hinzugefügt wird -added or removed=hinzugefügt oder entfernt wird -removed=entfernt - -### nodes.lua ### - -TechAge Gravel=TechAge Kies - -### oil.lua ### - -Flowing Oil=Fließendes Öl -Oil Source=Erdöl -TA3 Oil Barrel=TA3 Ölfass -TA3 Oil Canister=TA3 Erdölkanister - -### oilfirebox.lua ### - -TA3 Power Station Oil Burner=TA3 Kraftwerks-Ölbrenner - -### petroleum.lua ### - -Isobutane Cylinder Large=Isobutangasflasche groß -Isobutane Cylinder Small=Isobutangasflasche klein -Propane Cylinder Large=Propangasflasche groß -Propane Cylinder Small=Propangasflasche klein -TA3 Bitumen=TA3 Bitumen -TA3 Bitumen Barrel=TA3 Bitumenfass -TA3 Bitumen Canister=TA3 Bitumenkanister -TA3 Fuel Oil=TA3 Schweröl -TA3 Fuel Oil Barrel=TA3 Schwerölfass -TA3 Fuel Oil Canister=TA3 Schwerölkanister -TA3 Gasoline=TA3 Benzin -TA3 Gasoline Barrel=TA3 Benzinfass -TA3 Gasoline Canister=TA3 Benzinkanister -TA3 Naphtha=TA3 Naphtha -TA3 Naphtha Barrel=TA3 Naphtha-Fass -TA3 Naphtha Canister=TA3 Naphtha-Kanister -TA3 Propane=TA3 Propan -TA4 Isobutane=TA4 Isobutan - -### pillar.lua ### - -TA4 Pillar=TA4 Säule - -### pipe_wall_entry.lua ### - -TA3 Pipe Wall Entry=TA3 Leitungs/Wanddurchbruch - -### pipe_wrench.lua ### - -TA3 Drill Pipe Wrench=TA3 Bohrgestängezange - -### plastic.lua ### - -Plastic Granules=Plastikgranulat - -### player_detector.lua ### - -Command to send when player is detected=Befehl zum Senden, wenn ein Spieler erkannt wird -Command to send when player moves away=Befehl zum Senden, wenn sich der Spieler wegbewegt -Radius=Radius -Search radius=Suchradius -TA4 Player Detector=TA4 Spieler Detektor - -### powder.lua ### - -Aluminum Powder=Aluminium Pulver -Clay Powder=Ton Pulver -Graphite Powder=Graphitpulver -Iron Powder=Eisen Pulver -Leave Powder=Laub Pulver -Needle Powder=Nadel Pulver -Silver Sandstone Powder=Silbersandstein Pulver - -### power2axle.lua ### - -TA3 Electric Motor=TA3 Elektromotor - -### power_line.lua ### - -TA Power Line=TA Stromleitung -TA Power Pole=TA Strommast -TA Power Pole Top (for up to 6 connections)=TA Strommastkopf (für bis zu 6 Verbindungen) -TA Power Pole Top 2 (for landlines)=TA Strommastkopf 2 (für Überlandleitungen) - -### power_terminal2.lua ### - -Commands@nhelp . . . print this text@ncls . . . . clear screen@ngen . . print generators@nsto . . print storage systems@ncon1 . . print consumers with power consumption between 1 and 10 ku@ncon2 . . print consumers with power consumption with 10 ku or above@n=Commands@nhelp . . . diesen Text ausgeben@ncls . . . . lösche Bildschirm@ngen . . Generatoren ausgeben@nsto . . Speichersysteme ausgeben@ncon1 . . Verbraucher mit einem Verbrauch zw. 1 und 10 ku ausgeben@ncon2 . . Verbraucher ab 10 ku Verbrauch ausgeben@n -Consumer=Verbraucher -Network Data=Netzwerkdaten -Number of consumers:=Anzahl der Verbraucher -Number of generators:=Anzahl der Generatoren -Number of network nodes:=Anzahl von Netzwerkblöcken -Number of storage systems:=Anzahl der Speichersysteme -TA3 Power Terminal=TA3 Strom Terminal - -### power_terminal2.lua ### -### terminal.lua ### - -Enter=Eingeben - -### powerswitch.lua ### - -TA Power Switch=TA Stromschalter -TA Power Switch Small=TA Stromschalter klein - -### powerswitchbox.lua ### -### powerswitchbox_legacy.lua ### - -TA Power Switch Box=TA Stromschalterbox - -### programmer.lua ### - -TechAge Programmer (right @= read number, left @= write numbers)=TechAge Programmer (rechts @= lese Nummer, links @= schreibe Nummern) -[TechAge Programmer] Error: invalid numbers!=[TechAge Programmer] Fehler: ungültige Nummern! -[TechAge Programmer] Error: programmer not supported!=[TechAge Programmer] Fehler: Programmer wird nicht unterstützt! -[TechAge Programmer] Unknown node on=[TechAge Programmer] Unbekannter Block bei -[TechAge Programmer] foreign or unknown node!=[TechAge Programmer] Fremder oder unbekannter Block! -[TechAge Programmer] node programmed!=[TechAge Programmer] Nummer(n) programmiert! -[TechAge Programmer] number=[TechAge Programmer] Nummer -[TechAge Programmer] programmer reset=[TechAge Programmer] Programmer zurück gesetzt - -### protection.lua ### - -Allow to dig/place Techage power lines nearby power poles=Erlaubt TODO - -### pump.lua ### - -Number of liquid units that are allowed to be pumped=Anzahl der Flüssigkeitseinheiten, die gepumpt werden dürfen -Number of units=Anzahl der Einheiten -TA3 Pump=TA3 Pumpe -TA4 Pump=TA4 Pumpe - -### pump.lua ### -### ta5_pump.lua ### - -Total flow rate=Gesamtdurchfluss -Total flow rate in liquid units=Gesamtdurchfluss in Flüssigkeitseinheiten - -### pumpjack.lua ### - -Oil Pumpjack=Ölpumpe -Oil amount=Ölmenge -Pumpjack=Ölpumpe -needs power=benötigt Strom -no oil=Kein Öl - -### pusher.lua ### - -Number of items=Anzahl der Elemente -Number of items that are allowed to be pushed=Anzahl der Elemente, die verschoben werden dürfen -Optionally configure@nthe pusher with one item=Der Schieber kann optional@nmit einem Elemente@nkonfiguriert werden -Pusher=Schieber - -### quarry.lua ### - -Digging depth=Grabungstiefe -Hole size=Lochgröße -Quarry=Steinbrecher -Start level=Startebene -Start level @= 0@nmeans the same level@nas the quarry is placed=Startebene @= 0@nbedeutet gleiche Ebene@nwie der Steinbrecher -area is protected=Bereich ist geschützt -finished=fertig -inventory full=Inventar ist voll - -### reboiler.lua ### - -TA3 Oil Reboiler=TA3 Aufkocher - -### recipe_lib.lua ### -### recipeblock.lua ### - -Recipe=Rezept - -### recipe_lib.lua ### -### ta4_reactor.lua ### - -Catalyst=Katalysator - -### recipeblock.lua ### - -TA4 Recipe Block=TA4 Rezept Block - -### recipes.lua ### - -Flint and Iron=Flint and Iron -TA1 Iron Ingot=TA1 Eisenbarren -[Bucket] Lava can only be placed below sea level!=Lava kann nur unterhalb der Meerehöhe platziert werden! - -### recycler.lua ### - -Recycler=Recycler - -### redstone.lua ### - -Red Stone=Rotstein -Red Stone Block=Rotsteinblock -Red Stone Brick=Rotsteinziegel - -### repeater.lua ### - -TA3 Repeater=TA3 Wiederholer - -### rotor.lua ### - -Nacelle is missing=Die Gondel fehlt -TA4 Carbon Fiber=TA4 Kohlefaser -TA4 Rotor Blade=TA4 Rotorblatt -TA4 Wind Turbine=TA4 Windkraftanlage -TA4 Wind Turbine Nacelle=TA4 Windkraftanlagengondel - -### screwdriver.lua ### - -Block alignment stored!=Blockausrichtung gespeichert! -Techage Screwdriver@n(See: TA3 > Tools)=Techage Schraubendreher@n(Siehe: TA3 > Werkzeuge) - -### sensorchest.lua ### - -Allow public chest access=Erlaube öffentlichen Zugriff -TA4 Sensor Chest=Sensorkiste - -### sequencer.lua ### - -TA3 Sequencer=TA3 Sequenzer - -### sequencer.lua ### -### sequencer2.lua ### - -stopped=gestoppt - -### sequencer2.lua ### - - - 'goto ' (jump to another line)@n= - 'goto ' (springe zu einer anderen Zeile)@n - - 'nop' (do nothing)@n= - 'nop' (mache nichts)@n - - 'send ' (techage command)@n= - 'send ' (techage Kommando)@n - - 'stop' (stop the execution)@n= - 'stop' (stoppe die Ausführung)@n - - 1 corresponds to 100 ms@n= - 1 entspricht 100 ms@n - - 50000 corresponds to 4 game days@n= - 50000 entspricht 4 Spieltagen@n -'[] '@n='[] '@n - is one of the following:@n= ist eines der folgenden:@n - is a number from 1 to 50000 and is@n= ist eine Nummer von 1 bis 50000 und ist@n -@n=@n -Commands=Kommandos -Cycle time=Zykluszeit -Example:@n=Beispiel: -If 'yes' a received OFF command won't stop the sequencer=Bei 'yes' stoppt ein empfangener OFF-Befehl den Sequenzer nicht -Ignore OFF command=OFF-Befehl ignorieren -Invalid command!=Ungültiges Kommando! -Start=Start -Stop=Stopp -Syntax:@n=Syntax:@n -TA4 Sequencer=TA4 Sequenzer -Timer cycle time (default: 100 ms)=Zykluszeit (normal: 100 ms) -running=läuft -the timeslot when the command is executed.@n=der Zeitpunkt, wenn der Befehl ausgeführt wird.@n - -### sequencer2.lua ### -### submenu.lua ### - -Cancel=Abbruch - -### shell.lua ### - -TA5 Fusion Reactor Nucleus=TA5 Fusionsreaktor Kern -TA5 Fusion Reactor Shell=TA5 Fusionsreaktor Hülle - -### signallamp.lua ### - -TA4 Wind Turbine Signal Lamp=TA4 Windkraftanlagenlampe -TechAge Color Lamp=TechAge Farblampe -TechAge Color Lamp 2=TechAge Farblampe 2 - -### signallamp_2x.lua ### - -TA4 2x Signal Lamp=TA4 2x Signallampe - -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label for the lamp=Bezeichner der Lampe - -### signallamp_4x.lua ### - -TA4 4x Signal Lamp=TA4 4x Signallampe - -### silicon.lua ### - -TA4 Silicon Wafer=TA4 Silizium-Wafer - -### silo.lua ### - -TA3 Silo=TA3 Silo -TA4 Silo=Silo - -### simplelamp.lua ### - -TA Lamp=TA Lampe - -### sluice.lua ### - -TA1 Sluice Gate=TA1 Schleusenschieber -TA1 Sluice Handle=TA1 Schleusengriff - -### solarcell.lua ### - -TA4 Solar Carrier Module=TA4 Solar Trägermodul -TA4 Solar Carrier Module B=TA4 Solar Trägermodul U -TA4 Solar Carrier Module T=TA4 Solar Trägermodul O -TA4 Solar Module=TA4 Solarmodul -light=Licht - -### solarcell.lua ### -### source.lua ### - -power=Strom - -### soundblock.lua ### - -Play=Abspielen -TA3 Sound Block=TA3 Sound Block - -### source.lua ### - -Axle Power Source=Achsenkraftquelle -Ele Power Source=Ele Kraftquelle -Power Source=Stromquelle -Test Generator=Test Generator - -### steam_pipe.lua ### - -TA2 Steam Pipe=TA2 Dampfleitung - -### steelmat.lua ### - -TechAge Steel Mat=TechAge Stahlmatte - -### storage.lua ### - -Test Storage=Test Speicher - -### streetlamp.lua ### - -TA Street Lamp=TA Straßenlampe - -### streetlamp2.lua ### - -TA4 LED Street Lamp=TA4 LED Straßenlampe -TA4 LED Street Lamp Arm=TA4 LED Lampenarm -TA4 LED Street Lamp Pole=TA4 LED Lampenmast - -### submenu.lua ### - -Note: You can't change any values while the block is running!=Hinweis: Während der Block läuft, kann kein Wert geändert werden! -Refresh=Aktualisieren - -### ta1_axle.lua ### - -TA1 Axle=TA1 Achse -TA1 Axle Bearing=TA1 Achsenlager - -### ta2_clutch.lua ### - -TA2 Clutch=TA2 Kupplung - -### ta2_weight_chest.lua ### - -TA2 Weight Chest=TA2 Gewichtekiste - -### ta2_winch.lua ### - -TA2 Winch=TA2 Seilwinde - -### ta4_cable.lua ### - -TA4 Low Power Box=TA4 Niederspannungsverteilerbox -TA4 Low Power Cable=TA4 Niederspannungskabel - -### ta4_cable_wall_entry.lua ### - -TA4 Cable Wall Entry=TA4 Kabel/Wanddurchbruch - -### ta4_chest.lua ### - -Empty the slots always @nfrom right to left=Speicherplätze von rechts nach links leeren -Never completely empty the slots@nwith the pusher to keep the item assignment=Speicherplätze mit dem Schieber nie ganz@nleeren, um die Item-Zuordnung beizubehalten -Size=Größe -TA4 8x2000 Chest=TA4 8x2000 Kiste -Unlock=Entsperren -Unlock connected chest@nif all slots are below 2000=Nachfolgende Kiste entsperren,@nsofern alle Speicherplätze <@= 2000 -right to left=von rechts nach links - -### ta4_doser.lua ### - -Doser=Dosierer -TA4 Doser=TA4 Dosierer -catalyst missing=Katalysator fehlt -reactor defect=Reaktor defekt -reactor defect or no power=Reaktor defekt oder kein Strom -reactor has no power=Reaktor hat keinen Strom -wrong catalyst=falscher Katalysator - -### ta4_doser.lua ### -### ta4_reactor.lua ### - -TA4 Reactor=TA4 Reaktor - -### ta4_injector.lua ### - -Configure up to 8 items @nto be pushed by the injector=Konfiguriere bis zu 8 Gegenstände \n die vom Injektor weitergegeben werden sollen -Injector=Injektor -Switch to pull mode @nto pull items out of inventory slots @naccording the injector configuration=Wechsle in den "Ziehe-Modus",@num Items gemäß der Injektor-Konfiguration@naus einem Inventar zu ziehen -pull mode= Ziehe-Modus - -### ta4_liquid_filter.lua ### - -TA4 Liquid Filter Filler=TA4 Flüssigkeitsfilter Einfüllstutzen -TA4 Liquid Filter Sink=TA4 Flüssigkeitsfilter Abfluss - -### ta4_reactor.lua ### - -TA4 Reactor Filler Pipe=TA4 Reaktor Einfüllstutzen - -### ta4_stand.lua ### - -TA4 Reactor Base=TA4 Reaktor Sockel -TA4 Reactor Stand=TA4 Reaktor Ständer -off=aus -on=an - -### ta4_stand.lua ### -### waterpump.lua ### - -no power=kein Strom - -### ta5_chest.lua ### - -TA5 Hyperloop Chest=TA5 Hyperloop Kiste - -### ta5_pump.lua ### - -TA5 Pump=TA5 Pumpe - -### ta5_tank.lua ### - -TA5 Hyperloop Tank=TA5 Hyperloop Tank - -### tank.lua ### - -Oil Tank=Öltank -TA3 Tank=TA3 Tank -TA4 Tank=TA4 Tank - -### tank_cart.lua ### - -TA Tank Cart=TA Tankwagen - -### teleport.lua ### - -Connected=Verbunden -Connection status=Verbindungsstatus -Distance > @1 blocks=Abstand > @1 Blöcke -Ex-points missing (@1 < @2)=Erf.-Punkte fehlen (@1 < @2) -Status=Status -server not connected=Server nicht verbunden - -### teleport_pipe.lua ### - -TA5 Teleport Block Liquids=TA5 Teleport Block Flüssigkeiten - -### teleport_pipe.lua ### -### teleport_tube.lua ### - -Remote block error=Fehler entfernter Block - -### teleport_tube.lua ### - -TA5 Teleport Block Items=TA5 Teleport Block Gegenstände - -### terminal.lua ### - -Syntax error, try help=Syntax Fehler, nutze help -TA3 Terminal=TA3 Terminal -TA4 Terminal=TA4 Terminal -commands like: help=Kommandos wie: help - -### timer.lua ### - -TA3 Timer=TA3 Timer - -### tiny_generator.lua ### - -TA3 Tiny Power Generator=TA3 Kleiner Stromgenerator -Tiny Generator=Kleingenerator -no fuel=kein Kraftstoff - -### tower.lua ### - -TA3 Derrick=TA3 Bohrturm -TA3 Drill Pipe=TA3 Bohrgestänge -TA4 Derrick=TA4 Bohrturm -[TA] Derrick is being built!=[TA] Bohrturm wird errichtet -[TA] Derrick is being removed!=[TA] Bohrturm wird abgebaut - -### transformer.lua ### - -TA4 Isolation Transformer=TA4 Trenntransformator - -### trowel.lua ### - -TechAge Trowel=TechAge Kelle - -### tube_wall_entry.lua ### - -Tube Wall Entry=Röhrenwanddurchbruch - -### tubes.lua ### - -TechAge Tube=TechAge Röhre - -### tubes_ta4.lua ### - -TA4 Tube=TA4 Röhre - -### turbine.lua ### - -TA3 Turbine=TA3 Turbine -TA4 Turbine=TA4 Turbine -TA5 Turbine=TA5 Turbine - -### turncontroller.lua ### - -Click on all blocks that shall be turned=Klicke auf all Blöcke, die gedreht werden sollen -TA4 Turn Controller=TA4 Dreh Controller -Turn left=Drehe links -Turn right=Drehe rechts - -### usmium.lua ### - -Usmium Nuggets=Usmium Nuggets -Usmium Powder=Usmium Pulver - -### vacuumtube.lua ### - -TA4 Vacuum Tube=TA4 Vakuumröhre - -### valve.lua ### - -TA Valve=TA Ventil -TA3 Valve=TA3 Ventil - -### waterinlet.lua ### - -Error: No natural water!=Fehler: Kein natürliches Wasser! -Error: No water available!=Fehler: Kein Wasser verfügbar! -Error: Not on sea level!=Fehler: Nicht auf Meereshöhe! -Operational=Betriebsbereit -TA4 Water Inlet=TA4 Wasssereinlass - -### watermill.lua ### - -TA1 Watermill=TA1 Wasssermühle - -### waterpump.lua ### - -TA4 Water Pump=Wasserpumpe -Water Pump=Wasserpumpe - -### windturbine_lib.lua ### - -Here is not enough water (41x41 m)!=Hier ist nicht genug Wasser (41x41 m)! -Here is not enough wind@n(A free air space of 41x41x21 m is necessary)!=Hier ist nicht genug Wind@n(Ein freier Luftraum von 41x41x21 m ist notwendig)! -The next wind turbines is too close!= Die nächste Windkraftanlagen iat zu nahe! -This is a=Dies ist ein -This is no ocean water!= Dies ist kein Meerwasser! -This is not the surface of the ocean!=Das ist nicht die Meeresoberfläche! -[TA4 Wind Turbine]=[TA4 Windkraftanlage] -biome and no ocean!=Biom und keine Meer (ocean)! -is a suitable place for a wind turbine!=ist ein geeigneter Ort für eine Windkraftanlage! - -### worker.lua ### - -Build detector=Baue Detektor -Item list=Teileliste -Remove detector=Entferne Detektor -TA4 Collider Detector Worker=TA4 Collider Detektor Worker -[TA4] Detector is being built!=[TA4] Detektor wird gebaut! -[TA4] Detector is being removed!=[TA4] Detektor wird entfernt! - - -##### not used anymore ##### diff --git a/techage/locale/techage.fr.tr b/techage/locale/techage.fr.tr deleted file mode 100644 index d4ad8fa..0000000 --- a/techage/locale/techage.fr.tr +++ /dev/null @@ -1,1602 +0,0 @@ -# textdomain: techage - - - -### akkubox.lua ### - -TA3 Accu Box=TA3 Boite Accu - -### aluminium.lua ### - -Aluminum=Aluminium -Gibbsite Powder=Poudre Gibbsite -Red Mud=Boue rouge -Red Mud Barrel=Baril de boue rouge -Red Mud Canister=Bidon de boue rouge - -### assemble.lua ### -### firebox_lib.lua ### - -[TA] Area is protected!=[TA] La zone est protégée! -[TA] Not enough space!=[TA] Pas assez de place! - -### assembly_tool.lua ### - -TechAge Assembly Tool= - -### autocrafter.lua ### - -Autocrafter=Crafteur Automatique - -### axle2power.lua ### - -TA2 Power Generator=Générateur d'électricité TA2 - -### baborium.lua ### - -Baborium Ingot=Lingot de Baborium -Baborium Lump=Morceau de Baborium -Baborium Ore=Minerai de Baborium - -### barrel.lua ### - -Gas Cylinder Large=Cylindre à gaz de grande taille -Gas Cylinder Small=Cylindre à gaz de petite taille -River Water Barrel=Baril d'eau de rivière -TA Empty Barrel=TA Baril vide -TA3 Canister=TA3 Bidon -Water=Eau -Water Barrel=Baril d'eau -empty=vide - -### basalt.lua ### - -Basalt Cobble=Pavé de basalte -Basalt Glass=Verre de basalte -Basalt Glass 2=Verre de basalte 2 -Basalt Glass Thin=Verre de basalte mince -Basalt Glass Thin 2=Verre de basalte mince 2 -Basalt Glass Thin XL=Verre de basalte mince XL -Basalt Glass Thin XL 2=Verre de basalte mince XL 2 -Basalt Gravel=Gravier de basalte -Basalt Stone=Pierre de basalte -Basalt Stone Block=Bloc de pierre de basalte -Basalt Stone Brick=Brique de pierre de basalte -Sieved Basalt Gravel=Gravier de basalte tamisé - -### battery.lua ### - -Battery=Batterie -Coal Equivalents=Équivalents charbon -Digtron Battery=Batterie de Digtron - -### battery.lua ### -### storage.lua ### - -Load=Charger - -### bauxit.lua ### - -Bauxite Cobblestone=Pavé de bauxite -Bauxite Gravel=Gravier de bauxite -Bauxite Powder=Poudre de bauxite -Bauxite Stone=Pierre de bauxite - -### blackhole.lua ### - -TechAge Black Hole=TechAge Trou Noir -TechAge Black Hole (let items and liquids disappear)=TechAge Trou Noir ( laissez les objets et les liquides disparaître) - -### boiler.lua ### - -TA2 Boiler Base=TA2 Base de chaudière -TA2 Boiler Top=TA2 Chaudière du haut - -### boiler_base.lua ### - -TA3 Boiler Base=TA3 Base de chaudière - -### boiler_lib.lua ### - -To add water punch@nthe boiler@nwith a water bucket=Pour ajouter de l'eau percuter@la chaudière@avec un seau d'eau -Water Boiler=Chaudière à eau - -### boiler_lib.lua ### -### heatexchanger2.lua ### - -water temperature=température de l'eau - -### boiler_top.lua ### - -TA3 Boiler Top=TA3 Chaudière du haut - -### booster.lua ### - -TA3 Booster=TA3 Amplificateur - -### button.lua ### - -Access:= -Button or switch= -Change the block name (infotext)= -Command to be sent= -Infotext= -TA3 Button/Switch=Bouton/interrupteur TA3 -TA4 Button/Switch=Bouton/interrupteur TA4 - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### - -Access= -Button protection= -Type= - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### gaze_sensor.lua ### -### player_detector.lua ### - -Command= -Number= - -### button.lua ### -### cart_detector.lua ### -### command_converter.lua ### -### detector.lua ### -### flipflop.lua ### -### light_detector.lua ### -### lua_logic.lua ### -### mesecons_converter.lua ### -### node_detector.lua ### -### player_detector.lua ### -### repeater.lua ### - -Insert destination node number(s)=Insérer le numéro de destination du nœud (s) - -### button.lua ### -### chest.lua ### -### command_converter.lua ### -### detector.lua ### -### doorcontroller.lua ### -### flipflop.lua ### -### mesecons_converter.lua ### -### repeater.lua ### -### sequencer2.lua ### -### submenu.lua ### - -Save=Sauvegarder - -### button.lua ### -### gaze_sensor.lua ### - -Destination block number(s)= - -### button_2x.lua ### - -TA4 2x Button= - -### button_2x.lua ### -### button_4x.lua ### - -Command to be sent (ignored for switches)= -Label for the button= -Momentary button or on/off switch= - -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### player_detector.lua ### - -Destination block number= - -### button_2x.lua ### -### button_4x.lua ### -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label= - -### button_4x.lua ### - -TA4 4x Button= - -### cart_detector.lua ### - -TA3 Cart Detector=Détecteur de chariot TA3 - -### cart_detector.lua ### -### light_detector.lua ### -### node_detector.lua ### - -accept=accepter - -### cart_detector.lua ### -### player_detector.lua ### - -TA3 Player Detector=Détecteur de joueur TA3 - -### ceilinglamp.lua ### - -TA Ceiling Lamp=TA Lampe de plafond - -### cement.lua ### - -Cement Block=Bloc de ciment -Cement Powder=Poudre de ciment - -### ceramic.lua ### - -TA4 Ceramic Material= -TA4 Furnace Ceramic= -TA4 Round Ceramic= -TA5 Ceramic Turbine= - -### charcoalpile.lua ### - -Dirt with Ash=Saleté avec cendre -TA1 Charcoal=TA1 Charbon de bois - -### charge_detector.lua ### - -Command to send when the energy storage charge@nlevel falls below the specified switch point= -Command to send when the energy storage charge@nlevel rises above the specified switch point= -Storage charge level switch point= -Switch point= -TA4 Energy Storage Charge Detector= - -### chest.lua ### - -Allow public access to the chest=Autoriser l'accès public au coffre -Inventory,Pre-Assignment,Config=Inventaire, Présélection, Configuration -Node label:=Étiquette du nœud : -TA2 Protected Chest=TA2 Coffre protégé -TA3 Protected Chest=TA3 Coffre protégé -TA4 Protected Chest=TA4 Coffre protégé - -### chest_cart.lua ### - -TA Chest Cart=TA Coffre de chariot - -### coalburner.lua ### - -Ash=Cendres - -### collector.lua ### - -Node number to send the events to=numéro de nœud pour envoyer les événements à -Node numbers to read the states from=numéros de noeud à lire les états de -Send an event if state is equal or larger than=Envoyer un événement si l'état est égal ou supérieur à -TA4 State Collector=Collecteur d'état TA4 - -### command_converter.lua ### - -Receive= -Send delay (s)= -Sent command= -TA3 Command Converter= - -### concentrator.lua ### - -TA4 Tube Concentrator= -Tube Concentrator= - -### controller.lua ### - -Cooling failed= -Magnet detection error@n(@1% found / 100% expected)= -Nucleus detection error= -Plasma ring shape error= -Shell shape error@n(@1% found / 100% expected)= -TA5 Fusion Reactor Controller= - -### controller.lua ### -### heatexchanger2.lua ### - -No power= - -### cooking.lua ### - -TA3 Melting=TA3 Fonte - -### cooler.lua ### - -TA3 Cooler=TA3 Refroidisseur -TA4 Collider Cooler= - -### counting.lua ### - -Your current value is= -[techage] The limit for 'number of commands per minute' has been exceeded.= -is allowed= -is allowed. Current value is= -per minute= - -### cylinder.lua ### - -TA2 Cylinder=Cylindre TA2 - -### detector.lua ### - -Counts down the number of items passed through@nand only triggers an 'on' command when it reaches zero.= -Current countdown= -Current countdown value.= -TA4 Collider Detector= -TA4 Collider Detector Core= -TA4 Detector=Détecteur TA4 - -### detector.lua ### -### electricmeter.lua ### - -Countdown= - -### detector.lua ### -### logic_block.lua ### -### tele.lua ### - -Blocking Time= - -### detector.lua ### -### tele.lua ### - -Configured Items= -Items which generate an 'on' command.@nIf empty, all passed items generate an 'on' command.= -On Time= -TA3 Detector=Détecteur TA3 -The time after the 'off' command@nuntil the next 'on' command is accepted.= -The time between the 'on' and 'off' commands.= - -### display.lua ### - -Display no: =Afficher n° : -TA4 Display=Affichage TA4 -TA4 Display XL=Affichage TA4 XL - -### distiller.lua ### - -TA3 Distillation Tower 1=TA3 Tour de distillation 1 -TA3 Distillation Tower 2=TA3 Tour de distillation 2 -TA3 Distillation Tower 3=TA3 Tour de distillation 3 -TA3 Distillation Tower 4=TA3 Tour de distillation 4 -TA3 Distillation Tower Base=Base de la tour de distillation TA3 - -### distributor.lua ### - -Block configured items for open ports=Bloquer les éléments configurés pour les ports ouverts -Distributor=Distributeur -High Performance Distributor=Distributeur haute performance -Input=Entrée -blocking mode=mode de blocage - -### doorblock.lua ### - -TechAge Door Block=Bloc de porte TechAge - -### doorcontroller.lua ### - -Insert door/gate block number(s)=Insérer le numéro de porte(s) -TA3 Door Controller=TA3 Contrôleur de porte - -### doorcontroller2.lua ### - -Blocks exchanged= -Blocks reset= -Click on all the blocks that are part of the door/gate=Cliquez sur tous les blocs qui font partie de la porte/du portail -Ctrl,Inv=Ctrl,Inv -Exchange= -TA3 Door Controller II=TA3 Contrôleur de porte II -with door sound= - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### node_detector.lua ### -### turncontroller.lua ### - -Done=Terminé -Record=Enregistrer -block positions are stored.=Les positions des blocs sont enregistrées. - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### turncontroller.lua ### - -Recording...=Enregistrement... - -### doorcontroller2.lua ### -### movecontroller.lua ### - -Reset= - -### drillbox.lua ### - -Build derrick=Construire le derrick -Depth=Profondeur -Drill Bit=Mèche de forage -Drill area is protected=La zone de forage est protégée -Drill bits missing=Mèches de forage manquantes -Oil Drill Box=Boîte de forage pétrolier -Remove derrick=Retirer le derrick -item output blocked=sortie d'article bloquée - -### drive_axle.lua ### - -TA2 Drive Axle=Axe d'entraînement TA2 - -### electric_cable.lua ### - -TA Electric Cable=TA Câble électrique - -### electricmeter.lua ### - -Amount of power to be provided before the device turns off= -Consumption= -Power countdown= -TA4 Electric Meter= - -### electricmeter.lua ### -### formspecs.lua ### -### transformer.lua ### - -Power= - -### electricmeter.lua ### -### transformer.lua ### - -Max. power= -Maximum power passed through= - -### electrolyzer.lua ### - -Configurable value@nfor the current limit= -Current limitation= -Electrolyzer=Électrolyseur -If the charge of the storage@nsystem falls below the configured value,@nthe block switches off= -Maximum possible@ncurrent consumption= -Maximum power consumption [ku]= -Storage full= -TA4 Electrolyzer= -Turnoff point= -Turnoff point reached= - -### electrolyzer.lua ### -### fuelcell.lua ### -### tiny_generator.lua ### - -Electricity=Électricité - -### electronic.lua ### - -TA3 Vacuum Tube=Tube à vide TA3 -TA4 LEDs=TA4 DEL -TA4 RAM Chip=Puce RAM TA4 -TA4 WLAN Chip=Puce WLAN TA4 -TA5 AI Chip= -TA5 AI Chip II= -WLAN Chip=Puce WLAN - -### electronic_fab.lua ### - -Electronic Fab=Fab électronique -TA2 Ele Fab= -TA3 Ele Fab= -TA4 Ele Fab= - -### end_wrench.lua ### - -Biome= -Node owner= -Position= -Position temperature= -Pump connected to no/empty tank(s).= -Pump connected to tank(s) with: @1= -TechAge Info Tool (use @= read status info)= - -### end_wrench.lua ### -### meltingpot.lua ### - -Time= - -### epoxy.lua ### - -Epoxide Resin=Résine d'époxyde -Epoxide Resin Barrel=Baril de résine d'époxyde -Epoxide Resin Canister=Résine époxyde en bidon - -### explore.lua ### - -Oil=Pétrole -TA3 Oil Explorer=TA3 Explorateur de pétrole -TA3 Oil Storage=TA3 Entreposage du pétrole -depth= - -### filler.lua ### - -Liquid Filler= -TA Liquid Filler=TA Remplisseur liquide - -### firebox.lua ### - -TA2 Firebox= -TA3 Coal Power Station Firebox= -TA3 Furnace Oil Burner= -TA3 Power Station Firebox= - -### firebox_lib.lua ### - -Firebox= - -### flipflop.lua ### - -TA3 Flip-Flop= - -### fly_lib.lua ### - -Destination position is protected= -Error: Max. length of the flight route exceeded by @1 blocks !!= -No valid destination position= -No valid node at the start position= -No valid start position= -Running= -Start position is protected= -Stopped= - -### fly_lib.lua ### -### flycontroller.lua ### - -Error: Invalid path !!= - -### flycontroller.lua ### - -Error: Recording is missing !!= -Flight route (A to B)= -Move a player without moving blocks= -See chat output= -TA5 Fly Controller= -Teleport mode= -Test= -[TA4 Fly Controller] Invalid path!= -[TA4 Fly Controller] Recording is missing!= - -### flycontroller.lua ### -### logic_block.lua ### -### lua_logic.lua ### -### movecontroller.lua ### - -Store= - -### flycontroller.lua ### -### movecontroller.lua ### - -Click on all blocks that shall be moved= -Maximum Speed= -Maximum speed for moving blocks= -Move= -Move A-B= -Move B-A= -Move block height= -Object offset= -Stored= -Value in the range of 0.0 to 1.0= -Y-offset for non-player objects like vehicles (-0.5 to 0.5)= - -### flywheel.lua ### - -Flywheel=La roue motrice -TA2 Flywheel=La roue motrice TA2 - -### forceload.lua ### - -Area already loaded or max. number of Forceload Blocks reached!=Zone déjà chargée ou nombre maximum de Forceload atteint! -Area from= -Area to= -Block at pos= -List of your Forceload Blocks:=Liste de vos blocs de forceload : -Punch the block to make the area visible.=Frappez le bloc pour rendre la zone visible. -Show all forceload blocks in a 64x64x64 range=Afficher tous les blocs de forceload dans une zone de 64x64x64 -Techage Forceload Block=Bloc de Forceload Techage -Techage Forceload Tile=Tuile de Forceload Techage -loaded=chargé - -### formspecs.lua ### - -Block has a wrench menu= -Charge termination= -Current output [ku]= -Maximum output [ku]= -Range in which the generator reduces its power= -The current power the generator provides= -The maximum power the generator can provide= - -### formspecs.lua ### -### power_terminal2.lua ### - -Charging= - -### formspecs.lua ### -### power_terminal2.lua ### -### storage.lua ### -### transformer.lua ### - -Storage= - -### fuel_lib.lua ### - -Fuel Menu=Menu Carburant -To add fuel punch@nthis block@nwith a fuel container= - -### fuelcell.lua ### - -Fuel Cell=Cellules à combustible -TA4 Fuel Cell=Cellules à combustible TA4 -no hydrogen= - -### fuelcellstack.lua ### - -TA4 Fuel Cell Stack=Empilement de cellules à combustible TA4 - -### furnace_top.lua ### - -Furnace Top=Haut du fourneau -Outp= -no fuel or no power=pas de carburant ou pas d'électricité - -### gas_pipe.lua ### - -TA5 Junction Pipe= -TA5 Pipe= - -### gateblock.lua ### - -TechAge Gate Block=Bloc de porte TechAge - -### gaze_sensor.lua ### - -Command to send when sensor is no longer viewed= -Command to send when sensor is viewed= -Input the player name(s) separated by blanks.@nIf empty, only the owner is accepted.= -Player Names= -TA4 Gaze Sensor= - -### gearbox.lua ### - -TA2 Gearbox=Boîte de vitesses TA2 - -### generator.lua ### - -TA3 Generator=Générateur TA3 -TA4 Generator=Générateur TA4 -TA5 Generator= -no steam= - -### generator.lua ### -### power_terminal2.lua ### - -Generator=Générateur - -### gravelrinser.lua ### - -Gravel Rinser=Rinceur de gravier -Rinsing=Rinçage - -### gravelsieve.lua ### - -Compressed Gravel=Gravier compressé -Gravel Sieve=Tamis à gravier -Sieved Gravel=Gravier tamisé -TA1 Gravel Sieve=Tamis à gravier TA1 -TA2 Gravel Sieve=Tamis à gravier TA2 -TA3 Gravel Sieve=Tamis à gravier TA3 -TA4 Gravel Sieve=Tamis à gravier TA4 - -### grinder.lua ### - -Grinder=Broyeur -Grinding=Broyage -Milling= -TA1 Mill Base= - -### growlight.lua ### - -TA4 LED Grow Light=Lumière a DEL pour culture TA4 - -### hammer.lua ### - -TA1 Bronze Hammer (smash stone to gravel)= -TA1 Diamond Hammer (smash stone to gravel)= -TA1 Meridium Hammer (smash stone to gravel)= -TA1 Mese Hammer (smash stone to gravel)= -TA1 Steel Hammer (smash stone to gravel)= -TA1 Stone Hammer (smash stone to gravel)= - -### heater.lua ### - -TA4 Furnace Heater= - -### heatexchanger1.lua ### - -TA4 Heat Exchanger 1= -TA5 Heat Exchanger 1= - -### heatexchanger2.lua ### - - Error!= -Blue pipe connection error@n(@1 found / @2 expected)= -Blue pipe coolant missing@n(@1 found / @2 expected)= -Cooler error= -Green pipe connection error@n(@1 found / @2 expected)= -Green pipe coolant missing@n(@1 found / @2 expected)= -Power network connection error= -TA4 Heat Exchanger= -TA4 Heat Exchanger 2= -TA5 Heat Exchanger 2= -Turbine error= -did you check the plan?= -inlet/pipe error= -wrong storage diameter= - -### heatexchanger3.lua ### - -TA4 Heat Exchanger 3= -TA5 Heat Exchanger 3= - -### hydrogen.lua ### - -Hydrogen Cylinder Large= -Hydrogen Cylinder Small= -TA4 Hydrogen= - -### hyperloop.lua ### -### sensorchest.lua ### -### teleport.lua ### - -not connected= - -### hyperloop.lua ### -### teleport.lua ### - -Block name= -Connection name for this block= -Connection name of the remote block= -Enter a block name or select an existing one= -Remote name= -connected to= - -### industriallamp1.lua ### - -TA Industrial Lamp 1= - -### industriallamp2.lua ### - -TA Industrial Lamp 2= - -### industriallamp3.lua ### - -TA Industrial Lamp 3= - -### industriallamp4.lua ### - -TA4 LED Industrial Lamp= - -### inlet.lua ### - -TA4 Pipe Inlet= -one window maximum= -wrong diameter (should be 5, 7, or 9)= -wrong number of gravel nodes= -wrong number of shell nodes= - -### inlets.lua ### - -TA4 Collider Cable Input= -TA4 Collider Pipe Input= -TA4 Collider Pipe Output= -TA4 Collider Tube Input= - -### inverter.lua ### - -Inverter= -Power AC= -Power DC= -TA4 Solar Inverter= -no solar power= -solar network error= - -### junctionbox.lua ### - -TA Electric Junction Box= - -### lampholder.lua ### - -TA Lamp Holder Acacia= -TA Lamp Holder Apple= -TA Lamp Holder Aspen= -TA Lamp Holder Copper= -TA Lamp Holder Gold= -TA Lamp Holder White= - -### laser.lua ### - -Laser beam error!= -TA4 Laser Beam Emitter= -TA4 Laser Beam Receiver= -Valid destination positions:= -to= - -### lib.lua ### - -Block has an@nadditional wrench menu= - -### lib.lua ### -### sensorchest.lua ### - -connected with= - -### light_detector.lua ### - -Send signal if light level is above:= -TA3 Light Detector= - -### lighter.lua ### - -TA1 Lighter= - -### liquid_lib.lua ### - -Allow public access to the tank= -Liquid Tank= -To add liquids punch@nthe tank@nwith a liquid container= - -### liquid_lib.lua ### -### ta4_chest.lua ### - -keep assignment=garder l'affectation - -### liquid_pipe.lua ### - -TA Junction Pipe= -TA Pipe= - -### liquidsampler.lua ### - -Liquid Sampler= - -### liquidsampler.lua ### -### waterpump.lua ### - -no usable water= - -### logic_block.lua ### - -'me' has to be used for the own block number.@n= -'~@=' means: not equal@n= -@n is a boolean expression@nwhere input numbers are evaluated.@n= -@n is the block number to which the@ncommand should be sent.@n= -@nAll rules are checked with each received@ncommand.= -@nExamples:@n1234 @=@= on@n1234 @=@= off@n1234 @=@= on and 2345 @=@= off@n2345 ~@= 3456@n= -@nRule:@n @= on/off if is true@n= -@nThe internal processing time for all@ncommands is 100 ms.= -@nValid operators:@nand or on off me @=@= ~@= ( )@n= -Clear= -Debug= -Inputs= -Outputs= -Rules= -Send an 'on'/'off' command if the@nexpression becomes true.@n= -Syntax= - -### logic_block.lua ### -### lua_logic.lua ### - -TA3 Logic Block= -Update= - -### logic_block.lua ### -### sequencer2.lua ### - -Help= - -### lye.lua ### - -Lye= -Lye Barrel= -Lye Canister= - -### magnet.lua ### - -TA4 Collider Detector Magnet= -TA4 Collider Magnet= -TA4 Collider Magnet Base= -TA4 Collider Steel Block= -TA5 Fusion Reactor Magnet 1= -TA5 Fusion Reactor Magnet 2= -TA5 Fusion Reactor Magnet Blank= -TA5 Fusion Reactor Magnet Shield= - -### mba_detector.lua ### - -TA4 Mapblock Active Detector= - -### meltingpot.lua ### - -Heat= -Melting Guide= -Melting Pot active (heat@== -Melting Pot inactive (heat@== -Melting Pot inactive (heat@=0)= -Menu= -Menu,Recipes= -TA1 Burning= -TA1 Melting= -TA1 Melting Pot= - -### meridium.lua ### - -Meridium Axe= -Meridium Pickaxe= -Meridium Shovel= -Meridium Sword= - -### mesecons_converter.lua ### - -TA3 Mesecons Converter= - -### mill.lua ### - -TA1 Mill= -TA1 Mill Gear= - -### millboard.lua ### - -TA1 Acacia Millrace Board= -TA1 Acacia Wood Board= -TA1 Apple Millrace Board= -TA1 Apple Wood Board= -TA1 Aspen Millrace Board= -TA1 Aspen Wood Board= -TA1 Jungle Millrace Board= -TA1 Jungle Wood Board= -TA1 Pine Millrace Board= -TA1 Pine Wood Board= - -### minicell.lua ### - -TA4 Streetlamp Solar Cell= - -### minichest.lua ### - -Test Chest= - -### minitank.lua ### - -Test Mini Tank= - -### movecontroller.lua ### - -Error: Invalid distance !!= -Move distance= -Move distance (A to B)= -Operational mode= -Switch to the remote controlled 'move xyz' mode= -TA Rack and Pinion= -TA4 Move Controller= - -### node_detector.lua ### - -Click on all blocks whose positions should be checked= -Send signal if nodes have been:= -TA3 Node Detector= -TA4 Node Detector= -added= -added or removed= -removed= - -### nodes.lua ### - -TechAge Gravel= - -### oil.lua ### - -Flowing Oil= -Oil Source= -TA3 Oil Barrel= -TA3 Oil Canister= - -### oilfirebox.lua ### - -TA3 Power Station Oil Burner= - -### petroleum.lua ### - -Isobutane Cylinder Large= -Isobutane Cylinder Small= -Propane Cylinder Large= -Propane Cylinder Small= -TA3 Bitumen= -TA3 Bitumen Barrel= -TA3 Bitumen Canister= -TA3 Fuel Oil= -TA3 Fuel Oil Barrel= -TA3 Fuel Oil Canister= -TA3 Gasoline= -TA3 Gasoline Barrel= -TA3 Gasoline Canister= -TA3 Naphtha= -TA3 Naphtha Barrel= -TA3 Naphtha Canister= -TA3 Propane= -TA4 Isobutane= - -### pillar.lua ### - -TA4 Pillar= - -### pipe_wall_entry.lua ### - -TA3 Pipe Wall Entry= - -### pipe_wrench.lua ### - -TA3 Drill Pipe Wrench= - -### plastic.lua ### - -Plastic Granules= - -### player_detector.lua ### - -Command to send when player is detected= -Command to send when player moves away= -Radius= -Search radius= -TA4 Player Detector= - -### powder.lua ### - -Aluminum Powder= -Clay Powder= -Graphite Powder= -Iron Powder= -Leave Powder= -Needle Powder= -Silver Sandstone Powder= - -### power2axle.lua ### - -TA3 Electric Motor= - -### power_line.lua ### - -TA Power Line= -TA Power Pole= -TA Power Pole Top (for up to 6 connections)= -TA Power Pole Top 2 (for landlines)= - -### power_terminal2.lua ### - -Commands@nhelp . . . print this text@ncls . . . . clear screen@ngen . . print generators@nsto . . print storage systems@ncon1 . . print consumers with power consumption between 1 and 10 ku@ncon2 . . print consumers with power consumption with 10 ku or above@n= -Consumer= -Network Data= -Number of consumers:= -Number of generators:= -Number of network nodes:= -Number of storage systems:= -TA3 Power Terminal= - -### power_terminal2.lua ### -### terminal.lua ### - -Enter=Saisir - -### powerswitch.lua ### - -TA Power Switch= -TA Power Switch Small= - -### powerswitchbox.lua ### -### powerswitchbox_legacy.lua ### - -TA Power Switch Box= - -### programmer.lua ### - -TechAge Programmer (right @= read number, left @= write numbers)= -[TechAge Programmer] Error: invalid numbers!= -[TechAge Programmer] Error: programmer not supported!= -[TechAge Programmer] Unknown node on= -[TechAge Programmer] foreign or unknown node!= -[TechAge Programmer] node programmed!= -[TechAge Programmer] number= -[TechAge Programmer] programmer reset= - -### protection.lua ### - -Allow to dig/place Techage power lines nearby power poles= - -### pump.lua ### - -Number of liquid units that are allowed to be pumped= -Number of units= -TA3 Pump= -TA4 Pump= - -### pump.lua ### -### ta5_pump.lua ### - -Total flow rate= -Total flow rate in liquid units= - -### pumpjack.lua ### - -Oil Pumpjack= -Oil amount= -Pumpjack= -needs power= -no oil= - -### pusher.lua ### - -Number of items= -Number of items that are allowed to be pushed= -Optionally configure@nthe pusher with one item= -Pusher= - -### quarry.lua ### - -Digging depth= -Hole size= -Quarry= -Start level= -Start level @= 0@nmeans the same level@nas the quarry is placed= -area is protected= -finished= -inventory full= - -### reboiler.lua ### - -TA3 Oil Reboiler= - -### recipe_lib.lua ### -### recipeblock.lua ### - -Recipe= - -### recipe_lib.lua ### -### ta4_reactor.lua ### - -Catalyst= - -### recipeblock.lua ### - -TA4 Recipe Block= - -### recipes.lua ### - -Flint and Iron= -TA1 Iron Ingot= -[Bucket] Lava can only be placed below sea level!= - -### recycler.lua ### - -Recycler= - -### redstone.lua ### - -Red Stone= -Red Stone Block= -Red Stone Brick= - -### repeater.lua ### - -TA3 Repeater= - -### rotor.lua ### - -Nacelle is missing= -TA4 Carbon Fiber= -TA4 Rotor Blade= -TA4 Wind Turbine= -TA4 Wind Turbine Nacelle= - -### screwdriver.lua ### - -Block alignment stored!= -Techage Screwdriver@n(See: TA3 > Tools)= - -### sensorchest.lua ### - -Allow public chest access= -TA4 Sensor Chest= - -### sequencer.lua ### - -TA3 Sequencer= - -### sequencer.lua ### -### sequencer2.lua ### - -stopped= - -### sequencer2.lua ### - - - 'goto ' (jump to another line)@n= - - 'nop' (do nothing)@n= - - 'send ' (techage command)@n= - - 'stop' (stop the execution)@n= - - 1 corresponds to 100 ms@n= - - 50000 corresponds to 4 game days@n= -'[] '@n= - is one of the following:@n= - is a number from 1 to 50000 and is@n= -@n= -Commands= -Cycle time= -Example:@n= -If 'yes' a received OFF command won't stop the sequencer= -Ignore OFF command= -Invalid command!= -Start= -Stop= -Syntax:@n= -TA4 Sequencer= -Timer cycle time (default: 100 ms)= -running= -the timeslot when the command is executed.@n= - -### sequencer2.lua ### -### submenu.lua ### - -Cancel= - -### shell.lua ### - -TA5 Fusion Reactor Nucleus= -TA5 Fusion Reactor Shell= - -### signallamp.lua ### - -TA4 Wind Turbine Signal Lamp= -TechAge Color Lamp= -TechAge Color Lamp 2= - -### signallamp_2x.lua ### - -TA4 2x Signal Lamp= - -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label for the lamp= - -### signallamp_4x.lua ### - -TA4 4x Signal Lamp= - -### silicon.lua ### - -TA4 Silicon Wafer= - -### silo.lua ### - -TA3 Silo= -TA4 Silo= - -### simplelamp.lua ### - -TA Lamp= - -### sluice.lua ### - -TA1 Sluice Gate= -TA1 Sluice Handle= - -### solarcell.lua ### - -TA4 Solar Carrier Module= -TA4 Solar Carrier Module B= -TA4 Solar Carrier Module T= -TA4 Solar Module= -light= - -### solarcell.lua ### -### source.lua ### - -power=alimentation - -### soundblock.lua ### - -Play= -TA3 Sound Block= - -### source.lua ### - -Axle Power Source= -Ele Power Source= -Power Source= -Test Generator= - -### steam_pipe.lua ### - -TA2 Steam Pipe= - -### steelmat.lua ### - -TechAge Steel Mat= - -### storage.lua ### - -Test Storage= - -### streetlamp.lua ### - -TA Street Lamp= - -### streetlamp2.lua ### - -TA4 LED Street Lamp= -TA4 LED Street Lamp Arm= -TA4 LED Street Lamp Pole= - -### submenu.lua ### - -Note: You can't change any values while the block is running!= -Refresh= - -### ta1_axle.lua ### - -TA1 Axle= -TA1 Axle Bearing= - -### ta2_clutch.lua ### - -TA2 Clutch= - -### ta2_weight_chest.lua ### - -TA2 Weight Chest= - -### ta2_winch.lua ### - -TA2 Winch= - -### ta4_cable.lua ### - -TA4 Low Power Box= -TA4 Low Power Cable= - -### ta4_cable_wall_entry.lua ### - -TA4 Cable Wall Entry= - -### ta4_chest.lua ### - -Empty the slots always @nfrom right to left= -Never completely empty the slots@nwith the pusher to keep the item assignment=Ne jamais vider complètement les slots@n avec le pousseur pour conserver l'affectation des articles -Size=Taille -TA4 8x2000 Chest=TA4 Coffre 8x2000 -Unlock=Déverrouiller -Unlock connected chest@nif all slots are below 2000=Déverrouiller le coffre connecté@n si tous les emplacements sont inférieurs à 2000 -right to left=de droite à gauche - -### ta4_doser.lua ### - -Doser=Doseur -TA4 Doser=TA4 Doseur -catalyst missing=catalyseur manquant -reactor defect=défaut du réacteur -reactor defect or no power=défaut du réacteur ou absence de courant -reactor has no power=Le réacteur n'a pas de courant -wrong catalyst=mauvais catalyseur - -### ta4_doser.lua ### -### ta4_reactor.lua ### - -TA4 Reactor=Réacteur TA4 - -### ta4_injector.lua ### - -Configure up to 8 items @nto be pushed by the injector= -Injector=Injecteur -Switch to pull mode @nto pull items out of inventory slots @naccording the injector configuration= -pull mode= - -### ta4_liquid_filter.lua ### - -TA4 Liquid Filter Filler=TA4 Remplisseur de liquide filtrer -TA4 Liquid Filter Sink=TA4 Évier de filtre à liquide - -### ta4_reactor.lua ### - -TA4 Reactor Filler Pipe=Tuyau de remplissage du réacteur TA4 - -### ta4_stand.lua ### - -TA4 Reactor Base=Base du réacteur TA4 -TA4 Reactor Stand=Support du réacteur TA4 -off=fermer -on=allumer - -### ta4_stand.lua ### -### waterpump.lua ### - -no power=pas de courant - -### ta5_chest.lua ### - -TA5 Hyperloop Chest= - -### ta5_pump.lua ### - -TA5 Pump= - -### ta5_tank.lua ### - -TA5 Hyperloop Tank= - -### tank.lua ### - -Oil Tank=Citerne de pétrole -TA3 Tank=Citerne TA3 -TA4 Tank=Citerne TA4 - -### tank_cart.lua ### - -TA Tank Cart=Chariot-citerne TA - -### teleport.lua ### - -Connected= -Connection status= -Distance > @1 blocks= -Ex-points missing (@1 < @2)= -Status= -server not connected= - -### teleport_pipe.lua ### - -TA5 Teleport Block Liquids= - -### teleport_pipe.lua ### -### teleport_tube.lua ### - -Remote block error= - -### teleport_tube.lua ### - -TA5 Teleport Block Items= - -### terminal.lua ### - -Syntax error, try help=Erreur de syntaxe, essayez l'aide -TA3 Terminal=Terminal TA3 -TA4 Terminal= -commands like: help=commandes comme: aide - -### timer.lua ### - -TA3 Timer=TA3 Minuteur - -### tiny_generator.lua ### - -TA3 Tiny Power Generator=TA3 Petit générateur d'électricité -Tiny Generator=Petit générateur -no fuel=pas de carburant - -### tower.lua ### - -TA3 Derrick=TA3 Derrick -TA3 Drill Pipe=Tuyau de forage TA3 -TA4 Derrick=TA4 Derrick -[TA] Derrick is being built!=[TA] Le derrick est en cours de construction! -[TA] Derrick is being removed!=[TA] Le derrick est retiré! - -### transformer.lua ### - -TA4 Isolation Transformer= - -### trowel.lua ### - -TechAge Trowel=Truelle TechAge - -### tube_wall_entry.lua ### - -Tube Wall Entry=Entrée murale du tube - -### tubes.lua ### - -TechAge Tube= - -### tubes_ta4.lua ### - -TA4 Tube= - -### turbine.lua ### - -TA3 Turbine=Turbine TA3 -TA4 Turbine=Turbine TA4 -TA5 Turbine= - -### turncontroller.lua ### - -Click on all blocks that shall be turned= -TA4 Turn Controller= -Turn left= -Turn right= - -### usmium.lua ### - -Usmium Nuggets=Pépites d'Usmium -Usmium Powder=Poudre d'Usmium - -### vacuumtube.lua ### - -TA4 Vacuum Tube= - -### valve.lua ### - -TA Valve=TA Valve -TA3 Valve= - -### waterinlet.lua ### - -Error: No natural water!= -Error: No water available!= -Error: Not on sea level!= -Operational= -TA4 Water Inlet= - -### watermill.lua ### - -TA1 Watermill= - -### waterpump.lua ### - -TA4 Water Pump=TA4 Pompe à eau -Water Pump=Pompe à eau - -### windturbine_lib.lua ### - -Here is not enough water (41x41 m)!=Ici, il n'y a pas assez d'eau (41x41 m)! -Here is not enough wind@n(A free air space of 41x41x21 m is necessary)!= -The next wind turbines is too close!=La prochaine éolienne est trop proche! -This is a=Il s'agit d'un -This is no ocean water!=Ce n'est pas de l'eau de mer! -This is not the surface of the ocean!=Ce n'est pas la surface de l'océan! -[TA4 Wind Turbine]=[TA4 Éolienne] -biome and no ocean!=un biome et pas d'océan! -is a suitable place for a wind turbine!=est un endroit approprié pour une éolienne! - -### worker.lua ### - -Build detector= -Item list= -Remove detector= -TA4 Collider Detector Worker= -[TA4] Detector is being built!= -[TA4] Detector is being removed!= - - -##### not used anymore ##### - -TA3 Akku Box=TA3 Boite Akku -No plan available=Aucun plan disponible -Side view=Vue de côté -Top view=Vue de dessus -Blocks are back=Les blocs sont de retour -Blocks are disappeared=Les blocs ont disparu -Remove=Retirer -Set=Configurer -Priv missing=Priv manquant -Switched to private use!=Passage à l'usage privé! -Switched to public use!=Passage à l'usage public! -TA2 Power Generator: Overload fault?@n(restart with right-click)=Générateur de puissance TA2 : Défaut de surcharge ?@n(redémarrage avec le clic droit) -Error: Inventory already in use=Erreur : Inventaire déjà utilisé -full=plein -storage empty?=stockage vide? -Use a trowel to remove the node.=Utilisez une truelle pour enlever le noeud. -TA3 Valve closed=TA3 Valve fermée -TA3 Valve open=TA3 Valve ouverte -Here is not enough wind (A free air space of 41x41x21 m is necessary)!=Ici, il n'y a pas assez de vent (un espace libre de 41x41x21 m est nécessaire)! diff --git a/techage/locale/techage.ru.tr b/techage/locale/techage.ru.tr deleted file mode 100644 index 1bdf22e..0000000 --- a/techage/locale/techage.ru.tr +++ /dev/null @@ -1,1576 +0,0 @@ -# textdomain: techage - - - -### akkubox.lua ### - -TA3 Accu Box=TA3 Блок питания - -### aluminium.lua ### - -Aluminum=Алюминий -Gibbsite Powder=Гидраргиллитовый порошок -Red Mud=Красная грязь -Red Mud Barrel=Бочка красной грязи -Red Mud Canister=Канистра красной грязи - -### assemble.lua ### -### firebox_lib.lua ### - -[TA] Area is protected!=[TA] Зона защищена! -[TA] Not enough space!=[TA] Недостаточно пространства! - -### assembly_tool.lua ### - -TechAge Assembly Tool=TechAge Сборочный инструмент - -### autocrafter.lua ### - -Autocrafter=Автокрафтер - -### axle2power.lua ### - -TA2 Power Generator=TA2 Генератор - -### baborium.lua ### - -Baborium Ingot=Бабориемувый слиток -Baborium Lump=Кусок бабориума -Baborium Ore=Кусок бабориемувой руды - -### barrel.lua ### - -Gas Cylinder Large=Большой газовый баллон -Gas Cylinder Small=Маленький газовый баллон -River Water Barrel=Бочка речной воды -TA Empty Barrel=TA Пустая бочка -TA3 Canister=TA3 Канистра -Water=Вода -Water Barrel=Бочка с водой -empty=пустой - -### basalt.lua ### - -Basalt Cobble=Базальтовый булыжник -Basalt Glass=Базальтовое стекло -Basalt Glass 2=Базальтовое стекло 2 -Basalt Glass Thin=Тонкое базальтовое стекло -Basalt Glass Thin 2=Тонкое базальтовое стекло 2 -Basalt Glass Thin XL=Тонкое базальтовое стекло XL -Basalt Glass Thin XL 2=Тонкое базальтовое стекло XL 2 -Basalt Gravel=Базальтовый гравий -Basalt Stone=Базальтовый камень -Basalt Stone Block=Блок базальтового камня -Basalt Stone Brick=Базальтовый кирпич -Sieved Basalt Gravel=Просеянный базальтовый камень - -### battery.lua ### - -Battery=Батарея -Coal Equivalents=В угольном эквиваленте -Digtron Battery=Батарея дигтрона - -### battery.lua ### -### storage.lua ### - -Load=Загрузка - -### bauxit.lua ### - -Bauxite Cobblestone=Бокситовый булыжник -Bauxite Gravel=Бокситовый гравий -Bauxite Powder=Бокситовая порошок -Bauxite Stone=Бокситовый камень - -### blackhole.lua ### - -TechAge Black Hole=TechAge Черная дыра -TechAge Black Hole (let items and liquids disappear)=Techage Черная дыра (позвольте предметам и жидкостям исчезнуть) - -### boiler.lua ### - -TA2 Boiler Base=TA2 Нижняя часть водонагревателя -TA2 Boiler Top=TA2 Верхняя часть водонагревателя - -### boiler_base.lua ### - -TA3 Boiler Base=TA3 Нижняя часть водонагревателя - -### boiler_lib.lua ### - -To add water punch@nthe boiler@nwith a water bucket=Что бы добавить воду ударьте @nводонагреватель@n ведром воды -Water Boiler=Водонагреватель - -### boiler_lib.lua ### -### heatexchanger2.lua ### - -water temperature=температура воды - -### boiler_top.lua ### - -TA3 Boiler Top=TA3 Верхняя часть бойлера - -### booster.lua ### - -TA3 Booster=TA3 Усилитель - -### button.lua ### - -Access:=Доступ: -Button or switch=Кнопка или выключатель -Change the block name (infotext)=Измените имя блока (информационный текст) -Command to be sent=Команда для отправки -Infotext=Информационный текст -TA3 Button/Switch=TA3 Кнопка/Выключатель -TA4 Button/Switch=TA4 Кнопка/Выключатель - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### - -Access=Доступ -Button protection=Защита кнопки -Type=Тип - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### gaze_sensor.lua ### -### player_detector.lua ### - -Command=Команда -Number=Номер - -### button.lua ### -### cart_detector.lua ### -### command_converter.lua ### -### detector.lua ### -### flipflop.lua ### -### light_detector.lua ### -### lua_logic.lua ### -### mesecons_converter.lua ### -### node_detector.lua ### -### player_detector.lua ### -### repeater.lua ### - -Insert destination node number(s)=Введите номер(а) блок(а/ов) назначения - -### button.lua ### -### chest.lua ### -### command_converter.lua ### -### detector.lua ### -### doorcontroller.lua ### -### flipflop.lua ### -### mesecons_converter.lua ### -### repeater.lua ### -### sequencer2.lua ### -### submenu.lua ### - -Save=Сохранить - -### button.lua ### -### gaze_sensor.lua ### - -Destination block number(s)=Номер(а) блок(а/ов) назначения - -### button_2x.lua ### - -TA4 2x Button=TA4 2x Кнопка - -### button_2x.lua ### -### button_4x.lua ### - -Command to be sent (ignored for switches)=Команда для отправки (игнорируется для выключателей) -Label for the button=Ярлык для кнопки -Momentary button or on/off switch=Мгновенная кнопка или выключатель - -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### player_detector.lua ### - -Destination block number=Номер блока назначения - -### button_2x.lua ### -### button_4x.lua ### -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label=Ярлык - -### button_4x.lua ### - -TA4 4x Button=TA4 4x Кнопка - -### cart_detector.lua ### - -TA3 Cart Detector=TA3 Детектор вагонетки - -### cart_detector.lua ### -### light_detector.lua ### -### node_detector.lua ### - -accept=принять - -### cart_detector.lua ### -### player_detector.lua ### - -TA3 Player Detector=TA3 Детектор игрока - -### ceilinglamp.lua ### - -TA Ceiling Lamp=TA Люстра - -### cement.lua ### - -Cement Block=Блок цемента -Cement Powder=Порошок из цемента - -### ceramic.lua ### - -TA4 Ceramic Material=TA4 Керамика -TA4 Furnace Ceramic=TA4 Керамика для печи -TA4 Round Ceramic=TA4 Круглая керамика -TA5 Ceramic Turbine=TA5 Керамическая турбина - -### charcoalpile.lua ### - -Dirt with Ash=Грязь с пеплом -TA1 Charcoal=TA1 Древесный уголь - -### charge_detector.lua ### - -Command to send when the energy storage charge@nlevel falls below the specified switch point=Команда, которая отправится когда @nуровень энергии будет ниже указанной точки -Command to send when the energy storage charge@nlevel rises above the specified switch point=Команда, которая отправится когда @nуровень энергии будет выше указанной точки -Storage charge level switch point=Точка переключения уровня заряда источника энергии -Switch point=Точка переключения -TA4 Energy Storage Charge Detector=TA4 Детектор количества энергии в хранилище - -### chest.lua ### - -Allow public access to the chest=Разрешить публичный доступ к сундуку -Inventory,Pre-Assignment,Config=Инвентарь,Пред задание,Настройка -Node label:=Ярлык ноды: -TA2 Protected Chest=TA2 Защищенный сундук -TA3 Protected Chest=TA3 Защищенный сундук -TA4 Protected Chest=TA4 Защищенный сундук - -### chest_cart.lua ### - -TA Chest Cart=TA Вагонетка с сундуком - -### coalburner.lua ### - -Ash=Пепел - -### collector.lua ### - -Node number to send the events to=Номер ноды в которую будут отправляться события -Node numbers to read the states from=Номера нод из которых будут считываться состояния -Send an event if state is equal or larger than=Отправить событие если состояние больше или равно чем -TA4 State Collector=TA4 Считыватель состояния - -### command_converter.lua ### - -Receive=Получить -Send delay (s)=Отправить через (с) -Sent command=Отправить команду -TA3 Command Converter=TA3 Конвертер команд - -### concentrator.lua ### - -TA4 Tube Concentrator=TA4 Соединитель труб -Tube Concentrator=Соединитель труб - -### controller.lua ### - -Cooling failed=Охлаждение не удалось -Magnet detection error@n(@1% found / 100% expected)=Ошибка обнаружения магнита(@1 найден / 100% ожидается) -Nucleus detection error=Ошибка обнаружения ядра -Plasma ring shape error=Ошибка формы плазмового кольца -Shell shape error@n(@1% found / 100% expected)=Ошибка формы оболочки@n(@1% найдено / 100% ожидается) -TA5 Fusion Reactor Controller=TA5 Контроллер ядерного реактора - -### controller.lua ### -### heatexchanger2.lua ### - -No power=Нет энергии - -### cooking.lua ### - -TA3 Melting=TA3 Плавление - -### cooler.lua ### - -TA3 Cooler=TA3 Охладитель -TA4 Collider Cooler=TA4 Охладитель коллайдера - -### counting.lua ### - -Your current value is=Ваше текущее значение -[techage] The limit for 'number of commands per minute' has been exceeded.=[techage] Предел для 'количество команд в минуту' был исчерпан. -is allowed=разрешен -is allowed. Current value is=разрешен. Ваше текущее значение -per minute=в минуту - -### cylinder.lua ### - -TA2 Cylinder=TA2 Цилиндр - -### detector.lua ### - -Counts down the number of items passed through@nand only triggers an 'on' command when it reaches zero.=Считает количество проходящих предметов@nи включается когда количество достигает нуля. -Current countdown=Кол-во предметов которое должно пройти -Current countdown value.=Кол-во прошедших предметов -TA4 Collider Detector=TA4 Детектор коллайдера -TA4 Collider Detector Core=TA4 Ядро детектора коллайдера -TA4 Detector=TA4 Детектор - -### detector.lua ### -### electricmeter.lua ### - -Countdown=Кол-во электроэнергии которое должно передаться - -### detector.lua ### -### logic_block.lua ### -### tele.lua ### - -Blocking Time=Время блокировки - -### detector.lua ### -### tele.lua ### - -Configured Items=Настроенные предметы -Items which generate an 'on' command.@nIf empty, all passed items generate an 'on' command.=Предметы, которые генерируют команду 'on' (включить).@nЕсли пусто, все прошедшие предметы генерируют команду 'on'. -On Time=Вовремя -TA3 Detector=TA3 Детектор -The time after the 'off' command@nuntil the next 'on' command is accepted.=Время после команды 'off' до приема следующей команды 'on'. -The time between the 'on' and 'off' commands.=Промежуток времени между командами 'on' (включить) и 'off' (выключить). - -### display.lua ### - -Display no: =Номер дисплея: -TA4 Display=TA4 Экран -TA4 Display XL=TA4 Экран XL - -### distiller.lua ### - -TA3 Distillation Tower 1=TA3 Дистилляционная башня 1 -TA3 Distillation Tower 2=TA3 Дистилляционная башня 2 -TA3 Distillation Tower 3=TA3 Дистилляционная башня 3 -TA3 Distillation Tower 4=TA3 Дистилляционная башня 4 -TA3 Distillation Tower Base=TA3 Основание дистилляционной башни - -### distributor.lua ### - -Block configured items for open ports=Заблокировать предметы настроенные для открытых портов -Distributor=Распределитель -High Performance Distributor=Высокопроизводительный распределитель -Input=Ввод -blocking mode=блокирующий режим - -### doorblock.lua ### - -TechAge Door Block=Techage Блок двери - -### doorcontroller.lua ### - -Insert door/gate block number(s)=Введите номер(а) блок(а/ов) двер(и/ей)/ворот -TA3 Door Controller=TA3 Контроллер двери - -### doorcontroller2.lua ### - -Blocks exchanged=Блоки перемещены -Blocks reset=Переустановить блоки -Click on all the blocks that are part of the door/gate=Нажмите на все блоки которые являются частью двери/ворот -Ctrl,Inv=Контроль,Инвентарь -Exchange=Обмен -TA3 Door Controller II=TA3 Контроллер двери -with door sound=с звуком двери - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### node_detector.lua ### -### turncontroller.lua ### - -Done=Готово -Record=Записать -block positions are stored.=позиции блоков сохранены. - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### turncontroller.lua ### - -Recording...=Запись... - -### doorcontroller2.lua ### -### movecontroller.lua ### - -Reset=Переустановить - -### drillbox.lua ### - -Build derrick=Построить буровую вышку -Depth=Глубина -Drill Bit=Сверло для бурения -Drill area is protected=Зона бурения защищена -Drill bits missing=Сверла для бурения отсутствуют -Oil Drill Box=Коробка для бурения нефтяных скважин -Remove derrick=Удалить буровую вышку -item output blocked=выход предмета заблокирован - -### drive_axle.lua ### - -TA2 Drive Axle=TA2 Вал - -### electric_cable.lua ### - -TA Electric Cable=TA Кабель - -### electricmeter.lua ### - -Amount of power to be provided before the device turns off=Количество энергии которое должно быть подано до выключения устройства -Consumption=Потребление -Power countdown=Кол-во электроэнергии которое должно пройти -TA4 Electric Meter=TA4 Счетчик электроэнергии - -### electricmeter.lua ### -### formspecs.lua ### -### transformer.lua ### - -Power=Энергия - -### electricmeter.lua ### -### transformer.lua ### - -Max. power=Максимальная мощность -Maximum power passed through=Максимальная мощность прошедшая через - -### electrolyzer.lua ### - -Configurable value@nfor the current limit=Настраиваемое значение@nдля текущего лимита -Current limitation=Текущие ограничения -Electrolyzer=Электролизер -If the charge of the storage@nsystem falls below the configured value,@nthe block switches off=Если заряд в хранилище@nпадает ниже указанной точки то@nблок выключается -Maximum possible@ncurrent consumption=Максимально возможное@nпотребление тока -Maximum power consumption [ku]=Максимальное потребление энергии [кВт] -Storage full=Хранилище заполнено -TA4 Electrolyzer=TA4 Электролизер -Turnoff point=Точка выключения -Turnoff point reached=Достигнута точка выключения - -### electrolyzer.lua ### -### fuelcell.lua ### -### tiny_generator.lua ### - -Electricity=Электричество - -### electronic.lua ### - -TA3 Vacuum Tube=TA3 Вакуумная труба -TA4 LEDs=TA4 Светодиоды -TA4 RAM Chip=TA4 ОЗУ-микросхема -TA4 WLAN Chip=TA4 WLAN-микросхема -TA5 AI Chip=TA5 ИИ-микросхема -TA5 AI Chip II=TA5 ИИ-микросхема II -WLAN Chip=WLAN-микросхема - -### electronic_fab.lua ### - -Electronic Fab=Фабрика электроники -TA2 Ele Fab=TA2 Фабрика электроники -TA3 Ele Fab=TA3 Фабрика электроники -TA4 Ele Fab=TA4 Фабрика электроники - -### end_wrench.lua ### - -Biome=Биом -Node owner=Владелец ноды -Position=Местоположение -Position temperature=Температура местоположения -Pump connected to no/empty tank(s).=Насос (не) присоединен к пустому резервуар(у/ам). -Pump connected to tank(s) with: @1=Насос присоединен к резервуар(у/ам) с: @1 -TechAge Info Tool (use @= read status info)=Techage Информационный инструмент(используй @= чтобы прочитать информацию о статусе) - -### end_wrench.lua ### -### meltingpot.lua ### - -Time=Время - -### epoxy.lua ### - -Epoxide Resin=Эпоксидная смола -Epoxide Resin Barrel=Бочка эпоксидной смолы -Epoxide Resin Canister=Канистра эпоксидной смолы - -### explore.lua ### - -Oil=Нефть -TA3 Oil Explorer=TA3 Нефтяной радар -TA3 Oil Storage=TA3 Хранилище нефти -depth=глубина - -### filler.lua ### - -Liquid Filler=Заполнитель жидкостью -TA Liquid Filler=TA Заполнитель жидкостью - -### firebox.lua ### - -TA2 Firebox=TA5 Топка -TA3 Coal Power Station Firebox=TA3 Топка использующая уголь для генерации электроэнергии -TA3 Furnace Oil Burner=TA3 Масляная горелка печи -TA3 Power Station Firebox=TA3 Топка для генерации электроэнергии - -### firebox_lib.lua ### - -Firebox=Топка - -### flipflop.lua ### - -TA3 Flip-Flop=TA3 Триггер - -### fly_lib.lua ### - -Destination position is protected=Пункт назначения защищен -Error: Max. length of the flight route exceeded by @1 blocks !!=Ошибка: Максимальная длина траектории полета ограничена @1 блоками !! -No valid destination position=Нет правильного пункта назначения -No valid node at the start position=Неправильная нода на начальном местоположении -No valid start position=Неправильное начальное местоположение -Running=Работает -Start position is protected=Начальное местоположение защищено -Stopped=Остановлено - -### fly_lib.lua ### -### flycontroller.lua ### - -Error: Invalid path !!=Ошибка: неверный путь !! - -### flycontroller.lua ### - -Error: Recording is missing !!=Ошибка: Запись отсутствует!! -Flight route (A to B)=Траектория полета (из A в Б) -Move a player without moving blocks=Сдвинуть игрока не сдвигая блоки -See chat output=Выводить чат -TA5 Fly Controller=TA5 Контроллер полета -Teleport mode=Режим телепорта -Test=Протестировать -[TA4 Fly Controller] Invalid path!=[TA4 Контроллер полета] Неправильный путь! -[TA4 Fly Controller] Recording is missing!=[TA4 Контроллер полета] Запись отсутствует! - -### flycontroller.lua ### -### logic_block.lua ### -### lua_logic.lua ### -### movecontroller.lua ### - -Store=Записать - -### flycontroller.lua ### -### movecontroller.lua ### - -Click on all blocks that shall be moved=Нажмите на все блоки которые должны быть передвинуты -Maximum Speed=Максимальная скорость -Maximum speed for moving blocks=Максимальная скорость движущихся блоков -Move=Переместить -Move A-B=Переместить из А в Б -Move B-A=Переместить из Б в А -Move block height=Высота перемещения блока -Object offset=Смещение объекта -Stored=Записано -Value in the range of 0.0 to 1.0=Число в диапазоне от 0.0 до 1.0 -Y-offset for non-player objects like vehicles (-0.5 to 0.5)=Смещение по оси Y для не игровых объектов таких как велосипед (от -0.5 до 0.5) - -### flywheel.lua ### - -Flywheel=Маховик -TA2 Flywheel=TA2 Маховик - -### forceload.lua ### - -Area already loaded or max. number of Forceload Blocks reached!=Зона уже загружена или достигнуто максимальное количество блоков загрузки! -List of your Forceload Blocks:=Список ваших блоков загрузки: -Punch the block to make the area visible.=Ударьте блок, что бы сделать зону видимой. -Show all forceload blocks in a 64x64x64 range=Показать все блоки загрузки в диапазоне 64x64x64. -Techage Forceload Block=Techage Блок загрузки -Techage Forceload Tile=Techage Плитка загрузки -loaded=загружено - -### formspecs.lua ### - -Block has a wrench menu=У блока есть меню для гаечного ключа -Charge termination=Прекращение зарядки -Current output [ku]=Текущий выходной ток [кВт] -Maximum output [ku]=Максимальный выходной ток [кВт] -Range in which the generator reduces its power=Диапазон в котором генератор уменьшает свою мощность -The current power the generator provides=Текущая мощность генератора позволяет -The maximum power the generator can provide=Максимальная мощность генератора может позволить - -### formspecs.lua ### -### power_terminal2.lua ### - -Charging=Зарядка - -### formspecs.lua ### -### power_terminal2.lua ### -### storage.lua ### -### transformer.lua ### - -Storage=Хранилище - -### fuel_lib.lua ### - -Fuel Menu=Меню топлива -To add fuel punch@nthis block@nwith a fuel container=Что бы добавить топливо ударьте@nэтот блок@nконтейнером с топливом - -### fuelcell.lua ### - -Fuel Cell=Ячейка с топливом -TA4 Fuel Cell=TA4 Ячейка с топливом -no hydrogen=нет водорода - -### fuelcellstack.lua ### - -TA4 Fuel Cell Stack=TA4 Блок топливных элементов - -### furnace_top.lua ### - -Furnace Top=Верхняя часть печи -Outp=Результат -no fuel or no power=нет топлива или нет энергии - -### gas_pipe.lua ### - -TA5 Junction Pipe=TA5 Распределительная труба -TA5 Pipe=TA5 Труба - -### gateblock.lua ### - -TechAge Gate Block=TechAge блок ворот - -### gaze_sensor.lua ### - -Command to send when sensor is no longer viewed=Команда, которая будет отправлена когда сенсор окажется вне зоны видимости -Command to send when sensor is viewed=Команда, которая отправится когда сенсор будет в зоне видимости -Input the player name(s) separated by blanks.@nIf empty, only the owner is accepted.=Введите им(я/ена) игроков разделенные пробелами.@nЕсли пусто, то только владельцу сервера разрешено. -Player Names=Имена игроков -TA4 Gaze Sensor=TA4 Сенсор взгляда - -### gearbox.lua ### - -TA2 Gearbox=TA2 Коробка передач - -### generator.lua ### - -TA3 Generator=TA3 Генератор -TA4 Generator=TA4 Генератор -TA5 Generator=TA5 Генератор -no steam=нет пара - -### generator.lua ### -### power_terminal2.lua ### - -Generator=Генератор - -### gravelrinser.lua ### - -Gravel Rinser=Промыватель гравия -Rinsing=Промывание - -### gravelsieve.lua ### - -Compressed Gravel=Сжатый гравий -Gravel Sieve=Сито для гравия -Sieved Gravel=Просеянный гравий -TA1 Gravel Sieve=TA1 Сито для гравия -TA2 Gravel Sieve=TA2 Сито для гравия -TA3 Gravel Sieve=TA3 Сито для гравия -TA4 Gravel Sieve=TA4 Сито для гравия - -### grinder.lua ### - -Grinder=Измельчитель -Grinding=Измельчение -Milling=Помол -TA1 Mill Base=TA1 Основание мельницы - -### growlight.lua ### - -TA4 LED Grow Light=TA4 Светодиодная лампа для выращивания - -### hammer.lua ### - -TA1 Bronze Hammer (smash stone to gravel)=TA1 Бронзовый молот (переделывает камень в гравий) -TA1 Diamond Hammer (smash stone to gravel)=TA1 Алмазный молот (переделывает камень в гравий) -TA1 Meridium Hammer (smash stone to gravel)=TA1 Меридиемувый молот (переделывает камень в гравий) -TA1 Mese Hammer (smash stone to gravel)=TA1 Месеиевый молот (переделывает камень в гравий) -TA1 Steel Hammer (smash stone to gravel)=TA1 Стальной молот (переделывает камень в гравий) -TA1 Stone Hammer (smash stone to gravel)=TA1 Каменный молот (переделывает камень в гравий) - -### heater.lua ### - -TA4 Furnace Heater=TA4 Нагреватель печи - -### heatexchanger1.lua ### - -TA4 Heat Exchanger 1=TA4 Теплообменник 1 -TA5 Heat Exchanger 1=TA5 Теплообменник 1 - -### heatexchanger2.lua ### - - Error!= Ошибка! -Blue pipe connection error@n(@1 found / @2 expected)=Ошибка соединения синей трубы @n (@1 найдено из @2) -Blue pipe coolant missing@n(@1 found / @2 expected)=Отсутствует охладитель синей трубы @n (@1 найдено из @2) -Cooler error=Ошибка охладителя -Green pipe connection error@n(@1 found / @2 expected)=Ошибка соединения зеленой трубы @n (@1 найдено из @2) -Green pipe coolant missing@n(@1 found / @2 expected)=Отсутствует охладитель зеленой трубы @n (@1 найдено из @2) -Power network connection error=Ошибка соединения электрической сети -TA4 Heat Exchanger=TA4 Теплообменник -TA4 Heat Exchanger 2=TA4 Теплообменник 2 -TA5 Heat Exchanger 2=TA5 Теплообменник 2 -Turbine error=Ошибка турбины -did you check the plan?=вы проверили чертеж? -inlet/pipe error=ошибка входной/обычной трубы -wrong storage diameter=неправильный диаметр хранилища - -### heatexchanger3.lua ### - -TA4 Heat Exchanger 3=TA4 Теплообменник 3 -TA5 Heat Exchanger 3=TA5 Теплообменник 3 - -### hydrogen.lua ### - -Hydrogen Cylinder Large=Большой цилиндр с водородом -Hydrogen Cylinder Small=Маленький цилиндр с водородом -TA4 Hydrogen=TA4 Водород - -### hyperloop.lua ### -### sensorchest.lua ### -### teleport.lua ### - -not connected=не соединен - -### hyperloop.lua ### -### teleport.lua ### - -Block name=Название блока -Connection name for this block=Имя соединения для этого блока -Connection name of the remote block=Имя соединения для этого удаленного блока -Enter a block name or select an existing one=Введите имя блока или выберите уже существующий -Remote name=Удаленное имя -connected to=соединен к - -### industriallamp1.lua ### - -TA Industrial Lamp 1=TA Промышленный светильник 1 - -### industriallamp2.lua ### - -TA Industrial Lamp 2=TA Промышленный светильник 2 - -### industriallamp3.lua ### - -TA Industrial Lamp 3=TA Промышленный светильник 3 - -### industriallamp4.lua ### - -TA4 LED Industrial Lamp=TA4 Светодиодный промышленный светильник - -### inlet.lua ### - -TA4 Pipe Inlet=TA4 Входная труба -one window maximum=одно окно максимум -wrong diameter (should be 5, 7, or 9)=неправильный диаметр (должен быть 5, 7, или 9) -wrong number of gravel nodes=неправильное количество блоков гравия -wrong number of shell nodes=неправильное количество блоков оболочки - -### inlets.lua ### - -TA4 Collider Cable Input=TA4 Входной кабель коллайдера -TA4 Collider Pipe Input=TA4 Входная труба коллайдера -TA4 Collider Pipe Output=TA4 Выходная труба коллайдера -TA4 Collider Tube Input=TA4 Большая входная труба - -### inverter.lua ### - -Inverter=Инвертор -Power AC=Энергия переменного тока -Power DC=Энергия постоянного тока -TA4 Solar Inverter=TA4 Солнечный инвертор -no solar power=нет солнечной энергии -solar network error=ошибка электрической сети солнечной энергии - -### junctionbox.lua ### - -TA Electric Junction Box=TA Электрическая распределительная коробка - -### lampholder.lua ### - -TA Lamp Holder Acacia=TA Акациевый держатель для лампы -TA Lamp Holder Apple=TA Яблоневый держатель для лампы -TA Lamp Holder Aspen=TA Осиновый держатель для лампы -TA Lamp Holder Copper=TA Медный держатель для лампы -TA Lamp Holder Gold=TA Золотой держатель для лампы -TA Lamp Holder White=TA Белый держатель для лампы - -### laser.lua ### - -Laser beam error!=Ошибка лазерного луча! -TA4 Laser Beam Emitter=TA4 Излучатель лазера -TA4 Laser Beam Receiver=TA4 Приемник лазерного луча -Valid destination positions:=Правильные места назначения: -to=в - -### lib.lua ### - -Block has an@nadditional wrench menu=У блока есть@nдополнительное меню для гаечного ключа - -### lib.lua ### -### sensorchest.lua ### - -connected with=соединен с - -### light_detector.lua ### - -Send signal if light level is above:=Отправить сигнал если уровень света выше: -TA3 Light Detector=TA3 Детектор света - -### lighter.lua ### - -TA1 Lighter=TA1 Заготовка для розжига - -### liquid_lib.lua ### - -Allow public access to the tank=Разрешить публичный доступ к резервуару -Liquid Tank=Резервур для жидкости -To add liquids punch@nthe tank@nwith a liquid container=Чтобы добавить жидкость, ударьте@nрезервуар@nс резервуаром - -### liquid_lib.lua ### -### ta4_chest.lua ### - -keep assignment=сохранить расположение - -### liquid_pipe.lua ### - -TA Junction Pipe=TA Распределительная труба -TA Pipe=TA Труба - -### liquidsampler.lua ### - -Liquid Sampler=Сборщик воды - -### liquidsampler.lua ### -### waterpump.lua ### - -no usable water=нет используемой воды - -### logic_block.lua ### - -'me' has to be used for the own block number.@n='me' должно быть использовано для собственного номера блока.@n -'~@=' means: not equal@n='~@=' означает: не равно -@n is a boolean expression@nwhere input numbers are evaluated.@n=@n<введенное-выражение> это булево выражение@nв котором проверяются выражение с числами. -@n is the block number to which the@ncommand should be sent.@n=@n<вывод> это номер блока в который@nкоманда должна быть отправлена. -@nAll rules are checked with each received@ncommand.=@nВсе правила проверяются у каждой введенной@nкоманды. -@nExamples:@n1234 @=@= on@n1234 @=@= off@n1234 @=@= on and 2345 @=@= off@n2345 ~@= 3456@n=@nПримеры: @n1234 @=@= on@n1234 @=@= off@n1234 on and 2345 @=@= off@n2345 ~@= 3456@n=@n -@nRule:@n @= on/off if is true@n=@nПравило:@n<вывод> @= on/off если <введенное-выражение> истинно=@n -@nThe internal processing time for all@ncommands is 100 ms.=@nВнутреннее время обработки всех@nкоманд это 100 миллисекунд. -@nValid operators:@nand or on off me @=@= ~@= ( )@n=@nКорректные операторы:@nand or on off me @=@= ~@= ()@n -Clear=Очистить -Debug=Отладить -Inputs=Вводы -Outputs=Выводы -Rules=Правила -Send an 'on'/'off' command if the@nexpression becomes true.@n=Отправить 'on'/'off' команды если@nвыражение истинно.@n -Syntax=Синтаксис - -### logic_block.lua ### -### lua_logic.lua ### - -TA3 Logic Block=TA3 Логический блок -Update=Обновить - -### logic_block.lua ### -### sequencer2.lua ### - -Help=Помощь - -### lye.lua ### - -Lye=Щелочь -Lye Barrel=Бочка с щелочью -Lye Canister=Канистра с щелочью - -### magnet.lua ### - -TA4 Collider Detector Magnet=TA4 Детектор магнита коллайдера -TA4 Collider Magnet=TA4 Магнит коллайдера -TA4 Collider Magnet Base=TA4 Основание магнита коллайдера -TA4 Collider Steel Block=TA4 Стальной блок коллайдера -TA5 Fusion Reactor Magnet 1=TA5 Магнит ядерного реактора 1 -TA5 Fusion Reactor Magnet 2=TA5 Магнит ядерного реактора 2 -TA5 Fusion Reactor Magnet Blank=TA5 Пустой магнит ядерного реактора -TA5 Fusion Reactor Magnet Shield=TA5 Щит магнита ядерного реактора - -### mba_detector.lua ### - -TA4 Mapblock Active Detector=TA4 Активный детектор блоков карты - -### meltingpot.lua ### - -Heat=Тепло -Melting Guide=Руководство по плавке -Melting Pot active (heat@==Тигель активный (тепло@== -Melting Pot inactive (heat@==Тигель неактивный (тепло@== -Melting Pot inactive (heat@=0)=Тигель неактивный (тепло@=0) -Menu=Меню -Menu,Recipes=Меню,Рецепты -TA1 Burning=TA1 Горение -TA1 Melting=TA1 Плавление -TA1 Melting Pot=TA1 Тигель - -### meridium.lua ### - -Meridium Axe=Меридиемувый топор -Meridium Pickaxe=Меридиемувая кирка -Meridium Shovel=Меридиемувая лопата -Meridium Sword=Меридиемувый меч - -### mesecons_converter.lua ### - -TA3 Mesecons Converter=TA3 Mesecons конвертер - -### mill.lua ### - -TA1 Mill=TA1 Мельница -TA1 Mill Gear=TA1 Шестеренка Мельницы - -### millboard.lua ### - -TA1 Acacia Millrace Board=TA1 Акациевая доска для мельницы -TA1 Acacia Wood Board=TA1 Акациевая доска -TA1 Apple Millrace Board=TA1 Яблоневая доска для мельницы -TA1 Apple Wood Board=TA1 Яблоневая доска -TA1 Aspen Millrace Board=TA1 Осиновая доска для мельницы -TA1 Aspen Wood Board=TA1 Осиновая доска -TA1 Jungle Millrace Board=TA1 Доска для мельницы из тропического дерева -TA1 Jungle Wood Board=TA1 Доска тропического дерева -TA1 Pine Millrace Board=TA1 Сосновая доска для мельницы -TA1 Pine Wood Board=TA1 Сосновая доска - -### minicell.lua ### - -TA4 Streetlamp Solar Cell=TA4 Солнечная панель для уличного светильника - -### minichest.lua ### - -Test Chest=Тестовый сундук - -### minitank.lua ### - -Test Mini Tank=Тестовый мини резервуар - -### movecontroller.lua ### - -Error: Invalid distance !!=Ошибка: Неправильное расстояние!! -Move distance=Расстояние перемещения -Move distance (A to B)=Расстояние перемещения (из А в Б) -Operational mode=Рабочий режим -Switch to the remote controlled 'move xyz' mode=Переключиться в режим 'move xyz' -TA Rack and Pinion=TA Реечная передача -TA4 Move Controller=TA4 Контроллер движения - -### node_detector.lua ### - -Click on all blocks whose positions should be checked=Нажмите на все блоки позиция которых должна быть проверена -Send signal if nodes have been:=Отправьте сигнал если: -TA3 Node Detector=TA3 Детектор нод -TA4 Node Detector=TA4 Детектор нод -added=добавлено -added or removed=добавлено или удалено -removed=удалено - -### nodes.lua ### - -TechAge Gravel=TechAge Гравий - -### oil.lua ### - -Flowing Oil=Текущая нефть -Oil Source=Источник нефти -TA3 Oil Barrel=TA3 Бочка нефти -TA3 Oil Canister=TA3 Канистра нефти - -### oilfirebox.lua ### - -TA3 Power Station Oil Burner=TA3 Нефтяная горелка для электростанции - -### petroleum.lua ### - -Isobutane Cylinder Large=Большой баллон с изобутаном -Isobutane Cylinder Small=Маленький баллон с изобутаном -Propane Cylinder Large=Большой баллон с пропаном -Propane Cylinder Small=Маленький баллон с пропаном -TA3 Bitumen=TA3 Битум -TA3 Bitumen Barrel=TA3 Бочка с битумом -TA3 Bitumen Canister=TA3 Канистра с битумом -TA3 Fuel Oil=TA3 Мазут -TA3 Fuel Oil Barrel=TA3 Бочка с мазутом -TA3 Fuel Oil Canister=TA3 Канистра с мазутом -TA3 Gasoline=TA3 Бензин -TA3 Gasoline Barrel=TA3 Бочка с бензином -TA3 Gasoline Canister=TA3 Канистра с бензином -TA3 Naphtha=TA3 Лигроин -TA3 Naphtha Barrel=TA3 Бочка с лигроином -TA3 Naphtha Canister=TA3 Канистра с лигроином -TA3 Propane=TA3 Пропан -TA4 Isobutane=TA3 Изобутан - -### pillar.lua ### - -TA4 Pillar=TA4 Колонна - -### pipe_wall_entry.lua ### - -TA3 Pipe Wall Entry=TA3 Входная стена с трубой - -### pipe_wrench.lua ### - -TA3 Drill Pipe Wrench=TA3 Гаечный ключ для сверла для бурения - -### plastic.lua ### - -Plastic Granules=Пластиковые гранулы - -### player_detector.lua ### - -Command to send when player is detected=Команда, которая отправится когда игрок будет замечен -Command to send when player moves away=Команда, которая отправится когда игрок будет двигаться -Radius=Радиус -Search radius=Радиус поиска -TA4 Player Detector=TA4 Детектор игрока - -### powder.lua ### - -Aluminum Powder=Алюминиевый порошок -Clay Powder=Глиняный порошок -Graphite Powder=Графитовый порошок -Iron Powder=Железный порошок -Leave Powder=Порошок из листьев -Needle Powder=Хвойный порошок -Silver Sandstone Powder=Порошок из серебряного песка - -### power2axle.lua ### - -TA3 Electric Motor=TA3 Мотор - -### power_line.lua ### - -TA Power Line=TA Линия электропередач -TA Power Pole=TA Опора ЛЭП -TA Power Pole Top (for up to 6 connections)=TA Верхняя часть опоры ЛЭП (больше 6 соединений) -TA Power Pole Top 2 (for landlines)=TA Верхняя часть опоры ЛЭП (для воздушных линий) - -### power_terminal2.lua ### - -Commands@nhelp . . . print this text@ncls . . . . clear screen@ngen . . print generators@nsto . . print storage systems@ncon1 . . print consumers with power consumption between 1 and 10 ku@ncon2 . . print consumers with power consumption with 10 ku or above@n=Команды@nhelp печатает этот текст@ncls очищает экран@ngen выводит генераторы источников энергии@nsto выводит системы хранения@ncon1 выводит потребителей электроэнергии потребляющих от 1 до 10 кВт@ncon2 выводит потребителей электроэнергии потребляющих 10 кВт или больше@n -Consumer=Потребитель -Network Data=Информация о электрической сети -Number of consumers:=Количество потребителей: -Number of generators:=Количество генераторов: -Number of network nodes:=Количество нод электрической сети: -Number of storage systems:=Количество хранилищ: -TA3 Power Terminal=TA3 Терминал электроэнергии - -### power_terminal2.lua ### -### terminal.lua ### - -Enter=Ввести - -### powerswitch.lua ### - -TA Power Switch=TA Выключатель -TA Power Switch Small=TA Маленький выключатель - -### powerswitchbox.lua ### -### powerswitchbox_legacy.lua ### - -TA Power Switch Box=TA Коробка выключателей - -### programmer.lua ### - -TechAge Programmer (right @= read number, left @= write numbers)=TechAge Программист (ПКМ @= прочитать число, ЛКМ написать числа) -[TechAge Programmer] Error: invalid numbers!=[TechAge Программист] Ошибка: неправильные числа! -[TechAge Programmer] Error: programmer not supported!=[TechAge Программист] Ошибка: программист не поддерживается! -[TechAge Programmer] Unknown node on=[TechAge Программист] Неизвестная нода включена -[TechAge Programmer] foreign or unknown node!=[TechAge Программст] незнакомая или неизвестная нода! -[TechAge Programmer] node programmed!=[TechAge Программист] нода запрограммирована! -[TechAge Programmer] number=[TechAge Программист] номер -[TechAge Programmer] programmer reset=[TechAge Программист] сбросить настройки программиста - -### protection.lua ### - -Allow to dig/place Techage power lines nearby power poles=Разрешить копать/ставить Techage линии электропередач недалеко от опор ЛЭП - -### pump.lua ### - -Number of liquid units that are allowed to be pumped=Количество жидкости которое можно высосать -Number of units=Количество единиц -TA3 Pump=TA3 Насос -TA4 Pump=TA4 Насос - -### pump.lua ### -### ta5_pump.lua ### - -Total flow rate=Общая скорость потока -Total flow rate in liquid units=Общая скорость потока в единицах измерения жидкости - -### pumpjack.lua ### - -Oil Pumpjack=Нефтяной -Oil amount=Количество нефти -Pumpjack=Насос -needs power=Нуждается в электроэнергии -no oil=нет нефти - -### pusher.lua ### - -Number of items=Количество предметов -Number of items that are allowed to be pushed=Количество предметов которое можно вытолкать -Optionally configure@nthe pusher with one item=Опционально настроить@nтолкатель на один предмет -Pusher=Толкатель - -### quarry.lua ### - -Digging depth=Глубина копания -Hole size=Глубина дыры -Quarry=Карьер -Start level=Начальный высота -Start level @= 0@nmeans the same level@nas the quarry is placed=Начальная высота @= 0@nозначает ту же высоту, что имеется у карьера -area is protected=зона защищена -finished=готово -inventory full=инвентарь заполнен - -### reboiler.lua ### - -TA3 Oil Reboiler=TA3 Нефтяной ребойлер - -### recipe_lib.lua ### -### recipeblock.lua ### - -Recipe=Рецепт - -### recipe_lib.lua ### -### ta4_reactor.lua ### - -Catalyst=Катализатор - -### recipeblock.lua ### - -TA4 Recipe Block=TA4 Блок рецепта - -### recipes.lua ### - -Flint and Iron=Кремень и железо -TA1 Iron Ingot=TA1 Железный слиток -[Bucket] Lava can only be placed below sea level!=[Ведро] Лава может быть расположена только ниже уровня моря! - -### recycler.lua ### - -Recycler=Переработчик - -### redstone.lua ### - -Red Stone=Красный камень -Red Stone Block=Блок красного камня -Red Stone Brick=Кирпич из красного камня - -### repeater.lua ### - -TA3 Repeater=TA3 Повторитель - -### rotor.lua ### - -Nacelle is missing=Гондола отсутствует -TA4 Carbon Fiber=TA4 Карбоновое волокно -TA4 Rotor Blade=TA4 Лопасти турбины -TA4 Wind Turbine=TA4 Ветряная турбина -TA4 Wind Turbine Nacelle=TA4 Гондола ветряной турбины отсутствует - -### screwdriver.lua ### - -Block alignment stored!=Расположение блока сохранено! -Techage Screwdriver@n(See: TA3 > Tools)=Techage отвертка@n(Посмотри TA3 > Инструменты) - -### sensorchest.lua ### - -Allow public chest access=Разрешить публичный доступ к сундуку -TA4 Sensor Chest=TA4 Сенсорный сундук - -### sequencer.lua ### - -TA3 Sequencer=TA3 Секвенсор - -### sequencer.lua ### -### sequencer2.lua ### - -stopped=остановлено - -### sequencer2.lua ### - - - 'goto ' (jump to another line)@n= - 'goto <номер>' (перепрыгнуть на другую строчку)@n - - 'nop' (do nothing)@n= - 'nop' (ничего не делать) - - 'send ' (techage command)@n= - 'send <номер ноды> - - 'stop' (stop the execution)@n= - 'stop' (останавливает выражение) - - 1 corresponds to 100 ms@n= - 1 соответствует 100 миллисекундам@n - - 50000 corresponds to 4 game days@n= - 50000 соответствует 4 игровым дням @n -'[] '@n='[<номер>] <команда>'@n - is one of the following:@n=<команда> что-то из следующего: - is a number from 1 to 50000 and is@n=<номер> это число в диапазоне от 1 до 50000 и это@n -@n=@n -Commands=Команды -Cycle time=Время цикла -Example:@n=Пример:@n -If 'yes' a received OFF command won't stop the sequencer=Если 'yes', то полученная OFF команда не остановит секвенсор -Ignore OFF command=Игнорировать команду OFF -Invalid command!=Неправильная команда -Start=Начать -Stop=Остановить -Syntax:@n=Синтаксис:@n -TA4 Sequencer=TA4 Секвенсор -Timer cycle time (default: 100 ms)=Таймер времени цикла (по умолчанию: 100 миллисекунд) -running=работает -the timeslot when the command is executed.@n=Временной интервал в течении которого выполняется команда.@n - -### sequencer2.lua ### -### submenu.lua ### - -Cancel=Отменить - -### shell.lua ### - -TA5 Fusion Reactor Nucleus=TA5 Ядро термоядерного реактора -TA5 Fusion Reactor Shell=TA5 Оболочка термоядерного реактора - -### signallamp.lua ### - -TA4 Wind Turbine Signal Lamp=TA4 Сигнальная лампа ветряной турбины -TechAge Color Lamp=TechAge Цветная лампа -TechAge Color Lamp 2=TechAge Цветная лампа 2 - -### signallamp_2x.lua ### - -TA4 2x Signal Lamp=TA4 2x Сигнальная лампа - -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label for the lamp=Ярлык для лампы - -### signallamp_4x.lua ### - -TA4 4x Signal Lamp=TA4 4x Сигнальная лампа - -### silicon.lua ### - -TA4 Silicon Wafer=TA4 Кремниевая пластина - -### silo.lua ### - -TA3 Silo=TA3 Хранилище сыпучих материалов -TA4 Silo=TA4 Хранилище сыпучих материалов - -### simplelamp.lua ### - -TA Lamp=TA Лампа - -### sluice.lua ### - -TA1 Sluice Gate=TA1 Ворота шлюза -TA1 Sluice Handle=TA1 Ручка для шлюза - -### solarcell.lua ### - -TA4 Solar Carrier Module=TA4 Держатель солнечной панели -TA4 Solar Carrier Module B=TA4 Держатель солнечной панели B -TA4 Solar Carrier Module T=TA4 Держатель солнечной панели T -TA4 Solar Module=TA4 Солнечная панель -light=свет - -### solarcell.lua ### -### source.lua ### - -power=энергия - -### soundblock.lua ### - -Play=играть -TA3 Sound Block=TA3 Нотный блок - -### source.lua ### - -Axle Power Source=Источник механической энергии -Ele Power Source=Источник электроэнергии -Power Source=Источник энергии -Test Generator=Тестовый генератор - -### steam_pipe.lua ### - -TA2 Steam Pipe=TA2 Труба для пара - -### steelmat.lua ### - -TechAge Steel Mat=Techage Сталь - -### storage.lua ### - -Test Storage=Тестовое хранилище - -### streetlamp.lua ### - -TA Street Lamp=TA Уличная лампа - -### streetlamp2.lua ### - -TA4 LED Street Lamp=TA4 Уличная светодиодная лампа -TA4 LED Street Lamp Arm=TA4 Кронштейн для уличной светодиодной лампы -TA4 LED Street Lamp Pole=TA4 Столб для уличной светодиодной лампы - -### submenu.lua ### - -Note: You can't change any values while the block is running!=Примечание: Вы не можете изменять какие-либо числа пока блок работает! -Refresh=Обновить - -### ta1_axle.lua ### - -TA1 Axle=TA1 Вал -TA1 Axle Bearing=TA1 Подшипник с валом - -### ta2_clutch.lua ### - -TA2 Clutch=TA2 Сцепление - -### ta2_weight_chest.lua ### - -TA2 Weight Chest=TA2 Сундук с грузом - -### ta2_winch.lua ### - -TA2 Winch=TA2 Лебедка - -### ta4_cable.lua ### - -TA4 Low Power Box=TA4 Распределительная коробка низкого напряжения -TA4 Low Power Cable=TA4 Кабель низкого напряжения - -### ta4_cable_wall_entry.lua ### - -TA4 Cable Wall Entry=TA4 Входная стена с кабелем - -### ta4_chest.lua ### - -Empty the slots always @nfrom right to left=Опустошайте слоты@nсправа налево -Never completely empty the slots@nwith the pusher to keep the item assignment=Никогда полностью не опустошайте слоты с помощью толкателя, чтобы не сбить расположение предметов -Size=Размер -TA4 8x2000 Chest=TA4 8x2000 Сундук -Unlock=Разблокировать -Unlock connected chest@nif all slots are below 2000=Разблокировать соединенный сундук@nесли во всех слотах меньше 2000 -right to left=справа налево - -### ta4_doser.lua ### - -Doser=Дозатор -TA4 Doser=TA4 Дозатор -catalyst missing=отсутствует катализатор -reactor defect=дефект реактора -reactor defect or no power=дефект реактора или нет энергии -reactor has no power=у реактора нет энергии -wrong catalyst=неправильный катализатор - -### ta4_doser.lua ### -### ta4_reactor.lua ### - -TA4 Reactor=TA4 Реактор - -### ta4_injector.lua ### - -Configure up to 8 items @nto be pushed by the injector=Выберите 8 предметов которые должен толкать инжектор -Injector=Инжектор -Switch to pull mode @nto pull items out of inventory slots @naccording the injector configuration=Переключитесь в режим извлечения,@nчто бы извлекать предметы из инвентаря в@nсоответствии настройками инжектора -pull mode=режим извлечения - -### ta4_liquid_filter.lua ### - -TA4 Liquid Filter Filler=TA4 Наполнитель жидкостных фильтров -TA4 Liquid Filter Sink=TA4 Жидкостный фильтр с формой раковины - -### ta4_reactor.lua ### - -TA4 Reactor Filler Pipe=TA4 Труба-наполнитель реактора - -### ta4_stand.lua ### - -TA4 Reactor Base=TA4 Основание реактора -TA4 Reactor Stand=TA4 Стенд для реактора -off=выключить -on=включить - -### ta4_stand.lua ### -### waterpump.lua ### - -no power=нет энергии - -### ta5_chest.lua ### - -TA5 Hyperloop Chest=TA5 Hyperloop сундук - -### ta5_pump.lua ### - -TA5 Pump=TA5 Насос - -### ta5_tank.lua ### - -TA5 Hyperloop Tank=TA5 Hyperloop Резервуар - -### tank.lua ### - -Oil Tank=Нефтяной резервуар -TA3 Tank=TA3 Резервуар -TA4 Tank=TA4 Резервуар - -### tank_cart.lua ### - -TA Tank Cart=TA Вагонетка с резервуаром - -### teleport.lua ### - -Connected=Соединен -Connection status=Статус соединения -Distance > @1 blocks=Расстояние > @1 блоков -Ex-points missing (@1 < @2)=Очки опыта отсутствуют (@1 < @2) -Status=Статус -server not connected=сервер не соединен - -### teleport_pipe.lua ### - -TA5 Teleport Block Liquids=TA5 Блок для телепортирования жидкостей - -### teleport_pipe.lua ### -### teleport_tube.lua ### - -Remote block error=Ошибка удаленного блока - -### teleport_tube.lua ### - -TA5 Teleport Block Items=TA5 Блок для телепортирования предметов - -### terminal.lua ### - -Syntax error, try help=Синтаксическая ошибка, попробуйте написать help -TA3 Terminal=TA3 Терминал -TA4 Terminal=TA4 Терминал -commands like: help=команды как: help - -### timer.lua ### - -TA3 Timer=TA3 Таймер - -### tiny_generator.lua ### - -TA3 Tiny Power Generator=TA3 Небольшой генератор энергии -Tiny Generator=Небольшой генератор -no fuel=нет топлива - -### tower.lua ### - -TA3 Derrick=TA3 Буровая вышка -TA3 Drill Pipe=TA3 Буровая труба -TA4 Derrick=TA4 Буровая вышка -[TA] Derrick is being built!=[TA] Буровая вышка построена! -[TA] Derrick is being removed!=[TA] Буровая вышка удалена! - -### transformer.lua ### - -TA4 Isolation Transformer=TA4 Изолирующий трансформатор - -### trowel.lua ### - -TechAge Trowel=TechAge Мастерок - -### tube_wall_entry.lua ### - -Tube Wall Entry=Входная стена с трубой - -### tubes.lua ### - -TechAge Tube=TechAge Труба - -### tubes_ta4.lua ### - -TA4 Tube=TA4 Труба - -### turbine.lua ### - -TA3 Turbine=TA3 Турбина -TA4 Turbine=TA4 Турбина -TA5 Turbine=TA5 Турбина - -### turncontroller.lua ### - -Click on all blocks that shall be turned=Нажмите на все блоки которые должны быть повернуты -TA4 Turn Controller=TA4 Контроллер движения -Turn left=Повернуть налево -Turn right=Повернуть направо - -### usmium.lua ### - -Usmium Nuggets=Усмиевые самородки -Usmium Powder=Усмиевый порошок - -### vacuumtube.lua ### - -TA4 Vacuum Tube=TA4 Вакуумная труба - -### valve.lua ### - -TA Valve=TA Вентиль -TA3 Valve=TA3 Вентиль - -### waterinlet.lua ### - -Error: No natural water!=Ошибка: Нет природной воды! -Error: No water available!=Ошибка: Нет доступной воды! -Error: Not on sea level!=Ошибка: Не на уровне моря! -Operational=Готов к работе -TA4 Water Inlet=TA4 Водозабор - -### watermill.lua ### - -TA1 Watermill=TA1 Водяное колесо - -### waterpump.lua ### - -TA4 Water Pump=TA4 Водяной насос -Water Pump=Водяной насос - -### windturbine_lib.lua ### - -Here is not enough water (41x41 m)!=Здесь недостаточно воды (41x41 м)! -Here is not enough wind@n(A free air space of 41x41x21 m is necessary)!=Здесь недостаточно ветра@n(необходимо 41x41x21 м свободного воздушного пространства)! -The next wind turbines is too close!=Следующая ветряная турбина слишком близко! -This is a=Это -This is no ocean water!=Это не океанская вода! -This is not the surface of the ocean!=Это не поверхность океана! -[TA4 Wind Turbine]=[TA4 Ветряная турбина] -biome and no ocean!=биом и не океан! -is a suitable place for a wind turbine!=подходящее место для ветряной турбины! - -### worker.lua ### - -Build detector=Детектор строительства -Item list=Список предметов -Remove detector=Детектор удаления -TA4 Collider Detector Worker=TA4 Построитель детектора коллайдера -[TA4] Detector is being built!=[TA4] Детектор был построен! -[TA4] Detector is being removed!=[TA4] Детектор был удален! diff --git a/techage/locale/template.txt b/techage/locale/template.txt deleted file mode 100644 index 2b6be2c..0000000 --- a/techage/locale/template.txt +++ /dev/null @@ -1,1579 +0,0 @@ -# textdomain: techage - - - -### akkubox.lua ### - -TA3 Accu Box= - -### aluminium.lua ### - -Aluminum= -Gibbsite Powder= -Red Mud= -Red Mud Barrel= -Red Mud Canister= - -### assemble.lua ### -### firebox_lib.lua ### - -[TA] Area is protected!= -[TA] Not enough space!= - -### assembly_tool.lua ### - -TechAge Assembly Tool= - -### autocrafter.lua ### - -Autocrafter= - -### axle2power.lua ### - -TA2 Power Generator= - -### baborium.lua ### - -Baborium Ingot= -Baborium Lump= -Baborium Ore= - -### barrel.lua ### - -Gas Cylinder Large= -Gas Cylinder Small= -River Water Barrel= -TA Empty Barrel= -TA3 Canister= -Water= -Water Barrel= -empty= - -### basalt.lua ### - -Basalt Cobble= -Basalt Glass= -Basalt Glass 2= -Basalt Glass Thin= -Basalt Glass Thin 2= -Basalt Glass Thin XL= -Basalt Glass Thin XL 2= -Basalt Gravel= -Basalt Stone= -Basalt Stone Block= -Basalt Stone Brick= -Sieved Basalt Gravel= - -### battery.lua ### - -Battery= -Coal Equivalents= -Digtron Battery= - -### battery.lua ### -### storage.lua ### - -Load= - -### bauxit.lua ### - -Bauxite Cobblestone= -Bauxite Gravel= -Bauxite Powder= -Bauxite Stone= - -### blackhole.lua ### - -TechAge Black Hole= -TechAge Black Hole (let items and liquids disappear)= - -### boiler.lua ### - -TA2 Boiler Base= -TA2 Boiler Top= - -### boiler_base.lua ### - -TA3 Boiler Base= - -### boiler_lib.lua ### - -To add water punch@nthe boiler@nwith a water bucket= -Water Boiler= - -### boiler_lib.lua ### -### heatexchanger2.lua ### - -water temperature= - -### boiler_top.lua ### - -TA3 Boiler Top= - -### booster.lua ### - -TA3 Booster= - -### button.lua ### - -Access:= -Button or switch= -Change the block name (infotext)= -Command to be sent= -Infotext= -TA3 Button/Switch= -TA4 Button/Switch= - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### - -Access= -Button protection= -Type= - -### button.lua ### -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### gaze_sensor.lua ### -### player_detector.lua ### - -Command= -Number= - -### button.lua ### -### cart_detector.lua ### -### command_converter.lua ### -### detector.lua ### -### flipflop.lua ### -### light_detector.lua ### -### lua_logic.lua ### -### mesecons_converter.lua ### -### node_detector.lua ### -### player_detector.lua ### -### repeater.lua ### - -Insert destination node number(s)= - -### button.lua ### -### chest.lua ### -### command_converter.lua ### -### detector.lua ### -### doorcontroller.lua ### -### flipflop.lua ### -### mesecons_converter.lua ### -### repeater.lua ### -### sequencer2.lua ### -### submenu.lua ### - -Save= - -### button.lua ### -### gaze_sensor.lua ### - -Destination block number(s)= - -### button_2x.lua ### - -TA4 2x Button= - -### button_2x.lua ### -### button_4x.lua ### - -Command to be sent (ignored for switches)= -Label for the button= -Momentary button or on/off switch= - -### button_2x.lua ### -### button_4x.lua ### -### charge_detector.lua ### -### player_detector.lua ### - -Destination block number= - -### button_2x.lua ### -### button_4x.lua ### -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label= - -### button_4x.lua ### - -TA4 4x Button= - -### cart_detector.lua ### - -TA3 Cart Detector= - -### cart_detector.lua ### -### light_detector.lua ### -### node_detector.lua ### - -accept= - -### cart_detector.lua ### -### player_detector.lua ### - -TA3 Player Detector= - -### ceilinglamp.lua ### - -TA Ceiling Lamp= - -### cement.lua ### - -Cement Block= -Cement Powder= - -### ceramic.lua ### - -TA4 Ceramic Material= -TA4 Furnace Ceramic= -TA4 Round Ceramic= -TA5 Ceramic Turbine= - -### charcoalpile.lua ### - -Dirt with Ash= -TA1 Charcoal= - -### charge_detector.lua ### - -Command to send when the energy storage charge@nlevel falls below the specified switch point= -Command to send when the energy storage charge@nlevel rises above the specified switch point= -Storage charge level switch point= -Switch point= -TA4 Energy Storage Charge Detector= - -### chest.lua ### - -Allow public access to the chest= -Inventory,Pre-Assignment,Config= -Node label:= -TA2 Protected Chest= -TA3 Protected Chest= -TA4 Protected Chest= - -### chest_cart.lua ### - -TA Chest Cart= - -### coalburner.lua ### - -Ash= - -### collector.lua ### - -Node number to send the events to= -Node numbers to read the states from= -Send an event if state is equal or larger than= -TA4 State Collector= - -### command_converter.lua ### - -Receive= -Send delay (s)= -Sent command= -TA3 Command Converter= - -### concentrator.lua ### - -TA4 Tube Concentrator= -Tube Concentrator= - -### controller.lua ### - -Cooling failed= -Magnet detection error@n(@1% found / 100% expected)= -Nucleus detection error= -Plasma ring shape error= -Shell shape error@n(@1% found / 100% expected)= -TA5 Fusion Reactor Controller= - -### controller.lua ### -### heatexchanger2.lua ### - -No power= - -### cooking.lua ### - -TA3 Melting= - -### cooler.lua ### - -TA3 Cooler= -TA4 Collider Cooler= - -### counting.lua ### - -Your current value is= -[techage] The limit for 'number of commands per minute' has been exceeded.= -is allowed= -is allowed. Current value is= -per minute= - -### cylinder.lua ### - -TA2 Cylinder= - -### detector.lua ### - -Counts down the number of items passed through@nand only triggers an 'on' command when it reaches zero.= -Current countdown= -Current countdown value.= -TA4 Collider Detector= -TA4 Collider Detector Core= -TA4 Detector= - -### detector.lua ### -### electricmeter.lua ### - -Countdown= - -### detector.lua ### -### logic_block.lua ### -### tele.lua ### - -Blocking Time= - -### detector.lua ### -### tele.lua ### - -Configured Items= -Items which generate an 'on' command.@nIf empty, all passed items generate an 'on' command.= -On Time= -TA3 Detector= -The time after the 'off' command@nuntil the next 'on' command is accepted.= -The time between the 'on' and 'off' commands.= - -### display.lua ### - -Display no: = -TA4 Display= -TA4 Display XL= - -### distiller.lua ### - -TA3 Distillation Tower 1= -TA3 Distillation Tower 2= -TA3 Distillation Tower 3= -TA3 Distillation Tower 4= -TA3 Distillation Tower Base= - -### distributor.lua ### - -Block configured items for open ports= -Distributor= -High Performance Distributor= -Input= -blocking mode= - -### doorblock.lua ### - -TechAge Door Block= - -### doorcontroller.lua ### - -Insert door/gate block number(s)= -TA3 Door Controller= - -### doorcontroller2.lua ### - -Blocks exchanged= -Blocks reset= -Click on all the blocks that are part of the door/gate= -Ctrl,Inv= -Exchange= -TA3 Door Controller II= -with door sound= - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### node_detector.lua ### -### turncontroller.lua ### - -Done= -Record= -block positions are stored.= - -### doorcontroller2.lua ### -### flycontroller.lua ### -### movecontroller.lua ### -### turncontroller.lua ### - -Recording...= - -### doorcontroller2.lua ### -### movecontroller.lua ### - -Reset= - -### drillbox.lua ### - -Build derrick= -Depth= -Drill Bit= -Drill area is protected= -Drill bits missing= -Oil Drill Box= -Remove derrick= -item output blocked= - -### drive_axle.lua ### - -TA2 Drive Axle= - -### electric_cable.lua ### - -TA Electric Cable= - -### electricmeter.lua ### - -Amount of power to be provided before the device turns off= -Consumption= -Power countdown= -TA4 Electric Meter= - -### electricmeter.lua ### -### formspecs.lua ### -### transformer.lua ### - -Power= - -### electricmeter.lua ### -### transformer.lua ### - -Max. power= -Maximum power passed through= - -### electrolyzer.lua ### - -Configurable value@nfor the current limit= -Current limitation= -Electrolyzer= -If the charge of the storage@nsystem falls below the configured value,@nthe block switches off= -Maximum possible@ncurrent consumption= -Maximum power consumption [ku]= -Storage full= -TA4 Electrolyzer= -Turnoff point= -Turnoff point reached= - -### electrolyzer.lua ### -### fuelcell.lua ### -### tiny_generator.lua ### - -Electricity= - -### electronic.lua ### - -TA3 Vacuum Tube= -TA4 LEDs= -TA4 RAM Chip= -TA4 WLAN Chip= -TA5 AI Chip= -TA5 AI Chip II= -WLAN Chip= - -### electronic_fab.lua ### - -Electronic Fab= -TA2 Ele Fab= -TA3 Ele Fab= -TA4 Ele Fab= - -### end_wrench.lua ### - -Biome= -Node owner= -Position= -Position temperature= -Pump connected to no/empty tank(s).= -Pump connected to tank(s) with: @1= -TechAge Info Tool (use @= read status info)= - -### end_wrench.lua ### -### meltingpot.lua ### - -Time= - -### epoxy.lua ### - -Epoxide Resin= -Epoxide Resin Barrel= -Epoxide Resin Canister= - -### explore.lua ### - -Oil= -TA3 Oil Explorer= -TA3 Oil Storage= -depth= - -### filler.lua ### - -Liquid Filler= -TA Liquid Filler= - -### firebox.lua ### - -TA2 Firebox= -TA3 Coal Power Station Firebox= -TA3 Furnace Oil Burner= -TA3 Power Station Firebox= - -### firebox_lib.lua ### - -Firebox= - -### flipflop.lua ### - -TA3 Flip-Flop= - -### fly_lib.lua ### - -Destination position is protected= -Error: Max. length of the flight route exceeded by @1 blocks !!= -No valid destination position= -No valid node at the start position= -No valid start position= -Running= -Start position is protected= -Stopped= - -### fly_lib.lua ### -### flycontroller.lua ### - -Error: Invalid path !!= - -### flycontroller.lua ### - -Error: Recording is missing !!= -Flight route (A to B)= -Move a player without moving blocks= -See chat output= -TA5 Fly Controller= -Teleport mode= -Test= -[TA4 Fly Controller] Invalid path!= -[TA4 Fly Controller] Recording is missing!= - -### flycontroller.lua ### -### logic_block.lua ### -### lua_logic.lua ### -### movecontroller.lua ### - -Store= - -### flycontroller.lua ### -### movecontroller.lua ### - -Click on all blocks that shall be moved= -Maximum Speed= -Maximum speed for moving blocks= -Move= -Move A-B= -Move B-A= -Move block height= -Object offset= -Stored= -Value in the range of 0.0 to 1.0= -Y-offset for non-player objects like vehicles (-0.5 to 0.5)= - -### flywheel.lua ### - -Flywheel= -TA2 Flywheel= - -### forceload.lua ### - -Area already loaded or max. number of Forceload Blocks reached!= -Area from= -Area to= -Block at pos= -List of your Forceload Blocks:= -Punch the block to make the area visible.= -Show all forceload blocks in a 64x64x64 range= -Techage Forceload Block= -Techage Forceload Tile= -loaded= - -### formspecs.lua ### - -Block has a wrench menu= -Charge termination= -Current output [ku]= -Maximum output [ku]= -Range in which the generator reduces its power= -The current power the generator provides= -The maximum power the generator can provide= - -### formspecs.lua ### -### power_terminal2.lua ### - -Charging= - -### formspecs.lua ### -### power_terminal2.lua ### -### storage.lua ### -### transformer.lua ### - -Storage= - -### fuel_lib.lua ### - -Fuel Menu= -To add fuel punch@nthis block@nwith a fuel container= - -### fuelcell.lua ### - -Fuel Cell= -TA4 Fuel Cell= -no hydrogen= - -### fuelcellstack.lua ### - -TA4 Fuel Cell Stack= - -### furnace_top.lua ### - -Furnace Top= -Outp= -no fuel or no power= - -### gas_pipe.lua ### - -TA5 Junction Pipe= -TA5 Pipe= - -### gateblock.lua ### - -TechAge Gate Block= - -### gaze_sensor.lua ### - -Command to send when sensor is no longer viewed= -Command to send when sensor is viewed= -Input the player name(s) separated by blanks.@nIf empty, only the owner is accepted.= -Player Names= -TA4 Gaze Sensor= - -### gearbox.lua ### - -TA2 Gearbox= - -### generator.lua ### - -TA3 Generator= -TA4 Generator= -TA5 Generator= -no steam= - -### generator.lua ### -### power_terminal2.lua ### - -Generator= - -### gravelrinser.lua ### - -Gravel Rinser= -Rinsing= - -### gravelsieve.lua ### - -Compressed Gravel= -Gravel Sieve= -Sieved Gravel= -TA1 Gravel Sieve= -TA2 Gravel Sieve= -TA3 Gravel Sieve= -TA4 Gravel Sieve= - -### grinder.lua ### - -Grinder= -Grinding= -Milling= -TA1 Mill Base= - -### growlight.lua ### - -TA4 LED Grow Light= - -### hammer.lua ### - -TA1 Bronze Hammer (smash stone to gravel)= -TA1 Diamond Hammer (smash stone to gravel)= -TA1 Meridium Hammer (smash stone to gravel)= -TA1 Mese Hammer (smash stone to gravel)= -TA1 Steel Hammer (smash stone to gravel)= -TA1 Stone Hammer (smash stone to gravel)= - -### heater.lua ### - -TA4 Furnace Heater= - -### heatexchanger1.lua ### - -TA4 Heat Exchanger 1= -TA5 Heat Exchanger 1= - -### heatexchanger2.lua ### - - Error!= -Blue pipe connection error@n(@1 found / @2 expected)= -Blue pipe coolant missing@n(@1 found / @2 expected)= -Cooler error= -Green pipe connection error@n(@1 found / @2 expected)= -Green pipe coolant missing@n(@1 found / @2 expected)= -Power network connection error= -TA4 Heat Exchanger= -TA4 Heat Exchanger 2= -TA5 Heat Exchanger 2= -Turbine error= -did you check the plan?= -inlet/pipe error= -wrong storage diameter= - -### heatexchanger3.lua ### - -TA4 Heat Exchanger 3= -TA5 Heat Exchanger 3= - -### hydrogen.lua ### - -Hydrogen Cylinder Large= -Hydrogen Cylinder Small= -TA4 Hydrogen= - -### hyperloop.lua ### -### sensorchest.lua ### -### teleport.lua ### - -not connected= - -### hyperloop.lua ### -### teleport.lua ### - -Block name= -Connection name for this block= -Connection name of the remote block= -Enter a block name or select an existing one= -Remote name= -connected to= - -### industriallamp1.lua ### - -TA Industrial Lamp 1= - -### industriallamp2.lua ### - -TA Industrial Lamp 2= - -### industriallamp3.lua ### - -TA Industrial Lamp 3= - -### industriallamp4.lua ### - -TA4 LED Industrial Lamp= - -### inlet.lua ### - -TA4 Pipe Inlet= -one window maximum= -wrong diameter (should be 5, 7, or 9)= -wrong number of gravel nodes= -wrong number of shell nodes= - -### inlets.lua ### - -TA4 Collider Cable Input= -TA4 Collider Pipe Input= -TA4 Collider Pipe Output= -TA4 Collider Tube Input= - -### inverter.lua ### - -Inverter= -Power AC= -Power DC= -TA4 Solar Inverter= -no solar power= -solar network error= - -### junctionbox.lua ### - -TA Electric Junction Box= - -### lampholder.lua ### - -TA Lamp Holder Acacia= -TA Lamp Holder Apple= -TA Lamp Holder Aspen= -TA Lamp Holder Copper= -TA Lamp Holder Gold= -TA Lamp Holder White= - -### laser.lua ### - -Laser beam error!= -TA4 Laser Beam Emitter= -TA4 Laser Beam Receiver= -Valid destination positions:= -to= - -### lib.lua ### - -Block has an@nadditional wrench menu= - -### lib.lua ### -### sensorchest.lua ### - -connected with= - -### light_detector.lua ### - -Send signal if light level is above:= -TA3 Light Detector= - -### lighter.lua ### - -TA1 Lighter= - -### liquid_lib.lua ### - -Allow public access to the tank= -Liquid Tank= -To add liquids punch@nthe tank@nwith a liquid container= - -### liquid_lib.lua ### -### ta4_chest.lua ### - -keep assignment= - -### liquid_pipe.lua ### - -TA Junction Pipe= -TA Pipe= - -### liquidsampler.lua ### - -Liquid Sampler= - -### liquidsampler.lua ### -### waterpump.lua ### - -no usable water= - -### logic_block.lua ### - -'me' has to be used for the own block number.@n= -'~@=' means: not equal@n= -@n is a boolean expression@nwhere input numbers are evaluated.@n= -@n is the block number to which the@ncommand should be sent.@n= -@nAll rules are checked with each received@ncommand.= -@nExamples:@n1234 @=@= on@n1234 @=@= off@n1234 @=@= on and 2345 @=@= off@n2345 ~@= 3456@n= -@nRule:@n @= on/off if is true@n= -@nThe internal processing time for all@ncommands is 100 ms.= -@nValid operators:@nand or on off me @=@= ~@= ( )@n= -Clear= -Debug= -Inputs= -Outputs= -Rules= -Send an 'on'/'off' command if the@nexpression becomes true.@n= -Syntax= - -### logic_block.lua ### -### lua_logic.lua ### - -TA3 Logic Block= -Update= - -### logic_block.lua ### -### sequencer2.lua ### - -Help= - -### lye.lua ### - -Lye= -Lye Barrel= -Lye Canister= - -### magnet.lua ### - -TA4 Collider Detector Magnet= -TA4 Collider Magnet= -TA4 Collider Magnet Base= -TA4 Collider Steel Block= -TA5 Fusion Reactor Magnet 1= -TA5 Fusion Reactor Magnet 2= -TA5 Fusion Reactor Magnet Blank= -TA5 Fusion Reactor Magnet Shield= - -### mba_detector.lua ### - -TA4 Mapblock Active Detector= - -### meltingpot.lua ### - -Heat= -Melting Guide= -Melting Pot active (heat@== -Melting Pot inactive (heat@== -Melting Pot inactive (heat@=0)= -Menu= -Menu,Recipes= -TA1 Burning= -TA1 Melting= -TA1 Melting Pot= - -### meridium.lua ### - -Meridium Axe= -Meridium Pickaxe= -Meridium Shovel= -Meridium Sword= - -### mesecons_converter.lua ### - -TA3 Mesecons Converter= - -### mill.lua ### - -TA1 Mill= -TA1 Mill Gear= - -### millboard.lua ### - -TA1 Acacia Millrace Board= -TA1 Acacia Wood Board= -TA1 Apple Millrace Board= -TA1 Apple Wood Board= -TA1 Aspen Millrace Board= -TA1 Aspen Wood Board= -TA1 Jungle Millrace Board= -TA1 Jungle Wood Board= -TA1 Pine Millrace Board= -TA1 Pine Wood Board= - -### minicell.lua ### - -TA4 Streetlamp Solar Cell= - -### minichest.lua ### - -Test Chest= - -### minitank.lua ### - -Test Mini Tank= - -### movecontroller.lua ### - -Error: Invalid distance !!= -Move distance= -Move distance (A to B)= -Operational mode= -Switch to the remote controlled 'move xyz' mode= -TA Rack and Pinion= -TA4 Move Controller= - -### node_detector.lua ### - -Click on all blocks whose positions should be checked= -Send signal if nodes have been:= -TA3 Node Detector= -TA4 Node Detector= -added= -added or removed= -removed= - -### nodes.lua ### - -TechAge Gravel= - -### oil.lua ### - -Flowing Oil= -Oil Source= -TA3 Oil Barrel= -TA3 Oil Canister= - -### oilfirebox.lua ### - -TA3 Power Station Oil Burner= - -### petroleum.lua ### - -Isobutane Cylinder Large= -Isobutane Cylinder Small= -Propane Cylinder Large= -Propane Cylinder Small= -TA3 Bitumen= -TA3 Bitumen Barrel= -TA3 Bitumen Canister= -TA3 Fuel Oil= -TA3 Fuel Oil Barrel= -TA3 Fuel Oil Canister= -TA3 Gasoline= -TA3 Gasoline Barrel= -TA3 Gasoline Canister= -TA3 Naphtha= -TA3 Naphtha Barrel= -TA3 Naphtha Canister= -TA3 Propane= -TA4 Isobutane= - -### pillar.lua ### - -TA4 Pillar= - -### pipe_wall_entry.lua ### - -TA3 Pipe Wall Entry= - -### pipe_wrench.lua ### - -TA3 Drill Pipe Wrench= - -### plastic.lua ### - -Plastic Granules= - -### player_detector.lua ### - -Command to send when player is detected= -Command to send when player moves away= -Radius= -Search radius= -TA4 Player Detector= - -### powder.lua ### - -Aluminum Powder= -Clay Powder= -Graphite Powder= -Iron Powder= -Leave Powder= -Needle Powder= -Silver Sandstone Powder= - -### power2axle.lua ### - -TA3 Electric Motor= - -### power_line.lua ### - -TA Power Line= -TA Power Pole= -TA Power Pole Top (for up to 6 connections)= -TA Power Pole Top 2 (for landlines)= - -### power_terminal2.lua ### - -Commands@nhelp . . . print this text@ncls . . . . clear screen@ngen . . print generators@nsto . . print storage systems@ncon1 . . print consumers with power consumption between 1 and 10 ku@ncon2 . . print consumers with power consumption with 10 ku or above@n= -Consumer= -Network Data= -Number of consumers:= -Number of generators:= -Number of network nodes:= -Number of storage systems:= -TA3 Power Terminal= - -### power_terminal2.lua ### -### terminal.lua ### - -Enter= - -### powerswitch.lua ### - -TA Power Switch= -TA Power Switch Small= - -### powerswitchbox.lua ### -### powerswitchbox_legacy.lua ### - -TA Power Switch Box= - -### programmer.lua ### - -TechAge Programmer (right @= read number, left @= write numbers)= -[TechAge Programmer] Error: invalid numbers!= -[TechAge Programmer] Error: programmer not supported!= -[TechAge Programmer] Unknown node on= -[TechAge Programmer] foreign or unknown node!= -[TechAge Programmer] node programmed!= -[TechAge Programmer] number= -[TechAge Programmer] programmer reset= - -### protection.lua ### - -Allow to dig/place Techage power lines nearby power poles= - -### pump.lua ### - -Number of liquid units that are allowed to be pumped= -Number of units= -TA3 Pump= -TA4 Pump= - -### pump.lua ### -### ta5_pump.lua ### - -Total flow rate= -Total flow rate in liquid units= - -### pumpjack.lua ### - -Oil Pumpjack= -Oil amount= -Pumpjack= -needs power= -no oil= - -### pusher.lua ### - -Number of items= -Number of items that are allowed to be pushed= -Optionally configure@nthe pusher with one item= -Pusher= - -### quarry.lua ### - -Digging depth= -Hole size= -Quarry= -Start level= -Start level @= 0@nmeans the same level@nas the quarry is placed= -area is protected= -finished= -inventory full= - -### reboiler.lua ### - -TA3 Oil Reboiler= - -### recipe_lib.lua ### -### recipeblock.lua ### - -Recipe= - -### recipe_lib.lua ### -### ta4_reactor.lua ### - -Catalyst= - -### recipeblock.lua ### - -TA4 Recipe Block= - -### recipes.lua ### - -Flint and Iron= -TA1 Iron Ingot= -[Bucket] Lava can only be placed below sea level!= - -### recycler.lua ### - -Recycler= - -### redstone.lua ### - -Red Stone= -Red Stone Block= -Red Stone Brick= - -### repeater.lua ### - -TA3 Repeater= - -### rotor.lua ### - -Nacelle is missing= -TA4 Carbon Fiber= -TA4 Rotor Blade= -TA4 Wind Turbine= -TA4 Wind Turbine Nacelle= - -### screwdriver.lua ### - -Block alignment stored!= -Techage Screwdriver@n(See: TA3 > Tools)= - -### sensorchest.lua ### - -Allow public chest access= -TA4 Sensor Chest= - -### sequencer.lua ### - -TA3 Sequencer= - -### sequencer.lua ### -### sequencer2.lua ### - -stopped= - -### sequencer2.lua ### - - - 'goto ' (jump to another line)@n= - - 'nop' (do nothing)@n= - - 'send ' (techage command)@n= - - 'stop' (stop the execution)@n= - - 1 corresponds to 100 ms@n= - - 50000 corresponds to 4 game days@n= -'[] '@n= - is one of the following:@n= - is a number from 1 to 50000 and is@n= -@n= -Commands= -Cycle time= -Example:@n= -If 'yes' a received OFF command won't stop the sequencer= -Ignore OFF command= -Invalid command!= -Start= -Stop= -Syntax:@n= -TA4 Sequencer= -Timer cycle time (default: 100 ms)= -running= -the timeslot when the command is executed.@n= - -### sequencer2.lua ### -### submenu.lua ### - -Cancel= - -### shell.lua ### - -TA5 Fusion Reactor Nucleus= -TA5 Fusion Reactor Shell= - -### signallamp.lua ### - -TA4 Wind Turbine Signal Lamp= -TechAge Color Lamp= -TechAge Color Lamp 2= - -### signallamp_2x.lua ### - -TA4 2x Signal Lamp= - -### signallamp_2x.lua ### -### signallamp_4x.lua ### - -Label for the lamp= - -### signallamp_4x.lua ### - -TA4 4x Signal Lamp= - -### silicon.lua ### - -TA4 Silicon Wafer= - -### silo.lua ### - -TA3 Silo= -TA4 Silo= - -### simplelamp.lua ### - -TA Lamp= - -### sluice.lua ### - -TA1 Sluice Gate= -TA1 Sluice Handle= - -### solarcell.lua ### - -TA4 Solar Carrier Module= -TA4 Solar Carrier Module B= -TA4 Solar Carrier Module T= -TA4 Solar Module= -light= - -### solarcell.lua ### -### source.lua ### - -power= - -### soundblock.lua ### - -Play= -TA3 Sound Block= - -### source.lua ### - -Axle Power Source= -Ele Power Source= -Power Source= -Test Generator= - -### steam_pipe.lua ### - -TA2 Steam Pipe= - -### steelmat.lua ### - -TechAge Steel Mat= - -### storage.lua ### - -Test Storage= - -### streetlamp.lua ### - -TA Street Lamp= - -### streetlamp2.lua ### - -TA4 LED Street Lamp= -TA4 LED Street Lamp Arm= -TA4 LED Street Lamp Pole= - -### submenu.lua ### - -Note: You can't change any values while the block is running!= -Refresh= - -### ta1_axle.lua ### - -TA1 Axle= -TA1 Axle Bearing= - -### ta2_clutch.lua ### - -TA2 Clutch= - -### ta2_weight_chest.lua ### - -TA2 Weight Chest= - -### ta2_winch.lua ### - -TA2 Winch= - -### ta4_cable.lua ### - -TA4 Low Power Box= -TA4 Low Power Cable= - -### ta4_cable_wall_entry.lua ### - -TA4 Cable Wall Entry= - -### ta4_chest.lua ### - -Empty the slots always @nfrom right to left= -Never completely empty the slots@nwith the pusher to keep the item assignment= -Size= -TA4 8x2000 Chest= -Unlock= -Unlock connected chest@nif all slots are below 2000= -right to left= - -### ta4_doser.lua ### - -Doser= -TA4 Doser= -catalyst missing= -reactor defect= -reactor defect or no power= -reactor has no power= -wrong catalyst= - -### ta4_doser.lua ### -### ta4_reactor.lua ### - -TA4 Reactor= - -### ta4_injector.lua ### - -Configure up to 8 items @nto be pushed by the injector= -Injector= -Switch to pull mode @nto pull items out of inventory slots @naccording the injector configuration= -pull mode= - -### ta4_liquid_filter.lua ### - -TA4 Liquid Filter Filler= -TA4 Liquid Filter Sink= - -### ta4_reactor.lua ### - -TA4 Reactor Filler Pipe= - -### ta4_stand.lua ### - -TA4 Reactor Base= -TA4 Reactor Stand= -off= -on= - -### ta4_stand.lua ### -### waterpump.lua ### - -no power= - -### ta5_chest.lua ### - -TA5 Hyperloop Chest= - -### ta5_pump.lua ### - -TA5 Pump= - -### ta5_tank.lua ### - -TA5 Hyperloop Tank= - -### tank.lua ### - -Oil Tank= -TA3 Tank= -TA4 Tank= - -### tank_cart.lua ### - -TA Tank Cart= - -### teleport.lua ### - -Connected= -Connection status= -Distance > @1 blocks= -Ex-points missing (@1 < @2)= -Status= -server not connected= - -### teleport_pipe.lua ### - -TA5 Teleport Block Liquids= - -### teleport_pipe.lua ### -### teleport_tube.lua ### - -Remote block error= - -### teleport_tube.lua ### - -TA5 Teleport Block Items= - -### terminal.lua ### - -Syntax error, try help= -TA3 Terminal= -TA4 Terminal= -commands like: help= - -### timer.lua ### - -TA3 Timer= - -### tiny_generator.lua ### - -TA3 Tiny Power Generator= -Tiny Generator= -no fuel= - -### tower.lua ### - -TA3 Derrick= -TA3 Drill Pipe= -TA4 Derrick= -[TA] Derrick is being built!= -[TA] Derrick is being removed!= - -### transformer.lua ### - -TA4 Isolation Transformer= - -### trowel.lua ### - -TechAge Trowel= - -### tube_wall_entry.lua ### - -Tube Wall Entry= - -### tubes.lua ### - -TechAge Tube= - -### tubes_ta4.lua ### - -TA4 Tube= - -### turbine.lua ### - -TA3 Turbine= -TA4 Turbine= -TA5 Turbine= - -### turncontroller.lua ### - -Click on all blocks that shall be turned= -TA4 Turn Controller= -Turn left= -Turn right= - -### usmium.lua ### - -Usmium Nuggets= -Usmium Powder= - -### vacuumtube.lua ### - -TA4 Vacuum Tube= - -### valve.lua ### - -TA Valve= -TA3 Valve= - -### waterinlet.lua ### - -Error: No natural water!= -Error: No water available!= -Error: Not on sea level!= -Operational= -TA4 Water Inlet= - -### watermill.lua ### - -TA1 Watermill= - -### waterpump.lua ### - -TA4 Water Pump= -Water Pump= - -### windturbine_lib.lua ### - -Here is not enough water (41x41 m)!= -Here is not enough wind@n(A free air space of 41x41x21 m is necessary)!= -The next wind turbines is too close!= -This is a= -This is no ocean water!= -This is not the surface of the ocean!= -[TA4 Wind Turbine]= -biome and no ocean!= -is a suitable place for a wind turbine!= - -### worker.lua ### - -Build detector= -Item list= -Remove detector= -TA4 Collider Detector Worker= -[TA4] Detector is being built!= -[TA4] Detector is being removed!= diff --git a/techage/logic/button.lua b/techage/logic/button.lua deleted file mode 100644 index 3a26194..0000000 --- a/techage/logic/button.lua +++ /dev/null @@ -1,516 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 & TA4 Logic button - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local NDEF = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}) end - -local logic = techage.logic - -local WRENCH_MENU3 = { - { - type = "dropdown", - choices = "switch,on button,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s", - name = "type", - label = S("Type"), - tooltip = S("Button or switch"), - default = "1", - }, - { - type = "numbers", - name = "numbers", - label = S("Number"), - tooltip = S("Destination block number(s)"), - default = "", - check = techage.check_numbers, - }, - { - type = "dropdown", - choices = "private,protected,public", - name = "access", - label = S("Access"), - tooltip = S("Button protection"), - default = "1", - }, -} - -local WRENCH_MENU4 = { - { - type = "dropdown", - choices = "switch,on button,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s", - name = "type", - label = S("Type"), - tooltip = S("Button or switch"), - default = "1", - }, - { - type = "numbers", - name = "numbers", - label = S("Number"), - tooltip = S("Destination block number(s)"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command", - label = S("Command"), - tooltip = S("Command to be sent"), - default = "on", - }, - { - type = "dropdown", - choices = "private,protected,public", - name = "access", - label = S("Access"), - tooltip = S("Button protection"), - default = "1", - }, - { - type = "ascii", - name = "decription", - label = S("Infotext"), - tooltip = S("Change the block name (infotext)"), - default = "", - }, -} - -local function switch_on(pos, no_sound) - local cycle_time = M(pos):get_int("cycle_time") - local name = techage.get_node_lvm(pos).name - if name == "techage:ta3_button_off" then - logic.swap_node(pos, "techage:ta3_button_on") - elseif name == "techage:ta4_button_off" then - logic.swap_node(pos, "techage:ta4_button_on") - end - logic.send_cmnd(pos, "command", "on", cycle_time) - if not no_sound then - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5, - }) - end -end - -local function switch_off(pos, no_sound) - local name = techage.get_node_lvm(pos).name - if name == "techage:ta3_button_on" then - logic.swap_node(pos, "techage:ta3_button_off") - elseif name == "techage:ta4_button_on" then - logic.swap_node(pos, "techage:ta4_button_off") - end - local meta = M(pos) - if meta:get_string("off_command") ~= "true" and - (not meta:contains("command") or meta:get_string("command") == "on") then - logic.send_off(pos, M(pos)) - end - if not no_sound then - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5, - }) - end -end - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - local idx = meta:get_int("cycle_idx") or 0 - if idx == 0 then idx = 1 end - local access_idx = meta:get_string("public") == "true" and 3 or meta:get_string("protected") == "true" and 2 or 1 - return "size[7.5,6]".. - "dropdown[0.2,0;3;type;switch,on button,button 1s,button 2s,button 4s,button 8s,button 16s,button 32s;"..idx.."]".. - "field[0.5,2;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "label[0.2,3;"..S("Access:").."]".. - "dropdown[3,3;4;access;private,protected,public;"..access_idx.."]".. - "button_exit[2,4;3,1;exit;"..S("Save").."]" -end - -local function store_fields_data(pos, fields) - local meta = M(pos) - meta:set_string("numbers", fields.numbers) - meta:set_string("off_command", "") - - if fields.access == "protected" then - meta:set_string("protected", "true") - meta:set_string("public", "") - end - if fields.access == "public" then - meta:set_string("public", "true") - meta:set_string("protected", "") - end - if fields.access == "private" then - meta:set_string("public", "") - meta:set_string("protected", "") - end - local cycle_time = nil - if fields.type == "switch" then - meta:set_int("cycle_idx", 1) - cycle_time = 0 - elseif fields.type == "on button" then - meta:set_int("cycle_idx", 2) - meta:set_string("off_command", "true") - cycle_time = 1 - elseif fields.type == "button 1s" then - meta:set_int("cycle_idx", 3) - cycle_time = 1 - elseif fields.type == "button 2s" then - meta:set_int("cycle_idx", 4) - cycle_time = 2 - elseif fields.type == "button 4s" then - meta:set_int("cycle_idx", 5) - cycle_time = 4 - elseif fields.type == "button 8s" then - meta:set_int("cycle_idx", 6) - cycle_time = 8 - elseif fields.type == "button 16s" then - meta:set_int("cycle_idx", 7) - cycle_time = 16 - elseif fields.type == "button 32s" then - meta:set_int("cycle_idx", 8) - cycle_time = 32 - end - if cycle_time ~= nil then - meta:set_int("cycle_time", cycle_time) - end - meta:set_string("access", fields.access) - meta:set_string("type", fields.type) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - if not techage.check_numbers(fields.numbers, player:get_player_name()) then - return - end - store_fields_data(pos, fields) - - local meta = M(pos) - logic.infotext(meta, NDEF(pos).description) - if fields.exit then - meta:set_string("formspec", "") - meta:set_string("fixed" , "true") - else - meta:set_string("formspec", formspec(meta)) - end -end - -local function ta_after_formspec(pos, fields, playername) - store_fields_data(pos, fields) - local meta = M(pos) - if fields.decription and fields.decription ~= "" then - logic.infotext(meta, fields.decription) - else - logic.infotext(meta, NDEF(pos).description) - end -end - -local function can_access(pos, player) - local meta = M(pos) - local public = meta:get_string("public") == "true" - local protected = meta:get_string("protected") == "true" - local owner = meta:get_string("owner") - local name = player:get_player_name() - return public or protected and not minetest.is_protected(pos, name) or owner == name -end - -local function on_rightclick_on(pos, node, clicker) - local meta = M(pos) - local fixed = meta:get_string("fixed") - if fixed == "true" then - if can_access(pos, clicker) then - switch_on(pos) - local mem = techage.get_mem(pos) - mem.clicker = clicker and clicker:get_player_name() - mem.time = math.floor(minetest.get_us_time() / 100000) - end - end -end - -local function on_rightclick_off(pos, node, clicker) - local meta = M(pos) - local numbers = meta:get_string("numbers") - local cycle_time = meta:get_int("cycle_time") or 0 - if numbers ~= "" and numbers ~= nil and cycle_time == 0 then - if can_access(pos, clicker) then - switch_off(pos) - end - end -end - -local function techage_set_numbers(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, NDEF(pos).description) - meta:set_string("formspec", formspec(meta)) - return res -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) -end - -minetest.register_node("techage:ta3_button_off", { - description = S("TA3 Button/Switch"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_button_off.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta3_button_off", S("TA3 Button/Switch")) - logic.infotext(meta, S("TA3 Button/Switch")) - meta:set_string("formspec", formspec(meta)) - meta:set_string("public", "false") - meta:set_int("cycle_time", 0) - end, - - ta3_formspec = WRENCH_MENU3, - ta_after_formspec = ta_after_formspec, - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick_on, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta3_button_on", { - description = ("TA3 Button/Switch"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_button.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_button_on.png", - }, - - ta3_formspec = WRENCH_MENU3, - ta_after_formspec = ta_after_formspec, - on_rightclick = on_rightclick_off, - on_timer = switch_off, - on_rotate = screwdriver.disallow, - techage_set_numbers = techage_set_numbers, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_button_off", -}) - -minetest.register_node("techage:ta4_button_off", { - description = S("TA4 Button/Switch"), - inventory_image = "techage_smartline_button_inv.png", - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_smartline_button_off.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta4_button_off", S("TA4 Button/Switch")) - logic.infotext(meta, S("TA4 Button/Switch")) - meta:set_string("formspec", formspec(meta)) - meta:set_string("public", "false") - meta:set_int("cycle_time", 0) - end, - - ta4_formspec = WRENCH_MENU4, - ta_after_formspec = ta_after_formspec, - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick_on, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta4_button_on", { - description = ("TA4 Button/Switch"), - inventory_image = "techage_smartline_button_inv.png", - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_smartline_button_on.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - ta4_formspec = WRENCH_MENU4, - ta_after_formspec = ta_after_formspec, - on_rightclick = on_rightclick_off, - on_timer = switch_off, - on_rotate = screwdriver.disallow, - techage_set_numbers = techage_set_numbers, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta4_button_off", -}) - -minetest.register_craft({ - output = "techage:ta3_button_off", - recipe = { - {"", "group:wood", ""}, - {"default:glass", "techage:vacuum_tube", ""}, - {"", "group:wood", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_button_off", - recipe = { - {"", "techage:aluminum", "dye:blue"}, - {"", "default:glass", "techage:ta4_wlanchip"}, - {"", "", ""}, - }, -}) - -techage.register_node({"techage:ta3_button_off", "techage:ta3_button_on"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - switch_on(pos, true) - return true - elseif topic == "off" then - switch_off(pos, true) - return true - elseif topic == "state" then - local name = techage.get_node_lvm(pos).name - return name == "techage:ta3_button_on" and "on" or "off" - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 1 and payload[1] == 1 then - switch_on(pos, true) - return 0 - elseif topic == 1 and payload[1] == 0 then - switch_off(pos, true) - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then -- State - local name = techage.get_node_lvm(pos).name - return 0, name == "techage:ta3_button_on" and {1} or {0} - else - return 2, "" - end - end, - } -) - -techage.register_node({ - "techage:ta4_button_off", "techage:ta4_button_on", - }, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - switch_on(pos, true) - return true - elseif topic == "off" then - switch_off(pos, true) - return true - elseif topic == "state" then - local name = techage.get_node_lvm(pos).name - return name == "techage:ta4_button_on" and "on" or "off" - elseif topic == "name" then - local mem = techage.get_mem(pos) - return mem.clicker or "" - elseif topic == "time" then - local mem = techage.get_mem(pos) - return mem.time or 0 - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 1 and payload[1] == 1 then - switch_on(pos, true) - return 0 - elseif topic == 1 and payload[1] == 0 then - switch_off(pos, true) - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then -- State - local name = techage.get_node_lvm(pos).name - return 0, name == "techage:ta4_button_on" and {1} or {0} - elseif topic == 144 then -- Player Name - local mem = techage.get_mem(pos) - return 0, mem.clicker - elseif topic == 149 then --time - local mem = techage.get_mem(pos) - return 0, {mem.time or 0} - else - return 2, "" - end - end, - } -) diff --git a/techage/logic/button_2x.lua b/techage/logic/button_2x.lua deleted file mode 100644 index a016f7a..0000000 --- a/techage/logic/button_2x.lua +++ /dev/null @@ -1,307 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Logic twofold button - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local function get_button_num(pos, clicker, pointed_thing) - -- use the node behind the button to get better results - if clicker and pointed_thing then - local offs = vector.subtract(pointed_thing.under, pointed_thing.above) - pointed_thing.under = vector.add(pointed_thing.under, offs) - pointed_thing.above = vector.add(pointed_thing.above, offs) - local pos1 = minetest.pointed_thing_to_face_pos(clicker, pointed_thing) - local y = pos1.y - pos.y - - if y > 0.03 then - return 1 - elseif y < -0.03 then - return 2 - end - end -end - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "button,switch", - name = "type", - label = S("Type"), - tooltip = S("Momentary button or on/off switch"), - default = "1", - }, - { - type = "ascii", - name = "label1", - label = S("Label") .. " 1", - tooltip = S("Label for the button"), - default = "1", - }, - { - type = "numbers", - name = "dest_number1", - label = S("Number") .. " 1", - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command1", - label = S("Command") .. " 1", - tooltip = S("Command to be sent (ignored for switches)"), - default = "1", - }, - { - type = "ascii", - name = "label2", - label = S("Label") .. " 2", - tooltip = S("Label for the button"), - default = "1", - }, - { - type = "numbers", - name = "dest_number2", - label = S("Number") .. " 2", - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command2", - label = S("Command") .. " 2", - tooltip = S("Command to be sent (ignored for switches)"), - default = "2", - }, - { - type = "dropdown", - choices = "private,protected,public", - name = "access", - label = S("Access"), - tooltip = S("Button protection"), - default = "8", - }, -} - -local function send_cmnd(pos, num, cmd) - local meta = M(pos) - local own_num = meta:get_string("node_number") - local dest = meta:get_string("dest_number" .. num) - local command, payload = cmd, nil - if not cmd then - local s = meta:get_string("command" .. num) - command, payload = unpack(string.split(s, " ", false, 1)) - end - local owner = meta:get_string("owner") - if techage.check_numbers(dest, owner) then - techage.send_multi(own_num, dest, command, payload) - end -end - -local function button_update(pos, objref) - local meta = M(pos) - pos = vector.round(pos) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - local tbl = {" ", " ", meta:get_string("label1"), " ", meta:get_string("label2")} - local text = "< " .. table.concat(tbl, "\n< ") - local texture = lcdlib.make_multiline_texture("default", text, 96, 96, 7, "top", "#000", 6) - - if nvm.button[1] then - texture = texture .. "^techage_smartline_button_4x_on2.png" - end - if nvm.button[2] then - texture = texture .. "^techage_smartline_button_4x_on3.png" - end - objref:set_properties({ textures = {texture}, visual_size = {x=1, y=1} }) -end - -local function switch_off(pos, num) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - nvm.button[num] = nil - lcdlib.update_entities(pos) -end - -local function switch_on(pos, num) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - nvm.button[num] = true - lcdlib.update_entities(pos) -end - -local lcd_box = {-8/16, -4/16, 7.75/16, 8/16, 4/16, 8/16} - -local function can_access(pos, player) - local meta = M(pos) - local playername = player:get_player_name() - local access = meta:get_string("access") - local owner = meta:get_string("owner") - local protected = minetest.is_protected(pos, playername) - - if access == "private" and playername ~= owner then - return false - elseif access == "protected" and protected then - return false - end - return true -end - -minetest.register_node("techage:ta4_button_2x", { - description = S("TA4 2x Button"), - inventory_image = 'techage_smartline_button_2x.png', - tiles = {'techage_smartline_button_2x.png'}, - drawtype = "nodebox", - paramtype = "light", - use_texture_alpha = "clip", - sunlight_propagates = true, - paramtype2 = "facedir", - node_box = { - type = "fixed", - fixed = lcd_box, - }, - light_source = 6, - - display_entities = { - ["techage:display_entity"] = { depth = 0.48, - on_display_update = button_update}, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:ta4_button_2x") - local meta = minetest.get_meta(pos) - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", "TA4 2x Button " .. number) - meta:set_string("type", "button") - meta:set_string("label1", "B1") - meta:set_string("label2", "B2") - lcdlib.update_entities(pos) - end, - - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if clicker and clicker:is_player() then - -- Check access settings - if not can_access(pos, clicker) then - return - end - - local num = get_button_num(pos, clicker, pointed_thing) - if num then - local typ = M(pos):get_string("type") - if typ == "switch" then - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - if nvm.button[num] then - switch_off(pos, num) - send_cmnd(pos, num, "off") - else - switch_on(pos, num) - send_cmnd(pos, num, "on") - end - else - switch_on(pos, num) - send_cmnd(pos, num) - minetest.after(0.5, switch_off, pos, num) - end - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5, - }) - end - end - end, - - ta_after_formspec = function(pos, fields, playername) - lcdlib.update_entities(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - ta3_formspec = WRENCH_MENU, - on_place = lcdlib.on_place, - on_construct = lcdlib.on_construct, - on_destruct = lcdlib.on_destruct, - on_rotate = lcdlib.on_rotate, - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - -techage.register_node({"techage:ta4_button_2x"}, { - on_recv_message = function(pos, src, topic, payload) - local num = math.max(tonumber(payload) or 0, 1) - if topic == "on" then - switch_on(pos, num) - send_cmnd(pos, num) - return true - elseif topic == "off" then - switch_off(pos, num) - return true - elseif topic == "state" then - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - return nvm.button[num] == true - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local num = math.max(payload[1], 1) - if topic == 23 and payload[2] == 1 then - switch_on(pos, num) - send_cmnd(pos, num) - return 0 - elseif topic == 23 and payload[2] == 0 then - switch_off(pos, num) - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 152 then -- State - local num = math.max(payload[1], 1) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - return 0, nvm.button[num] and {1} or {0} - else - return 2, "" - end - end, - } -) - -minetest.register_craft({ - output = "techage:ta4_button_2x", - recipe = { - {"", "", ""}, - {"", "techage:ta4_button_off", "techage:ta4_button_off"}, - {"", "", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_button_off 2", - recipe = { - {"", "", ""}, - {"", "techage:ta4_button_2x", ""}, - {"", "", ""}, - }, -}) diff --git a/techage/logic/button_4x.lua b/techage/logic/button_4x.lua deleted file mode 100644 index 7c30107..0000000 --- a/techage/logic/button_4x.lua +++ /dev/null @@ -1,363 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Logic fourfold button - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local function get_button_num(pos, clicker, pointed_thing) - -- use the node behind the button to get better results - if clicker and pointed_thing then - local offs = vector.subtract(pointed_thing.under, pointed_thing.above) - pointed_thing.under = vector.add(pointed_thing.under, offs) - pointed_thing.above = vector.add(pointed_thing.above, offs) - local pos1 = minetest.pointed_thing_to_face_pos(clicker, pointed_thing) - local y = pos1.y - pos.y - - if y < -0.3 then - return 4 - elseif y < -0.03 and y > -0.22 then - return 3 - elseif y > 0.03 and y < 0.22 then - return 2 - elseif y > 0.3 then - return 1 - end - end -end - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "button,switch", - name = "type", - label = S("Type"), - tooltip = S("Momentary button or on/off switch"), - default = "1", - }, - { - type = "ascii", - name = "label1", - label = S("Label") .. " 1", - tooltip = S("Label for the button"), - default = "1", - }, - { - type = "numbers", - name = "dest_number1", - label = S("Number") .. " 1", - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command1", - label = S("Command") .. " 1", - tooltip = S("Command to be sent (ignored for switches)"), - default = "1", - }, - { - type = "ascii", - name = "label2", - label = S("Label") .. " 2", - tooltip = S("Label for the button"), - default = "1", - }, - { - type = "numbers", - name = "dest_number2", - label = S("Number") .. " 2", - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command2", - label = S("Command") .. " 2", - tooltip = S("Command to be sent (ignored for switches)"), - default = "2", - }, - { - type = "ascii", - name = "label3", - label = S("Label") .. " 3", - tooltip = S("Label for the button"), - default = "1", - }, - { - type = "numbers", - name = "dest_number3", - label = S("Number") .. " 3", - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command3", - label = S("Command") .. " 3", - tooltip = S("Command to be sent (ignored for switches)"), - default = "3", - }, - { - type = "ascii", - name = "label4", - label = S("Label") .. " 4", - tooltip = S("Label for the button"), - default = "1", - }, - { - type = "numbers", - name = "dest_number4", - label = S("Number") .. " 4", - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command4", - label = S("Command") .. " 4", - tooltip = S("Command to be sent (ignored for switches)"), - default = "4", - }, - { - type = "dropdown", - choices = "private,protected,public", - name = "access", - label = S("Access"), - tooltip = S("Button protection"), - default = "8", - }, -} - -local function send_cmnd(pos, num, cmd) - local meta = M(pos) - local own_num = meta:get_string("node_number") - local dest = meta:get_string("dest_number" .. num) - local command, payload = cmd, nil - if not cmd then - local s = meta:get_string("command" .. num) - command, payload = unpack(string.split(s, " ", false, 1)) - end - local owner = meta:get_string("owner") - if techage.check_numbers(dest, owner) then - techage.send_multi(own_num, dest, command, payload) - end -end - -local function button_update(pos, objref) - local meta = M(pos) - pos = vector.round(pos) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - local tbl = {meta:get_string("label1"), " ", meta:get_string("label2"), " ", meta:get_string("label3"), " ", meta:get_string("label4")} - local text = "< " .. table.concat(tbl, "\n< ") - local texture = lcdlib.make_multiline_texture("default", text, 96, 96, 7, "top", "#000", 6) - - if nvm.button[1] then - texture = texture .. "^techage_smartline_button_4x_on1.png" - end - if nvm.button[2] then - texture = texture .. "^techage_smartline_button_4x_on2.png" - end - if nvm.button[3] then - texture = texture .. "^techage_smartline_button_4x_on3.png" - end - if nvm.button[4] then - texture = texture .. "^techage_smartline_button_4x_on4.png" - end - objref:set_properties({ textures = {texture}, visual_size = {x=1, y=1} }) -end - -local function switch_off(pos, num) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - nvm.button[num] = nil - lcdlib.update_entities(pos) -end - -local function switch_on(pos, num) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - nvm.button[num] = true - lcdlib.update_entities(pos) -end - -local lcd_box = {-8/16, -8/16, 7.75/16, 8/16, 8/16, 8/16} - -local function can_access(pos, player) - local meta = M(pos) - local playername = player:get_player_name() - local access = meta:get_string("access") - local owner = meta:get_string("owner") - local protected = minetest.is_protected(pos, playername) - - if access == "private" and playername ~= owner then - return false - elseif access == "protected" and protected then - return false - end - return true -end - -minetest.register_node("techage:ta4_button_4x", { - description = S("TA4 4x Button"), - inventory_image = 'techage_smartline_button_4x.png', - tiles = {'techage_smartline_button_4x.png'}, - drawtype = "nodebox", - paramtype = "light", - use_texture_alpha = "clip", - sunlight_propagates = true, - paramtype2 = "facedir", - node_box = { - type = "fixed", - fixed = lcd_box, - }, - light_source = 6, - - display_entities = { - ["techage:display_entity"] = { depth = 0.48, - on_display_update = button_update}, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:ta4_button_4x") - local meta = minetest.get_meta(pos) - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", "TA4 4x Button " .. number) - meta:set_string("type", "button") - meta:set_string("label1", "B1") - meta:set_string("label2", "B2") - meta:set_string("label3", "B3") - meta:set_string("label4", "B4") - lcdlib.update_entities(pos) - end, - - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if clicker and clicker:is_player() then - -- Check access settings - if not can_access(pos, clicker) then - return - end - - local num = get_button_num(pos, clicker, pointed_thing) - if num then - local typ = M(pos):get_string("type") - if typ == "switch" then - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - if nvm.button[num] then - switch_off(pos, num) - send_cmnd(pos, num, "off") - else - switch_on(pos, num) - send_cmnd(pos, num, "on") - end - else - switch_on(pos, num) - send_cmnd(pos, num) - minetest.after(0.5, switch_off, pos, num) - end - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5, - }) - end - end - end, - - ta_after_formspec = function(pos, fields, playername) - lcdlib.update_entities(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - ta3_formspec = WRENCH_MENU, - on_place = lcdlib.on_place, - on_construct = lcdlib.on_construct, - on_destruct = lcdlib.on_destruct, - on_rotate = lcdlib.on_rotate, - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - -techage.register_node({"techage:ta4_button_4x"}, { - on_recv_message = function(pos, src, topic, payload) - local num = math.max(tonumber(payload) or 0, 3) - if topic == "on" then - switch_on(pos, num) - send_cmnd(pos, num) - return true - elseif topic == "off" then - switch_off(pos, num) - return true - elseif topic == "state" then - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - return nvm.button[num] == true - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local num = math.max(payload[1], 3) - if topic == 23 and payload[2] == 1 then - switch_on(pos, num) - send_cmnd(pos, num) - return 0 - elseif topic == 23 and payload[2] == 0 then - switch_off(pos, num) - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 152 then -- State - local num = math.max(payload[1], 3) - local nvm = techage.get_nvm(pos) - nvm.button = nvm.button or {} - return 0, nvm.button[num] and {1} or {0} - else - return 2, "" - end - end, - } -) - -minetest.register_craft({ - output = "techage:ta4_button_4x", - recipe = { - {"", "techage:ta4_button_off", "techage:ta4_button_off"}, - {"", "techage:ta4_button_off", "techage:ta4_button_off"}, - {"", "", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_button_off 4", - recipe = { - {"", "", ""}, - {"", "techage:ta4_button_4x", ""}, - {"", "", ""}, - }, -}) diff --git a/techage/logic/cart_detector.lua b/techage/logic/cart_detector.lua deleted file mode 100644 index 99c12b6..0000000 --- a/techage/logic/cart_detector.lua +++ /dev/null @@ -1,182 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Cart Detector/Starter - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end - -local logic = techage.logic -local CYCLE_TIME = 2 - -local function switch_off(pos) - local node = minetest.get_node(pos) - if node.name == "techage:ta3_cartdetector_on" then - logic.swap_node(pos, "techage:ta3_cartdetector_off") - logic.send_off(pos, M(pos)) - end -end - -local function switch_on(pos) - logic.swap_node(pos, "techage:ta3_cartdetector_on") - if logic.send_on(pos, M(pos)) then - minetest.after(1, switch_off, pos) - end -end - -local function node_timer(pos) - if minecart.is_cart_available(pos, nil, 1.5) then - switch_on(pos) - else - switch_off(pos) - end - return true -end - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - return "size[7.5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "button_exit[2,2.2;3,1;accept;"..S("accept").."]" -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = minetest.get_meta(pos) - if fields.accept then - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), S("TA3 Cart Detector")) - end - meta:set_string("formspec", formspec(meta)) - end -end - -local function techage_set_numbers(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Cart Detector")) - meta:set_string("formspec", formspec(meta)) - return res -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) -end - -minetest.register_node("techage:ta3_cartdetector_off", { - description = S("TA3 Cart Detector"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR90", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_cartdetector.png", - }, - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta3_cartdetector_off", S("TA3 Player Detector")) - logic.infotext(meta, S("TA3 Cart Detector")) - meta:set_string("formspec", formspec(meta)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_receive_fields = on_receive_fields, - on_timer = node_timer, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta3_cartdetector_on", { - description = "TA3 Cart Detector", - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR90", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_cartdetector_on.png", - }, - on_receive_fields = on_receive_fields, - on_timer = node_timer, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_cartdetector_off" -}) - -minetest.register_craft({ - output = "techage:ta3_cartdetector_off", - recipe = { - {"", "group:wood", "default:mese_crystal"}, - {"", "default:copper_ingot", "techage:vacuum_tube"}, - {"", "group:wood", "basic_materials:motor"}, - }, -}) - -techage.register_node({"techage:ta3_cartdetector_off", "techage:ta3_cartdetector_on"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - local node = minetest.get_node(pos) - local dir = minetest.facedir_to_dir(node.param2) - minecart.punch_cart(pos, nil, 1.6, dir) - elseif topic == "state" then - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_cartdetector_on" then - return "on" - else - return "off" - end - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 1 then - local node = minetest.get_node(pos) - local dir = minetest.facedir_to_dir(node.param2) - minecart.punch_cart(pos, nil, 1.6, dir) - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 142 then -- Binary State - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_cartdetector_on" then - return 0, {1} - else - return 0, {0} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - --- Register default cart in addition -minecart.tEntityNames["carts:cart"] = true diff --git a/techage/logic/charge_detector.lua b/techage/logic/charge_detector.lua deleted file mode 100644 index bf8c8da..0000000 --- a/techage/logic/charge_detector.lua +++ /dev/null @@ -1,232 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Energy storage charge detector - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local Cable = techage.ElectricCable -local power = networks.power - -local logic = techage.logic -local CYCLE_TIME = 8 -local DESCR = S("TA4 Energy Storage Charge Detector") - -local WRENCH_MENU = { - { - type = "numbers", - name = "numbers", - label = S("Number"), - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "dropdown", - choices = "10%,20%,30%,40%,50%,60%,70%,80%,90%", - name = "switch_point", - label = S("Switch point"), - tooltip = S("Storage charge level switch point"), - default = "50", - values = {10, 20, 30, 40, 50, 60, 70, 80, 90} - }, - { - type = "ascii", - name = "command1", - label = '"<" ' .. S("Command"), - tooltip = S("Command to send when the energy storage charge\nlevel falls below the specified switch point"), - default = "off", - }, - { - type = "ascii", - name = "command2", - label = '">" ' .. S("Command"), - tooltip = S("Command to send when the energy storage charge\nlevel rises above the specified switch point"), - default = "on", - }, -} - -local function switch_on(pos) - if logic.swap_node(pos, "techage:ta4_chargedetector_on") then - logic.send_cmnd(pos, "command2", "on") - end -end - -local function switch_off(pos) - if logic.swap_node(pos, "techage:ta4_chargedetector_off") then - logic.send_cmnd(pos, "command1", "off") - end -end - -local function switch_point(pos) - local mem = techage.get_mem(pos) - if not mem.switch_point then - mem.switch_point = tonumber(M(pos):get_string("switch_point")) or 50 - end - return mem.switch_point -end - -local function above_switch_point(pos) - local outdir = M(pos):get_int("outdir") - local value = networks.power.get_storage_percent(pos, Cable, outdir) - return value > switch_point(pos) -end - -local function techage_set_numbers(pos, numbers, player_name) - local res = logic.set_numbers(pos, numbers, player_name, DESCR) - return res -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -local function ta_after_formspec(pos, fields, playername) - local mem = techage.get_mem(pos) - mem.switch_point = nil -end - -minetest.register_node("techage:ta4_chargedetector_off", { - description = DESCR, - inventory_image = 'techage_charge_detector_inv.png', - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_charge_detector_off.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta4_chargedetector_off", DESCR) - logic.infotext(meta, DESCR) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "B")) - Cable:after_place_node(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_timer = function (pos, elapsed) - if not above_switch_point(pos) then - switch_on(pos) - end - return true - end, - - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - ta_after_formspec = ta_after_formspec, - ta4_formspec = WRENCH_MENU, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta4_chargedetector_on", { - description = DESCR, - inventory_image = 'techage_charge_detector_inv.png', - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_charge_detector_on.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - on_timer = function (pos, elapsed) - if above_switch_point(pos) then - switch_off(pos) - end - return true - end, - - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - ta_after_formspec = ta_after_formspec, - ta4_formspec = WRENCH_MENU, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta4_chargedetector_off" -}) - -minetest.register_craft({ - output = "techage:ta4_chargedetector_off", - recipe = { - {"", "", ""}, - {"basic_materials:plastic_sheet", "dye:blue", "techage:aluminum"}, - {"techage:ta4_wlanchip", "techage:electric_cableS", "default:copper_ingot"}, - }, -}) - -techage.register_node({ - "techage:ta4_chargedetector_off", "techage:ta4_chargedetector_on" - }, { - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta4_chargedetector_on" then - return "on" - else - return "off" - end - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 142 then -- Binary State - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta4_chargedetector_on" then - return 0, {1} - else - return 0, {0} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - } -) - -power.register_nodes({"techage:ta4_chargedetector_off", "techage:ta4_chargedetector_on"}, Cable, "con", {"B"}) - diff --git a/techage/logic/collector.lua b/techage/logic/collector.lua deleted file mode 100644 index f5568d5..0000000 --- a/techage/logic/collector.lua +++ /dev/null @@ -1,225 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Collector - Collects states from other nodes, acting as a state concentrator. - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local NDEF = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}) end -local logic = techage.logic - -local CYCLE_TIME = 1 - --- The numbering seems strange here, but I had to add the "running" state --- afterwards without changing the behavior of the block. -local tStates = {stopped = 0, running = 1, standby = 2, blocked = 3, fault = 4, defect = 5} -local tDropdownPos = {["1 standby"] = 1, ["2 blocked"] = 2, ["3 fault"] = 3, ["4 defect"] = 4} -local lStates = {[0] = "stopped", "running", "standby", "blocked", "fault", "defect"} -local tDropdownPos = {["1 standby"] = 1, ["2 blocked"] = 2, ["3 nopower"] = 3, ["4 fault"] = 4} -local TaStates = {running = 1, blocked = 2, standby = 3, nopower = 4, fault = 5, stopped = 6} - -local function formspec(nvm, meta) - nvm.poll_numbers = nvm.poll_numbers or {} - local poll_numbers = table.concat(nvm.poll_numbers, " ") - local event_number = meta:get_string("event_number") - local dropdown_pos = meta:get_int("dropdown_pos") - if dropdown_pos == 0 then dropdown_pos = 1 end - - return "size[9,6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.3,0.6;9,1;poll_numbers;"..S("Node numbers to read the states from")..":;"..poll_numbers.."]" .. - "field[0.3,2;9,1;event_number;"..S("Node number to send the events to")..":;"..event_number.."]" .. - "label[1.3,2.8;"..S("Send an event if state is equal or larger than")..":]".. - "dropdown[1.2,3.4;7,4;severity;1 standby,2 blocked,3 nopower,4 fault;"..dropdown_pos.."]".. - "button_exit[3,5;2,1;exit;Save]" -end - - -local function send_event(nvm, meta) - local event_number = meta:get_string("event_number") - if event_number ~= "" then - local severity = meta:get_int("dropdown_pos") - local own_number = meta:get_string("own_number") - if nvm.common_state > severity then - techage.send_multi(own_number, event_number, "on") - else - techage.send_multi(own_number, event_number, "off") - end - end -end - -local function request_state(nvm, meta) - local number = nvm.poll_numbers and nvm.poll_numbers[nvm.idx] - if number then - local own_number = meta:get_string("own_number") - local state = techage.send_single(own_number, number, "state", nil) - if state then - state = tStates[state] or 0 - nvm.common_state = math.max(nvm.common_state, state) - end - end -end - - -local function on_timer(pos,elapsed) - local nvm = techage.get_nvm(pos) - local meta = minetest.get_meta(pos) - nvm.idx = (nvm.idx or 0) + 1 - nvm.common_state = nvm.common_state or 0 - - if not nvm.poll_numbers then - local own_number = meta:get_string("own_number") - meta:set_string("infotext", S("TA4 State Collector").." "..own_number..": stopped") - nvm.common_state = 0 - nvm.idx = 1 - return false - end - - if nvm.idx > #nvm.poll_numbers then - nvm.idx = 1 - if nvm.stored_state ~= nvm.common_state then - send_event(nvm, meta) - local own_number = meta:get_string("own_number") - meta:set_string("infotext", S("TA4 State Collector").." "..own_number..': "'..lStates[nvm.common_state]..'"') - nvm.stored_state = nvm.common_state - end - nvm.common_state = 0 -- reset for the next round - end - - request_state(nvm, meta) - return true -end - -minetest.register_node("techage:ta4_collector", { - description = S("TA4 State Collector"), - inventory_image = "techage_smartline_collector_inv.png", - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_smartline_collector.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - local meta = minetest.get_meta(pos) - local own_number = techage.add_node(pos, "techage:ta4_collector") - meta:set_string("own_number", own_number) - meta:set_string("formspec", formspec(nvm, meta)) - meta:set_string("infotext", S("TA4 State Collector").." "..own_number) - meta:set_string("owner", placer:get_player_name()) - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - if owner ~= player:get_player_name() then - return - end - - local nvm = techage.get_nvm(pos) - local timer = minetest.get_node_timer(pos) - local own_number = meta:get_string("own_number") - - if fields.quit == "true" and fields.poll_numbers then - if techage.check_numbers(fields.event_number, player:get_player_name()) then - meta:set_string("event_number", fields.event_number) - end - if techage.check_numbers(fields.poll_numbers, player:get_player_name()) then - nvm.poll_numbers = string.split(fields.poll_numbers, " ") - nvm.idx = 0 - if not timer:is_started() then - timer:start(CYCLE_TIME) - end - meta:set_string("infotext", S("TA4 State Collector").." "..own_number..": running") - else - if timer:is_started() then - timer:stop() - end - meta:set_string("infotext", S("TA4 State Collector").." "..own_number..": stopped") - nvm.common_state = 0 - nvm.stored_state = 0 - end - if fields.severity then - meta:set_int("dropdown_pos", tDropdownPos[fields.severity]) - end - meta:set_string("formspec", formspec(nvm, meta)) - end - end, - - techage_set_numbers = function(pos, numbers, player_name) - local nvm = techage.get_nvm(pos) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, NDEF(pos).description) - meta:set_string("formspec", formspec(nvm, meta)) - return res - end, - - on_timer = on_timer, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta4_collector", - recipe = { - {"", "techage:aluminum", "dye:blue"}, - {"", "default:mese_crystal_fragment", "techage:ta4_wlanchip"}, - }, -}) - -techage.register_node({"techage:ta4_collector"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local nvm = techage.get_nvm(pos) - return lStates[nvm.stored_state or 0] - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 129 then - local nvm = techage.get_nvm(pos) - return 0, {TaStates[lStates[nvm.stored_state or 0]]} - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) diff --git a/techage/logic/command_converter.lua b/techage/logic/command_converter.lua deleted file mode 100644 index 16af99d..0000000 --- a/techage/logic/command_converter.lua +++ /dev/null @@ -1,182 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Commannd Converter - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local DESCR = S("TA3 Command Converter") - -local logic = techage.logic - -local sDelay = "0,1,2,3,4,5,7,10,15,20,30,45,60" - -local function switch_on(pos) - logic.swap_node(pos, "techage:ta3_command_converter_on") - logic.send_cmnd(pos, "command_on", "") -end - -local function switch_off(pos) - logic.swap_node(pos, "techage:ta3_command_converter_off") - logic.send_cmnd(pos, "command_off", "") -end - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - local command_on = meta:get_string("command_on") - local command_off = meta:get_string("command_off") - local delay_on = techage.dropdown_index(sDelay, meta:get_string("delay_on")) - local delay_off = techage.dropdown_index(sDelay, meta:get_string("delay_off")) - - return "formspec_version[4]size[10,6]".. - "box[0.2,0.2;9.6,0.6;#c6e8ff]" .. - "label[0.4,0.5;" .. minetest.colorize( "#000000", DESCR) .. "]" .. - - "field[1.0,1.5;8,0.6;numbers;" .. S("Insert destination node number(s)") .. ";" .. numbers .. "]" .. - - "label[0.6,2.7;" .. S("Receive") .. "]" .. - "label[2.8,2.7;" .. S("Sent command") .. "]" .. - "label[7.34,2.7;" .. S("Send delay (s)") .. "]" .. - - "box[0.5,3.1;1.2,0.6;#888]" .. - "label[0.6,3.4;on]" .. - "field[2.7,3.1;3.5,0.6;command_on;;" .. command_on .. "]" .. - "dropdown[7.2,3.1;2,0.6;delay_on;" .. sDelay .. ";" .. delay_on .. ";false]" .. - - "box[0.5,4.0;1.2,0.6;#888]" .. - "label[0.6,4.3;off]" .. - "field[2.7,4.0;3.5,0.6;command_off;;" .. command_off .. "]" .. - "dropdown[7.2,4.0;2,0.6;delay_off;" .. sDelay .. ";" .. delay_off .. ";false]" .. - - "button_exit[3.5,5.2;3,0.6;exit;" .. S("Save") .. "]" -end - -local function techage_set_numbers(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, DESCR) - meta:set_string("formspec", formspec(meta)) - return true --res -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = minetest.get_meta(pos) - if fields.exit and fields.exit ~= "" then - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), DESCR) - end - meta:set_string("command_on", fields.command_on) - meta:set_string("command_off", fields.command_off) - meta:set_int("delay_on", fields.delay_on or 0) - meta:set_int("delay_off", fields.delay_off or 0) - meta:set_string("formspec", formspec(meta)) - elseif fields.exit == "close" then - meta:set_string("formspec", formspec(meta)) - end -end - -minetest.register_node("techage:ta3_command_converter_off", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_command_converter.png", - }, - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta3_command_converter_off", DESCR) - logic.infotext(meta, DESCR) - meta:set_string("formspec", formspec(meta)) - end, - - on_timer = function (pos, elapsed) - switch_on(pos) - end, - - on_receive_fields = on_receive_fields, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta3_command_converter_on", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_command_converter_on.png", - }, - - on_timer = function (pos, elapsed) - switch_off(pos) - end, - - on_receive_fields = on_receive_fields, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_command_converter_off" -}) - -minetest.register_craft({ - output = "techage:ta3_command_converter_off", - recipe = { - {"", "group:wood", ""}, - {"default:mese_crystal_fragment", "default:copper_ingot", "techage:vacuum_tube"}, - {"", "group:wood", ""}, - }, -}) - -techage.register_node({ - "techage:ta3_command_converter_off", "techage:ta3_command_converter_on" - }, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - local delay = M(pos):get_int("delay_on") or 0 - if delay > 0 then - minetest.get_node_timer(pos):start(delay) - else - switch_on(pos) - end - return true - elseif topic == "off" then - local delay = M(pos):get_int("delay_off") or 0 - if delay > 0 then - minetest.get_node_timer(pos):start(delay) - else - switch_off(pos) - end - return true - else - return "unsupported" - end - end, - } -) diff --git a/techage/logic/detector.lua b/techage/logic/detector.lua deleted file mode 100644 index 2dbde0e..0000000 --- a/techage/logic/detector.lua +++ /dev/null @@ -1,394 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Item detector - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local NDEF = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}) end - -local logic = techage.logic -local BLOCKING_TIME = 8 -- seconds -local ON_TIME = 1 - -local WRENCH_MENU3 = { - { - type = "dropdown", - choices = "1,2,4,6,8,12,16", - name = "ontime", - label = S("On Time") .. " [s]", - tooltip = S("The time between the 'on' and 'off' commands."), - default = "1", - }, - { - type = "dropdown", - choices = "2,4,6,8,12,16,20", - name = "blockingtime", - label = S("Blocking Time") .. " [s]", - tooltip = S("The time after the 'off' command\nuntil the next 'on' command is accepted."), - default = "8", - }, - { - type = "items", - name = "config", - label = S("Configured Items"), - tooltip = S("Items which generate an 'on' command.\nIf empty, all passed items generate an 'on' command."), - size = 4, - } -} - -local WRENCH_MENU4 = { - { - type = "dropdown", - choices = "1,2,4,6,8,12,16", - name = "ontime", - label = S("On Time") .. " [s]", - tooltip = S("The time between the 'on' and 'off' commands."), - default = "1", - }, - { - type = "dropdown", - choices = "2,4,6,8,12,16,20", - name = "blockingtime", - label = S("Blocking Time") .. " [s]", - tooltip = S("The time after the 'off' command\nuntil the next 'on' command is accepted."), - default = "8", - }, - { - type = "number", - name = "countdown", - label = S("Countdown"), - tooltip = S("Counts down the number of items passed through\nand only triggers an 'on' command when it reaches zero."), - default = "0", - }, - { - type = "output", - name = "countdown", - label = S("Current countdown"), - tooltip = S("Current countdown value."), - default = "0", - }, - { - type = "items", - name = "config", - label = S("Configured Items"), - tooltip = S("Items which generate an 'on' command.\nIf empty, all passed items generate an 'on' command."), - size = 4, - } -} - -local function switch_on(pos) - local mem = techage.get_mem(pos) - local t = minetest.get_gametime() - if t > (mem.time or 0) then - local name = techage.get_node_lvm(pos).name - if name == "techage:ta3_detector_off" then - logic.swap_node(pos, "techage:ta3_detector_on") - else - logic.swap_node(pos, "techage:ta4_detector_on") - end - local meta = M(pos) - local on_time = math.max(meta:get_int("ontime"), ON_TIME) - local blocking_time = tonumber(meta:get_string("blockingtime")) or BLOCKING_TIME - logic.send_on(pos, meta, on_time) - mem.time = t + blocking_time + on_time - end -end - -local function switch_off(pos) - local name = techage.get_node_lvm(pos).name - if name == "techage:ta3_detector_on" then - logic.swap_node(pos, "techage:ta3_detector_off") - else - logic.swap_node(pos, "techage:ta4_detector_off") - end - logic.send_off(pos, M(pos)) -end - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - return "size[7.5,3]".. - techage.wrench_image(7, -0.1) .. - "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "button_exit[2,2;3,1;exit;"..S("Save").."]" -end - -local function after_place_node3(pos, placer) - local meta = M(pos) - local inv = meta:get_inventory() - inv:set_size('cfg', 4) - logic.after_place_node(pos, placer, "techage:ta3_detector_off", S("TA3 Detector")) - logic.infotext(meta, S("TA3 Detector")) - meta:set_string("formspec", formspec(meta)) -end - -local function after_place_node4(pos, placer) - local meta = M(pos) - local inv = meta:get_inventory() - inv:set_size('cfg', 4) - logic.after_place_node(pos, placer, "techage:ta4_detector_off", S("TA4 Detector")) - logic.infotext(meta, S("TA4 Detector")) - meta:set_string("formspec", formspec(meta)) -end - -local function on_receive_fields(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), NDEF(pos).description) - meta:set_string("formspec", formspec(M(pos))) - end -end - -local function techage_set_numbers(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, NDEF(pos).description) - meta:set_string("formspec", formspec(meta)) - return res -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -local function ta_after_formspec(pos, fields, playername) - if fields.save then - local nvm = techage.get_nvm(pos) - local val = M(pos):get_int("countdown") or 0 - if val > 0 then - nvm.countdown = val - else - nvm.countdown = nil - end - end -end - -minetest.register_node("techage:ta3_detector_off", { - description = S("TA3 Detector"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_outp.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_inp.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector.png^[transformFX", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector.png", - }, - - after_place_node = after_place_node3, - on_receive_fields = on_receive_fields, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - ta3_formspec = WRENCH_MENU3, - - on_rotate = screwdriver.disallow, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -minetest.register_node("techage:ta3_detector_on", { - description = S("TA3 Detector"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_outp.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_inp.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector_on.png^[transformFX", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector_on.png", - }, - - on_timer = switch_off, - on_rotate = screwdriver.disallow, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - ta3_formspec = WRENCH_MENU3, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_detector_off", -}) - -minetest.register_node("techage:ta4_detector_off", { - description = S("TA4 Detector"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_outp.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inp.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_detector.png^[transformFX", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_detector.png", - }, - - after_place_node = after_place_node4, - on_receive_fields = on_receive_fields, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - ta4_formspec = WRENCH_MENU4, - ta_after_formspec = ta_after_formspec, - - on_rotate = screwdriver.disallow, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - - -minetest.register_node("techage:ta4_detector_on", { - description = S("TA4 Detector"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_outp.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inp.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_detector_on.png^[transformFX", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_detector_on.png", - }, - - on_timer = switch_off, - on_rotate = screwdriver.disallow, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - ta4_formspec = WRENCH_MENU4, - ta_after_formspec = ta_after_formspec, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta4_detector_off", -}) - -minetest.register_craft({ - output = "techage:ta3_detector_off", - recipe = { - {"", "group:wood", ""}, - {"techage:tubeS", "techage:vacuum_tube", "techage:tubeS"}, - {"", "group:wood", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_detector_off", - recipe = { - {"", "techage:ta3_detector_off", ""}, - {"", "techage:ta4_wlanchip", ""}, - {"", "", ""}, - }, -}) - -techage.register_node({"techage:ta3_detector_off", "techage:ta3_detector_on"}, { - on_push_item = function(pos, in_dir, stack) - local leftover = techage.safe_push_items(pos, in_dir, stack) - if leftover then - local inv = minetest.get_inventory({type = "node", pos = pos}) - if not inv or inv:is_empty("cfg") or inv:contains_item("cfg", ItemStack(stack:get_name())) then - if leftover == true or leftover:get_count() ~= stack:get_count() then - switch_on(pos) - end - end - return leftover - end - return false - end, - is_pusher = true, -- is a pulling/pushing node -}) - -techage.register_node({"techage:ta4_detector_off", "techage:ta4_detector_on"}, { - on_push_item = function(pos, in_dir, stack) - local leftover = techage.safe_push_items(pos, in_dir, stack) - if leftover then - local inv = minetest.get_inventory({type = "node", pos = pos}) - if not inv or inv:is_empty("cfg") or inv:contains_item("cfg", ItemStack(stack:get_name())) then - local nvm = techage.get_nvm(pos) - local num_moved = stack:get_count() - if leftover ~= true then - num_moved = num_moved - leftover:get_count() - end - - if nvm.countdown and nvm.countdown > 0 then - nvm.countdown = nvm.countdown - num_moved - if nvm.countdown <= 0 then - M(pos):set_int("countdown", 0) - if leftover == true or leftover:get_count() ~= stack:get_count() then - switch_on(pos) - end - end - elseif nvm.countdown == nil then - if leftover == true or leftover:get_count() ~= stack:get_count() then - switch_on(pos) - end - end - nvm.counter = (nvm.counter or 0) + num_moved - end - return leftover - end - return false - end, - is_pusher = true, -- is a pulling/pushing node - - on_recv_message = function(pos, src, topic, payload) - if topic == "count" then - local nvm = techage.get_nvm(pos) - return nvm.counter or 0 - elseif topic == "countdown" then - local nvm = techage.get_nvm(pos) - nvm.countdown = tonumber(payload) or 0 - M(pos):set_int("countdown", nvm.countdown) - return true - elseif topic == "reset" then - local nvm = techage.get_nvm(pos) - nvm.counter = 0 - nvm.countdown = nil - return true - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 6 then -- Detector Block Reset - local nvm = techage.get_nvm(pos) - nvm.counter = 0 - nvm.countdown = nil - return 0 - elseif topic == 5 then -- Detector Block Countdown - local nvm = techage.get_nvm(pos) - nvm.countdown = tonumber(payload[1]) or 0 - M(pos):set_int("countdown", nvm.countdown) - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 139 then - local nvm = techage.get_nvm(pos) - return 0, {nvm.counter or 0} - else - return 2, "" - end - end, -}) diff --git a/techage/logic/flipflop.lua b/techage/logic/flipflop.lua deleted file mode 100644 index 756ec6b..0000000 --- a/techage/logic/flipflop.lua +++ /dev/null @@ -1,147 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Flip-flop - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local DESCR = S("TA3 Flip-Flop") - -local logic = techage.logic - -local function switch_on(pos) - logic.swap_node(pos, "techage:ta3_flipflop_on") - logic.send_on(pos, M(pos)) -end - -local function switch_off(pos) - logic.swap_node(pos, "techage:ta3_flipflop_off") - logic.send_off(pos, M(pos)) -end - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - - return "formspec_version[4]size[10,3.5]".. - "box[0.2,0.2;9.6,0.6;#c6e8ff]" .. - "label[0.4,0.5;" .. minetest.colorize( "#000000", DESCR) .. "]" .. - - "field[1.0,1.5;8,0.6;numbers;" .. S("Insert destination node number(s)") .. ";" .. numbers .. "]" .. - - "button_exit[3.5,2.7;3,0.6;exit;" .. S("Save") .. "]" -end - -local function techage_set_numbers(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, DESCR) - meta:set_string("formspec", formspec(meta)) - return true --res -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = minetest.get_meta(pos) - if fields.exit and fields.exit ~= "" then - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), DESCR) - end - meta:set_string("formspec", formspec(meta)) - elseif fields.exit == "close" then - meta:set_string("formspec", formspec(meta)) - end -end - -minetest.register_node("techage:ta3_flipflop_off", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_flipflop.png", - }, - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta3_flipflop_off", DESCR) - logic.infotext(meta, DESCR) - meta:set_string("formspec", formspec(meta)) - end, - - on_timer = function (pos, elapsed) - switch_on(pos) - end, - - on_receive_fields = on_receive_fields, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta3_flipflop_on", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_flipflop_on.png", - }, - - on_timer = function (pos, elapsed) - switch_off(pos) - end, - - on_receive_fields = on_receive_fields, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_flipflop_off" -}) - -minetest.register_craft({ - output = "techage:ta3_flipflop_off", - recipe = { - {"", "group:wood", ""}, - {"default:mese_crystal_fragment", "default:steel_ingot", "techage:vacuum_tube"}, - {"", "group:wood", ""}, - }, -}) - -techage.register_node({ - "techage:ta3_flipflop_off", "techage:ta3_flipflop_on" - }, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - minetest.get_node_timer(pos):start(0.1) - return true - elseif topic == "off" then - return true - else - return "unsupported" - end - end, - } -) diff --git a/techage/logic/gaze_sensor.lua b/techage/logic/gaze_sensor.lua deleted file mode 100644 index 3144751..0000000 --- a/techage/logic/gaze_sensor.lua +++ /dev/null @@ -1,244 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Gaze Sensor - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic -local CYCLE_TIME = 2 -local DESCR = S("TA4 Gaze Sensor") -local MAX_PLAYER_DIST = 30 - -local WRENCH_MENU = { - { - type = "ascii", - name = "names", - label = S("Player Names"), - tooltip = S("Input the player name(s) separated by blanks.\nIf empty, only the owner is accepted."), - default = "", - }, - { - type = "numbers", - name = "numbers", - label = S("Number"), - tooltip = S("Destination block number(s)"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command1", - label = "On " .. S("Command"), - tooltip = S("Command to send when sensor is viewed"), - default = "on", - }, - { - type = "ascii", - name = "command2", - label = "Off " .. S("Command"), - tooltip = S("Command to send when sensor is no longer viewed"), - default = "off", - }, -} - -local function switch_on(pos) - if logic.swap_node(pos, "techage:ta4_gaze_sensor_on") then - logic.send_cmnd(pos, "command1", "on") - end -end - -local function switch_off(pos) - if logic.swap_node(pos, "techage:ta4_gaze_sensor_off") then - logic.send_cmnd(pos, "command2", "off") - end -end - -local function get_players(pos) - local meta = minetest.get_meta(pos) - local names = meta:get_string("names") or "" - local t = string.split(names, " ") or {} - t[#t + 1] = meta:get_string("owner") - return t -end - -local function player_focuses_block(pos, name, obj) - obj = obj or minetest.get_player_by_name(name) - if obj then - local player_pos = obj:get_pos() - player_pos.y = player_pos.y + 1.5 - local dist = vector.distance(pos, player_pos) - if dist < MAX_PLAYER_DIST then - local dir = obj:get_look_dir() - if dir then - local vec1 = vector.multiply(dir, dist) - local pos1 = vector.round(vector.add(player_pos, vec1)) - if vector.equals(pos, pos1) then - local item = obj:get_wielded_item() - if not item or item:get_name() ~= "techage:end_wrench" then - return true - end - end - end - end - end - return false -end - -local function scan_for_player(pos) - local mem = techage.get_mem(pos) - mem.players = mem.players or get_players(pos) - if mem.players[1] == "***" then - for _, obj in ipairs(minetest.get_objects_inside_radius(pos, MAX_PLAYER_DIST)) do - if player_focuses_block(pos, "", obj) then - mem.player_name = obj:get_player_name() - return true - end - end - else - for _, name in ipairs(mem.players) do - if player_focuses_block(pos, name, nil) then - mem.player_name = name - return true - end - end - end - mem.player_name = "" - return false -end - -local function ta_after_formspec(pos, fields, playername) - if fields.save then - local mem = techage.get_mem(pos) - mem.players = nil - end -end - -minetest.register_node("techage:ta4_gaze_sensor_off", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_gaze_sensor.png", - }, - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta4_gaze_sensor_off", DESCR) - logic.infotext(meta, DESCR) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_timer = function (pos, elapsed) - if scan_for_player(pos) then - switch_on(pos) - end - return true - end, - - techage_set_numbers = function(pos, numbers, player_name) - return logic.set_numbers(pos, numbers, player_name, DESCR) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - ta4_formspec = WRENCH_MENU, - ta_after_formspec = ta_after_formspec, - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta4_gaze_sensor_on", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_gaze_sensor_on.png", - }, - - on_timer = function (pos, elapsed) - if not scan_for_player(pos) then - switch_off(pos) - end - return true - end, - - techage_set_numbers = function(pos, numbers, player_name) - return logic.set_numbers(pos, numbers, player_name, DESCR) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - ta4_formspec = WRENCH_MENU, - ta_after_formspec = ta_after_formspec, - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta4_gaze_sensor_off" -}) - -minetest.register_craft({ - output = "techage:ta4_gaze_sensor_off", - recipe = { - {"dye:blue", "techage:aluminum", "dye:blue"}, - {"default:copper_ingot", "techage:ta4_wlanchip", "default:wood"}, - }, -}) - -techage.register_node({ - "techage:ta4_gaze_sensor_off", "techage:ta4_gaze_sensor_on", - }, { - on_recv_message = function(pos, src, topic, payload) - if topic == "name" then - local mem = techage.get_mem(pos) - return mem.player_name or "" - elseif topic == "state" then - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta4_gaze_sensor_on" then - return "on" - else - return "off" - end - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 144 then -- Player Name - local mem = techage.get_mem(pos) - return 0, mem.player_name or "" - elseif topic == 142 then -- Binary State - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta4_gaze_sensor_on" then - return 0, {1} - else - return 0, {0} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - } -) diff --git a/techage/logic/lib.lua b/techage/logic/lib.lua deleted file mode 100644 index 2938e73..0000000 --- a/techage/logic/lib.lua +++ /dev/null @@ -1,110 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Logic library - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -techage.logic = {} - -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 position, --- the node param2, and a route table like : {0,0,3} --- 0 = forward, 1 = right, 2 = backward, 3 = left -function techage.logic.dest_pos(pos, param2, route) - local p2 = param2 - for _,dir in ipairs(route) do - p2 = (param2 + dir) % 4 - pos = vector.add(pos, Face2Dir[p2]) - end - return pos, p2 -end - -function techage.logic.swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return false - end - node.name = name - minetest.swap_node(pos, node) - return true -end - -function techage.logic.after_place_node(pos, placer, name, descr) - local meta = M(pos) - local own_num = techage.add_node(pos, name) - meta:set_string("node_number", own_num) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", descr.." -") -end - -function techage.logic.send_on(pos, meta, time) - local own_num = meta:get_string("node_number") or "" - local numbers = meta:get_string("numbers") or "" - if time and time > 0 then - minetest.get_node_timer(pos):start(time) - end - techage.send_multi(own_num, numbers, "on") - return own_num == numbers -end - -function techage.logic.send_cmnd(pos, ident, default, time) - local meta = M(pos) - local s = meta:contains(ident) and meta:get_string(ident) or default - local command, payload = unpack(string.split(s, " ", false, 1)) - local own_num = meta:get_string("node_number") or "" - local numbers = meta:get_string("numbers") or "" - if time and time > 0 then - minetest.get_node_timer(pos):start(time) - end - if command and command ~= "" then - techage.send_multi(own_num, numbers, command, payload) - end -end - -function techage.logic.send_off(pos, meta) - local own_num = meta:get_string("node_number") or "" - local numbers = meta:get_string("numbers") or "" - techage.send_multi(own_num, numbers, "off") -end - -function techage.logic.infotext(meta, descr, text) - local own_num = meta:get_string("node_number") or "" - local numbers = meta:get_string("numbers") or "" - if numbers ~= "" then - meta:set_string("infotext", descr.." "..own_num..": "..S("connected with").." "..numbers) - elseif text then - meta:set_string("infotext", descr.." "..own_num..": "..text) - else - meta:set_string("infotext", descr.." "..own_num) - end -end - -function techage.logic.set_numbers(pos, numbers, player_name, descr) - if techage.check_numbers(numbers, player_name) then - local meta = M(pos) - meta:set_string("numbers", numbers) - techage.logic.infotext(meta, descr) - return true - end - return false -end diff --git a/techage/logic/light_detector.lua b/techage/logic/light_detector.lua deleted file mode 100755 index 4072f88..0000000 --- a/techage/logic/light_detector.lua +++ /dev/null @@ -1,189 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Light Detector - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end - -local logic = techage.logic -local CYCLE_TIME = 2 - -local function switch_off(pos) - local node = minetest.get_node(pos) - if node.name == "techage:ta3_lightdetector_on" then - logic.swap_node(pos, "techage:ta3_lightdetector_off") - logic.send_off(pos, M(pos)) - end -end - -local function switch_on(pos) - logic.swap_node(pos, "techage:ta3_lightdetector_on") - if logic.send_on(pos, M(pos)) then - minetest.after(1, switch_off, pos) - end -end - -local function node_timer(pos) - - local nvm = techage.get_nvm(pos) - - local trigger = nvm.mode or 7 - - local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} - if minetest.get_node_light(pos_above, nil) == nil then - switch_off(pos) - return true - end - - if minetest.get_node_light(pos_above, nil) > trigger then - switch_on(pos) - else - switch_off(pos) - end - return true -end - -local function formspec(meta, nvm) - local numbers = meta:get_string("numbers") or "" - local dropdown_label = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15" -- Has to be a cleaner way of doing this, but it's just easier this way - return "size[7.5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "label[0.2,1.6;"..S("Send signal if light level is above:").."]".. - "dropdown[0.2,2.1;7.3,1;mode;"..dropdown_label.."; "..(nvm.mode or 7).."]".. - "button_exit[2,3.2;3,1;accept;"..S("accept").."]" -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = minetest.get_meta(pos) - local nvm = techage.get_nvm(pos) - - if fields.accept then - nvm.mode = tonumber(fields.mode) or 7 - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), S("TA3 Light Detector")) - end - meta:set_string("formspec", formspec(meta, nvm)) - end -end - -local function techage_set_numbers(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Light Detector")) - meta:set_string("formspec", formspec(meta)) - return res -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) -end - -minetest.register_node("techage:ta3_lightdetector_off", { - description = S("TA3 Light Detector"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_lightdetector.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR90", - }, - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - logic.after_place_node(pos, placer, "techage:ta3_lightdetector_off", S("TA3 Light Detector")) - logic.infotext(meta, S("TA3 Light Detector")) - meta:set_string("formspec", formspec(meta, nvm)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_receive_fields = on_receive_fields, - on_timer = node_timer, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta3_lightdetector_on", { - description = "TA3 Light Detector (On)", - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_lightdetector_on.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR90", - }, - on_receive_fields = on_receive_fields, - on_timer = node_timer, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_lightdetector_off" -}) - -minetest.register_craft({ - output = "techage:ta3_lightdetector_off", - recipe = { - {"", "group:wood", "default:glass"}, - {"", "default:copper_ingot", "techage:vacuum_tube"}, - {"", "group:wood", "default:mese_crystal"}, - }, -}) - -techage.register_node({"techage:ta3_lightdetector_off", "techage:ta3_lightdetector_on"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_lightdetector_on" then - return "on" - else - return "off" - end - elseif topic == "light_level" then -- Allow finding the specific light level - local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} - return minetest.get_node_light(pos_above, nil) - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 142 then -- Binary State - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_lightdetector_on" then - return 0, {1} - else - return 0, {0} - end - elseif topic == 143 then -- Allow finding the specific light level - local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} - return 0, {minetest.get_node_light(pos_above, nil)} - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) diff --git a/techage/logic/logic_block.lua b/techage/logic/logic_block.lua deleted file mode 100644 index e15d652..0000000 --- a/techage/logic/logic_block.lua +++ /dev/null @@ -1,435 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Logic Block 2 - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local logic = techage.logic -local NUM_RULES = 4 - -local HELP = S("Send an 'on'/'off' command if the\nexpression becomes true.\n") .. - S("\nRule:\n = on/off if is true\n") .. - S("\n is the block number to which the\ncommand should be sent.\n") .. - S("\n is a boolean expression\nwhere input numbers are evaluated.\n") .. - S("\nExamples:\n1234 == on\n1234 == off\n1234 == on and 2345 == off\n2345 ~= 3456\n") .. - S("\nValid operators:\nand or on off me == ~= ( )\n") .. - S("'~=' means: not equal\n") .. - S("'me' has to be used for the own block number.\n") .. - S("\nAll rules are checked with each received\ncommand.") .. - S("\nThe internal processing time for all\ncommands is 100 ms.") - -local ValidSymbols = { - ["me"] = true, - ["and"] = true, - ["or"] = true, - ["on"] = true, - ["off"] = true, - ["=="] = true, - ["~="] = true, - ["("] = true, - [")"] = true, -} - -local Dropdown = { - [""] = 1, - ["on"] = 2, - ["off"] = 3 -} - -local function check_expr(pos, expr) - local nvm = techage.get_nvm(pos) - local origin = expr - -- Add blanks for the syntax check - expr = expr:gsub("==", " == ") - expr = expr:gsub("~=", " ~= ") - expr = expr:gsub("%(", " ( ") - expr = expr:gsub("%)", " ) ") - - -- First syntax check - local old_sym = "or" -- valid default value - for sym in expr:gmatch("[^%s]+") do - if not ValidSymbols[sym] and string.find(sym, '^[0-9]+$') == nil then - return "Unexpected symbol '"..sym.."'" - end - if string.find(sym, '^[0-9]+$') and sym == nvm.own_num then - return "Invalid node number '"..sym.."'" - end - -- function call check - if sym == "(" and (old_sym ~= "and" and old_sym ~= "or") then - return "Syntax error at '" .. sym .. "'" - end - old_sym = sym - end - -- Second syntax check - local code, _ = loadstring("return " .. expr) - if not code then - return "Syntax error in '" .. origin .. "'" - end -end - -local function check_num(pos, num, player_name) - local nvm = techage.get_nvm(pos) - - if num ~= "me" and (num == nvm.own_num or - not techage.check_numbers(num, player_name)) then - return "Invalid node number '"..num.."'" - end -end - -local function debug(mem, text) - mem.debug = mem.debug or {} - if #mem.debug > 20 then - table.remove(mem.debug, 1) - end - local s = string.format("%.3f", techage.SystemTime) .. " s: " .. text - table.insert(mem.debug, s) -end - -local function send(pos, num, val) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - debug(mem, "(outp) " .. num .. " = " .. val) - - if num == "me" then - nvm.outp_tbl = nvm.outp_tbl or {} - nvm.outp_tbl.me = val - -- set the input directly - nvm.inp_tbl = nvm.inp_tbl or {} - nvm.inp_tbl.me = val - else - nvm.outp_tbl = nvm.outp_tbl or {} - nvm.outp_tbl[num] = val - nvm.own_num = nvm.own_num or M(pos):get_string("node_number") - techage.send_single(nvm.own_num, num, val) - end -end - -local function get_inputs(pos) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - -- old data is needed for formspec 'input' values - nvm.old_inp_tbl = table.copy(nvm.inp_tbl or {}) - for _, num in ipairs(mem.outp_num or {}) do - nvm.old_inp_tbl[num] = nvm.outp_tbl[num] or "off" - end - return nvm.old_inp_tbl -end - -local function check_syntax(pos, line, owner, outp, expr) - local err = check_num(pos, outp, owner) - if not err then - err = check_expr(pos, expr) - if not err then - return true, "ok" - end - end - return false, "Error(" .. line .. "): " .. err -end - -local function compile(nvm, str) - if str then - local code, _ = loadstring(str) - if code then - nvm.error = "ok" - return code - else - nvm.error = "Unknown compile error" - end - end -end - -local function data(nvm) - local inp = {} - local outp = {} - for num, val in pairs(nvm.old_inp_tbl or {}) do - if num == nvm.own_num then num = "me" end - inp[#inp+1] = num .. " = " .. tostring(val) - end - for num, val in pairs(nvm.outp_tbl or {}) do - if num == nvm.own_num then num = "me" end - outp[#outp+1] = num .. " = " .. tostring(val) - end - return table.concat(inp, ", "), table.concat(outp, ", ") -end - -local function get_code(pos, nvm, mem) - local meta = M(pos) - local tbl = {"local inputs = get_inputs(pos) or {}"} - local owner = M(pos):get_string("owner") - nvm.own_num = nvm.own_num or M(pos):get_string("node_number") - mem.outp_num = {} - - for i = 1,NUM_RULES do - local outp = meta:get_string("outp" .. i) - local val = meta:get_string("val" .. i) - local expr = meta:get_string("expr" .. i) - - if outp ~= "" and val ~= "" and expr ~= "" then - local res, err = check_syntax(pos, i, owner, outp, expr) - if res then - expr = string.gsub(expr, '([0-9]+)', 'inputs["%1"]') - expr = string.gsub(expr, 'me', 'inputs["me"]') - expr = string.gsub(expr, 'on', '"on"') - expr = string.gsub(expr, 'off', '"off"') - tbl[#tbl + 1] = "if "..expr.." then send(pos, '"..outp.."', '"..val.."') end" - table.insert(mem.outp_num, outp) - else - nvm.error = err - return - end - end - end - - local str = table.concat(tbl, "\n") - local code = compile(nvm, str) - if code then - local env = {} - env.send = send - env.pos = pos - env.get_inputs = get_inputs - setfenv(code, env) - - return code - end -end - -local function execute(pos) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.code = mem.code or get_code(pos, nvm, mem) - if mem.code then - local res, _ = pcall(mem.code) - if not res then - nvm.error = "Unknown runtime error" - mem.code = nil - end - end -end - -local function rules(meta) - local tbl = {} - - tbl[#tbl + 1] = "label[-0.2,0;]" - tbl[#tbl + 1] = "label[1.4,0;=]" - tbl[#tbl + 1] = "label[1.8,0;]" - tbl[#tbl + 1] = "label[3.5,0;if]" - tbl[#tbl + 1] = "label[4.2,0; is true]" - - - for i = 1,NUM_RULES do - local y1 = (i * 0.9) - 0.1 - local y2 = (i * 0.9) - 0.2 - local y3 = (i * 0.9) - 0.3 - local outp = meta:get_string("outp" .. i) - local val = meta:get_string("val" .. i) - local expr = meta:get_string("expr" .. i) - val = Dropdown[val] or 1 - - tbl[#tbl + 1] = "field[0," .. y1 .. ";1.6,1;outp" .. i ..";;" .. outp .. "]" - tbl[#tbl + 1] = "label[1.4," .. y2 .. ";=]" - tbl[#tbl + 1] = "dropdown[1.8," .. y3 .. ";1.6,1;val" .. i ..";,on,off;" .. val .. "]" - tbl[#tbl + 1] = "label[3.5," .. y2 .. ";if]" - tbl[#tbl + 1] = "field[4.2," .. y1 .. ";5.6,1;expr" .. i ..";;" .. expr .. "]" - end - return table.concat(tbl, "") -end - -local function formspec(pos, meta) - local nvm = techage.get_nvm(pos) - local err = nvm.error or "ok" - err = minetest.formspec_escape(err) - nvm.io_tbl = nvm.io_tbl or {} - local inputs, outputs = data(nvm) - local bt = nvm.blocking_time or 1 - return "size[10,8.2]" .. - "tabheader[0,0;tab;"..S("Rules") .. "," .. S("Help") .. "," .. S("Debug") .. ";1;;true]" .. - "container[0.4,0.1]" .. - rules(meta) .. - "container_end[]" .. - - "label[0.2,4.4;" .. S("Blocking Time") .. "]".. - "field[4.6,4.5;2,1;bt;;" .. bt .. "]".. - "label[6.3,4.4;s]".. - - "label[0,5.3;" .. S("Inputs") .. ":]" .. - "label[2,5.3;" .. inputs .."]" .. - "label[0,5.9;" .. S("Outputs") .. ":]" .. - "label[2,5.9;" .. outputs .."]" .. - "label[0,6.5;" .. S("Syntax") .. ":]" .. - "label[2,6.5;" .. err .. "]" .. - "button[1.5,7.5;3,1;update;" .. S("Update") .. "]" .. - "button[5.6,7.5;3,1;store;" .. S("Store") .. "]" -end - -local function formspec_help() - return "size[10,8.2]" .. - "tabheader[0,0;tab;"..S("Rules") .. "," .. S("Help") .. "," .. S("Debug") .. ";2;;true]" .. - "textarea[0.3,0.3;9.9,8.5;;;"..minetest.formspec_escape(HELP).."]" -end - -local function formspec_debug(mem) - mem.debug = mem.debug or {} - local s = table.concat(mem.debug, "\n") - return "size[10,8.2]" .. - "tabheader[0,0;tab;"..S("Rules") .. "," .. S("Help") .. "," .. S("Debug") .. ";3;;true]" .. - "textarea[0.3,0.3;9.9,8.5;;;"..minetest.formspec_escape(s).."]" .. - "button[1.5,7.5;3,1;update2;" .. S("Update") .. "]" .. - "button[5.6,7.5;3,1;clear;" .. S("Clear") .. "]" -end - -minetest.register_node("techage:ta3_logic2", { - description = S("TA3 Logic Block"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_logic.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - logic.after_place_node(pos, placer, "techage:ta3_logic2", S("TA3 Logic Block")) - logic.infotext(meta, S("TA3 Logic Block")) - meta:set_string("formspec", formspec(pos, meta)) - meta:set_string("owner", placer:get_player_name()) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - - if fields.store then - for i = 1,NUM_RULES do - meta:set_string("outp" .. i, fields["outp" .. i] or "") - meta:set_string("val" .. i, fields["val" .. i] or "") - meta:set_string("expr" .. i, fields["expr" .. i] or "") - end - local nvm = techage.get_nvm(pos) - nvm.blocking_time = tonumber(fields.bt) or 0.1 - nvm.inp_tbl = {me = "off"} - nvm.outp_tbl = {} - elseif fields.update2 then - local mem = techage.get_mem(pos) - meta:set_string("formspec", formspec_debug(mem)) - elseif fields.clear then - local mem = techage.get_mem(pos) - mem.debug = {} - meta:set_string("formspec", formspec_debug(mem)) - end - - if fields.tab == "2" then - meta:set_string("formspec", formspec_help()) - elseif fields.tab == "3" then - local mem = techage.get_mem(pos) - meta:set_string("formspec", formspec_debug(mem)) - else - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - mem.code = nil - get_code(pos, nvm, mem) - meta:set_string("formspec", formspec(pos, meta)) - end - end, - - on_timer = function(pos) - execute(pos) - return false - end, - - on_rightclick = function(pos, node, clicker) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec(pos, meta)) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta3_logic2", - recipe = { - {"", "group:wood", ""}, - {"techage:vacuum_tube", "default:copper_ingot", "techage:vacuum_tube"}, - {"", "group:wood", ""}, - }, -}) - -techage.register_node({"techage:ta3_logic2"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - nvm.own_num = nvm.own_num or M(pos):get_string("node_number") - nvm.blocking_time = nvm.blocking_time or M(pos):get_float("blocking_time") - nvm.inp_tbl = nvm.inp_tbl or {} - - if src ~= nvm.own_num then - if topic == "on" then - debug(mem, "(inp) " .. src .. " = on") - nvm.inp_tbl[src] = "on" - elseif topic == "off" then - debug(mem, "(inp) " .. src .. " = off") - nvm.inp_tbl[src] = "off" - else - debug(mem, "(inp) invalid command") - return "unsupported" - end - - local t = math.max((mem.ttl or 0) - techage.SystemTime, 0.1) - minetest.get_node_timer(pos):start(t) - mem.ttl = techage.SystemTime + (nvm.blocking_time or 0) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - nvm.own_num = nvm.own_num or M(pos):get_string("node_number") - nvm.blocking_time = nvm.blocking_time or M(pos):get_float("blocking_time") - nvm.inp_tbl = nvm.inp_tbl or {} - - if src ~= nvm.own_num then - if topic == 1 and payload[1] == 1 then - debug(mem, "(inp) " .. src .. " = on") - nvm.inp_tbl[src] = "on" - return 0 - elseif topic == 1 and payload[1] == 0 then - debug(mem, "(inp) " .. src .. " = off") - nvm.inp_tbl[src] = "off" - return 0 - else - debug(mem, "(inp) invalid command") - return 2 - end - local t = math.max((mem.ttl or 0) - techage.SystemTime, 0.1) - minetest.get_node_timer(pos):start(t) - mem.ttl = techage.SystemTime + (nvm.blocking_time or 0) - end - end, -}) diff --git a/techage/logic/lua_logic.lua b/techage/logic/lua_logic.lua deleted file mode 100644 index 48e3418..0000000 --- a/techage/logic/lua_logic.lua +++ /dev/null @@ -1,264 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Lua Logic Block (Deprecated and replaced by "techage:ta3_logic2") - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local logic = techage.logic - --- mem.inp_tbl = { --- n001 = true, -- "on" received --- n002 = false, -- "off" received --- inp = true, -- last input --- outp = false, -- last output --- } - -local ValidSymbols = { - ["if"] = true, - ["then"] = true, - ["else"] = true, - ["end"] = true, - ["return"] = true, - ["not"] = true, - ["and"] = true, - ["or"] = true, - ["inp"] = true, - ["outp"] = true, - ["true"] = true, - ["false"] = true, - ["nil"] = true, - ["=="] = true, - ["~="] = true, - ["("] = true, - [")"] = true, -} -local function check(expression) - for _, sym in ipairs(string.split(expression, " ")) do - if not ValidSymbols[sym] and string.find(sym, '^[n0-9]+$') == nil then - return false, "Error: Invalid symbol '"..sym.."'" - end - end - return true, "ok" -end - -local function compile(nvm, expression) - local res, err = check(expression) - if res then - local code, err = loadstring(expression, "") - if code then - nvm.code = code - nvm.error = "ok" - else - nvm.code = nil - nvm.error = err - end - else - nvm.code = nil - nvm.error = err - end -end - -local function get_code(pos, nvm) - local meta = M(pos) - local if_expr = meta:get_string("if_expr") or "" - local then_expr = meta:get_string("then_expr") or "" - local else_expr = meta:get_string("else_expr") or "" - local expr = "if "..if_expr.." then return "..then_expr.." else return "..else_expr.." end" - compile(nvm, expr) - return nvm.code -end - -local function eval(pos, nvm) - nvm.code = nvm.code or get_code(pos, nvm) - if nvm.code then - setfenv(nvm.code, nvm.inp_tbl) - local res, sts = pcall(nvm.code) - if res then - nvm.error = "ok" - if sts == true and nvm.inp_tbl.outp ~= true then - nvm.inp_tbl.outp = sts - return "on" - elseif sts == false and nvm.inp_tbl.outp ~= false then - nvm.inp_tbl.outp = sts - return "off" - end - else - nvm.error = "Error: "..sts - end - end -end - -local function data(nvm) - local tbl = {"inp = "..dump(nvm.inp_tbl.inp), "outp = "..dump(nvm.inp_tbl.outp)} - for k,v in pairs(nvm.inp_tbl) do - if k ~= "inp" and k ~= "outp" then - tbl[#tbl+1] = k.." = "..dump(v) - end - end - return table.concat(tbl, ", ") -end - -local function formspec(pos, meta) - local nvm = techage.get_nvm(pos) - local numbers = meta:get_string("numbers") or "" - local if_expr = meta:get_string("if_expr") or "" - local then_expr = meta:get_string("then_expr") or "" - local else_expr = meta:get_string("else_expr") or "" - local err = nvm.error or "ok" - if err ~= "ok" then - err = string.sub(err, 15) - end - err = minetest.formspec_escape(err) - nvm.inp_tbl = nvm.inp_tbl or {inp = false, outp = false} - local data = data(nvm) - return "size[9,8]".. - "background[0,0;9,1.3;techage_formspec_bg.png]".. - "field[0.5,0.2;8.5,2;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "label[0,1.4;Variables: "..data.."]".. - "label[0,2;Valid symbols: not and or true false nil == ~= ( )]".. - "background[0,2.6;9,4;techage_formspec_bg.png]".. - "label[0.1,2.8;if]".. - "field[0.8,2.9;7,1;if_expr;;"..if_expr.."]" .. - "label[7.6,2.8;then]".. - "label[0.6,3.8;return]".. - "field[2,3.9;7,1;then_expr;;"..then_expr.."]" .. - "label[0.1,4.5;else]".. - "label[0.6,5.2;return]".. - "field[2,5.3;7,1;else_expr;;"..else_expr.."]" .. - "label[0.1,6;end]".. - "label[0,6.8;Result: "..err.."]".. - "button[2,7.3;2.5,1;update;"..S("Update").."]".. - "button[5,7.3;2.5,1;store;"..S("Store").."]" -end - -minetest.register_node("techage:ta3_logic", { - description = S("TA3 Logic Block"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_logic.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.inp_tbl = {inp = false, outp = false} - logic.after_place_node(pos, placer, "techage:ta3_logic", S("TA3 Logic Block")) - logic.infotext(meta, S("TA3 Logic Block")) - meta:set_string("formspec", formspec(pos, meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - if fields.numbers and fields.numbers ~= "" then - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), S("TA3 Logic Block")) - end - end - if fields.if_expr and fields.if_expr ~= "" then - meta:set_string("if_expr", fields.if_expr) - end - if fields.then_expr and fields.then_expr ~= "" then - meta:set_string("then_expr", fields.then_expr) - end - if fields.else_expr and fields.else_expr ~= "" then - meta:set_string("else_expr", fields.else_expr) - end - if fields.store then - get_code(pos, nvm) - end - meta:set_string("formspec", formspec(pos, meta)) - end, - - on_timer = function(pos,elapsed) - local nvm = techage.get_nvm(pos) - local topic = eval(pos, nvm) - if topic then - local meta = M(pos) - local own_num = meta:get_string("node_number") or "" - local numbers = meta:get_string("numbers") or "" - techage.send_multi(own_num, numbers, topic) - end - return false - end, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Logic Block")) - meta:set_string("formspec", formspec(pos, meta)) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - drop = "techage:ta3_logic2", - sounds = default.node_sound_wood_defaults(), -}) - - --- Deprecated and replaced by "techage:ta3_logic2" ---minetest.register_craft({ --- output = "techage:ta3_logic", --- recipe = { --- {"", "group:wood", ""}, --- {"", "default:copper_ingot", "techage:vacuum_tube"}, --- {"", "group:wood", ""}, --- }, ---}) - -techage.register_node({"techage:ta3_logic"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - nvm.inp_tbl = nvm.inp_tbl or {outp = false} - - if topic == "on" then - nvm.inp_tbl.inp = true - nvm.inp_tbl["n"..src] = true - elseif topic == "off" then - nvm.inp_tbl.inp = false - nvm.inp_tbl["n"..src] = false - else - return "unsupported" - end - minetest.get_node_timer(pos):start(0.1) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 1 and payload[1] == 1 then - nvm.inp_tbl.inp = true - nvm.inp_tbl["n"..src] = true - return 0 - elseif topic == 1 and payload[1] == 0 then - nvm.inp_tbl.inp = false - nvm.inp_tbl["n"..src] = false - return 0 - else - return 2 - end - end, - on_node_load = function(pos) - end, -}) diff --git a/techage/logic/mba_detector.lua b/techage/logic/mba_detector.lua deleted file mode 100644 index ab5d744..0000000 --- a/techage/logic/mba_detector.lua +++ /dev/null @@ -1,116 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Mapblock Active Detector - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic - -minetest.register_node("techage:ta4_mbadetector", { - description = "TA4 Mapblock Active Detector", - inventory_image = 'techage_smartline_mba_detector_inv.png', - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_smartline_mba_detector.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta4_mbadetector", S("TA4 Mapblock Active Detector")) - logic.infotext(meta, S("TA4 Mapblock Active Detector")) - minetest.get_node_timer(pos):start(1) - end, - - on_timer = function(pos, elapsed) - local mem = techage.get_mem(pos) - mem.gametime = minetest.get_gametime() - return true - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta4_mbadetector", - recipe = { - {"", "group:wood", "default:mese_crystal"}, - {"", "techage:vacuum_tube", "default:copper_ingot"}, - {"", "group:wood", ""}, - }, -}) - -techage.register_node({"techage:ta4_mbadetector"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - if minetest.compare_block_status then - if minetest.compare_block_status(pos, "active") then - return "on" - else - return "off" - end - else - local mem = techage.get_mem(pos) - local res = mem.gametime and mem.gametime > (minetest.get_gametime() - 2) - return res and "on" or "off" - end - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 142 then -- Binary State - if minetest.compare_block_status then - if minetest.compare_block_status(pos, "active") then - return 0, {1} - else - return 0, {0} - end - else - local mem = techage.get_mem(pos) - local res = mem.gametime and mem.gametime > (minetest.get_gametime() - 2) - return 0, {res and 1 or 0} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(1) - end, - } -) diff --git a/techage/logic/mesecons_converter.lua b/techage/logic/mesecons_converter.lua deleted file mode 100644 index e6a5cae..0000000 --- a/techage/logic/mesecons_converter.lua +++ /dev/null @@ -1,199 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Mesecons converter - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic -local OVER_LOAD_MAX = 10 -local CYCLE_TIME = 2 - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - return "size[7.5,3]".. - "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "button_exit[2,2;3,1;exit;"..S("Save").."]" -end - -local function send_message(pos, topic) - local meta = M(pos) - local mem = techage.get_mem(pos) - mem.overload_cnt = (mem.overload_cnt or 0) + 1 - if mem.overload_cnt > OVER_LOAD_MAX then - logic.infotext(M(pos), S("TA3 Mesecons Converter"), "fault (overloaded)") - techage.logic.swap_node(pos, "techage:ta3_mesecons_converter") - minetest.get_node_timer(pos):stop() - return false - end - local own_num = meta:get_string("node_number") - local numbers = meta:get_string("numbers") - techage.send_multi(own_num, numbers, topic) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), S("TA3 Mesecons Converter")) - meta:set_string("formspec", formspec(meta)) - end - minetest.get_node_timer(pos):start(CYCLE_TIME) -end - -local function on_timer(pos,elapsed) - local mem = techage.get_mem(pos) - mem.overload_cnt = 0 - return true -end - -local function techage_set_numbers(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Mesecons Converter")) - meta:set_string("formspec", formspec(meta)) - return res -end - -local function after_dig_node(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - mesecon.on_dignode(pos, oldnode) -end - - -minetest.register_node("techage:ta3_mesecons_converter", { - description = S("TA3 Mesecons Converter"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_mesecons_converter.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local mem = techage.get_mem(pos) - logic.after_place_node(pos, placer, "techage:ta3_mesecons_converter", S("TA3 Mesecons Converter")) - logic.infotext(meta, S("TA3 Mesecons Converter")) - meta:set_string("formspec", formspec(meta)) - mem.overload_cnt = -OVER_LOAD_MAX -- to prevent overload after placing - minetest.get_node_timer(pos):start(CYCLE_TIME) - mesecon.on_placenode(pos, minetest.get_node(pos)) - end, - - on_receive_fields = on_receive_fields, - on_timer = on_timer, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - - mesecons = { - receptor = { - state = mesecon.state.off, - rules = mesecon.rules.default, - }, - effector = { - rules = mesecon.rules.default, - action_on = function(pos, node) - techage.logic.swap_node(pos, "techage:ta3_mesecons_converter_on") - send_message(pos, "on") - end, - action_off = function(pos, node) - end, - action_change = function(pos, node) - techage.logic.swap_node(pos, "techage:ta3_mesecons_converter_on") - send_message(pos, "on") - end, - } - }, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta3_mesecons_converter_on", { - description = S("TA3 Mesecons Converter"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_mesecons_converter.png", - }, - - on_receive_fields = on_receive_fields, - on_timer = on_timer, - techage_set_numbers = techage_set_numbers, - after_dig_node = after_dig_node, - - mesecons = { - receptor = { - state = mesecon.state.off, - rules = mesecon.rules.default, - }, - effector = { - rules = mesecon.rules.default, - action_on = function(pos, node) - end, - action_off = function(pos, node) - techage.logic.swap_node(pos, "techage:ta3_mesecons_converter") - send_message(pos, "off") - end, - action_change = function(pos, node) - techage.logic.swap_node(pos, "techage:ta3_mesecons_converter") - send_message(pos, "off") - end, - } - }, - - paramtype = "light", - light_source = 5, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_mesecons_converter", -}) - -minetest.register_craft({ - output = "techage:ta3_mesecons_converter", - recipe = { - {"techage:ta3_repeater", "mesecons:wire_00000000_off"}, - }, -}) - -techage.register_node({"techage:ta3_mesecons_converter", "techage:ta3_mesecons_converter_on"}, { - on_recv_message = function(pos, src, topic, payload) - local mem = techage.get_mem(pos) - mem.overload_cnt = (mem.overload_cnt or 0) + 1 - if mem.overload_cnt > OVER_LOAD_MAX then - logic.infotext(M(pos), S("TA3 Mesecons Converter"), "fault (overloaded)") - minetest.get_node_timer(pos):stop() - return false - elseif topic == "on" then - techage.logic.swap_node(pos, "techage:ta3_mesecons_converter_on") - mesecon.receptor_on(pos, mesecon.rules.default) - elseif topic == "off" then - techage.logic.swap_node(pos, "techage:ta3_mesecons_converter") - mesecon.receptor_off(pos, mesecon.rules.default) - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) diff --git a/techage/logic/node_detector.lua b/techage/logic/node_detector.lua deleted file mode 100644 index 0ebf3f4..0000000 --- a/techage/logic/node_detector.lua +++ /dev/null @@ -1,407 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Node Detector - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local MP = minetest.get_modpath("techage") -local mark = dofile(MP .. "/basis/mark_lib.lua") - -local logic = techage.logic -local CYCLE_TIME = 2 -local MAX_BLOCKS = 4 -local DESCR3 = S("TA3 Node Detector") -local DESCR4 = S("TA4 Node Detector") - -local function switch_on3(pos) - if logic.swap_node(pos, "techage:ta3_nodedetector_on") then - logic.send_on(pos, M(pos)) - end -end - -local function switch_off3(pos) - if logic.swap_node(pos, "techage:ta3_nodedetector_off") then - logic.send_off(pos, M(pos)) - end -end - -local function switch_on4(pos) - if logic.swap_node(pos, "techage:ta4_nodedetector_on") then - logic.send_on(pos, M(pos)) - end -end - -local function switch_off4(pos) - if logic.swap_node(pos, "techage:ta4_nodedetector_off") then - logic.send_off(pos, M(pos)) - end -end - -local DropdownValues = { - [S("added")] = 1, - [S("removed")] = 2, - [S("added or removed")] = 3, -} - -local AirLikeBlocks = {"air"} -local kvAirLikeBlocks = {air = 1} - -for i = 1,14 do - -- Add light blocks from the mod "wielded_light" to the air-like blocks - AirLikeBlocks[#AirLikeBlocks + 1] = "wielded_light:" .. i - kvAirLikeBlocks["wielded_light:" .. i] = 1 -end - -local function formspec3(meta, nvm) - local numbers = meta:get_string("numbers") or "" - local label = S("added")..","..S("removed")..","..S("added or removed") - return "size[7.5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.5,0.6;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "label[0.2,1.6;"..S("Send signal if nodes have been:").."]".. - "dropdown[0.2,2.1;7.3,1;mode;"..label..";"..(nvm.mode or 3).."]".. - "button_exit[2,3.2;3,1;accept;"..S("accept").."]" -end - -local function formspec4(meta, nvm) - local numbers = meta:get_string("numbers") or "" - local label = S("added")..","..S("removed")..","..S("added or removed") - return "size[7.5,6]".. - "box[0,-0.1;7.2,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", DESCR4) .. "]" .. - "button[0.1,0.6;3.6,1;record;" .. S("Record") .. "]" .. - "button[3.9,0.6;3.6,1;done;" .. S("Done") .. "]" .. - "field[0.5,2.6;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "label[0.2,3.6;"..S("Send signal if nodes have been:").."]".. - "dropdown[0.2,4.1;7.3,1;mode;"..label..";"..(nvm.mode or 3).."]".. - "button_exit[2,5.2;3,1;accept;"..S("accept").."]" -end - -local function any_node_changed3(pos) - local nvm = techage.get_nvm(pos) - if not nvm.pos1 or not nvm.pos2 or not nvm.num then - local node = minetest.get_node(pos) - local param2 = (node.param2 + 2) % 4 - nvm.pos1 = logic.dest_pos(pos, param2, {0}) - nvm.pos2 = logic.dest_pos(pos, param2, {0,0,0}) - nvm.num = #minetest.find_nodes_in_area(nvm.pos1, nvm.pos2, AirLikeBlocks) - return false - end - local num1 = #minetest.find_nodes_in_area(nvm.pos1, nvm.pos2, AirLikeBlocks) - local num2 = #minetest.find_nodes_in_area(nvm.pos1, nvm.pos2, {"ignore"}) - - if num2 == 0 and nvm.num ~= num1 then - if nvm.mode == 1 and num1 < nvm.num then - nvm.num = num1 - return true - elseif nvm.mode == 2 and num1 > nvm.num then - nvm.num = num1 - return true - elseif nvm.mode == 3 then - nvm.num = num1 - return true - end - nvm.num = num1 - end - return false -end - -local function any_node_changed4(pos) - local nvm = techage.get_nvm(pos) - nvm.lpos = nvm.lpos or {} - local num = 0 - for _,pos1 in ipairs(nvm.lpos) do - local name = minetest.get_node(pos1).name - if name == "ignore" then return false end - num = num + (kvAirLikeBlocks[name] or 0) - end - if not nvm.num then - nvm.num = num - elseif nvm.num ~= num then - if nvm.mode == 1 and num < nvm.num then - nvm.num = num - return true - elseif nvm.mode == 2 and num > nvm.num then - nvm.num = num - return true - elseif nvm.mode == 3 then - nvm.num = num - return true - end - nvm.num = num - end - return false -end - -local function on_receive_fields3(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local nvm = techage.get_nvm(pos) - local meta = M(pos) - if fields.accept then - nvm.mode = DropdownValues[fields.mode] or 3 - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), DESCR3) - end - end - meta:set_string("formspec", formspec3(meta, nvm)) -end - -local function on_receive_fields4(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local name = player:get_player_name() - local nvm = techage.get_nvm(pos) - local meta = M(pos) - - if fields.accept then - nvm.mode = DropdownValues[fields.mode] or 3 - if techage.check_numbers(fields.numbers, name) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), DESCR4) - end - mark.unmark_all(name) - mark.stop(name) - elseif fields.record then - nvm.lpos = {} - minetest.chat_send_player(name, "[techage] " .. S("Click on all blocks whose positions should be checked")) - mark.start(name, MAX_BLOCKS) - elseif fields.done then - local pos_list = mark.get_poslist(name) - minetest.chat_send_player(name, "[techage] " .. #pos_list.." "..S("block positions are stored.")) - nvm.lpos = pos_list - mark.unmark_all(name) - mark.stop(name) - end - meta:set_string("formspec", formspec4(meta, nvm)) -end - -local function node_timer3(pos) - if any_node_changed3(pos)then - switch_on3(pos) - else - switch_off3(pos) - end - return true -end - -minetest.register_node("techage:ta3_nodedetector_off", { - description = DESCR3, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR270", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_nodedetector.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - logic.after_place_node(pos, placer, "techage:ta3_nodedetector_off", DESCR3) - logic.infotext(meta, DESCR3) - nvm.mode = 3 -- default mode - meta:set_string("formspec", formspec3(meta, nvm)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - any_node_changed3(pos) - end, - - on_timer = node_timer3, - on_receive_fields = on_receive_fields3, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, DESCR3) - meta:set_string("formspec", formspec3(meta, techage.get_nvm(pos))) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - is_ground_content = false, - groups = {choppy=2, cracky=2, crumbly=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta3_nodedetector_on", { - description = DESCR3, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR270", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_nodedetector_on.png", - }, - - on_timer = node_timer3, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, DESCR3) - meta:set_string("formspec", formspec3(meta, techage.get_nvm(pos))) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - is_ground_content = false, - drop = "techage:ta3_nodedetector_off", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -local function node_timer4(pos) - if any_node_changed4(pos)then - switch_on4(pos) - else - switch_off4(pos) - end - return true -end - -minetest.register_node("techage:ta4_nodedetector_off", { - description = DESCR4, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png^[transformR270", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_nodedetector.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - logic.after_place_node(pos, placer, "techage:ta4_nodedetector_off", DESCR4) - logic.infotext(meta, DESCR4) - nvm.mode = 3 -- default mode - meta:set_string("formspec", formspec4(meta, nvm)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_timer = node_timer4, - on_receive_fields = on_receive_fields4, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, DESCR4) - meta:set_string("formspec", formspec4(meta, techage.get_nvm(pos))) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - is_ground_content = false, - groups = {choppy=2, cracky=2, crumbly=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta4_nodedetector_on", { - description = DESCR4, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png^[transformR270", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_nodedetector_on.png", - }, - - on_timer = node_timer4, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, DESCR4) - meta:set_string("formspec", formspec4(meta, techage.get_nvm(pos))) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_rotate = screwdriver.disallow, - paramtype2 = "facedir", - is_ground_content = false, - drop = "techage:ta4_nodedetector_off", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta3_nodedetector_off", - recipe = { - {"", "group:wood", ""}, - {"", "default:copper_ingot", "techage:vacuum_tube"}, - {"", "group:wood", "default:mese_crystal"}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_nodedetector_off", - recipe = { - {"", "dye:blue", ""}, - {"", "techage:ta3_nodedetector_off", ""}, - {"", "techage:ta4_wlanchip", ""}, - }, -}) - -techage.register_node({"techage:ta3_nodedetector_off", "techage:ta3_nodedetector_on", - "techage:ta4_nodedetector_off", "techage:ta4_nodedetector_on"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_nodedetector_off" or node.name == "techage:ta4_nodedetector_off" then - return "off" - else - return "on" - end - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 142 then - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_nodedetector_off" or node.name == "techage:ta4_nodedetector_off" then - return 0, {0} - else - return 0, {1} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) diff --git a/techage/logic/player_detector.lua b/techage/logic/player_detector.lua deleted file mode 100644 index e234b06..0000000 --- a/techage/logic/player_detector.lua +++ /dev/null @@ -1,382 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 & TA4 Player Detector - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local NDEF = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}) end - -local logic = techage.logic -local CYCLE_TIME = 1 - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "1,2,3,4,5,6,7,8", - name = "radius", - label = S("Radius"), - tooltip = S("Search radius"), - default = "4", - }, - { - type = "numbers", - name = "numbers", - label = S("Number"), - tooltip = S("Destination block number"), - default = "", - check = techage.check_numbers, - }, - { - type = "ascii", - name = "command1", - label = "On " .. S("Command"), - tooltip = S("Command to send when player is detected"), - default = "on", - }, - { - type = "ascii", - name = "command2", - label = "Off " .. S("Command"), - tooltip = S("Command to send when player moves away"), - default = "off", - }, -} - -local function switch_on(pos, stage) - if logic.swap_node(pos, "techage:ta"..stage.."_playerdetector_on") then - logic.send_cmnd(pos, "command1", "on") - end -end - -local function switch_off(pos, stage) - if logic.swap_node(pos, "techage:ta"..stage.."_playerdetector_off") then - logic.send_cmnd(pos, "command2", "off") - end -end - -local function scan_for_player(pos) - local nvm = techage.get_nvm(pos) - local meta = minetest.get_meta(pos) - local names = meta:get_string("names") or "" - local radius = meta:contains("radius") and meta:get_int("radius") or 4 - for _, object in pairs(minetest.get_objects_inside_radius(pos, radius)) do - if object:is_player() then - if names == "" then - nvm.player_name = object:get_player_name() - return true - end - for _,name in ipairs(string.split(names, " ")) do - if object:get_player_name() == name then - nvm.player_name = name - return true - end - end - end - end - nvm.player_name = nil - return false -end - -local function formspec_help() - return "size[8,6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[3,0;Player Detector Help]".. - "label[0,1;Input the number(s) of the destination node(s).\n".. - "Separate numbers via blanks, like '123 234'.\n\n".. - "Input the player name(s) separated by blanks,\nor empty for all players.]".. - "button_exit[3,5;2,1;exit;close]" -end - - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - local names = meta:get_string("names") or "" - return "size[7,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.3,0.6;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "field[0.3,2;7,1;names;Insert player name(s) (optional):;"..names.."]" .. - "button[0.9,3;2.5,1;help;help]".. - "button_exit[3.5,3;2.5,1;exit;Save]" -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = minetest.get_meta(pos) - if fields.exit == "Save" then - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), NDEF(pos).description) - end - meta:set_string("names", fields.names) - meta:set_string("formspec", formspec(meta)) - elseif fields.help ~= nil then - meta:set_string("formspec", formspec_help()) - elseif fields.exit == "close" then - meta:set_string("formspec", formspec(meta)) - end -end - -minetest.register_node("techage:ta3_playerdetector_off", { - description = S("TA3 Player Detector"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_playerdetector.png", - }, - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta3_playerdetector_off", S("TA3 Player Detector")) - logic.infotext(meta, S("TA3 Player Detector")) - meta:set_string("formspec", formspec(meta)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_receive_fields = on_receive_fields, - - on_timer = function (pos, elapsed) - if scan_for_player(pos) then - switch_on(pos, 3) - end - return true - end, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Player Detector")) - meta:set_string("formspec", formspec(meta)) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta3_playerdetector_on", { - description = "TA3 Player Detector", - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_playerdetector_on.png", - }, - on_receive_fields = on_receive_fields, - - on_timer = function (pos, elapsed) - if not scan_for_player(pos) then - switch_off(pos, 3) - end - return true - end, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Player Detector")) - meta:set_string("formspec", formspec(meta)) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta3_playerdetector_off" -}) - -minetest.register_node("techage:ta4_playerdetector_off", { - description = S("TA4 Player Detector"), - inventory_image = 'techage_smartline_detector_inv.png', - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_smartline_detector.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta4_playerdetector_off", S("TA4 Player Detector")) - logic.infotext(meta, S("TA4 Player Detector")) - meta:set_string("formspec", formspec(meta)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_receive_fields = on_receive_fields, - - on_timer = function (pos, elapsed) - if scan_for_player(pos) then - switch_on(pos, 4) - end - return true - end, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA4 Player Detector")) - meta:set_string("formspec", formspec(meta)) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - ta4_formspec = WRENCH_MENU, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta4_playerdetector_on", { - description = "TA4 Player Detector", - inventory_image = 'techage_smartline_detector_inv.png', - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_smartline_detector_on.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - on_receive_fields = on_receive_fields, - - on_timer = function (pos, elapsed) - if not scan_for_player(pos) then - switch_off(pos, 4) - end - return true - end, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA4 Player Detector")) - meta:set_string("formspec", formspec(meta)) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - ta4_formspec = WRENCH_MENU, - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - drop = "techage:ta4_playerdetector_off" -}) - -minetest.register_craft({ - output = "techage:ta3_playerdetector_off", - recipe = { - {"", "group:wood", "default:mese_crystal"}, - {"", "default:copper_ingot", "techage:vacuum_tube"}, - {"", "group:wood", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_playerdetector_off", - recipe = { - {"", "techage:aluminum", "dye:blue"}, - {"", "default:copper_ingot", "techage:ta4_wlanchip"}, - }, -}) - -techage.register_node({ - "techage:ta3_playerdetector_off", "techage:ta3_playerdetector_on", - "techage:ta4_playerdetector_off", "techage:ta4_playerdetector_on" - }, { - on_recv_message = function(pos, src, topic, payload) - if topic == "name" then - local nvm = techage.get_nvm(pos) - return nvm.player_name or "" - elseif topic == "state" then - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_playerdetector_on" or - node.name == "techage:ta4_playerdetector_on" then - return "on" - else - return "off" - end - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 144 then -- Player Name - local nvm = techage.get_nvm(pos) - return 0, nvm.player_name or "" - elseif topic == 142 then -- Binary State - local node = techage.get_node_lvm(pos) - if node.name == "techage:ta3_playerdetector_on" or - node.name == "techage:ta4_playerdetector_on" then - return 0, {1} - else - return 0, {0} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - } -) diff --git a/techage/logic/programmer.lua b/techage/logic/programmer.lua deleted file mode 100644 index 0c02947..0000000 --- a/techage/logic/programmer.lua +++ /dev/null @@ -1,100 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Number programmer - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local function join_to_string(tbl) - local t = {} - for key,_ in pairs(tbl) do - t[#t + 1] = key - end - return table.concat(t, " ") -end - -local function reset_programmer(itemstack, user, pointed_thing) - user:get_meta():set_string("techage_prog_numbers", "") - minetest.chat_send_player(user:get_player_name(), S("[TechAge Programmer] programmer reset")) - return itemstack -end - -local function read_number(itemstack, user, pointed_thing) - local pos = pointed_thing.under - if pos then - local number = techage.get_node_number(pos) - if number then - local numbers = minetest.deserialize(user:get_meta():get_string("techage_prog_numbers")) or {} - techage.add_to_set(numbers, number) - user:get_meta():set_string("techage_prog_numbers", minetest.serialize(numbers)) - minetest.chat_send_player(user:get_player_name(), S("[TechAge Programmer] number").." "..number.." read") - else - minetest.chat_send_player(user:get_player_name(), S("[TechAge Programmer] Unknown node on").." "..minetest.pos_to_string(pos)) - end - else - return reset_programmer(itemstack, user, pointed_thing) - end - return itemstack -end - -local function program_numbers(itemstack, placer, pointed_thing) - local pos = pointed_thing.under - if pos then - local meta = M(pos) - local numbers = minetest.deserialize(placer:get_meta():get_string("techage_prog_numbers")) or {} - placer:get_meta():set_string("techage_prog_numbers", "") - local player_name = placer:get_player_name() - if meta and meta:get_string("owner") ~= player_name then - minetest.chat_send_player(player_name, S("[TechAge Programmer] foreign or unknown node!")) - return itemstack - end - local text = table.concat(numbers, " ") - local ndef = minetest.registered_nodes[minetest.get_node(pos).name] - if ndef and ndef.techage_set_numbers then - local res = ndef.techage_set_numbers(pos, text, player_name) - if res == true then - minetest.chat_send_player(player_name, S("[TechAge Programmer] node programmed!")) - else - minetest.chat_send_player(player_name, S("[TechAge Programmer] Error: invalid numbers!")) - end - else - minetest.chat_send_player(player_name, S("[TechAge Programmer] Error: programmer not supported!")) - end - return itemstack - else - return reset_programmer(itemstack, placer, pointed_thing) - end -end - -minetest.register_craftitem("techage:programmer", { - description = S("TechAge Programmer (right = read number, left = write numbers)"), - inventory_image = "techage_programmer.png", - stack_max = 1, - wield_image = "techage_programmer_wield.png", - groups = {cracky=1, book=1}, - -- left mouse button = program - on_use = program_numbers, - on_secondary_use = reset_programmer, - -- right mouse button = read - on_place = read_number, -}) - -minetest.register_craft({ - output = "techage:programmer", - recipe = { - {"", "default:steel_ingot", ""}, - {"", "techage:ta4_wlanchip", ""}, - {"", "dye:red", ""}, - }, -}) diff --git a/techage/logic/repeater.lua b/techage/logic/repeater.lua deleted file mode 100644 index cb08b64..0000000 --- a/techage/logic/repeater.lua +++ /dev/null @@ -1,132 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Signal Repeater - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic -local OVER_LOAD_MAX = 10 -local CYCLE_TIME = 2 - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - return "size[7.5,3]".. - "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. - "button_exit[2,2;3,1;exit;"..S("Save").."]" -end - -minetest.register_node("techage:ta3_repeater", { - description = S("TA3 Repeater"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_repeater.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local mem = techage.get_mem(pos) - logic.after_place_node(pos, placer, "techage:ta3_repeater", S("TA3 Repeater")) - logic.infotext(meta, S("TA3 Repeater")) - meta:set_string("formspec", formspec(meta)) - mem.overload_cnt = 0 - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - if techage.check_numbers(fields.numbers, player:get_player_name()) then - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), S("TA3 Repeater")) - meta:set_string("formspec", formspec(meta)) - end - end, - - on_timer = function(pos,elapsed) - local mem = techage.get_mem(pos) - mem.overload_cnt = 0 - return true - end, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Repeater")) - meta:set_string("formspec", formspec(meta)) - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta3_repeater", - recipe = { - {"", "group:wood", ""}, - {"techage:vacuum_tube", "", "techage:vacuum_tube"}, - {"", "group:wood", ""}, - }, -}) - -techage.register_node({"techage:ta3_repeater"}, { - on_recv_message = function(pos, src, topic, payload) - local mem = techage.get_mem(pos) - mem.overload_cnt = (mem.overload_cnt or 0) + 1 - if mem.overload_cnt > OVER_LOAD_MAX then - logic.infotext(M(pos), S("TA3 Repeater"), "fault (overloaded)") - minetest.get_node_timer(pos):stop() - return false - else - local numbers = M(pos):get_string("numbers") or "" - techage.counting_start(M(pos):get_string("owner")) - techage.send_multi(src, numbers, topic, payload) - techage.counting_stop() - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local mem = techage.get_mem(pos) - mem.overload_cnt = (mem.overload_cnt or 0) + 1 - if mem.overload_cnt > OVER_LOAD_MAX then - logic.infotext(M(pos), S("TA3 Repeater"), "fault (overloaded)") - minetest.get_node_timer(pos):stop() - return 3 - else - if topic == 1 then - local numbers = M(pos):get_string("numbers") or "" - techage.counting_start(M(pos):get_string("owner")) - techage.send_multi(src, numbers, payload[1] == 1 and "on" or "off") - techage.counting_stop() - return 0 - end - end - return 2 - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) diff --git a/techage/logic/sequencer.lua b/techage/logic/sequencer.lua deleted file mode 100644 index 1d5d936..0000000 --- a/techage/logic/sequencer.lua +++ /dev/null @@ -1,309 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Sequencer - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic -local NUM_SLOTS = 8 - -local sAction = ",on,off" -local kvAction = {[""]=1, ["on"]=2, ["off"]=3} -local tAction = {nil, "on", "off"} - -local function new_rules() - local tbl = {} - for idx = 1,NUM_SLOTS do - tbl[idx] = {offs = "", num = "", act = 1} - end - return tbl -end - -local function formspec(state, rules, endless) - local tbl = {"size[8,9.2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[0,0;Number(s)]label[2.1,0;Command]label[6.4,0;Offset/s]"} - - for idx, rule in ipairs(rules or {}) do - tbl[#tbl+1] = "field[0.2,"..(-0.2+idx)..";2,1;num"..idx..";;"..(rule.num or "").."]" - tbl[#tbl+1] = "dropdown[2,"..(-0.4+idx)..";3.9,1;act"..idx..";"..sAction..";"..(rule.act or "").."]" - tbl[#tbl+1] = "field[6.2,"..(-0.2+idx)..";2,1;offs"..idx..";;"..(rule.offs or "").."]" - end - tbl[#tbl+1] = "checkbox[0,8.5;endless;Run endless;"..dump(endless).."]" - tbl[#tbl+1] = "button[2.2,8.5;1.5,1;help;help]" - tbl[#tbl+1] = "button[4.2,8.5;1.5,1;save;Save]" - tbl[#tbl+1] = "image_button[6.2,8.5;1,1;".. techage.state_button(state) ..";button;]" - - return table.concat(tbl) -end - -local function formspec_help() - return "size[8,9.2]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[2,0;TA3 Sequencer Help]".. - "label[0,1;Define a sequence of commands\nto control other machines.]".. - "label[0,2.2;Numbers(s) are the node numbers,\nthe command shall sent to.]".. - "label[0,3.4;The commands 'on'/'off' are used\n for machines and other nodes.]".. - "label[0,4.6;Offset is the time to the\nnext line in seconds (0.2 to 999).]".. - "label[0,5.8;If endless is set, the Sequencer\nrestarts again and again.]".. - "label[0,7;The command ' ' does nothing,\nonly consuming the offset time.]".. - "button[3,8;2,1;exit;close]" -end - -local function stop_the_sequencer(pos) - local nvm = techage.get_nvm(pos) - local meta = M(pos) - nvm.running = false - nvm.endless = nvm.endless or false - nvm.rules = nvm.rules or new_rules() - logic.infotext(meta, S("TA3 Sequencer"), "stopped") - meta:set_string("formspec", formspec(techage.STOPPED, nvm.rules, nvm.endless)) - minetest.get_node_timer(pos):stop() - return false -end - -local function get_next_slot(idx, rules, endless) - idx = idx + 1 - if idx <= #rules and rules[idx].offs ~= "" and rules[idx].num ~= "" then - return idx - elseif endless then - return 1 - end - return nil -end - -local function restart_timer(pos, time) - local timer = minetest.get_node_timer(pos) - if timer:is_started() then - timer:stop() - end - if type(time) == "number" then - time = math.max(time, 0.2) - timer:start(time) - end -end - -local function check_rules(pos, elapsed) - local nvm = techage.get_nvm(pos) - local own_num = M(pos):get_string("node_number") - nvm.rules = nvm.rules or new_rules() - nvm.running = nvm.running or false - nvm.index = nvm.index or 1 - nvm.endless = nvm.endless or false - techage.counting_start(M(pos):get_string("owner")) - while true do -- process all rules as long as offs == 0 - local rule = nvm.rules[nvm.index] - local offs = tonumber(nvm.rules[nvm.index].offs or 1) - techage.send_multi(own_num, rule.num, tAction[rule.act]) - nvm.index = get_next_slot(nvm.index, nvm.rules, nvm.endless) - if nvm.index ~= nil and offs ~= nil and nvm.running then - -- after the last rule a pause with 1 or more sec is required - if nvm.index == 1 and offs < 1 then - offs = 1 - end - if offs > 0 then - -- we can't restart the timer within the function om_timer - minetest.after(0, restart_timer, pos, offs) - techage.counting_stop() - return false - end - else - techage.counting_stop() - return stop_the_sequencer(pos) - end - end - techage.counting_stop() - return false -end - -local function start_the_sequencer(pos) - local nvm = techage.get_nvm(pos) - if not nvm.running then - local meta = M(pos) - nvm.running = true - nvm.endless = nvm.endless or false - nvm.rules = nvm.rules or new_rules() - logic.infotext(meta, S("TA3 Sequencer"), "running") - meta:set_string("formspec", formspec(techage.RUNNING, nvm.rules, nvm.endless)) - minetest.get_node_timer(pos):start(0.1) - end - return false -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.running = nvm.running or false - nvm.endless = nvm.endless or false - nvm.rules = nvm.rules or new_rules() - - if fields.help ~= nil then - meta:set_string("formspec", formspec_help()) - return - end - - if fields.endless ~= nil then - nvm.endless = fields.endless == "true" - nvm.index = 1 - end - - if fields.exit ~= nil then - if nvm.running then - meta:set_string("formspec", formspec(techage.RUNNING, nvm.rules, nvm.endless)) - else - meta:set_string("formspec", formspec(techage.STOPPED, nvm.rules, nvm.endless)) - end - return - end - - for idx = 1,NUM_SLOTS do - if fields["offs"..idx] ~= nil then - nvm.rules[idx].offs = tonumber(fields["offs"..idx]) or "" - end - if fields["num"..idx] ~= nil and - techage.check_numbers(fields["num"..idx], player:get_player_name()) then - nvm.rules[idx].num = fields["num"..idx] - end - if fields["act"..idx] ~= nil then - nvm.rules[idx].act = kvAction[fields["act"..idx]] - end - end - - if fields.button ~= nil then - if nvm.running then - stop_the_sequencer(pos) - else - start_the_sequencer(pos) - end - elseif fields.num1 ~= nil then -- any other change? - stop_the_sequencer(pos) - else - if nvm.running then - meta:set_string("formspec", formspec(techage.RUNNING, nvm.rules, nvm.endless)) - else - meta:set_string("formspec", formspec(techage.STOPPED, nvm.rules, nvm.endless)) - end - end -end - -minetest.register_node("techage:ta3_sequencer", { - description = S("TA3 Sequencer"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_sequencer.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - logic.after_place_node(pos, placer, "techage:ta3_sequencer", S("TA3 Sequencer")) - logic.infotext(meta, S("TA3 Sequencer"), S("stopped")) - nvm.rules = new_rules() - nvm.index = 1 - nvm.running = false - nvm.endless = false - meta:set_string("formspec", formspec(techage.STOPPED, nvm.rules, nvm.endless)) - end, - - on_receive_fields = on_receive_fields, - - can_dig = function(pos, puncher) - if minetest.is_protected(pos, puncher:get_player_name()) then - return false - end - local nvm = techage.get_nvm(pos) - return not nvm.running - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_timer = check_rules, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta3_sequencer", - recipe = { - {"group:wood", "group:wood", ""}, - {"default:mese_crystal", "techage:vacuum_tube", ""}, - {"group:wood", "group:wood", ""}, - }, -}) - -techage.register_node({"techage:ta3_sequencer"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - start_the_sequencer(pos) - elseif topic == "off" then - -- do not stop immediately - local nvm = techage.get_nvm(pos) - if not nvm.running then - nvm.endless = not (nvm.endless or false) - else - nvm.endless = false - end - elseif topic == "pause" then - stop_the_sequencer(pos) - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 7 then -- TA3 Sequenzer - if payload[1] == 1 then - start_the_sequencer(pos) - return 0 - elseif payload[1] == 0 then - -- do not stop immediately - local nvm = techage.get_nvm(pos) - if not nvm.running then - nvm.endless = not (nvm.endless or false) - else - nvm.endless = false - end - return 0 - elseif payload[1] == 2 then - stop_the_sequencer(pos) - return 0 - end - end - return 2 - end, - on_node_load = function(pos) - local nvm = techage.get_nvm(pos) - if nvm.running then - minetest.get_node_timer(pos):start(1) - end - end, -}) diff --git a/techage/logic/sequencer2.lua b/techage/logic/sequencer2.lua deleted file mode 100644 index 884ccbf..0000000 --- a/techage/logic/sequencer2.lua +++ /dev/null @@ -1,367 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Sequencer - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic - -local HELP = S("Syntax:\n") .. - S("'[] '\n") .. - S("\n") .. - S(" is a number from 1 to 50000 and is\n") .. - S("the timeslot when the command is executed.\n") .. - S(" - 1 corresponds to 100 ms\n") .. - S(" - 50000 corresponds to 4 game days\n") .. - S("\n") .. - S(" is one of the following:\n") .. - S(" - 'send ' (techage command)\n") .. - S(" - 'goto ' (jump to another line)\n") .. - S(" - 'stop' (stop the execution)\n") .. - S(" - 'nop' (do nothing)\n") .. - S("\n") .. - S("Example:\n") .. - " -- move controller commands\n" .. - " [1] send 1234 a2b\n" .. - " [30] send 1234 b2a\n" .. - " [60] goto 1 -- keep going" - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "100ms,200ms,500ms,1s,2s", - name = "cycletime", - label = S("Cycle time"), - tooltip = S("Timer cycle time (default: 100 ms)"), - default = "100ms", - values = {0.1, 0.2, 0.5, 1.0, 2.0} - }, - { - type = "dropdown", - choices = "no,yes", - name = "ignore_off", - label = S("Ignore OFF command"), - tooltip = S("If 'yes' a received OFF command won't stop the sequencer"), - default = "no", - values = {0, 1} - }, -} - -local function cycle_time(pos) - local mem = techage.get_mem(pos) - if not mem.cycletime then - mem.cycletime = tonumber(M(pos):get_string("cycletime")) or 0.1 - end - return mem.cycletime -end - - -local function strsplit(text) - text = text:gsub("\r\n", "\n") - text = text:gsub("\r", "\n") - return string.split(text, "\n", true) -end - -local function trim(s) - return (s:gsub("^%s*(.-)%s*$", "%1")) -end - -local function command(s) - local num, cmd, pld = unpack(string.split(s, " ", false, 2)) - if not num or not cmd then - return S("Invalid command!") - end - return {number = num, cmnd = cmd, payload = pld} -end - -local function add_error(text, line_num) - local tbl = {} - for idx, line in ipairs(strsplit(text)) do - if idx == line_num and not string.find(line, '--<<== error') then - tbl[#tbl+1] = line.." --<<== error" - else - tbl[#tbl+1] = line - end - end - return table.concat(tbl, "\n") -end - -local function exception(tRes, line, s) - if tRes then - tRes.line = line - tRes.error = s - end -end - -local function compile(s, tRes) - local tCode = {} - local old_idx = 0 - local start_idx - - for i, line in ipairs(strsplit(s)) do - line = trim(line) - line = string.split(line, "--", true, 1)[1] or "" - if line ~= "" then - local idx, cmnd1, cmnd2 = unpack(string.split(line, " ", false, 2)) - idx = tonumber(string.match(idx, "^%[(%d+)%]$")) - if not idx then - return exception(tRes, i, "Syntax error!") - end - if idx > 50000 then - return exception(tRes, i, "Order error!") - end - if idx <= old_idx then - return exception(tRes, i, "Order error!") - end - start_idx = start_idx or idx - if old_idx ~= 0 and tCode[old_idx] and not tCode[old_idx].next_idx then - tCode[old_idx].next_idx = idx - end - if cmnd1 == "send" then - local res = command(cmnd2) - if type(res) == "string" then - return exception(tRes, i, res) - end - tCode[idx] = res - elseif cmnd1 == "goto" then - tCode[idx] = {next_idx = tonumber(cmnd2) or 1} - elseif cmnd1 == "stop" then - tCode[idx] = false - elseif cmnd1 == nil or cmnd1 == "nop" then - tCode[idx] = {} - end - old_idx = idx - end - end - -- Returns: - -- { - -- start_idx = 1, - -- tCode = { - -- = {number = , cmnd = , payload = , next_idx = }, - -- ... - -- }, - -- } - return {start_idx=start_idx, tCode=tCode} -end - -local function check_syntax(meta) - local tRes = {} - local res = compile(meta:get_string("text"), tRes) - if not res then - meta:set_string("err_msg", tRes.error) - meta:set_string("text", add_error(meta:get_string("text"), tRes.line)) - return false - else - meta:set_string("err_msg", "") - return true - end -end - -local function formspec(nvm, meta) - local text = meta:get_string("text") - text = minetest.formspec_escape(text) - local bttn = nvm.running and ("stop;" .. S("Stop")) or ("start;" .. S("Start")) - local style = nvm.running and "style_type[textarea;font=mono;textcolor=#888888;border=false]" or - "style_type[textarea;font=mono;textcolor=#FFFFFF;border=false]" - local textarea = nvm.running and "textarea[0.3,0.2;10,8.3;;;"..text.."]" or - "textarea[0.3,0.2;10,8.3;text;;"..text.."]" - - return "size[10,8]" .. - style .. - techage.wrench_image(9.3, -0.25) .. - "tabheader[0,0;tab;edit,help;1;;true]" .. - "label[0.1,-0.2;" .. S("Commands") .. ":]" .. - textarea .. - "background[0.1,0.3;9.8,7.0;techage_form_mask.png]" .. - "label[0.1,7.5;" .. meta:get_string("err_msg") .. "]" .. - "button_exit[3.4,7.5;2.2,1;cancel;" .. S("Cancel") .. "]" .. - "button[5.6,7.5;2.2,1;save;" .. S("Save") .. "]" .. - "button[7.8,7.5;2.2,1;" .. bttn .. "]" -end - -local function formspec_help(meta) - local text = "" --minetest.formspec_escape("hepl") - return "size[10,8]".. - "style_type[textarea;font=mono;textcolor=#FFFFFF;border=false]".. - "tabheader[0,0;tab;edit,help;2;;true]".. - "textarea[0.3,0.3;10,9;;" .. S("Help") .. ":;"..minetest.formspec_escape(HELP).."]" .. - "background[0.1,0.3;9.8,8.0;techage_form_mask.png]" -end - -local function restart_timer(pos, ticks) - local timer = minetest.get_node_timer(pos) - if timer:is_started() then - timer:stop() - end - timer:start(ticks * cycle_time(pos)) -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - if nvm.running then - local mem = techage.get_mem(pos) - mem.code = mem.code or compile(M(pos):get_string("text")) - if mem.code then - mem.idx = mem.idx or mem.code.start_idx - local code = mem.code.tCode[mem.idx] - if code and code.cmnd then - local src = M(pos):get_string("node_number") - techage.counting_start(M(pos):get_string("owner")) - techage.send_single(src, code.number, code.cmnd, code.payload) - techage.counting_stop() - end - if code and code.next_idx then - local offs = code.next_idx - mem.idx - minetest.after(0, restart_timer, pos, math.max(offs, 1)) - mem.idx = code.next_idx - else - nvm.running = false - local meta = M(pos) - meta:set_string("formspec", formspec(nvm, meta)) - logic.infotext(meta, S("TA4 Sequencer"), S("stopped")) - end - end - end - return false -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - nvm.running = nvm.running or false - - if fields.stop then - nvm.running = false - minetest.get_node_timer(pos):stop() - logic.infotext(meta, S("TA4 Sequencer"), S("stopped")) - elseif not nvm.running then - if fields.tab == "2" then - meta:set_string("formspec", formspec_help(meta)) - return - elseif fields.tab == "1" then - meta:set_string("formspec", formspec(nvm, meta)) - return - end - - if fields.save then - nvm.running = false - meta:set_string("text", fields.text or "") - mem.code = nil - mem.idx = nil - elseif fields.start then - if check_syntax(meta) then - nvm.running = true - meta:set_string("text", fields.text or "") - mem.code = nil - mem.idx = nil - mem.cycletime = nil - restart_timer(pos, 1) - logic.infotext(meta, S("TA4 Sequencer"), S("running")) - end - end - end - meta:set_string("formspec", formspec(nvm, meta)) -end - -minetest.register_node("techage:ta4_sequencer", { - description = S("TA4 Sequencer"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_sequencer.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - logic.after_place_node(pos, placer, "techage:ta4_sequencer", S("TA4 Sequencer")) - logic.infotext(meta, S("TA4 Sequencer"), S("stopped")) - nvm.running = false - meta:set_string("formspec", formspec(nvm, meta)) - end, - - on_receive_fields = on_receive_fields, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_timer = node_timer, - ta4_formspec = WRENCH_MENU, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta4_sequencer", - recipe = { - {"default:steel_ingot", "dye:blue", "default:steel_ingot"}, - {"techage:ta4_ramchip", "default:mese_crystal", "techage:ta4_wlanchip"}, - {"techage:aluminum", "group:wood", "techage:aluminum"}, - }, -}) - -local INFO = [[Commands: 'goto ', 'stop', 'on', 'off']] - -techage.register_node({"techage:ta4_sequencer"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if (topic == "goto" or topic == "on") and not nvm.running then - local mem = techage.get_mem(pos) - nvm.running = true - mem.idx = tonumber(payload or 1) or 1 - restart_timer(pos, 1) - logic.infotext(M(pos), S("TA4 Sequencer"), S("running")) - elseif topic == "stop" or (topic == "off" and M(pos):get_int("ignore_off") == 0) then - nvm.running = false - minetest.get_node_timer(pos):stop() - logic.infotext(M(pos), S("TA4 Sequencer"), S("stopped")) - elseif topic == "info" then - return INFO - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 13 then - if payload[1] ~= 0 and not nvm.running then - local mem = techage.get_mem(pos) - nvm.running = true - mem.idx = tonumber(payload or 1) or 1 - restart_timer(pos, 1) - logic.infotext(M(pos), S("TA4 Sequencer"), S("running")) - return 0 - elseif payload[1] == 0 then - nvm.running = false - minetest.get_node_timer(pos):stop() - logic.infotext(M(pos), S("TA4 Sequencer"), S("stopped")) - return 0 - end - end - return 2 - end, -}) diff --git a/techage/logic/signallamp.lua b/techage/logic/signallamp.lua deleted file mode 100644 index ba0e7ba..0000000 --- a/techage/logic/signallamp.lua +++ /dev/null @@ -1,238 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2022-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Colored Signal Lamps (with unifieddyes support) - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic - -local COLORED = minetest.get_modpath("unifieddyes") and minetest.global_exists("unifieddyes") - -local LampsOff = {} -local LampsOn = {} - -local function switch_on(pos, node, player, color) - if player and minetest.is_protected(pos, player:get_player_name()) then - return - end - color = tonumber(color) or node.param2 - if LampsOff[node.name] then - node.name = LampsOff[node.name] - node.param2 = color - minetest.swap_node(pos, node) - elseif LampsOn[node.name] and color ~= node.param2 then - node.param2 = color - minetest.swap_node(pos, node) - end -end - -local function switch_off(pos, node, player) - if player and minetest.is_protected(pos, player:get_player_name()) then - return - end - if LampsOn[node.name] then - node.name = LampsOn[node.name] - minetest.swap_node(pos, node) - end -end - -local function register_signallamp(name, description, tiles_off, tiles_on, node_box) - LampsOff[name .. "_off"] = name .. "_on" - LampsOn[name .. "_on"] = name .. "_off" - - minetest.register_node(name .. "_off", { - description = description, - tiles = tiles_off, - drawtype = node_box and "nodebox", - node_box = node_box, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - logic.after_place_node(pos, placer, name .. "_off", description) - logic.infotext(M(pos), description) - if COLORED then - unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing) - else - local node = minetest.get_node(pos) - node.param2 = 35 - minetest.swap_node(pos, node) - end - end, - - on_rightclick = switch_on, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - if COLORED then - unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger) - end - end, - - on_construct = COLORED and unifieddyes.on_construct or nil, - on_dig = COLORED and unifieddyes.on_dig or nil, - - paramtype = "light", - paramtype2 = "color", - --palette = "techage_palette256.png", - palette = COLORED and "unifieddyes_palette_extended.png" or "techage_palette256.png", - place_param2 = 240, - sunlight_propagates = true, - sounds = default.node_sound_glass_defaults(), - groups = {choppy=2, cracky=1, ud_param2_colorable = 1}, - is_ground_content = false, - drop = name .. "_off" - }) - - minetest.register_node(name .. "_on", { - description = description, - tiles = tiles_on, - drawtype = node_box and "nodebox", - node_box = node_box, - - on_rightclick = switch_off, - - paramtype = "light", - paramtype2 = "color", - palette = COLORED and "unifieddyes_palette_extended.png" or "techage_palette256.png", - groups = {choppy=2, cracky=1, not_in_creative_inventory=1, ud_param2_colorable = 1}, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - if COLORED then - unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger) - end - end, - - on_dig = COLORED and unifieddyes.on_dig or nil, - light_source = 10, - is_ground_content = false, - drop = name .. "_off" - }) - - techage.register_node({name .. "_off", name .. "_on"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - local node = techage.get_node_lvm(pos) - switch_on(pos, node) - return true - elseif topic == "off" then - local node = techage.get_node_lvm(pos) - switch_off(pos, node) - return true - elseif topic == "color" then - local node = techage.get_node_lvm(pos) - switch_on(pos, node, nil, payload) - return true - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 1 and payload[1] == 1 then - local node = techage.get_node_lvm(pos) - switch_on(pos, node) - return 0 - elseif topic == 1 and payload[1] == 0 then - local node = techage.get_node_lvm(pos) - switch_off(pos, node) - return 0 - elseif topic == 70 or topic == 22 then - local node = techage.get_node_lvm(pos) - switch_on(pos, node, nil, payload[1]) - return 0 - else - return 2 - end - end, - }) -end - -minetest.register_chatcommand("ta_color", { - description = minetest.formspec_escape( - "Output the color palette and the numbers for Lua/Beduino color commands"), - - func = function(name, param) - local tbl = {} - if COLORED then - tbl[1] = "size[14,7]" - tbl[2] = "background[0,0;14,7;unifieddyes_palette_extended.png]" - for i = 0, 10 do - local y = i * 0.64 - tbl[#tbl + 1] = "label[0," .. y .. ";" .. (i * 24 + 0) .. "]" - tbl[#tbl + 1] = "label[7," .. y .. ";" .. (i * 24 + 12) .. "]" - end - else - tbl[1] = "size[10,7.5]" - tbl[2] = "background[0,0;10,7.5;techage_palette256.png]" - for i = 0, 13 do - local y = i * 0.5 - tbl[#tbl + 1] = "label[0," .. y .. ";" .. (i * 18 + 0) .. "]" - tbl[#tbl + 1] = "label[5," .. y .. ";" .. (i * 18 + 9) .. "]" - end - end - minetest.show_formspec(name, ";techage:color_form", table.concat(tbl, "")) - return true - end -}) - --- Register callback -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "techage:color_form" then - return false - end - return true -end) - - -register_signallamp("techage:color_lamp", - S("TechAge Color Lamp"), - {"techage_signal_lamp.png^[colorize:#000000:80"}, - {"techage_signal_lamp.png"}, - { - type = "fixed", - fixed = { - {-6/16, -6/16, -6/16, 6/16, 6/16, 6/16}, - {-4/16, -10/16, -4/16, 4/16, -6/16, 4/16}, - } - } -) - -register_signallamp("techage:color_lamp2", - S("TechAge Color Lamp 2"), - {"techage_signallamp2.png^[colorize:#000000:80"}, - {"techage_signallamp2.png"} -) - -minetest.register_craft({ - output = "techage:signal_lamp_off", - recipe = { - {"", "wool:white", ""}, - {"", "default:torch", ""}, - {"", "techage:vacuum_tube", ""}, - }, - }) - -minetest.register_craft({ - output = "techage:signal_lamp2_off", - recipe = { - {"", "default:glass", ""}, - {"", "default:torch", ""}, - {"", "techage:vacuum_tube", ""}, - }, - }) - -minetest.register_alias("techage:signal_lamp_off", "techage:color_lamp_off") -minetest.register_alias("techage:signal_lamp2_off", "techage:color_lamp2_off") -minetest.register_alias("techage:signal_lamp_on", "techage:color_lamp_on") -minetest.register_alias("techage:signal_lamp2_on", "techage:color_lamp2_on") diff --git a/techage/logic/signallamp_2x.lua b/techage/logic/signallamp_2x.lua deleted file mode 100644 index 3692b30..0000000 --- a/techage/logic/signallamp_2x.lua +++ /dev/null @@ -1,164 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Logic twofold signal lamp - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local OFF = 0 -local GREEN = 1 -local AMBER = 2 -local RED = 3 - -local WRENCH_MENU = { - { - type = "ascii", - name = "label1", - label = S("Label") .. " 1", - tooltip = S("Label for the lamp"), - default = "1", - }, - { - type = "ascii", - name = "label2", - label = S("Label") .. " 2", - tooltip = S("Label for the lamp"), - default = "2", - }, -} - -local function lamp_update(pos, objref) - local meta = M(pos) - pos = vector.round(pos) - local nvm = techage.get_nvm(pos) - nvm.lamp = nvm.lamp or {} - local tbl = {" ", " ", meta:get_string("label1"), " ", meta:get_string("label2")} - local text = "< " .. table.concat(tbl, "\n< ") - local texture = lcdlib.make_multiline_texture("default", text, 96, 96, 7, "top", "#000", 6) - - if nvm.lamp[1] == RED then - texture = texture .. "^techage_smartline_signal_red2.png" - elseif nvm.lamp[1] == GREEN then - texture = texture .. "^techage_smartline_signal_green2.png" - elseif nvm.lamp[1] == AMBER then - texture = texture .. "^techage_smartline_signal_amber2.png" - end - - if nvm.lamp[2] == RED then - texture = texture .. "^techage_smartline_signal_red3.png" - elseif nvm.lamp[2] == GREEN then - texture = texture .. "^techage_smartline_signal_green3.png" - elseif nvm.lamp[2] == AMBER then - texture = texture .. "^techage_smartline_signal_amber3.png" - end - - objref:set_properties({ textures = {texture}, visual_size = {x=1, y=1} }) -end - -local lcd_box = {-8/16, -4/16, 7.75/16, 8/16, 4/16, 8/16} - -minetest.register_node("techage:ta4_signallamp_2x", { - description = S("TA4 2x Signal Lamp"), - inventory_image = 'techage_smartline_signal_2x.png^techage_smartline_signal_green2.png^techage_smartline_signal_amber3.png', - tiles = {'techage_smartline_signal_2x.png'}, - drawtype = "nodebox", - paramtype = "light", - use_texture_alpha = "clip", - sunlight_propagates = true, - paramtype2 = "facedir", - node_box = { - type = "fixed", - fixed = lcd_box, - }, - light_source = 6, - - display_entities = { - ["techage:display_entity"] = { depth = 0.48, - on_display_update = lamp_update}, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:ta4_signallamp_2x") - local meta = minetest.get_meta(pos) - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA4 2x Signal Lamp") .. " " .. number) - local nvm = techage.get_nvm(pos) - nvm.lamp = {} - lcdlib.update_entities(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - ta_after_formspec = function(pos, fields, playername) - lcdlib.update_entities(pos) - end, - - ta3_formspec = WRENCH_MENU, - on_place = lcdlib.on_place, - on_construct = lcdlib.on_construct, - on_destruct = lcdlib.on_destruct, - on_rotate = lcdlib.on_rotate, - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - -techage.register_node({"techage:ta4_signallamp_2x"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - nvm.lamp = nvm.lamp or {} - if topic == "green" then - local num = math.min(tonumber(payload) or 0, 2) - nvm.lamp[num] = GREEN - lcdlib.update_entities(pos) - elseif topic == "amber" then - local num = math.min(tonumber(payload) or 0, 2) - nvm.lamp[num] = AMBER - lcdlib.update_entities(pos) - elseif topic == "red" then - local num = math.min(tonumber(payload) or 0, 2) - nvm.lamp[num] = RED - lcdlib.update_entities(pos) - elseif topic == "off" then - local num = math.min(tonumber(payload) or 0, 2) - nvm.lamp[num] = OFF - lcdlib.update_entities(pos) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - nvm.lamp = nvm.lamp or {} - if topic == 3 then -- Signal Lamp - local num = math.min(payload[1] or 1, 2) - local color = math.min(payload[2] or 0, 3) - nvm.lamp[num] = color - lcdlib.update_entities(pos) - return 0 - else - return 2 - end - end, -}) - -minetest.register_craft({ - output = "techage:ta4_signallamp_2x", - recipe = { - {"", "techage:aluminum", "dye:blue"}, - {"", "default:glass", "techage:ta4_wlanchip"}, - {"", "techage:ta4_leds", "techage:ta4_leds"}, - }, -}) diff --git a/techage/logic/signallamp_4x.lua b/techage/logic/signallamp_4x.lua deleted file mode 100644 index a098ba6..0000000 --- a/techage/logic/signallamp_4x.lua +++ /dev/null @@ -1,195 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Logic fourfold signal lamp - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local OFF = 0 -local GREEN = 1 -local AMBER = 2 -local RED = 3 - -local WRENCH_MENU = { - { - type = "ascii", - name = "label1", - label = S("Label") .. " 1", - tooltip = S("Label for the lamp"), - default = "1", - }, - { - type = "ascii", - name = "label2", - label = S("Label") .. " 2", - tooltip = S("Label for the lamp"), - default = "2", - }, - { - type = "ascii", - name = "label3", - label = S("Label") .. " 3", - tooltip = S("Label for the lamp"), - default = "3", - }, - { - type = "ascii", - name = "label4", - label = S("Label") .. " 4", - tooltip = S("Label for the lamp"), - default = "4", - }, -} - -local function lamp_update(pos, objref) - local meta = M(pos) - pos = vector.round(pos) - local nvm = techage.get_nvm(pos) - nvm.lamp = nvm.lamp or {} - local tbl = {meta:get_string("label1"), " ", meta:get_string("label2"), " ", meta:get_string("label3"), " ", meta:get_string("label4")} - local text = "< " .. table.concat(tbl, "\n< ") - local texture = lcdlib.make_multiline_texture("default", text, 96, 96, 7, "top", "#000", 6) - - if nvm.lamp[1] == RED then - texture = texture .. "^techage_smartline_signal_red1.png" - elseif nvm.lamp[1] == GREEN then - texture = texture .. "^techage_smartline_signal_green1.png" - elseif nvm.lamp[1] == AMBER then - texture = texture .. "^techage_smartline_signal_amber1.png" - end - - if nvm.lamp[2] == RED then - texture = texture .. "^techage_smartline_signal_red2.png" - elseif nvm.lamp[2] == GREEN then - texture = texture .. "^techage_smartline_signal_green2.png" - elseif nvm.lamp[2] == AMBER then - texture = texture .. "^techage_smartline_signal_amber2.png" - end - - if nvm.lamp[3] == RED then - texture = texture .. "^techage_smartline_signal_red3.png" - elseif nvm.lamp[3] == GREEN then - texture = texture .. "^techage_smartline_signal_green3.png" - elseif nvm.lamp[3] == AMBER then - texture = texture .. "^techage_smartline_signal_amber3.png" - end - - if nvm.lamp[4] == RED then - texture = texture .. "^techage_smartline_signal_red4.png" - elseif nvm.lamp[4] == GREEN then - texture = texture .. "^techage_smartline_signal_green4.png" - elseif nvm.lamp[4] == AMBER then - texture = texture .. "^techage_smartline_signal_amber4.png" - end - - objref:set_properties({ textures = {texture}, visual_size = {x=1, y=1} }) -end - -local lcd_box = {-8/16, -8/16, 7.75/16, 8/16, 8/16, 8/16} - -minetest.register_node("techage:ta4_signallamp_4x", { - description = S("TA4 4x Signal Lamp"), - inventory_image = 'techage_smartline_signal_4x.png^techage_smartline_signal_off1.png^techage_smartline_signal_green2.png^techage_smartline_signal_amber3.png^techage_smartline_signal_red4.png', - tiles = {'techage_smartline_signal_4x.png'}, - drawtype = "nodebox", - paramtype = "light", - use_texture_alpha = "clip", - sunlight_propagates = true, - paramtype2 = "facedir", - node_box = { - type = "fixed", - fixed = lcd_box, - }, - light_source = 6, - - display_entities = { - ["techage:display_entity"] = { depth = 0.48, - on_display_update = lamp_update}, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:ta4_signallamp_4x") - local meta = minetest.get_meta(pos) - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA4 4x Signal Lamp") .. " " .. number) - local nvm = techage.get_nvm(pos) - nvm.text = {"1", "", "2", "", "3", "", "4"} - nvm.lamp = {} - lcdlib.update_entities(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - ta_after_formspec = function(pos, fields, playername) - lcdlib.update_entities(pos) - end, - - ta3_formspec = WRENCH_MENU, - on_place = lcdlib.on_place, - on_construct = lcdlib.on_construct, - on_destruct = lcdlib.on_destruct, - on_rotate = lcdlib.on_rotate, - groups = {cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - -techage.register_node({"techage:ta4_signallamp_4x"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - nvm.lamp = nvm.lamp or {} - if topic == "green" then - local num = math.min(tonumber(payload) or 0, 4) - nvm.lamp[num] = GREEN - lcdlib.update_entities(pos) - elseif topic == "amber" then - local num = math.min(tonumber(payload) or 0, 4) - nvm.lamp[num] = AMBER - lcdlib.update_entities(pos) - elseif topic == "red" then - local num = math.min(tonumber(payload) or 0, 4) - nvm.lamp[num] = RED - lcdlib.update_entities(pos) - elseif topic == "off" then - local num = math.min(tonumber(payload) or 0, 4) - nvm.lamp[num] = OFF - lcdlib.update_entities(pos) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - nvm.lamp = nvm.lamp or {} - if topic == 3 then -- Signal Lamp - local num = math.min(payload[1] or 1, 4) - local color = math.min(payload[2] or 0, 3) - nvm.lamp[num] = color - lcdlib.update_entities(pos) - return 0 - else - return 2 - end - end, -}) - -minetest.register_craft({ - output = "techage:ta4_signallamp_4x", - recipe = { - {"", "techage:ta4_signallamp_2x", ""}, - {"", "techage:ta4_signallamp_2x", ""}, - {"", "", ""}, - }, -}) diff --git a/techage/logic/terminal.lua b/techage/logic/terminal.lua deleted file mode 100644 index 1008ac3..0000000 --- a/techage/logic/terminal.lua +++ /dev/null @@ -1,448 +0,0 @@ ---[[ - - Terminal - ======== - - Copyright (C) 2018-2024 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - terminal.lua: - -]]-- - -local M = minetest.get_meta -local S = techage.S - -local HELP_TA3 = [[ #### TA3 Terminal #### -Send commands to machines and output the results. -Local commands: -- Clear screen with 'clear' -- Output this message with 'help' -- Switch to public use of buttons with 'pub' -- Switch to private use of buttons with 'priv' -- Output techage version with 'vers' -- Program a user button with - 'set ' - Example: 'set 1 ON cmd 1234 on' -- send a command with 'cmd ' - Example: 'cmd 1234 on']] - -local HELP_TA4 = [[ #### TA4 Terminal #### -Send commands to machines and output the results. -Local commands: -- Clear screen with 'clear' -- Output this message with 'help' -- Switch to public use of buttons with 'pub' -- Switch to private use of buttons with 'priv' -- Output techage version with 'vers' -- Program a user button with - 'set ' - Example: 'set 1 ON cmd 1234 on' -- send a command with 'cmd ' - Example: 'cmd 1234 on' -- Connect to a machine with 'connect ' -If connected, compact commands like 'status' -are possible.]] - -local SYNTAX_ERR = S("Syntax error, try help") - -local function get_string(meta, num, default) - local s = meta:get_string("bttn_text"..num) - if not s or s == "" then - return default - end - return s -end - -local function formspec2(meta) - local output = meta:get_string("output") - local command = meta:get_string("command") - output = minetest.formspec_escape(output) - output = output:gsub("\n", ",") - local bttn_text1 = get_string(meta, 1, "User1") - local bttn_text2 = get_string(meta, 2, "User2") - local bttn_text3 = get_string(meta, 3, "User3") - local bttn_text4 = get_string(meta, 4, "User4") - local bttn_text5 = get_string(meta, 5, "User5") - local bttn_text6 = get_string(meta, 6, "User6") - local bttn_text7 = get_string(meta, 7, "User7") - local bttn_text8 = get_string(meta, 8, "User8") - local bttn_text9 = get_string(meta, 9, "User9") - return "size[10,8.5]".. - --"style_type[table,field;font=mono]".. - "button[0,-0.2;3.3,1;bttn1;"..bttn_text1.."]button[3.3,-0.2;3.3,1;bttn2;"..bttn_text2.."]button[6.6,-0.2;3.3,1;bttn3;"..bttn_text3.."]".. - "button[0,0.6;3.3,1;bttn4;"..bttn_text4.."]button[3.3,0.6;3.3,1;bttn5;"..bttn_text5.."]button[6.6,0.6;3.3,1;bttn6;"..bttn_text6.."]".. - "button[0,1.4;3.3,1;bttn7;"..bttn_text7.."]button[3.3,1.4;3.3,1;bttn8;"..bttn_text8.."]button[6.6,1.4;3.3,1;bttn9;"..bttn_text9.."]".. - "table[0,2.3;9.8,5.6;output;"..output..";200]".. - "field[0.4,8.2;7.6,1;cmnd;;"..command.."]" .. - "field_close_on_enter[cmnd;false]".. - "button[7.9,7.9;2,1;ok;"..S("Enter").."]" -end - -local function output(pos, text) - local meta = minetest.get_meta(pos) - text = meta:get_string("output") .. "\n" .. (text or "") - text = text:sub(-1000,-1) - meta:set_string("output", text) - meta:set_string("formspec", formspec2(meta)) -end - -local function append(pos, text) - local meta = minetest.get_meta(pos) - text = meta:get_string("output") .. (text or "") - meta:set_string("output", text) - meta:set_string("formspec", formspec2(meta)) -end - -local function get_line_text(pos, num) - local meta = minetest.get_meta(pos) - local text = meta:get_string("output") or "" - local lines = string.split(text, "\n", true) - local line = lines[num] or "" - return line:gsub("^[%s$]*(.-)%s*$", "%1") -end - -local function server_debug(pos, command, player) - local cmnd, payload = command:match('^pipe%s+([%w_]+)%s*(.*)$') - if cmnd then - if not minetest.check_player_privs(player, "server") then - output(pos, "server privs missing") - return - end - local resp = techage.transfer( - pos, - "B", -- outdir - cmnd, -- topic - payload, -- payload - techage.LiquidPipe, -- network - nil) -- valid nodes - output(pos, dump(resp)) - return true - end - - cmnd, payload = command:match('^axle%s+([%w_]+)%s*(.*)$') - if cmnd then - if not minetest.check_player_privs(player, "server") then - output(pos, "server privs missing") - return - end - local resp = techage.transfer( - pos, - "B", -- outdir - cmnd, -- topic - payload, -- payload - techage.TA1Axle, -- network - nil) -- valid nodes - output(pos, dump(resp)) - return true - end - - cmnd, payload = command:match('^vtube%s+([%w_]+)%s*(.*)$') - if cmnd then - if not minetest.check_player_privs(player, "server") then - output(pos, "server privs missing") - return - end - local resp = techage.transfer( - pos, - "B", -- outdir - cmnd, -- topic - payload, -- payload - techage.VTube, -- network - nil) -- valid nodes - output(pos, dump(resp)) - return true - end -end - -local function command(pos, command, player, is_ta4) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") or "" - - command = command:sub(1,80) - command = string.trim(command) - local cmnd, data = command:match('^(%w+)%s*(.*)$') - - if cmnd == "clear" then - meta:set_string("output", "") - meta:set_string("formspec", formspec2(meta)) - elseif cmnd == "" then - output(pos, "$") - elseif cmnd == "help" then - if is_ta4 then - output(pos, HELP_TA4) - else - output(pos, HELP_TA3) - end - elseif cmnd == "pub" then - meta:set_int("public", 1) - output(pos, "$ "..command) - output(pos, "Switched to public buttons!") - elseif cmnd == "priv" then - meta:set_int("public", 0) - output(pos, "$ "..command) - output(pos, "Switched to private buttons!") - elseif cmnd == "vers" then - output(pos, "$ "..command) - output(pos, "Techage version = " .. techage.version) - elseif cmnd == "connect" and data then - output(pos, "$ "..command) - if techage.not_protected(data, owner, owner) then - local own_num = meta:get_string("node_number") - local resp = techage.send_single(own_num, data, cmnd) - if resp then - meta:set_string("connected_to", data) - output(pos, "Connected.") - else - meta:set_string("connected_to", "") - output(pos, "Not connected!") - end - else - output(pos, "Protection error!") - end - else - output(pos, "$ "..command) - local own_num = meta:get_string("node_number") - local connected_to = meta:contains("connected_to") and meta:get_string("connected_to") - local bttn_num, label, num, cmnd, payload - - num, cmnd, payload = command:match('^cmd%s+([0-9]+)%s+(%w+)%s*(.*)$') - if num and cmnd then - if techage.not_protected(num, owner, owner) then - local resp = techage.send_single(own_num, num, cmnd, payload) - if type(resp) == "string" then - output(pos, resp) - else - output(pos, dump(resp)) - end - end - return - end - - num, cmnd = command:match('^turn%s+([0-9]+)%s+([onf]+)$') - if num and (cmnd == "on" or cmnd == "off") then - if techage.not_protected(num, owner, owner) then - local resp = techage.send_single(own_num, num, cmnd) - output(pos, dump(resp)) - end - return - end - - bttn_num, label, cmnd = command:match('^set%s+([1-9])%s+([%w_]+)%s+(.+)$') - if bttn_num and label and cmnd then - meta:set_string("bttn_text"..bttn_num, label) - meta:set_string("bttn_cmnd"..bttn_num, cmnd) - meta:set_string("formspec", formspec2(meta)) - return - end - - if server_debug(pos, command, player) then - return - end - - if connected_to then - local cmnd, payload = command:match('^(%w+)%s*(.*)$') - if cmnd then - local resp = techage.send_single(own_num, connected_to, cmnd, payload) - if resp ~= true then - if type(resp) == "string" then - output(pos, resp) - else - output(pos, dump(resp)) - end - end - return - end - end - - if command ~= "" then - output(pos, SYNTAX_ERR) - end - end -end - -local function send_cmnd(pos, meta, num) - local cmnd = meta:get_string("bttn_cmnd"..num) - local owner = meta:get_string("owner") or "" - command(pos, cmnd, owner) -end - -local function register_terminal(name, description, tiles, node_box, selection_box) - minetest.register_node("techage:"..name, { - description = description, - tiles = tiles, - drawtype = "nodebox", - node_box = node_box, - selection_box = selection_box, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, minetest.get_node(pos).name) - local meta = minetest.get_meta(pos) - meta:set_string("node_number", number) - meta:set_string("command", S("commands like: help")) - meta:set_string("formspec", formspec2(meta)) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", description .. " " .. number) - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - local public = meta:get_int("public") == 1 - local protected = minetest.is_protected(pos, player:get_player_name()) - - if not protected then - local evt = minetest.explode_table_event(fields.output) - if evt.type == "DCL" then - local s = get_line_text(pos, evt.row) - meta:set_string("command", s) - meta:set_string("formspec", formspec2(meta)) - return - elseif (fields.ok or fields.key_enter_field) and fields.cmnd then - local is_ta4 = string.find(description, "TA4") - command(pos, fields.cmnd, player:get_player_name(), is_ta4) - techage.historybuffer_add(pos, fields.cmnd) - meta:set_string("command", "") - meta:set_string("formspec", formspec2(meta)) - return - elseif fields.key_up then - meta:set_string("command", techage.historybuffer_priv(pos)) - meta:set_string("formspec", formspec2(meta)) - return - elseif fields.key_down then - meta:set_string("command", techage.historybuffer_next(pos)) - meta:set_string("formspec", formspec2(meta)) - return - end - end - if public or not protected then - if fields.bttn1 then send_cmnd(pos, meta, 1) - elseif fields.bttn2 then send_cmnd(pos, meta, 2) - elseif fields.bttn3 then send_cmnd(pos, meta, 3) - elseif fields.bttn4 then send_cmnd(pos, meta, 4) - elseif fields.bttn5 then send_cmnd(pos, meta, 5) - elseif fields.bttn6 then send_cmnd(pos, meta, 6) - elseif fields.bttn7 then send_cmnd(pos, meta, 7) - elseif fields.bttn8 then send_cmnd(pos, meta, 8) - elseif fields.bttn9 then send_cmnd(pos, meta, 9) - end - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - preserve_nodedata = techage.preserve_nodedata, - restore_nodedata = techage.restore_nodedata, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - }) -end - -register_terminal("terminal2", S("TA3 Terminal"), { - -- up, down, right, left, back, front - 'techage_terminal2_top.png', - 'techage_terminal2_side.png', - 'techage_terminal2_side.png^[transformFX', - 'techage_terminal2_side.png', - 'techage_terminal2_back.png', - "techage_terminal2_front.png", - }, - { - type = "fixed", - fixed = { - {-12/32, -16/32, -16/32, 12/32, -14/32, 16/32}, - {-12/32, -14/32, -3/32, 12/32, 6/32, 16/32}, - {-10/32, -12/32, 14/32, 10/32, 4/32, 18/32}, - {-12/32, 4/32, -4/32, 12/32, 6/32, 16/32}, - {-12/32, -16/32, -4/32, -10/32, 6/32, 16/32}, - { 10/32, -16/32, -4/32, 12/32, 6/32, 16/32}, - {-12/32, -14/32, -4/32, 12/32, -12/32, 16/32}, - }, - }, - { - type = "fixed", - fixed = { - {-12/32, -16/32, -4/32, 12/32, 6/32, 16/32}, - }, - } -) - -register_terminal("terminal3", S("TA4 Terminal"), { - -- up, down, right, left, back, front - 'techage_terminal1_top.png', - 'techage_terminal1_bottom.png', - 'techage_terminal1_side.png', - 'techage_terminal1_side.png', - 'techage_terminal1_bottom.png', - "techage_terminal1_front.png", - }, - { - type = "fixed", - fixed = { - {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, - {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, - }, - }, - { - type = "fixed", - fixed = { - {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, - {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, - }, - } -) - -minetest.register_craft({ - output = "techage:terminal2", - recipe = { - {"", "", ""}, - {"techage:basalt_glass_thin", "techage:vacuum_tube", "default:copper_ingot"}, - {"dye:grey", "default:steel_ingot", "techage:usmium_nuggets"}, - }, -}) - -minetest.register_craft({ - output = "techage:terminal3", - recipe = { - {"techage:basalt_glass_thin", "", ""}, - {"techage:ta4_leds", "", ""}, - {"techage:aluminum", "techage:ta4_wlanchip", "techage:ta4_ramchip"}, - }, -}) - -techage.register_node({"techage:terminal2"}, { - on_recv_message = function(pos, src, topic, payload) - output(pos, "src="..src..", cmd="..dump(topic)..", data="..dump(payload)) - return true - end, - on_node_load = function(pos) - local meta = M(pos) - local number = meta:get_string("number") or "" - if number ~= "" then - meta:set_string("node_number", number) - meta:set_string("number", "") - end - end, -}) - -techage.register_node({"techage:terminal3"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "text" then - output(pos, payload) - elseif topic == "append" then - append(pos, payload) - else - output(pos, "src="..src..", cmd="..dump(topic)..", data="..dump(payload)) - end - return true - end, -}) diff --git a/techage/logic/timer.lua b/techage/logic/timer.lua deleted file mode 100644 index 2e55613..0000000 --- a/techage/logic/timer.lua +++ /dev/null @@ -1,209 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Sequencer - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic -local CYCLE_TIME = 8 - -local tTime = { - ["00:00"] = 1, ["02:00"] = 2, ["04:00"] = 3, - ["06:00"] = 4, ["08:00"] = 5, ["10:00"] = 6, - ["12:00"] = 7, ["14:00"] = 8, ["16:00"] = 9, - ["18:00"] =10, ["20:00"] =11, ["22:00"] =12, -} - -local sTime = "00:00,02:00,04:00,06:00,08:00,10:00,12:00,14:00,16:00,18:00,20:00,22:00" - -local tAction = { - [""] = 1, - ["on"] = 2, - ["off"] = 3, -} - -local sAction = ",on,off" - -local function deserialize(meta, name) - local s = meta:get_string(name) or "" - if s ~= "" then - return minetest.deserialize(s) - end -end - -local function formspec(events, numbers, actions) - return "size[8,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - - "label[0,0;Time]label[2.3,0;Number(s)]label[4.5,0;Command]".. - "dropdown[0,1;2,1;e1;"..sTime..";"..events[1].."]".. - "field[2.3,1.2;2,1;n1;;"..numbers[1].."]" .. - "dropdown[4.5,1;3,1;a1;"..sAction..";"..tAction[actions[1]].."]".. - - "dropdown[0,2;2,1;e2;"..sTime..";"..events[2].."]".. - "field[2.3,2.2;2,1;n2;;"..numbers[2].."]" .. - "dropdown[4.5,2;3,1;a2;"..sAction..";"..tAction[actions[2]].."]".. - - "dropdown[0,3;2,1;e3;"..sTime..";"..events[3].."]".. - "field[2.3,3.2;2,1;n3;;"..numbers[3].."]" .. - "dropdown[4.5,3;3,1;a3;"..sAction..";"..tAction[actions[3]].."]".. - - "dropdown[0,4;2,1;e4;"..sTime..";"..events[4].."]".. - "field[2.3,4.2;2,1;n4;;"..numbers[4].."]" .. - "dropdown[4.5,4;3,1;a4;"..sAction..";"..tAction[actions[4]].."]".. - - "dropdown[0,5;2,1;e5;"..sTime..";"..events[5].."]".. - "field[2.3,5.2;2,1;n5;;"..numbers[5].."]" .. - "dropdown[4.5,5;3,1;a5;"..sAction..";"..tAction[actions[5]].."]".. - - "dropdown[0,6;2,1;e6;"..sTime..";"..events[6].."]".. - "field[2.3,6.2;2,1;n6;;"..numbers[6].."]" .. - "dropdown[4.5,6;3,1;a6;"..sAction..";"..tAction[actions[6]].."]".. - - "button_exit[3,7;2,1;exit;close]" -end - - -local function check_rules(pos,elapsed) - local nvm = techage.get_nvm(pos) - nvm.done = nvm.done or {false,false,false,false,false,false} - local hour = math.floor(minetest.get_timeofday() * 24) - local meta = minetest.get_meta(pos) - local events = deserialize(meta, "events") - local numbers = deserialize(meta, "numbers") - local actions = deserialize(meta, "actions") - local number = meta:get_string("node_number") - - if events and numbers and actions then - -- check all rules - for idx,act in ipairs(actions) do - if act ~= "" and numbers[idx] ~= "" then - local hr = (events[idx] - 1) * 2 - if ((hour - hr) % 24) <= 4 then -- last 4 hours? - if nvm.done[idx] == false then -- not already executed? - techage.send_multi(number, numbers[idx], act) - nvm.done[idx] = true - end - else - nvm.done[idx] = false - end - end - end - - -- prepare for the next day - if hour == 23 then - nvm.done = {false,false,false,false,false,false} - end - return true - end - return false -end - - -minetest.register_node("techage:ta3_timer", { - description = S("TA3 Timer"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_timer.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - logic.after_place_node(pos, placer, "techage:ta3_timer", S("TA3 Timer")) - logic.infotext(meta, S("TA3 Timer")) - local events = {1,1,1,1,1,1} - local numbers = {"0000","","","","",""} - local actions = {"","","","","",""} - nvm.done = {false,false,false,false,false,false} - meta:set_string("events", minetest.serialize(events)) - meta:set_string("numbers", minetest.serialize(numbers)) - meta:set_string("actions", minetest.serialize(actions)) - meta:set_string("formspec", formspec(events, numbers, actions)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local events = minetest.deserialize(meta:get_string("events")) - for idx, evt in ipairs({fields.e1, fields.e2, fields.e3, fields.e4, fields.e5, fields.e6}) do - if evt ~= nil then - events[idx] = tTime[evt] - end - end - meta:set_string("events", minetest.serialize(events)) - - local numbers = minetest.deserialize(meta:get_string("numbers")) - for idx, num in ipairs({fields.n1, fields.n2, fields.n3, fields.n4, fields.n5, fields.n6}) do - if num ~= nil and techage.check_numbers(num, player:get_player_name()) then - numbers[idx] = num - end - end - meta:set_string("numbers", minetest.serialize(numbers)) - - local actions = minetest.deserialize(meta:get_string("actions")) - for idx, act in ipairs({fields.a1, fields.a2, fields.a3, fields.a4, fields.a5, fields.a6}) do - if act ~= nil then - actions[idx] = act - end - end - meta:set_string("actions", minetest.serialize(actions)) - meta:set_string("formspec", formspec(events, numbers, actions)) - local nvm = techage.get_nvm(pos) - nvm.done = {false,false,false,false,false,false} - end, - - on_timer = check_rules, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - sounds = default.node_sound_stone_defaults(), - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, -}) - - -minetest.register_craft({ - output = "techage:ta3_timer", - recipe = { - {"group:wood", "group:wood", ""}, - {"default:gold_ingot", "techage:vacuum_tube", ""}, - {"group:wood", "group:wood", ""}, - }, -}) - -techage.register_node({"techage:ta3_timer"}, { - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - -- check rules for just loaded areas - local nvm = techage.get_nvm(pos) - nvm.done = {false,false,false,false,false,false} - check_rules(pos,0) - end, -}) diff --git a/techage/lua_controller/commands.lua b/techage/lua_controller/commands.lua deleted file mode 100644 index ea2fb46..0000000 --- a/techage/lua_controller/commands.lua +++ /dev/null @@ -1,250 +0,0 @@ ---[[ - - Techage - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - commands.lua: - - Register all basic controller commands - -]]-- - --- store protection data locally -local LocalRef = {} -local function not_protected(owner, numbers) - if owner and numbers then - LocalRef[owner] = LocalRef[owner] or {} - if LocalRef[owner][numbers] == nil then - LocalRef[owner][numbers] = techage.check_numbers(numbers, owner) - end - return LocalRef[owner][numbers] - end - return false -end - -techage.lua_ctlr.register_function("get_input", { - cmnd = function(self, num) - num = tostring(num or "") - return techage.lua_ctlr.get_input(self.meta.number, num) - end, - help = ' $get_input(num) --> "on", "off", or nil\n'.. - ' Read local input value from device with number "num".\n'.. - ' example: inp = $get_input("1234")\n'.. - " The device has to be connected with the controller." -}) - -techage.lua_ctlr.register_function("get_next_input", { - cmnd = function(self) - return techage.lua_ctlr.get_next_input(self.meta.number) - end, - help = ' $get_next_input() --> number and state\n'.. - ' Similar to $get_input(), but provides the\n'.. - ' input node number in addition.\n'.. - ' example: num, state = $get_next_input()\n'.. - ' This function deletes the input and returns\n'.. - ' nil if no further input value is available.' -}) - -techage.lua_ctlr.register_function("read_data", { - cmnd = function(self, num, cmnd, data) - num = tostring(num or "") - cmnd = tostring(cmnd or "") - if not_protected(self.meta.owner, num) then - return techage.send_single(self.meta.number, num, cmnd, data) - end - end, - help = " $read_data(num, cmnd, add_data)\n".. - " This function is deprecated.\n".. - " It will be removed in future releases.\n".. - " Use $send_cmnd(num, cmnd, add_data) instead." -}) - -techage.lua_ctlr.register_function("time_as_str", { - cmnd = function(self) - local t = minetest.get_timeofday() - local h = math.floor(t*24) % 24 - local m = math.floor(t*1440) % 60 - return string.format("%02d:%02d", h, m) - end, - help = " $time_as_str() --> e.g. '18:45'\n".. - " Read time of day as string (24h).\n".. - ' example: time = $time_as_str()' -}) - -techage.lua_ctlr.register_function("time_as_num", { - cmnd = function(self, num) - local t = minetest.get_timeofday() - local h = math.floor(t*24) % 24 - local m = math.floor(t*1440) % 60 - return h * 100 + m - end, - help = " $time_as_num() --> e.g.: 1845\n".. - " Read time of day as number (24h).\n".. - ' example: time = $time_as_num()' -}) - -techage.lua_ctlr.register_action("send_cmnd", { - cmnd = function(self, num, cmnd, data) - num = tostring(num or "") - cmnd = tostring(cmnd or "") - if not_protected(self.meta.owner, num) then - return techage.send_single(self.meta.number, num, cmnd, data) - end - end, - help = " $send_cmnd(num, cmnd, add_data)\n".. - ' Send a command to the device with number "num".\n'.. - ' "cmnd" is the command as text string\n'.. - ' "add_data" is additional data (optional)\n'.. - ' example: $send_cmnd("1234", "on")' -}) - -techage.lua_ctlr.register_action("set_filter", { - cmnd = function(self, num, slot, val) - num = tostring(num or "") - slot = tostring(slot or "red") - val = tostring(val or "on") - if not_protected(self.meta.owner, num) then - techage.send_single(self.meta.number, num, "port", slot.."="..val) - end - end, - help = " $set_filter(num, slot, val)\n".. - ' Turn on/off a Distributor filter slot.\n'.. - ' example: $set_filter("1234", "red", "off")' -}) - -techage.lua_ctlr.register_action("get_filter", { - cmnd = function(self, num, slot) - num = tostring(num or "") - slot = tostring(slot or "red") - if not_protected(self.meta.owner, num) then - return techage.send_single(self.meta.number, num, "port", slot) - end - end, - help = " $get_filter(num, slot)\n".. - ' Read state of a Distributor filter slot.\n'.. - ' Return value is "on" or "off".\n'.. - ' example: state = $get_filter("1234", "red")' -}) - -techage.lua_ctlr.register_action("display", { - cmnd = function(self, num, row, text) - num = tostring(num or "") - row = tonumber(row or 1) or 1 - text = tostring(text or "") - if not_protected(self.meta.owner, num) then - if text:byte(1) == 32 then -- left aligned? - -- use the '\t' lcdlib control char for left-aligned - text = "\t" .. text:sub(2) - end - if row == 0 then -- add line? - techage.send_single(self.meta.number, num, "add", text) - else - local payload = safer_lua.Store() - payload.set("row", row) - payload.set("str", text) - techage.send_single(self.meta.number, num, "set", payload) - end - end - end, - help = " $display(num, row, text)\n".. - ' Send a text line to the display with number "num".\n'.. - " 'row' is a value from 1..5, or 0 for scroll screen\n".. - " and add a new line. If the first char of the string\n".. - " is a blank, the text will be horizontally centered.\n".. - ' example: $display("123", 1, "Hello "..name)' - -}) - -techage.lua_ctlr.register_action("display2", { - cmnd = function(self, num, row, text) - num = tostring(num or "") - row = tonumber(row or 1) or 1 - text = tostring(text or "") - if not_protected(self.meta.owner, num) then - if row == 0 then -- add line? - techage.send_single(self.meta.number, num, "add", text) - else - local payload = safer_lua.Store() - payload.set("row", row) - payload.set("str", text) - techage.send_single(self.meta.number, num, "set", payload) - end - end - end, - help = " $display2(num, row, text)\n".. - " Alternative 'display' function with different\n".. - " control char. If the first char of the string\n".. - " is a '\t', the text will be horizontally centered." - -}) - -techage.lua_ctlr.register_action("clear_screen", { - cmnd = function(self, num) - num = tostring(num or "") - if not_protected(self.meta.owner, num) then - techage.send_single(self.meta.number, num, "clear", nil) - end - end, - help = " $clear_screen(num)\n".. - ' Clear the screen of the display\n'.. - ' with number "num".\n'.. - ' example: $clear_screen("1234")' -}) - -techage.lua_ctlr.register_action("chat", { - cmnd = function(self, text) - text = tostring(text or "") - minetest.chat_send_player(self.meta.owner, "[TA4 Lua Controller] "..text) - end, - help = " $chat(text,...)\n".. - " Send yourself a chat message.\n".. - ' example: $chat("Hello "..name)' -}) - -techage.lua_ctlr.register_action("door", { - cmnd = function(self, pos, text) - pos = tostring(pos or "") - text = tostring(text or "") - pos = minetest.string_to_pos("("..pos..")") - if pos then - local door = doors.get(pos) - if door then - local player = { - get_player_name = function() return self.meta.owner end, - is_player = function() return true end, - } - if text == "open" then - door:open(player) - elseif text == "close" then - door:close(player) - end - end - end - end, - help = " $door(pos, text)\n".. - ' Open/Close a door at position "pos"\n'.. - ' example: $door("123,7,-1200", "close")\n'.. - " Hint: Use the Techage Programmer to\ndetermine the door position." -}) - -techage.lua_ctlr.register_function("item_description", { - cmnd = function(self, itemstring) - local item_def = minetest.registered_items[itemstring] - if item_def and item_def.description then - return minetest.get_translated_string("en", item_def.description) - end - return "" - end, - help = " $item_description(itemstring)\n".. - " Get the description for a specified itemstring.\n".. - ' example: desc = $item_description("default:apple")' -}) - - --- function not_protected(owner, number(s)) -techage.lua_ctlr.not_protected = not_protected diff --git a/techage/lua_controller/controller.lua b/techage/lua_controller/controller.lua deleted file mode 100644 index 0861209..0000000 --- a/techage/lua_controller/controller.lua +++ /dev/null @@ -1,679 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Lua Controller - -]]-- - --- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta - -local sHELP = [[TA4 Lua Controller - - This controller is used to control and monitor - TechAge machines. - This controller can be programmed in Lua. - - See on GitHub for more help: - https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md - - or download the PDF file from: - https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.pdf - -]] - -techage.lua_ctlr = {} - -local BATTERY_CAPA = 10000000 - -local Cache = {} - -local STATE_STOPPED = 0 -local STATE_RUNNING = 1 -local CYCLE_TIME = 1 - -local tCommands = {} -local tFunctions = {" Overview", " Data structures"} -local tHelpTexts = {[" Overview"] = sHELP, [" Data structures"] = safer_lua.DataStructHelp} -local sFunctionList = "" -local tFunctionIndex = {} - -minetest.after(2, function() - sFunctionList = table.concat(tFunctions, ",") - for idx,key in ipairs(tFunctions) do - tFunctionIndex[key] = idx - end -end) - -local function output(pos, text) - local meta = minetest.get_meta(pos) - text = meta:get_string("output") .. "\n" .. (text or "") - text = text:sub(-500,-1) - meta:set_string("output", text) -end - --- --- API functions for function/action registrations --- -function techage.lua_ctlr.register_function(key, attr) - tCommands[key] = attr.cmnd - table.insert(tFunctions, " $"..key) - tHelpTexts[" $"..key] = attr.help -end - -function techage.lua_ctlr.register_action(key, attr) - tCommands[key] = attr.cmnd - table.insert(tFunctions, " $"..key) - tHelpTexts[" $"..key] = attr.help -end - -local function merge(dest, keys, values) - for idx,key in ipairs(keys) do - dest.env[key] = values[idx] - end - return dest -end - -techage.lua_ctlr.register_action("print", { - cmnd = function(self, text) - local pos = self.meta.pos - text = tostring(text or "") - output(pos, text) - --print("Lua: "..text) - end, - help = " $print(text)\n".. - " Send a text line to the output window.\n".. - ' e.g. $print("Hello "..name)' -}) - -techage.lua_ctlr.register_action("loopcycle", { - cmnd = function(self, cycletime) - cycletime = math.floor(tonumber(cycletime) or 0) - local meta = minetest.get_meta(self.meta.pos) - meta:set_int("cycletime", cycletime) - meta:set_int("cyclecount", 0) - end, - help = "$loopcycle(seconds)\n".. - " This function allows to change the\n".. - " call frequency of the loop() function.\n".. - " value is in seconds, 0 = disable\n".. - ' e.g. $loopcycle(10)' -}) - -techage.lua_ctlr.register_action("events", { - cmnd = function(self, event) - self.meta.events = event or false - end, - help = "$events(true/false)\n".. - " Enable/disable event handling.\n".. - ' e.g. $events(true) -- enable events' -}) - -techage.lua_ctlr.register_function("get_ms_time", { - cmnd = function(self) - return math.floor(minetest.get_us_time() / 1000) - end, - help = " ms = $get_ms_time()\n".. - " returns time with millisecond precision." -}) - -techage.lua_ctlr.register_function("get_gametime", { - cmnd = function(self) - return minetest.get_gametime() - end, - help = " t = $get_gametime()\n".. - " returns the time, in seconds, since the world was created." -}) - -techage.lua_ctlr.register_function("position", { - cmnd = function(self, number) - local info = techage.get_node_info(number) - if info then - return S(info.pos) - end - return "(-,-,-)" - end, - help = " pos = $position(number)\n".. - " returns the position '(x,y,z)' of the device\n with given number." -}) - -techage.lua_ctlr.register_action("battery", { - cmnd = function(self) - local meta = minetest.get_meta(self.meta.pos) - local batpos = minetest.string_to_pos(meta:get_string("battery")) - local batmeta = minetest.get_meta(batpos) - local val = (BATTERY_CAPA - math.min(batmeta:get_int("content") or 0, BATTERY_CAPA)) - return 100 - math.floor((val * 100.0 / BATTERY_CAPA)) - end, - help = " lvl = $battery()\n".. - " Get charge level of battery connected to Controller.\n".. - " Function returns percent number (0-100) where 100 means full.\n".. - " example: battery_percent = $battery()" -}) - - -local function formspec0(meta) - local state = meta:get_int("state") == techage.RUNNING - local init = meta:get_string("init") - init = minetest.formspec_escape(init) - return "size[4,3]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "label[0,0;No Battery?]".. - "button[1,2;1.8,1;start;Start]" -end - -local function formspec1(meta) - local state = meta:get_int("state") == techage.RUNNING - local cmnd = state and "stop;Stop" or "start;Start" - local init = meta:get_string("init") - init = minetest.formspec_escape(init) - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "style_type[textarea;font=mono;textcolor=#FFFFFF;border=false]".. - "tabheader[0,0;tab;init,func,loop,outp,notes,help;1;;true]".. - "textarea[0.3,0.2;10,8.3;init;function init();"..init.."]".. - "background[0.1,0.3;9.8,7.0;techage_form_mask.png]".. - "label[0,7.3;end]".. - "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. - "button[6.3,7.5;1.8,1;save;Save]".. - "button[8.2,7.5;1.8,1;"..cmnd.."]" -end - -local function formspec2(meta) - local state = meta:get_int("state") == techage.RUNNING - local cmnd = state and "stop;Stop" or "start;Start" - local func = meta:get_string("func") - func = minetest.formspec_escape(func) - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "style_type[textarea;font=mono;textcolor=#FFFFFF;border=false]".. - "tabheader[0,0;tab;init,func,loop,outp,notes,help;2;;true]".. - "textarea[0.3,0.2;10,8.3;func;functions:;"..func.."]".. - "background[0.1,0.3;9.8,7.0;techage_form_mask.png]".. - "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. - "button[6.3,7.5;1.8,1;save;Save]".. - "button[8.2,7.5;1.8,1;"..cmnd.."]" -end - -local function formspec3(meta) - local state = meta:get_int("state") == techage.RUNNING - local cmnd = state and "stop;Stop" or "start;Start" - local loop = meta:get_string("loop") - loop = minetest.formspec_escape(loop) - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "style_type[textarea;font=mono;textcolor=#FFFFFF;border=false]".. - "tabheader[0,0;tab;init,func,loop,outp,notes,help;3;;true]".. - "textarea[0.3,0.2;10,8.3;loop;function loop(ticks, elapsed);"..loop.."]".. - "background[0.1,0.3;9.8,7.0;techage_form_mask.png]".. - "label[0,7.3;end]".. - "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. - "button[6.3,7.5;1.8,1;save;Save]".. - "button[8.2,7.5;1.8,1;"..cmnd.."]" -end - -local function formspec4(meta) - local state = meta:get_int("state") == techage.RUNNING - local cmnd = state and "stop;Stop" or "start;Start" - local output = meta:get_string("output") - output = minetest.formspec_escape(output) - output = output:gsub("\n", ",") - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "tabheader[0,0;tab;init,func,loop,outp,notes,help;4;;true]".. - "table[0.2,0.2;9.5,7;output;"..output..";200]".. - "button[4.4,7.5;1.8,1;clear;Clear]".. - "button[6.3,7.5;1.8,1;update;Update]".. - "button[8.2,7.5;1.8,1;"..cmnd.."]" -end - -local function formspec5(meta) - local notes = meta:get_string("notes") - notes = minetest.formspec_escape(notes) - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "style_type[textarea;font=mono;textcolor=#FFFFFF;border=false]".. - "tabheader[0,0;tab;init,func,loop,outp,notes,help;5;;true]".. - "textarea[0.3,0.2;10,8.3;notes;Notepad:;"..notes.."]".. - "background[0.1,0.3;9.8,7.0;techage_form_mask.png]".. - "button_exit[6.3,7.5;1.8,1;cancel;Cancel]".. - "button[8.2,7.5;1.8,1;save;Save]" -end - -local function formspec6(items, pos, text) - text = minetest.formspec_escape(text) - return "size[10,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "style_type[textarea;font=mono;textcolor=#FFFFFF]".. - "tabheader[0,0;tab;init,func,loop,outp,notes,help;6;;true]".. - "label[0,-0.2;Functions:]".. - "dropdown[0.3,0.2;10,8.3;functions;"..items..";"..pos.."]".. - "textarea[0.3,1.3;10,8;help;Help:;"..text.."]" -end - -local function patch_error_string(err, line_offs) - local tbl = {} - for s in err:gmatch("[^\r\n]+") do - if s:find("loop:(%d+):") then - local prefix, line, err = s:match("(.-)loop:(%d+):(.+)") - if prefix and line and err then - if tonumber(line) < line_offs then - table.insert(tbl, prefix.."func:"..line..":"..err) - else - line = tonumber(line) - line_offs - table.insert(tbl, prefix.."loop:"..line..":"..err) - end - end - else - table.insert(tbl, s) - end - end - return table.concat(tbl, "\n") -end - -local function error(pos, err) - local meta = minetest.get_meta(pos) - local func = meta:get_string("func") - local _,line_offs = string.gsub(func, "\n", "\n") - line_offs = line_offs + 1 - err = patch_error_string(err, line_offs) - output(pos, err) - local number = meta:get_string("number") - meta:set_string("infotext", "Controller "..number..": error") - meta:set_int("state", techage.STOPPED) - meta:set_int("running", STATE_STOPPED) - meta:set_string("formspec", formspec4(meta)) - minetest.get_node_timer(pos):stop() - return false -end - -local function compile(pos, meta, number) - local init = meta:get_string("init") - local func = meta:get_string("func") - local loop = meta:get_string("loop") - local owner = meta:get_string("owner") - local env = table.copy(tCommands) - env.meta = {pos=pos, owner=owner, number=number, error=error} - local code = safer_lua.init(pos, init, func.."\n"..loop, env, error) - - if code then - Cache[number] = {code=code, inputs={}, events=env.meta.events} - Cache[number].inputs.term = nil -- terminal inputs - Cache[number].inputs.msg = {} -- message queue - return true - end - return false -end - -local function battery(pos) - local battery_pos = minetest.find_node_near(pos, 1, {"techage:ta4_battery"}) - if battery_pos then - local meta = minetest.get_meta(pos) - meta:set_string("battery", minetest.pos_to_string(battery_pos)) - return true - end - return false -end - -local function start_controller(pos) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - if not battery(pos) then - meta:set_string("formspec", formspec0(meta)) - return false - end - - meta:set_string("output", "") - meta:set_int("cycletime", 1) - meta:set_int("cyclecount", 0) - meta:set_int("cpu", 0) - - if compile(pos, meta, number) then - meta:set_int("state", techage.RUNNING) - meta:set_int("running", STATE_RUNNING) - minetest.get_node_timer(pos):start(CYCLE_TIME) - meta:set_string("formspec", formspec4(meta)) - meta:set_string("infotext", "Controller "..number..": running") - return true - end - return false -end - -local function stop_controller(pos) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - meta:set_int("state", techage.STOPPED) - meta:set_int("running", STATE_STOPPED) - minetest.get_node_timer(pos):stop() - meta:set_string("infotext", "Controller "..number..": stopped") - meta:set_string("formspec", formspec3(meta)) -end - -local function no_battery(pos) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - meta:set_int("state", techage.STOPPED) - meta:set_int("running", STATE_STOPPED) - minetest.get_node_timer(pos):stop() - meta:set_string("infotext", "Controller "..number..": No battery") - meta:set_string("formspec", formspec0(meta)) -end - -local function update_battery(meta, cpu) - local pos = minetest.string_to_pos(meta:get_string("battery")) - if pos then - meta = minetest.get_meta(pos) - local content = meta:get_int("content") - cpu - if content <= 0 then - meta:set_int("content", 0) - return false - end - meta:set_int("content", content) - return true - end -end - -local function call_loop(pos, meta, elapsed) - local t = minetest.get_us_time() - local number = meta:get_string("number") - if meta:get_int("running") == STATE_RUNNING then - if Cache[number] or compile(pos, meta, number) then - local cpu = meta:get_int("cpu") or 0 - local code = Cache[number].code - local res = safer_lua.run_loop(pos, elapsed, code, error) - if res then - -- Don't count thread changes - t = math.min(minetest.get_us_time() - t, 1000) - cpu = math.floor(((cpu * 20) + t) / 21) - meta:set_int("cpu", cpu) - meta:set_string("infotext", "Controller "..number..": running ("..cpu.."us)") - if not update_battery(meta, cpu) then - no_battery(pos) - return false - end - end - -- further messages available? - return res - end - end - return false -end - -local function on_timer(pos, elapsed) - local meta = minetest.get_meta(pos) - -- considering cycle frequency - local cycletime = meta:get_int("cycletime") or 1 - local cyclecount = (meta:get_int("cyclecount") or 0) + 1 - if cycletime == 0 or cyclecount < cycletime then - meta:set_int("cyclecount", cyclecount) - return true - end - meta:set_int("cyclecount", 0) - - if techage.is_activeformspec(pos) then - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec4(meta)) - end - return call_loop(pos, meta, elapsed) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local meta = minetest.get_meta(pos) - - --print(dump(fields)) - if fields.cancel == nil then - if fields.init then - meta:set_string("init", fields.init) - meta:set_string("formspec", formspec1(meta)) - elseif fields.func then - meta:set_string("func", fields.func) - meta:set_string("formspec", formspec2(meta)) - elseif fields.loop then - meta:set_string("loop", fields.loop) - meta:set_string("formspec", formspec3(meta)) - elseif fields.notes then - meta:set_string("notes", fields.notes) - meta:set_string("formspec", formspec5(meta)) - end - end - - if fields.update then - meta:set_string("formspec", formspec4(meta)) - techage.set_activeformspec(pos, player) - elseif fields.clear then - meta:set_string("output", "") - meta:set_string("formspec", formspec4(meta)) - elseif fields.tab == "1" then - meta:set_string("formspec", formspec1(meta)) - elseif fields.tab == "2" then - meta:set_string("formspec", formspec2(meta)) - elseif fields.tab == "3" then - meta:set_string("formspec", formspec3(meta)) - elseif fields.tab == "4" then - meta:set_string("formspec", formspec4(meta)) - elseif fields.tab == "5" then - meta:set_string("formspec", formspec5(meta)) - elseif fields.tab == "6" then - meta:set_string("formspec", formspec6(sFunctionList, 1, sHELP)) - elseif fields.start == "Start" then - start_controller(pos) - minetest.log("action", player:get_player_name() .. - " starts the sl_controller at ".. minetest.pos_to_string(pos)) - elseif fields.stop == "Stop" then - stop_controller(pos) - elseif fields.functions then - local key = fields.functions - local text = tHelpTexts[key] or "" - local pos = tFunctionIndex[key] or 1 - meta:set_string("formspec", formspec6(sFunctionList, pos, text)) - end -end - -minetest.register_node("techage:ta4_lua_controller", { - description = "TA4 Lua Controller", - inventory_image = "techage_lua_controller_inventory.png", - wield_image = "techage_lua_controller_inventory.png", - stack_max = 1, - tiles = { - -- up, down, right, left, back, front - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png", - "techage_smartline.png^techage_lua_controller.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local number = techage.add_node(pos, "techage:ta4_lua_controller") - meta:set_string("owner", placer:get_player_name()) - meta:set_string("number", number) - meta:set_int("state", techage.STOPPED) - meta:set_int("running", STATE_STOPPED) - meta:set_string("init", "-- called only once") - meta:set_string("func", "-- for your functions") - meta:set_string("loop", "-- called every second") - meta:set_string("notes", "For your notes / snippets") - meta:mark_as_private("init") - meta:mark_as_private("func") - meta:mark_as_private("loop") - meta:mark_as_private("notes") - meta:set_string("formspec", formspec1(meta)) - meta:set_string("infotext", "Controller "..number..": stopped") - end, - - on_receive_fields = on_receive_fields, - - on_rightclick = function(pos, node, clicker) - local meta = M(pos) - if meta:get_int("running") == STATE_RUNNING then - techage.set_activeformspec(pos, clicker) - meta:set_string("formspec", formspec4(meta)) - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - on_timer = on_timer, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=1, cracky=1, crumbly=1}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta4_lua_controller", - recipe = { - {"basic_materials:plastic_sheet", "dye:blue", "techage:aluminum"}, - {"", "default:copper_ingot", ""}, - {"techage:ta4_ramchip", "techage:ta4_wlanchip", "techage:ta4_ramchip"}, - }, -}) - --- write inputs from remote nodes -local function set_input(pos, number, input, val) - if input and M(pos):get_int("state") == techage.RUNNING then - if (Cache[number] or compile(pos, M(pos), number)) and Cache[number].inputs then - if input == "msg" then - if #Cache[number].inputs["msg"] < 10 then - table.insert(Cache[number].inputs["msg"], val) - end - else - Cache[number].inputs[input] = val - end - if Cache[number].events then -- events enabled? - local t = minetest.get_us_time() - if not Cache[number].last_event or Cache[number].last_event < t then - local meta = minetest.get_meta(pos) - minetest.after(0.01, call_loop, pos, meta, -1) - Cache[number].last_event = t + 100000 -- add 100 ms - end - end - end - end -end - --- used by the command "input" -function techage.lua_ctlr.get_input(number, input) - if input then - if Cache[number] and Cache[number].inputs then - return Cache[number].inputs[input] or "off" - end - end - return "off" -end - -function techage.lua_ctlr.get_next_input(number) - if Cache[number] and Cache[number].inputs then - local num, state = next(Cache[number].inputs or {}) - if num ~= "msg" and num ~= "term" then - if num then - Cache[number].inputs[num] = nil - end - return num, state - end - end -end - --- used for Terminal commands -function techage.lua_ctlr.get_command(number) - if Cache[number] and Cache[number].inputs then - local cmnd = Cache[number].inputs["term"] - Cache[number].inputs["term"] = nil - return cmnd - end -end - --- used for queued messages -function techage.lua_ctlr.get_msg(number) - if Cache[number] and Cache[number].inputs then - return table.remove(Cache[number].inputs["msg"], 1) - end -end - -techage.register_node({"techage:ta4_lua_controller"}, { - on_recv_message = function(pos, src, topic, payload) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - - if topic == "on" then - set_input(pos, number, src, topic) - elseif topic == "off" then - set_input(pos, number, src, topic) - elseif topic == "term" then - set_input(pos, number, "term", payload) - elseif topic == "msg" then - set_input(pos, number, "msg", {src = src, data = payload}) - elseif topic == "state" then - local running = meta:get_int("running") or STATE_STOPPED - return techage.StateStrings[running] or "stopped" - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - - if topic == 1 and payload[1] == 1 then - set_input(pos, number, src, "on") - elseif topic == 1 and payload[1] == 0 then - set_input(pos, number, src, "off") - else - return 2 - end - return 0 - end, - on_beduino_request_data = function(pos, src, topic, payload) - local meta = minetest.get_meta(pos) - - if topic == 142 then - local running = meta:get_int("running") or STATE_STOPPED - return 0, {running} - else - return 2, "" - end - end, -}) diff --git a/techage/lua_controller/sensorchest.lua b/techage/lua_controller/sensorchest.lua deleted file mode 100644 index 5ba2f1e..0000000 --- a/techage/lua_controller/sensorchest.lua +++ /dev/null @@ -1,276 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Sensor Chest - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local PlayerActions = {} -local InventoryState = {} - - -local function store_action(pos, player, action) - local meta = minetest.get_meta(pos) - local name = player and player:get_player_name() or "" - local number = meta:get_string("node_number") - PlayerActions[number] = {name, action} -end - -local function send_off_command(pos) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - if number ~= "" then - local own_num = meta:get_string("node_number") - techage.send_single(own_num, number, "off") - end -end - -local function send_command(pos) - local meta = minetest.get_meta(pos) - local number = meta:get_string("number") - if number ~= "" then - local own_num = meta:get_string("node_number") - techage.send_single(own_num, number, "on") - minetest.after(0.2, send_off_command, pos) - end -end - -local function get_stack(pos, idx) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local stack = inv:get_stack("main", idx) - return stack:get_name(), stack:get_count() -end - -local function get_stacks(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local a = safer_lua.Array() - for idx = 1,4 do - local stack = inv:get_stack("main", idx) - local s = safer_lua.Store() - if stack:get_count() > 0 then - s.set("name", stack:get_name()) - s.set("count", stack:get_count()) - a.add(s) - end - end - return a -end - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if M(pos):get_string("public") ~= "true" and minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - store_action(pos, player, "put") - send_command(pos) - return stack:get_count() -end - -local function allow_metadata_inventory_take(pos, listname, index, stack, player) - if M(pos):get_string("public") ~= "true" and minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - store_action(pos, player, "take") - send_command(pos) - return stack:get_count() -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = minetest.get_meta(pos):get_inventory() - return inv:is_empty("main") -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) -end - -local function formspec1() - return "size[5.5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.5,1;5,1;number;TA4 Lua Controller number:;]" .. - "checkbox[0.5,1.8;public;"..S("Allow public chest access")..";false]".. - "button_exit[1.7,2.8;2,1;exit;Save]" -end - -local function formspec2(pos) - local text = M(pos):get_string("text") - return "size[8,6]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;0,0;2,2;]".. - "button[2,0;1,1;f1;F1]".. - "button[2,1;1,1;f2;F2]".. - "label[3,0;"..text.."]".. - "list[current_player;main;0,2.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -minetest.register_node("techage:ta4_sensor_chest", { - description = S("TA4 Sensor Chest"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png^techage_appl_sensor.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png^techage_appl_sensor.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png^techage_appl_sensor.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_front_ta4.png^techage_appl_sensor.png", - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size('main', 4) - end, - - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local number = techage.add_node(pos, "techage:ta4_sensor_chest") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("text", "Text to be changed\nby command.") - meta:set_string("formspec", formspec1()) - meta:set_string("infotext", S("TA4 Sensor Chest").." "..number..": "..S("not connected")) - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if meta:get_string("public") ~= "true" and minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - - if fields.public then - meta:set_string("public", fields.public) - end - if fields.quit == "true" and fields.number and fields.number ~= "" then - local owner = meta:get_string("owner") - if techage.check_numbers(fields.number, owner) then - meta:set_string("number", fields.number) - local node_number = meta:get_string("node_number") - meta:set_string("infotext", S("TA4 Sensor Chest").." "..node_number..": "..S("connected with").." "..fields.number) - meta:set_string("formspec", formspec2(pos)) - end - elseif fields.f1 then - store_action(pos, player, "f1") - send_command(pos) - meta:set_string("formspec", formspec2(pos)) - elseif fields.f2 then - store_action(pos, player, "f2") - send_command(pos) - meta:set_string("formspec", formspec2(pos)) - end - end, - - techage_set_numbers = function(pos, numbers, player_name) - return techage.logic.set_numbers(pos, numbers, player_name, S("TA4 Sensor Chest")) - end, - - can_dig = can_dig, - after_dig_node = after_dig_node, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -techage.register_node({"techage:ta4_sensor_chest"}, { - on_pull_item = function(pos, in_dir, num) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_items(pos, inv, "main", 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, "main", 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, "main", stack) - end, - - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return techage.get_inv_state(inv, "main") - elseif topic == "action" then - local meta = minetest.get_meta(pos) - local number = meta:get_string("node_number") - return (PlayerActions[number] or {})[1], (PlayerActions[number] or {})[2] - elseif topic == "stacks" then - return get_stacks(pos) - elseif topic == "text" then - local meta = minetest.get_meta(pos) - meta:set_string("text", tostring(payload)) - meta:set_string("formspec", formspec2(pos)) - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 66 then - local meta = minetest.get_meta(pos) - meta:set_string("text", tostring(payload)) - meta:set_string("formspec", formspec2(pos)) - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 131 then -- Chest State - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - return 0, {techage.get_inv_state_num(inv, "main")} - elseif topic == 138 and payload[1] == 1 then -- Sensor Chests State (action) - local meta = minetest.get_meta(pos) - local number = meta:get_string("node_number") - local action = (PlayerActions[number] or {})[2] or "None" - return 0, {({put = 1, get = 2})[action] or 0} - elseif topic == 138 and payload[1] == 2 then -- Sensor Chests State (player name) - local meta = minetest.get_meta(pos) - local number = meta:get_string("node_number") - return 0, (PlayerActions[number] or {})[1] - elseif topic == 138 and payload[1] == 3 then -- Sensor Chests State (stack item name) - local name, _ = get_stack(pos, payload[2] or 1) - return 0, name - elseif topic == 138 and payload[1] == 4 then -- Sensor Chests State (stack item count) - local _, count = get_stack(pos, payload[2] or 1) - return 0, {count} - else - return 2, "" - end - end, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:ta4_sensor_chest", - recipe = {"techage:chest_ta4", "techage:ta4_wlanchip"} -}) diff --git a/techage/lua_controller/server.lua b/techage/lua_controller/server.lua deleted file mode 100644 index 43838cd..0000000 --- a/techage/lua_controller/server.lua +++ /dev/null @@ -1,325 +0,0 @@ ---[[ - - Techage - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - server.lua: - -]]-- - --- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta - -local SERVER_CAPA = 5000 - -local function formspec(nvm) - local names = table.concat(nvm.names or {}, " ") - return "size[9,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.2,1;9,1;names;Allowed user names (space separated):;"..names.."]" .. - "button_exit[3.5,2.5;2,1;exit;Save]" -end - -minetest.register_node("techage:ta4_server", { - description = "TA4 Lua Server", - tiles = { - -- up, down, right, left, back, front - "techage_server_top.png", - "techage_server_top.png", - "techage_server_side.png", - "techage_server_side.png^[transformFX", - "techage_server_back.png", - { - name = "techage_server_front.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 1, - }, - }, - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -3/16, -8/16, -7/16, 3/16, 6/16, 7/16}, - }, - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta4_server") - meta:set_string("owner", placer:get_player_name()) - meta:set_string("number", number) - meta:set_string("formspec", formspec(nvm)) - nvm.size = 0 - meta:set_string("infotext", "Server "..number..": ("..nvm.size.."/"..SERVER_CAPA..")") - minetest.get_node_timer(pos):start(20) - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local owner = meta:get_string("owner") - if player:get_player_name() == owner then - if fields.names and fields.names ~= "" then - nvm.names = string.split(fields.names, " ") - meta:set_string("formspec", formspec(nvm)) - end - end - end, - - on_dig = function(pos, node, puncher, pointed_thing) - if minetest.is_protected(pos, puncher:get_player_name()) then - return - end - techage.del_mem(pos) - minetest.node_dig(pos, node, puncher, pointed_thing) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - on_timer = function(pos, elasped) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.size = nvm.size or 0 - local number = meta:get_string("number") - meta:set_string("infotext", "Server "..number..": ("..nvm.size.."/"..SERVER_CAPA..")") - return true - end, - - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - groups = {choppy=1, cracky=1, crumbly=1}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta4_server", - recipe = { - {"default:steel_ingot", "dye:black", "default:steel_ingot"}, - {"techage:ta4_ramchip", "default:copper_ingot", "techage:ta4_ramchip"}, - {"techage:ta4_ramchip", "techage:ta4_wlanchip", "techage:ta4_ramchip"}, - }, -}) - -minetest.register_node("techage:ta4_server2", { - description = "TA4 Lua Rack Server", - tiles = { - -- up, down, right, left, back, front - "techage_server2_top.png", - "techage_server2_top.png", - "techage_server2_side.png", - "techage_server2_side.png^[transformFX", - "techage_server2_back.png", - { - name = "techage_server2_front.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 1, - }, - }, - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, -0.4375, -0.4375, 0.5}, - {-0.5, 0.4375, -0.5, -0.4375, 0.5, 0.5}, - {0.4375, -0.5, -0.5, 0.5, -0.4375, 0.5}, - {0.4375, 0.4375, -0.5, 0.5, 0.5, 0.5}, - {-0.5, -0.5, -0.375, -0.4375, 0.5, -0.3125}, - {-0.5, -0.5, 0.3125, -0.4375, 0.5, 0.375}, - {0.4375, -0.5, 0.3125, 0.5, 0.5, 0.375}, - {0.4375, -0.5, -0.375, 0.5, 0.5, -0.3125}, - {-0.4375, -0.3125, -0.4375, 0.4375, 0.3125, 0.4375}, - {0.4375, -0.0625, -0.4375, 0.5, 0, 0.4375}, - {-0.5, -0.0625, -0.4375, -0.4375, 0, 0.4375}, - } - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta4_server2") - meta:set_string("owner", placer:get_player_name()) - meta:set_string("number", number) - meta:set_string("formspec", formspec(nvm)) - nvm.size = 0 - meta:set_string("infotext", "Server "..number..": ("..nvm.size.."/"..SERVER_CAPA..")") - minetest.get_node_timer(pos):start(20) - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local owner = meta:get_string("owner") - if player:get_player_name() == owner then - if fields.names and fields.names ~= "" then - nvm.names = string.split(fields.names, " ") - meta:set_string("formspec", formspec(nvm)) - end - end - end, - - on_dig = function(pos, node, puncher, pointed_thing) - if minetest.is_protected(pos, puncher:get_player_name()) then - return - end - techage.del_mem(pos) - minetest.node_dig(pos, node, puncher, pointed_thing) - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - on_timer = function(pos, elasped) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - nvm.size = nvm.size or 0 - local number = meta:get_string("number") - meta:set_string("infotext", "Server "..number..": ("..nvm.size.."/"..SERVER_CAPA..")") - return true - end, - - paramtype = "light", - sunlight_propagates = true, - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - groups = {choppy=1, cracky=1, crumbly=1}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:ta4_server2", - recipe = {"techage:ta4_server"}, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:ta4_server", - recipe = {"techage:ta4_server2"}, -}) - -local function calc_size(v) - if type(v) == "number" then - return 1 - elseif type(v) == "boolean" then - return 1 - elseif v == nil then - return 0 - elseif type(v) == "string" then - return #v - elseif v.MemSize then - return v.MemSize - else - return nil - end -end - -local function get_memory(num, name) - local info = techage.get_node_info(num) - if info and info.pos then - local nvm = techage.get_nvm(info.pos) - nvm.names = nvm.names or {} - for _,n in ipairs(nvm.names) do - if name == n then - nvm.data = nvm.data or {} - return nvm - end - end - end -end - -local function write_value(nvm, key, item) - if nvm and nvm.size < SERVER_CAPA then - if nvm.data[key] then - nvm.size = nvm.size - calc_size(nvm.data[key]) - end - if type(item) == "table" then - item = safer_lua.datastruct_to_table(item) - end - nvm.size = nvm.size + calc_size(item) - nvm.data[key] = item - return true - end - return false -end - -local function read_value(nvm, key) - local item = nvm.data[key] - if type(item) == "table" then - item = safer_lua.table_to_datastruct(item) - end - return item -end - -techage.register_node({"techage:ta4_server", "techage:ta4_server2"}, { - on_recv_message = function(pos, src, topic, payload) - return "unsupported" - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(20) - end, -}) - - -techage.lua_ctlr.register_function("server_read", { - cmnd = function(self, num, key) - if type(key) == "string" then - local nvm = get_memory(num, self.meta.owner) - if nvm then - return read_value(nvm, key) - end - else - self.error("Invalid server_read parameter") - end - end, - help = " $server_read(num, key)\n".. - " Read a value from the server.\n".. - " 'key' must be a string.\n".. - ' example: state = $server_read("123", "state")' -}) - -techage.lua_ctlr.register_action("server_write", { - cmnd = function(self, num, key, value) - if type(key) == "string" then - local nvm = get_memory(num, self.meta.owner) - if nvm then - return write_value(nvm, key, value) - end - else - self.error("Invalid server_write parameter") - end - end, - help = " $server_write(num, key, value)\n".. - " Store a value on the server under the key 'key'.\n".. - " 'key' must be a string. 'value' can be either a\n".. - " number, string, boolean, nil or data structure.\n".. - " return value: true if successful or false\n".. - ' example: res = $server_write("123", "state", state)' -}) diff --git a/techage/lua_controller/terminal.lua b/techage/lua_controller/terminal.lua deleted file mode 100644 index 78d5824..0000000 --- a/techage/lua_controller/terminal.lua +++ /dev/null @@ -1,261 +0,0 @@ ---[[ - - Techage - ======= - - Copyright (C) 2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - terminal.lua: - -]]-- - -local HELP = [[#### TA4 Lua Controller Terminal #### - -Send commands to your Controller -and output text messages from your -Controller to the Terminal. - -Commands can have up to 80 characters. -Local commands: -- clear = clear screen -- help = this message -- pub = switch to public use -- priv = switch to private use -Global commands: -- send on/off = send on/off event -- msg = send a text message - -For more help: -https://github.com/joe7575/techage/wiki - -]] - -local function formspec1() - return "size[6,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "field[0.5,1;5,1;number;TA4 Lua Controller number:;]" .. - "button_exit[1.5,2.5;2,1;exit;Save]" -end - -local function formspec2(meta) - local output = meta:get_string("output") - output = minetest.formspec_escape(output) - output = output:gsub("\n", ",") - return "size[9,8]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "style_type[table,field;font=mono]".. - "table[0.1,0.1;8.6,6.6;output;"..output..";200]".. - "field[0.5,7.6;6,1;cmnd;Enter command;]" .. - "field_close_on_enter[cmnd;false]".. - "button[6.7,7.3;2,1;ok;Enter]" -end - -local function output(pos, text) - local meta = minetest.get_meta(pos) - text = meta:get_string("output") .. "\n" .. (text or "") - text = text:sub(-500,-1) - meta:set_string("output", text) - meta:set_string("formspec", formspec2(meta)) - -end - -local function command(pos, cmnd, player) - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - if cmnd then - cmnd = cmnd:sub(1,80) - - if cmnd == "clear" then - meta:set_string("output", "") - meta:set_string("formspec", formspec2(meta)) - elseif cmnd == "help" then - local meta = minetest.get_meta(pos) - meta:set_string("output", HELP) - meta:set_string("formspec", formspec2(meta)) - elseif cmnd == "pub" and owner == player then - meta:set_int("public", 1) - --output(pos, player..":$ "..cmnd) - output(pos, "> "..cmnd) - output(pos, "Switched to public use!") - elseif cmnd == "priv" and owner == player then - meta:set_int("public", 0) - --output(pos, player..":$ "..cmnd) - output(pos, "> "..cmnd) - output(pos, "Switched to private use!") - elseif meta:get_int("public") == 1 or owner == player then - -- send on/off - local num, topic = cmnd:match('^send%s+([0-9]+)%s+([onff]+)$') - if num and topic then - local own_number = meta:get_string("own_number") - if techage.lua_ctlr.not_protected(owner, num) then - --output(pos, player..":$ send "..num.." "..topic) - output(pos, "> send "..num.." "..topic) - techage.send_single(own_number, num, topic, nil) - return - end - end - -- msg - local num, text = cmnd:match('^msg%s+([0-9]+)%s+(.+)$') - if num and text then - local own_number = meta:get_string("own_number") - if techage.lua_ctlr.not_protected(owner, num) then - --output(pos, player..":$ msg "..num.." "..text) - output(pos, "> msg "..num.." "..text) - techage.send_single(own_number, num, "msg", text) - return - end - end - local number = meta:get_string("number") - local own_number = meta:get_string("own_number") - if techage.lua_ctlr.not_protected(owner, number) then - --output(pos, player..":$ "..cmnd) - output(pos, "> "..cmnd) - techage.send_single(own_number, number, "term", cmnd) - end - end - end -end - -minetest.register_node("techage:ta4_terminal", { - description = "TA4 Lua Controller Terminal", - tiles = { - -- up, down, right, left, back, front - 'techage_terminal1_top.png', - 'techage_terminal1_bottom.png', - 'techage_terminal1_side.png', - 'techage_terminal1_side.png', - 'techage_terminal1_bottom.png', - "techage_terminal1_front.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, - {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, - }, - }, - selection_box = { - type = "fixed", - fixed = { - {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, - {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, - }, - }, - - after_place_node = function(pos, placer) - local number = techage.add_node(pos, minetest.get_node(pos).name) - local meta = minetest.get_meta(pos) - meta:set_string("own_number", number) - meta:set_string("formspec", formspec1()) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", "TA4 Lua Controller Terminal "..number..": not connected") - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - if fields.number and fields.number ~= "" then - local owner = meta:get_string("owner") - if techage.check_numbers(fields.number, owner) then - meta:set_string("number", fields.number) - local own_number = meta:get_string("own_number") - meta:set_string("infotext", "TA4 Lua Controller Terminal "..own_number..": connected with "..fields.number) - meta:set_string("formspec", formspec2(meta)) - end - elseif (fields.key_enter == "true" or fields.ok == "Enter") and fields.cmnd ~= "" then - command(pos, fields.cmnd, player:get_player_name()) - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta4_terminal", - recipe = { - {"", "techage:ta4_display", ""}, - {"dye:black", "techage:ta4_wlanchip", "default:copper_ingot"}, - {"", "techage:aluminum", ""}, - }, -}) - -techage.register_node({"techage:ta4_terminal"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "term" then - output(pos, payload) - return true - elseif topic == "msg" then - output(pos, tostring(payload.src)..": "..tostring(payload.text)) - return true - end - end, -}) - -techage.lua_ctlr.register_function("get_term", { - cmnd = function(self) - return techage.lua_ctlr.get_command(self.meta.number) - end, - help = ' $get_term() --> text string or nil\n'.. - ' Read an entered string (command) from the Terminal.\n'.. - ' example: s = $get_term()\n'.. - " The Terminal has to be connected to the controller." -}) - -techage.lua_ctlr.register_action("put_term", { - cmnd = function(self, num, text) - text = tostring(text or "") - if techage.lua_ctlr.not_protected(self.meta.owner, num) then - techage.send_single(self.meta.number, num, "term", text) - end - end, - help = " $put_term(num, text)\n".. - ' Send a text line to the terminal with number "num".\n'.. - ' example: $put_term("0123", "Hello "..name)' -}) - -techage.lua_ctlr.register_function("get_msg", { - cmnd = function(self, raw) - local msg = techage.lua_ctlr.get_msg(self.meta.number) - if msg then - local data = msg.data - if not raw then - data = tostring(data or "") - end - return msg.src, data - end - end, - help = ' $get_msg([raw]) --> number and any value or nil\n'.. - ' If the optional `raw` parameter is not set or false,\n'.. - ' the second return value is guaranteed to be a string.\n'.. - ' Read a received messages. Number is the node\n'.. - ' number of the sender.\n'.. - ' example: num,msg = $get_msg().' -}) - -techage.lua_ctlr.register_action("send_msg", { - cmnd = function(self, num, data) - if techage.lua_ctlr.not_protected(self.meta.owner, num) then - techage.send_single(self.meta.number, num, "msg", data) - end - end, - help = " $send_msg(num, data)\n".. - ' Send a message to the controller with number "num".\n'.. - ' example: $send_msg("0123", "test")' -}) diff --git a/techage/manuals/QSG.md b/techage/manuals/QSG.md deleted file mode 100644 index d2933aa..0000000 --- a/techage/manuals/QSG.md +++ /dev/null @@ -1,105 +0,0 @@ -# TechAge Quick Start Guide - -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 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 -- Present (TA4) - Electricity from renewable energy sources such as sun and wind -- Future (TA5) - Machines to overcome space and time, new sources of energy and other achievements shape your life - -Since the levels build on each other, all ages have to be run through one after the other. - - - -## Manuals - -- [Techage](https://github.com/joe7575/techage/wiki) and ingame via TA Construction Plan - -- [Minecart](https://github.com/joe7575/minecart/blob/master/README.md) and ingame via player inventory help (the blue questionmark) -- [Hyperloop](https://github.com/joe7575/Minetest-Hyperloop/wiki) -- [Signs Bot](https://github.com/joe7575/signs_bot/blob/master/README.md) and ingame via player inventory help (the blue questionmark) - - - -## Iron Age (TA1) - -1. Search and harvest papyrus to make paper and craft the Techage Construction Board. This plan is the ingame manual for all four Techage phases -2. Cut trees and make wood out of them -3. Collect dirt for the charcoal burner to make charcoal -4. Go mining and seach for ores, or -5. Alternatively, use Hammer and Gravel Sieve to collect ore from gravel -6. Build a melting furnace and melting pot to melt iron and other ores in the melting pot -7. Use the Minecart Hopper to automate your Gravel Sieve - - - -## Steam Age (TA2) - -1. Build a stream engine according to the TA Construction Board -2. Craft machines like TA2 Grinder, TA2 Sieve, TA2 Distributor, TA2 Pusher, TA2 Autocrafter, TA2 Electronic Fab, and TA2 Quarry -3. Connect the machines with the stream engine via drive axles (if needed) -4. Use the Quarry to collect cobblestone or go mining -5. Crushing, grinding and sieving of cobblestone is used to extract ores -6. Build a Gravel washer according to the TA Construction Board to collect further ores from sieved gravel -7. TA2 Autocrafter and TA2 Electronic Fab help to get items for the next phase - - - -## Oil Age (TA3) - -1. Build a coal-fired Power Station which can be replaced later by a oil firebox -2. Craft new machines driven by electricity -3. Search for oil (petroleum) with the TA3 Oil Explorer (don't give up to early) -4. Drilling derricks and oil pumps help them get the oil -5. Railways are used to transport oil to the power plants -6. Distillation Towers are used to separate the oil into its components -7. Pumps and Tanks are used to pump and store the oil liquids -8. TA3 Industrial Furnace and TA3 Electronic Fab help to get items for the next phase - - - -## Present (TA4) - -1. Build solar and wind plants to get renewable energy -2. Build a Thermal Energy Storage to store the energy -3. Build a Chemical Reactor to manufacture further items -4. Build a Hyperloop network as passenger transportation system -5. Use the Signs Bot for further automation tasks -6. Use Controller, Displays and further logic to fully automate all machines... - - - -## Future (TA5) - -tbd. - - -## Power Consumption - -| TechAge Machine | TA2 [ku] | TA3 [ku] | TA4 [ku] | -| ------------------------------ | -------- | -------- | --------- | -| Autocrafter | 4 | 6 | (9) | -| Electronic Fab | 8 | 12 | 12 | -| Gravel Rinser | 3 | 3 | - | -| Gravel Sieve | 3 | 4 | 5 | -| Grinder | 4 | 6 | 9 | -| Liquid Sampler | 3 | 5 | - | -| Quarry | 10 | 12 | 14 | -| TA3 Industrial Furnace Booster | | 3 | | -| TA4 Industrial Furnace Heater | | | 14 | -| Oil Drill Box | | 16 | | -| Oil Pumpjack | | 16 | | -| TA3 Oil Reboiler | | 14 | | -| TA4 Electrolyzer | | | 35 | -| TA4 Fuel Cell | | | 34 | -| TA4 Reactor | - | - | 8 | -| Steam Engine | 25 | | | -| Coal Power Station | | 80 | | -| TA3 Tiny Power Generator | | 12 | | -| TA4 Solar Inverter | | | up to 100 | -| TA4 Wind Turbine | | | 70 | - diff --git a/techage/manuals/description.md b/techage/manuals/description.md deleted file mode 100644 index 08c39ff..0000000 --- a/techage/manuals/description.md +++ /dev/null @@ -1,49 +0,0 @@ -From [c56](https://forum.minetest.net/memberlist.php?mode=viewprofile&u=29520) Minetest [Forum](https://forum.minetest.net/viewtopic.php?p=414865#p414865) - - - -I decided to write a longer post describing the game to encourage the undecided. I am not native in English, so forgive me for mistakes. - -I had a very nice time playing with a mod called Tech Age. There are some things that annoy me and not everything seems well balanced, but basically it's a very cool and complex tech mod. The gameplay can be fun, relaxing and challenging. If you are concerned about communication difficulties, don't be afraid ;-) Although the server is oriented to the German language, and in the crafting guide the names of the objects are in German, you know most of these objects from other minetest games and all admins/mods also speak English, so there is no problem communicating in that language. (I do not speak German and can play there - it is possible). They are all nice and friendly people there! - -The new player starts the game with Construction Board in his or her inventory - instructions describing the next steps of technological development. This information is very useful and is written in both German and English. The player also has the ability to easily craft more of this objects and place them where they need them.This guide also includes illustrations of how to assemble and connect something to build a working device. - -Traditionally, at the begining you need to find free land and build some kind of food farm. In this case, however, it is good to find a place far away from other players, because as time goes on, you will need more space in your base, and it would be bad when other players with their structures will stop your progress. You should think about place/sapace management in advance, because as you progress, you may have a lot of objects that will be difficult for you to move to a new place if you eventually will need to move. It seems that it is best not to move at all and have good opportunities to expand your base from the very beginning, both on the surface and underground. - -At the beginning, you need to have good access to wheat, from which you will produce lighter blocks, and to trees (the best is to build a tree farm), from which you will produce charcoal blocks. Charcoal is a fuel for smelting ores into usable ingots on the early technological level. You make charcoal in a some kind of furnace, self-builded from dirt blocks, in which you put several wood planks and single lighter. You melt the ingots in a pot on a tall tower of cobbles. That tower need a hole inside, where you drop charcoal blocks, one on another, which will then burn. You make lighter block on fire with flint-and-iron item. Sounds cool? Oh yeah, it's a lot of fun with that! - -Another basic technology is getting ores from regular cobble with Gravel Sieve. This process produces gravel from cobble, but such gravel can also be passed through a sieve for more ores! You can mine ores in the traditional way too, but there is at least one element that cannot be obtained otherwise than by sieving: usmium nuggets. And you need that item to make further progress. With chests and hoppers you can make sieving somehow automated. I put all of these on the screenshot. On the picture [1] below you can see the Charcoal Burner (surrounded with iron bars), top part of Melting Furnace (as other part is underground), and the Gravel Sieve with chests and hopper attached to the wall of Melting Furnace. - -In this game you can also build a beautiful and animated (!) mill, in which the falling water power grinding the wheat into seeds, and hopper is then sending theese seeds into a regular furnace for bread making [2]. Thanks to the later progress in the game, an electrically powered robot takes care of harvesting my wheat [3]. I hit the button in the game, the robot appears, takes the wheat and sows the seeds, then places the harvested stuff in the mill. In the meantime I am either watching it or doing something else. I have a old-school coal furnace there, but I could put an electric cable over there and out an an industrial electric furnace. Alternatively I can program the same robot to refill coal in coal powered furnace which I already have right now. The player can easily program robots using commands such as "turn right", "turn left", "harvest", "sow_seed", "go forward" or "put what you have into the chest". The player put a command sign in front of the robot, writes a set of commands in the right order on the sign, and then robot can read the entire program and executes it. It is pretty easy! [4] - -Image - -Picture 5 show you next level of automation of sieving process, thanks to the steam engine (top left). The engine is powered by coal and boiling water. When the stored water reaches a high temperature, the steam drives an axle, and the axle drives machines: Grinder, Gravel Sieve and Gravel Rinser. - -Cobble is transported from the chest to Grinder using a device called Pusher that does not need to be powered. Then another Pusher takes the grinded stuff from the Grinder to a Distributor device, which sorts and sends sorted items into one of its outputs. Distributor also not need to be powered. This Distributor pass the gravel to the Gravel Sieve and anything else to the chest. Gravel Sieve produces ores that need to be send to the chest, gravel that need to be send back to the input of Gravel Sieve, and sieved gravel, that need to be send to the Gravel Rinser. - -Gravel Rinser produces sand and ores. It produces sand inside itself, so sand can be picked up by a pusher and then transported with tubes to the chest. But ores are produced outside, ores appear dropped above the Gravel Rinser, and this is why there is a water. The flowing water pushes the dropped ores to the hopper placed one or two blocks away. Hopper take it and put into a chest. - -This is more or less how the process of sieving and obtaining ores looks like. Of course, nothing prevents you from going to the mine with a pickaxe or digtron and obtaining ores in the traditional way. But even if you do so, this process can utilize all of that cobbles that come from pick, digtron or quarry mining, additionally producing the necessary usmium, which otherwise cannot be obtained. - -Later in the game, better versions of some machines, powered by electricity, become available. You will need a power generator driven by a steam turbine, which can be powered by a coal or gasoline firebox. Then you also have to build a network of electric cables that will connect the power source with the machines. Cables don't connect to each other by themselves, but the game provide an additional block that allows you to create a junction for splitting one line into two, three or four. - -Most importantly, electric lines can be placed like any other block in the game, but also can be placed inside other blocks! Thanks to a special tool, TechAge Trowel, you can put a whole line through your base, and then cover the electric cables with decorative bricks that is often use to build floors, walls or ceilings. I think this feature of Tech Age is awesome! - -As I progressed on the server, one electricity generator was no longer enough for me and I needed three coal-fired generators [6] I also experimented with wind and solar generators, all of them together gave me a lot of energy, but it was still not enough. Finally, when I built a thermonuclear plant,two Fusion Reactors [7], I stopped complaining about power drops and the need to turn on only selected processes in a given time. - -Tech Age mod is very computerized. Even too much! The player has the ability to control various devices and processes remotely. The game provides programmable buttons and "computers", with which you can turn something on, off, or check their status. Each machine has its own unique number, so that is how you identify them, when you need to program their external control. I have put in one place buttons that I can use to open or close the entrances to the building, start or stop oil processing, or turn on or off power generators [8]. With the help of control monitors, I can check the level of various substances in tanks, the status of selected machines [9] and even the amount of electricity needed by running machines and generated by generators [10]. There are also items that you can use to program in-game objects using Lua and even something like assembler language. - -In this game you can search for crude oil on a map, then build drilling wells and transport oil in carts or with pipes to refineries. Oil distillation produces bitumen, fuel oil, naphta, gasoline, and propane [11]. You can collect all that stuff in tanks and process it later. You can use bitumen to make an asphalt roads (you can move faster on them), fuel oil to create vulcanized rubber items, naphta to get epoxide resin, gasoline to generate electricity or power cars that drive on asphalt roads, and propane to make isobutane. You can process one petroleum material into another, so you can even all your crude oil turn into a gasoline (or bitumen). Oil distillation need electric power. - -Tech Age provide a chemical reactors, which are an alternative type of crafting workshop. Thanks to these reactors, you can convert the initial objects into other objects. You can change water with usmium powder into lye liquid, and then lye with bauxite powder into gibbsite. Smelted gibbsite turn into an aluminium, which is important material later in the game. You can have one chemical reactor and changing its connection with different tanks, choosing different recipie when needed, or you can build many chemical reactors, with fixed set up to produce one specific thing. I choose that second solution, with fixed production line [12]. Chemical reactors need electric power. - -Image - -In the picture [13, 14, 15] you can see my final version of the process of obtaining ores by sieving. Nothing has changed in the idea of ​​this process, described earlier. Just the whole thing is built with faster and more efficient machines, powered by electricity. And there are 3 lines of sieving. The initial cobbles are split into three loads, each of which goes to a separate line of transporting through the Grinder, Gravel Sieve and Gravel Rinser. The output is sorted to the final chests, and the ores are melted immediately into ingots. 3 parallel production lines ensure faster acquisition of end products. - -At one point in my game, I was running out of electricity and the challenge was to move to the next technological level. When I started the Hardon Collider [16, 17], it needed a lot of energy, but I needed the points it generated to build fusion reactors. I managed this somehow. The fusion reactor needs electricity too, it consumes half of what it produces. But with two of them, I have now even too much electricity! ;-) - -So if you are looking for a quiet game for a long time, where instead of fighting a monster you want to build machines, improve your factories, create accelerators and fusion reactors, plan technical puzzles, this can be for you. You don't have to worry, that you probably you do not know evrything in this game. It is natural that you will face a questions: what next, how to build it, how to achieve it? You will discover it all. By experimenting and asking the right questions, you solve all the challenges! - -And finallyt, I would like to thank the creator of Tech Age and the people who maintain the server. It's great entertainment! diff --git a/techage/manuals/manual_DE.md b/techage/manuals/manual_DE.md deleted file mode 100644 index 929b7de..0000000 --- a/techage/manuals/manual_DE.md +++ /dev/null @@ -1,124 +0,0 @@ -# Tech Age Mod - -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. - -TA2: Dampfzeitalter (Steam Age) -Baue eine Dampfmaschine mit Antriebsachsen und betreibe damit deine ersten Maschinen zur Verarbeitung von Erzen. - -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: Gegenwart (Present) -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) -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] - - - -## Hinweise - -Diese Dokumentation ist sowohl "ingame" (Block Konstruktionsplan) als auch auf GitHub als MD-Files verfügbar. - -- Link: https://github.com/joe7575/techage/wiki - -Die Konstruktionspläne (Diagramme) für den Aufbau der Maschinen sowie die Bilder sind aber nur ingame verfügbar. - -Bei Tech Age musst du von vorne beginnen. Nur mit den Items aus TA1 kannst du TA2 Blöcke herstellen, für TA3 benötigst du die Ergebnisse aus TA2, usw. - -In TA2 laufen die Maschinen nur mit Antriebsachsen. - -Ab TA3 laufen die Maschinen mit Strom und besitzen eine Kommunikationsschnittstelle zur Fernsteuerung. - -Mit TA4 kommen weitere Stromquellen dazu, aber auch höhere logistische Herausforderungen (Stromtrassen, Item Transport). - - - -## Änderungen ab Version 1.0 - -Ab V1.0 (17.07.2021) hat sich folgendes geändert: - -- Der Algorithmus zur Berechnung der Stromverteilung hat sich geändert. Energiespeichersystem werden dadurch wichtiger. Diese gleichen Schankungen aus, was bei größeren Netzen mit mehreren Generatoren wichtig wird. -- Aus diesem Grund hat TA2 seinen eigenen Energiespeicher erhalten. -- Die Akkublöcke aus TA3 dienen auch als Energiespeicher. Ihre Funktionsweise wurde entsprechend angepasst. -- Das TA4 Speichersystem wurde überarbeitet. Die Wärmetauscher (heatexchanger) haben eine neue Nummer bekommen, da die Funktionalität vom unteren in den mittleren Block verschoben wurde. Sofern diese ferngesteuert wurden, muss die Knotennummer angepasst werden. Die Generatoren haben kein eigenes Menü mehr, sondern werden nur noch über den Wärmetauscher ein-/ausgeschaltet. Wärmetauscher und Generator müssen jetzt am gleichen Netz hängen! -- Mehrere Stromnetze können jetzt über einen TA4 Transformator Blöcke gekoppelt werden. -- Neu ist auch ein TA4 Stromzähler Block für Unternetze. - -### Tipps zur Umstellung - -Viele weitere Blöcke haben kleinere Änderungen bekommen. Daher kann es sein, dass Maschinen oder Anlagen nach der Umstellung nicht gleich wieder anlaufen. Sollte es zu Störungen kommen, helfen folgende Tipps: - -- Maschinen aus- und wieder eingeschalten -- ein Stromkabel-Block entfernen und wieder setzen -- den Block ganz entfernen und wieder setzen -- mindestens ein Akkublock oder Speichersystem in jedes Netzwerk - - - -## Erze und Mineralien - -Techage fügt dem Spiel einige neue Items hinzu: - -- Meridium - eine Legierung zur Herstellung von leuchtenden Werkzeugen in TA1 -- Usmium - ein Erz, was in TA2 gefördert und für TA3 benötigt wird -- Baborium - ein Metall, welches für Rezepte in TA3 benötigt wird -- Erdöl - wird in TA3 benötigt -- Bauxit - ein Aluminiumerz, was in TA4 zur Herstellung von Aluminium benötigt wird -- Basalt - entsteht, wenn sich Wasser und Lave berühren - - -### Meridium - -Meridium ist eine Legierung aus Stahl und Mesekristallen. Meridium Ingots können mit dem Kohlebrenner aus Stahl und Mesesplitter hergestellt werden. Meridium leuchtet im Dunkeln. Auch Werkzeuge aus Meridium leuchten und sind daher im Untertagebau sehr hilfreich. - -[meridium|image] - - -### Usmium - -Usmium kommt nur als Nuggets vor und kann nur beim Waschen von Kies mit der TA2/TA3 Kieswaschanlage gewonnen werden. - -[usmium|image] - - -### Baborium - -Barborium kann nur im Untertagebau gewonnen werden. Diesen Stoff findet man nur in einer Tiefe von -250 bis -340 Metern. -Baborium kann nur im TA3 Industrieofen geschmolzen werden. - -[baborium|image] - - -### Erdöl - -Erdöl kann nur mit Hilfe des Explorers gefunden und mit Hilfe entsprechender TA3 Maschinen gefördert werden. Siehe TA3. - -[oil|image] - - -### Bauxit - -Bauxit wird nur im Untertagebau gewonnen. Bauxit findet man nur in Stein in einer Höhe zwischen -50 und -500 Meter. -Es wird zur Herstellung von Aluminium benötigt, was vor allem in TA4 Verwendung findet. - -[bauxite|image] - - -### Basalt - -Basalt entsteht nur, wenn Lava und Wasser zusammen kommen. -Dazu sollte man am besten eine Anlage aufbauen, bei der eine Lava- und eine Wasserquelle zusammenfließen. -Dort wo sich beide Flüssigkeiten treffen, entsteht Basalt. -Einen automatisierten Basalt Generator kann man mit dem Sign Bot aufbauen. - -[basalt|image] - diff --git a/techage/manuals/manual_EN.md b/techage/manuals/manual_EN.md deleted file mode 100644 index ae79e23..0000000 --- a/techage/manuals/manual_EN.md +++ /dev/null @@ -1,138 +0,0 @@ -# Tech Age Mod - -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. - -TA2: Steam Age -Build a steam engine with drive axles and use it to operate your first ore processing machines. - -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: Present -Renewable energy sources such as wind, sun and bio-fuels help you to leave the oil age. With modern technologies and intelligent machines you set out into the future. - -TA5: Future -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 sub-chapters of this manual. - -[techage_ta4|image] - - - -## Hints - -This documentation is available both "ingame" (block construction plan) and on GitHub as MD files. - -- Link: https://github.com/joe7575/techage/wiki - -The construction plans (diagrams) for the construction of the machines and the pictures are only available in-game. - -With Tech Age you have to start over. You can only create TA2 blocks with the items from TA1, for TA3 you need the results from TA2, etc. - -In TA2, the machines only run with drive axes. - -From TA3, the machines run on electricity and have a communication interface for remote control. - -TA4 adds more power sources, but also higher logistical challenges (power lines, item transport). - - - -## Changes from version 1.0 - -From V1.0 (07/17/2021) the following has changed: - -- The algorithm for calculating the power distribution has changed. This makes energy storage systems more important. These compensate for fluctuations, which is important in larger networks with several generators. -- For this reason TA2 got its own energy storage. -- The battery blocks from TA3 also serve as energy storage. Their functionality has been adapted accordingly. -- The TA4 storage system has been revised. The heat heat exchanger have been given a new number because the functionality has been moved from the lower to the middle block. If these were remotely controlled, the node number must be adapted. The generators no longer have their own menu, but are only switched on / off via the heat exchanger. The heat exchanger and generator must now be connected to the same network! -- Several power grids can now be coupled via a TA4 transformer blocks. -- A TA4 electricity meter block for sub-networks is also new. -- At least one battery block or a storage system in each network - - -### Tips on switching - -Many more blocks have received minor changes. It is therefore possible that machines or systems do not start up again immediately after the changeover. In the event of malfunctions, the following tips will help: - -- Switch machines off and on again -- remove a power cable block and put it back in place -- remove the block completely and put it back in place - - - -## Ores and Minerals - -Techage adds some new items to the game: - -- Meridium - an alloy for the production of luminous tools in TA1 -- Usmium - an ore that is mined in TA2 and needed for TA3 -- Baborium - a metal that is needed for recipes in TA3 -- Petroleum - is needed in TA3 -- Bauxite - an aluminum ore that is needed in TA4 to produce aluminum -- Basalt - arises when water and lave touch - - -### Meridium - -Meridium is an alloy of steel and mesecons crystals. Meridium ingots can be made with the coal burner from steel and mesecons crystals. Meridium glows in the dark. Tools made of Meridium also light up and are therefore very helpful in underground mining. - -[meridium|image] - - -### Usmium - -Usmium only occurs as nuggets and can only be obtained by washing gravel with the TA2/TA3 gravel washing system. - -[usmium|image] - - -### Baborium - -Barborium can only be obtained from underground mining. This substance can only be found at a depth of -250 to -340 meters. - -Baborium can only be melted in the TA3 Industrial Furnace. - - -[baborium|image] - - -### Petroleum - -Petroleum can only be found with the help of the Explorer and extracted with the help of appropriate TA3 machines. See TA3. - -[oil|image] - - -### Bauxite - -Bauxite is only extracted in underground mining. Bauxite is only found in stone at a height between -50 and -500 meters. -It is required for the production of aluminum, which is mainly used in TA4. - -[bauxite|image] - - -### Basalt - -Basalt is only created when lava and water come together. -The best thing to do is to set up a system where a lava and a water source flow together. -Basalt is formed where both liquids meet. -You can build an automated basalt generator with the Sign Bot. - -[basalt|image] - - -## History - -- 28.09.2019: Solar system added -- 05.10.2019: Data on the solar system and description of the inverter and the power terminal changed -- 18.11.2019: Chapter for ores, reactor, aluminum, silo, bauxite, furnace heating, gravel washing system added -- 22.02.2020: corrections and chapters on the update -- 29.02.2020: ICTA controller added and further corrections -- 14.03.2020 Lua controller added and further corrections -- 22.03.2020 More TA4 blocks added - diff --git a/techage/manuals/manual_RU.md b/techage/manuals/manual_RU.md deleted file mode 100644 index 40416a2..0000000 --- a/techage/manuals/manual_RU.md +++ /dev/null @@ -1,137 +0,0 @@ -# Tech Age Mod - -Tech Age - это технологический мод с 5 стадиями развития: - -TA1: Железный век -Используйте инструменты и приспособления, такие как угольные горелки, угольные горелки, гравийные сита, молоты и бункеры, чтобы добывать и обрабатывать необходимые руды и металлы. - -TA2: Паровой век -Постройте паровой двигатель с ведущими осями и используйте его для работы своих первых машин по переработке руды. - -TA3: Нефтяной век -Найдите и добывайте нефть, постройте железные дороги для транспортировки нефти. Электростанция дает необходимое электричество для ваших машин. Электрический свет освещает ваши промышленные предприятия. - -TA4: Настоящее время -Возобновляемые источники энергии, такие как ветер, солнце и биотопливо, помогают вам покинуть нефтяной век. С помощью современных технологий и умных машин вы отправляетесь в будущее. - -TA5: Будущее -Машины, преодолевающие пространство и время, новые источники энергии и другие достижения определяют вашу жизнь. - - -Примечание: Нажав на знак "плюс", вы попадаете в подразделы этого руководства. - -[techage_ta4|image] - - - -## Подсказки - -Эта документация доступна как "в игре" (план строительства блоков), так и на GitHub в виде MD-файлов. - -- Ссылка: https://github.com/joe7575/techage/wiki - -Строительные планы (схемы) для постройки машин и картинки доступны только в игре. - -В Tech Age вам придется начинать все сначала. Вы можете создавать блоки TA2 только с помощью предметов из TA1, для TA3 вам нужны результаты из TA2 и т.д. - -В TA2 машины работают только с приводными осями. - -В TA3 машины работают от электричества и имеют коммуникационный интерфейс для дистанционного управления. - -TA4 добавляет больше источников энергии, но также и более сложные логистические задачи (линии электропередач, транспортировка изделий). - - - -## Изменения по сравнению с версией 1.0 - -С версии 1.0 (07/17/2021) изменилось следующее: - -- Изменился алгоритм расчета распределения энергии. Это делает системы хранения энергии более важными. Они компенсируют колебания, что важно для больших сетей с несколькими генераторами. -- По этой причине TA2 обзавелась собственным накопителем энергии. -- Аккумуляторные блоки из TA3 также служат в качестве накопителей энергии. Их функциональность была соответствующим образом адаптирована. -- Система хранения TA4 была пересмотрена. Теплообменник получил новый номер, поскольку его функциональность была перенесена с нижнего на средний блок. Если они управлялись дистанционно, номер узла должен быть адаптирован. Генераторы больше не имеют собственного меню, а включаются/выключаются только через теплообменник. Теплообменник и генератор теперь должны быть подключены к одной сети! -- Несколько электросетей теперь могут быть соединены через трансформаторные блоки TA4. -- Также появился блок счетчиков электроэнергии TA4 для подсетей. -- Как минимум один блок аккумуляторов или система хранения в каждой сети - - -### Советы по переключению - -Многие другие блоки получили незначительные изменения. Поэтому возможно, что машины или системы не будут запускаться сразу после переключения. В случае неполадок помогут следующие советы: - -- выключите и снова включите машины -- снимите блок силовых кабелей и установите его на место -- полностью снимите блок и установите его на место - - - -## Руды и минералы - -Techage добавляет в игру несколько новых предметов: - -- Меридий - сплав для производства светящихся инструментов в TA1 -- Усмий - руда, которая добывается в TA2 и необходима для TA3 -- Бабориум - металл, необходимый для рецептов в TA3 -- Нефть - необходима в TA3 -- Боксит - алюминиевая руда, которая необходима в TA4 для производства алюминия -- Базальт - возникает при соприкосновении воды и лав - - -### Меридий - -Меридий - это сплав стали и кристаллов мезекона. Слитки меридиума можно изготовить с помощью угольной горелки из стали и кристаллов мезекона. Меридий светится в темноте. Инструменты из меридиума также светятся и поэтому очень полезны при подземной добыче. - -[meridium|image] - - -### Усмий - -Усмий встречается только в виде самородков и может быть получен только при промывке гравия с помощью системы промывки гравия TA2/TA3. - -[usmium|image] - - -### Баборий - -Барборий можно получить только при подземной добыче. Это вещество можно найти только на глубине от -250 до -340 метров. - -Бабориум можно переплавить только в промышленной печи TA3. - - -[baborium|image] - - -### Нефть - -Нефть можно найти только с помощью Исследователя и добыть с помощью соответствующих машин TA3. См. TA3. - -[oil|image] - - -### Боксит - -Боксит можно добыть только в подземной шахте. Боксит можно найти только в камне на высоте от -50 до -500 метров. -Он необходим для производства алюминия, который в основном используется в TA4. - -[bauxite|image] - - -### Базальт - -Базальт образуется только при соединении лавы и воды. -Лучше всего создать систему, в которой лава и вода будут течь вместе. -Базальт образуется там, где встречаются обе жидкости. -Вы можете создать автоматический генератор базальта с помощью Sign Bot. - -[basalt|image] - - -## History - -- 28.09.2019: Solar system added -- 05.10.2019: Data on the solar system and description of the inverter and the power terminal changed -- 18.11.2019: Chapter for ores, reactor, aluminum, silo, bauxite, furnace heating, gravel washing system added -- 22.02.2020: corrections and chapters on the update -- 29.02.2020: ICTA controller added and further corrections -- 14.03.2020 Lua controller added and further corrections -- 22.03.2020 More TA4 blocks added \ No newline at end of file diff --git a/techage/manuals/manual_pt-BR.md b/techage/manuals/manual_pt-BR.md deleted file mode 100644 index 6cabb8a..0000000 --- a/techage/manuals/manual_pt-BR.md +++ /dev/null @@ -1,110 +0,0 @@ -# Mod Tech Age -O Tech Age é um mod de tecnologia com 5 estágios de desenvolvimento: - -## TA1: Idade do Ferro -Utilize ferramentas e instrumentos auxiliares como queimadores de carvão, peneiras de cascalho, martelos e funis para extrair e processar minérios e metais necessários. - -## TA2: Idade do Vapor -Construa uma máquina a vapor com eixos de transmissão e use-a para operar suas primeiras máquinas de processamento de minérios. - -## TA3: Idade do Petróleo -Encontre e extraia óleo, construa ferrovias para transporte de óleo. Uma usina fornece a eletricidade necessária para suas máquinas. A luz elétrica ilumina suas instalações industriais. - -## TA4: Tempos atuais (Presente) -Fontes de energia renovável, como vento, sol e biocombustíveis, ajudam você a sair da era do petróleo. Com tecnologias modernas e máquinas inteligentes, você parte para o futuro. - -## TA5: Futuro -Máquinas para superar espaço e tempo, novas fontes de energia e outras conquistas moldam sua vida. - -Nota: Clicando no sinal de adição, você acessa os subcapítulos deste manual. - -[techage_ta4|image] - -# Dicas -Esta documentação está disponível tanto "dentro do jogo" (plano de construção de blocos) quanto no GitHub como arquivos MD. - -* Link: https://github.com/joe7575/techage/wiki -Os planos de construção (diagramas) para a construção das máquinas e as imagens estão disponíveis apenas no jogo. - -Com o Tech Age, você precisa começar do zero. Você só pode criar blocos TA2 com os itens do TA1, para o TA3 você precisa dos resultados do TA2, e assim por diante. - -No TA2, as máquinas só funcionam com eixos de transmissão. - -A partir do TA3, as máquinas funcionam com eletricidade e têm uma interface de comunicação para controle remoto. - -O TA4 adiciona mais fontes de energia, mas também desafios logísticos mais altos (linhas de energia, transporte de itens). - -# Mudanças a partir da versão 1.0 -A partir da V1.0 (17/07/2021), as seguintes alterações foram feitas: - -* O algoritmo para calcular a distribuição de energia foi alterado. Isso torna os sistemas de armazenamento de energia mais importantes. Eles compensam as flutuações, o que é importante em redes maiores com vários geradores. -* Por esse motivo, o TA2 recebeu seu próprio sistema de armazenamento de energia. -* Os blocos de bateria do TA3 também servem como armazenamento de energia. Sua funcionalidade foi adaptada de acordo. -* O sistema de armazenamento do TA4 foi revisado. O permutador de calor recebeu um novo número porque a funcionalidade foi movida do bloco inferior para o bloco central. Se eles estiverem sendo controlados remotamente, o número do nó deve ser adaptado. Os geradores não têm mais um menu próprio, mas são ligados/desligados apenas através do permutador de calor. O permutador de calor e o gerador agora devem estar conectados à mesma rede! -* Vários sistemas de energia podem agora ser acoplados via blocos transformadores TA4. -* Um novo bloco medidor de eletricidade TA4 para sub-redes também foi adicionado. -* Pelo menos um bloco de bateria ou um sistema de armazenamento em cada rede. - -## Dicas sobre a troca -Muitos outros blocos receberam alterações menores. Portanto, é possível que máquinas ou sistemas não reiniciem imediatamente após a troca. Em caso de falhas, as seguintes dicas ajudarão: - -* Desligue e ligue as máquinas novamente. -* Remova um bloco de cabo de energia e coloque-o de volta no lugar. -* Remova completamente o bloco e coloque-o de volta no lugar. - -# Minérios e Minerais -Techage adiciona novos itens ao jogo: - -* Meridium - uma liga para a produção de ferramentas luminosas no TA1 -* Usmium - um minério que é extraído no TA2 e necessário para o TA3 -* Baborium - um metal necessário para receitas no TA3 -* Petróleo - necessário no TA3 -* Bauxita - um minério de alumínio necessário no TA4 para produzir alumínio -* Basalto - surge quando água e lava se encontram - -## Meridium -O Meridium é uma liga de aço e cristais de mesecons. Lingotes de Meridium podem ser feitos com a caldeira a carvão a partir de aço e cristais de mesecons. O Meridium brilha no escuro. Ferramentas feitas de Meridium também emitem luz e são, portanto, muito úteis na mineração subterrânea. - -[meridium|image] - -## Usmium -O Usmium ocorre apenas como pepitas e só pode ser obtido lavando cascalho com o sistema de lavagem de cascalho TA2/TA3. - -[usmium|image] - -## Baborium -O Baborium só pode ser obtido através da mineração subterrânea. Essa substância só pode ser encontrada a uma profundidade de -250 a -340 metros. - -O Baborium só pode ser derretido na Fornalha Industrial TA3. - -[baborium|image] - -## Petróleo -O Petróleo só pode ser encontrado com a ajuda do Explorer e extraído com a ajuda de máquinas apropriadas do TA3. Veja TA3. - -[oil|image] - -## Bauxita -A Bauxita é extraída apenas na mineração subterrânea. A Bauxita só é encontrada na pedra a uma altura entre -50 e -500 metros. -É necessária para a produção de alumínio, que é principalmente usada no TA4. - -[bauxite|image] - -## Basalto -O Basalto só é criado quando lava e água se encontram. -A melhor coisa a fazer é montar um sistema onde uma fonte de lava e uma fonte de água se encontram. -O Basalto é formado onde ambos os líquidos se encontram. -Você pode construir um gerador automático de basalto com o Sign Bot. - -[basalt|image] - - -## History - -- 28.09.2019: Solar system added -- 05.10.2019: Data on the solar system and description of the inverter and the power terminal changed -- 18.11.2019: Chapter for ores, reactor, aluminum, silo, bauxite, furnace heating, gravel washing system added -- 22.02.2020: corrections and chapters on the update -- 29.02.2020: ICTA controller added and further corrections -- 14.03.2020 Lua controller added and further corrections -- 22.03.2020 More TA4 blocks added diff --git a/techage/manuals/manual_ta1_DE.md b/techage/manuals/manual_ta1_DE.md deleted file mode 100644 index b4b3fb4..0000000 --- a/techage/manuals/manual_ta1_DE.md +++ /dev/null @@ -1,159 +0,0 @@ -# TA1: Eisenzeitalter - -In TA1 geht es darum, mit einfachen Werkzeugen und Gerätschaften ausreichend Erze zu schürfen und Holzkohle herzustellen, so dass damit TA2 Maschinen hergestellt und betrieben werden können. - -Natürlich muss es für ein Eisenzeitalter auch Eisen geben und nicht nur Stahl (steel), wie in "Minetest Game". Daher wurden einige Rezepte geändert, so dass zuerst Eisen hergestellt werden muss und erst später dann Stahl. - -Auch ist die Haltbarkeit der Werkzeuge an die Zeitalter angelehnt und entspricht damit nicht dem Minetest Originalspiel. -Die Haltbarkeit/Härte bspw. für eine Axt ist: - -* Bronze: 20 -* Stahl: 30 - -[techage_ta1|image] - - -## Köhler / Coal Pile - -Den Köhler brauchst du, um Holzkohle herzustellen. Holzkohle wird für den Brenner, aber auch bspw. in TA2 für die Dampfmaschine benötigt. - -Für den Köhler brauchst du: - -- einen Anzünderblock (`techage:lighter`) -- 26 Hölzblöcke (wood), die zu einem Würfen aufgeschichtet werden. Die Holzsorte spielt keine Rolle. -- Erde (dirt) um den Holzhaufen abzudecken. -- Feuerstein und Eisen (technischer Name: `fire:flint_and_steel`) um den Anzünderblock anzuzünden. - - - -Bauanleitung (siehe auch Plan): - -- Baue eine 5x5 große Fläche aus Erde (dirt) -- Platziere in die Mitte einen Anzünder (lighter) -- Platziere rund um den Anzünder 7 Holz (wood), aber lasse ein Loch zum Anzünder frei -- Baue weitere 2 Schichten Holz darüber, so dass ein 3x3x3 großer Holzwürfel entsteht -- Überdecke alles mit einer Schicht Erde zu einem 5x5x5 großen Würfel, aber lasse das Loch zum Anzünder frei -- Entzünde den Anzünder und verschließe das Loch sofort mit jeweils einem Block Holz und Erde -- Wenn du alles richtig gemacht hast, fängt der Köhler nach wenigen Sekunden an zu rauchen -- Öffne den Köhler erst, wenn der Rauch verschwunden ist (ca. 20 min) - -Dann kannst du die 9 Holzkohleblöcke entnehmen und den Köhler erneut füllen. - -[coalpile|plan] - - -## Kohlebrenner / Coal Burner - -Den Kohlebrenner benötigst du bspw. um Eisen und andere Erze im Schmelztiegel zu schmelzen. Es gibt verschiedene Rezepte, welche verschiedene Temperaturen benötigen. Je höher der Turm, um so heißer ist die Flamme. Eine Höhe von 11 Blöcken über der Bodenplatte ist für alle Rezepte ausreichend, ein Brenner mit dieser Höhe verbraucht aber auch mehr Holzkohle. - -Bauanleitung (siehe auch Plan): - -* Baue einen Turm aus Stein (cobble) mit einer 3x3 Grundfläche (7-11 Blöcke hoch) -* Lasse unten ein Loch an einer Seite offen -* Lege einen Anzünder (lighter) hinein -* Fülle den Turm bis zum Rand mit Holzkohle, in dem du die Holzkohle von oben in das Loch fallen lässt -* Entzünde den Anzünder durch das Loch -* Platziere den Schmelztiegel oben auf dem Turm direkt in die Flamme, einen Block über dem Turmrand -* Um den Brenner anzuhalten, schließe das Loch vorübergehend bspw. mit einem Erdblock. - -Der Schmelztiegel hat ein eigenes Menü mit Rezepten und ein Inventar, wo du die Erze hinein legst. - -[coalburner|plan] - - - -## Wassermühle - -Mit der Wassermühle können Weizen und andere Getreide zu Mehl gemahlen und dann im Ofen zu Brot gebacken werden. Die Mühle wird mit -Wasserkraft angetrieben. Dazu muss ein Mühlbach über einen Kanal zum Mühlrad geführt werden. -Über eine Schleuse kann der Wasserfluss und damit das Mühlrad gesteuert werden. -Die Schleuse besteht aus Schleusenschieber und Schleusengriff. - -Die Abbildung rechts (auf "Plan" klicken) zeigt den Aufbau der Wassermühle. - -[watermill1|plan] - -### TA1 Mühle - -Mit der Wassermühle können Weizen und andere Getreide zu Mehl gemahlen und dann im Ofen zu Brot gebacken werden. -Die Mühle muss mit einer TA1 Achse mit dem Mühlrad verbunden werden. Die Kraft des Mühlrades reicht nur für eine Mühle. - -Die Mühle kann mit Hilfe eines Minecart Hoppers automatisiert werden, so dass das Mehl bspw. direkt von der Mühle in einen Ofen befördert wird, um daraus Brot zu backen. - -[watermill2|plan] - -### TA1 Schleusenschieber / TA1 Sluice Gate - -Der Schleusenschieber muss auf gleicher Höhe wie die Wasseroberfläche direkt an einen Teich oder in einen Bach gesetzt werden. -Wird die Schleuse geöffnet, so fließt Wasser durch den Schieber. Dieses Wasser muss dann zum Mühlrad geleitet werden und treibt dort die Mühle an. - -[ta1_sluice|image] - -### TA1 Schleusengriff / TA1 Sluice Handle - -Der TA1 Schleusengriff muss auf den Schleusenschieber gesetzt werden. Mit Hilfe des Schleusengriffs (Rechtsklick) kann der Schieber geöffnet werden. - -[ta1_sluice_handle|image] - -### TA1 Apfelholzbrett / TA1 Apple Wood Board - -Block in verschiedenen Holzsorten zum Bauen des Mühlbachkanals. Es kann aber auch jedes andere Material verwendet werden. - -[ta1_board1|image] - -### TA1 Apfel Mühlbachbrett / TA1 Apple Millrace Board - -Block in verschiedenen Holzsorten zum Bauen des Mühlbachkanals. Dieser Block eignet sich speziell in Verbindung mit den Pfosten des Holzzauns um eine Stütze für den Kanal zu bauen. - -[ta1_board2|image] - - - -## Erze und Werkzeuge - -TA1 hat seine eigenen Werkzeuge wie Hammer und Kiessieb, aber auch der Minecart Hopper kann genutzt werden. - -[ta1_gravelsieve|image] - - -### Hammer - -Mit dem TA1 Hammer können Steine (stone) und Kopfsteinpflaster-Steine (cobble) zu Kies (gravel) zertrümmert werden. Der Hammer ist in verschiedenen Ausführungen und damit verschiedenen Eigenschaften verfügbar: Bronze, Stahl, Mese und Diamant. - -[hammer|image] - - -### Kiessieb / Gravel Sieve - -Mit dem Kiessieb können Erze aus dem Kies gesiebt werden. Dazu mit dem Kies (gravel) auf das Sieb klicken. Der gesiebte Kies und die Erze fallen unten heraus. - -Um hier nicht stundenlang am Sieb zu stehen, kann das Sieben mit dem Trichter (hopper) automatisiert werden. - -[ta1_gravelsieve|image] - - -### Trichter / Hopper - -Der Hopper aus der Mod "Minecart" dient in erster Linie zum Be- und Entladen von Minecarts. Er saugt Gegenstände (items) von oben ein und gibt diese nach rechts weiter. Beim Platzieren des Trichters muss daher auf die Ausgaberichtung geachtet werden. - -Der Trichter kann aber auch Items aus Kisten (chest) ziehen, sofern die Kiste neben oder auf dem Trichter steht. - -Der Trichter kann auch Items in Kisten legen, sofern die Kiste neben dem Trichter steht. - -[ta1_hopper|image] - - -### Kies sieben mit dem Trichter - -Mit Hilfe von zwei Kisten, zwei Trichtern und einem Kiessieb kann der Siebevorgang automatisiert werden. Der Plan rechts zeigt den Aufbau. - -Bei den Kisten darauf achten, dass es die "chest_locked" ist, sonst klaut dir jemand die wertvollen Erze aus der Kiste unten. - -[hoppersieve|plan] - - -### Meridium - -TA1 hat seine eigene Metalllegierung Meridium. Meridium Ingots können mit dem Kohlebrenner aus Stahl und Mesesplittern hergestellt werden. Meridium leuchtet im Dunkeln. Auch Werkzeuge aus Meridium leuchten und sind daher im Untertagebau sehr hilfreich. - -[meridium|image] \ No newline at end of file diff --git a/techage/manuals/manual_ta1_EN.md b/techage/manuals/manual_ta1_EN.md deleted file mode 100644 index 4646760..0000000 --- a/techage/manuals/manual_ta1_EN.md +++ /dev/null @@ -1,158 +0,0 @@ -# TA1: Iron Age - -TA1 is about mining sufficient ores and producing charcoal with simple tools and equipment, so that TA2 machines can be manufactured and operated. - -Of course, for an iron age there must also be iron and not just steel, as in "Minetest Game". As a result, some recipes have been changed so that iron has to be produced first and then steel later. - -The durability of the tools is based on the ages and therefore does not correspond to the original Minetest game. -The durability / hardness for an axe, for example: - -* Bronze: 20 -* Steel: 30 - -[techage_ta1|image] - - -## Charcoal Pile (charcoal burner) - -You need the Charcoal Pile to make charcoal. Charcoal is required for the melting furnace, but also, for example, in TA2 for the steam engine. - -For the charcoal burner you need: - -- a lighter block (`techage:lighter`) -- 26 wooden blocks that are stacked into a pile of wood. The type of wood is irrelevant -- Dirt to cover the pile of wood -- Flint and Iron (technical name: `fire:flint_and_steel`) to light the lighter block - - - -Building instructions (see also plan): - -- Build a 5x5 area of dirt -- Place 7 wood around the lighter but leave a hole to the lighter -- Build another 2 layers of wood on top, making a 3x3x3 wooden cube -- Cover everything with a layer of dirt into a 5x5x5 cube, but keep the hole to the lighter open -- Light the lighter and immediately close the hole with a block of wood and dirt -- If you have done everything correctly, the coal burner will start smoking after a few seconds -- Only open the charcoal burner when the smoke has disappeared (approx. 20 min) - -Then you can remove the 9 charcoal blocks and refill the Charcoal Pile. - -[coalpile|plan] - - -## Melting Furnace - -You need the melting furnace, for example, to melt iron and other ores in the melting pot. There are different recipes that require different temperatures. The higher the melting tower, the hotter the flame. A height of 11 blocks above the base plate is for all recipes, but a burner with this height also requires more charcoal. - -Building instructions (see also plan): - -* Build a stone tower (cobble) with a 3x3 base (7-11 blocks high) -* Leave a hole open on one side at the bottom -* Put a lighter in it -* Fill the tower to the brim with charcoal by dropping the charcoal into the hole from above -* Light the lighter through the hole -* Place the melting pot on top of the tower directly into the flame, one block above the tower edge -* To stop the burner, temporarily close the hole with an dirt block, for example. - -The melting pot has its own menu of recipes and an inventory where you have to put the ores in. - -[coalburner|plan] - - - -## Watermill - -The watermill can be used to grind wheat and other grains into flour and then bake them in the furnace to make bread. -The mill is powered by water power. To do this, a millrace must be led to the mill wheel via a canal. -The water flow and thus the mill wheel can be controlled via a sluice. The sluice consists of the sluice lock and sluice handle. - -The picture on the right (click on "Plan") shows the structure of the watermill. - -[watermill1|plan] - - -### TA1 mill - -The watermill can be used to grind wheat and other grains into flour and then bake them in the oven to make bread. The mill must be connected to the mill wheel with a TA1 axle. The power of the mill wheel is only enough for one mill. - -The mill can be automated with the help of a Minecart Hopper, so that the flour, for example, is transported directly from the mill into an furnace in order to bake bread from it. - -[watermill2|plan] - -### TA1 sluice gate - -The sluice gate valve must be placed directly next to a pond or in a stream at the same height as the water surface. -When the gate is opened, water flows through the slide. This water then has to be fed to the mill wheel, where it drives the mill. - -[ta1_sluice|image] - -### TA1 sluice handle - -The TA1 sluice handle must be placed on the sluice gate. The gate can be opened with the aid of the sluice handle (right click). - -[ta1_sluice_handle|image] - -### TA1 Apple Wood Board - -Block in different types of wood for building the millrace canal. However, any other material can also be used. - -[ta1_board1|image] - -### TA1 Apple Millrace Board - -Block in different types of wood for building the millrace canal. This block is especially suitable in connection -with posts of the wooden fence to build a support of the canal. - -[ta1_board2|image] - - - -## Ores and Tools - -TA1 has its own tools such as hammer and gravel sieve, but the Minecart Hopper can also be used. - -[ta1_gravelsieve|image] - - -### Hammer - -The TA1 hammer can be used to knock/dig stone in a mine, but also to smash cobble to gravel. The hammer is available in different versions and therefore different properties: bronze, steel, brass and diamond. - -[hammer|image] - - -### Gravel Sieve - -Ores can be sifted from the gravel with the gravel sieve. To do this, click on the sieve with the gravel. The sifted gravel and ores fall out below. - -In order not to stand at the sieve for hours, sieving can be automated with the hopper. - -[ta1_gravelsieve|image] - - -### Hopper - -The hopper from the "Minecart" mod is primarily used for loading and unloading Minecarts. He sucks in items from above and passes them on to the right. Therefore, when placing the hopper, pay attention to the direction of dispensing. - -The hopper can also pull items from boxes (chest), provided the box is next to or on the hopper. - -The hopper can also put items in boxes if the box is next to the hopper. - -[ta1_hopper|image] - - -### Gravel seven with the hopper - -With the help of two boxes, two hoppers and a gravel sieve, the sieving process can be automated. The plan on the right shows the structure. - -Make sure that the boxes are "chest_locked", otherwise someone will steal the valuable ores from the box below. - -[hoppersieve|plan] - - -### Meridium - -TA1 has its own metal alloy meridium. Meridium ingots can be made with the coal burner from steel and mesecons crystals. Meridium glows in the dark. Tools made of Meridium also light up and are therefore very helpful in underground mining. - -[meridium|image] diff --git a/techage/manuals/manual_ta1_pt-BR.md b/techage/manuals/manual_ta1_pt-BR.md deleted file mode 100644 index 4fa4a73..0000000 --- a/techage/manuals/manual_ta1_pt-BR.md +++ /dev/null @@ -1,119 +0,0 @@ -# TA1: Idade do Ferro -TA1 trata da extração de minérios suficientes e da produção de carvão com ferramentas e equipamentos simples, para que as máquinas TA2 possam ser fabricadas e operadas. - -É claro que, para uma Idade do Ferro, deve haver ferro e não apenas aço, como em "Minetest Game". Como resultado, algumas receitas foram alteradas para que o ferro precise ser produzido primeiro e, posteriormente, o aço. - -A durabilidade das ferramentas é baseada nas eras e, portanto, não corresponde ao jogo original do Minetest. -A durabilidade/dureza de um machado, por exemplo: - -* Bronze: 20 -* Aço: 30 - -[techage_ta1|image] - -## Pilha de Carvão (queimador de carvão) -Você precisa da Pilha de Carvão para fazer carvão. O carvão é necessário para a fundição, mas também, por exemplo, em TA2 para a máquina a vapor. - -Para o queimador de carvão, você precisa de: - -* Um bloco de acendedor (`techage:lighter`) -* 26 blocos de madeira empilhados para formar um monte de madeira. O tipo de madeira é irrelevante. -* Terra para cobrir o monte de madeira -* Pedra lascada e Ferro (nome técnico: `fire:flint_and_steel`) para acender o bloco de acendedor - -Instruções de construção (veja também o plano): - -* Construa uma área de 5x5 de terra -* Coloque 7 blocos de madeira ao redor do acendedor, mas deixe um buraco para o acendedor -* Construa mais 2 camadas de madeira em cima, formando um cubo de madeira 3x3x3 -* Cubra tudo com uma camada de terra formando um cubo de 5x5x5, mas mantenha o buraco para o acendedor aberto -* Acenda utilizando o isqueiro e feche imediatamente o buraco com um bloco de madeira e terra -* Se você fez tudo corretamente, o queimador de carvão começará a soltar fumaça após alguns segundos -* Só abra o queimador de carvão quando a fumaça tiver desaparecido (aproximadamente 20 minutos) -* Então você pode remover os 9 blocos de carvão e reabastecer a Pilha de Carvão. - -[coalpile|plan] - -## Forno de Fundição -Você precisa do forno de fundição, por exemplo, para fundir ferro e outros minérios no Vaso de fundição(cadinho). Existem receitas diferentes que requerem diferentes temperaturas. Quanto mais alto a torre de fusão, mais quente é a chama. Uma altura de 11 blocos acima da placa base é para todas as receitas, mas um queimador com essa altura também requer mais carvão. - -Instruções de construção (veja também o plano): - -* Construa uma torre de pedregulho (cobble) com uma base de 3x3 (7-11 blocos de altura) -* Deixe um buraco aberto de um lado na parte inferior -* Coloque um acendedor nele -* Encha a torre até a borda com carvão despejando o carvão no buraco de cima para baixo -* Acenda o acendedor através do buraco -* Coloque o Vaso de fundição(cadinho) no topo da torre diretamente na chama, um bloco acima da borda da torre -* Para parar o queimador, feche temporariamente o buraco com um bloco de terra, por exemplo. -* O Vaso de fundição(cadinho) tem seu próprio menu de receitas e um inventário onde você precisa colocar os minérios. - -[coalburner|plan] - -## Moinho d'Água -O moinho d'água pode ser usado para moer trigo e outros grãos para fazer farinha e depois assá-los no forno para fazer pão. -O moinho é alimentado por energia hidráulica. Para isso, um curso de água deve ser conduzido até a roda do moinho através de um canal. -O fluxo de água e, portanto, a roda do moinho, podem ser controlados por meio de uma comporta. A comporta é composta pelo bloqueio de comporta e pela alavanca de comporta. - -A imagem à direita (clique em "Plano") mostra a estrutura do moinho d'água. - -[watermill1|plan] - -### Moinho d'Água TA1 -O moinho d'água pode ser usado para moer trigo e outros grãos para fazer farinha e depois assá-los no forno para fazer pão. O moinho deve ser conectado à roda do moinho com um eixo TA1. A potência da roda do moinho é apenas suficiente para um moinho. - -O moinho pode ser automatizado com a ajuda de um Funil(Minecart Hopper), para que a farinha, por exemplo, seja transportada diretamente do moinho para um forno para assar pão. - -[watermill2|plan] - -### Comporta TA1 -A válvula de comporta deve ser colocada diretamente ao lado de um lago ou em um riacho na mesma altura que a superfície da água. -Quando a comporta é aberta, a água flui através do canal. Essa água deve ser conduzida até a roda do moinho, onde movimenta o moinho. - -[ta1_sluice|image] - -### Alavanca de Comporta TA1 -A alavanca de comporta TA1 deve ser colocada na comporta. A comporta pode ser aberta com a ajuda da alavanca de comporta (clique com o botão direito). - -[ta1_sluice_handle|image] - -### Placa de Madeira de Maçã TA1 -Podem ser usados bloco de diferentes tipos de madeira para construir o canal do curso d'água. No entanto, qualquer outro material também pode ser usado. - -[ta1_board1|image] - -### Placa de Curso d'Água de Maçã TA1 -Podem ser utilizados blocos em diferentes tipos de madeira para construir o canal do curso d'água. Este bloco é especialmente adequado em conexão com postes da cerca de madeira para construir um suporte do canal. - -[ta1_board2|image] - -# Minérios e Ferramentas -O TA1 possui suas próprias ferramentas, como martelo e peneira de cascalho, mas o Funil(Minecart Hopper) também pode ser utilizado. - - -## Martelo -O martelo TA1 pode ser utilizado para bater/escavar pedra em uma mina, mas também para quebrar pedregulho(cobble) em cascalho(gravel). O martelo está disponível em diferentes versões, cada uma com propriedades distintas: bronze, aço, latão e diamante. - - -## Peneira de Cascalho(Sieve) -Minérios podem ser peneirados do cascalho com a peneira de cascalho. Para fazer isso, clique na peneira com o cascalho. O cascalho peneirado e os minérios caem abaixo. - -Para não ficar horas na peneira, é possível automatizar o processo com o Funil(Minecart Hopper). - - -## Funil (Minecart Hopper) -O funil do mod "Minecart Hopper" é utilizado principalmente para carregar e descarregar carrinhos de mineração. Ele suga itens de cima e os passa para a direita. Portanto, ao posicionar o funil, preste atenção na direção de dispensa. - -O funil também pode puxar itens de baús, desde que a caixa esteja ao lado ou em cima do funil. - -O funil também pode colocar itens em baús se a caixa estiver ao lado do funil. - - -## Peneirando sete cascalhos com Funil -Com a ajuda de dois baús, dois funis e uma peneira de cascalho, o processo de peneiração pode ser automatizado. O plano à direita mostra a estrutura. - -Certifique-se de que os baús são protegidos, caso contrário, alguém pode roubar os minérios valiosos do baú abaixo. - - -Meridium -O TA1 possui sua própria liga metálica, o Meridium. Lingotes de meridium podem ser feitos com a caldeira a carvão, utilizando aço e cristais de mesecons. O meridium brilha no escuro. Ferramentas feitas de meridium também emitem luz, sendo, portanto, muito úteis na mineração subterrânea. diff --git a/techage/manuals/manual_ta2_DE.md b/techage/manuals/manual_ta2_DE.md deleted file mode 100644 index 2a8a841..0000000 --- a/techage/manuals/manual_ta2_DE.md +++ /dev/null @@ -1,295 +0,0 @@ -# TA2: Dampfzeitalter - -In TA2 geht es darum, erste Maschinen zur Verarbeitung von Erzen zu bauen und zu betreiben. Einige Maschinen müssen dazu über Antriebsachsen angetrieben werden. Dazu musst du eine Dampfmaschine bauen und diese mit Kohle oder Holzkohle anheizen. - -In TA2 steht auch ein Kiesspüler zur Verfügung, mit dem seltene Erze wie Usmium Nuggets ausgewaschen werden können. Diese Nuggets wirst du später für weitere Rezepte brauchen. - -[techage_ta2|image] - -## Dampfmaschine - -Die Dampfmaschine besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet, zusammen gebaut werden. Dazu werden die Blöcke TA2 Feuerbox, TA2 Boiler oben, TA2 Boiler unten, TA2 Zylinder, TA2 Schwungrad und Dampfleitungen benötigt. - -Zusätzlich werden Antriebsachsen sowie Getriebeblöcke für Richtungswechsel benötigt. Das Schwungrad muss über die Antriebsachsen mit allen Maschinen verbunden werden, die angetrieben werden müssen. - -Bei allen Blöcken beim Setzen immer auch die Ausrichtung achten: - -- Zylinder links, Schwungrad rechts daneben -- Dampfleitungen anschließen, wo ein entsprechendes Loch ist -- Antriebsachse beim Schwungrad nur rechts -- bei allen Maschinen kann die Antriebsachse an allen Seiten angeschlossen werden, welche nicht durch andere Funktionen belegt wird, wie bspw. die IN und OUT Löcher bei Mühle und Sieb. - -Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen. -Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. -Wenn das Wasser heiß ist (Temperaturanzeige ganz oben), kann die Dampfmaschine am Schwungrad gestartet werden. - -Die Dampfmaschine leistet 25 ku und kann damit mehrere Maschinen gleichzeitig antreiben. - -[steamengine|plan] - - -### TA2 Feuerbox / Firebox - -Teil der Dampfmaschine. - -Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. Die Brenndauer ist abhängig von der Leistung, die von der Dampfmaschine angefordert wird. Unter Volllast brennt Kohle 32 s und Holzkohle 96 s. - -[ta2_firebox|image] - - -### TA2 Boiler - -Teil der Dampfmaschine. Muss mit Wasser gefüllt werden. Dies erfolgt durch Klicken mit einem Wassereimer auf den Boiler. Wenn kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt, schaltet sich die Dampfmaschine ab. Bei der Dampfmaschine geht bei jedem Kolbenhub etwas Wasser als Dampf verloren, daher muss regelmäßig Wasser nachgefüllt werden. - -[ta2_boiler|image] - - -### TA2 Zylinder /Cylinder - -Teil der Dampfmaschine. - -[ta2_cylinder|image] - - -### TA2 Schwungrad / Flywheel - -Antriebsteil der Dampfmaschine. Das Schwungrad muss über Antriebsachsen mit den Maschinen verbunden werden. - -[ta2_flywheel|image] - - -### TA2 Dampfleitungen / Steam Pipe - -Teil der Dampfmaschine. Der Boiler muss mit dem Zylinder über die Dampfleitungen (steam pipes) verbunden werden. Die Dampfleitung besitzt keine Abzweigungen, die maximale Länge beträgt 12 m (Blöcke). - -[ta2_steampipe|image] - -### TA2 Antriebsachsen / TA2 Drive Axle - -Die Antriebsachsen dienen zur Kraftübertragung von der Dampfmaschine zu anderen Maschinen. Die maximale Länge einer Antriebsachse beträgt 10 Blöcke. Über Getriebeblöcke können auch größere Strecken überbrückt, sowie Abzweigungen und Richtungswechsel realisiert werden. - -[ta2_driveaxle|image] - -### TA2 Stromgenerator / TA2 Power Generator - -Um Lampen oder andere Stromverbraucher an einer Dampfmaschine betreiben zu können, wird der TA2 Stromgenerator benötigt. Der TA2 Stromgenerator muss auf einer Seite mit Antriebsachsen verbunden werden und liefert dann auf der anderen Seite elektrischen Strom. - -Wird der Stromgenerator nicht mit ausreichend Kraft versorgt, geht er in einen Fehlerzustand und muss über einen Rechtsklick wieder aktiviert werden. - -Das Stromgenerator nimmt primär max. 25 ku an Achsenkraft auf und gibt sekundär max. 24 ku als Strom wieder ab. Er verbraucht also ein ku für die Umwandlung. - -[ta2_generator|image] - - -## TA2 Energiespeicher - -Bei größeren Anlagen mit mehreren Dampfmaschinen oder vielen angetriebenen Maschinen empfiehlt sich ein Energiespeicher. Der Energiespeicher bei TA2 arbeitet mit Lageenergie. Dazu wird Balast (Steine, Kies) in einer Kiste mit Hilfe einer Seilwinde in die Höhe gezogen. Ist überschüssige Energie im Achsen-Netzwerk vorhanden, so wird die Kiste nach oben gezogen. Wird kurzfristig mehr Energie benötigt, als die Dampfmaschine liefern kann, so gibt der Energiespeicher die gespeicherte Energie wieder ab, und die Balast-Kiste bewegt sich wieder nach unten. - -Der Energiespeicher besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet, zusammen gebaut werden. - -Um die maximale Speicherkapazität zu erreichen, muss die Kiste mit Gewichten komplett gefüllt, und der Mast inklusive der zwei Getriebeblöcke 12 Blöcke hoch sein. Kleinere Aufbauten sind aber auch möglich. - -[ta2_storage|plan] - - - -### TA2 Seilwinde / TA2 Winch - -Die Seilwinde muss mit einem Getriebeblock verbunden werden und kann so überschüssige Energie aufnehmen und damit eine Gewichtekiste nach oben ziehen. Achte beim Aufbau der Seilwinde darauf, dass der Pfeil auf der Blockoberseite zum Getriebeblock zeigt. Die maximale Seillänge beträgt 10 Blöcke. - -[ta2_winch|image] - - - -### TA2 Gewichtekiste / TA2 Weight Chest - -Diese Kiste muss mit bis zu 10 Blöcken Abstand unter die Seilwinde gesetzt und mit Pflastersteinen Kies oder Sand gefüllt werden. Ist das Mindestgewicht von einem Stack (99+ Items) erreicht und überschüssige Energie vorhanden, wird die Kiste automatisch über eine Seil mit der Seilwinde verbunden und in die Höhe gezogen. - -[ta2_weight_chest|image] - - - -### TA2 Kupplung / TA2 Clutch - -Mit der Kupplung können Achsen und Maschinen vom Energiespeicher getrennt werden. Damit kommen die Achsen nach der Kupplung zum Stillstand und Maschinenanlagen können umgebaut werden. Achte beim Aufbau der Kupplung darauf, dass der Pfeil auf der Blockoberseite zum Energiespeicher zeigt. - -[techage:ta2_clutch_off|image] - - - -## Items schieben und sortieren - -Um Gegenstände (Items) von einer Verarbeitungsstation zur nächsten weiter zu transportieren, werden Schieber und Röhren verwendet. Siehe Plan. - -[itemtransport|plan] - - -### Röhren / TechAge Tube - -Zwei Maschinen können mit Hilfe eines Schiebers und einer Röhre (tube) verbunden werden. Röhren besitzen keine Abzweigungen. Die maximale Länge beträgt 200 m (Blöcke). - -Röhren können alternativ mit Hilfe der Shift-Taste platziert werden. Dies erlaubt bspw. Röhren parallel zu verlegen, ohne dass diese sich unbeabsichtigt verbinden. - -Die Transportkapazität einer Röhre ist unbegrenzt und nur durch die Schieber begrenzt. - -[tube|image] - -### Röhren Konzentrator / Tube Concentrator - -Über den Konzentrator können mehrere Röhren zu einer Röhre zusammengeführt werden. Die Richtung, in der alle Items weitergegeben werden, ist mit einem Pfeil markiert. - -[concentrator|image] - - -### TA2 Schieber / Pusher - -Ein Schieber ist in der Lage, Items aus Kisten oder Maschinen zu ziehen und in andere Kisten oder Maschinen zu schieben. Oder anders gesagt: Zwischen zwei Blöcken mit Inventar muss ein und genau ein Schieber sein. Mehrere Schieber in Reihe sind nicht möglich. -In die Gegenrichtung ist ein Schieber für Items aber durchlässig, so dass eine Kiste über eine Röhre gefüllt und ebenso geleert werden kann. - -Ein Schieber geht in den Zustand "standby", wenn der keine Items zum Schieben hat. Ist der Ausgang blockiert oder das Inventory des Empfängers voll, so geht der Schieber in den Zustand "blocked". Aus beiden Zuständen kommt der Schieber nach einigen Sekunden selbsttätig wieder raus, sofern sich die Situation geändert hat. - -Der Verarbeitungsleistung eines TA2 Schiebers beträgt 2 Items alle 2 s. - -[ta2_pusher|image] - - -### TA2 Verteiler / Distributor - -Der Verteiler ist in der Lage, die Items aus seinem Inventar sortiert in bis zu vier Richtungen weiter zu transportieren. Dazu muss der Verteiler entsprechend konfiguriert werden. - -Der Verteiler besitzt dazu ein Menü mit 4 Filter mit unterschiedlichen Farben, entsprechend den 4 Ausgängen. Soll ein Ausgang genutzt werden, so muss der entsprechende Filter über die "on" Checkbox aktiviert werden. Alle Items, die für diesen Filter konfiguriert sind, werden über den zugeordneten Ausgang ausgegeben. Wird ein Filter aktiviert, ohne das Items konfiguriert werden, so sprechen wir hier von einem "nicht-konfigurierten", offenen Ausgang. - -**Achtung: Der Verteiler ist an seinen Ausgängen gleichzeitig ein Schieber. Daher niemals die Gegenstände mit einem Schieber aus dem Verteiler ziehen!** - -Für einen nicht-konfigurierten Ausgang gibt es zwei Betriebsarten: - -1) Alle Items ausgeben, die an keine anderen Ausgängen ausgegeben werden können, auch wenn diese blockiert sind. - -2) Nur die Items ausgeben, die für keinen anderen Filter konfiguriert wurden. - -Im ersten Fall werden immer alle Items weitergeleitet und der Verteiler läuft nicht voll. Im zweiten Fall werden Items zurückgehalten und der Verteiler kann voll laufen und in der Folge blockieren. - -Einstellbar ist die Betriebsart über die "blockiere" Checkbox. - -Der Verarbeitungsleistung eines TA2 Verteilers beträgt 4 Items alle 2 s, wobei der Verteiler dabei versucht, die 4 Items auf die offenen Ausgänge zu verteilen. - -Wird dasselbe Item in einem Filter mehrfach hinterlegt, so beeinflusst dies das langfristige Verteilungsverhältnis entsprechend. - -Bitte beachte, dass die Verteilung ein probabilistischer Vorgang ist, d.h. die Verhältnisse werden nicht exakt, sondern nur langfristig eingehalten. - -In den Filtern beträgt die maximale Stackgröße 12; insgesamt können höchstens 36 Items konfiguriert werden. - -[ta2_distributor|image] - - -## Kieswaschanlage - -Die Kieswaschanlage ist eine komplexere Maschine mit dem Ziel, Usmium Nuggets aus gesiebtem Kies auszuwaschen. Für den Aufbau wird ein TA2 Kiesspüler mit Achsenantrieb, ein Trichter, eine Kiste, sowie fließendes Wasser benötigt. - -Aufbau von links nach rechts (siehe auch Plan): - -* Ein Erdblock, darauf die Wasserquelle, umgeben auf 3 Seiten von bspw. Glasblöcken -* daneben den Kiesspüler, ggf. mit Röhrenanschlüssen für den Kies An- und Abtransport -* dann den Trichter mit Kiste - -Das Ganze umgeben von weiteren Glasblöcken, so dass das Wasser über den Kiesspüler und den Trichter fließt und ausgespülten Nuggets vom Trichter wieder eingesammelt werden können. - -[gravelrinser|plan] - - -### TA2 Kiesspüler / Gravel Rinser - -Der Kiesspüler ist in der Lage, aus bereits gesiebtem Kies die Erze Usmium und Kupfer auszuspülen, sofern dieser von Wasser überspült wird. - -Ob der Kiesspüler korrekt arbeitet, kann mit Hilfe von Stöcken (sticks) getestet werden, wenn diese in das Inventar des Kiesspülers getan werden. Diese müssen einzeln ausgespült und vom Trichter eingefangen werden. - -Die Verarbeitungsleistung ist ein Kies Item alle 2 s. Der Kiesspüler benötigt 3 ku Energie. - -[ta2_rinser|image] - - -## Stein brechen, mahlen und sieben - -Das Brechen, Mahlen und Siebe von Gestein dient zur Gewinnung von Erzen. Gesiebtes Kies kann aber auch anderweitig genutzt werden. Steinbrecher, Mühle und Sieb müssen angetrieben und damit in der Nähe einer Dampfmaschine aufgebaut werden. - -[ta2_grinder|image] - - -### TA2 Steinbrecher / Quarry - -Der Steinbrecher dient zum Abbau von Steinen und anderen Materialien aus dem Untergrund. Der Steinbrecher gräbt ein 5x5 Blöcke großes Loch. Die Tiefe ist einstellbar. -Die Verarbeitungsleistung ist ein Block alle 4 s. Der Steinbrecher benötigt 10 ku Energie. Die maximale Tiefe beträgt 20 Meter. Für größere Tiefen siehe TA3/TA4. - -[ta2_quarry|image] - - -### TA2 Mühle / Grinder - -Die Mühle ist in der Lage, verschiedenes Gestein, aber auch Holz und andere Items zu mahlen. -Die Verarbeitungsleistung ist ein Item alle 4 s. Die Mühle benötigt 4 ku Energie. - -[ta2_grinder|image] - - -### TA2 Kiessieb / Gravel Sieve - -Das Kiessieb ist in der Lage, Kies zu sieben um Erze zu gewinnen. Als Ergebnis erhält man teilweise "gesiebtes Kies", was nicht wieder gesiebt werden kann. -Die Verarbeitungsleistung ist ein Item alle 4 s. Das Kiessieb benötigt 3 ku Energie. - -[ta2_gravelsieve|image] - - -## Items produzieren - -Mit TA2 Maschinen können nicht nur Erze gewonnen, sondern auch Gegenstände hergestellt werden. - - -### TA2 Autocrafter - -Der Autocrafter dient zur automatischen Herstellung von Waren. Alles was der Spieler über das "Crafting Grid" herstellen kann, kann auch durch den Autocrafter erledigt werden. Dazu müssen im Menü des Autocrafters das Rezept eingegeben und die notwendigen Zutaten hinzugefügt werden. - -Zutaten und hergestellte Waren können über Röhren und Schieber in und aus dem Block transportiert werden. - -Die Verarbeitungsleistung ist ein Item alle 4 s. Der Autocrafter benötigt 4 ku Energie. - -[ta2_autocrafter|image] - - -### TA2 Elektronikfabrik / Electronic Fab - -Die Elektronikfabrik ist eine Spezialmaschine und nur für die Herstellung der Vakuumröhren nutzbar. Vakuumröhren werden für TA3 Maschinen und Blöcke benötigt. - -Die Verarbeitungsleistung ist eine Vakuumröhre alle 6 s. Die Elektronikfabrik benötigt 8 ku Energie. - -[ta2_electronicfab|image] - - -## Sonstige Blöcke - -### TA2 Flüssigkeitensammler / Liquid Sampler - -Für manche Rezepte wird Wasser benötigt. Damit auch diese Rezepte automatisiert mit dem Autocrafter bearbeitet werden können, muss Wasser in Eimern bereitgestellt werden. Hierzu dient der Flüssigkeitensammler. Er benötigt leere Eimer und muss ins Wasser gestellt werden. - -Die Verarbeitungsleistung ist ein Wassereimer alle 8 s. Der Flüssigkeitensammler benötigt 3 ku Energie. - -[ta2_liquidsampler|image] - - -### TA2 Gesicherte Kiste / Protected Chest - -Die gesicherte Kiste kann nur von den Spielern genutzt werden, die an diesem Ort auch bauen können, also Protection Rechte besitzen. Es spielt dabei keine Rolle, wer die Kiste setzt. - -[ta2_chest|image] - - -### Techage Forceload Block - -Minetest teilt die Karte in sogenannte Map-Blocks ein. Das sind Würfel mit 16x16x16 Blöcke Kantenlänge. So ein Map-Block wird vom Server immer komplett geladen, aber es werden nur die Blöcke um einen Spieler herum geladen (ca. 2-3 Blöcke in alle Richtungen). In Sichtrichtung des Spielers sind es auch mehr Map-Blöcke. Nur dieser Teil der Welt ist aktiv und nur hier wachsen Pflanzen und Bäume bzw. laufen die Maschinen. - -Mit einem Forceload-Block kannst du erzwingen, dass der Map-Block, in dem der Forceload Block steht, immer geladen bleibt, solange du auf dem Server bist. Wenn alle deine Farmen und Maschinen mit Forceload Blöcken abgedeckt sind, ist immer alles am Laufen. - -Die Map-Blöcke mit ihren Koordinaten sind vordefiniert, also bspw. (0,0,0) bis (15,15,15), oder (16,16,16) bis (31,31,31). -Man kann einen Forceload-Block innerhalb eines Map-Blockes verschieben wie man will, die Position des Map-Blocks bleibt dabei unverändert. - -[ta2_forceload|image] - diff --git a/techage/manuals/manual_ta2_EN.md b/techage/manuals/manual_ta2_EN.md deleted file mode 100644 index 4fb7cc7..0000000 --- a/techage/manuals/manual_ta2_EN.md +++ /dev/null @@ -1,295 +0,0 @@ -# TA2: Steam Age - -TA2 is about building and operating the first machines for processing ores. Some machines have to be driven via drive axles. To do this, you need to build a steam engine and heat it with coal or charcoal. - -In TA2 there is also a gravel rinser that can be used to wash out rare ores such as Usmium nuggets. You will need these nuggets later for further recipes. - -[techage_ta2|image] - -## Steam Engine - -The steam engine consists of several blocks and must be assembled as shown in the plan on the right. The blocks TA2 fire box, TA2 boiler top, TA2 boiler bottom, TA2 cylinder, TA2 flywheel and steam pipes are required. - -In addition, drive axles and gear blocks are required for changing direction. The flywheel must be connected to all machines that have to be driven via the drive axles. - -Always pay attention to the alignment of all blocks when placing: - -- Cylinder on the left, flywheel on the right -- Connect steam pipes where there is a corresponding hole -- Drive axle on flywheel only on the right -- In all machines, the drive axles can be connected on all sides, which is not occupied by other functions, such as the IN and OUT holes in the grinder and sieve. - -The boiler must be filled with water. Fill up to 10 buckets of water in the boiler. -The fire box must be filled with coal or charcoal. -When the water is hot (temperature display at the top), the steam engine can be started on the flywheel. - -The steam engine has a capacity of 25 ku, so it can drive several machines at the same time. - -[steamengine|plan] - - -### TA2 Firebox - -Part of the steam engine. - -The fire box must be filled with coal or charcoal. The burning time depends on the power demanded by the steam engine. Coal burns for 32 s and charcoal for 96 s under full load. - -[ta2_firebox|image] - - -### TA2 Boiler - -Part of the steam engine. Must be filled with water. This is done by clicking on the boiler with a water bucket. When there is no more water or the temperature drops too low, the steam engine switches off. With the steam engine, some water is lost as steam with each piston stroke, so water has to be refilled regularly. - -[ta2_boiler|image] - - -### TA2 Cylinder - -Part of the steam engine. - -[ta2_cylinder|image] - - -### TA2 Flywheel - -Drive part of the steam engine. The flywheel must be connected to the machines via drive axles. - -[ta2_flywheel|image] - - -### TA2 Steam Pipes - -Part of the steam engine. The boiler must be connected to the cylinder via the steam pipes. The steam pipe has no branches, the maximum length is 12 m (blocks). - -[ta2_steampipe|image] - - -### TA2 Drive Axle / TA2 Gearbox - -The drive axles are used to transmit power from the steam engine to other machines. The maximum length of a drive axis is 10 blocks. With TA2 Gearboxes, larger distances can be bridged, and branches and changes of direction can be realized. - -[ta2_driveaxle|image] - - -### TA2 Power Generator - -The TA2 Power Generator is required to operate lamps or other power consumers on a steam engine. The TA2 Power Generator has to be connected to drive axles on one side and then supplies electricity on the other side. - -If the Power Generator is not supplied with sufficient power, it goes into an error state and must be reactivated with a right-click. - -The Power Generator takes max. 25 ku of axle power and provides on the other side max. 24 ku as electricity. So he consumes one ku for the conversion. - -[ta2_generator|image] - -## TA2 energy storage - -For larger systems with several steam engines or many driven machines, an energy storage system is recommended. The energy storage at TA2 works with position energy. For this purpose, ballast (stones, gravel, sand) is pulled up in a chest with the help of a cable winch. If there is excess energy in the axis network, the chest is pulled upwards. If more energy is required in the short term than the steam engine can supply, the energy store releases the stored energy again and the weight chest moves down again. -The energy storage consists of several blocks and must be assembled as shown in the plan on the right. -In order to achieve the maximum storage capacity, the chest must be completely filled with weights and the mast including the two gear boxes must be 12 blocks high. Smaller structures are also possible. - -[ta2_storage|plan] - - - -### TA2 Winch - -The cable winch must be connected to a gear box and can absorb excess energy and thus pull a weight chest upwards. -When assembling the cable winch, make sure that the arrow on the top of the block points to the gearbox. -The maximum rope length is 10 blocks. - -[ta2_winch|image] - - - -### TA2 Weight Chest - -This chest must be placed under the winch with a distance of up to 10 blocks and filled with cobblestone, gravel or sand. If the minimum weight of a stack (99+ items) is reached and there is excess energy, the box is automatically connected to the winch via a rope and pulled up. - -[ta2_weight_chest|image] - - - -### TA2 Clutch - -With the clutch, axles and machines can be separated from the energy storage. This means that the axles after the clutch come to a standstill and machine systems can be rebuilt. When assembling the clutch, make sure that the arrow on the top of the block points to the energy storage system. - -[techage:ta2_clutch_off|image] - - - -## Push and sort items - -In order to transport objects from one processing station to the next, pushers and tubes are used. See plan. - -[itemtransport|plan] - - -### TechAge Tube - -Two machines can be connected with the help of a pusher and a tube. Tubes have no branches. The maximum length is 200 m (blocks). - -Alternatively, tubes can be placed using the Shift key. This allows, for example, tubes to be laid in parallel without them accidentally connecting. - -The transport capacity of a tube is unlimited and only limited by the pusher. - -[tube|image] - -### Tube Concentrator - -Several tubes can be combined into one tube via the concentrator. The direction in which all items are passed on is marked with an arrow. - -[concentrator|image] - -### TA2 Pusher - -A pusher is able to pull items out of boxes or machines and push them into other boxes or machines. In other words, there must be one and exactly one pusher between two blocks with inventory. Multiple pushers in a row are not possible. -In the opposite direction, however, a pusher is permeable for items, so that a box can be filled via a tube and also taught. - -A pusher goes into the "standby" state if it has no items to push. If the output is blocked or the recipient's inventory is full, the pusher goes into the "blocked" state. The pusher automatically comes out of both states after a few seconds if the situation has changed. - -The processing power of a TA2 pusher is 2 items every 2 s. - -[ta2_pusher|image] - - -### TA2 Distributor - -The distributor is able to transport the items from his inventory sorted in up to four directions. To do this, the distributor must be configured accordingly. - -The distributor has a menu with 4 filters with different colors, corresponding to the 4 outputs. If an output is to be used, the corresponding filter must be activated via the "on" checkbox. All items that are configured for this filter are output via the assigned output. If a filter is activated without items being configured, we are talking about an "unconfigured", open output. - -**Attention: The distributor is also a pusher at its output sides. Therefore, never pull items out of the distributor with a pusher!** - -There are two operating modes for a non-configured output: - -1) Output all items that cannot be output to any other exit, even if they are blocked. - -2) Only output the items that have not been configured for any other filter. - -In the first case, all items are always forwarded and the distributor does not run full. In the second case, items are held back and the distributor can run full and then block. - -The operating mode can be set using the "blocking mode" checkbox. - -The processing power of a TA2 distributor is 4 items every 2 s, whereby the distributor tries to distribute the 4 items to the open outputs. - -If the same item is configured multiple times in one filter, the long term distribution ratio will be influenced accordingly. - -Please note that the distribution is a probabilistic process. This means that the distribution rations won't be matched exactly, but only in the long term. - -The maximum stack size in the filters is 12; in total, not more than 36 items can be configured. - -[ta2_distributor|image] - - -## Gravel washer - -The gravel washer is a more complex machine with the goal of washing Usmium nuggets out of sieved gravel. A TA2 rinser with axis drive, a hopper, a chest and running water are required for the installation. - -Structure from left to right (see also plan): - -* A dirt block, on top of it the water source, surrounded on 3 sides by e.g. glass blocks -* next to it the gravel rinser, if necessary with tube connections for the gravel delivery and removal -* then the hopper with chest - -The whole thing is surrounded by further glass blocks, so that the water flows over the gravel rinser and the hopper and rinsed-out nuggets can be collected again by the hopper. - -[gravelrinser|plan] - - -### TA2 Gravel Rinser - -The gravel washer is able to rinse out the Usmium and copper ores from gravel that has already been sieved, provided that this is flushed with water. - -Whether the Gravel Rinser works correctly can be tested with sticks if these are placed in the inventory of the Gravel Rinser. These must be rinsed out individually and caught by the hopper. - -The processing power is one gravel item every 2 s. The gravel washer needs 3 ku of energy. - -[ta2_rinser|image] - - -## Dig stone, grind and sieve - -Crushing, grinding and sieving of cobblestone is used to extract ores. Sieved gravel can also be used for other purposes. Quarry, grinder and sieve must be driven and thus installed near a steam engine. - -[ta2_grinder|image] - - -### TA2 Quarry - -The quarry is used to remove stones and other materials from the underground. The quarry digs a 5x5 block hole. The depth is adjustable. -The processing power is one block every 4 s. The quarry needs 10 ku of energy. The maximum depth is 20 meters. For greater depths see TA3 / TA4. - -[ta2_quarry|image] - - -### TA2 Grinder - -The grinder is able to grind various rocks, but also wood and other items. -The processing power is one item every 4 s. The grinder needs 4 ku of energy. - -[ta2_grinder|image] - - -### TA2 Gravel Sieve - -The gravel sieve is able to sieve gravel to extract ores. The result is partially "sieved gravel", which cannot be sieved again. -The processing power is one item every 4 s. The gravel sieve requires 3 ku of energy. - -[ta2_gravelsieve|image] - - -## Produce Items - -TA2 machines can not only extract ores, but also produce objects. - - -### TA2 Autocrafter - -The autocrafter is used for the automatic production of goods. Everything that the player can produce via the "Crafting Grid" can also be done by the autocrafter. To do this, the recipe must be entered in the menu of the autocrafter and the necessary ingredients added. - -Ingredients and manufactured goods can be transported in and out of the block via tubes and pushers. - -The processing power is one item every 4 s. The autocrafter requires 4 ku of energy. - -[ta2_autocrafter|image] - - -### TA2 Electronic Fab - -The electronic fab is a special machine and can only be used for the production of vacuum tubes. Vacuum tubes are required for TA3 machines and blocks. - -The processing power is one vacuum tube every 6 s. The electronic fab requires 8 ku of energy. - -[ta2_electronicfab|image] - - -## Other blocks - -### TA2 Liquid Sampler - -Some recipes require water. So that these recipes can also be processed automatically with the autocrafter, water must be provided in buckets. The liquid sampler is used for this. He needs empty buckets and has to be put in the water. - -The processing capacity is one water bucket every 8 s. The liquid sampler requires 3 ku of energy. - -[ta2_liquidsampler|image] - - -### TA2 Protected Chest - -The protected chest can only be used by players who can build at this location, i.e. who have protection rights. It does not matter who sets the chest. - -[ta2_chest|image] - - -### Techage Forceload Block - -Minetest divides the map into so-called map blocks. These are cubes with an edge length of 16x16x16 blocks. Such a map block is always loaded completely by the server, but only the blocks around a player are loaded (approx. 2-3 blocks in all directions). In the player's direction of view, there are also more map blocks. Only this part of the world is active and only here do plants and trees grow or the machines run. - -With a forceload block you can force the map block in which the forceload block is located to remain loaded as long as you are on the server. When all your farms and machines are covered with Forceload blocks, everything is always running. - -The map blocks with their coordinates are predefined, e.g. (0,0,0) to (15,15,15), or (16,16,16) to (31,31,31). -You can move a forceload block within a map block as you like, the position of the map block remains unchanged. - -[ta2_forceload|image] - diff --git a/techage/manuals/manual_ta2_pt-BR.md b/techage/manuals/manual_ta2_pt-BR.md deleted file mode 100644 index da50b1b..0000000 --- a/techage/manuals/manual_ta2_pt-BR.md +++ /dev/null @@ -1,284 +0,0 @@ -# TA2: Era a Vapor - -TA2 trata-se de construir e operar as primeiras máquinas para processamento de minérios. Algumas máquinas precisam ser acionadas por eixos de transmissão. Para fazer isso, você precisa construir uma máquina a vapor e aquecê-la com carvão ou carvão vegetal. - -No TA2, há também um lavador de cascalho que pode ser usado para lavar minérios raros, como pepitas de Usmium. Você precisará dessas pepitas posteriormente para receitas adicionais. - -[techage_ta2|image] - -## Máquina a Vapor - -A máquina a vapor é composta por vários blocos e deve ser montada conforme mostrado no plano à direita. São necessários os blocos da Caixa de Fogo(Firebox) TA2, parte superior da Caldeira(Boiler) TA2, parte inferior da Caldeira(Boiler) TA2, Cilindro(Cylinder) TA2, Volante(Flywheel) TA2 e Tubos de Vapor(steam piper) TA2. - -Além disso, são necessários Eixos de Transmissão(drive axles) e blocos de Engrenagem(gear) para mudança de direção. O Volante deve ser conectado a todas as máquinas que precisam ser acionadas pelos Eixos de Transmissão. - -Sempre preste atenção ao alinhamento de todos os blocos ao colocá-los: - -- Cilindro à esquerda, volante à direita -- Conectar os tubos de vapor onde há um furo correspondente -- Eixo de transmissão no volante apenas à direita -- Em todas as máquinas, os eixos de transmissão podem ser conectados em todos os lados que não estejam ocupados por outras funções, como os furos de ENTRADA(IN) e SAÍDA(OUTPUT) no Moedor(grinder) e na Peneira(sieve). - -A Caldeira deve ser preenchida com água. Preencha até 10 baldes de água na caldeira. -A Caixa de fogo deve ser preenchida com carvão ou carvão vegetal. -Quando a água estiver quente (indicador de temperatura no topo), a máquina a vapor pode ser iniciada no Volante. - -A máquina a vapor tem uma capacidade de 25ku, podendo acionar várias máquinas ao mesmo tempo. - -[steamengine|plan] - -### Caixa de Fogo(Firebox) TA2 - -Parte da máquina a vapor. - -A Caixa de fogo deve ser preenchida com carvão ou carvão vegetal. O tempo de queima depende da potência exigida pela máquina a vapor. O carvão queima por 32s e o carvão vegetal por 96s em carga máxima. - -[ta2_firebox|image] - -### TA2 Caldeira(Boiler) - -Parte da máquina a vapor. Deve ser preenchida com água. Isso é feito clicando na caldeira com um balde de água. Quando não há mais água ou a temperatura cai muito, a máquina a vapor desliga. Com a máquina a vapor, parte da água é perdida como vapor a cada curso do pistão, então a água deve ser reabastecida regularmente. - -[ta2_boiler|image] - -### TA2 Cilindro(Cylinder) - -Parte da máquina a vapor. - -[ta2_cylinder|image] - -### TA2 Volante(Flywheel) - -Parte motora da máquina a vapor. O Volante deve ser conectado às máquinas por meio de eixos de transmissão. - -[ta2_flywheel|image] - -### TA2 Tubos de Vapor(Steam pipes) - -Parte da máquina a vapor. A caldeira deve ser conectada ao cilindro por meio dos Tubos de vapor. O tubo de vapor não tem ramificações, o comprimento máximo é 12 m (blocos). - -[ta2_steampipe|image] - -### TA2 Eixo de Transmissão(Drive axle) TA2 / Caixa de Engrenagem(Gearbox) - -Os Eixos de transmissão são usados para transmitir energia da máquina a vapor para outras máquinas. O comprimento máximo de um eixo de transmissão é 10 blocos. Com as Caixas de Engrenagem TA2, é possível vencer distâncias maiores, e também realizar ramificações e mudanças de direção. - -[ta2_driveaxle|image] - -### TA2 Gerador de Energia - -O Gerador de Energia TA2 é necessário para operar lâmpadas ou outros consumidores de energia em uma Máquina a vapor. O Gerador de Energia TA2 deve ser conectado aos eixos de transmissão de um lado e, em seguida, fornece eletricidade do outro lado. - -Se o Gerador de Energia não receber energia suficiente, ele entra em estado de erro e deve ser reativado com um clique direito. - -O Gerador de Energia consome no máximo 25ku de potência do eixo e fornece no máximo 24ku como eletricidade do outro lado. Portanto, ele consome um ku para a conversão. - -[ta2_generator|image] - -## TA2 Armazenamento de Energia - -Para sistemas maiores com várias máquinas a vapor ou muitas máquinas acionadas, é recomendado um sistema de armazenamento de energia. O armazenamento de energia no TA2 funciona com energia potencial. Para isso, o peso (pedras, cascalho, areia) é puxado para cima em um baú com a ajuda de um guincho. Se houver excesso de energia na rede de eixos, o baú é puxado para cima. Se mais energia for necessária a curto prazo do que a máquina a vapor pode fornecer, o armazenamento de energia libera a energia armazenada novamente e o baú de pesos desce novamente. -O armazenamento de energia é composto por vários blocos e deve ser montado conforme mostrado no plano à direita. -Para alcançar a capacidade máxima de armazenamento, o baú deve ser completamente preenchido com pesos e o mastro, incluindo as duas caixas de engrenagens, deve ter 12 blocos de altura. Estruturas menores também são possíveis. - -[ta2_storage|plan] - -### TA2 Guincho - -O guincho deve ser conectado a uma caixa de engrenagens e pode absorver energia excessiva e assim puxar um baú de pesos para cima. -Ao montar o guincho, certifique-se de que a seta no topo do bloco aponte para a caixa de engrenagens. -O comprimento máximo da corda é 10 blocos. - -[ta2_winch|image] - -### TA2 Baú de Pesos - -Este baú deve ser colocado sob o guincho com uma distância de até 10 blocos e preenchido com pedras, cascalho ou areia. Se o peso mínimo de uma pilha (99+ itens) - -### TA2 Embreagem - -Com a embreagem, eixos e máquinas podem ser separados do armazenamento de energia. Isso significa que os eixos após a embreagem param e sistemas de máquinas podem ser reconstruídos. Ao montar a embreagem, certifique-se de que a seta na parte superior do bloco aponta para o sistema de armazenamento de energia. - -[techage:ta2_clutch_off|image] - -## Empurrar e classificar itens - -Para transportar objetos de uma estação de processamento para a próxima, são usados pushers e tubos. Veja o plano. - -[itemtransport|plan] - -### Tubo TechAge - -Duas máquinas podem ser conectadas com a ajuda de um pusher e um tubo. Tubos não têm ramificações. O comprimento máximo é 200m (blocos). - -Alternativamente, os tubos podem ser colocados usando a tecla Shift. Isso permite, por exemplo, que tubos sejam colocados em paralelo sem que eles se conectem acidentalmente. - -A capacidade de transporte de um tubo é ilimitada e é limitada apenas pelo pusher. - -[tube|image] - -### Tubo Concentrador - -Vários tubos podem ser combinados em um único tubo via concentrador. A direção na qual todos os itens são passados é marcada com uma seta. - -[concentrator|image] - -### TA2 Pusher - -Um pusher(empurrador) é capaz de puxar itens de caixas ou máquinas e empurrá-los para outras caixas ou máquinas. Em outras palavras, deve haver um e apenas um pusher entre dois blocos com inventário. Múltiplos pushers em sequência não são possíveis. -No entanto, na direção oposta, um pusher é permeável a itens, de modo que uma caixa pode ser preenchida via tubo e também ensinada. - -Um pusher entra no estado "standby" se não tiver itens para empurrar. Se a saída estiver bloqueada ou o inventário do destinatário estiver cheio, o pusher entra no estado "bloqueado". O pusher automaticamente sai de ambos os estados após alguns segundos se a situação mudar. - -A capacidade de processamento de um pusher TA2 é de 2 itens a cada 2 s. - -[ta2_pusher|image] - -### TA2 Distributor(Distribuidor) - -O distribuidor é capaz de transportar os itens de seu inventário ordenados em até quatro direções. Para fazer isso, o distribuidor deve ser configurado conforme necessário. - -O distribuidor possui um menu com 4 filtros com cores diferentes, correspondendo às 4 saídas. Se uma saída for usada, o filtro correspondente deve ser ativado via caixa de seleção "ligado". Todos os itens configurados para este filtro são enviados através da saída designada. Se um filtro for ativado sem que itens sejam configurados, estamos falando de uma saída "não configurada", aberta. - -**Atenção: O distribuidor também é um pusher em suas saídas. Portanto, nunca puxe itens do distribuidor com um pusher!** - -Existem dois modos de operação para uma saída não configurada: - -1) Enviar todos os itens que não podem ser enviados para nenhuma outra saída, mesmo que estejam bloqueados. - -2) Enviar apenas os itens que não foram configurados para nenhum outro filtro. - -No primeiro caso, todos os itens são sempre encaminhados e o distribuidor não fica cheio. No segundo caso, os itens são retidos e o distribuidor pode ficar cheio e, em seguida, bloquear. - -O modo de operação pode ser definido usando a caixa de seleção "modo de bloqueio". - -A capacidade de processamento de um distribuidor TA2 é de 4 itens a cada 2s, onde o distribuidor tenta distribuir os 4 itens para as saídas abertas. - -Se o mesmo item for configurado várias vezes em um filtro, a proporção de distribuição a longo prazo será influenciada de acordo. - -Observe que a distribuição é um processo probabilístico. Isso significa que as proporções de distribuição não serão correspondidas exatamente, mas apenas a longo prazo. - -O tamanho máximo de pilha nos filtros é 12; no total, não mais que 36 itens podem ser configurados. - -[ta2_distributor|image] - - -## Gravel washer(Lavador de cascalho) - -O lavador de cascalho é uma máquina mais complexa com o objetivo de lavar pepitas de Usmium a partir de cascalho peneirado. Um enxaguatório TA2 com eixo de acionamento, um funil, um baú e água corrente são necessários para a instalação. - -Estrutura da esquerda para a direita (veja também o plano): - -- Um bloco de terra, sobre ele a fonte de água, cercada em 3 lados, por exemplo, por blocos de vidro -- Ao lado, o enxaguatório de cascalho, se necessário com conexões de tubulação para a entrega e remoção de cascalho -- Em seguida, o funil com baú - -O conjunto é cercado por mais blocos de vidro, para que a água flua sobre o enxaguatório de cascalho e o funil, e as pepitas lavadas possam ser coletadas novamente pelo funil. - -[gravelrinser|plan] - -### TA2 Gravel Rinser(Enxaguatório de cascalho) - -O lavador de cascalho é capaz de enxaguar os minérios de Usmium e cobre do cascalho que já foi peneirado, desde que seja lavado com água. - -Se o Enxaguatório de Cascalho funciona corretamente, pode ser testado com pedaços de madeira, se estes forem colocados no inventário do Enxaguatório de Cascalho. Eles devem ser enxaguados individualmente e recolhidos pelo funil. - -A capacidade de processamento é de um item de cascalho a cada 2s. O lavador de cascalho precisa de 3 ku de energia. - -[ta2_rinser|image] - - -## Escavar pedra, moer e peneirar - -Esmagar, moer e peneirar pedregulhos é usado para extrair minérios. O cascalho peneirado também pode ser usado para outros fins. A pedreira, moedor e peneira devem ser acionados e, portanto, instalados perto de uma máquina a vapor. - -[ta2_grinder|image] - -### TA2 Quarry(Pedreira) - -A pedreira é usada para remover pedras e outros materiais do subsolo. A pedreira escava um buraco de 5x5 blocos. A profundidade é ajustável. -A capacidade de processamento é de um bloco a cada 4s. A pedreira precisa de 10 ku de energia. A profundidade máxima é de 20 metros. Para maiores profundidades, consulte TA3 / TA4. - -[ta2_quarry|image] - -### TA2 Grinder(Moedor) - -O moedor é capaz de moer várias rochas, mas também madeira e outros itens. -A capacidade de processamento é de um item a cada 4s. O moedor precisa de 4 ku de energia. - -[ta2_grinder|image] - -### TA2 Gravel Sieve(Peneira de cascalho) - -A peneira de cascalho é capaz de peneirar cascalho para extrair minérios. O resultado é parcialmente "sieved gravel", que não pode ser peneirado novamente. -A capacidade de processamento é de um item a cada 4s. A peneira de cascalho requer 3 ku de energia. - -[ta2_gravelsieve|image] - - -## Produzindo Itens - -As máquinas TA2 podem não apenas extrair minérios, mas também produzir objetos. - -### TA2 Autocrafter - -O autocrafter é usado para a produção automática de bens. Tudo o que o jogador pode produzir via "Crafting Grid" também pode ser feito pelo autocrafter. Para isso, a receita deve ser inserida no menu do autocrafter e os ingredientes necessários adicionados. - -Ingredientes e produtos fabricados podem ser transportados para dentro e para fora do bloco por meio de tubos e pushers. - -A capacidade de processamento é de um item a cada 4s. O autocrafter requer 4 ku de energia. - -[ta2_autocrafter|image] - -### TA2 Electronic Fab - -O electronic fab é uma máquina especial e só pode ser usada para a produção de tubos de vácuo. Tubos de vácuo são necessários para máquinas e blocos TA3. - -A capacidade de processamento é de um tubo de vácuo a cada 6s. O electronic fab requer 8 ku de energia. - -[ta2_electronicfab|image] - - -## Outros Blocos - -### TA2 Liquid Sampler - -Algumas receitas requerem água. Para que essas receitas também possam ser processadas automaticamente com o autocrafter, água deve ser fornecida em baldes. Isso é feito usando o liquid sampler. Ele precisa de baldes vazios e deve ser colocado na água. - -A capacidade de processamento é de um balde de água a cada 8s. O liquid sampler requer 3 ku de energia. - -[ta2_liquidsampler|image] - -### TA2 Protected Chest - -O protected chest só pode ser usado por jogadores que têm permissão de construção neste local, ou seja, que têm direitos de proteção. Não importa quem coloca o baú. - -[ta2_chest|image] - -### Techage Forceload Block - -O Minetest divide o mapa em chamados map blocks. Estes são cubos com uma aresta de 16x16x16 blocos. Um map block é sempre completamente carregado pelo servidor, mas apenas os blocos ao redor de um jogador são carregados (aproximadamente 2-3 blocos em todas as direções). Na direção de visão do jogador, também existem mais map blocks. Apenas esta parte do mundo é ativa e apenas aqui as plantas e árvores crescem ou as máquinas funcionam. - -Com um bloco forceload, você pode forçar o map block em que o bloco forceload está localizado a permanecer carregado enquanto você estiver no servidor. Quando todos os seus campos e máquinas estão cobertos com blocos Forceload, tudo está sempre em execução. - -Os map blocks com suas coordenadas são predefinidos, por exemplo, (0,0,0) a (15,15,15), ou (16,16,16) a (31,31,31). -Você pode mover um bloco forceload dentro de um map block como quiser, a posição do map block permanece inalterada. - -[ta2_forceload|image] - - - - - - - - - - - - - - - - - diff --git a/techage/manuals/manual_ta3_DE.md b/techage/manuals/manual_ta3_DE.md deleted file mode 100644 index 3b2037b..0000000 --- a/techage/manuals/manual_ta3_DE.md +++ /dev/null @@ -1,912 +0,0 @@ -# TA3: Ölzeitalter - -Bei TA3 gilt es, die Dampf-betriebenen Maschinen durch leistungsfähigere und mit elektrischem Strom betriebene Maschinen abzulösen. - -Dazu musst du Kohlekraftwerke und Generatoren bauen. Bald wirst du sehen, dass dein Strombedarf nur mit Öl-betriebenen Kraftwerken zu decken ist. Also machst du dich auf die Suche nach Erdöl. Bohrtürme und Ölpumpen helfen die, an das Öl zu kommen. Schienenwege dienen dir zum Öltransport bis in die Kraftwerke. - -Das Industrielle Zeitalter ist auf seinem Höhepunkt. - -[techage_ta3|image] - - -## Kohlekraftwerk / Ölkraftwerk - -Das Kohlekraftwerk besteht aus mehreren Blöcken und muss wie im Plan rechts abgebildet, zusammen gebaut werden. Dazu werden die Blöcke TA3 Kraftwerks-Feuerbox, TA3 Boiler oben, TA3 Boiler unten, TA3 Turbine, TA3 Generator und TA3 Kühler benötigt. - -Der Boiler muss mit Wasser gefüllt werden. Dazu bis zu 10 Eimer Wasser in den Boiler füllen. -Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. -Wenn das Wasser heiß ist, kann der Generator gestartet werden. - -Das Kraftwerk kann alternativ auch mit einem Ölbrenner ausgestattet und dann mit Öl betrieben werden. -Das Öl kann über eine Pumpe und Ölleitung nachgefüllt werden. - -Das Kraftwerk liefert eine Leistung von 80 ku. - -[coalpowerstation|plan] - - -### TA3 Kraftwerks-Feuerbox / Power Station Firebox - -Teil des Kraftwerks. -Die Feuerbox muss mit Kohle oder Holzkohle gefüllt werden. Die Brenndauer ist abhängig von der Leistung, die vom Kraftwerk angefordert wird. Unter Volllast brennt Kohle 20 s und Holzkohle 60 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit). - -[ta3_firebox|image] - - -### TA3 Kraftwerks-Ölbrenner / TA3 Power Station Oil Burner - -Teil des Kraftwerks. - -Der Ölbrenner kann mit Erdöl, Schweröl, Naphtha oder Benzin gefüllt werden. Die Brenndauer ist abhängig von der Leistung, die vom Kraftwerk angefordert wird. Unter Volllast brennt Erdöl 15 s, Schweröl 20 s, Naphtha 22 s und Benzin 25 s. - -Unter Teillast entsprechend länger (50% Last = doppelte Zeit). - -Der Ölbrenner kann nur 50 Einheiten Kraftstoff aufnehmen. Ein zusätzlicher Öltank und eine Ölpumpe sind daher ratsam. - - -[ta3_oilbox|image] - - -### TA3 Boiler unten/oben - -Teil des Kraftwerk. Muss mit Wasser gefüllt werden. Wem kein Wasser mehr vorhanden ist oder die Temperatur zu weit absinkt, schaltet sich das Kraftwerk ab. Der Wasserverbrauch des TA3-Kessels ist durch den geschlossenen Dampfkreislauf viel geringer als bei der Dampfmachine. -Bei der Dampfmaschine geht bei jedem Kolbenhub etwas Wasser als Dampf verloren. - -[ta3_boiler|image] - - -### TA3 Turbine - -Die Turbine ist Teil des Kraftwerk. Sie muss neben den Generator gesetzt und über Dampfleitungen mit dem Boiler und dem Kühler, wie im Plan abgebildet, verbunden werden. - -[ta3_turbine|image] - - -### TA3 Generator - -Der Generator dient zur Stromerzeugung. Er muss über Stromkabel und Verteilerdosen mit den Maschinen verbunden werden. - -[ta3_generator|image] - - -### TA3 Kühler / Cooler - -Dient zur Abkühlung des heißen Dampfs aus der Turbine. Muss über Dampfleitungen mit dem Boiler und der Turbine, wie im Plan abgebildet, verbunden werden. - -[ta3_cooler|image] - - -## Elektrischer Strom - -In TA3 (und TA4) werden die Maschinen mit Strom angetrieben. Dazu müssen die Maschinen, Speichersysteme und Generatoren mit Stromkabel verbunden werden. -TA3 besitzt 2 Arten von Stromkabel: - -- Isolierte Kabel (TA Stromkabel) für die lokale Verkabelung im Boden oder in Gebäuden. Diese Kabel lassen sich in der Wand oder im Boden verstecken (können mit der Kelle "verputzt" werden). -- Überlandleitungen (TA Stromleitung) für Freiluftverkabelung über große Strecken. Diese Kabel sind geschützt, können also von anderen Spielern nicht entfernt werden. - -Mehrere Verbraucher, Speichersysteme und Generatoren können in einem Stromnetzwerk zusammen betrieben werden. Mit Hilfe der Verteilerdosen können so Netzwerke aufgebaut werden. -Wird zu wenig Strom bereitgestellt, gehen die Verbraucher aus. -In diesem Zusammenhang ist auch wichtig, dass die Funktionsweise von Forceload Blöcken verstanden wurde, denn bspw. Generatoren liefern nur Strom, wenn der entsprechende Map-Block geladen ist. Dies kann mit einen Forceload Block erzwungen werden. - -In TA4 kommt noch ein Kabel für die Solaranlage hinzu. - -[ta3_powerswitch|image] - -### Bedeutung von Speichersystemen - -Speichersysteme im Stromnetz erfüllen zwei Aufgaben: - -- Um Bedarfsspitzen abzufangen: Alle Generatoren liefern immer gerade soviel Leistung, wie benötigt wird. Werden aber Verbraucher ein/ausgeschaltet oder kommt es aus anderen Gründen zu Bedarfsschwankungen, so können Verbraucher kurzzeitig ausfallen. Um dies zu verhindern, sollte immer mindestens ein Akkublock in jedem Netzwerk vorhanden sein. Dieser dient als Puffer und gleicht diese Schwankungen im Sekundenbereich aus. -- Um regenerative Energie zu speichern: Solar und Wind stehen nicht 24 Stunden am Tag zur Verfügung. Damit die Stromversorgung nicht ausfällt, wenn kein Strom produziert wird, müssen ein oder mehrere Speichersysteme im Netzwerk verbaut werden. Alternativ können die Lücken auch mit Öl/Kohle-Strom überbrückt werden. - -Ein Speichersystem gibt seine Kapazität in kud an, also ku pro day (Tag). Bspw. ein Speichersystem mit 100 kud liefert 100 ku einen Spieltag lang, oder auch 10 ku für 10 Spieltage. - -Alle TA3/TA4 Energiequellen besitzen eine einstellbare Ladecharakteristik. Standardmäßig ist diese auf "80% - 100%" eingestellt. Dies bedeutet, dass die Leistung ab 80% Füllung des Speichersystems immer weiter reduziert wird, bis sie bei 100 % komplett abschaltet. Sofern Strom im Netzwerk benötigt wird, werden die 100 % nie erreicht, da die Leistung des Generators irgendwann auf den Strombedarf im Netzwerk abgesunken ist und damit das Speichersystem nicht mehr geladen, sondern nur noch die Verbraucher bedient werden. - -Dies hat mehrere Vorteile: - -- Die Ladecharakteristik ist einstellbar. Damit kann man bspw. Öl/Kohle Energiequellen bei 60% und die regenerativen Energiequellen erst bei 80% zurückfahren. Damit wird nur Öl/Kohle verbrannt, wenn nicht ausreichend regenerativen Energiequellen zur Verfügung stehen. -- Mehrere Energiequellen können parallel betrieben werden und werden dabei nahezu gleichmäßig belastet, denn alle Energiequellen arbeiten bspw. bis 80% Ladekapazität des Speichersystems mit ihrer vollen Leistung und fahren dann gleichzeitig ihre Leistung zurück. -- Alle Speichersysteme in einem Netzwerk bilden einen großen Puffer. An jedem Speichersystem aber auch am Strom Terminal kann immer die Ladekapazität und der Füllungsgrad des gesamten Speichersystems in Prozent abgelesen werden. - -[power_reduction|image] - - - - -### TA Stromkabel / Electric Cable - -Für die lokale Verkabelung im Boden oder in Gebäuden. -Abzweigungen können mit Hilfe von Verteilerdosen realisiert werden. Die maximale Kabellänge zwischen Maschinen oder Verteilerdosen beträgt 1000 m. Es können maximale 1000 Knoten in einem Strom-Netzwerk verbunden werden. Als Knoten zählen alle Blöcke mit Stromanschluss, also auch Verteilerdosen. - -Da die Stromkabel nicht automatisch geschützt sind, wird für längere Strecken die Überlandleitungen (TA Stromleitung) empfohlen. - -Stromkabel können mit der Kelle verputzt also in der Wand oder im Boden versteckt werden. Als Material zum Verputzen können alle Stein-, Clay- und sonstige Blöcke ohne "Intelligenz" genutzt werden. Erde (dirt) geht nicht, da Erde zu Gras oder ähnlichem konvertiert werden kann, was die Leitung zerstören würde. - -Zum Verputzen muss mit der Kelle auf das Kabel geklickt werden. Das Material, mit dem das Kabel verputzt werden soll, muss sich im Spieler-Inventar ganz links befinden. -Die Kabel können wieder sichtbar gemacht werden, indem man mit der Kelle wieder auf den Block klickt. - -Außer Kabel können auch die TA Verteilerdose und die TA Stromschalterbox verputzt werden. - -[ta3_powercable|image] - - -### TA Verteilerdose / Electric Junction Box - -Mit der Verteilerdose kann Strom in bis zu 6 Richtungen verteilt werden. Verteilerdosen können auch mit der Kelle verputzt (versteckt) und wieder sichtbar gemacht werden. - -[ta3_powerjunction|image] - - -### TA Stromleitung / Power Line - -Mit der TA Stromleitung und den Strommasten können halbwegs realistische Überlandleitungen realisiert werden. Die Strommasten-Köpfe dienen gleichzeitig zum Schutz der Stromleitung (Protection). Dazu muss alle 16 m oder weniger ein Masten gesetzt werden. Der Schutz gilt aber nur die die Stromleitung und die Masten, alle anderen Blöcke in diesem Bereich sind dadurch nicht geschützt. - -[ta3_powerline|image] - - -### TA Strommast / Power Pole -Dient zum Bauen von Strommasten. Ist durch den Strommast-Kopf vor Zerstörung geschützt und kann nur vom Besitzer wieder abgebaut werden. - -[ta3_powerpole|image] - - -### TA Strommastkopf / Power Pole Top -Hat bis zu vier Arme und erlaubt damit, Strom in bis zu 6 Richtungen weiter zu verteilen. -Der Strommastkopf schützt Stromleitungen und Masten in einem Radius von 8 m. - -[ta3_powerpole4|image] - - -### TA Strommastkopf 2 / Power Pole Top 2 - -Dieser Strommastkopf hat zwei feste Arme und wird für die Überlandleitungen genutzt. Er kann aber auch Strom nach unten und oben weiterleiten. -Der Strommastkopf schützt Stromleitungen und Masten in einem Radius von 8 m. - -[ta3_powerpole2|image] - - -### TA Stromschalter / Power Switch - -Mit dem Schalter kann der Strom ein- und ausgeschaltet werden. Der Schalter muss dazu auf eine Stromschalterbox gesetzt werden. Die Stromschalterbox muss dazu auf beiden Seiten mit dem Stromkabel verbunden sein. - -[ta3_powerswitch|image] - - -### TA Stromschalter klein / Power Switch Small - -Mit dem Schalter kann der Strom ein- und ausgeschaltet werden. Der Schalter muss dazu auf eine Stromschalterbox gesetzt werden. Die Stromschalterbox muss dazu auf beiden Seiten mit dem Stromkabel verbunden sein. - -[ta3_powerswitchsmall|image] - - -### TA Stromschalterbox / Power Switch Box - -siehe TA Stromschalter. - -[ta3_powerswitchbox|image] - - -### TA3 Kleiner Stromgenerator / Tiny Power Generator - -Der kleine Stromgenerator wird mit Benzin betrieben und kann für kleine Verbraucher mit bis zu 12 ku genutzt werden. Unter Volllast brennt Benzin 150 s. Unter Teillast entsprechend länger (50% Last = doppelte Zeit). - -Der Stromgenerator kann nur 50 Einheiten Benzin aufnehmen. Ein zusätzlicher Tank und eine Pumpe sind daher ratsam. - - -[ta3_tinygenerator|image] - - -### TA3 Akku Block / TA3 Accu Box - -Der Akku Block dient zur Speicherung von überschüssiger Energie und gibt bei Stromausfall automatisch Strom ab (soweit vorhanden). -Mehrere Akku Blocks zusammen bilden ein TA3 Energiespeichersystem. Jeder Akku Block hat eine Anzeige für den Ladezustand und für die gespeicherte Ladung, wobei hier immer die Werte für das gesamte Netzwerk angezeigt werden. Die gespeicherte Ladung wird in "kud" also "ku-days" angezeigt (analog zu kWh) 5 kud entspricht damit bspw. 5 ku für einen Spieltag (20 min) oder 1 ku für 5 Spieltage. - -Ein Akku Block hat 3.33 kud. - -[ta3_akkublock|image] - - -### TA3 Strom Terminal / Power Terminal - -Das Strom-Terminal muss mit dem Stromnetz verbunden werden. Es zeigt Daten aus dem Stromnetz an. - -In der oberen Hälfte werden die wichtigsten Größen ausgegeben: - -- aktuelle/maximale Generatorleistung -- aktueller Stromaufnahme aller Verbraucher -- aktueller Ladestrom in/aus dem Speichersystems -- aktuellen Ladezustand des Speichersystems in Prozent - -In der unteren Hälfte wird die Anzahl der Netzwerkblöcke ausgegeben. - -Über den Reiter "console" können weitere Daten zu den Generatoren und Speichersystemen abgefragt werden. - -[ta3_powerterminal|image] - - -### TA3 Elektromotor / TA3 Electric Motor - -Um TA2 Maschinen über das Stromnetz betreiben zu können, wird der TA3 Elektromotor benötigt. Dieser wandelt Strom in Achsenkraft um. -Wird der Elektromotor nicht mit ausreichend Strom versorgt, geht er in einen Fehlerzustand und muss über einen Rechtsklick wieder aktiviert werden. - -Das Elektromotor nimmt primär max. 40 ku an Strom auf und gibt sekundär max. 39 ku als Achsenkraft wieder ab. Er verbraucht also ein ku für die Umwandlung. - -[ta3_motor|image] - - - -## TA3 Industrieofen - -Der TA3 Industrieofen dient als Ergänzung zu normalen Ofen (furnace). Damit können alle Waren mit "Koch" Rezepten, auch im Industrieofen hergestellt werden. Es gibt aber auch spezielle Rezepte, die nur im Industrieofen hergestellt werden können. -Der Industrieofen hat sein eigenes Menü zur Rezeptauswahl. Abhängig von den Waren im Industrieofen Inventar links kann rechts das Ausgangsprodukt gewählt werden. - -Der Industrieofen benötigt Strom (für das Gebläse) sowie Schweröl/Benzin für den Brenner. Der Industrieofen muss wie im Plan rechts abgebildet, zusammen gebaut werden. - -Siehe auch TA4 Ofenheizung. - -[ta3_furnace|plan] - - -### TA3 Ofen-Ölbrenner / Furnace Oil Burner - -Ist Teil des TA3 Industrieofen. - -Der Ölbrenner kann mit Erdöl, Schweröl, Naphtha oder Benzin betrieben werden. Die Brennzeit beträgt für Erdöl 65 s, Schweröl 80 s, Naphtha 90 s und Benzin 100 s. - -Der Ölbrenner kann nur 50 Einheiten Kraftstoff aufnehmen. Ein zusätzlicher Tank und eine Pumpe sind daher ratsam. - -[ta3_furnacefirebox|image] - - -### TA3 Ofenoberteil / Furnace Top - -Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen. - -[ta3_furnace|image] - - -### TA3 Gebläse / Booster - -Ist Teil des TA3 Industrieofen. Siehe TA3 Industrieofen. - -[ta3_booster|image] - - -## Flüssigkeiten - -Flüssigkeiten wie Wasser oder Öl können nur die spezielle Leitungen gepumpt und in Tanks gespeichert werden. Wie auch bei Wasser gibt es aber Behälter (Kanister, Fässer), in denen die Flüssig gelagert und transportiert werden kann. - -Über die gelben Leitungen und Verbindungsstücke ist es auch möglich, mehrere Tanks zu verbinden. Allerdings müssen die Tanks den selben Inhalt haben und zwischen Tank, Pumpe und Verteiler muss immer mindestens eine gelbe Leitung sein. - -Bspw. zwei Tanks direkt mit einem Verteilerstück zu verbinden, geht nicht. - -Um Flüssigkeiten von Behältern nach Tanks umzufüllen, dient der Einfülltrichter. Im Plan ist dargestellt, wie Kanistern oder Fässer mit Flüssigkeiten über Schieber in einen Einfülltrichter geschoben werden. Im Einfülltrichter wird der Behälter geleert und die Flüssigkeit nach unten in den Tank geleitet. - -Der Einfülltrichter kann auch unter einen Tank gesetzt werden, um den Tank zu leeren. - -[ta3_tank|plan] - - -### TA3 Tank / TA3 Tank - -In einem Tank können Flüssigkeiten gespeichert werden. Ein Tank kann über eine Pumpe gefüllt bzw. geleert werden. Dazu muss die Pumpe über einer Leitung (gelbe Röhre) mit dem Tank verbunden sein. - -Ein Tank kann auch von Hand gefüllt oder geleert werden, indem mit einem vollen oder leeren Flüssigkeitsbehälter (Fass, Kanister) auf den Tank geklickt wird. Dabei ist zu beachten, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank, muss dieser Rest mit Kanistern entnommen oder leergepumpt werden. - -In einen TA3 Tank passen 1000 Einheiten oder 100 Fässer einer Flüssigkeit. - -[ta3_tank|image] - - -### TA3 Pumpe / TA3 Pump - -Mit der Pumpe können Flüssigkeiten von Tanks oder Behältern zu anderen Tanks oder Behältern gepumpt werden. Bei der Pumpe muss die Pumprichtung (Pfeil) beachtet werden. Über die gelben Leitungen und Verbindungsstücke ist es auch möglich, mehrere Tanks auf jeder Seite der Pumpe anzuordnen. Allerdings müssen die Tanks den selben Inhalt haben. - -Die TA3 Pumpe pumpt 4 Einheiten Flüssigkeit alle zwei Sekunden. - -Hinweis 1: Die Pumpe darf nicht direkt neben den Tank platziert werden. Es muss immer mindestens ein Stück gelbe Leitung dazwischen sein. - -Hinweis 2: Nach dem Starten markiert die Pumpe 10 x die Blöcke, von und zu denen gepumpt wird. - -[ta3_pump|image] - - -### TA Einfülltrichter / TA Liquid Filler - -Um Flüssigkeiten zwischen Behältern und Tanks umzufüllen, dient der Einfülltrichter. - -- wird der Einfülltrichter unter einen Tank gesetzt und werden leere Fässer mit einem Schieber oder von Hand in den Einfülltrichter gegeben, wird der Tankinhalt in die Fässer umgefüllt und die Fässer können ausgangsseitig wieder entnommen werden -- wird der Einfülltrichter auf einen Tank gesetzt und werden volle Fässer mit einem Schieber oder von Hand in den Einfülltrichter gegeben, werden diese in den Tank umgefüllt und die Fässer können ausgangsseitig wieder entnommen werden - -Dabei ist zu beachten, dass Fässer nur komplett gefüllt oder entleert werden können. Sind bspw. weniger als 10 Einheiten im Tank, muss dieser Rest mit Kanistern entnommen oder leergepumpt werden. - -[ta3_filler|image] - -### TA4 Röhre / Pipe - -Die gelben Röhren dienen zur Weiterleitung von Gas und Flüssigkeiten. -Die maximale Leitungslänge beträgt 100 m. - -[ta3_pipe|image] - -### TA3 Rohr/Wanddurchbruch / TA3 Pipe Wall Entry Blöcke - -Die Blöcke dienen als Wanddurchbrüche für Röhren, so dass keine Löcher offen bleiben. - -[ta3_pipe_wall_entry|image] - -### TA Ventil / TA Valve - -Für die gelben Röhren gibt es ein Ventil, welches über Mausklicks geöffnet und geschlossen werden kann. -Das Ventil kann auch über on/off Kommandos angesteuert werden. - -[ta3_valve|image] - - - -## Öl-Förderung - -Um deine Generatoren und Öfen mit Öl betreiben zu können, muss du zuerst nach Öl suchen und einen Bohrturm errichten und danach das Öl fördern. -Dazu dienen dir TA3 Ölexplorer, TA3 Ölbohrkiste und TA3 Ölpumpe. - -[techage_ta3|image] - - -### TA3 Ölexplorer / Oil Explorer - -Mit dem Ölexplorer kannst du nach Öl suchen. Dazu den Block auf den Boden setzen und mit Rechtsklick die Suche starten. Der Ölexplorer kann oberirdisch und unterirdisch in allen Tiefen eingesetzt werden. -Über die Chat-Ausgabe wird dir angezeigt, in welcher Tiefe nach Öl gesucht wurde und wie viel Öl (oil) gefunden wurde. -Du kannst mehrfach auf den Block klicken, um auch in tieferen Bereichen nach Öl zu suchen. Ölfelder haben eine Größe von 4000 bis zu 20000 Items. - -Falls die Suche erfolglos war, musst du den Block ca. 16 m weiter setzen. -Der Ölexplorer sucht immer innerhalb des ganzen Map-Blocks und darunter nach Öl, in dem er gesetzt wurde. Eine erneute Suche im gleichen Map-Block (16x16 Feld) macht daher keinen Sinn. - -Falls Öl gefunden wurde, wird die Stelle für den Bohrturm angezeigt. Du musst den Bohrturm innerhalb des angezeigten Bereiches errichten, die Stelle am besten gleich mit einem Schild markieren und den ganzen Bereich gegen fremde Spieler schützen. - -Gib die Suche nach Öl nicht zu schnell auf. Es kann wenn du Pech hast, sehr lange dauern, bis du eine Ölquelle gefunden hast. -Es macht auch keinen Sinn, einen Bereich den ein anderer Spieler bereits abgesucht hat, nochmals abzusuchen. Die Chance, irgendwo Öl zu finden, ist für alle Spieler gleich. - -Der Ölexplorer kann immer wieder zur Suche nach Öl eingesetzt werden. - -[ta3_oilexplorer|image] - - -### TA3 Ölbohrkiste / Oil Drill Box - -Die Ölbohrkiste muss an die Stelle gesetzt werden, die vom Ölexplorer angezeigt wurde. An anderen Stellen nach Öl zu bohren ist zwecklos. -Wird auf den Button der Ölbohrkiste geklickt, wird über der Kiste ein Bohrturm errichtet. Dies dauert einige Sekunden. -Die Ölbohrkiste hat 4 Seiten, bei IN muss das Bohrgestänge über Schieber angeliefert und bei OUT muss das Bohrmaterial abtransportiert werden. Über eine der anderen zwei Seiten muss die Ölbohrkiste mit Strom versorgt werden. - -Die Ölbohrkiste bohrt bis zum Ölfeld (1 Meter in 16 s) und benötigt dazu 16 ku Strom. -Wurde das Ölfeld erreicht, kann der Bohrturm abgebaut und die Kiste entfernt werden. - -[ta3_drillbox|image] - - -### TA3 Ölpumpe / Oil Pumpjack - -An die Stelle der Ölbohrkiste muss nun die Ölpumpe platziert werden. Auch die Ölpumpe benötigt Strom (16 ku) und liefert alle 8 s ein Einheit Erdöl. Das Erdöl muss in einem Tank gesammelt werden. Dazu muss die Ölpumpe über eine Leitung (gelbe Röhre) mit dem Tank verbunden werden. -Ist alles Öl abgepumpt, kann auch die Ölpumpe wieder entfernt werden. - -[ta3_pumpjack|image] - - -### TA3 Bohrgestänge / Drill Pipe - -Das Bohrgestänge wird für die Bohrung benötigt. Es werden so viele Bohrgestänge Items benötigt wie als Tiefe für das Ölfeld angegeben wurde. Das Bohrgestänge ist nach der Bohrung nutzlos, kann aber auch nicht abgebaut werden und verbleibt im Boden. Es gibt aber ein Werkzeug, um die Bohrgestänge Blöcke wieder entfernen zu können (-> Werkzeuge -> TA3 Bohrgestängezange). - -[ta3_drillbit|image] - - -### Öltank / Oil Tank - -Der Öltank ist die große Ausführung des TA3 Tanks (siehe Flüssigkeiten -> TA3 Tank). - -Der große Tank kann 4000 Einheiten Öl, aber auch jede andere Art von Flüssigkeit aufnehmen. - -[oiltank|image] - - - -## Öl-Transport - -### Öl-Transport mit dem Tankwagen -Um Öl von der Ölquelle zur Ölverarbeitungsanlage zu befördern, können Tankwagen (tank carts) genutzt werden. Ein Tankwagen kann direkt über Pumpen gefüllt bzw. geleert werden. In beiden Fällen muss die gelbe Röhre von oben mit dem Tankwagen verbunden werden. - -Dazu sind folgende Schritte notwendig: - -- Den Tankwagen vor den Prellbock setzen. Der Prellbock darf noch nicht mit einer Zeit programmiert sein, so dass der Tankwagen nicht automatisch losfährt -- Den Tankwagen über gelbe Röhren mit der Pumpe verbinden -- Pumpe einschalten -- Prellbock mit einer Zeit (10 - 20 s) programmieren - -Diese Reihenfolge muss auf beiden Seiten /Füllen/Leeren) eingehalten werden. - -[tank_cart|image] - -### Öl-Transport mit Fässern über Minecarts -In die Minecarts können Kanister und Fässer geladen werden. Das Öl muss dazu zuvor in Fässer umgeladen werden. Die Ölfässer können direkt mit einem Schieber und Röhren in das Minecart geschoben werden (siehe Plan). Die leeren Fässer, welche per Minecart von der Entladestation zurück kommen, können über einen Hopper entladen werden, der unter der Schiene an der Haltestelle platziert wird. - -Es ist mit dem Hopper nicht möglich, an **einer** Haltestelle sowohl die leeren Fässer zu entladen, als auch die vollen Fässer zu beladen. Der Hopper lädt die vollen Fässer sofort wieder aus. Daher ist es ratsam, jeweils 2 Stationen auf der Be- und Entladeseite einzurichten und den Minecart dann über eine Aufzeichnungsfahrt entsprechend zu programmieren. - -Der Plan zeigt, wie das Öl in einen Tank gepumpt und über einen Einfülltrichter in Fässer umgefüllt und in Minecarts geladen werden kann. - -Damit die Minecarts automatisch wieder starten, müssen die Prellböcke mit Stationsname und Wartezeit konfiguriert werden. Für das Entladen reichen 5 s. Da aber die Schieber immer für mehrere Sekunden in den Standby fallen, wenn kein Minecart da ist, muss für das Beladen eine Zeit von 15 oder mehr Sekunden eingegeben werden. - -[ta3_loading|plan] - - -### Tankwagen / Tank Cart - -Der Tankwagen dient zum Transport von Flüssigkeiten. Es kann wie Tanks mit Pumpen gefüllt bzw. geleert werden. In beiden Fällen muss die gelbe Röhre von oben mit dem Tankwagen verbunden werden. - -In den Tankwagen passen 200 Einheiten. - -[tank_cart|image] - -### Kistenwagen / Chest Cart - -Der Kistenwagen dient zum Transport von Items. Es kann wie Kisten über Schieber gefüllt bzw. geleert werden. - -In den Kistenwagen passen 4 Stacks. - -[chest_cart|image] - - - -## Öl-Verarbeitung - -Öl ist ein Stoffgemisch und besteht aus sehr vielen Komponenten. Über einen Destillationsturm kann das Öl in seine Hauptbestandteile wie Bitumen, Schweröl, Naphtha, Benzin und Gas zerlegt werden. -Die weitere Verarbeitung zu Endprodukten erfolgt im Chemischen Reaktor. - -[techage_ta31|image] - - -### Destillationsturm / distiller tower - -Der Destillationsturm muss wie im Plan rechts oben aufgebaut werden. -Über den Basisblock wird das Bitumen abgelassen. Der Ausgang ist auf der Rückseite des Basisblocks (Pfeilrichtung beachten). -Auf diesen Basisblock kommen die "Destillationsturm" Blöcke mit den Nummern: 1, 2, 3, 2, 3, 2, 3, 4 -An den Öffnungen von unten nach oben werden Schweröl, Naphtha und Benzin abgeleitet. Ganz oben wird das Propangas abgefangen. -Es müssen alle Öffnungen am Turm mit Tanks verbunden werden. -Der Aufkocher (reboiler) muss mit dem Block "Destillationsturm 1" verbunden werden. - -Der Aufkocher benötigt Strom (nicht im Plan zu sehen)! - - -[ta3_distiller|plan] - -#### Aufkocher / reboiler) - -Der Aufkocher erhitzt das Erdöl auf ca. 400°C. Dabei verdampft es weitgehend und wird in den Destillationsturm zur Abkühlung geleitet. - -Der Aufkocher benötigt 14 Einheiten Strom und produziert alle 16 s jeweils eine Einheit Bitumen, Schweröl, Naphtha, Benzin und Propangas. -Dazu muss der Aufkocher über einen Pumpe mit Erdöl versorgt werden. - -[reboiler|image] - - -## Logik-/Schalt-Blöcke - -Neben den Röhren für Warentransport, sowie den Gas- und Stromleitungen gibt es auch noch eine drahtlose Kommunikationsebene, über die Blöcke untereinander Daten austauschen können. Dafür müssen keine Leitungen gezogen werden, sondern die Verbindung zwischen Sender und Empfänger erfolgt nur über die Blocknummer. - -**Info:** Eine **Blocknummer** ist eine eindeutige Zahl, die von Techage beim Setzen von vielen Techage Blöcken generiert wird. Die Blocknummer dient zur Adressierung bei der Kommunikation zwischen Techage Controllern und Maschinen. Alle Blöcke, die an dieser Kommunikation teilnehmen können, zeigen die Blocknummer als Info-Text an, wenn man mit dem Mauscursor den Block fixiert. - -Welche Kommandos ein Block unterstützt, kann mit dem TechAge Info Werkzeug (Schraubenschlüssel) ausgelesen und angezeigt werden. -Die einfachsten Kommandos, die von fast allen Blöcken unterstützt werden, sind: - -- `on` - Block/Maschine/Lampe einschalten -- `off` - Block/Maschine/Lampe ausschalten - -Mir Hilfe des TA3 Terminal können diese Kommandos sehr einfach ausprobiert werden. Angenommen, eine Signallampe hat die Nummer 123. -Dann kann mit: - - cmd 123 on - -die Lampe ein, und mit: - - cmd 123 off - -die Lampe wieder ausgeschaltet werden. Diese Kommandos müssen so in das Eingabefeld des TA3 Terminals eingegeben werden. - -Kommandos wie `on` und `off` werden zum Empfänger gesendet, ohne dass eine Antwort zurück kommt. Diese Kommandos können daher bspw. mit einem Taster/Schalter auch gleichzeitig an mehrere Empfänger gesendet werden, wenn dort im Eingabefeld mehrere Nummern eingegeben werden. - -Ein Kommandos wie `state` fordert den Status eines Blockes an. Der Block sendet in Folge seinen Status zurück. Diese Art von bestätigten Kommandos kann gleichzeitig nur an einen Empfänger gesendet werden. -Auch dieses Kommandos kann mit dem TA3 Terminal bspw. an einem Schieber ausprobiert werden: - - cmd 123 state - -Mögliche Antworten des Schiebers sind: -- `running` --> bin am arbeiten -- `stopped` --> ausgeschaltet -- `standby` --> nichts zu tun, da Quell-Inventar leer -- `blocked` --> kann nichts tun, da Ziel-Inventar voll - -Dieser Status und weitere Informationen werden auch ausgegeben, wenn mit dem Schraubenschlüssel auf den Block geklickt wird. - -[ta3_logic|image] - - -### TA3 Taster/Schalter / Button/Switch - -Der Taster/Schalter sendet `on`/`off` Kommandos zu den Blöcken, die über die Nummern konfiguriert wurden. -Der Taster/Schalter kann als Taster (button) oder Schalter (switch) konfiguriert werden. Wird er als Taster konfiguriert, so kann die Zeit zwischen den `on` und `off` Kommandos eingestellt werden. Mit der Betriebsart "on button" wird nur ein `on` und kein `off` Kommandos gesendet. - -Über die Checkbox "public" kann eingestellt werden, ob den Taster von jedem (gesetzt), oder nur vom Besitzer selbst (nicht gesetzt) genutzt werden darf. - -Hinweis: Mit dem Programmer können Blocknummern sehr einfach eingesammelt und konfiguriert werden. - -[ta3_button|image] - -### TA3 Kommando Konverter / Command Converter - -Mit dem TA3 Kommando Konverter können `on` / `off` Kommandos in andere Kommandos umgewandelt werden, sowie die Weiterleitung verhindert oder verzögert werden. Die Nummer des Zielblockes bzw. die Nummern der Zielblöcke, die Kommandos die gesendet werden sollen, sowie die Verzögerungszeiten in Sekunden müssen eingegeben werden. Wird kein Kommando eingegeben, wird nichts gesendet. - -Die Nummern können auch mit Hilfe des Techage Programmers programmiert werden. - -[ta3_command_converter|image] - -### TA3 Flipflop / Flip-Flop - -Das TA3 Flipflop wechselt seinen Zustand mit jedem empfangenen `on` Kommando. Empfangene `off` Kommandos werden ignoriert. Damit werden abhängig vom Zustandswechsel abwechselnd `on` / `off` Kommandos gesendet. Die Nummer des Zielblockes bzw. die Nummern der Zielblöcke müssen eingegeben werden. Die Nummern können auch mit Hilfe des Techage Programmers programmiert werden. - -Damit lassen sich bspw. Lampen mit Hilfe von Tastern ein- und wieder ausschalten. - -[ta3_flipflop|image] - -### TA3 Logikblock / Logic Block - -Den TA3 Logikblock kann man so programmieren, dass ein oder mehrere Eingangskommandos zu einem Ausgangskommando verknüpft und gesendet werden. Dieser Block kann daher diverse Logik-Elemente wie AND, OR, NOT, XOR usw. ersetzen. -Eingangkommandos für den Logikblock sind `on`/`off` Kommandos. -Eingangskommandos werden über die Nummer referenziert, also bspw. `1234` für das Kommando vom Sender mit der Nummer 1234. -Das gleiche gilt für Ausgangskommandos. - -Eine Regel ist wie folgt aufgebaut: - -``` - = on/off if is true -``` - -`` ist die Nummer des Blocks, zu dem das Kommando gesendet werden soll. -`` ist ein boolescher Ausdruck, bei dem Eingabenummern ausgewertet werden. - - - -**Beispiele für den Input Ausdruck** - -Signal negieren (NOT): - - 1234 == off - -Logisches UND (AND): - - 1234 == on and 2345 == on - -Logisches ODER (OR): - - 1234 == on or 2345 == on - -Folgende Operatoren sind zulässig: `and` `or` `on` `off` `me` `==` `~=` `(` `)` - -Ist der Ausdruck wahr (true), wird ein Kommando an den Block mit der `` Nummer gesendet. - -Es können bis zu vier Regeln definiert werden, wobei immer alle Regeln geprüft werden, wenn ein Kommando empfangen wird. - -Die interne Durchlaufzeit aller Kommandos beträgt 100 ms. - -Über das Schlüsselwort `me` kann die eigene Knotennummer referenziert werden. Damit ist es möglich, dass sich der Block selbst ein Kommando sendet (Flip-Flop Funktion). - -Die Sperrzeit definiert eine Pause nach einem Kommando, in der der Logikblock kein weiteres Kommando von extern annimmt. Empfangene Kommandos in der Sperrzeit werden damit verworfen. Die Sperrzeit kann in Sekunden definiert werden. - -[ta3_logic|image] - - -### TA3 Wiederholer / Repeater - -Der Wiederholer (repeater) sendet das empfangene Signal an alle konfigurierten Nummern weiter. -Dies kann bspw. Sinn machen, wenn man viele Blöcke gleichzeitig angesteuert werden sollen. Den Wiederholer kann man dazu mit dem Programmer konfigurieren, was nicht bei allen Blöcken möglich ist. - -[ta3_repeater|image] - - -### TA3 Sequenzer / Sequencer - -Der Sequenzer kann eine Reihe von `on`/`off` Kommandos senden, wobei der Abstand zwischen den Kommandos in Sekunden angegeben werden muss. Damit kann man bspw. eine Lampe blinken lassen. -Es können bis zu 8 Kommandos konfiguriert werden, jedes mit Zielblocknummer und Anstand zum nächsten Kommando. -Der Sequenzer wiederholt die Kommandos endlos, wenn "Run endless" gesetzt wird. -Wird also Kommando nichts ausgewählt, wird nur die angegeben Zeit in Sekunden gewartet. - -[ta3_sequencer|image] - - -### TA3 Timer - -Der Timer kann Kommandos Spielzeit-gesteuert senden. Für jede Kommandozeile kann die Uhrzeit, die Zielnummer(n) und das Kommando selbst angegeben werden. Damit lassen sich bspw. Lampen abends ein- und morgens wieder ausschalten. - -[ta3_timer|image] - - -### TA3 Terminal - -Das Terminal dient in erster Linie zum Austesten der Kommandoschnittstelle anderer Blöcke (siehe "Logik-/Schalt-Blöcke"). -Man kann aber auch Kommandos auf Tasten legen und so das Terminal produktiv nutzen. - - set - -Mit `set 1 ON cmd 123 on` kann bspw. die Usertaste 1 mit dem Kommando `cnd 123 on` programmiert werden. Wird die Taste gedrückt, wird das Kommando gesendet und die Antwort auf dem Bildschirm ausgegeben. - -Das Terminal besitzt folgende, lokalen Kommandos: -- `clear` lösche Bildschirm -- `help` gib eine Hilfeseite aus -- `pub` schalte in den öffentlichen Modus um -- `priv` schalte in den privaten Modus um - -Im privaten Modus (private) kann das Terminal nur von Spielern verwendet werden, die an diesem Ort bauen können, also Protection Rechte besitzen. Im öffentlichen Modus (public) können alle Spieler die vorkonfigurierten Tasten verwenden. - -[ta3_terminal|image] - - -### TechAge Farblampe / Color Lamp - -Die Farblampe kann mit `on`/`off` Kommando ein- bzw. ausgeschaltet werden. Diese Lampe braucht keinen Strom und -kann mit der Spritzpistole aus der Mod "Unified Dyes" und über Lua/Beduino Kommandos eingefärbt werden. - -Mit dem Chat-Kommando `/ta_color` wird die Farbpalette mit den Werten für die Lua/Beduino Kommandos angezeigt und mit `/ta_send color ` kann die Farbe geändert werden. - -[ta3_colorlamp|image] - - -### Tür/Tor Blöcke / Door/Gate Blocks - -Mit diese Blöcken kann man Türe und Tore realisieren, die über Kommandos geöffnet (Blöcke verschwinden) und wieder geschlossen werden können. Pro Tor oder Tür wird dazu ein Tür Controller benötigt. - -Das Aussehen der Blöcke kann über das Block-Menü eingestellt werden. -Damit lassen sich Geheimtüren realisieren, die sich nur bei bestimmten Spielern öffnen (mit Hilfe des Spieler-Detektors). - -[ta3_doorblock|image] - - - -### TA3 Tür Controller / Door Controller - -Der Tür Controller dient zur Ansteuerung der TA3 Tür/Tor Blöcke. Beim Tür Controller müssen die Nummern der Tür/Tor Blöcke eingegeben werden. Wird ein `on`/`off` Kommando Kommando an den Tür Controller gesendet, öffnet/schließt dieser die Tür bzw. das Tor. - -[ta3_doorcontroller|image] - -### TA3 Tür Controller II / Door Controller II - -Der Tür Controller II kann alle Arten von Blöcken entfernen und wieder setzen. Um den Tür Controller II anzulernen, muss der "Aufzeichnen" Button gedrückt werden. Dann müssen alle Blöcke angeklickt werden, die Teil der Tür / des Tores sein sollen. Danach muss der "Fertig" Button gedrückt werden. Es können bis zu 16 Blöcke ausgewählt werden. Die entfernten Blöcke werden im Inventar des Controllers gespeichert. - - Über die Tasten "Entfernen" bzw. "Setzen" kann die Funktion des Controllers von Hand getestet werden. - -Wird ein `on` / `off` Kommando an den Tür Controller II gesendet, entfernt bzw. setzt er die Blöcke ebenfalls. - -Mit `$send_cmnd(node_number, "exchange", 2)` können einzelne Böcke gesetzt, entfernt, bzw. durch andere Blöcke aus dem Inventar ersetzt werden. - -Mit `$send_cmnd(node_number, "set", 2)` kann ein Block aus dem Inventory explizit gesetzt werden, sofern der Inventory Slot nicht leer ist. - -Mit `$send_cmnd(node_number, "dig", 2)` kann ein Block wieder entfernt werden, sofern der Inventory Slot leer ist. - -Mit `$send_cmnd(node_number, "get", 2)` wird der Name des gesetzten Blocks zurückgeliefert. - -Die Slot-Nummer des Inventars (1 .. 16) muss in allen drei Fällen als payload übergeben werden. - -Damit lassen sich auch ausfahrbare Treppen und ähnliches simulieren. - -[ta3_doorcontroller|image] - -### TA3 Sound Block - -Mir dem Sound Block können veschiedene Sounds/Laute abgespielt werden. Es sind alle Sounds der Mods Techage, Signs Bot, Hyperloop, Unified Inventory, TA4 Jetpack und Minetest Game verfügbar. - -Die Sounds können über das Menü und über ein Kommando ausgewählt und abgespielt werden. - -- Kommando `on` zum Abspielen eines Sounds -- Kommando `sound ` zur Auswahl eines Sounds über den Index -- Kommando `gain ` zum Einstellen der Lautstärke über den `` Wert (1 bis 5). - -[ta3_soundblock|image] - -### TA3 Mesecons Umsetzer / TA3 Mesecons Converter - -Der Mesecons Umsetzer dient zur Umwandlung von Techage on/off Kommandos in Mesecons Signale und umgekehrt. -Dazu müssen eine oder mehrere Knotennummern eingegeben und der Konverter mit Mesecons Blöcken -über Mesecons Leitungen verbunden werden. Den Mesecons Umsetzer kann man auch mit dem Programmer konfigurieren. -Der Mesecons Umsetzer akzeptiert bis zu 5 Kommandos pro Sekunde, bei höherer Belastung schaltet er sich ab. - -**Dieser Block existiert aber nur, wenn die Mod mesecons aktiv ist!** - -[ta3_mesecons_converter|image] - - -## Detektoren - -Detektoren scannen ihre Umgebung ab und senden ein `on`-Kommando, wenn das Gesuchte erkannt wurde. - -[ta3_nodedetector|image] - - -### TA3 Detektor / Detector - -Der Detektor ist eine spezieller Röhrenblock, der erkennt, wenn Items über die Röhre weitergegeben werden. Es muss dazu auf beiden Seiten mit der Röhre verbunden sein. Werden Items mit einem Schieber in den Detektor geschoben, gibt er diese automatisch weiter. -Er sendet ein `on`, wenn ein Item erkannt wird, gefolgt von einem `off` eine Sekunde später. -Danach werden weitere Kommando für 8 Sekunden blockiert. -Die Wartezeit, sowie die Items, die ein Kommando auslösen sollen, können über das Gabelschlüssel-Menü konfiguriert werden. - - -[ta3_detector|image] - - -### TA3 Wagen Detektor / Cart Detector - -Der Wagen Detektor sendet ein `on`-Kommando, wenn er einen Wagen/Cart (Minecart) direkt vor sich erkannt hat. Zusätzlich kann der Detektor auch den Wagen wieder starten, wenn ein `on`-Kommando empfangen wird. - -Der Detektor kann auch mit seiner eigenen Nummer programmiert werden. In diesem Falle schiebt er alle Wagen an, die in seiner Nähe (ein Block in alle Richtungen) zum Halten kommen. - -[ta3_cartdetector|image] - - -### TA3 Block Detektor / Node Detector - -Der Block Detektor sendet ein `on`-Kommando, wenn er erkennt, dass Blöcke vor ihm erscheinen oder verschwinden, muss jedoch entsprechend konfiguriert werden. Nach dem Zurückschalten des Detektors in den Standardzustand (grauer Block) wird ein `off`-Kommando gesendet. Gültige Blöcke sind alle Arten von Blöcken und Pflanzen, aber keine Tiere oder Spieler. Die Sensorreichweite beträgt 3 Blöcke/Meter in Pfeilrichtung. - -[ta3_nodedetector|image] - - -### TA3 Spieler Detektor / Player Detector - -Der Spieler Detektor sendet ein `on`-Kommando, wenn er einen Spieler in einem Umkreis von 4 m um den Block herum erkennt. Verlässt der Spieler wieder den Bereich, wird ein `off`-Kommando gesendet. -Soll die Suche auf bestimmte Spieler eingegrenzt werden, so können diese Spielernamen auch eingegeben werden. - -[ta3_playerdetector|image] - - -### TA3 Lichtdetektor - -Der Lichtdetektor sendet einen `on`-Kommando, wenn der Lichtpegel des darüber liegenden Blocks einen bestimmten Pegel überschreitet, der über das Rechtsklickmenü eingestellt werden kann. -Mit einen TA4 Lua Controller kann die genaue Lichtstärke mit $get_cmd(num, 'light_level') ermitteln werden. - -[ta3_lightdetector|image] - - -## TA3 Maschinen - -Bei TA3 existieren die gleichen Maschinen wie bei TA2, nur sind diese hier leistungsfähiger und benötigen Strom statt Achsenantrieb. -Im folgenden sind daher nur die unterschiedlichen, technischen Daten angegeben. - -[ta3_grinder|image] - - -### TA3 Schieber / Pusher - -Die Funktion entspricht der von TA2. -Die Verarbeitungsleistung beträgt 6 Items alle 2 s. - -[ta3_pusher|image] - - -### TA3 Verteiler / Distributor - -Die Funktion des TA3 Verteilers entspricht der von TA2. -Die Verarbeitungsleistung beträgt 12 Items alle 4 s. - -[ta3_distributor|image] - - -### TA3 Autocrafter - -Die Funktion entspricht der von TA2. -Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Autocrafter benötigt hierfür 6 ku Strom. - -[ta3_autocrafter|image] - - -### TA3 Elektronikfabrik / Electronic Fab - -Die Funktion entspricht der von TA2, nur werden hier TA4 WLAN Chips produziert. -Die Verarbeitungsleistung beträgt ein Chip alle 6 s. Der Block benötigt hierfür 12 ku Strom. - -[ta3_electronicfab|image] - - -### TA3 Steinbrecher / Quarry - -Die Funktion entspricht der von TA2. -Die maximale Tiefe beträgt 40 Meter. Der Steinbrecher benötigt 12 ku Strom. - -[ta3_quarry|image] - - -### TA3 Kiessieb / Gravel Sieve - -Die Funktion entspricht der von TA2. -Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Block benötigt 4 ku Strom. - -[ta3_gravelsieve|image] - - -### TA3 Kieswaschanlage / Gravel Rinser - -Die Funktion entspricht der von TA2. -Auch die Wahrscheinlichkeit ist wie bei TA2. Der Block benötigt auch 3 ku Strom. -Aber im Gegensatz zu TA2 kann beim TA3 Block bspw. der Status abgefragt werden (Controller) - -[ta3_gravelrinser|image] - - -### TA3 Mühle / Grinder - -Die Funktion entspricht der von TA2. -Die Verarbeitungsleistung beträgt 2 Items alle 4 s. Der Block benötigt 6 ku Strom. - -[ta3_grinder|image] - -### TA3 Injektor / Injector - -Der Injektor ist ein TA3 Schieber mit speziellen Eigenschaften. Er besitzt ein Menü zur Konfiguration. Hier können bis zu 8 Items konfiguriert werden. Er entnimmt nur diese Items einer Kiste um sie an Maschinen mit Rezepturen weiterzugeben (Autocrafter, Industrieofen und Elektronikfabrik). - -Beim Weitergeben wird in der Zielmaschine pro Item nur eine Position im Inventar genutzt. Sind bspw. nur die ersten drei Einträge im Injektor konfiguriert, so werden auch nur die ersten drei Speicherplätze im Inventar der Maschine belegt. Damit wir ein Überlauf im Inventar der Maschine verhindert. - -Der Injektor kann auch auf "Ziehe-Modus" umgeschaltet werden. Dann zieht er nur Items von den Positionen aus der Kiste, die in der Konfiguration des Injektors definiert sind. Hier müssen also Item-Typ und Position überein stimmen. Damit können geziehlt Speicherplätze im Inventar einer Kiste geleert werden. - -Die Verarbeitungsleistung beträgt bis zu 8 mal ein Item alle 4 Sekunden. - -[ta3_injector|image] - - - - -## Werkzeuge - -### Techage Info Tool - -Das Techage Info Tool (Schraubenschlüssel) hat verschiedene Funktionen. Er zeigt die Uhrzeit, die Position, die Temperatur und das Biome an, wenn auf einen unbekannten Block geklickt wird. -Wird auf einen TechAge Block mit Kommandoschnittstelle geklickt, werden alle verfügbaren Daten abgerufen (siehe auch "Logik-/Schalt-Blöcke"). - -Mit Shift+Rechtsklick kann bei einigen Blöcken ein erweitertes Menü geöffnet werden. Hier lassen sich je nach Block weitere Daten abrufen oder spezielle Einstellungen vornehmen. Bei einem Generator kann bspw. die Ladekurve/abschaltung programmiert werden. - -[ta3_end_wrench|image] - - -### TechAge Programmer - -Mit dem Programmer können Blocknummern mit einem Rechtsklick von mehreren Blöcken eingesammelt und mit einem Linksklick in einen Block wie Taster/Schalter geschrieben werden. -Wird in die Luft geklickt, wird der interne Speicher gelöscht. - -[ta3_programmer|image] - -### TechAge Kelle / Trowel - -Die Kelle dient zum Verputzen von Stromkabel. Siehe dazu "TA Stromkabel". - -[ta3_trowel|image] - - -### TA3 Bohrgestängezange / TA3 Drill Pipe Wrench - -Mit diesem Werkzeug lassen sich die Bohrgestängezange Blöcke wieder entfernen, wenn dort bspw. ein Tunnel durch soll. - -[ta3_drill_pipe_wrench|image] - -### Techage Schraubendreher / Screwdriver - -Der Techage Schraubendreher dient als Ersatz für den normalen Schraubendreher. Es besitzt folgende Funktionen: - -- Linksklick: Den Block nach links drehen -- Rechtsklick: Die sichtbare Seite des Blockes nach oben drehen -- Shift+Linksklick: Ausrichtung des angeklickten Blockes speichern -- Shift+Rechtsklick: Die gespeicherte Ausrichtung auf den angeklickten Block anwenden - -[ta3_screwdriver|image] - -### TechAge Montagewerkzeug / Assembly Tool - -Das TechAge Montagewerkzeug dient zum Entfernen und wieder Setzen von Techage Blöcken, ohne dass diese Blöcke ihre Blocknummer verlieren, bzw. beim Setzen eine neue Nummer zugeteilt bekommen. Dies ist bspw. bei Steinbrechern hilfreich, da diese oft umgesetzt werden müssen. - -- Linke Taste: Entfernen eines Blocks -- Rechte Taste: Setzen eines Blocks - -Der Block, der zuvor mit dem Montagewerkzeug entfernt wurde und wieder gesetzt werden soll, muss sich im Spieler-Inventar ganz links befinden. - -[techage:assembly_tool|image] \ No newline at end of file diff --git a/techage/manuals/manual_ta3_EN.md b/techage/manuals/manual_ta3_EN.md deleted file mode 100644 index ba82fdc..0000000 --- a/techage/manuals/manual_ta3_EN.md +++ /dev/null @@ -1,904 +0,0 @@ -# TA3: Oil Age - -At TA3 it is important to replace the steam-powered machines with more powerful and electric-powered machines. - -To do this, you have to build coal-fired power plants and generators. You will soon see that your electricity needs can only be met with oil-powered power plants. So you go looking for oil. Drilling derricks and oil pumps help them get the oil. Railways are used to transport oil to the power plants. - -The industrial age is at its peak. - -[techage_ta3|image] - - -## Coal-fired Power Station / Oil-fired Power Station - -The coal-fired power plant consists of several blocks and must be assembled as shown in the plan on the right. The blocks TA3 power station fire box, TA3 boiler top, TA3 boiler base, TA3 turbine, TA3 generator and TA3 cooler are required. - -The boiler must be filled with water. Fill up to 10 buckets of water in the boiler. -The fire box must be filled with coal or charcoal. -When the water is hot, the generator can then be started. - -Alternatively, the power plant can be equipped with an oil burner and then operated with oil. -The oil can be refilled using a pump and oil pipe. - -The power plant delivers an output of 80 ku. - -[coalpowerstation|plan] - - -### TA3 power station firebox - -Part of the power plant. -The fire box must be filled with coal or charcoal. The burning time depends on the power that is requested by the power plant. Coal burns for 20 s and charcoal for 60 s under full load. Correspondingly longer under partial load (50% load = double time). - -[ta3_firebox|image] - - -### TA3 Power Station Oil Burner - -Part of the power plant. - -The oil burner can be filled with crude oil, fuel oil, naphtha or gasoline. The burning time depends on the power that is requested by the power plant. Under full load, crude oil burns 15 s, fuel oil 20 s, naphtha 22 s and gasoline 25 s. - -Correspondingly longer under partial load (50% load = double time). - -The oil burner can only hold 50 units of fuel. An additional oil tank and an oil pump are therefore advisable. - - -[ta3_oilbox|image] - - -### TA3 boiler base / top - -Part of the power plant. Must be filled with water. If there is no more water or the temperature drops too low, the power plant switches off. - -The water consumption of the TA3 boiler is much lower than that of the steam engine due to the closed steam circuit. -With the steam engine, some water is lost as steam with each piston stroke. - -[ta3_boiler|image] - - -### TA3 turbine - -The turbine is part of the power plant. It must be placed next to the generator and connected to the boiler and cooler via steam pipes as shown in the plan. - -[ta3_turbine|image] - - -### TA3 generator - -The generator is used to generate electricity. It must be connected to the machines via power cables and junction boxes. - -[ta3_generator|image] - - -### TA3 cooler - -Used to cool the hot steam from the turbine. Must be connected to the boiler and turbine via steam pipes as shown in the plan. - -[ta3_cooler|image] - - -## Electrical current - -In TA3 (and TA4) the machines are powered by electricity. To do this, machines, storage systems, and generators must be connected with power cables. -TA3 has 2 types of power cables: - -- Insulated cables (TA power cables) for local wiring in the floor or in buildings. These cables can be hidden in the wall or in the floor (can be "plastered" with the trowel). -- Overland lines (TA power line) for outdoor cabling over long distances. These cables are protected and cannot be removed by other players. - -Several consumers, storage systems, and generators can be operated together in a power network. Networks can be set up with the help of the junction boxes. -If too little electricity is provided, consumers run out. -In this context, it is also important that the functionality of Forceload blocks is understood, because generators, for example, only supply electricity when the corresponding map block is loaded. This can be enforced with a forceload block. - -In TA4 there is also a cable for the solar system. - - -[ta3_powerswitch|image] - - -### Importance of storage systems - -Storage systems in the power grid fulfill two tasks: - -- To cope with peaks in demand: All generators always deliver just as much power as is needed. However, if consumers are switched on/off or there are fluctuations in demand for other reasons, consumers can fail for a short time. To prevent this, there should always be at least one battery block in every network. This serves as a buffer and compensates for these fluctuations in the seconds range. -- To store regenerative energy: Solar and wind are not available 24 hours a day. So that the power supply does not fail when no electricity is produced, one or more storage systems must be installed in the network. Alternatively, the gaps can also be bridged with oil/coal electricity. - -A storage system indicates its capacity in kud, i.e. ku per day. For example, a storage system with 100 kud delivers 100 ku for one game day, or 10 ku for 10 game days. - -All TA3/TA4 energy sources have adjustable charging characteristics. By default this is set to "80% - 100%". This means that when the storage system is 80% full, the output is reduced further and further until it switches off completely at 100%. If electricity is required in the network, 100% will never be reached, since the power of the generator has at some point dropped to the electricity demand in the network and the storage system is no longer charged, but only the consumers are served. - -This has several advantages: - -- The charging characteristics are adjustable. This means, for example, that oil/coal energy sources can be reduced at 60% and regenerative energy sources only at 80%. This means that oil/coal is only burned if there are not enough renewable energy sources available. -- Several energy sources can be operated in parallel and are loaded almost evenly, because all energy sources work, for example, up to 80% of the storage system's charging capacity at their full capacity and then reduce their capacity at the same time. -- All storage systems in a network form a large buffer. The charging capacity and the filling level of the entire storage system can always be read in percent on every storage system, but also on the electricity terminal. - -[power_reduction|image] - - - -### TA Electric Cable - -For local wiring in the floor or in buildings. -Branches can be realized using junction boxes. The maximum cable length between machines or junction boxes is 1000 m. A maximum of 1000 nodes can be connected in a power network. All blocks with power connection, including junction boxes, count as nodes. - -Since the power cables are not automatically protected, the land lines (TA power line) are recommended for longer distances. - -Power cables can be plastered with the trowel so they can be hidden in the wall or in the floor. All stone, clay and other blocks without "intelligence" can be used as plastering material. Dirt does not work because dirt can be converted to grass or the like, which would destroy the line. - -For plastering, the cable must be clicked on with the trowel. The material with which the cable is to be plastered must be on the far left in the player inventory. -The cables can be made visible again by clicking on the block with the trowel. - -In addition to cables, the TA junction box and the TA power switch box can also be plastered. - -[ta3_powercable|image] - - -### TA Electric Junction Box - -With the junction box, electricity can be distributed in up to 6 directions. Junction boxes can also be plastered (hidden) with a trowel and made visible again. - -[ta3_powerjunction|image] - - -### TA Power Line - -With the TA power line and the electricity poles, reasonably realistic overhead lines can be realized. The power pole heads also serve to protect the power line (protection). A pole must be set every 16 m or less. The protection only applies to the power line and the poles, however, all other blocks in this area are not protected. - -[ta3_powerline|image] - - -### TA Power Pole -Used to build electricity poles. Is protected from destruction by the electricity pole head and can only be removed by the owner. - -[ta3_powerpole|image] - - -### TA Power Pole Top -Has up to four arms and thus allows electricity to be distributed in up to 6 directions. -The electricity pole head protects power lines and poles within a radius of 8 m. - -[ta3_powerpole4|image] - - -### TA Power Pole Top 2 - -This electricity pole head has two fixed arms and is used for the overhead lines. However, it can also transmit current downwards and upwards. -The electricity pole head protects power lines and poles within a radius of 8 m. - -[ta3_powerpole2|image] - - -### TA Power Switch - -The switch can be used to switch the power on and off. To do this, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides. - -[ta3_powerswitch|image] - - -### TA Power Switch Small - -The switch can be used to switch the power on and off. To do this, the switch must be placed on a power switch box. The power switch box must be connected to the power cable on both sides. - -[ta3_powerswitchsmall|image] - - -### TA Power Switch Box - -see TA power switch. - -[ta3_powerswitchbox|image] - - -### TA3 Small Power Generator - -The small power generator runs on gasoline and can be used for small consumers with up to 12 ku. Gasoline burns for 150 s under full load. Correspondingly longer under partial load (50% load = double time). - -The power generator can only hold 50 units of gasoline. An additional tank and a pump are therefore advisable. - - -[ta3_tinygenerator|image] - - -### TA3 Accu Block - -The accu block (rechargeable battery) is used to store excess energy and automatically delivers power in the event of a power failure (if available). -Several accu blocks together form a TA3 energy storage system. Each accu block has a display for the charging state and for the stored load. -The values for the entire network are always displayed here. The stored load is displayed in "kud" or "ku-days" (analogous to kWh) 5 kud thus corresponds, for example, to 5 ku for a game day (20 min) or 1 ku for 5 game days. - -A accu block has 3.33 kud - -[ta3_akkublock|image] - - -### TA3 Power Terminal - -The power terminal must be connected to the power grid. It shows data from the power grid. - -The most important figures are displayed in the upper half: - -- current/maximum generator power -- current power consumption of all consumers -- current charging current in/from the storage system -- Current state of charge of the storage system in percent - -The number of network blocks is output in the lower half. - -Additional data on the generators and storage systems can be queried via the "console" tab. - -[ta3_powerterminal|image] - - -### TA3 Electric Motor - -The TA3 Electric Motor is required in order to be able to operate TA2 machines via the power grid. The TA3 Electric Motor converts electricity into axle power. -If the electric motor is not supplied with sufficient power, it goes into an fault state and must be reactivated with a right-click. - -The electric motor takes max. 40 ku of electricity and provides on the other side max. 39 ku as axle power. So he consumes one ku for the conversion. - -[ta3_motor|image] - - - - -## TA3 Industrial Furnace - -The TA3 industrial furnace serves as a supplement to normal furnaces. This means that all goods can be produced with "cooking" recipes, even in an industrial furnace. But there are also special recipes that can only be made in an industrial furnace. -The industrial furnace has its own menu for recipe selection. Depending on the goods in the industrial furnace inventory on the left, the output product can be selected on the right. - -The industrial furnace requires electricity (for the booster) and fuel oil / gasoline for the burner. The industrial furnace must be assembled as shown in the plan on the right. - -See also TA4 heater. - -[ta3_furnace|plan] - - -### TA3 Furnace Oil Burner - -Is part of the TA3 industrial furnace. - -The oil burner can be operated with crude oil, fuel oil, naphtha or gasoline. The burning time is 64 s for crude oil, 80 s for fuel oil, 90 s for naphtha and 100 s for gasoline. - -The oil burner can only hold 50 units of fuel. An additional tank and a pump are therefore advisable. - -[ta3_furnacefirebox|image] - - -### TA3 Furnace Top - -Is part of the TA3 industrial furnace. See TA3 industrial furnace. - -[ta3_furnace|image] - - -### TA3 Booster - -Is part of the TA3 industrial furnace. See TA3 industrial furnace. - -[ta3_booster|image] - - -## Liquids - -Liquids such as water or oil can only be pumped through the special pipes and stored in tanks. As with water, there are containers (canisters, barrels) in which the liquid can be stored and transported. - -It is also possible to connect several tanks using the yellow pipes and connectors. However, the tanks must have the same content and there must always be at least one yellow pipe between the tank, pump and distributor pipe. - -E.g. It is not possible to connect two tanks directly to a distributor pipe. - -The liquid filler is used to transfer liquids from containers to tanks. The plan shows how canisters or barrels with liquids are pushed into a liquid filler via pushers. The container is emptied in the liquid filler and the liquid is led down into the tank. - -The liquid filler can also be placed under a tank to empty the tank. - -[ta3_tank|plan] - - -### TA3 Tank - -Liquids can be stored in a tank. A tank can be filled or emptied using a pump. To do this, the pump must be connected to the tank via a pipe (yellow pipes). - -A tank can also be filled or emptied manually by clicking on the tank with a full or empty liquid container (barrel, canister). It should be noted that barrels can only be completely filled or emptied. If, for example, there are less than 10 units in the tank, this remainder must be removed with canisters or pumped empty. - -A TA3 tank can hold 1000 units or 100 barrels of liquid. - -[ta3_tank|image] - - -### TA3 Pump - -The pump can be used to pump liquids from tanks or containers to other tanks or containers. The pump direction (arrow) must be observed for the pump. The yellow lines and connectors also make it possible to arrange several tanks on each side of the pump. However, the tanks must have the same content. - -The TA3 pump pumps 4 units of liquid every two seconds. - -Note 1: The pump must not be placed directly next to the tank. There must always be at least a piece of yellow pipe between them. - -[ta3_pump|image] - - -### TA Liquid Filler - -The liquid filler is used to transfer liquids between containers and tanks. - -- If the liquid filler is placed under a tank and empty barrels are put into the liquid filler with a pusher or by hand, the contents of the tank are transferred to the barrels and the barrels can be removed from the outlet -- If the liquid filler is placed on a tank and if full containers are put into the liquid filler with a pusher or by hand, the content is transferred to the tank and the empty containers can be removed on the exit side - -It should be noted that barrels can only be completely filled or emptied. If, for example, there are less than 10 units in the tank, this remainder must be removed with canisters or pumped empty. - -[ta3_filler|image] - -### TA4 Pipe - -The yellow pipes are used for the transmission of gas and liquids. -The maximum pipe length is 100 m. - -[ta3_pipe|image] - -### TA3 Pipe Wall Entry Blocks - -The blocks serve as wall openings for tubes, so that no holes remain open. - -[ta3_pipe_wall_entry|image] - -### TA Valve - -There is a valve for the yellow pipes, which can be opened and closed with a click of the mouse. -The valve can also be controlled via on/off commands. - -[ta3_valve|image] - - -## Oil Production - -In order to run your generators and stoves with oil, you must first look for oil and build a derrick and then extract the oil. -TA3 oil explorer, TA3 oil drilling box and TA3 pump jack are used for this. - -[techage_ta3|image] - - -### TA3 Oil Explorer - -You can search for oil with the oil explorer. To do this, place the block on the floor and right-click to start the search. The oil explorer can be used above ground and underground at all depths. -The chat output shows you the depth to which oil was searched and how much oil (petroleum) was found. -You can click the block multiple times to search for oil in deeper areas. Oil fields range in size from 4,000 to 20,000 items. - -If the search was unsuccessful, you have to move the block approx. 16 m further. -The oil explorer always searches for oil in the whole map block and below, in which it was set. A new search in the same map block (16x16 field) therefore makes no sense. - -If oil is found, the location for the derrick is displayed. You have to erect the derrick within the area shown, it is best to mark the spot with a sign and protect the entire area against foreign players. - -Don't give up looking for oil too quickly. If you're unlucky, it can take a long time to find an oil well. -It also makes no sense to search an area that another player has already searched. The chance of finding oil anywhere is the same for all players. - -The oil explorer can always be used to search for oil. - -[ta3_oilexplorer|image] - - -### TA3 Oil Drill Box - -The oil drill box must be placed in the position indicated by the oil explorer. Drilling for oil elsewhere is pointless. -If the button on the oil drilling box is clicked, the derrick is erected above the box. This takes a few seconds. -The oil drilling box has 4 sides, at IN the drill pipe has to be delivered via pusher and at OUT the drilling material has to be removed. The oil drilling box must be supplied with power via one of the other two sides. - -The oil drilling box drills to the oil field (1 meter in 16 s) and requires 16 ku of electricity. -Once the oil field has been reached, the derrick can be dismantled and the box removed. - -[ta3_drillbox|image] - - -### TA3 Oil Pumpjack - -The oil pump (pump-jack) must now be placed in the place of the oil drilling box. The oil pump also requires electricity (16 ku) and supplies one unit of oil every 8 s. The oil must be collected in a tank. To do this, the oil pump must be connected to the tank via yellow pipes. -Once all the oil has been pumped out, the oil pump can also be removed. - -[ta3_pumpjack|image] - - -### TA3 Drill Pipe - -The drill pipe is required for drilling. As many drill pipe items are required as the depth specified for the oil field. The drill pipe is useless after drilling, but it also cannot be dismantled and remains in the ground. However, there is a tool to remove the drill pipe blocks (-> Tools -> TA3 drill pipe pliers). - -[ta3_drillbit|image] - - -### Oil tank - -The oil tank is the large version of the TA3 tank (see liquids -> TA3 tank). - -The large tank can hold 4000 units of oil, but also any other type of liquid. - -[oiltank|image] - - - -## Oil Transportation - -### Oil transportation by Tank Carts - -Tank carts can be used to transport oil from the oil well to the oil processing plant. A tank cart can be filled or emptied directly using pumps. In both cases, the yellow pipes must be connected to the tank cart from above. - -The following steps are necessary: - -- Place the tank cart in front of the rail bumper block. The bumper block must not yet be programmed with a time so that the tank cart does not start automatically -- Connect the tank cart to the pump using yellow pipes -- Switch on the pump -- Program the bumper with a time (10 - 20 s) - -This sequence must be observed on both sides (fill / empty). - -[tank_cart | image] - -### Oil transportation with barrels over Minecarts - -Canisters and barrels can be loaded into the Minecarts. To do this, the oil must first be transferred to barrels. The oil barrels can be pushed directly into the Minecart with a pusher and tubes (see map). The empty barrels, which come back from the unloading station by Minecart, can be unloaded using a hopper, which is placed under the rail at the stop. - -It is not possible with the hopper to both **unload the empty barrels and load the full barrels at a stop**. The hopper immediately unloads the full barrels. It is therefore advisable to set up 2 stations on the loading and unloading side and then program the Minecart accordingly using a recording run. - -The plan shows how the oil can be pumped into a tank and filled into barrels via a liquid filler and loaded into Minecarts. - -For the Minecarts to start again automatically, the bumper blocks must be configured with the station name and waiting time. 5 s are sufficient for unloading. However, since the pushers always go into standby for several seconds when there is no Minecart, a time of 15 or more seconds must be entered for loading. - -[ta3_loading|plan] - -### Tank Cart - -The tank truck is used to transport liquids. Like tanks, it can be filled with pumps or emptied. In both cases, the yellow tube must be connected to the tank truck from above. - -200 units fit in the tank truck. - -[tank_cart | image] - -### Chest Cart - -The chest cart is used to transport items. Like chests, it can be filled or emptied using a pusher. - -4 stacks fit in the chest cart. - -[chest_cart | image] - - -## Oil Processing - -Oil is a mixture of substances and consists of many components. The oil can be broken down into its main components such as bitumen, fuel oil, naphtha, gasoline and propane gas via a distillation tower. -Further processing to end products takes place in the chemical reactor. - -[techage_ta31|image] - - -### Distillation Tower - -The distillation tower must be set up as in the plan at the top right. -The bitumen is drained off via the base block. The exit is on the back of the base block (note the direction of the arrow). -The "distillation tower" blocks with the numbers: 1, 2, 3, 2, 3, 2, 3, 4 are placed on this basic block -Fuel oil, naphtha and gasoline are drained from the openings from bottom to top. The propane gas is caught at the top. -All openings on the tower must be connected to tanks. -The reboiler must be connected to the "distillation tower 1" block. - -The reboiler needs electricity (not shown in the plan)! - - -[ta3_distiller|plan] - -#### Reboiler - -The reboiler heats the oil to approx. 400 ° C. It largely evaporates and is fed into the distillation tower for cooling. - -The reboiler requires 14 units of electricity and produces one unit of bitumen, fuel oil, naphtha, gasoline and propane every 16 s. -To do this, the reboiler must be supplied with oil via a pump. - -[reboiler|image] - - -## Logic / Switching Blocks - -In addition to the tubes for goods transport, as well as the gas and power pipes, there is also a wireless communication level through which blocks can exchange data with each other. No lines have to be drawn for this, the connection between transmitter and receiver is only made via the block number. - -**Info:** A block number is a unique number that is generated by Techage when many Techage blocks are placed. The block number is used for addressing during communication between Techage controllers and machines. All blocks that can participate in this communication show the block number as info text if you fix the block with the mouse cursor. - -Which commands a block supports can be read out and displayed with the TechAge Info Tool (wrench). -The simplest commands supported by almost all blocks are: - -- `on` - to turn on block / machine / lamp -- `off` - to turn off the block / machine / lamp - -With the help of the TA3 Terminal, these commands can be tried out very easily. Suppose a signal lamp is number 123. -Then with: - - cmd 123 on - -the lamp can be turned on and with: - - cmd 123 off - -the lamp can be turned off again. These commands must be entered in the input field of the TA3 terminal. - -Commands such as `on` and` off` are sent to the recipient without a response coming back. These commands can therefore be sent to several receivers at the same time, for example with a push button / switch, if several numbers are entered in the input field. - -A command like `state` requests the status of a block. The block then sends its status back. This type of confirmed command can only be sent to one recipient at a time. -This command can also be tested with the TA3 terminal on a pusher, for example: - - cmd 123 state - -Possible responses from the pusher are: -- `running` -> I'm working -- `stopped` -> switched off -- `standby` -> nothing to do because source inventory is empty -- `blocked` -> can't do anything because target inventory is full - -This status and other information is also output when the wrench is clicked on the block. - -[ta3_logic|image] - - -### TA3 Button / Switch -The button/switch sends `on` / `off` commands to the blocks that have been configured via the numbers. -The button/switch can be configured as a button or a switch. If it is configured as a button, the time between the `on` and `off` commands can be set. With the operating mode "on button" only an `on` and no `off` command is sent. - -The checkbox "public" can be used to set whether the button can be used by everyone (set) or only by the owner himself (not set). - -Note: With the programmer, block numbers can be easily collected and configured. - -[ta3_button|image] - -### TA3 Command Converter - -With the TA3 command converter, `on` / `off` commands can be converted into other commands, and forwarding can be prevented or delayed. -The number of the target block or the numbers of the target blocks, the commands to be sent and the delay times in seconds must be entered. If no command is entered, nothing is sent. - -The numbers can also be programmed using the Techage programmer. - -[ta3_command_converter|image] - -### TA3 Flip-Flop - -The TA3 flip-flop changes its state with each received `on` command. Received `off` commands are ignored. Depending on the status change, `on` / `off` commands are sent alternately. The number of the target block or the numbers of the target blocks must be entered. The numbers can also be programmed using the Techage programmer. - -For example, lamps can be switched on and off with the help of buttons. - -[ta3_flipflop|image] - -### TA3 Logic Block - -The TA3 logic block can be programmed in such a way that one or more input commands are linked to one output command and sent. This block can therefore replace various logic elements such as AND, OR, NOT, XOR etc. -Input commands for the logic block are `on` /` off` commands. -Input commands are referenced via the number, e.g. `1234` for the command from the sender with the number 1234. -The same applies to output commands. - -A rule is structured as follows: - -``` - = on/off if is true -``` - -`` is the block number to which the command should be sent. -`` is a boolean expression where input numbers are evaluated. - - - -**Examples for the input expression** - -Negate signal (NOT): - - 1234 == off - -Logical AND: - - 1234 == on and 2345 == on - -Logical OR: - - 1234 == on or 2345 == on - -The following operators are allowed: `and` `or` `on` `off` `me` `==` `~=` `(` `)` - -If the expression is true, a command is sent to the block with the `` number. -Up to four rules can be defined, whereby all rules are always checked when a command is received. -The internal processing time for all commands is 100 ms. - -Your own node number can be referenced using the keyword `me`. This makes it possible for the block to send itself a command (flip-flop function). - -The blocking time defines a pause after a command, during which the logic block does not accept any further external commands. Commands received during the blocking period are thus discarded. The blocking time can be defined in seconds. - -[ta3_logic|image] - - -### TA3 Repeater - -The repeater sends the received signal to all configured numbers. -This can make sense, for example, if you want to control many blocks at the same time. The repeater can be configured with the programmer, which is not possible with all blocks. - -[ta3_repeater|image] - - -### TA3 Sequencer - -The sequencer can send a series of `on` / `off` commands, whereby the interval between the commands must be specified in seconds. You can use it to make a lamp blink, for example. -Up to 8 commands can be configured, each with target block number and pending the next command. -The sequencer repeats the commands endlessly when "Run endless" is set. -If nothing is selected, only the specified time in seconds is waited for. - -[ta3_sequencer|image] - - -### TA3 Timer - -The timer can send commands time-controlled. The time, the target number(s) and the command itself can be specified for each command line. This means that lamps can be switched on in the evening and switched off again in the morning. - -[ta3_timer|image] - - -### TA3 Terminal - -The terminal is primarily used to test the command interface of other blocks (see "Logic / switching blocks"). -You can also assign commands to keys and use the terminal productively. - - set - -With `set 1 ON cmd 123 on`, for example, user key 1 can be programmed with the command `cmd 123 on`. If the key is pressed, the command is sent and the response is output on the screen. - -The terminal has the following local commands: -- `clear` clear screen -- `help` output a help page -- `pub` switch to public mode -- `priv` switch to private mode - -In private mode, the terminal can only be used by players who can build at this location, i.e. who have protection rights. - -In public mode, all players can use the preconfigured keys. - -[ta3_terminal|image] - - -### TechAge Color Lamp - -The signal lamp can be switched on or off with the `on` / `off` command. This lamp does not need electricity and can be colored with the airbrush tool from the mod Unified Dyes" and via Lua/Beduino commands. - -With the chat command `/ta_color` the color palette with the values for the Lua/Beduino commands is displayed and with `/ta_send color ` the color can be changed. - -[ta3_colorlamp|image] - - -### Door/Gate Blocks - -With these blocks you can realize doors and gates that can be opened via commands (blocks disappear) and closed again. One door controller is required for each gate or door. - -The appearance of the blocks can be adjusted via the block menu. -This makes it possible to realize secret doors that only open for certain players (with the help of the player detector). - -[ta3_doorblock|image] - -### TA3 Door Controller - -The door controller is used to control the TA3 door/gate blocks. With the door controller, the numbers of the door/gate blocks must be entered. If an `on` / `off` command is sent to the door controller, this opens/closes the door or gate. - -[ta3_doorcontroller|image] - -### TA3 Door Controller II - -The Door Controller II can remove and set all types of blocks. To teach in the Door Controller II, the "Record" button must be pressed. Then all blocks that should be part of the door / gate must be clicked. Then the "Done" button must be pressed. Up to 16 blocks can be selected. The removed blocks are saved in the controller's inventory. The function of the controller can be tested manually using the "Remove" or "Set" buttons. If an `on` /`off` command is sent to the Door Controller II, it removes or sets the blocks as well. - -With `$send_cmnd(node_number, "exchange", 2)` individual blocks can be set, removed or replaced by other blocks from the inventory. - -With `$send_cmnd(node_number, "set", 2)` a block from the inventory can be set explicitly, as long as the inventory slot is not empty. - -A block can be removed again with `$send_cmnd(node_number, "dig", 2)` if the inventory slot is empty. - -The name of the set block is returned with `$send_cmnd(node_number, "get", 2)`. - -The slot number of the inventory (1 .. 16) must be passed as payload in all three cases. - -This can also be used to simulate extendable stairs and the like. - -[ta3_doorcontroller|image] - -### TA3 Sound Block - -Different sounds can be played with the sound block. All sounds of the Mods Techage, Signs Bot, Hyperloop, Unified Inventory, TA4 Jetpack and Minetest Game are available. - -The sounds can be selected and played via the menu and via command. - -- Command `on` to play a sound -- Command `sound ` to select a sound via the index -- Command `gain ` to adjust the volume via the `` value (1 to 5). - -[ta3_soundblock|image] - -### TA3 Mesecons Converter - -The Mesecons converter is used to convert Techage on/off commands into Mesecons signals and vice versa. -To do this, one or more node numbers must be entered and the converter with Mesecons blocks -has to be connected via Mesecons cables. The Mesecons converter can also be configured with the programmer. -The Mesecons converter accepts up to 5 commands per second; it switches itself off at higher loads. - -**This node only exists if the mod mesecons is active!** - -[ta3_mesecons_converter|image] - - - -## Detectors - -Detectors scan their surroundings and send an `on` command when the search is recognized. - -[ta3_nodedetector|image] - - -### TA3 Detector - -The detector is a special tube block that detects when items are passed on through the tube. To do this, it must be connected to tubes on both sides. If items are pushed into the detector with a pusher, they are automatically passed on. -It sends an `on` when an item is recognized, followed by an `off` a second later. -Then further commands are blocked for 8 seconds. -The waiting time and the items that should trigger a command can be configured using the open-ended wrench menu. - - -[ta3_detector|image] - - -### TA3 Cart Detector - -The cart detector sends an `on` command if it has recognized a cart (Minecart) directly in front of it. In addition, the detector can also restart the cart when an `on` command is received. - -The detector can also be programmed with its own number. In this case, he pushes all the wagons that stop near him (one block in all directions). - -[ta3_cartdetector|image] - - -### TA3 Node Detector - -The node detector sends an `on` command if it detects that nodes (blocks) appear or disappear in front of it, but must be configured accordingly. After switching the detector back to the standard state (gray block), an `off` command is sent. Valid blocks are all types of blocks and plants, but not animals or players. The sensor range is 3 blocks / meter in the direction of the arrow. - -[ta3_nodedetector|image] - - -### TA3 Player Detector - -The player detector sends an `on` command if it detects a player within 4 m of the block. If the player leaves the area again, an `off` command is sent. -If the search should be limited to specific players, these player names can also be entered. - -[ta3_playerdetector|image] - -### TA3 Light Detector - -The light detector sends an `on` command if the light level of the block above exceeds a certain level, which can be set through the right-click menu. -If you have a TA4 Lua Controller, you can get the exact light level with $get_cmd(num, 'light_level') - -[ta3_lightdetector|image] - -## TA3 Machines - -TA3 has the same machines as TA2, only these are more powerful and require electricity instead of axis drive. -Therefore, only the different technical data are given below. - -[ta3_grinder|image] - - -### TA3 Pusher - -The function corresponds to that of TA2. -The processing power is 6 items every 2 s. - -[ta3_pusher|image] - - -### TA3 Distributor - -The function of the TA3 distributor corresponds to that of TA2. -The processing power is 12 items every 4 s. - -[ta3_distributor|image] - - -### TA3 Autocrafter - -The function corresponds to that of TA2. -The processing power is 2 items every 4 s. The autocrafter requires 6 ku of electricity. - -[ta3_autocrafter|image] - - -### TA3 Electronic Fab - -The function corresponds to that of TA2, only TA4 WLAN chips are produced here. -The processing power is one chip every 6 s. The block requires 12 ku of electricity for this. - -[ta3_electronicfab|image] - - -### TA3 Quarry - -The function corresponds to that of TA2. -The maximum depth is 40 meters. The quarry requires 12 ku of electricity. - -[ta3_quarry|image] - - -### TA3 Gravel Sieve - -The function corresponds to that of TA2. -The processing power is 2 items every 4 s. The block requires 4 ku of electricity. - -[ta3_gravelsieve|image] - - -### TA3 Gravel Rinser - -The function corresponds to that of TA2. -The probability is also the same as for TA2. The block also requires 3 ku of electricity. -But in contrast to TA2, the status of the TA3 block can be read (controller) - -[ta3_gravelrinser|image] - - -### TA3 Grinder - -The function corresponds to that of TA2. -The processing power is 2 items every 4 s. The block requires 6 ku of electricity. - -[ta3_grinder|image] - -### TA3 Injector - -The injector is a TA3 pusher with special properties. It has a menu for configuration. Up to 8 items can be configured here. He only takes these items from a chest to pass them on to machines with recipes (autocrafter, industrial furnace and electronic fab). - -When passing on, only one position in the inventory is used in the target machine. If, for example, only the first three entries are configured in the injector, only the first three storage locations in the machine's inventory are used. So that an overflow in the machine inventory is prevented. - -The injector can also be switched to "pull mode". Then he only pulls items out of the chest from the positions that are defined in the configuration of the injector. In this case, item type and position must match. This allows to empty specific inventory entries of a chest. - -The processing power is up to 8 times one item every 4 seconds. - -[ta3_injector|image] - - - -## Tools - -### Techage Info Tool - -The Techage Info Tool (open-ended wrench) has several functions. It shows the time, position, temperature and biome when an unknown block is clicked on. -If you click on a TechAge block with command interface, all available data will be shown (see also "Logic / switching blocks"). - -With Shift + right click an extended menu can be opened for some blocks. Depending on the block, further data can be called up or special settings can be made here. In the case of a generator, for example, the charging curve/switch-off can be programmed. - -[ta3_end_wrench|image] - -### TechAge Programmer - -With the programmer, block numbers can be collected from several blocks with a right click and written into a block like a button / switch with a left click. -If you click in the air, the internal memory is deleted. - -[ta3_programmer|image] - -### TechAge Trowel / Trowel - -The trowel is used for plastering power cables. See also "TA power cable". - -[ta3_trowel|image] - -### TA3 drill pipe wrench - -This tool can be used to remove the drill pipe blocks if, for example, a tunnel is to pass through there. - -[ta3_drill_pipe_wrench|image] - -### Techage Screwdriver - -The Techage Screwdriver serves as a replacement for the normal screwdriver. It has the following functions: - -- Left click: turn the block to the left -- Right click: turn the visible side of the block upwards -- Shift + left click: save the alignment of the clicked block -- Shift + right click: apply the saved alignment to the clicked block - -[ta3_screwdriver|image] - -### TechAge Assembly Tool - -The TechAge Assembly Tool is used to remove and reposition Techage blocks without these blocks losing their block number or being assigned a new number when setting. This is helpful, for example, for quarries, as they often have to be moved. - -- Left button: Remove a block -- Right button: Set a block - -The block that was previously removed with the assembly tool and is to be placed again must be on the far left of the player inventory. - -[techage:assembly_tool|image] - diff --git a/techage/manuals/manual_ta3_pt-BR.md b/techage/manuals/manual_ta3_pt-BR.md deleted file mode 100644 index e4d2851..0000000 --- a/techage/manuals/manual_ta3_pt-BR.md +++ /dev/null @@ -1,890 +0,0 @@ -# TA3: Era do Petróleo - -Na TA3, é importante substituir as máquinas a vapor por máquinas mais potentes movidas a eletricidade. - -Para fazer isso, é necessário construir usinas termelétricas a carvão e geradores. Logo você perceberá que suas necessidades de eletricidade só podem ser atendidas com usinas movidas a óleo. Portanto, você parte em busca de petróleo. Torres de perfuração e bombas de petróleo ajudam a extrair o óleo. Ferrovias são usadas para transportar o óleo até as usinas. - -A era industrial está em seu auge. - -[techage_ta3|image] - -## Usina Termelétrica a Carvão / Usina Termelétrica a Óleo - -A usina termelétrica a carvão é composta por vários blocos e deve ser montada conforme mostrado no plano à direita. São necessários os blocos Fornalha(Firebox) TA3, Topo da Caldeira TA3, Base da Caldeira TA3, Turbina TA3, Gerador TA3 e Resfriador TA3. - -A caldeira deve ser preenchida com água. Encha até 10 baldes de água na caldeira. -A caixa de fogo deve ser preenchida com carvão ou carvão vegetal. -Quando a água estiver quente, o gerador pode ser iniciado. - -Alternativamente, a usina pode ser equipada com um queimador de óleo e operada com óleo. O óleo pode ser reabastecido usando uma bomba e um tubo de óleo. - -A usina fornece uma saída de 80 ku. - -[coalpowerstation|plan] - -### TA3 Fornalha(firebox) da estação de energia - -Parte da usina de energia. -A fornalha deve ser preenchida com carvão ou carvão vegetal. O tempo de queima depende da potência solicitada pela usina. Carvão queima por 20s e carvão vegetal por 60s em carga total. Proporcionalmente mais tempo em carga parcial (50% de carga = dobro do tempo). - -[ta3_firebox|image] - -### TA3 Queimador de Óleo da Usina de Energia - -Parte da usina de energia. - -O queimador de óleo pode ser preenchido com óleo cru, óleo combustível, nafta ou gasolina. O tempo de queima depende da potência solicitada pela usina. Em carga total, óleo cru queima por 15s, óleo combustível por 20s, nafta por 22s e gasolina por 25s. - -Proporcionalmente mais tempo em carga parcial (50% de carga = dobro do tempo). - -O queimador de óleo pode armazenar apenas 50 unidades de combustível. Recomenda-se, portanto, um tanque de óleo adicional e uma bomba de óleo. - - -[ta3_oilbox|image] - -### TA3 Base / Topo da Caldeira - -Parte da usina de energia. Deve ser preenchida com água. Se não houver mais água ou a temperatura diminuir muito, a usina desliga. - -O consumo de água da caldeira TA3 é muito menor do que o da máquina a vapor devido ao circuito de vapor fechado. -Com a máquina a vapor, parte da água é perdida como vapor a cada curso do pistão. - -[ta3_boiler|image] - - -### TA3 Turbina - -A turbina faz parte da usina de energia. Deve ser colocada ao lado do gerador e conectada à caldeira e ao resfriador por meio de tubos de vapor, conforme mostrado no plano. - -[ta3_turbine|image] - -### TA3 Gerador - -O gerador é usado para gerar eletricidade. Deve ser conectado às máquinas por meio de cabos de energia e caixas de junção. - -[ta3_generator|image] - - -### TA3 Cooler - -Usado para resfriar o vapor quente da turbina. Deve ser conectado à caldeira e à turbina por meio de tubos de vapor, conforme mostrado no plano. - -[ta3_cooler|image] - -## Corrente elétrica - -Em TA3 (e TA4), as máquinas são alimentadas por eletricidade. Para isso, máquinas, sistemas de armazenamento e geradores devem ser conectados com cabos de energia. -TA3 possui 2 tipos de cabos de energia: - -- Cabos isolados (cabos de energia TA) para instalação local no chão ou em edifícios. Esses cabos podem ser ocultos na parede ou no chão (podem ser "revestidos" com a colher de pedreiro). -- Linhas aéreas (linha de energia TA) para cabeamento externo em longas distâncias. Esses cabos são protegidos e não podem ser removidos por outros jogadores. - -Vários consumidores, sistemas de armazenamento e geradores podem ser operados juntos em uma rede de energia. Redes podem ser configuradas com a ajuda das caixas de junção. -Se houver pouca eletricidade fornecida, os consumidores ficam sem energia. -Nesse contexto, também é importante entender a funcionalidade dos blocos de Forceload, porque os geradores, por exemplo, só fornecem eletricidade quando o bloco de mapa correspondente está carregado. Isso pode ser imposto com um bloco de Forceload. - -Em TA4, também existe um cabo para o sistema solar. - -[ta3_powerswitch|image] - -### Importância dos sistemas de armazenamento - -Os sistemas de armazenamento na rede elétrica desempenham duas funções: - -- Lidar com picos de demanda: Todos os geradores sempre fornecem exatamente a quantidade de energia necessária. No entanto, se os consumidores forem ligados/desligados ou houver flutuações na demanda por outros motivos, os consumidores podem falhar por um curto período. Para evitar isso, deve sempre haver pelo menos um bloco de bateria em cada rede. Isso serve como um buffer e compensa essas flutuações na faixa de segundos. -- Armazenar energia regenerativa: Solar e eólica não estão disponíveis 24 horas por dia. Para que o fornecimento de energia não falhe quando não há produção de eletricidade, um ou mais sistemas de armazenamento devem ser instalados na rede. Alternativamente, as lacunas também podem ser preenchidas com eletricidade de óleo/carvão. - -Um sistema de armazenamento indica sua capacidade em kud, ou seja, ku por dia. Por exemplo, um sistema de armazenamento com 100 kud fornece 100 ku por um dia de jogo, ou 10 ku por 10 dias de jogo. - -Todas as fontes de energia TA3/TA4 têm características de carregamento ajustáveis. Por padrão, isso é configurado para "80% - 100%". Isso significa que, quando o sistema de armazenamento estiver 80% cheio, a saída é reduzida cada vez mais até desligar completamente em 100%. Se eletricidade for necessária na rede, nunca se atingirá 100%, pois a potência do gerador em algum momento caiu para a demanda de eletricidade na rede e o sistema de armazenamento não está mais sendo carregado, mas apenas os consumidores estão sendo atendidos. - -Isso tem várias vantagens: - -- As características de carregamento são ajustáveis. Isso significa, por exemplo, que as fontes de energia de óleo/carvão podem ser reduzidas em 60% e as fontes de energia renovável apenas em 80%. Isso significa que o óleo/carvão só é queimado se não houver energia renovável suficiente disponível. -- Várias fontes de energia podem ser operadas em paralelo e são carregadas quase uniformemente, porque todas as fontes de energia trabalham, por exemplo, até 80% da capacidade de carga do sistema de armazenamento em sua capacidade total e depois reduzem sua capacidade ao mesmo tempo. -- Todos os sistemas de armazenamento em uma rede formam um grande buffer. A capacidade de carga e o nível de preenchimento de todo o sistema de armazenamento podem sempre ser lidos em percentagem em todos os sistemas de armazenamento, mas também no terminal de eletricidade. - -[power_reduction|image] - -### TA3 Cabo Elétrico - -Para fiação local no chão ou em construções. -Ramos podem ser realizados usando caixas de junção. O comprimento máximo do cabo entre máquinas ou caixas de junção é de 1000 m. Um máximo de 1000 nós pode ser conectado em uma rede elétrica. Todos os blocos com conexão elétrica, incluindo caixas de junção, contam como nós. - -Como os cabos elétricos não são automaticamente protegidos, as linhas aéreas (TA power line) são recomendadas para distâncias mais longas. - -Os cabos elétricos podem ser rebocados com a colher de alvenaria para que fiquem ocultos na parede ou no chão. Todos os blocos de pedra, argila e outros blocos sem "inteligência" podem ser usados como material de reboco. A sujeira não funciona porque pode ser convertida em grama ou algo semelhante, o que destruiria a linha. - -Para rebocar, o cabo deve ser clicado com a colher de alvenaria. O material com o qual o cabo deve ser rebocado deve estar no canto mais à esquerda do inventário do jogador. -Os cabos podem ser tornados visíveis novamente clicando no bloco com a colher de alvenaria. - -Além dos cabos, a caixa de junção TA e a caixa de interruptores de energia TA também podem ser rebocadas. - -[ta3_powercable|image] - -### TA Caixa de Junção Elétrica - -Com a caixa de junção, a eletricidade pode ser distribuída em até 6 direções. Caixas de junção também podem ser rebocadas (ocultas) com uma colher de alvenaria e tornadas visíveis novamente. - -[ta3_powerjunction|image] - -### TA Linha de Energia - -Com a linha de energia TA e os postes de eletricidade, é possível realizar linhas aéreas razoavelmente realistas. As cabeças dos postes também servem para proteger a linha de energia (proteção). Um poste deve ser colocado a cada 16 m ou menos. A proteção se aplica apenas à linha de energia e aos postes; no entanto, todos os outros blocos nesta área não estão protegidos. - -[ta3_powerline|image] - -### TA Poste de Energia -Usado para construir postes de eletricidade. É protegido contra destruição pela cabeça do poste de eletricidade e só pode ser removido pelo proprietário. - -[ta3_powerpole|image] - -### TA Topo do Poste de Energia -Possui até quatro braços e permite assim a distribuição de eletricidade em até 6 direções. -A cabeça do poste de eletricidade protege as linhas de energia e os postes dentro de um raio de 8 m. - -[ta3_powerpole4|image] - -### TA Topo do Poste de Energia 2 - -Esta cabeça de poste de eletricidade tem dois braços fixos e é usada para as linhas aéreas. No entanto, também pode transmitir corrente para baixo e para cima. -A cabeça do poste de eletricidade protege as linhas de energia e os postes dentro de um raio de 8 m. - -[ta3_powerpole2|image] - -### TA Interruptor de Energia - -O interruptor pode ser usado para ligar e desligar a energia. Para isso, o interruptor deve ser colocado em uma caixa de interruptor de energia. A caixa de interruptor de energia deve ser conectada ao cabo de energia em ambos os lados. - -[ta3_powerswitch|image] - -### TA Interruptor de Energia Pequeno - -O interruptor pode ser usado para ligar e desligar a energia. Para isso, o interruptor deve ser colocado em uma caixa de interruptor de energia. A caixa de interruptor de energia deve ser conectada ao cabo de energia em ambos os lados. - -[ta3_powerswitchsmall|image] - -### TA Caixa de Interruptor de Energia - -Veja o interruptor de energia TA. - -[ta3_powerswitchbox|image] - -### TA3 Pequeno Gerador de Energia - -O pequeno gerador de energia funciona com gasolina e pode ser usado para consumidores pequenos com até 12 ku. A gasolina queima por 150s em carga total. Correspondentemente mais tempo em carga parcial (50% de carga = tempo duplo). - -O gerador de energia só pode armazenar 50 unidades de gasolina. Portanto, é aconselhável um tanque adicional e uma bomba. - -[ta3_tinygenerator|image] - -### TA3 Bloco Acumulador - -O bloco acumulador (bateria recarregável) é usado para armazenar energia excedente e fornece automaticamente energia em caso de queda de energia (se disponível). -Vários blocos de acumulador juntos formam um sistema de armazenamento de energia TA3. Cada bloco de acumulador possui um display para o estado de carga e para a carga armazenada. -Os valores para toda a rede são sempre exibidos aqui. A carga armazenada é exibida em "kud" ou "ku-dias" (análogo a kWh). Assim, 5 kud correspondem, por exemplo, a 5 ku para um dia de jogo (20 minutos) ou 1 ku para 5 dias de jogo. - -Um bloco de acumulador tem 3,33 kud. - -[ta3_akkublock|image] - -### TA3 Terminal de Energia - -O terminal de energia deve ser conectado à rede elétrica. Ele exibe dados da rede elétrica. - -As informações mais importantes são exibidas na metade superior: - -- potência do gerador atual/máxima -- consumo de energia atual de todos os consumidores -- corrente de carga atual dentro/fora do sistema de armazenamento -- Estado de carga atual do sistema de armazenamento em percentual - -O número de blocos da rede é exibido na metade inferior. - -Dados adicionais sobre os geradores e sistemas de armazenamento podem ser consultados através da guia "console". - -[ta3_powerterminal|image] - -### TA3 Motor Elétrico - -O Motor Elétrico TA3 é necessário para operar as máquinas TA2 através da rede elétrica. O Motor Elétrico TA3 converte eletricidade em potência de eixo. -Se o motor elétrico não for alimentado com energia suficiente, ele entra em um estado de falha e deve ser reativado com um clique direito. - -O motor elétrico consome no máximo 40 ku de eletricidade e fornece do outro lado no máximo 39 ku como potência de eixo. Portanto, ele consome um ku para a conversão. - -[ta3_motor|image] - - -## TA3 Forno Industrial - -O forno industrial TA3 serve como complemento aos fornos normais. Isso significa que todos os produtos podem ser fabricados com receitas de "cozimento", mesmo em um forno industrial. No entanto, também existem receitas especiais que só podem ser feitas em um forno industrial. -O forno industrial possui seu próprio menu para seleção de receitas. Dependendo dos produtos no inventário do forno industrial à esquerda, o produto de saída pode ser selecionado à direita. - -O forno industrial requer eletricidade (para o impulsionador) e óleo combustível/gasolina para o queimador. O forno industrial deve ser montado conforme mostrado no plano à direita. - -Veja também o aquecedor TA4. - -[ta3_furnace|plan] - -### TA3 Forno - Queimador de Óleo - -Parte do forno industrial TA3. - -O queimador de óleo pode ser operado com óleo bruto, óleo combustível, nafta ou gasolina. O tempo de queima é de 64 s para óleo bruto, 80 s para óleo combustível, 90 s para nafta e 100 s para gasolina. - -O queimador de óleo pode armazenar apenas 50 unidades de combustível. Portanto, é aconselhável um tanque adicional e uma bomba. - -[ta3_furnacefirebox|image] - -### TA3 Forno - Parte Superior - -Faz parte do forno industrial TA3. Consulte o forno industrial TA3. - -[ta3_furnace|image] - -### TA3 Reforço - -Faz parte do forno industrial TA3. Consulte o forno industrial TA3. - -[ta3_booster|image] - - -## Líquidos - -Líquidos como água ou óleo só podem ser bombeados através de tubulações especiais e armazenados em tanques. Assim como com a água, existem recipientes (latas, barris) nos quais o líquido pode ser armazenado e transportado. - -Também é possível conectar vários tanques usando as tubulações amarelas e conectores. No entanto, os tanques devem ter o mesmo conteúdo e sempre deve haver pelo menos um tubo amarelo entre o tanque, a bomba e o tubo distribuidor. - -Por exemplo, não é possível conectar dois tanques diretamente a um tubo distribuidor. - -O enchimento de líquidos é usado para transferir líquidos de recipientes para tanques. O plano mostra como latas ou barris com líquidos são empurrados para um enchimento de líquidos através de empurradores. O recipiente é esvaziado no enchimento de líquidos e o líquido é conduzido para baixo no tanque. - -O enchimento de líquidos também pode ser colocado sob um tanque para esvaziar o tanque. - -[ta3_tank|plan] - -### TA3 Tanque - -Líquidos podem ser armazenados em um tanque. Um tanque pode ser preenchido ou esvaziado usando uma bomba. Para fazer isso, a bomba deve ser conectada ao tanque por meio de um tubo (tubos amarelos). - -Um tanque também pode ser preenchido ou esvaziado manualmente clicando no tanque com um recipiente de líquido cheio ou vazio (barril, galão). Deve-se observar que os barris só podem ser completamente preenchidos ou esvaziados. Se, por exemplo, houver menos de 10 unidades no tanque, esse restante deve ser removido com galões ou esvaziado com uma bomba. - -Um tanque TA3 pode armazenar 1000 unidades ou 100 barris de líquido. - -[ta3_tank|image] - -### TA3 Bomba - -A bomba pode ser usada para bombear líquidos de tanques ou recipientes para outros tanques ou recipientes. A direção da bomba (seta) deve ser observada. As linhas amarelas e os conectores também permitem organizar vários tanques em cada lado da bomba. No entanto, os tanques devem ter o mesmo conteúdo. - -A bomba TA3 bombeia 4 unidades de líquido a cada dois segundos. - -Observação 1: A bomba não deve ser colocada diretamente ao lado do tanque. Deve sempre haver pelo menos um pedaço de tubo amarelo entre eles. - -[ta3_pump|image] - -### TA Liquid Filler - -O liquid filler é usado para transferir líquidos entre recipientes e tanques. - -- Se o liquid filler for colocado sob um tanque e barris vazios forem colocados no liquid filler com um empurrador ou manualmente, o conteúdo do tanque é transferido para os barris e os barris podem ser removidos da saída -- Se o liquid filler for colocado em cima de um tanque e se recipientes cheios forem colocados no liquid filler com um empurrador ou manualmente, o conteúdo é transferido para o tanque e os recipientes vazios podem ser removidos no lado de saída - -Deve-se observar que os barris só podem ser completamente cheios ou esvaziados. Se, por exemplo, houver menos de 10 unidades no tanque, este restante deve ser removido com recipientes ou bombeado vazio. - -[ta3_filler|image] - -### TA4 Tubos(pipe) - -Os tubos amarelos são usados para a transmissão de gás e líquidos. -O comprimento máximo do tubo é 100m. - -[ta3_pipe|image] - -### TA3 Tubos de parede (entre-blocos) - -Os blocos servem como aberturas de parede para os tubos, para que não fiquem buracos abertos. - -[ta3_pipe_wall_entry|image] - -### TA Válvula - -Existe uma válvula para os tubos amarelos, que pode ser aberta e fechada com um clique do mouse. -A válvula também pode ser controlada por comandos ligar/desligar. - -[ta3_valve|image] - - -## Produção de Óleo - -Para alimentar seus geradores e fogões com óleo, você deve primeiro procurar óleo e construir uma torre de perfuração para extrair o óleo. -Para isso, são utilizados o explorador de óleo TA3, a caixa de perfuração de óleo TA3 e o macaco de bomba de óleo TA3. - -[techage_ta3|image] - -### TA3 Explorador de petróleo - -Você pode procurar petróleo com o explorador de petróleo. Para fazer isso, coloque o bloco no chão e clique com o botão direito para iniciar a busca. O explorador de petróleo pode ser usado tanto acima quanto abaixo do solo em todas as profundidades. -A saída do chat mostra a profundidade até a qual o petróleo foi procurado e quanto petróleo foi encontrado. -Você pode clicar várias vezes no bloco para procurar petróleo em áreas mais profundas. Os campos de petróleo variam em tamanho de 4.000 a 20.000 itens. - -Se a busca não der certo, você deve mover o bloco aproximadamente 16 m para frente. -O explorador de petróleo sempre procura petróleo em todo o bloco do mapa e abaixo, no qual foi colocado. Uma nova busca no mesmo bloco do mapa (campo 16x16) portanto, não faz sentido. - -Se o petróleo for encontrado, a localização para a torre de perfuração é exibida. Você precisa erguer a torre de perfuração dentro da área mostrada, é melhor marcar o local com uma placa e proteger toda a área contra jogadores estrangeiros. - -Não desista de procurar petróleo muito rapidamente. Se tiver azar, pode levar muito tempo para encontrar um poço de petróleo. -Também não faz sentido procurar em uma área que outro jogador já tenha procurado. A chance de encontrar petróleo é a mesma para todos os jogadores. - -O explorador de petróleo pode ser sempre usado para procurar petróleo. - -[ta3_oilexplorer|image] - -### TA3 Caixa de perfuração de petróleo - -A caixa de perfuração de petróleo deve ser colocada na posição indicada pelo explorador de petróleo. Perfurar petróleo em outro lugar não tem sentido. -Se o botão na caixa de perfuração de petróleo for clicado, a torre de perfuração será erguida acima da caixa. Isso leva alguns segundos. -A caixa de perfuração de petróleo tem 4 lados, em IN o tubo de perfuração deve ser entregue via pusher e em OUT o material de perfuração deve ser removido. A caixa de perfuração de petróleo deve ser alimentada com eletricidade por um dos outros dois lados. - -A caixa de perfuração de petróleo perfura até o campo de petróleo (1 metro em 16 s) e requer 16 ku de eletricidade. -Depois que o campo de petróleo for alcançado, a torre de perfuração pode ser desmontada e a caixa removida. - -[ta3_drillbox|image] - -### TA3 Bomba de petróleo - -A bomba de petróleo (pumpjack) deve ser colocada no lugar da caixa de perfuração de petróleo. A bomba de petróleo também requer eletricidade (16 ku) e fornece uma unidade de petróleo a cada 8 segundos. O petróleo deve ser coletado em um tanque. Para fazer isso, a bomba de petróleo deve ser conectada ao tanque por meio de tubos amarelos. -Depois que todo o petróleo for bombeado para fora, a bomba de petróleo também pode ser removida. - -[ta3_pumpjack|image] - -### TA3 Haste de perfuração - -A haste de perfuração é necessária para perfurar. Tantos itens de haste de perfuração são necessários quanto a profundidade especificada para o campo de petróleo. A haste de perfuração é inútil após a perfuração, mas também não pode ser desmontada e permanece no solo. No entanto, há uma ferramenta para remover os blocos de haste de perfuração (-> Ferramentas -> TA3 Alicate de haste de perfuração(drill pipe pliers)). - -[ta3_drillbit|image] - -### Tanque de petróleo - -O tanque de petróleo é a versão grande do tanque TA3 (ver líquidos -> Tanque TA3). - -O tanque grande pode armazenar 4000 unidades de petróleo, mas também qualquer outro tipo de líquido. - -[oiltank|image] - - -## Transporte de Petróleo - -### Transporte de Petróleo por Vagões Tanque - -Os vagões tanque podem ser usados para transportar petróleo do poço de petróleo para a usina de processamento de petróleo. Um vagão tanque pode ser preenchido ou esvaziado diretamente usando bombas. Em ambos os casos, os tubos amarelos devem ser conectados ao vagão tanque de cima. - -Os seguintes passos são necessários: - -- Coloque o vagão tanque na frente do bloco para-choque da ferrovia. O bloco para-choque ainda não deve estar programado com um tempo para que o vagão tanque não comece automaticamente. -- Conecte o vagão tanque à bomba usando tubos amarelos. -- Ligue a bomba. -- Programe o para-choque com um tempo (10 - 20s). - -Essa sequência deve ser observada em ambos os lados (encher / esvaziar). - -[tank_cart|image] - -### Oil transportation with barrels over Minecarts - -Canisters and barrels can be loaded into the Minecarts. To do this, the oil must first be transferred to barrels. The oil barrels can be pushed directly into the Minecart with a pusher and tubes (see map). The empty barrels, which come back from the unloading station by Minecart, can be unloaded using a hopper, which is placed under the rail at the stop. - -It is not possible with the hopper to both **unload the empty barrels and load the full barrels at a stop**. The hopper immediately unloads the full barrels. It is therefore advisable to set up 2 stations on the loading and unloading side and then program the Minecart accordingly using a recording run. - -The plan shows how the oil can be pumped into a tank and filled into barrels via a liquid filler and loaded into Minecarts. - -For the Minecarts to start again automatically, the bumper blocks must be configured with the station name and waiting time. 5 s are sufficient for unloading. However, since the pushers always go into standby for several seconds when there is no Minecart, a time of 15 or more seconds must be entered for loading. - -[ta3_loading|plan] - -### Transporte de Petróleo com Barris por Minecarts - -As latas e barris podem ser carregados nos Minecarts. Para fazer isso, o petróleo deve primeiro ser transferido para os barris. Os barris de petróleo podem ser empurrados diretamente para dentro do Minecart com um empurrador e tubos (veja o mapa). Os barris vazios, que retornam da estação de descarga por Minecart, podem ser descarregados usando um funil, que é colocado sob os trilhos na parada. - -Não é possível com o funil **descarregar os barris vazios e carregar os barris cheios em uma parada**. O funil descarrega imediatamente os barris cheios. Portanto, é aconselhável configurar 2 estações no lado de carregamento e descarregamento e, em seguida, programar o Minecart de acordo com uma corrida de gravação. - -O plano mostra como o petróleo pode ser bombeado para um tanque, preenchido em barris via um dispositivo de enchimento de líquidos e carregado em Minecarts. - -Para que os Minecarts reiniciem automaticamente, os blocos para-choque devem ser configurados com o nome da estação e o tempo de espera. 5 segundos são suficientes para descarregar. No entanto, como os empurradores sempre entram em espera por vários segundos quando não há Minecart, um tempo de 15 segundos ou mais deve ser inserido para carregar. - -[ta3_loading|plan] - -### Carrinho-tanque - -O carrinho-tanque é usado para transportar líquidos. Assim como os tanques, ele pode ser cheio com bombas ou esvaziado. Em ambos os casos, o tubo amarelo deve ser conectado ao caminhão-tanque de cima. - -Cabem 200 unidades no caminhão-tanque. - -[tank_cart|image] - -### Carrinho-baú - -O carrinho-baú é usado para transportar itens. Assim como os baús, ele pode ser cheio ou esvaziado usando um empurrador. - -Cabem 4 pilhas no carrinho de baú. - -[chest_cart|image] - - -## Processamento de Petróleo - -O petróleo é uma mistura de substâncias e consiste em muitos componentes. O petróleo pode ser decomposto em seus principais componentes, como betume, óleo combustível, nafta, gasolina e gás propano, por meio de uma torre de destilação. -O processamento adicional para produtos finais ocorre no reator químico. - -[techage_ta31|image] - -### Torre de Destilação - -A torre de destilação deve ser montada como no plano no canto superior direito. -O betume é drenado pelo bloco de base. A saída está na parte de trás do bloco de base (observe a direção da seta). -Os blocos "torre de destilação" com os números: 1, 2, 3, 2, 3, 2, 3, 4 são colocados sobre este bloco base. -Óleo combustível, nafta e gasolina são drenados das aberturas de baixo para cima. O gás propano é capturado no topo. -Todas as aberturas na torre devem ser conectadas a tanques. -O reboiler deve ser conectado ao bloco "torre de destilação 1". - -O reboiler precisa de eletricidade (não mostrado no plano)! - -[ta3_distiller|plan] - -#### Refervedor(Reboiler) - -O reboiler aquece o petróleo para aproximadamente 400 °C. Ele evapora em grande parte e é alimentado na torre de destilação para resfriamento. - -O reboiler requer 14 unidades de eletricidade e produz uma unidade de betume, óleo combustível, nafta, gasolina e propano a cada 16s. -Para isso, o reboiler deve ser alimentado com petróleo por meio de uma bomba. - -[reboiler|image] - - -## Blocos Lógicos / de Comutação - -Além dos tubos para transporte de mercadorias, bem como os tubos de gás e energia, há também um nível de comunicação sem fio através do qual os blocos podem trocar dados entre si. Não é necessário desenhar linhas para isso, a conexão entre transmissor e receptor é feita apenas através do número do bloco. - -**Info:** Um número de bloco é um número único gerado pelo Techage quando muitos blocos do Techage são colocados. O número do bloco é usado para endereçamento durante a comunicação entre controladores e máquinas Techage. Todos os blocos que podem participar dessa comunicação mostram o número do bloco como texto de informações se você fixar o bloco com o cursor do mouse. - -Quais comandos um bloco suporta podem ser lidos e exibidos com a TechAge Info Tool (chave inglesa ou wrench). -Os comandos mais simples suportados por quase todos os blocos são: - -- `on` - para ligar o bloco / máquina / lâmpada -- `off` - para desligar o bloco / máquina / lâmpada - -Com a ajuda do Terminal TA3, esses comandos podem ser testados muito facilmente. Suponha que uma lâmpada de sinalização seja o número 123. -Então com: - - cmd 123 on - -a lâmpada pode ser ligada e com: - - cmd 123 off - -a lâmpada pode ser desligada novamente. Esses comandos devem ser inseridos no campo de entrada do terminal TA3. - -Comandos como `on` e `off` são enviados ao destinatário sem que uma resposta seja enviada de volta. Portanto, esses comandos podem ser enviados para vários destinatários ao mesmo tempo, por exemplo, com um botão de pressão / interruptor, se vários números forem inseridos no campo de entrada. - -Um comando como `state` solicita o status de um bloco. O bloco então envia seu status de volta. Esse tipo de comando confirmado só pode ser enviado para um destinatário de cada vez. -Esse comando também pode ser testado com o terminal TA3 em um empurrador, por exemplo: - - cmd 123 state - -As respostas possíveis do empurrador são: -- `running` -> Estou funcionando -- `stopped` -> desligado -- `standby` -> nada a fazer porque o inventário da fonte está vazio -- `blocked` -> não pode fazer nada porque o inventário de destino está cheio - -Esse status e outras informações também são exibidos quando a chave inglesa(wrench) é clicada no bloco. - -[ta3_logic|image] - -### TA3 Botão / Interruptor -O botão/interruptor envia comandos `on` / `off` para os blocos que foram configurados através dos números. -O botão/interruptor pode ser configurado como um botão ou um interruptor. Se for configurado como um botão, o tempo entre os comandos `on` e `off` pode ser definido. Com o modo de operação "no botão", apenas um comando `on` e nenhum comando `off` é enviado. - -A caixa de seleção "público" pode ser usada para definir se o botão pode ser usado por todos (marcado) ou apenas pelo próprio proprietário (não marcado). - -Nota: Com o programador, os números dos blocos podem ser facilmente coletados e configurados. - -[ta3_button|image] - -### TA3 Conversor de Comandos - -Com o conversor de comandos TA3, os comandos `on` / `off` podem ser convertidos em outros comandos, e o encaminhamento pode ser impedido ou atrasado. -Deve-se inserir o número do bloco de destino ou os números dos blocos de destino, os comandos a serem enviados e os tempos de atraso em segundos. Se nenhum comando for inserido, nada será enviado. - -Os números também podem ser programados usando o programador Techage(programmer). - -[ta3_command_converter|image] - -### TA3 Flip-Flop - -O flip-flop TA3 muda de estado a cada comando `on` recebido. Os comandos `off` recebidos são ignorados. Dependendo da alteração de status, os comandos `on` / `off` são enviados alternadamente. Deve-se inserir o número do bloco de destino ou os números dos blocos de destino. Os números também podem ser programados usando o programador Techage. - -Por exemplo, lâmpadas podem ser ligadas e desligadas com a ajuda de botões. - -[ta3_flipflop|image] - -### Bloco Lógico TA3 - -O bloco lógico TA3 pode ser programado de forma que um ou mais comandos de entrada estejam vinculados a um comando de saída e sejam enviados. Este bloco pode, portanto, substituir vários elementos lógicos, como AND, OR, NOT, XOR, etc. -Os comandos de entrada para o bloco lógico são comandos `ligar` / `desligar`. -Os comandos de entrada são referenciados pelo número, por exemplo, `1234` para o comando do remetente com o número 1234. -O mesmo se aplica aos comandos de saída. - -Uma regra é estruturada da seguinte forma: - -``` - = on/off if is true -``` - -`` é o número do bloco para o qual o comando deve ser enviado. -`` é uma expressão booleana onde os números de entrada são avaliados. - -**Exemplos para a expressão de entrada** - -Negar sinal (NOT): - - 1234 == off - -AND lógico: - - 1234 == on e 2345 == on - -OR lógico: - - 1234 == ligar ou 2345 == ligar - -Os seguintes operadores são permitidos: `and` `or` `on` `off` `me` `==` `~=` `(` `)` - -Se a expressão for verdadeira, um comando é enviado para o bloco com o número ``. -Até quatro regras podem ser definidas, sendo que todas as regras são sempre verificadas quando um comando é recebido. -O tempo interno de processamento para todos os comandos é de 100 ms. - -Seu próprio número de nó pode ser referenciado usando a palavra-chave `me`. Isso permite que o bloco envie a si mesmo um comando (função flip-flop). - -O tempo de bloqueio define uma pausa após um comando, durante a qual o bloco lógico não aceita mais comandos externos. Comandos recebidos durante o período de bloqueio são descartados. O tempo de bloqueio pode ser definido em segundos. - -[ta3_logic|image] - -### TA3 Repetidor - -O repetidor envia o sinal recebido para todos os números configurados. -Isso pode fazer sentido, por exemplo, se você quiser controlar muitos blocos ao mesmo tempo. O repetidor pode ser configurado com o programador, o que não é possível com todos os blocos. - -[ta3_repeater|image] - -### TA3 Sequenciador - -O sequenciador pode enviar uma série de comandos `on` / `off`, em que o intervalo entre os comandos deve ser especificado em segundos. Você pode usá-lo para fazer uma lâmpada piscar, por exemplo. -Até 8 comandos podem ser configurados, cada um com número de bloco de destino e aguardando o próximo comando. -O sequenciador repete os comandos indefinidamente quando "Run endless" está ativado. -Se nada for selecionado, apenas o tempo especificado em segundos é aguardado. - -[ta3_sequencer|image] - -### TA3 Temporizador - -O temporizador pode enviar comandos controlados pelo tempo. O horário, o(s) número(s) de destino e o comando em si podem ser especificados para cada linha de comando. Isso significa que as lâmpadas podem ser ligadas à noite e desligadas pela manhã. - -[ta3_timer|image] - -### TA3 Terminal - -O terminal é usado principalmente para testar a interface de comando de outros blocos (veja "Blocos lógicos / de comutação"). -Você também pode atribuir comandos a teclas e usar o terminal de maneira produtiva. - - set - -Com `set 1 ON cmd 123 on`, por exemplo, a tecla do usuário 1 pode ser programada com o comando `cmd 123 on`. Se a tecla for pressionada, o comando é enviado e a resposta é exibida na tela. - -O terminal possui os seguintes comandos locais: -- `clear` limpa a tela -- `help` exibe uma página de ajuda -- `pub` alterna para o modo público -- `priv` alterna para o modo privado - -No modo privado, o terminal só pode ser usado por jogadores que podem construir neste local, ou seja, que têm direitos de proteção. - -No modo público, todos os jogadores podem usar as teclas preconfiguradas. - -[ta3_terminal|image] - - -### Lâmpada Colorida TechAge - -A lâmpada de sinalização pode ser ligada ou desligada com o comando `on` / `off`. Esta lâmpada não precisa de eletricidade e pode ser colorida com a ferramenta de aerografia do mod "Dyes Unificados" e via comandos Lua/Beduino. - -Com o comando de chat `/ta_color`, a paleta de cores com os valores para os comandos Lua/Beduino é exibida e com `/ta_send color ` a cor pode ser alterada. - -[ta3_colorlamp|image] - -### Blocos de Porta/Portão - -Com esses blocos, você pode criar portas e portões que podem ser abertos por meio de comandos (blocos desaparecem) e fechados novamente. Um controlador de porta é necessário para cada portão ou porta. - -A aparência dos blocos pode ser ajustada por meio do menu de blocos. -Isso permite a criação de portas secretas que só se abrem para certos jogadores (com a ajuda do detector de jogadores). - -[ta3_doorblock|image] - -### TA3 Controlador de Porta - -O controlador de porta é usado para controlar os blocos de porta/portão TA3. Com o controlador de porta, os números dos blocos de porta/portão devem ser inseridos. Se um comando `on` / `off` for enviado para o controlador de porta, isso abre/fecha a porta ou portão. - -[ta3_doorcontroller|image] - -### Controlador de Porta TA3 II - -O Controlador de Porta II pode remover e definir todos os tipos de blocos. Para ensinar ao Controlador de Porta II, o botão "Record" deve ser pressionado. Em seguida, todos os blocos que devem fazer parte da porta/portão devem ser clicados. Depois, o botão "Done" deve ser pressionado. Até 16 blocos podem ser selecionados. Os blocos removidos são salvos no inventário do controlador. A função do controlador pode ser testada manualmente usando os botões "Remove" ou "Set". Se um comando `on` /`off` for enviado para o Controlador de Porta II, ele remove ou define os blocos também. - -Com `$send_cmnd(número_do_nó, "exchange", 2)` blocos individuais podem ser definidos, removidos ou substituídos por outros blocos do inventário. - -Com `$send_cmnd(número_do_nó, "set", 2)` um bloco do inventário pode ser definido explicitamente, desde que o slot do inventário não esteja vazio. - -Um bloco pode ser removido novamente com `$send_cmnd(número_do_nó, "dig", 2)` se o slot do inventário estiver vazio. - -O nome do bloco definido é retornado com `$send_cmnd(número_do_nó, "get", 2)`. - -O número do slot do inventário (1 .. 16) deve ser passado como carga útil em todos os três casos. - -Isso também pode ser usado para simular escadas extensíveis e coisas do tipo. - -[ta3_doorcontroller|image] - -### TA3 Bloco de Som - -Diferentes sons podem ser reproduzidos com o bloco de som. Todos os sons dos Mods Techage, Signs Bot, Hyperloop, Unified Inventory, TA4 Jetpack e Minetest Game estão disponíveis. - -Os sons podem ser selecionados e reproduzidos pelo menu e via comando. - -- Comando `on` para reproduzir um som -- Comando `sound <índice>` para selecionar um som via o índice -- Comando `gain ` para ajustar o volume via o valor `` (1 a 5). - -[ta3_soundblock|image] - -### TA3 Conversor Mesecons - -O conversor Mesecons é utilizado para converter comandos de ligar/desligar do Techage em sinais Mesecons e vice-versa. -Para fazer isso, um ou mais números de nó devem ser inseridos e o conversor deve ser conectado a blocos Mesecons por meio de cabos Mesecons. O conversor Mesecons também pode ser configurado com o programador. -O conversor Mesecons aceita até 5 comandos por segundo; ele se desativa em cargas mais altas. - -**Este nó só existe se o mod mesecons estiver ativo!** - -[ta3_mesecons_converter|image] - - -## Detectores - -Os detectores escaneiam o ambiente e enviam um comando `on` quando a busca é reconhecida. - -[ta3_nodedetector|image] - - -### TA3 Detector - -O detector é um bloco de tubo especial que detecta quando itens passam pelo tubo. Para fazer isso, ele deve ser conectado a tubos dos dois lados. Se os itens forem empurrados para o detector com um empurrador(pusher), eles são passados automaticamente. -Ele envia um comando `on` quando um item é reconhecido, seguido por um `off` um segundo depois. -Em seguida, outros comandos são bloqueados por 8 segundos. -O tempo de espera e os itens que devem acionar um comando podem ser configurados usando o menu de chave inglesa(wrench). - -[ta3_detector|image] - -### TA3 Cart Detector - -O detector de carrinho envia um comando `on` se reconhecer um carrinho (Minecart) diretamente na frente dele. Além disso, o detector também pode reiniciar o carrinho quando recebe um comando `on`. - -O detector também pode ser programado com seu próprio número. Nesse caso, ele empurra todos os vagões que param perto dele (um bloco em todas as direções). - -[ta3_cartdetector|image] - - -### TA3 Node Detector - -O detector de nó envia um comando `on` se detectar que nós (blocos) aparecem ou desaparecem na frente dele, mas deve ser configurado de acordo. Após retornar o detector ao estado padrão (bloco cinza), um comando `off` é enviado. Blocos válidos são todos os tipos de blocos e plantas, mas não animais ou jogadores. O alcance do sensor é de 3 blocos por metro na direção da seta. - -[ta3_nodedetector|image] - -### TA3 Detector de jogador(Player detector) - -O detector de jogador envia um comando `on` se detectar um jogador dentro de 4m do bloco. Se o jogador sair da área, um comando `off` é enviado. -Se a pesquisa deve ser limitada a jogadores específicos, esses nomes de jogador também podem ser inseridos. - -[ta3_playerdetector|image] - -### TA3 Detector de luz(Light detector) - -O detector de luz envia um comando `on` se o nível de luz do bloco acima exceder um certo nível, que pode ser definido através do menu de clique direito. -Se você tiver um Controlador Lua TA4, pode obter o nível exato de luz com $get_cmd(num, 'light_level') - -[ta3_lightdetector|image] - - -## Máquinas TA3 - -TA3 possui as mesmas máquinas que o TA2, apenas estas são mais poderosas e requerem eletricidade em vez de movimento por eixo. -Portanto, abaixo são fornecidos apenas os dados técnicos diferentes. - -[ta3_grinder|image] - - -### TA3 Pusher - -A função corresponde à do TA2. -A capacidade de processamento é de 6 itens a cada 2 segundos. - -[ta3_pusher|image] - -### TA3 Distributor - -A função do Distribuidor TA3 corresponde à do TA2. -A capacidade de processamento é de 12 itens a cada 4 segundos. - -[ta3_distributor|image] - - -### TA3 Autocrafter - -A função corresponde à do TA2. -A capacidade de processamento é de 2 itens a cada 4 segundos. O autocrafter requer 6 ku de eletricidade. - -[ta3_autocrafter|image] - - -### TA3 Electronic Fab - -A função corresponde à do TA2, apenas os chips WLAN do TA4 são produzidos aqui. -A capacidade de processamento é de um chip a cada 6 segundos. O bloco requer 12 ku de eletricidade para isso. - -[ta3_electronicfab|image] - -### TA3 Quarry - -A função corresponde à do TA2. -A profundidade máxima é de 40 metros. A pedreira requer 12 ku de eletricidade. - -[ta3_quarry|image] - - -### TA3 Gravel Sieve - -A função corresponde à do TA2. -A capacidade de processamento é de 2 itens a cada 4 segundos. O bloco requer 4 ku de eletricidade. - -[ta3_gravelsieve|image] - - -### TA3 Gravel Rinser - -A função corresponde à do TA2. -A probabilidade também é a mesma que a do TA2. O bloco também requer 3 ku de eletricidade. -Mas, ao contrário do TA2, o status do bloco TA3 pode ser lido (controlador) - -[ta3_gravelrinser|image] - - -### TA3 Grinder - -A função corresponde à do TA2. -A capacidade de processamento é de 2 itens a cada 4 segundos. O bloco requer 6 ku de eletricidade. - -[ta3_grinder|image] - -### TA3 Injetor - -O injetor é um TA3 pusher com propriedades especiais. Ele possui um menu para configuração. Até 8 itens podem ser configurados aqui. Ele apenas pega esses itens de um baú para passá-los para as máquinas com receitas (autocrafter, forno industrial e electronic fab). - -Ao passar, apenas uma posição no inventário é usada na máquina de destino. Se, por exemplo, apenas as três primeiras entradas estiverem configuradas no injetor, apenas as três primeiras posições de armazenamento no inventário da máquina serão usadas. Isso evita o transbordamento no inventário da máquina. - -O injetor também pode ser alternado para o "modo pull". Então ele apenas retira itens do baú das posições que estão definidas na configuração do injetor. Nesse caso, o tipo e a posição do item devem corresponder. Isso permite esvaziar entradas específicas do inventário de um baú. - -A capacidade de processamento é de até 8 vezes um item a cada 4 segundos. - -[ta3_injector|image] - - -## Ferramentas - -### Techage Info Tool - -O Techage Info Tool (chave inglesa de ponta aberta) possui várias funções. Ele mostra a hora, posição, temperatura e bioma quando um bloco desconhecido é clicado. -Se você clicar em um bloco TechAge com interface de comando, todos os dados disponíveis serão mostrados (consulte também "Blocos lógicos / de comutação"). - -Com Shift + clique direito, um menu estendido pode ser aberto para alguns blocos. Dependendo do bloco, dados adicionais podem ser chamados ou configurações especiais podem ser feitas aqui. No caso de um gerador, por exemplo, a curva de carga/desligamento pode ser programada. - -[ta3_end_wrench|image] - -### TechAge Programmer (Programador) - -Com o programador, números de bloco podem ser coletados de vários blocos com um clique direito e gravados em um bloco como um botão / interruptor com um clique esquerdo. -Se você clicar no ar, a memória interna é apagada. - -[ta3_programmer|image] - -### TechAge Trowel / Trowel - -A colher de pedreiro é usada para revestir cabos de energia. Veja também "Cabo de energia TA". - -[ta3_trowel|image] - -### TA3 chave de cano - -Esta ferramenta pode ser usada para remover blocos de tubo se, por exemplo, um túnel precisar passar por lá. - -[ta3_drill_pipe_wrench|image] - -### Techage Screwdriver - -A chave de fenda Techage serve como substituto da chave de fenda normal. Ela possui as seguintes funções: - -- Clique esquerdo: girar o bloco para a esquerda -- Clique direito: girar a face visível do bloco para cima -- Shift + clique esquerdo: salvar o alinhamento do bloco clicado -- Shift + clique direito: aplicar o alinhamento salvo ao bloco clicado - -[ta3_screwdriver|image] - -### TechAge Assembly Tool - -A TechAge Assembly Tool é usada para remover e reposicionar blocos Techage sem que esses blocos percam seu número de bloco ou recebam um novo número ao serem configurados. Isso é útil, por exemplo, para pedreiras, já que muitas vezes precisam ser movidas. - -- Botão esquerdo: remover um bloco -- Botão direito: configurar um bloco - -O bloco que foi removido anteriormente com a ferramenta de montagem e que será colocado novamente deve estar no extremo esquerdo do inventário do jogador. - -[techage:assembly_tool|image] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/techage/manuals/manual_ta4_DE.md b/techage/manuals/manual_ta4_DE.md deleted file mode 100644 index 925ace8..0000000 --- a/techage/manuals/manual_ta4_DE.md +++ /dev/null @@ -1,1024 +0,0 @@ -# TA4: Gegenwart - -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. - -[techage_ta4|image] - - -## Windkraftanlage - -Eine Windkraftanlage liefern immer dann Strom, wenn Wind vorhanden ist. Im Spiel gibt es keinen Wind, aber die Mod simuliert dies dadurch, dass sich nur morgens (5:00 - 9:00) und abends (17:00 - 21:00) die Windräder drehen. Eine Windkraftanlage liefert nur dann Strom, wenn sie an einer geeigneten Stelle aufgestellt ist. - -Die TA Windkraftanlagen sind reine Offshore Anlagen, das heißt, die müssen im Meer errichtet werden. Dies bedeutet, dass Windkraftanlagen nur in einem Meer (occean) Biom errichtet werden können und dass um den Mast herum ausreichend Wasser und freie Sicht vorhanden sein müssen. - -Um eine geeignete Stelle zu finden, musst du mit dem Schraubenschlüssel (TechAge Info Werkzeug) auf das Wasser klicken. Ob diese Stelle für den Mast der Windkraftanlage geeignet ist, wird dir als Chat Nachricht angezeigt. - -Der Strom muss vom Rotor-Block durch den Mast nach unten geführt werden. Dazu zuerst die Stromleitung nach oben ziehen und das Stromkabel dann mit TA4 Säulenblöcke "verputzen". Unten kann eine Arbeitsplattform errichtet werden. Der Plan rechts zeigt den Aufbau im oberen Teil. - -Die Windkraftanlage liefert eine Leistung von 70 ku, aber dies nur 8 Stunden am Tag (siehe oben). - -[ta4_windturbine|plan] - - -### TA4 Windkraftanlage / Wind Turbine - -Der Windkraftanlagenblock (Rotor) ist das Herzstück der Windkraftanlage. Dieser Block muss oben auf den Mast gesetzt werden. Idealerweise auf Y = 15, dann bleibst du noch gerade innerhalb eines Map-/Forceload-Blocks. -Beim Starten der Windkraftanlage werden alle Bedingungen für den Betrieb der Windkraftanlage überprüft. Sofern alle Bedingungen erfüllt sind, erscheinen auch automatisch die Rotorblätter (Flügel). Anderenfalls wird eine Fehlermeldung angezeigt. - -[ta4_windturbine|image] - - -### TA4 Windkraftanlagengondel / Wind Turbine Nacelle - -Dieser Block muss an das schwarze Ende des Wind Turbinen Block gesetzt werden. - -[ta4_nacelle|image] - - -### TA4 Wind Turbine Signal Lamp - -Dieses Blinklicht ist nur für dekorative Zwecke und kann oben auf den Wind Turbinen Block gesetzt werden. - -[ta4_blinklamp|image] - - -### TA4 Säule / Pillar - -Damit wird der Mast für die Windkraftanlage gebaut. Allerdings werden diese Blöcke nicht von Hand gesetzt sondern müssen mit Hilfe der Kelle gesetzt werden, so dass die Stromleitung zur Mastspitze mit diesen Blöcken ersetzt wird (siehe unter TA Stromkabel). - -[ta4_pillar|image] - - -## Solaranlage - -Die Solaranlage produziert nur Strom, wenn die Sonne scheint. Im Spiel ist das jeder Spieltag von morgens 6:00 bis abends 18:00. -In dieser Zeit steht immer die gleiche Leistung zur Verfügung. Nach 18:00 schalten die Solarmodule komplett ab. - -Für die Leistung der Solarmodule ist die Biome Temperatur entscheidend. Je heißer die Temperatur, um so höher der Ertrag. -Die Biome Temperatur kann mit dem Techage Info Tool (Schraubenschlüssel) bestimmt werden. Sie schwankt typischerweise zwischen 0 und 100: - -- bei 100 steht die volle Leistung zur Verfügung -- bei 50 steht die halbe Leistung zur Verfügung -- bei 0 steht keine Leistung zur Verfügung - -Es empfiehlt sich daher, nach heißen Steppen und Wüsten für die Solaranlage Ausschau zu halten. -Für den Stromtransport stehen die Überlandleitungen zur Verfügung. -Es kann aber auch Wasserstoff produziert werden, welcher sich transportieren und am Ziel wieder zu Strom umwandeln lässt. - -Die kleinste Einheit bei einer Solaranlage sind zwei Solarmodule und ein Trägermodul. Das Trägermodul muss zuerst gesetzt werden, die zwei Solarmodule dann links und rechts daneben (nicht darüber!). - -Der Plan rechts zeigt 3 Einheiten mit je zwei Solarmodulen und einem Trägermodul, über rote Kabel mit dem Wechselrichter verbunden. - -Solarmodule liefern Gleichspannung, welcher nicht direkt in das Stromnetz eingespeist werden kann. Daher müssen zuerst die Solareinheiten über das rote Kabel mit dem Wechselrichter verbunden werden. Dieser besteht aus zwei Blöcken, einen für das rote Kabel zu den Solarmodulen (DC) und einen für das graue Stromkabel ins Stromnetz (AC). - -Der Kartenbereich, wo die Solaranlage steht, muss komplett geladen sein. Die gilt auch für die direkte Position über dem Solarmodul, denn dort wird regelmäßig die Lichtstärke gemessen. Es empfiehlt sich daher, zuerst einen Forceload Block zu setzen, und dann innerhalb dieses Bereiches die Module zu platzieren. - -[ta4_solarplant|plan] - - -### TA4 Solarmodul / Solar Module - -Das Solarmodul muss an das Trägermodul gesetzt werden. Es sind immer zwei Solarmodule notwendig. -Im Paar leisten die Solarmodule bis 3 ku, je nach Temperatur. -Bei den Solarmodul muss darauf geachtet werden, dass diese das volle Tageslicht haben und nicht durch Blöcke oder Bäume beschattet sind. Getestet kann dies mit dem Info Tool (Schraubenschlüssel). - -[ta4_solarmodule|image] - - -### TA4 Solar Trägermodul / Carrier Module - -Das Trägermodul gibt es in zwei Bauhöhen (1m und 2m). Funktionell sind beide identisch. -Die Trägermodule können direkt aneinander gesetzt und so zu einer Modulreihe verbunden werden. Die Verbindung zum Wechselrichter oder zu anderen Modulreihen muss mit den roten Niederspannungskabeln bzw. den Niederspannungsverteilerboxen hergestellt werden. - -[ta4_solarcarrier|image] - - -### TA4 Solar Wechselrichter / Solar Inverter - -Der Wechselrichter wandelt den Solarstrom (DC) in Wechselstrom (AC) um, so dass dieser in das Stromnetz eingespeist werden kann. -Ein Wechselrichter kann maximal 100 ku an Strom einspeisen, was 33 Solarmodulen oder auch mehr entspricht. - -[ta4_solar_inverter|image] - - -### TA4 Niederspannungskabel / Low Power Cable - -Das Niederspannungskabel dient zur Verbindung von Solar-Modulreihen mit dem Wechselrichter. Das Kabel darf nicht für andere Zwecke benutzt werden. - -Die maximale Leitungslänge beträgt 200 m. - -[ta4_powercable|image] - - -### TA4 Niederspannungsverteilerbox / Low Power Box - -Die Verteilerbox muss auf den Boden gesetzt werden. Sie besitzt nur 4 Anschlüsse (in die 4 Himmelsrichtungen). - -[ta4_powerbox|image] - - -### TA4 Straßenlampen-Solarzelle / Streetlamp Solar Cell - -Die Straßenlampen-Solarzelle dient, wie der Name schon sagt, zur Stromversorgung einer Straßenlampe. Dabei kann eine Solarzelle zwei Lampen versorgen. Die Solarzelle speichert die Sonnenenergie tagsüber und gibt den Strom Nachts an die Lampe ab. Das bedeutet, die Lampe leuchtet nur im Dunkeln. - -Diese Solarzelle kann nicht mit den anderen Solarmodulen kombiniert werden. - -[ta4_minicell|image] - - - -## Energiespeicher - -Der TA4 Energiespeicher ersetzt den Batterie Block aus TA3. - -Der Energiespeicher besteht aus einer Betonhülle (Concrete Block) gefüllt mit Gravel. Es gibt 5 Größen vom Speicher: - -- Hülle mit 5x5x5 Concrete Blocks, gefüllt mit 27 Gravel, Speicherkapazität: 22.5 kud -- Hülle mit 7x7x7 Concrete Blocks, gefüllt mit 125 Gravel, Speicherkapazität: 104 kud -- Hülle mit 9x9x9 Concrete Blocks, gefüllt mit 343 Gravel, Speicherkapazität: 286 kud -- Hülle mit 11x11x11 Concrete Blocks, gefüllt mit 729 Gravel, Speicherkapazität: 610 kud -- Hülle mit 13x13x13 Concrete Blocks, gefüllt mit 1331 Gravel, Speicherkapazität: 1112 kud - -In der Betonhülle darf ein Fenster aus einem Obsidian Glas Block sein. Dieses muss ziemlich in der Mitte der Wand platziert werden. Durch dieses Fenster sieht man, ob der Speicher mehr als 80 % geladen ist. Im Plan rechts sieht man den Aufbau aus TA4 Wärmetauscher bestehend aus 3 Blöcken, der TA4 Turbine und dem TA4 Generator. Beim Wärmetauscher ist auf die Ausrichtung zu achten (der Pfeil bei Block 1 muss zur Turbine zeigen). - -Entgegen dem Plan rechts müssen die Anschlüsse am Speicherblock auf gleicher Ebene sein (horizontal angeordnet, also nicht unten und oben). Die Rohrzuläufe (TA4 Pipe Inlet) müssen genau in der Mitte der Wand sein und stehen sich damit gegenüber. Als Röhren kommen die gelben TA4 Röhren zum Einsatz. Die TA3 Dampfrohre können hier nicht verwendet werden. -Sowohl der Generator als auch der Wärmetauscher haben einen Stromanschluss und müssen mit dem Stromnetz verbunden werden. - -Im Prinzip arbeitet das das Wärmespeichersystem genau gleich wie die Akkus, nur mit viel mehr Speicherkapazität. - -Damit das Wärmespeichersystem funktioniert, müssen alle Blöcke (auch Betonhülle und Gravel) mit Hilfe eines Forceloadblockes geladen sein. - -[ta4_storagesystem|plan] - - -### TA4 Wärmetauscher / Heat Exchanger - -Der Wärmetauscher besteht aus 3 Teilen, die aufeinander gesetzt werden müssen, wobei der Pfeil des ersten Blockes Richtung Turbine zeigen muss. Die Rohrleitungen müssen mit den gelben TA4 Röhren aufgebaut werden. -Der Wärmetauscher muss am Stromnetz angeschlossen werden. Über den Wärmetauscher wird der Energiespeicher wieder aufgeladen, sofern ausreichend Strom zur Verfügung steht. - -[ta4_heatexchanger|image] - - -### TA4 Turbine - -Die Turbine ist Teil des Energiespeichers. Sie muss neben den Generator gesetzt und über TA4 Röhren, wie im Plan abgebildet, mit dem Wärmetauscher verbunden werden. - -[ta4_turbine|image] - - -### TA4 Generator - -Der Generator ist Teil des Energiespeichers. Er dient zur Stromerzeugung und gibt damt die Energie des Energiespeichers wieder ab. Daher muss auch der Generator am Stromnetz angeschlossen werden. - -Wichtig: Wärmetauscher und Generator müssen mit ein und demselben Stromnetz verbunden sein! - -[ta4_generator|image] - - -### TA4 Rohrzulauf / TA4 Pipe Inlet - -Je ein Rohrzulaufblock muss auf beiden Seiten des Speicherblockes eingebaut werden. Die Blöcke müssen sich exakt gegenüber stehen. - -Die Rohrzulaufblöcke können **nicht** als normale Wanddurchbrüche verwendet werden, dazu die TA3 Rohr/Wanddurchbruch / TA3 Pipe Wall Entry Blöcke verwenden. - -[ta4_pipeinlet|image] - - -### TA4 Röhre / Pipe - -Die gelben Röhren dienen bei TA4 zur Weiterleitung von Gas und Flüssigkeiten. -Die maximale Leitungslänge beträgt 100 m. - -[ta4_pipe|image] - - - -## Stromverteilung - -Mit Hilfe von Stromkabeln und Verteilerdosen können Stromnetze von bis zu 1000 Blöcke/Knoten aufgebaut werden. Hierbei ist aber zu beachten, dass Verteilerdosen auch mitgezählt werden müssen. Somit können bis zu 500 Generatoren/Speichersysteme/Maschinen/Lampen an einem Stromnetz hängen. - -Mit Hilfe von Trenntransformator und Stromzähler können Netzwerke zu noch größeren Strukturen verbunden werden. - -[ta4_transformer|image] - - - -### TA4 Trenntransformator / TA4 Isolation Transformer - -Mit Hilfe eines Trenntransformators können zwei Stromnetze zu einem größeren Netzwerk verbunden werden. Der Trenntransformator kann Strom in beide Richtungen übertragen. - -Der Trenntransformator kann bis zu 300 ku übertragen. Der Maximalwert ist über das Schraubenschlüsselmenü einstellbar. - -[ta4_transformer|image] - - - -### TA4 Stromzähler / TA4 Electric Meter - -Mit Hilfe eines Stromzählers können zwei Stromnetze zu einem größeren Netzwerk verbunden werden. Der Stromzähler leitet den Strom nur in eine Richtungen weiter (Pfeil beachten). Die durchgeleitete Menge an elektrischer Energie (in kud) wird gemessen und angezeigt. Dieser Wert kann auch über das Kommando `consumption` durch einen Lua Controller abgefragt werden. Die aktuelle Stromstärke kann über `current` abgefragt werden. - -Der Stromzähler kann bis zu 200 ku durchleiten. Der Maximalwert ist über das Schraubenschlüsselmenü einstellbar. - -Über das Schraubenschlüsselmenü kann auch ein Countdown für die Leistungsabgabe eingegeben werden. Läuft dieser Countdown auf Null, schaltet sich der Stromzähler ab. Der Countdown kann über das Kommando `countdown` abgefragt werden. - - - -[ta4_electricmeter|image] - - - -### TA4 Laser - -Der TA4 Laser dient zur kabellosen Stromübertagung. Dazu sind zwei Blöcke notwendig: TA4 Laserstrahl Sender und TA4 Laserstrahl Empfänger. Zwischen beiden Blöcken muss sich eine Luftstrecke befinden, so dass der Laserstrahl vom Sender bis zum Empfänger aufgebaut werden kann. - -Zuerst muss der Sender platziert werden. Dieser schaltet sofort den Laserstahls ein und zeigt damit mögliche Positionen des Empfängers an. Mögliche Positionen für den Empfänger werden auch über eine Chat-Nachricht ausgegeben. Mit dem Laser lassen sich Strecken bis 96 Blöcke überbrücken. - -Ist die Verbindung aufgebaut (es muss dazu noch kein Strom fließen), wird dies über den Info-Text des Senders und auch des Empfängers angezeigt. - -Die Laserblöcke selbst benötigen keinen Strom. - -[ta4_laser|image] - - - -## Wasserstoff - -Strom kann mittels Elektrolyse in Wasserstoff und Sauerstoff aufgespalten werden. Auf der anderen Seite kann über eine Brennstoffzelle Wasserstoff mit Sauerstoff aus der Luft wieder in Strom umgewandelt werden. -Damit können Stromspitzen oder ein Überangebot an Strom in Wasserstoff umgewandelt und so gespeichert werden. - -Im Spiel kann Strom mit Hilfe des Elektrolyseurs in Wasserstoff und Wasserstoff über die Brennstoffzelle wieder in Strom umgewandelt werden. -Damit kann Strom (in Form von Wasserstoff) nicht nur in Tanks gelagert, sonder mit dem Tankwagen auch transportiert werden. - -Die Umwandlung von Strom in Wasserstoff und zurück ist aber verlustbehaftet. Von 100 Einheiten Strom kommen nach der Umwandlung in Wasserstoff und zurück nur 95 Einheiten Strom wieder raus. - -[ta4_hydrogen|image] - - -### Elektrolyseur - -Der Elektrolyseur wandelt Strom in Wasserstoff um. -Es muss von links mit Strom versorgt werden. Rechts kann Wasserstoff über Röhren und Pumpen entnommen werden. - -Der Elektrolyseur kann bis zu 35 ku an Strom aufnehmen und generiert dann alle 4 s ein Wasserstoff Item. -In den Elektrolyseur passen 200 Einheiten Wasserstoff. - -Der Elektrolyseur besitzt ein Schraubenschlüssel-Menü zur Einstellung der Stromaufnahme und des Abschaltpunkts. - -Unterschreitet die im Stromnetz gespeicherte Leistung den angegebenen Wert des Abschaltpunkts, so schaltet sich der Elektrolyseur automatisch ab. Damit kann ein Leerlaufen der Speichersysteme verhindert werden. - -[ta4_electrolyzer|image] - - -### Brennstoffzelle - -Die Brennstoffzelle wandelt Wasserstoff in Strom um. -Sie muss von links per Pumpe mit Wasserstoff versorgt werden. Rechts ist der Stromanschluss. - -Die Brennstoffzelle kann bis zu 34 ku an Strom abgeben und benötigt dazu alle 4 s ein Wasserstoff Item. - -Normalerweise arbeitet die Brennstoffzelle als Generator der Kategorie 2 (wie auch anderen Speichersystemen). -In diesem Fall können keine anderen Blöcke der Kategorie 2 wie der Akku-Block geladen werden. -Über das Kontrollkästchen kann die Brennstoffzelle jedoch auch als Generator der Kategorie 1 eingesetzt werden. - -[ta4_fuelcell|image] - - -## Chemischer Reaktor / chemical reactor - -Der Reaktor dient dazu, die über den Destillationsturm oder aus anderen Rezepten gewonnenen Zutaten zu neuen Produkten weiter zu verarbeiten. Der Plan links zeigt nur eine mögliche Variante, da die Anordnung der Silos und Tanks rezeptabhängig ist. - -Das primäre Ausgabeprodukt wird immer an der Seite des Reaktorständers ausgegeben, unabhängig davon, ob es sich um ein Pulver oder eine Flüssigkeit handelt. Das (sekundäre) Abfallprodukt wird immer unten am Reaktorständers ausgegeben. - -Ein Reaktor besteht aus: -- div. Tanks und Silos mit den Zutaten, die über Leitungen mit dem Dosierer verbunden sind -- optional einem Reaktorsockel, welcher die Abfälle aus dem Reaktor ableitet (nur bei Rezepten mit zwei Ausgabestoffen notwendig) -- dem Reaktorständer, der auf den Sockel gesetzt werden muss (sofern vorhanden). Der Ständer hat einen Stromanschluss und zieht bei Betrieb 8 ku. -- dem eigentlichen Reaktorbehälter, der auf den Reaktorständer gesetzt werden muss -- dem Einfüllstutzen der auf den Reaktorbehälter gesetzt werden muss -- dem Dosierer, welcher über Leitungen mit den Tanks oder Silos sowie dem Einfüllstutzen verbunden werden muss - -Hinweis 1: Flüssigkeiten werden nur in Tanks gelagert, feste Stoffe und Stoffe in Pulverform nur in Silos. Dies gilt für Zutaten und Ausgabestoffe. - -Hinweis 2: Tanks oder Silos mit verschiedenen Inhalten dürfen nicht zu einem Leitungssystem verbunden werden. Mehrere Tanks oder Silos mit gleichem Inhalt dürfen dagegen parallel an einer Leitung hängen. - -Beim Cracken werden lange Kette von Kohlenwasserstoffen unter Verwendung eines Katalysator in kurze Ketten gebrochen. -Als Katalysator dient Gibbsitpulver (wird nicht verbraucht). Damit kann Bitumen in Schweröl, Schweröl in Naphtha und Naphtha in Benzin umgewandelt werden. - -Bei der Hydrierung werden einem Molekül Paare von Wasserstoffatomen hinzugefügt, um kurzkettige Kohlenwasserstoffe in lange umzuwandeln. -Hier wird Eisenpulver als Katalysator benötigt (wird nicht verbraucht). Damit kann Propangas in Isobutan, Isobutan in Benzin, Benzin in Naphtha, -Naphtha in Schweröl und Schweröl in Bitumen umgewandelt werden. - -[ta4_reactor|plan] - - -### TA4 Dosierer / doser - -Teil des Chemischen Reaktors. -Auf allen 4 Seiten der Dosierers können Leitungen für Eingangsmaterialien angeschlossen werden. Nach oben werden die Materialien für den Reaktor ausgegeben. - -Über den Dosierer kann das Rezept eingestellt und der Reaktor gestartet werden. - -Wie auch bei anderen Maschinen: -- geht der Dosierer in den standby Zustand, so fehlen ein oder mehrere Zutaten -- geht der Dosierer in den blocked Zustand, so ist Ausgabetank oder Silo voll, defekt oder falsch angeschlossen - -Der Dosierer benötigt keinen Strom. Alle 10 s wird ein Rezept abgearbeitet. - -[ta4_doser|image] - -### TA4 Reaktor / reactor - -Teil des Chemischen Reaktors. Der Reaktor verfügt über ein Inventar für die Katalysator -Gegenstände (für Cracking- und Hydrierungs-Rezepte). - -[ta4_reactor|image] - - -### TA4 Einfüllstutzen / fillerpipe - -Teil des Chemischen Reaktors. Muss auf den Reaktor gesetzt werden. Wenn dies nicht klappt, ggf. das Rohr an der Position darüber nochmals entfernen und neu setzen. - -[ta4_fillerpipe|image] - - -### TA4 Reaktorständer / reactor stand - -Teil des Chemischen Reaktors. Hier ist auch der Stromanschluss für den Reaktor. Der Reaktor benötigt 8 ku Strom. - -Der Ständer hat zwei Leitungsanschlüsse, nach rechst für das primäre Ausgabeprodukt und nach unten für den Abfall, wie bspw. Rotschlamm bei der Aluminiumherstellung. - -[ta4_reactorstand|image] - - -### TA4 Reaktorsockel / reactor base - -Teil des Chemischen Reaktors. Wird für den Abfluss des Abfallproduktes benötigt. - -[ta4_reactorbase|image] - - -### TA4 Silo / silo - -Teil des Chemischen Reaktors. Wird zur Aufbewahrung von Stoffen in Pulver- oder Granulatform benötigt. - -[ta4_silo|image] - - - - -## ICTA Controller - -Der ICTA Controller (ICTA steht für "If Condition Then Action") dient zur Überwachung und Steuerung von Maschinen. Mit dem Controller kann man Daten von Maschinen und anderen Blöcken einlesen und abhängig davon andere Maschinen und Blöcke ein-/ausschalten. - -Einlesen von Maschinendaten sowie das Steuern von Blöcken und Maschinen erfolgt über sogenannte Kommandos. Für das Verständnis, wie Kommandos funktionieren, ist das Kapitel TA3 -> Logik-/Schalt-Blöcke wichtig. - -Der Controller benötigt für den Betrieb eine Batterie. Das Display dient zur Ausgabe von Daten, der Signal Tower zur Anzeige von Fehlern. - -[ta4_icta_controller|image] - - - -### TA4 ICTA Controller - -Der Controller arbeitet auf das Basis von ```IF THEN ``` Regeln. Es können bis zu 8 Regeln pro Controller angelegt werden. - -Beispiele für Regeln sind: - -- Wenn ein Verteiler verstopft ist (```blocked```), soll der Schieber davor ausgeschaltet werden -- Wenn eine Maschine einen Fehler anzeigt, soll dieser auf dem Display ausgegeben werden - -Der Controller prüft diese Regeln zyklisch. Dazu muss pro Regel eine Zykluszeit in Sekunden (```Cycle/s```) angegeben werden (1..1000). - -Für Regeln die einen on/off Eingang auswerten, bspw. von einen Schalter oder Detektor, muss als Zykluszeit 0 angegeben werden. Der Wert 0 bedeutet, dass diese Regel immer dann ausgeführt werden soll, wenn sich das Eingangssignal geändert hat, also bspw. der Button einen neuen Wert gesendet hat. - -Alle Regeln sollten nur so oft wie notwendig ausgeführt werden. Dies hat zwei Vorteile: - -- die Batterie des Controllers hält länger (jeder Controller benötigt eine Batterie) -- die Last für den Server ist geringer (damit weniger Lags) - -Man muss für jede action eine Verzögerungszeit (```after/s```) einstellen. Soll die Aktion sofort ausgeführt werden, ist 0 einzugeben. - -Der Controller hat eine eigene Hilfe und Hinweise zu allen Kommandos über das Controller-Menü. - -[ta4_icta_controller|image] - -### Batterie - -Die Batterie muss in unmittelbarer Nähe zum Controller platziert werden, also an einer der 26 Positionen um den Controller herum. - -[ta4_battery|image] - -### TA4 Display - -Das Display zeigt nach dem Platzieren seine Nummer an. Über diese Nummer kann das Display angesprochen werden. Auf dem Display können Texte ausgegeben werden, wobei das Display 5 Zeilen und damit 5 unterschiedliche Texte darstellen kann. - -Textzeilen werden immer linksbündig ausgegeben. Soll der Text horizontal zentriert ausgerichtet werden, muss dem Text das Zeichen „\t“ (Tabulator) vorangestellt werden. - -Das Display wird maximal ein mal pro Sekunde aktualisiert. - -[ta4_display|image] - -### TA4 Display XL - -Das TA4 Display XL hat die doppelte Größ wie das TA4 Display. - -Textzeilen werden immer linksbündig ausgegeben. Soll der Text horizontal zentriert ausgerichtet werden, muss dem Text das Zeichen „\t“ (Tabulator) vorangestellt werden. - -Das Display wird maximal alle zwei Sekunden aktualisiert. - -[ta4_displayXL|image] - - -### TA4 Signal Tower - -Der Signal Tower kann rot, grün und orange anzeigen. Eine Kombination der 3 Farben ist nicht möglich. - -[ta4_signaltower|image] - - - -## TA4 Lua Controller - -Der Lua Controller muss, wie der Name schon sagt, in der Programmiersprache Lua programmiert werden. Außerdem sollte man etwas Englisch können (oder Google bemühen), denn die Anleitung dazu gibt es nur in Englisch: - -https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md - -Auch der Lua Controller benötigt eine Batterie. Die Batterie muss in unmittelbarer Nähe zum Controller platziert werden, also an einer der 26 Positionen um den Controller herum. - -[ta4_lua_controller|image] - -### TA4 Lua Server - -Der Server dient zur zentralen Speicherung von Daten von mehreren Lua Controllern. Es speichert auch die Daten über einen Server-Neustart hinweg. - -[ta4_lua_server|image] - -### TA4 Sensor Kiste/Chest - -Die TA4 Sensor Kiste dient zum Aufbau von Automatischen Lagern oder Verkaufsautomaten in Verbindung mit dem Lua Controller. -Wird etwas in die Kiste gelegt, oder entnommen, oder eine der Tasten "F1"/"F2" gedrückt, so wird ein Event-Signal an den Lua Controller gesendet. -Die Sensor Kiste unterstützt folgende Kommandos: - -- Über `state = $send_cmnd(, "state")` kann der Status der Kiste abgefragt werden. Mögliche Antworten sind: "empty", "loaded", "full" -- Über `name, action = $send_cmnd(, "action")` kann die letzte Spieleraktion abgefragt werden. `name` ist der Spielername, Als `action` wird zurückgeliefert: "put", "take", "f1", "f2". -- Über `stacks = $send_cmnd(, "stacks")` kann der Inhalt der Kiste ausgelesen werden. Siehe dazu: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest -- Über `$send_cmnd(, "text", "press both buttons and\nput something into the chest")` kann der Text im Menü der Sensor Kiste gesetzt werden. - -Über die Checkbox "Erlaube öffentlichen Zugriff" kann eingestellt werden, ob die Kiste von jedem genutzt werden darf, oder nur von Spielern die hier Zugriffsrechte haben. - - -[ta4_sensor_chest|image] - -### TA4 Lua Controller Terminal - -Das Terminal dient zur Ein-/Ausgabe für den Lua Controller. - -[ta4_terminal|image] - - - -## TA4 Logik-/Schalt-Module - -### TA4 Taster/Schalter / Button/Switch - -Beim TA4 Taster/Schalter hat sich nur das Aussehen geändert. Die Funktionalität ist gleich wie beim TA3 Taster/Schalter. Mit dem Schraubenschlüssel-Menü können die Daten aber nachträglich geändert werden. - -[ta4_button|image] - -### TA4 2x Taster / 2x Button - -Dieser Block hat zwei Taster, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für beide Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für beide Taster das Kommando konfiguriert werden, welches gesendet werden soll. - -[ta4_button_2x|image] - -### TA4 4x Taster / 4x Button - -Dieser Block hat vier Taster, die über das Schraubenschlüssel-Menü individuell konfiguriert werden können. Für jeden Taster kann die Beschriftung und die Zielblockadresse konfiguriert werden. Zusätzlich kann für jeden Taster das Kommando konfiguriert werden, welches gesendet werden soll. - -[ta4_button_4x|image] - -### TA4 2x Signallampe / 2x Signal Lamp - -Dieser Block hat zwei Lampen, die individuell angesteuert werden können. Jede Lampe kann die Farben "rot", "grün" und "orange" anzeigen. Über das Schraubenschlüssel-Menü kann für beide Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden: - -- Lampe 1 auf rot schalten: `$send_cmnd(1234, "red", 1)` -- Lampe 2 auf grün schalten: `$send_cmnd(1234, "green", 2)` -- Lampe 1 auf orange schalten: `$send_cmnd(1234, "amber", 1)` -- Lampe 2 aus schalten: `$send_cmnd(1234, "off", 2)` - -[ta4_signallamp_2x|image] - -### TA4 4x Signallampe / 4x Signal Lamp - -Dieser Block hat vier Lampen, die individuell angesteuert werden können. Jede Lampe kann die Farben "rot", "grün" und "orange" anzeigen. Über das Schraubenschlüssel-Menü kann für alle Lampen die Beschriftung konfiguriert werden. Die Lampen können über folgende Kommandos angesteuert werden: - -- Lampe 1 auf rot schalten: `$send_cmnd(1234, "red", 1)` -- Lampe 2 auf grün schalten: `$send_cmnd(1234, "green", 2)` -- Lampe 3 auf orange schalten: `$send_cmnd(1234, "amber", 3)` -- Lampe 4 aus schalten: `$send_cmnd(1234, "off", 4)` - -[ta4_signallamp_4x|image] - -### TA4 Spieler Detektor / Player Detector - -Beim TA4 Spieler Detektor hat sich nur das Aussehen geändert. Die Funktionalität ist gleich wie beim TA3 Spieler Detektor. - -[ta4_playerdetector|image] - -### TA4 Zustandssammler / State Collector - -[ta4_collector|image] - -Der Zustandssammler fragt der Reihe nach alle konfigurierten Maschinen nach dem Status ab. Wenn eine der Maschinen einen vorkonfigurierte Status erreicht oder überschritten hat, wird ein "on" Kommando gesendet. Damit können bspw. vom einem Lua Controller aus sehr einfach viele Maschinen auf Störungen überwacht werden. - -### TA4 Detektor / Detector - -Die Funktionalität ist gleich wie beim TA3 Detektor / Detector. Zusätzlich zählt der Detector aber die weitergegebenen Items. -Diesen Zähler kann man über das Kommando 'count' abfragen und über 'reset' zurücksetzen. - -[ta4_detector|image] - -### TA4 Block Detektor / Node Detector - -Die Funktionalität ist gleich wie beim TA3 Block Detektor. - -Im Unterschied zum TA3 Block Detektor können hier die Positionen, die überwacht werden sollen, individuell konfiguriert werden. Dazu muss der "Aufzeichnen" Button gedrückt werden. Dann müssen alle Blöcke angeklickt werden, von denen die Position überprüft werden soll. Danach muss der "Fertig" Button gedrückt werden. - -Es können bis zu 4 Blöcke ausgewählt werden. - -[ta4_nodedetector|image] - -### TA4 Energiespeicher-Ladungsdetektor / Energy Storage Charge Detector - -Der Ladungsdetektor misst alle 8 s den Ladezustand des Energiespeichers des Stromnetzwerkes. - -Fällt der Wert unter eine konfigurierbare Schwelle (Schaltpunkt), wird ein Kommando (default: "off") versendet. Steigt der Wert wieder über diesen Schaltpunkt, so wird ein zweites Kommando (default: "on") gesendet. Damit lassen sich Verbraucher vom Netz trennen, wenn der Ladezustand des Energiespeichers unter den angegebenen Schaltpunkt sinkt. - -Der Ladungsdetektor muss dazu über eine Verteilerdose an das Stromnetz angeschlossen werden. Die Konfiguration des Ladungsdetektors erfolgt über das Gabelschlüsselmenü. - -[ta4_chargedetector|image] - -### TA4 Blicksensor / Gaze Sensor - -Der TA4 Blicksensor generiert ein Kommando, wenn der Block vom Besitzer oder anderen konfigurierten Spielern angesehen/fokussiert wird und sendet ein zweites Kommando, wenn der Block nicht mehr fokussiert wird. Er dient damit als Ersatz für Taster/Schalter, um bspw. Türen zu öffnen/schließen. - -Der TA4 Blicksensor kann nur mit dem Gabelschlüsselmenü programmiert werden. Hat man einen Gabelschlüssel in der Hand, löst der Sensor nicht aus, auch wenn dieser fokussiert wird. - -[ta4_gaze_sensor|image] - -### TA4 Sequenzer - -über den TA4 Sequenzer können ganze Abläufe programmiert werden. Hier ein Beispiel: - -``` --- this is a comment -[1] send 1234 a2b -[30] send 1234 b2a -[60] goto 1 -``` - -- Jede Zeile beginnt mit einem Nummer, welche einem Zeitpunkt entspricht `[]` -- Für Zeitpunkte sind Werte von 1 bis 50000 zulässig -- 1 entspricht 100 ms, 50000 entspricht in etwa 4 Spieltagen -- Leerzeilen oder Kommentare sind erlaubt (`-- comment`) -- Mit `send ` kann man ein Kommando an einen Block senden -- Mit `goto ` kann man an eine andere Zeile/Zeitpunkt springen -- Mit `stop` kann man den Sequenzer verzögert stoppen, so dass er kein neues Kommando - von einem Taster oder anderem Block annimmt (um eine Bewegung abzuschließen) - Ohne `stop` geht der Sequenzer sofort nach dem letzten Kommando in den stopped Modus. - -Der TA4 Sequenzer unterstützt folgende techage Kommandos: - -- `goto ` Zu einer Kommandozeile springen und damit den Sequenzer starten -- `stop` Den Sequenzer anhalten -- `on` und `off` als Alias für `goto 1` bzw. `stop` - -Das `goto` Kommando wird nur angenommen, wenn der Sequenzer gestoppt ist. - -Über das Gabelschlüssel-Menü kann beim Sequenzer die Zykluszeit (normal: 100 ms) geändert werden. - -[ta4_sequencer|image] - - - - -## Move/Dreh-Controller - -### TA4 Move Controller - -Der TA4 Move Controller ist ähnlich zum "Door Controller 2", aber die ausgewählten Blöcke werden nicht entfernt, sondern können bewegt werden. -Da die bewegten Blöcke Spieler und Mobs mitnehmen können, die auf dem Block stehen, können damit Fahrstühle und ähnliche Transportsysteme gebaut werden. - -Anleitung: - -- Controller setzen und die Blöcke, die bewegt werden sollen, über das Menü (Taste "Aufzeichnen") an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden) -- die "Flugstrecke" muss über eine x,y,z Angabe (relativ) eingegeben werden (die maximale Distanz (x+y+z) beträgt 200 m) -- mit den Menü-Tasten "Bewege A-B" sowie "Bewege B-A" kann die Bewegung getestet werden -- man kann auch durch Wände oder andere Blöcke fliegen -- auch die Zielposition für die Blöcke kann belegt sein. Die Blöcke werden in diesem Falle "unsichtbar" gespeichert. Dies ist für Schiebetüren und ähnliches gedacht - -Der Move Controller unterstützt folgende techage Kommandos: - -- `a2b` Bewege Block von A nach B -- `b2a` Bewege Block von B nach A -- `move` Bewege Block auf die andere Seite - -Über das Schraubenschlüssel-Menü kann auf die Betriebsart `move xyz` umgeschaltet werden. Nach der Umschaltung werden folgende techage Kommandos unterstützt: - -- `move2` Beim Kommando muss zusätzlich die Flugstrecke als x,y,z Vektor angegeben werden. - Beispiel Lua Controller: `$send_cmnd(MOVE_CTLR, "move2", "0,12,0")` -- `reset` Block/Blöcke zurück in Startposition bewegen - -**Wichtige Hinweise:** - -- Sofern mehrere Blöcke bewegt werden sollen, muss der Block, der die Spieler/Mobs mitnehmen soll, beim Antrainieren als erstes angeklickt werden. -- Hat der Block, der die Spieler/Mobs mitnehmen soll, eine reduzierte Höhe, so muss die Höhe im Controller über das Schraubenschlüsselmenü eingestellt werden (bspw. Höhe = 0.5). Ansonsten wird der Spieler/Mob nicht "gefunden" und damit nicht mitgenommen. - -[ta4_movecontroller|image] - -### TA4 Drehcontroller / Turn Controller - -Der TA4 Drehcontroller ist ähnlich zum Move Controller", aber die ausgewählten Blöcke werden nicht bewegt, sondern um ihr Zentrum nach rechts oder links gedreht. - -Anleitung: - -- Controller setzen und die Blöcke, die bewegt werden sollen, über das Menü an-trainieren (Es können bis zu 16 Blöcke an-trainiert werden) -- mit den Menü-Tasten "Drehe links" sowie "Drehe rechts" kann die Bewegung getestet werden - -Der Drehcontroller unterstützt folgende techage Kommandos: - -- `left` Drehe nach links -- `right` Drehe nach rechts -- `uturn` Drehe um 180 Grad - -[ta4_turncontroller|image] - - - - -## TA4 Lampen - -TA4 beinhaltet eine Reihe von leistungsstarken Lampen, die eine bessere Ausleuchtung ermöglichen oder Spezialaufgaben übernehmen. - -### TA4 LED Pflanzenlampe / TA4 LED Grow Light - -Die TA4 LED Pflanzenlampe ermöglicht ein schnelles und kräftiges Wachstum aller Pflanzen aus der `farming` Mod. Die Lampe beleuchtet ein 3x3 großes Feld, so dass sich damit auch Pflanzen unter Tage anbauen lassen. -Die Lampe muss mit einem Abstand von einem Block über dem Boden in der Mitte des 3x3 Feldes platziert werden. - -Zusätzlich kann die Lampe auch zur Blumenzucht genutzt werden. Wird die Lampe über ein 3x3 großes Blumenbeet aus "Garden Soil" (Mod `compost`) platziert, so wachsen dort die Blumen ganz von selbst (über und unter Tage). - -Abernten kann man die Blumen mit den Signs Bot, der auch über ein entsprechendes Zeichen verfügt, das vor das Blumenfeld gestellt werden muss. - -Die Lampe benötigt 1 ku Strom. - -[ta4_growlight|image] - -### TA4 LED Straßenlampe / TA4 LED Street Lamp - -Die TA4 LED Straßenlampe ist eine Lampe mit besonders starker Ausleuchtung. Die Lampe besteht aus dem Lampengehäuse, Lampenarm und Lampenmast Blöcken. - -Der Strom muss von unten durch den Mast nach oben zum Lampengehäuse geführt werden. Dazu zuerst die Stromleitung nach oben ziehen und das Stromkabel dann mit Lampenmast Blöcken "verputzen". - -Die Lampe benötigt 1 ku Strom. - -[ta4_streetlamp|image] - -### TA4 LED Industrielampe / TA4 LED Industrial Lamp - -Die TA4 LED Industrielampe ist eine Lampe mit besonders starker Ausleuchtung. Die Lampe muss von oben mit Strom versorgt werden. - -Die Lampe benötigt 1 ku Strom. - -[ta4_industriallamp|image] - - - - -## TA4 Flüssigkeitsfilter - -Im Flüssigkeitsfilter wird Rotschlamm gefiltert. -Dabei entsteht entweder Lauge, welche unten in einem Tank gesammelt werden kann oder Wüstenkopfsteinpflaster, welches sich im Filter absetzt. -Wenn der Filter zu sehr verstopft ist, muss er geleert und neu befüllt werden. -Der Filter besteht aus einer Fundament-Ebene, auf der 7 identische Filterschichten platziert werden. -Ganz oben befindet sich die Einfüllebene. - -[ta4_liquid_filter|image] - -### Fundament-Ebene - -Der Aufbau dieser Ebene kann dem Plan entnommen werden. - -Im Tank wird die Lauge gesammelt. - -[ta4_liquid_filter_base|plan] - -### Schotter-Ebene - -Diese Ebene muss so wie im Plan gezeigt mit Schotter befüllt werden. -Insgesamt müssen sieben Lagen Schotter übereinander liegen. -Dabei wird mit der Zeit der Filter verunreinigt, sodass das Füllmaterial erneuert werden muss. - -[ta4_liquid_filter_gravel|plan] - -### Einfüll-Ebene - -Diese Ebene dient zum Befüllen des Filters mit Rotschlamm. -In den Einfüllstutzen muss Rotschlamm mittels einer Pumpe geleitet werden. - -[ta4_liquid_filter_top|plan] - - - -## 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ß. -- 22 TA4 Collider Magnete (nicht die TA4 Collider Detector Magnete!) müssen über jeweils 5 Blöcken der TA4 Vakuumröhre miteinander verbunden werden. Das ganze bildet (wie rechts im Plan abgebildet) ein Quadrat mit einer Kantenlänge von 37 Metern. - -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] - -### Kühlung und Strom - -Jeder TA4 Collider Magnet muss zusätzlich (wie rechts im Plan abgebildet) mit Strom sowie mit Isobutan zur Kühlung versorgt werden: - -- Der Anschluss für den Strom ist auf der Oberseite des Magneten. -- Der Anschluss für die Kühlung ist auf der Vorderseite des Magneten. -- Für die Kühlung der gesamten Anlage wird zusätzlich eine TA4 Pumpe und ein TA4 Tank mit mindestens 250 Einheiten Isobutan benötigt. -- Die Anlage benötigt auch einiges an Strom. Daher ist eine eigene Stromversorgung mit mindestens 145 ku sinnvoll. - -[techage_collider_plan2|plan] - -### Aufbau - -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 Magnete und den Detektor mit Stromkabel verbinden -- Alle Magnete und den Detektor mit den gelben Röhren verbinden und das Isobutan mit einer Pumpe in das Röhrensystem pumpen. -- 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. -- Der Teilchenbeschleunigers muss im Dauerbetrieb laufen und liefert dann nach und nach Erfahrungspunkte. Für 10 Punkte muss der Teilchenbeschleuniger schon einige Stunden laufen. - -[techage_ta4c|image] - - - - -## Weitere TA4 Blöcke - -### TA4 Rezept Block - -Im Rezept Block können bis zu 10 Rezepte gespeichert werden. Diese Rezepte können dann über ein TA4 Autocrafter Kommando abgerufen werden. Dies ermöglicht eine Rezept-Konfiguration des Autocrafters über ein Kommando. Die Rezepte des Rezept Blocks können auch direkt per Kommando abgefragt werden. - -`input ` liest ein Rezept aus dem TA4 Rezeptblock. `` ist die Nummer des Rezepts. Der Block gibt eine Liste von Rezept-Zutaten zurück. - -Beispiel: `$send_cmnd(1234, "input", 1)` - -[ta4_recipeblock|image] - -### TA4 Autocrafter - -Die Funktion entspricht der von TA3. - -Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Autocrafter benötigt hierfür 9 ku Strom. - -Zusätzlich unterstützt der TA4 Autocrafter die Auswahl unterschiedlicher Rezepte über folgende Kommandos: - -`recipe "."` schaltet den Autocrafter auf ein Rezept des TA4 Rezept Blocks um. `` ist die Nummer des Rezept Blocks, `` die Rezept-Nummer. Beispiel: `$send_cmnd(1234, "recipe", "5467.1")` - -Alternativ kann ein Rezept auch über die Zutatenliste ausgewählt werden, wie bspw.: -`$send_cmnd(1234, "recipe", "default:coal_lump,,,default:stick")` -Hier müssen alle technische Namen eines Rezeptes durch Kommas getrennt angegeben werden. Siehe auch das Kommando `input` beim TA4 Rezept Block. - -Das Kommando `flush` verschiebt alle Artikel vom Eingabeinventar in das Ausgabeinventar. Das Kommando liefert `true` zurück, wenn das Eingabeinventar dabei vollständig geleert wurde. Falls `false` zurückgeliefert wurde (Ausgabeinventar voll), muss das Kommando zu einem späteren Zeitpunkt wiederholt werden. - - - -[ta4_autocrafter|image] - -### TA4 Tank / TA4 Tank - -Siehe TA3 Tank. - -In einen TA4 Tank passen 2000 Einheiten oder 200 Fässer einer Flüssigkeit. - -[ta4_tank|image] - -### TA4 Pumpe / TA4 Pump - -Siehe TA3 Pumpe. - -Die TA4 Pumpe pumpt 8 Einheiten Flüssigkeit alle zwei Sekunden. - -In der Betriebsart "Durchflussbegrenzer" kann die Anzahl der Einheiten, die von der Pumpe gepumpt werden, begrenzt werden. Die Betriebsart Durchflussbegrenzer kann über das Gabelschlüssel-Menü aktiviert werden, indem im Menü die Anzahl an Einheiten konfiguriert wird. Sobald die konfigurierte Anzahl an Einheiten gepumpt wurden, schaltet sich die Pumpe ab. Wird die Pumpe wieder eingeschaltet, pumpt sie wieder die konfigurierte Anzahl an Einheiten und schaltet sich dann ab. - -Der Durchflussbegrenzer kann auch per Lua- oder Beduino Controller konfiguriert und gestartet werden. - -Zusätzlich unterstützt die Pumpe das Kommando `flowrate`. Damit kann die Gesamtdurchflussmenge durch die Pumpe abgefragt werden. - -[ta4_pump|image] - -### TA4 Ofenheizung / furnace heater - -Mit TA4 hat der Industrieofen auch seine elektrische Heizung. Der Ölbrenner und auch das Gebläse können mit der Ofenheizung ersetzt werden. - -Die Ofenheizung benötigt 14 ku Strom. - -[ta4_furnaceheater|image] - -### TA4 Wasserpumpe / Water Pump (veraltet) - -Dieser Block kann nicht mehr gecraftet werden und wird durch den TA4 Wassereinlass Block ersetzt. - -### TA4 Wassereinlass / TA4 Water Inlet - -Für manche Rezepte wird Wasser benötigt. Das Wasser muss mit einer Pumpe aus dem Meer (Wasser auf y = 1) gepumpt werden. Ein "Pool" aus ein paar Wasserblöcken ist dafür nicht ausreichend! - -Dazu muss der Wassereinlass-Block ins Wasser gesetzt und über Röhren mit der Pumpe verbunden werden. Wird der Block ins Wasser gesetzt, so muss darauf geachtet werden, dass sich unter dem Block Wasser befindet (Wasser muss mindestens 2 Blöcke tief sein). - -[ta4_waterinlet|image] - -### TA4 Röhren / TA4 Tube - -TA4 hat auch seine eigenen Röhren im TA4 Design. Diese können wie Standard Röhren eingesetzt werden. -Aber: TA4 Schieber und TA4 Verteiler erreichen ihre volle Leistungsfähigkeit nur beim Einsatz mit TA4 Röhren. - -[ta4_tube|image] - -### TA4 Schieber / Pusher - -Die Funktion entspricht grundsätzlich der von TA2/TA3. Zusätzlich kann aber über ein Menü konfiguriert werden, welche Gegenstände aus einer TA4 Kiste geholt und weiter transportiert werden sollen. -Die Verarbeitungsleistung beträgt 12 Items alle 2 s, sofern auf beiden Seiten TA4 Röhren verwendet werden. Anderenfalls sind es nur 6 Items alle 2 s. - -In der Betriebsart "Durchlaufbegrenzer" kann die Anzahl der Items, die von dem Schieber bewegt werden, begrenzt werden. Die Betriebsart Durchlaufbegrenzer kann über das Gabelschlüssel-Menü aktiviert werden, indem im Menü die Anzahl an Items konfiguriert wird. Sobald die konfigurierte Anzahl an Items bewegt wurden, schaltet sich der Schieber ab. Wird der Schieber wieder eingeschaltet, bewegt er wieder die konfigurierte Anzahl an Items und schaltet sich dann ab. - -Der TA4 Schieber kann auch per Lua- oder Beduino Controller konfiguriert und gestartet werden. - -Hier die zusätzlichen Kommandos für den Lua Controller: - -- `config` dient zur Konfiguration des Schiebers, analog zum manuellen Konfiguration über das Menü. - Beispiel: `$send_cmnd(1234, "config", "default:dirt")` - Mit `$send_cmnd(1234, "config", "")` wird die Konfiguration gelöscht -- `limit` dient zum Setzen der Anzahl der Items für die Durchlaufbegrenzer Betriebsart: - Beispiel: `$send_cmnd(1234, "init", 7)` - - -[ta4_pusher|image] - -### TA4 Kiste / TA4 Chest - -Die Funktion entspricht der von TA3. Die Kiste kann aber mehr Inhalt aufnehmen. - -Zusätzlich besitzt die TA4 Kiste ein Schatteninventar zur Konfiguration. Hier können bestimmte Speicherplätze mit einem Item vorbelegt werden. Vorbelegte Speicherplätze werden beim Füllen nur mit diesen Items belegt. Zum Leeren eines vorbelegten Speicherplatzes wird ein TA4 Schieber oder TA4 Injektor mit entsprechender Konfiguration benötigt. - -[ta4_chest|image] - -### TA4 8x2000 Kiste / TA4 8x2000 Chest - -Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten, sondern verfügt über 8 Speicher, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2, TA3 oder TA4) gefüllt bzw. geleert werden. - -Wird die Kiste mit einem Schieber gefüllt, so füllen sich alle Speicherplätze von links nach rechts. Sind alle 8 Speicher voll und können keine weiteren Items hinzugefügt werden, so werden weitere Items werden abgewiesen. - -**Reihenfunktion** - -Mehrere TA4 8x2000 Kisten können zu einer großen Kiste mit mehr Inhalt verbunden werden. Dazu müssen die Kisten in einer Reihe hintereinander gesetzt werden. - -Zuerst muss die Front-Kiste gesetzt werden, dann werden die Stapel-Kisten mit gleicher Blickrichtung dahinter gesetzt (alle Kisten haben die Front in Richtung Spieler). Bei 2 Kisten in Reihe erhöht sich die Größe auf 8x4000, usw. - -Die angereihten Kisten können nun nicht mehr entfernt werden. Um die Kisten wieder abbauen zu können, gibt es zwei Möglichkeiten: - -- Die Frontkiste leeren und entfernen. Damit wird die nächste Kiste entsperrt und kann entfernt werden. -- Die Frontkiste soweit leeren dass alle Speicherplätzen maximal 2000 Items beinhalten. Damit wird die nächste Kiste entsperrt und kann entfernt werden. - -Die Kisten haben eine "Reihenfolge" Checkbox. Wird diese Checkbox aktiviert, werden die Speicherplätze durch einen Schieber nicht mehr vollständig entleert. Das letzte Item verbleibt als Vorbelegung in dem Speicherplatz. Damit ergibt sich eine feste Zuordnung von Items zu Speicherplätzen. - -Die Kiste kann nur von den Spielern genutzt werden, die an diesem Ort auch bauen können, also Protection Rechte besitzen. Es spielt dabei keine Rolle, wer die Kiste setzt. - -Der Kiste besitzt ein zusätzliches Kommandos für den Lua Controller: - -- `count` dient zur Anfrage, wie viele Items in der Kiste sind. - Beispiel 1: `$send_cmnd(CHEST, "count")` --> Summe der Items über alle 8 Speicher - Beispiel 2: `$send_cmnd(CHEST, "count", 2)` --> Anzahl der Items in Speicher 2 (zweiter von links) -- `storesize` wird verwendet, um die Größe eines der acht Speicher auszulesen - Beispiel: `$send_cmnd(CHEST, "storesize")` -> Funktion liefert bspw. 6000 zurück - -[ta4_8x2000_chest|image] - - - -### TA4 Verteiler / Distributor - -Die Funktion entspricht der von TA2. -Die Verarbeitungsleistung beträgt 24 Items alle 4 s, sofern auf allen Seiten TA4 Röhren verwendet werden. Anderenfalls sind es nur 12 Items alle 4 s. - -[ta4_distributor|image] - -### TA4 Hochleistungs-Verteiler / High Performance Distributor - -Die Funktion entspricht dem normalen TA4 Verteiler, mit zwei Unterschieden: -Die Verarbeitungsleistung beträgt 36 Items alle 4 s, sofern auf allen Seiten TA4 Röhren verwendet werden. Anderenfalls sind es nur 18 Items alle 4 s. -Außerdem können pro Ausgang bis zu 8 Items konfiguriert werden. - -[ta4_high_performance_distributor|image] - -### TA4 Kiessieb / Gravel Sieve - -Die Funktion entspricht der von TA2. -Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Block benötigt 5 ku Strom. - -[ta4_gravelsieve|image] - -### TA4 Mühle / Grinder - -Die Funktion entspricht der von TA2. -Die Verarbeitungsleistung beträgt 4 Items alle 4 s. Der Block benötigt 9 ku Strom. - -[ta4_grinder|image] - -### TA4 Steinbrecher / Quarry - -Die Funktion entspricht weitgehend der von TA2. - -Zusätzlich kann die Lochgröße zwischen 3x3 und 11x11 Blöcken eingestellt werden. -Die maximale Tiefe beträgt 80 Meter. Der Steinbrecher benötigt 14 ku Strom. - -[ta4_quarry|image] - -### TA4 Elektronikfabrik / Electronic Fab - -Die Funktion entspricht der von TA2, nur werden hier verschiedene Chips produziert. -Die Verarbeitungsleistung beträgt ein Chip alle 6 s. Der Block benötigt hierfür 12 ku Strom. - -[ta4_electronicfab|image] - -### TA4 Injektor / Injector - -Die Funktion entspricht der von TA3. - -Die Verarbeitungsleistung beträgt bis zu 8 mal vier Items alle 4 Sekunden. - -[ta4_injector|image] - -### TA4 Recycler - -Der Recycler ist eine Maschine, die alle Techage Rezepte rückwärts abarbeitet, also Maschinen und Blöcke wieder in die Bestandteile zerlegen kann. Die Maschine kann so ziemlich alle Techage und Hyperloop Blöcke zerlegen. -Aber nicht alle Zutaten/Materialien der Rezepte lassen sich recyclen: - -- Holz wird zu Sticks -- Stein wird zu Sand oder Kies -- Halbleiter/Chips können nicht recycelt werden -- Werkzeuge können nicht recycelt werden - -Die Verarbeitungsleistung beträgt ein Item alle 8 s. Der Block benötigt hierfür 16 ku Strom. - -[ta4_recycler|image] diff --git a/techage/manuals/manual_ta4_EN.md b/techage/manuals/manual_ta4_EN.md deleted file mode 100644 index 6dd91d4..0000000 --- a/techage/manuals/manual_ta4_EN.md +++ /dev/null @@ -1,1017 +0,0 @@ -# TA4: Present - -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. - -[techage_ta4|image] - - -## Wind Turbine - -A wind turbine always supplies electricity when there is wind. There is no wind in the game, but the mod simulates this by turning the wind turbines only in the morning (5:00 - 9:00) and in the evening (17:00 - 21:00). A wind turbine only supplies electricity if it is set up in a suitable location. - -The TA wind power plants are pure offshore plants, which means that they have to be built in the sea. This means that wind turbines can only be build in a sea (occean) biome and that there must be sufficient water and a clear view around the mast. - -To find a suitable spot, click on the water with the wrench (TechAge Info Tool). A chat message will show you whether this position is suitable for the mast of the wind turbine. - -The current must be led from the rotor block down through the mast. First pull the power line up and then "plaster" the power cable with TA4 pillar blocks. A work platform can be built below. The plan on the right shows the structure in the upper part. - -The wind turbine delivers 70 ku, but only 8 hours a day (see above). - -[ta4_windturbine|plan] - - -### TA4 Wind Turbine - -The wind turbine block (rotor) is the heart of the wind turbine. This block must be placed on top of the mast. Ideally at Y = 15, then you just stay within a map / forceload block. -When you start the turbine, all conditions for the operation of the wind turbine are checked. If all conditions are met, the rotor blades (wings) appear automatically. Otherwise you will get an error message. - -[ta4_windturbine|image] - - -### TA4 Wind Turbine Nacelle - -This block must be placed on the black end of the wind turbine block. - -[ta4_nacelle|image] - - -### TA4 Wind Turbine Signal Lamp - -This flashing light is only for decorative purposes and can be placed on top of the wind turbine block. - -[ta4_blinklamp|image] - - -### TA4 Pillar - -This builds the mast for the wind turbine. However, these blocks are not set by hand but must be set with the help of a trowel, so that the power line to the mast tip is replaced with these blocks (see under TA power cable). - -[ta4_pillar|image] - - -## Solar System - -The solar system only produces electricity when the sun is shining. In the game this is every game day from 6:00 am to 6:00 pm. -The same power is always available during this time. After 6:00 p.m., the solar modules switch off completely. - -The biome temperature is decisive for the performance of the solar modules. The hotter the temperature, the higher the yield. -The biome temperature can be determined with the Techage Info Tool (wrench). It typically fluctuates between 0 and 100: - -- full power is available at 100 -- at 50, half the power is available -- at 0 there is no service available - -It is therefore advisable to look for hot steppes and deserts for the solar system. -The overhead lines are available for the transport of electricity. -However, hydrogen can also be produced, which can be transported and converted back into electricity at the destination. - -The smallest unit in a solar system is two solar modules and one carrier module. The carrier module must be placed first, the two solar modules to the left and right next to it (not above!). - -The plan on the right shows 3 units, each with two solar modules and one carrier module, connected to the inverter via red cables. - -Solar modules supply DC voltage, which cannot be fed directly into the power grid. Therefore, the solar units must first be connected to the inverter via the red cable. This consists of two blocks, one for the red cable to the solar modules (DC) and one for the gray power cable to the power grid (AC). - -The map area where the solar system is located must be fully loaded. This also applies to the direct position above the solar module, because the light intensity is regularly measured there. It is therefore advisable to first set a forceload block and then to place the modules within this area. - -[ta4_solarplant|plan] - - -### TA4 Solar Module - -The solar module must be placed on the carrier module. Two solar modules are always required. -In a pair, the solar modules perform up to 3 ku, depending on the temperature. -With the solar modules, care must be taken that they have full daylight and are not shaded by blocks or trees. This can be tested with the Info Tool (wrench). - -[ta4_solarmodule|image] - - -### TA4 Solar Carrier Module - -The carrier module is available in two heights (1m and 2m). Both are functionally identical. -The carrier modules can be placed directly next to one another and thus connected to form a row of modules. The connection to the inverter or to other module series must be made with the red low-voltage cables or the low-voltage junction boxes. - -[ta4_solarcarrier|image] - - -### TA4 Solar Inverter - -The inverter converts the solar power (DC) into alternating current (AC) so that it can be fed into the power grid. -An inverter can feed a maximum of 100 ku of electricity, which corresponds to 33 solar modules or more. - -[ta4_solar_inverter|image] - - -### TA4 Low Power Cable - -The low voltage cable is used to connect rows of solar modules to the inverter. The cable must not be used for other purposes. - -The maximum cable length is 200 m. - -[ta4_powercable|image] - - -### TA4 Low Voltage Junction Box - -The junction box must be placed on the floor. It has only 4 connections (in the 4 directions). - -[ta4_powerbox|image] - - -### TA4 Street Lamp Solar Cell - -As the name suggests, the street lamp solar cell is used to power a street lamp. A solar cell can supply two lamps (1 ku). The solar cell stores the sun's energy during the day and delivers the electricity to the lamp at night. That means the lamp only glows in the dark. - -This solar cell cannot be combined with the other solar modules. - -[ta4_minicell|image] - - - -## Thermal Energy Storage - -The thermal energy storage replaces the battery block from TA3. - -The thermal energy store consists of a concrete shell (concrete blocks) filled with gravel. Five sizes of the storage are possible: - -- Cover with 5x5x5 concrete blocks, filled with 27 gravel, storage capacity: 22.5 kud -- Cover with 7x7x7 concrete blocks, filled with 125 gravel, storage capacity: 104 kud -- Cover with 9x9x9 concrete blocks, filled with 343 gravel, storage capacity: 286 kud -- Cover with 11x11x11 concrete blocks, filled with 729 gravel, storage capacity: 610 kud -- Cover with 13x13x13 concrete blocks, filled with 1331 gravel, storage capacity: 1112 kud - -A window made of an obsidian glass block may be in the concrete shell. This must be placed fairly in the middle of the wall. Through this window you can see whether the storage is loaded more than 80%. In the plan on the right you can see the structure of TA4 heat exchanger consisting of 3 blocks, the TA4 turbine and the TA4 generator. Pay attention to the alignment of the heat exchanger (the arrow at block 1 must point to the turbine). - -Contrary to the plan on the right, the connections on the storage block must be on the same level (arranged horizontally, i.e. not below and above). The pipe inlets (TA4 Pipe Inlet) must be exactly in the middle of the wall and face each other. The yellow TA4 pipes are used as steam pipes. The TA3 steam pipes cannot be used here. -Both the generator and the heat exchanger have a power connection and must be connected to the power grid. - -In principle, the heat storage system works exactly the same as the batteries, only with much more storage capacity. - -In order for the heat storage system to work, all blocks (also the concrete shell and gravel) must be loaded using a forceload block. - -[ta4_storagesystem|plan] - - -### TA4 Heat Exchanger - -The heat exchanger consists of 3 parts that must be placed on top of each other, with the arrow of the first block pointing towards the turbine. The pipes must be built with the yellow TA4 pipes. -The heat exchanger must be connected to the power grid. The energy storage device is recharged via the heat exchanger, provided that sufficient electricity is available. - -[ta4_heatexchanger|image] - - -### TA4 Turbine - -The turbine is part of the energy storage. It must be placed next to the generator and connected to the heat exchanger via TA4 tubes as shown in the plan. - -[ta4_turbine|image] - - -### TA4 Generator - -The generator is used to generate electricity. Therefore, the generator must also be connected to the power grid. -The generator is part of the energy storage. It is used to generate electricity and thus releases the energy from the energy storage unit. Therefore, the generator must also be connected to the power grid. - -Important: Both, heat exchanger and generator must be connected to the same power grid! - -[ta4_generator|image] - - -### TA4 Pipe Inlet - -One pipe inlet block each must be installed on both sides of the storage block. The blocks must face each other exactly. - -The pipe inlet blocks **cannot** be used as normal wall openings, use the TA3 pipe wall entry blocks instead. - -[ta4_pipeinlet|image] - - -### TA4 Pipe - -With TA4, the yellow pipes are used for the transmission of gas and liquids. -The maximum cable length is 100 m. - -[ta4_pipe|image] - - - -## Power Distribution - -With the help of power cables and junction boxes, power networks of up to 1000 blocks/nodes can be set up. However, it should be noted that distribution boxes must also be counted. This means that up to 500 generators/storage systems/machines/lamps can be connected to a power grid. - -With the help of an isolating transformer and electricity meter, networks can be connected to form even larger structures. - -[ta4_transformer|image] - -### TA4 Isolation Transformer - -With the help of an isolating transformer, two power grids can be connected to form a larger network. The isolation transformer can transmit electricity in both directions. - -The isolation transformer can transmit up to 300 ku. The maximum value is adjustable via the wrench menu. - -[ta4_transformer|image] - -### TA4 Electric Meter - -With the help of an electricity meter, two electricity networks can be connected to form a larger network. The electricity meter only transmits electricity in one direction (note arrow). The amount of electrical energy passed through (in kud) is measured and displayed. This value can also be queried by a Lua controller using the `consumption` command. The current current can be queried via the command `current`. - -The electricity meter can pass up to 200 ku. The maximum value is adjustable via the wrench menu. - -A power output countdown can also be entered via the wrench menu. When this countdown reaches zero, the electricity meter switches off. The countdown can be queried using the `countdown` command. - -[ta4_electricmeter|image] - -### TA4 Laser - -The TA4 laser is used for wireless power transmission. Two blocks are required for this: TA4 Laser Beam Emitter and TA4 Laser Beam Receiver. There must be an air gap between the two blocks so that the laser beam can be built up from the emitter to the receiver. First the emitter must be placed. This immediately switches on the laser beam and shows possible positions of the receiver. Possible positions for the receiver are also output via a chat message. - -With the laser, distances of up to 96 blocks can be bridged. Once the connection has been established (no current has to flow), this is indicated via the info text of the emitter and also of the receiver. - -The laser blocks themselves do not require any electricity. - -[ta4_laser|image] - - - -## Hydrogen - -Electrolysis can be used to split electricity into hydrogen and oxygen. On the other hand, hydrogen can be converted back into electricity with oxygen from the air using a fuel cell. -This enables current peaks or an excess supply of electricity to be converted into hydrogen and thus stored. - -In the game, electricity can be converted back into electricity via the fuel cell using the electrolyzer in hydrogen and hydrogen. -This means that electricity (in the form of hydrogen) can not only be stored in tanks, but also transported by means of the tank cart. - -However, the conversion of electricity into hydrogen and back is lossy. Out of 100 units of electricity, only 95 units of electricity come out after the conversion to hydrogen and back. - -[ta4_hydrogen|image] - - -### Electrolyzer - -The electrolyzer converts electricity into hydrogen. -It must be powered from the left. On the right, hydrogen can be extracted via pipes and pumps. - -The electrolyzer can draw up to 35 ku of electricity and then generates a hydrogen item every 4 s. -200 units of hydrogen fit into the electrolyzer. - -The electrolyzer has a wrench menu for setting the current consumption and the switch-off point. - -If the power stored in the power grid falls below the specified value of the switch-off point, the electrolyzer switches off automatically. This prevents the storage systems from running empty. - -[ta4_electrolyzer|image] - - -### Fuel Cell - -The fuel cell converts hydrogen into electricity. -It must be supplied with hydrogen from the left by a pump. The power connection is on the right. - -The fuel cell can deliver up to 34 ku of electricity and needs a hydrogen item every 4 s. - -Usually the fuel cell works as a category 2 generator (like other storage systems). -In this case, no other category 2 blocks such as the battery block can be charged. However, the fuel cell can also be used as a category 1 generator via the check box. - -[ta4_fuelcell|image] - - -## Chemical Reactor - -The reactor is used to process the ingredients obtained from the distillation tower or from other recipes into new products. -The plan on the left shows only one possible variant, since the arrangement of the silos and tanks depends on the recipe. - -The primary output product is always output to the side of the reactor stand, regardless of whether it is a powder or a liquid. The (secondary) waste product is always discharged at the bottom of the reactor stand. - -A reactor consists of: -- Various tanks and silos with the ingredients that are connected to the doser via pipes -- optionally a reactor base, which discharges the waste from the reactor (only necessary for recipes with two output products) -- the reactor stand, which must be placed on the base (if available). The stand has a power connection and draws 8 ku during operation. -- The reactor vessel that has to be placed on the reactor stand -- The filler pipe that must be placed on the reactor vessel -- The dosing device, which has to be connected to the tanks or silos and the filler pipe via pipes - -Note 1: Liquids are only stored in tanks, solids and substances in powder form only in silos. This applies to ingredients and output products. - -Note 2: Tanks or silos with different contents must not be connected to a pipe system. In contrast, several tanks or silos with the same content may hang in parallel on one line. - -Cracking breaks long chains of hydrocarbons into short chains using a catalyst. -Gibbsite powder serves as a catalyst (is not consumed). It can be used to convert bitumen into fueloil, fueloil into naphtha and naphtha into gasoline. - -In hydrogenation, pairs of hydrogen atoms are added to a molecule to convert short-chain hydrocarbons into long ones. -Here iron powder is required as a catalyst (is not consumed). It can be used to convert gas (propane) into isobutane, -isobutane into gasoline, gasoline into naphtha, naphtha into fueloil, and fueloil into bitumen. - - -[ta4_reactor|plan] - - -### TA4 Doser - -Part of the chemical reactor. -Pipes for input materials can be connected on all 4 sides of the doser. The materials for the reactor are discharged upwards. - -The recipe can be set and the reactor started via the doser. - -As with other machines: -- if the doser is in standby mode, one or more ingredients are missing -- if the doser is in the blocked state, the output tank or silo is full, defective or incorrectly connected - -The doser does not need any electricity. A recipe is processed every 10 s. - -[ta4_doser|image] - -### TA4 Reactor - -Part of the chemical reactor. The reactor has a inventory for the catalyst items (for cracking and hydrogenation recipes). - -[ta4_reactor|image] - - -### TA4 Filler Pipe - -Part of the chemical reactor. Must be placed on the reactor. If this does not work, remove the pipe at the position above and place it again. - -[ta4_fillerpipe|image] - - -### TA4 Reactor Stand - -Part of the chemical reactor. Here is also the power connection for the reactor. The reactor requires 8 ku of electricity. - -The stand has two pipe connections, to the right for the starting product and down for the waste, such as red mud in aluminum production. - -[ta4_reactorstand|image] - - -### TA4 Reactor Base - -Part of the chemical reactor. Is required for the drainage of the waste product. - -[ta4_reactorbase|image] - - -### TA4 Silo - -Part of the chemical reactor. Is required to store substances in powder or granule form. - -[ta4_silo|image] - - - - -## ICTA Controller - -The ICTA controller (ICTA stands for "If Condition Then Action") is used to monitor and control machines. The controller can be used to read in data from machines and other blocks and, depending on this, switch other machines and blocks on / off. - -Machine data is read in and blocks and machines are controlled using commands. Chapter TA3 -> Logic / switching blocks is important for understanding how commands work. - -The controller requires a battery to operate. The display is used to output data, the signal tower to display errors. - -[ta4_icta_controller|image] - - - -### TA4 ICTA controller - -The controller works on the basis of `IF THEN ` rules. Up to 8 rules can be created per controller. - -Examples of rules are: - -- If a distributor is `blocked`, the pusher in front of it should be switched off -- If a machine shows an error, this should be shown on the display - -The controller checks these rules cyclically. To do this, a cycle time in seconds (`` Cycle / s '') must be specified for each rule (1..1000). - -For rules that evaluate an on / off input, e.g. from a switch or detector, cycle time 0 must be specified. The value 0 means that this rule should always be carried out when the input signal has changed, e.g. the button has sent a new value. - -All rules should only be executed as often as necessary. This has two advantages: - -- the battery of the controller lasts longer (each controller needs a battery) -- the load for the server is lower (therefore fewer lags) - -You have to set a delay time (`after/s`) for each action. If the action is to be carried out immediately, 0 must be entered. - -The controller has its own help and information on all commands via the controller menu. - -[ta4_icta_controller|image] - -### Battery - -The battery must be placed in close proximity to the controller, i.e. in one of the 26 positions around the controller. - -[ta4_battery|image] - -### TA4 Display - -The display shows its number after placement. The display can be addressed via this number. Texts can be output on the display, whereby the display can display 5 lines and thus 5 different texts. - -Lines of text are always left-aligned. If the text is to be centered horizontally, the text must be preceded by the character "\t" (tabulator). - -The display is updated at most once per second. - -[ta4_display|image] - -### TA4 Display XL - -The TA4 Display XL is twice the size of the TA4 display. - -Lines of text are always left-aligned. If the text is to be centered horizontally, the text must be preceded by the character "\t" (tabulator). - -The display is updated every two seconds at most. - -[ta4_displayXL|image] - - -### TA4 Signal Tower - -The signal tower can display red, green and orange. A combination of the 3 colors is not possible. - -[ta4_signaltower|image] - - - -## TA4 Lua Controller - -As the name suggests, the Lua controller must be programmed in the Lua programming language. The manual in English is here available: - -https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md - -The Lua controller also requires a battery. The battery must be placed in close proximity to the controller, i.e. in one of the 26 positions around the controller. - -[ta4_lua_controller|image] - -### TA4 Lua Server - -The server is used for the central storage of data from several Lua controllers. It also saves the data after a server restart. - -[ta4_lua_server|image] - -### TA4 Sensor Box / Chest - -The TA4 sensor box is used to set up automatic warehouses or vending machines in conjunction with the Lua controller. -If something is put into the box or removed, or one of the "F1" / "F2" keys is pressed, an event signal is sent to the Lua controller. -The sensor box supports the following commands: - -- The status of the box can be queried via `state = $send_cmnd(, "state")`. Possible answers are: "empty", "loaded", "full" -- The last player action can be queried via `name, action = $send_cmnd(, "action")`. `name` is the player name. One of the following is returned as `action`: "put", "take", "f1", "f2". -- The contents of the box can be read out via `stacks = $send_cmnd(, "stacks")`. See: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest -- Via `$send_cmnd(, "text", "press both buttons and\nput something into the chest")` the text can be set in the menu of the sensor box. - -The checkbox "Allow public chest access" can be used to set whether the box can be used by everyone or only by players who have access/protection rights here. - -[ta4_sensor_chest|image] - -### TA4 Lua Controller Terminal - -The terminal is used for input / output for the Lua controller. - -[ta4_terminal|image] - - - -## TA4 Logic/Switching Modules - -### TA4 Button/Switch - -Only the appearance of the TA4 button/switch has changed. The functionality is the same as with the TA3 button/switch. With the wrench menu, however, the data can be changed later. - -[ta4_button|image] - -### TA4 2x Button - -This block has two buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition, the command that is to be sent can be configured for each button. - -[ta4_button_2x|image] - - -### TA4 4x Button - -This block has four buttons that can be individually configured using the wrench menu. The labeling and the target block address can be configured for each button. In addition, the command that is to be sent can be configured for each button. - -[ta4_button_4x|image] - -### TA4 2x Signal Lamp - -This block has two lamps that can be controlled individually. Each lamp can display the colors "red", "green" and "amber". The labeling for both lamps can be configured via the wrench menu. The lamps can be controlled using the following commands: - -- Switch lamp 1 to red: `$send_cmnd(1234, "red", 1)` -- Switch lamp 2 to green: `$send_cmnd(1234, "green ", 2)` -- Switch lamp 1 to orange: `$send_cmnd(1234, "amber", 1)` -- Switch lamp 2 off: `$send_cmnd(1234, "off", 2)` - -[ta4_signallamp_2x|image] - -### TA4 4x Signal Lamp - -This block has four lamps that can be controlled individually. Each lamp can display the colors "red", "green" and "amber". The labeling for all lamps can be configured via the wrench menu. The lamps can be controlled using the following commands: - -- Switch lamp 1 to red: `$send_cmnd(1234, "red", 1)` -- Switch lamp 2 to green: `$send_cmnd(1234, "green ", 2)` -- Switch lamp 3 to orange: `$send_cmnd(1234, "amber", 3)` -- Switch lamp 4 off: `$send_cmnd(1234, "off", 4)` - -[ta4_signallamp_4x|image] - -### TA4 Player Detector - -Only the appearance of the TA4 player detector has changed. The functionality is the same as with the TA3 player detector. - -[ta4_playerdetector|image] - -### TA4 State Collector - -[ta4_collector|image] - -The status collector queries all configured machines in turn for the status. If one of the machines has reached or exceeded a preconfigured status, an "on" command is sent. For example, many machines can be easily monitored for faults from a Lua controller. - -### TA4 Detector - -The functionality is the same as for the TA3 detector. In addition, the detector counts the items passed on. -This counter can be queried with the 'count' command and reset with 'reset'. - -[ta4_detector|image] - -### TA4 Node Detector - -The functionality is the same as with the TA3 Node Detector. - -In contrast to the TA3 node detector, the positions to be monitored can be configured individually here. To do this, the "Record" button must be pressed. Then all blocks must be clicked, the position of which is to be checked. Then the "Done" button must be pressed. - -Up to 4 blocks can be selected. - -[ta4_nodedetector|image] - -### TA4 Energy Storage Charge Detector - -The charge detector measures the state of charge of the power grid's energy storage every 8 s. - -If the value falls below a configurable threshold (switching point), a command (default: "off") is sent. If the value rises above this switching point again, a second command (default: "on") is sent. This allows consumers to be disconnected from the grid when the charge level of the energy storage device falls below the specified switching point. - -To do this, the charge detector must be connected to the grid via a junction box. The charge detector is configured via the open-end wrench menu. - -[ta4_chargedetector|image] - -### TA4 Gaze Sensor - -The TA4 gaze sensor generates a command when the block is viewed/focused by the owner or other configured players and sends a second command when the block is no longer focused. It thus serves as a replacement for buttons/switches, for example to open/close doors. - -The TA4 Gaze Sensor can only be programmed using the open-end wrench menu. If you have an open-end wrench in your hand, the sensor does not trigger, even if it is focused. - -[ta4_gaze_sensor|image] - -### TA4 Sequencer - -Entire processes can be programmed using the TA4 sequencer. Here's an example: - -``` --- this is a comment -[1] send 1234 a2b -[30] send 1234 b2a -[60] goto 1 -``` - -- Each line begins with a number which corresponds to a point in time `[]` -- Values from 1 to 50000 are permitted for times -- 1 corresponds to 100 ms, 50000 corresponds to about 4 game days -- Empty lines or comments are allowed (`-- comment`) -- With `send ` you can send a command to a block -- With `goto ` you can jump to another line / point in time -- With `stop` you can stop the sequencer with a delay so that it does not receive a new command - accepts from a button or other block (to complete a movement) - Without `stop`, the sequencer goes into stopped mode immediately after the last command. - -The TA4 sequencer supports the following techage commands: - -- `goto ` Jump to a command line and start the sequencer -- `stop` Stop the sequencer -- `on` and `off` as aliases for `goto 1` resp. `stop` - -The `goto` command is only accepted when the sequencer is stopped. - -The cycle time (default: 100 ms) can be changed for the sequencer via the open-end wrench menu. - -[ta4_sequencer|image] - - - -## Move/Turn Controller - -### TA4 Move Controller - -The TA4 Move Controller is similar to "Door Controller 2", but the selected blocks are not removed, but can be moved. -Since the moving blocks can take players and mobs standing on the block with them, elevators and similar transport systems can be built with them. - -Instructions: - -- Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained) -- the "flight route" must be entered via an x, y, z specification (relative) (the maximum distance (x+y+z) is 200 m) -- The movement can be tested with the menu buttons "Move A-B" and "Move B-A" -- you can also fly through walls or other blocks -- The target position for the blocks can also be occupied. In this case, the blocks are saved "invisibly". This is intended for sliding doors and the like - -The Move Controller supports the following techage commands: - -- `a2b` Move block from A to B. -- `b2a` Move block from B to A. -- `move` Move block to the other side - -You can switch to the `move xyz` operating mode via the wrench menu. After switching, the following techage commands are supported: - -- `move2` With the command, the flight route must also be specified as an x,y,z vector. - Example Lua Controller: `$send_cmnd(MOVE_CTLR, "move2", "0,12,0")` -- `reset` move block(s) back to start position - -**Important instructions:** - -- If several blocks are to be moved, the block that is to take the players/mobs must be clicked first when training. -- If the block that is supposed to take the players/mobs has a reduced height, the height must be set in the controller using the open-ended wrench menu (e.g. height = 0.5). Otherwise the player/mob will not be "found" and will not be taken away. - -[ta4_movecontroller|image] - -### TA4 Turn Controller - -The TA4 turn controller is similar to the "Move Controller", but the selected blocks are not moved, but rotated around their center to the right or left. - -Instructions: - -- Set the controller and train the blocks to be moved via the menu (up to 16 blocks can be trained) -- The movement can be tested with the menu buttons "Turn left" and "Turn right" - -The turn controller supports the following techage commands: - -- `left` Turn left -- `right` Turn right -- `uturn` Turn 180 degrees - -[ta4_turncontroller|image] - - - - -## TA4 Lamps - -TA4 contains a series of powerful lamps that enable better illumination or take on special tasks. - -### TA4 LED Grow Light - -The TA4 LED grow light enables fast and vigorous growth of all plants from the `farming` mod. The lamp illuminates a 3x3 field, so that plants can also be grown underground. -The lamp must be placed one block above the ground in the middle of the 3x3 field. - -The lamp can also be used to grow flowers. If the lamp is placed over a 3x3 flower bed made of "Garden Soil" (Mod `compost`), the flowers grow there automatically (above and below ground). - -You can harvest the flowers with the Signs Bot, which also has a corresponding sign that must be placed in front of the flower field. - -The lamp requires 1 ku of electricity. - -[ta4_growlight|image] - -### TA4 Street Lamp - -The TA4 LED street lamp is a lamp with particularly strong illumination. The lamp consists of the lamp housing, lamp arm and lamp pole blocks. - -The current must be led from below through the mast up to the lamp housing. First pull the power line up and then "plaster" the power cable with lamp pole blocks. - -The lamp requires 1 ku of electricity. - -[ta4_streetlamp|image] - -### TA4 LED Industrial Lamp - -The TA4 LED industrial lamp is a lamp with particularly strong illumination. The lamp must be powered from above. - -The lamp requires 1 ku of electricity. - -[ta4_industriallamp|image] - - - - -## TA4 Liquid Filter - -The liquid filter filters red mud. -A part of the red mud becomes lye, which can be collected at the bottom in a tank. -The other part becomes desert cobblestone and clutters the filter material. -If the filter is too clogged, it has to be cleaned and re-filled. -The filter consists of a base layer, 7 identical filter layers and a filling layer at the top. - -[ta4_liquid_filter|image] - -### Base Layer - -You can see the structure of this layer in the plan. - -The lye is collected in the tank. - -[ta4_liquid_filter_base|plan] - -### Gravel Layer - -This layer has to be filled with gravel as shown in the plan. -In total, there must be seven layers of gravel. -The filter will become cluttered over time, so that it has to be cleaned and re-filled. - -[ta4_liquid_filter_gravel|plan] - -### Filling Layer - -This layer is used to fill the filter with red mud. -The red mud must be pumped into the filler pipe. - -[ta4_liquid_filter_top|plan] - - - - -## TA4 Collider (Particle Accelerator) - -The Collider is a research facility that conducts basic research. Experience points can be collected here, which are required for TA5 (Future Age). - -Like its original at CERN in Geneva, the collider must be built underground. The standard setting here is Y <= -28. The value can, however, be changed by the server personnel via configuration. Please ask or try the "TA4 Collider Detector Worker" block. - -Only one collider can be operated per player. So it makes no sense to set up two or more colliders. Experience points are credited to the player who owns the collider. The experience points cannot be transferred. - -A collider consists of a "ring" made of tubes and magnets as well as a detector with a cooling system. - -- The detector is the heart of the system. This is where the scientific experiments take place. The detector is 3x3x7 blocks in size. -- 22 TA4 Collider Magnets (not the TA4 Collider Detector Magnets!) must be connected to each other via 5 blocks of the TA4 vacuum tube. Each magnet also requires electricity and a gas connection for cooling. The whole thing forms (as shown in the plan on the right) a square with an edge length of 37 meters. - -The plan shows the facility from above: - -- the gray block is the detector with the worker block in the middle -- the red blocks are the magnets, the blue the vacuum tubes - -[techage_collider_plan|plan] - -### Detector - -The detector is set up automatically with the help of the "TA4 Collider Detector Worker" block (similar to the derrick). All of the materials required for this must first be placed in the worker block. The detector is shown symbolically on the worker block. The detector is set up across the worker block. - -The detector can also be dismantled again with the help of the worker block. - -The connections for electricity, gas and vacuum tubes are located on the two front sides of the detector. A TA4 pump must be connected at the top in order to suck the tube empty / to create the vacuum. - -The cooling system must be connected to the rear of the detector. The cooling system is shown in the plan on the right. In addition to the TA4 heat exchanger of the energy storage unit (which is used here for cooling), a TA4 cooler block is also required. - -Note: The arrow on the heat exchanger must point away from the detector. The heat exchanger must also be supplied with electricity. - -[ta4_cooler|plan] - - -- In addition, cooling is required, which must also be installed at the detector. Isobutane is required for cooling. -- The system requires quite a bit of electricity. Therefore, it makes sense to have your own power supply. - -### Control / TA4 Terminal - -The collider is controlled via a TA4 terminal (not via the TA4 Lua controller terminal). - -This terminal must be connected to the detector. The number of the detector is displayed as info text on the worker block. - -The terminal supports the following commands: - -- `connect ` (connect to the detector) -- `start` (starting the detector) -- `stop` (stop the detector) -- `test ` (checking a magnet) -- `points` (query of the experience points already achieved) - -If an error occurs on a magnet during the `start`, the number of the magnet is output. The `test` command can be used to request further information on the magnet error. - -[ta4_terminal|image] - -### Cooling and power - -Each TA4 Collider magnet must also be supplied with electricity (as shown on the right in the plan) and with Isobutane for cooling: - -- The connection for the power is on the top of the magnet. -- The connection for the cooling is on the front of the magnet. -- A TA4 pump and a TA4 tank with at least 250 units of isobutane are also required to cool the entire system. -- The system also requires a lot of electricity. It therefore makes sense to have your own power supply with at least 145 ku. - -[techage_collider_plan2|plan] - -### Construction - -The following sequence is recommended when setting up the collider: - -- Put a forceload block. Only the detector with the cooling system has to be in the area of ​​the forceload block. -- Set the worker block, fill it with items and set up the detector via the menu -- Build the ring with tubes and magnets -- Connect all magnets and the detector with power cables -- Connect all magnets and the detector with the yellow tubes and pump the isobutane into the tube system with a pump -- Install a TA4 pump as a vacuum pump on the detector and switch it on (no additional tank is required). If the pump goes into "standby", the vacuum is established. This will take a few seconds -- assemble the cooler (heat exchanger) and connect it to the power cable -- Place the TA4 terminal in front of the detector and connect it to the detector via `connect ` -- Switch on / connect the power supply -- switch on the cooler (heat exchanger) -- Switch on the detector via `start` on the TA4 terminal. After a few test steps, the detector goes into normal operation or outputs an error. -- The collider has to run continuously and then gradually delivers experience points. For 10 points, the collider has to run for a few hours - -[techage_ta4c|image] - - - - -## More TA4 Blocks - -### TA4 Recipe Block - -Up to 10 recipes can be saved in the recipe block. These recipes can then be called up via a TA4 Autocrafter command. This enables the autocrafter's recipe to be configured using a command. The recipes in the recipe block can also be queried directly using a command. - -`input ` reads a recipe from the TA4 recipe block. `` is the number of the recipe. The block returns a list of recipe ingredients. - -Example: `$send_cmnd(1234, "input", 1)` - -[ta4_recipeblock|image] - -### TA4 Autocrafter - -The function corresponds to that of TA3. - -The processing power is 4 items every 4 s. The autocrafter requires 9 ku of electricity for this. - -In addition, the TA4 Autocrafter supports the selection of different recipes using the following commands: - -`recipe "."` switches the autocrafter to a recipe from the TA4 Recipe Block. `` is the number of the recipe block, `` the recipe number. Example: `$send_cmnd(1234, "recipe", "5467.1")` - -Alternatively, a recipe can also be selected via the list of ingredients, such as: -`$send_cmnd(1234, "recipe", "default:coal_lump,,,default:stick")` -All technical names of a recipe must be specified here, separated by commas. See also the command `input` in the TA4 recipe block. - -The `flush` command moves all items from the input inventory to the output inventory. The command returns `true` if the input inventory was completely emptied. If `false` was returned (output inventory full), the command must be repeated at a later time. - -[ta4_autocrafter|image] - -### TA4 Tank - -See TA3 tank. - -A TA4 tank can hold 2000 units or 200 barrels of liquid. - -[ta4_tank|image] - -### TA4 Pump - -See TA3 pump. - -The TA4 pump pumps 8 units of liquid every two seconds. - -In the "Flow limiter" mode, the number of units pumped by the pump can be limited. The flow limiter mode can be activated via the open-end wrench menu by configuring the number of units in the menu. Once the configured number of units have been pumped, the pump will turn off. When the pump is turned on again, it will pump the configured number of units again and then turn off. - -The flow limiter can also be configured and started using a Lua or Beduino controller. - -The pump also supports the `flowrate` command. This allows the total flow rate through the pump to be queried. - -[ta4_pump|image] - -### TA4 Furnace Heater - -With TA4, the industrial furnace also has its electrical heating. The oil burner and the blower can be replaced with the heater. - -The heater requires 14 ku of electricity. - -[ta4_furnaceheater|image] - -### TA4 Water Pump (deprecated) - -This block can no longer be crafted and will be replaced by the TA4 water inlet block. - -### TA4 Water Inlet - -Some recipes require water. The water must be pumped from the sea with a pump (water at y = 1). A "pool" made up of a few water blocks is not sufficient for this! - -To do this, the water inlet block must be placed in the water and connected to the pump via pipes. If the block is placed in the water, it must be ensured that there is water under the block (water must be at least 2 blocks deep). - -[ta4_waterinlet|image] - -### TA4 Tube - -TA4 also has its own tubes in the TA4 design. These can be used like standard tubes. -But: TA4 pushers and TA4 distributors only achieve their full performance when used with TA4 tubes. - -[ta4_tube|image] - -### TA4 Pusher - -The function basically corresponds to that of TA2 / TA3. In addition, a menu can be used to configure which objects should be taken from a TA4 chest and transported further. -The processing power is 12 items every 2 s, if TA4 tubes are used on both sides. Otherwise there are only 6 items every 2 s. - -In the "flow limiter" mode, the number of items that are moved by the pusher can be limited. The flow limiter mode can be activated via the open-end wrench menu by configuring the number of items in the menu. As soon as the configured number of items have been moved, the pusher switches off. If the pusher is switched on again, it moves the configured number of items again and then switches off. - -The TA4 pusher can also be configured and started using a Lua or Beduino controller. - -Here are the additional commands for the Lua controller: - -- `config` is used to configure the pusher, analogous to manual configuration via the menu. - Example: `$send_cmnd(1234, "config", "default:dirt")` - With `$send_cmnd(1234, "config", "")` the configuration is deleted -- `limit` is used to set the number of items for the flow limiter mode: - Example: `$send_cmnd(1234, "init", 7)` - -[ta4_pusher|image] - -### TA4 Chest - -The function corresponds to that of TA3. The chest can hold more content. - -In addition, the TA4 chest has a shadow inventory for configuration. Here certain stack locations can be pre-assigned with an item. Pre-assigned inventory stacks are only filled with these items when filling. A TA4 pusher or TA4 injector with the appropriate configuration is required to empty a pre-assigned inventory stacks. - -[ta4_chest|image] - -### TA4 8x2000 Chest - -The TA4 8x2000 chest does not have a normal inventory like other chest, but has 8 stores, whereby each store can hold up to 2000 items of one sort. The orange buttons can be used to move items to or from the store. The box can also be filled or emptied with a pusher (TA2, TA3 or TA4) as usual. - -If the chest is filled with a pusher, all stores fill from left to right. If all 8 stores are full and no further items can be added, further items are rejected. - -**Row function** - -Several TA4 8x2000 chests can be connected to a large chest with more content. To do this, the chests must be placed in a row one after the other. - -First the front chest must be placed, then the stacking chests are placed behind with the same direction of view (all boxes have the front towards the player). With 2 chests in a row, the size increases to 8x4000, etc. - -The rows of chests can no longer be removed. There are two ways to dismantle the chests: - -- Empty and remove the front chest. This unlocks the next chest and can be removed. -- Empty the front chest so far that all stores contain a maximum of 2000 items. This unlocks the next chest and can be removed. - -The chests have an "order" checkbox. If this checkbox is activated, the stores are no longer completely emptied by a pusher. The last item remains in the store as a default. This results in a fixed assignment of items to storage locations. - -The chest can only be used by players who can build at this location, i.e. who have protection rights. It does not matter who sets the chest. - -The chest has an additional command for the Lua controller: - -- `count` is used to request how many items are in the chest. - Example 1: `$send_cmnd(CHEST, "count")` -> Sum of items across all 8 stores - Example 2: `$send_cmnd(CHEST, "count", 2)` -> number of items in store 2 (second from left) -- `storesize` is used to read the size of one of the eight stores: - Example: `$send_cmnd(CHEST, "storesize")` -> function returns e.g. 6000 - -[ta4_8x2000_chest|image] - - - -### TA4 Distributor - -The function corresponds to that of TA2. -The processing power is 24 items every 4 s, provided TA4 tubes are used on all sides. Otherwise there are only 12 items every 4 s. - -[ta4_distributor|image] - -### TA4 High Performance Distributor - -The function corresponds to that of the normal TA4 distributor, with two differences: -The processing power is 36 items every 4 s, provided TA4 tubes are used on all sides. Otherwise there are only 18 items every 4 s. -Furthermore, up to 8 items can be configured per direction. - -[ta4_high_performance_distributor|image] - -### TA4 Gravel Sieve - -The function corresponds to that of TA2. -The processing power is 4 items every 4 s. The block requires 5 ku of electricity. - -[ta4_gravelsieve|image] - -### TA4 Grinder - -The function corresponds to that of TA2. -The processing power is 4 items every 4 s. The block requires 9 ku of electricity. - -[ta4_grinder|image] - -### TA4 Quarry - -The function largely corresponds to that of TA2. - -In addition, the hole size can be set between 3x3 and 11x11 blocks. -The maximum depth is 80 meters. The quarry requires 14 ku of electricity. - -[ta4_quarry|image] - -### TA4 Electronic Fab - -The function corresponds to that of TA2, only different chips are produced here. -The processing power is one chip every 6 s. The block requires 12 ku of electricity for this. - -[ta4_electronicfab|image] - -### TA4 Injector - -The function corresponds to that of TA3. - -The processing power is up to 8 times four items every 4 seconds. - -[ta4_injector|image] - -### TA4 Recycler - -The recycler is a machine that processes all Techage recipes backwards, i.e. it can dismantle machines and blocks back into their components. - -The machine can disassemble pretty much any Techage and Hyperloop blocks. But not all recipe items/materials can be recycled: - -- Wood turns into sticks -- Stone turns into sand or gravel -- Semiconductors / chips cannot be recycled -- Tools cannot be recycled - -The processing power is one item every 8 s. The block requires 16 ku of electricity for this. - -[ta4_recycler|image] diff --git a/techage/manuals/manual_ta4_pt-BR.md b/techage/manuals/manual_ta4_pt-BR.md deleted file mode 100644 index 8930b47..0000000 --- a/techage/manuals/manual_ta4_pt-BR.md +++ /dev/null @@ -1,1017 +0,0 @@ -# TA4: Presente - -Fontes de energia renováveis, como vento, sol e biocombustíveis, ajudam você a sair da era do petróleo. Com tecnologias modernas e máquinas inteligentes, você parte para o futuro. - -[techage_ta4|image] - - -## Turbina eólica - -Uma turbina eólica sempre fornece eletricidade quando há vento. Não há vento no jogo, mas o mod simula isso girando as turbinas eólicas somente pela manhã (5:00 - 9:00) e à noite (17:00 - 21:00). Uma turbina eólica só fornece eletricidade se estiver instalada em um local adequado. - -As usinas eólicas da TA são usinas puramente offshore, o que significa que elas precisam ser construídas no mar. Isso significa que as turbinas eólicas só podem ser construídas em um bioma marinho (oceano) e que deve haver água suficiente e uma visão clara ao redor do mastro. - -Para encontrar um local adequado, clique na água com a chave inglesa (TechAge Info Tool). Uma mensagem de bate-papo mostrará se essa posição é adequada para o mastro da turbina eólica. - -A corrente deve ser conduzida do bloco do rotor até o mastro. Primeiro, puxe a linha de energia para cima e, em seguida, "engesse" o cabo de energia com blocos de pilar TA4. Uma plataforma de trabalho pode ser construída abaixo. A planta à direita mostra a estrutura na parte superior. - -A turbina eólica fornece 70 ku, mas apenas 8 horas por dia (veja acima). - -[ta4_windturbine|plan] - - -### Turbina eólica TA4 - -O bloco da turbina eólica (rotor) é o coração da turbina eólica. Esse bloco deve ser colocado no topo do mastro. Idealmente, em Y = 15, então você fica dentro de um bloco de mapa/carga. -Quando você inicia a turbina, todas as condições para a operação da turbina eólica são verificadas. Se todas as condições forem atendidas, as pás do rotor (asas) aparecerão automaticamente. Caso contrário, você receberá uma mensagem de erro. - -[ta4_windturbine|image] - - -### Nacelle da turbina eólica TA4 - -Esse bloco deve ser colocado na extremidade preta do bloco da turbina eólica. - -[ta4_nacelle|image] - - -### Lâmpada de sinalização de turbina eólica TA4 - -Essa luz intermitente serve apenas para fins decorativos e pode ser colocada na parte superior do bloco da turbina eólica. - -[ta4_blinklamp|image] - - -### Pilar TA4 - -Isso constrói o mastro da turbina eólica. No entanto, esses blocos não são fixados manualmente, mas devem ser fixados com a ajuda de uma espátula(trowel), de modo que a linha de energia para a ponta do mastro seja substituída por esses blocos (consulte Cabo de energia TA). - -[ta4_pillar|image] - - -## Sistema Solar - -O sistema solar só produz eletricidade quando o sol está brilhando. No jogo, isso ocorre todo dia de jogo, das 6h às 18h. -A mesma energia está sempre disponível durante esse período. Após as 18h00, os módulos solares se desligam completamente. - -A temperatura do bioma é decisiva para o desempenho dos módulos solares. Quanto mais quente for a temperatura, maior será o rendimento. -A temperatura do bioma pode ser determinada com a Techage Info Tool (chave inglesa). Normalmente, ela oscila entre 0 e 100: - -- a potência total está disponível a 100 -- a 50, metade da potência está disponível -- em 0, não há serviço disponível - -Portanto, é aconselhável procurar estepes e desertos quentes para o sistema solar. -As linhas aéreas estão disponíveis para o transporte de eletricidade. -No entanto, também é possível produzir hidrogênio, que pode ser transportado e convertido novamente em eletricidade no destino. - -A menor unidade em um sistema solar é composta por dois módulos solares e um módulo de transporte. O módulo de transporte deve ser colocado primeiro, com os dois módulos solares à esquerda e à direita próximos a ele (não acima!). - -A planta à direita mostra 3 unidades, cada uma com dois módulos solares e um módulo de suporte, conectadas ao inversor por meio de cabos vermelhos. - -Os módulos solares fornecem tensão CC, que não pode ser alimentada diretamente na rede elétrica. Portanto, as unidades solares devem primeiro ser conectadas ao inversor por meio do cabo vermelho. Ele consiste em dois blocos, um para o cabo vermelho dos módulos solares (CC) e outro para o cabo de alimentação cinza da rede elétrica (CA). - -A área do mapa onde o sistema solar está localizado deve estar totalmente carregada. Isso também se aplica à posição direta acima do módulo solar, pois a intensidade da luz é medida regularmente nesse local. Portanto, é aconselhável definir primeiro um bloco de carga e depois colocar os módulos dentro dessa área. - -[ta4_solarplant|plan] - - -### Módulo solar TA4 - -O módulo solar deve ser colocado no módulo de suporte. São sempre necessários dois módulos solares. -Em um par, os módulos solares têm desempenho de até 3 ku, dependendo da temperatura. -Com os módulos solares, deve-se tomar cuidado para que eles tenham plena luz do dia e não sejam sombreados por blocos ou árvores. Isso pode ser testado com a Info Tool (wrench ou chave inglesa). - -[ta4_solarmodule|image] - - -### Módulo de transporte solar TA4 - -O módulo de suporte está disponível em duas alturas (1m e 2m). Ambos são funcionalmente idênticos. -Os módulos portadores podem ser colocados diretamente um ao lado do outro e, assim, conectados para formar uma fileira de módulos. A conexão com o inversor ou com outras séries de módulos deve ser feita com os cabos vermelhos de baixa tensão ou com as caixas de junção de baixa tensão. - -[ta4_solarcarrier|image] - - -### Inversor solar TA4 - -O inversor converte a energia solar (CC) em corrente alternada (CA) para que ela possa ser alimentada na rede elétrica. -Um inversor pode alimentar um máximo de 100 ku de eletricidade, o que corresponde a 33 módulos solares ou mais. - -[ta4_solar_inverter|image] - - -### Cabo de baixa potência TA4 - -O cabo de baixa tensão é usado para conectar fileiras de módulos solares ao inversor. O cabo não deve ser usado para outros fins. - -O comprimento máximo do cabo é de 200 m. - -[ta4_powercable|image] - - -### Caixa de junção de baixa tensão TA4 - -A caixa de junção deve ser colocada no chão. Ela tem apenas 4 conexões (nas 4 direções). - -[ta4_powerbox|image] - - -### Célula solar para lâmpadas de rua TA4 - -Como o nome sugere, a célula solar para lâmpadas de rua é usada para alimentar uma lâmpada de rua. Uma célula solar pode alimentar duas lâmpadas (1 ku). A célula solar armazena a energia do sol durante o dia e fornece a eletricidade para a lâmpada à noite. Isso significa que a lâmpada só brilha no escuro. - -Essa célula solar não pode ser combinada com os outros módulos solares. - -[ta4_minicell|image] - - - -## Armazenamento de energia térmica - -O armazenamento de energia térmica substitui o bloco de baterias do TA3. - -O armazenamento de energia térmica consiste em uma concha de concreto (blocos de concreto) preenchida com cascalho. São possíveis cinco tamanhos de armazenamento: - -- Cobertura com blocos de concreto 5x5x5, preenchida com 27 cascalhos, capacidade de armazenamento: 22,5 kud -- Cobertura com blocos de concreto 7x7x7, preenchidos com cascalho 125, capacidade de armazenamento: 104 kud -- Cobertura com blocos de concreto 9x9x9, preenchida com 343 cascalhos, capacidade de armazenamento: 286 kud -- Cobertura com blocos de concreto 11x11x11, preenchida com 729 cascalhos, capacidade de armazenamento: 610 kud -- Cobertura com blocos de concreto 13x13x13, preenchidos com cascalho 1331, capacidade de armazenamento: 1112 kud - -Uma janela feita de um bloco de vidro de obsidiana pode ser colocada na estrutura de concreto. Ela deve ser colocada bem no meio da parede. Por essa janela, é possível ver se o armazenamento está carregado em mais de 80%. Na planta à direita, você pode ver a estrutura do trocador de calor TA4, que consiste em 3 blocos, a turbina TA4 e o gerador TA4. Preste atenção ao alinhamento do trocador de calor (a seta no bloco 1 deve apontar para a turbina). - -Ao contrário da planta à direita, as conexões no bloco de armazenamento devem estar no mesmo nível (dispostas horizontalmente, ou seja, não abaixo e acima). As entradas de tubulação (TA4 Pipe Inlet) devem estar exatamente no meio da parede e de frente uma para a outra. Os tubos TA4 amarelos são usados como tubos de vapor. Os tubos de vapor TA3 não podem ser usados aqui. -Tanto o gerador quanto o trocador de calor têm uma conexão de energia e devem ser conectados à rede elétrica. - -Em princípio, o sistema de armazenamento de calor funciona exatamente da mesma forma que as baterias, só que com muito mais capacidade de armazenamento. - -Para que o sistema de armazenamento de calor funcione, todos os blocos (também a casca de concreto e o cascalho) devem ser carregados usando um bloco forceload. - -[ta4_storagesystem|plan] - - -### Trocador de calor TA4 - -O trocador de calor consiste em três partes que devem ser colocadas umas sobre as outras, com a seta do primeiro bloco apontando para a turbina. Os tubos devem ser construídos com os tubos TA4 amarelos. -O trocador de calor deve ser conectado à rede elétrica. O dispositivo de armazenamento de energia é recarregado por meio do trocador de calor, desde que haja eletricidade suficiente disponível. - -[ta4_heatexchanger|image] - - -### Turbina TA4 - -A turbina faz parte do armazenamento de energia. Ela deve ser colocada ao lado do gerador e conectada ao trocador de calor por meio de tubos TA4, conforme mostrado na planta. - -[ta4_turbine|image] - - -### Gerador TA4 - -O gerador é usado para gerar eletricidade. Portanto, o gerador também deve ser conectado à rede elétrica. -O gerador faz parte do armazenamento de energia. Ele é usado para gerar eletricidade e, assim, liberar a energia da unidade de armazenamento de energia. Portanto, o gerador também deve ser conectado à rede elétrica. - -Importante: Tanto o trocador de calor quanto o gerador devem estar conectados à mesma rede elétrica! - -[ta4_generator|image] - - -### Entrada do tubo TA4 - -Um bloco de entrada de tubo deve ser instalado em cada um dos dois lados do bloco de armazenamento. Os blocos devem estar exatamente de frente um para o outro. - -Os blocos de entrada de tubo **não** podem ser usados como aberturas normais de parede; em vez disso, use os blocos de entrada de tubo TA3 na parede. - -[ta4_pipeinlet|image] - - -### Tubo TA4 - -Com o TA4, os tubos amarelos são usados para a transmissão de gás e líquidos. -O comprimento máximo do cabo é de 100 m. - -[ta4_pipe|image] - - - -## Distribuição de energia - -Com a ajuda de cabos de energia e caixas de junção, é possível configurar redes de energia de até 1.000 blocos/nós. Entretanto, deve-se observar que as caixas de distribuição também devem ser contadas. Isso significa que até 500 geradores/sistemas de armazenamento/máquinas/lâmpadas podem ser conectados a uma rede elétrica. - -Com a ajuda de um transformador de isolamento e de um medidor de eletricidade, as redes podem ser conectadas para formar estruturas ainda maiores. - -[ta4_transformer|image] - -### Transformador de isolamento TA4 - -Com a ajuda de um transformador de isolamento, duas redes de energia podem ser conectadas para formar uma rede maior. O transformador de isolamento pode transmitir eletricidade em ambas as direções. - -O transformador de isolamento pode transmitir até 300 ku. O valor máximo é ajustável por meio do menu da chave inglesa. - -[ta4_transformer|image] - -### Medidor elétrico TA4 - -Com a ajuda de um medidor de eletricidade, duas redes de eletricidade podem ser conectadas para formar uma rede maior. O medidor de eletricidade transmite eletricidade somente em uma direção (observe a seta). A quantidade de energia elétrica transmitida (em kud) é medida e exibida. Esse valor também pode ser consultado por um controlador Lua usando o comando `consumption`. A corrente atual pode ser consultada por meio do comando `current`. - -O medidor de eletricidade pode passar até 200 ku. O valor máximo é ajustável por meio do menu da chave inglesa. - -Uma contagem regressiva da potência de saída também pode ser inserida por meio do menu da chave inglesa. Quando essa contagem regressiva chega a zero, o medidor de eletricidade é desligado. A contagem regressiva pode ser consultada com o comando `countdown`. - -[ta4_electricmeter|image] - -### Laser TA4 - -O laser TA4 é usado para transmissão de energia sem fio. Para isso, são necessários dois blocos: Emissor de feixe de laser TA4 e Receptor de feixe de laser TA4. Deve haver um espaço de ar entre os dois blocos para que o feixe de laser possa ser construído a partir do emissor até o receptor. Primeiro, o emissor deve ser colocado. Isso liga imediatamente o feixe de laser e mostra as possíveis posições do receptor. As possíveis posições do receptor também são exibidas por meio de uma mensagem de bate-papo. - -Com o laser, distâncias de até 96 blocos podem ser superadas. Depois que a conexão é estabelecida (não é necessário haver fluxo de corrente), isso é indicado por meio do texto informativo do emissor e também do receptor. - -Os blocos de laser em si não requerem eletricidade. - -[ta4_laser|image] - - - -## Hidrogênio - -A eletrólise pode ser usada para dividir a eletricidade em hidrogênio e oxigênio. Por outro lado, o hidrogênio pode ser convertido novamente em eletricidade com o oxigênio do ar usando uma célula de combustível. -Isso permite que os picos de corrente ou um excesso de fornecimento de eletricidade sejam convertidos em hidrogênio e, portanto, armazenados. - -No jogo, a eletricidade pode ser convertida novamente em eletricidade por meio da célula de combustível usando o eletrolisador em hidrogênio e hidrogênio. -Isso significa que a eletricidade (na forma de hidrogênio) pode não apenas ser armazenada em tanques, mas também transportada por meio do carrinho-tanque. - -No entanto, a conversão de eletricidade em hidrogênio e vice-versa é deficitária. De 100 unidades de eletricidade, apenas 95 unidades de eletricidade saem após a conversão em hidrogênio e vice-versa. - -[ta4_hydrogen|image] - - -### Eletrolisador - -O eletrolisador converte eletricidade em hidrogênio. -Ele deve ser alimentado pela esquerda. À direita, o hidrogênio pode ser extraído por meio de tubos e bombas. - -O eletrolisador pode consumir até 35 ku de eletricidade e, em seguida, gera um item de hidrogênio a cada 4 s. -200 unidades de hidrogênio cabem no eletrolisador. - -O eletrolisador tem um menu de chave inglesa para definir o consumo de corrente e o ponto de desligamento. - -Se a energia armazenada na rede elétrica cair abaixo do valor especificado do ponto de desligamento, o eletrolisador se desliga automaticamente. Isso evita que os sistemas de armazenamento fiquem vazios. - -[ta4_electrolyzer|image] - - -### Célula de combustível - -A célula de combustível converte hidrogênio em eletricidade. -Ele deve ser abastecido com hidrogênio pela esquerda por meio de uma bomba. A conexão de energia está à direita. - -A célula de combustível pode fornecer até 34 ku de eletricidade e precisa de um item de hidrogênio a cada 4 s. - -Normalmente, a célula de combustível funciona como um gerador de categoria 2 (como outros sistemas de armazenamento). -Nesse caso, nenhum outro bloco de categoria 2, como o bloco de bateria, pode ser carregado. No entanto, a célula de combustível também pode ser usada como um gerador de categoria 1 por meio da caixa de seleção. - -[ta4_fuelcell|image] - - -## Reator químico - -O reator é usado para processar os ingredientes obtidos da torre de destilação ou de outras receitas em novos produtos. -A planta à esquerda mostra apenas uma variante possível, pois a disposição dos silos e tanques depende da receita. - -O produto primário de saída é sempre descarregado na lateral do suporte do reator, independentemente de ser um pó ou um líquido. O produto residual (secundário) é sempre descarregado na parte inferior do suporte do reator. - -Um reator consiste em: -- Vários tanques e silos com os ingredientes que são conectados ao dosador por meio de tubos -- opcionalmente, uma base do reator, que descarrega os resíduos do reator (necessário apenas para receitas com dois produtos de saída) -- o suporte do reator, que deve ser colocado na base (se disponível). O suporte tem uma conexão de energia e consome 8 ku durante a operação. -- O vaso do reator que deve ser colocado no suporte do reator -- O tubo de enchimento que deve ser colocado no vaso do reator -- O dispositivo de dosagem, que deve ser conectado aos tanques ou silos e ao tubo de enchimento por meio de tubos - -Observação 1: Os líquidos são armazenados somente em tanques e os sólidos e substâncias em pó somente em silos. Isso se aplica a ingredientes e produtos finais. - -Observação 2: Os tanques ou silos com conteúdos diferentes não devem ser conectados a um sistema de tubulação. Por outro lado, vários tanques ou silos com o mesmo conteúdo podem ser pendurados em paralelo em uma linha. - -O craqueamento quebra cadeias longas de hidrocarbonetos em cadeias curtas usando um catalisador. -O pó de gibbsita serve como catalisador (não é consumido). Ele pode ser usado para converter betume em óleo combustível, óleo combustível em nafta e nafta em gasolina. - -Na hidrogenação, pares de átomos de hidrogênio são adicionados a uma molécula para converter hidrocarbonetos de cadeia curta em longa. -Aqui, o pó de ferro é necessário como catalisador (não é consumido). Ele pode ser usado para converter gás (propano) em isobutano, -isobutano em gasolina, gasolina em nafta, nafta em óleo combustível e óleo combustível em betume. - - -[ta4_reactor|plan] - - -### Dosador TA4 - -Parte do reator químico. -As tubulações para materiais de entrada podem ser conectadas em todos os quatro lados do dosador. Os materiais para o reator são descarregados para cima. - -A receita pode ser definida e o reator pode ser iniciado por meio do dosador. - -Como em outras máquinas: -- se o dosador estiver no modo de espera, um ou mais ingredientes estão faltando -- se o dosador estiver no estado bloqueado, o tanque ou silo de saída está cheio, com defeito ou conectado incorretamente - -O dosador não precisa de eletricidade. Uma receita é processada a cada 10 s. - -[ta4_doser|image] - -### Reator TA4 - -Parte do reator químico. O reator tem um inventário para os itens de catalisador (para receitas de craqueamento e hidrogenação). - -[ta4_reactor|image] - - -### Tubo de enchimento TA4 - -Parte do reator químico. Deve ser colocado no reator. Se isso não funcionar, remova o tubo na posição acima e coloque-o novamente. - -[ta4_fillerpipe|image] - - -### Suporte do reator TA4 - -Parte do reator químico. Aqui também está a conexão de energia para o reator. O reator requer 8 ku de eletricidade. - -O suporte tem duas conexões de tubulação, à direita para o produto inicial e abaixo para os resíduos, como a lama vermelha na produção de alumínio. - -[ta4_reactorstand|image] - - -### Base do reator TA4 - -Parte do reator químico. É necessário para a drenagem do produto residual. - -[ta4_reactorbase|image] - - -### Silo TA4 - -Parte do reator químico. É necessário para armazenar substâncias em forma de pó ou grânulos. - -[ta4_silo|image] - - - - -## Controlador ICTA - -O controlador ICTA (ICTA significa "If Condition Then Action") é usado para monitorar e controlar máquinas. O controlador pode ser usado para ler dados de máquinas e outros blocos e, dependendo disso, ligar/desligar outras máquinas e blocos. - -Os dados da máquina são lidos e os blocos e máquinas são controlados por meio de comandos. O capítulo TA3 -> Blocos lógicos/comutação é importante para entender como os comandos funcionam. - -O controlador requer uma bateria para funcionar. O visor é usado para emitir dados, a torre de sinalização para exibir erros. - -[ta4_icta_controller|image] - - - -### Controlador TA4 ICTA - -O controlador funciona com base nas regras `IF THEN `. Podem ser criadas até 8 regras por controlador. - -Exemplos de regras são: - -- Se um distribuidor estiver "bloqueado", o empurrador na frente dele deve ser desligado -- Se uma máquina apresentar um erro, isso deverá ser mostrado no visor - -O controlador verifica essas regras ciclicamente. Para fazer isso, um tempo de ciclo em segundos (`` Cycle / s '') deve ser especificado para cada regra (1...1000). - -Para regras que avaliam uma entrada ligada/desligada, por exemplo, de um interruptor ou detector, o tempo de ciclo 0 deve ser especificado. O valor 0 significa que essa regra deve ser sempre executada quando o sinal de entrada for alterado, por exemplo, quando o botão enviar um novo valor. - -Todas as regras devem ser executadas apenas com a frequência necessária. Isso tem duas vantagens: - -- a bateria do controlador dura mais (cada controlador precisa de uma bateria) -- a carga do servidor é menor (portanto, menos atrasos) - -Você deve definir um tempo de atraso (`depois/s`) para cada ação. Se a ação tiver que ser executada imediatamente, deve-se inserir 0. - -O controlador tem sua própria ajuda e informações sobre todos os comandos por meio do menu do controlador. - -[ta4_icta_controller|image] - -### Bateria - -A bateria deve ser colocada bem próxima ao controlador, ou seja, em uma das 26 posições ao redor do controlador. - -[ta4_battery|image] - -### Exibição do TA4 - -O display mostra seu número após a colocação. O display pode ser endereçado por meio desse número. Os textos podem ser exibidos no visor, sendo que o visor pode exibir 5 linhas e, portanto, 5 textos diferentes. - -As linhas de texto são sempre alinhadas à esquerda. Se o texto tiver que ser centralizado horizontalmente, deverá ser precedido pelo caractere "\t" (tabulador). - -O visor é atualizado no máximo uma vez por segundo. - -[ta4_display|image] - -### TA4 Display XL - -O TA4 Display XL tem o dobro do tamanho do display TA4. - -As linhas de texto são sempre alinhadas à esquerda. Se o texto tiver que ser centralizado horizontalmente, deverá ser precedido pelo caractere "\t" (tabulador). - -O visor é atualizado a cada dois segundos, no máximo. - -[ta4_displayXL|image] - - -### Torre de sinalização TA4 - -A torre de sinalização pode exibir vermelho, verde e laranja. Não é possível uma combinação das três cores. - -[ta4_signaltower|image] - - - -## Controlador TA4 Lua - -Como o nome sugere, o controlador Lua deve ser programado na linguagem de programação Lua. O manual em inglês está disponível aqui: - -https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md - -O controlador Lua também requer uma bateria. A bateria deve ser colocada bem próxima ao controlador, ou seja, em uma das 26 posições ao redor do controlador. - -[ta4_lua_controller|image] - -### Servidor TA4 Lua - -O servidor é usado para o armazenamento central de dados de vários controladores Lua. Ele também salva os dados após a reinicialização do servidor. - -[ta4_lua_server|image] - -### Caixa do sensor TA4 / baú - -A caixa de sensores TA4 é usada para configurar armazéns automáticos ou máquinas de venda automática em conjunto com o controlador Lua. -Se algo for colocado na caixa ou removido, ou se uma das teclas "F1"/"F2" for pressionada, um sinal de evento será enviado ao controlador Lua. -A caixa do sensor suporta os seguintes comandos: - -- O status da caixa pode ser consultado por meio de `state = $send_cmnd(, "state")`. As respostas possíveis são: "empty" (vazio), "loaded" (carregado), "full" (cheio) -- A última ação do jogador pode ser consultada por meio de `name, action = $send_cmnd(, "action")`. `name` é o nome do jogador. Uma das seguintes opções é retornada como `action`: "put", "take", "f1", "f2". -- O conteúdo da caixa pode ser lido por meio de `stacks = $send_cmnd(, "stacks")`. Consulte: https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.md#sensor-chest -- Por meio de `$send_cmnd(, "text", "pressione ambos os botões e coloque algo no peito")`, o texto pode ser definido no menu da caixa do sensor. - -A caixa de seleção "Allow public chest access" (Permitir acesso público ao baú) pode ser usada para definir se a caixa pode ser usada por todos ou somente por jogadores que tenham direitos de acesso/proteção aqui. - -[ta4_sensor_chest|image] - -### Terminal do controlador TA4 Lua - -O terminal é usado para entrada/saída do controlador Lua. - -[ta4_terminal|image] - - - -## Módulos de lógica/comutação TA4 - -### Botão/interruptor TA4 - -Apenas a aparência do botão/chave TA4 foi alterada. A funcionalidade é a mesma do botão/chave TA3. No entanto, com o menu da chave inglesa, os dados podem ser alterados posteriormente. - -[ta4_button|image] - -### Botão TA4 2x - -Esse bloco tem dois botões que podem ser configurados individualmente por meio do menu de chave inglesa. A rotulagem e o endereço do bloco de destino podem ser configurados para cada botão. Além disso, o comando a ser enviado pode ser configurado para cada botão. - -[ta4_button_2x|image] - - -### Botão TA4 4x - -Esse bloco tem quatro botões que podem ser configurados individualmente por meio do menu de chave inglesa. A rotulagem e o endereço do bloco de destino podem ser configurados para cada botão. Além disso, o comando a ser enviado pode ser configurado para cada botão. - -[ta4_button_4x|image] - -### Lâmpada de sinalização TA4 2x - -Esse bloco tem duas lâmpadas que podem ser controladas individualmente. Cada lâmpada pode exibir as cores "vermelho", "verde" e "âmbar". A rotulagem de ambas as lâmpadas pode ser configurada por meio do menu de chave inglesa. As lâmpadas podem ser controladas usando os seguintes comandos: - -- Mudar a lâmpada 1 para vermelho: `$send_cmnd(1234, "red", 1)` -- Mude a lâmpada 2 para verde: `$send_cmnd(1234, "green ", 2)` -- Mudar a lâmpada 1 para laranja: `$send_cmnd(1234, "amber", 1)` -- Desligar a lâmpada 2: `$send_cmnd(1234, "off", 2)` - -[ta4_signallamp_2x|image] - -### Lâmpada de sinalização TA4 4x - -Esse bloco tem quatro lâmpadas que podem ser controladas individualmente. Cada lâmpada pode exibir as cores "vermelho", "verde" e "âmbar". A rotulagem de todas as lâmpadas pode ser configurada por meio do menu de chave inglesa. As lâmpadas podem ser controladas usando os seguintes comandos: - -- Mudar a lâmpada 1 para vermelho: `$send_cmnd(1234, "red", 1)` -- Mude a lâmpada 2 para verde: `$send_cmnd(1234, "green ", 2)` -- Mudar a lâmpada 3 para laranja: `$send_cmnd(1234, "amber", 3)` -- Desligar a lâmpada 4: `$send_cmnd(1234, "off", 4)` - -[ta4_signallamp_4x|image] - -### Detector de jogadores TA4 - -Apenas a aparência do detector de player TA4 foi alterada. A funcionalidade é a mesma do detector de player TA3. - -[ta4_playerdetector|image] - -### Coletor de estado TA4 - -[ta4_collector|image] - -O coletor de status consulta todas as máquinas configuradas para obter o status. Se uma das máquinas tiver atingido ou excedido um status pré-configurado, um comando "on" será enviado. Por exemplo, muitas máquinas podem ser facilmente monitoradas quanto a falhas a partir de um controlador Lua. - -### Detector TA4 - -A funcionalidade é a mesma do detector TA3. Além disso, o detector conta os itens passados adiante. -Esse contador pode ser consultado com o comando "count" e redefinido com "reset". - -[ta4_detector|image] - -### Detector de nó TA4 - -A funcionalidade é a mesma do TA3 Node Detector. - -Ao contrário do detector de nós TA3, as posições a serem monitoradas podem ser configuradas individualmente aqui. Para fazer isso, o botão "Record" (Registrar) deve ser pressionado. Em seguida, todos os blocos devem ser clicados, cuja posição deve ser verificada. Em seguida, o botão "Done" (Concluído) deve ser pressionado. - -Podem ser selecionados até 4 blocos. - -[ta4_nodedetector|image] - -### Detector de carga de armazenamento de energia TA4 - -O detector de carga mede o estado de carga do armazenamento de energia da rede elétrica a cada 8 s. - -Se o valor ficar abaixo de um limite configurável (ponto de comutação), um comando (padrão: "off") será enviado. Se o valor subir novamente acima desse ponto de comutação, um segundo comando (padrão: "on") será enviado. Isso permite que os consumidores sejam desconectados da rede quando o nível de carga do dispositivo de armazenamento de energia cair abaixo do ponto de comutação especificado. - -Para fazer isso, o detector de carga deve ser conectado à rede por meio de uma caixa de junção. O detector de carga é configurado por meio do menu da chave de boca. - -[ta4_chargedetector|image] - -### Sensor de olhar TA4 - -O sensor de olhar TA4 gera um comando quando o bloco é visto/focado pelo proprietário ou por outros jogadores configurados e envia um segundo comando quando o bloco não é mais focalizado. Assim, ele substitui os botões/interruptores, por exemplo, para abrir/fechar portas. - -O TA4 Gaze Sensor só pode ser programado usando o menu da chave de boca. Se você tiver uma chave de boca na mão, o sensor não será acionado, mesmo que esteja focalizado. - -[ta4_gaze_sensor|image] - -### Sequenciador TA4 - -Processos inteiros podem ser programados usando o sequenciador TA4. Veja um exemplo: - -``` --- este é um comentário -[1] send 1234 a2b -[30] send 1234 b2a -[60] goto 1 -``` - -- Cada linha começa com um número que corresponde a um ponto no tempo `[]` -- São permitidos valores de 1 a 50000 para os tempos -- 1 corresponde a 100 ms, 50000 corresponde a cerca de 4 dias de jogo -- Linhas vazias ou comentários são permitidos (`-- comment`) -- Com `send `, você pode enviar um comando para um bloco -- Com `goto ` você pode pular para outra linha/ponto no tempo -- Com `stop` você pode parar o sequenciador com um atraso para que ele não receba um novo comando - aceita de um botão ou outro bloco (para concluir um movimento) - Sem `stop`, o sequenciador entra no modo parado imediatamente após o último comando. - -O sequenciador TA4 suporta os seguintes comandos de tecnologia: - -- `goto ` Salta para uma linha de comando e inicia o sequenciador -- `stop` Parar o sequenciador -- `on` e `off` como aliases para `goto 1` e `stop` - -O comando `goto` só é aceito quando o sequenciador está parado. - -O tempo de ciclo (padrão: 100 ms) pode ser alterado para o sequenciador por meio do menu da chave de boca. - -[ta4_sequencer|image] - - - -## Controlador de movimento/volta - -### Controlador de movimento TA4 - -O TA4 Move Controller é semelhante ao "Door Controller 2", mas os blocos selecionados não são removidos, mas podem ser movidos. -Como os blocos móveis podem levar consigo os jogadores e as multidões que estão no bloco, é possível construir elevadores e sistemas de transporte semelhantes com eles. - -Instruções: - -- Defina o controlador e treine os blocos a serem movidos por meio do menu (até 16 blocos podem ser treinados) -- A "rota de voo" deve ser inserida por meio de uma especificação x, y, z (relativa) (a distância máxima (x+y+z) é de 200 m) -- O movimento pode ser testado com os botões de menu "Move A-B" e "Move B-A" -- Você também pode voar através de paredes ou outros blocos -- A posição de destino dos blocos também pode ser ocupada. Nesse caso, os blocos são salvos de forma "invisível". Isso se destina a portas deslizantes e similares - -O Move Controller é compatível com os seguintes comandos de tecnologia: - -- `a2b` Mover o bloco de A para B. -- `b2a` Mover o bloco de B para A. -- `move` Mover o bloco para o outro lado - -Você pode alternar para o modo de operação `move xyz` por meio do menu de chave inglesa. Após a mudança, os seguintes comandos técnicos são suportados: - -- `move2` Com o comando, a rota de voo também deve ser especificada como um vetor x,y,z. - Exemplo de controlador Lua: `$send_cmnd(MOVE_CTLR, "move2", "0,12,0")` -- `reset` move o(s) bloco(s) de volta à posição inicial - -**Instruções importantes:** - -- Se vários blocos tiverem de ser movidos, o bloco que levará os jogadores/mobs deverá ser clicado primeiro durante o treinamento. -- Se o bloco que deve levar os jogadores/móbile tiver uma altura reduzida, a altura deverá ser definida no controlador usando o menu de chave de boca aberto (por exemplo, altura = 0,5). Caso contrário, o jogador/móbile não será "encontrado" e não será levado embora. - -[ta4_movecontroller|image] - -### Controlador de giro TA4 - -O controlador de giro do TA4 é semelhante ao "Move Controller", mas os blocos selecionados não são movidos, mas girados em torno de seu centro para a direita ou para a esquerda. - -Instruções: - -- Defina o controlador e treine os blocos a serem movidos por meio do menu (até 16 blocos podem ser treinados) -- O movimento pode ser testado com os botões de menu "Turn left" (Virar à esquerda) e "Turn right" (Virar à direita) - -O controlador de giro suporta os seguintes comandos de tecnologia: - -- `left` Vire à esquerda -- `direita` Vire à direita -- `uturn` Girar 180 graus - -[ta4_turncontroller|image] - - - - -## Lâmpadas TA4 - -O TA4 contém uma série de lâmpadas potentes que permitem uma melhor iluminação ou a realização de tarefas especiais. - -### Luz de cultivo LED TA4 - -A lâmpada de cultivo TA4 LED permite o crescimento rápido e vigoroso de todas as plantas do modo `farming`. A lâmpada ilumina um campo de 3x3, de modo que as plantas também podem ser cultivadas no subsolo. -A lâmpada deve ser colocada um bloco acima do solo no meio do campo 3x3. - -A lâmpada também pode ser usada para cultivar flores. Se a lâmpada for colocada sobre um canteiro de flores 3x3 feito de "Garden Soil" (Mod `compost`), as flores crescerão automaticamente (acima e abaixo do solo). - -Você pode colher as flores com o Signs Bot, que também tem uma placa correspondente que deve ser colocada na frente do campo de flores. - -A lâmpada requer 1 ku de eletricidade. - -[ta4_growlight|image] - -### Lâmpada de rua TA4 - -A lâmpada de rua de LED TA4 é uma lâmpada com iluminação particularmente forte. A lâmpada consiste no compartimento da lâmpada, no braço da lâmpada e nos blocos do poste da lâmpada. - -A corrente deve ser conduzida de baixo para cima, através do mastro, até o compartimento da lâmpada. Primeiro, puxe o cabo de alimentação para cima e, em seguida, "engesse" o cabo de alimentação com blocos de postes de iluminação. - -A lâmpada requer 1 ku de eletricidade. - -[ta4_streetlamp|image] - -### Lâmpada industrial de LED TA4 - -A lâmpada industrial de LED TA4 é uma lâmpada com iluminação particularmente forte. A lâmpada deve ser alimentada por cima. - -A lâmpada requer 1 ku de eletricidade. - -[ta4_industriallamp|image] - - - - -## Filtro líquido TA4 - -O filtro de líquidos filtra a lama vermelha. -Uma parte da lama vermelha se transforma em soda cáustica, que pode ser coletada no fundo de um tanque. -A outra parte se transforma em um paralelepípedo do deserto e obstrui o material do filtro. -Se o filtro estiver muito entupido, ele deverá ser limpo e enchido novamente. -O filtro consiste em uma camada de base, 7 camadas de filtro idênticas e uma camada de enchimento na parte superior. - -[ta4_liquid_filter|image] - -### Camada de base - -Você pode ver a estrutura dessa camada no plano. - -A soda cáustica é coletada no tanque. - -[ta4_liquid_filter_base|plan] - -### Camada de cascalho - -Essa camada deve ser preenchida com cascalho, conforme mostrado no plano. -No total, deve haver sete camadas de cascalho. -O filtro ficará obstruído com o tempo, de modo que precisará ser limpo e preenchido novamente. - -[ta4_liquid_filter_gravel|plan] - -### Camada de enchimento - -Essa camada é usada para preencher o filtro com lama vermelha. -A lama vermelha deve ser bombeada para o tubo de enchimento. - -[ta4_liquid_filter_top|plan] - - - - -## Colisor TA4 (acelerador de partículas) - -O Collider é uma instalação de pesquisa que realiza pesquisas básicas. É possível coletar pontos de experiência aqui, que são necessários para o TA5 (Future Age). - -Como seu original no CERN em Genebra, o colisor deve ser construído no subsolo. A configuração padrão aqui é Y <= -28. O valor pode, no entanto, ser alterado pela equipe do servidor por meio da configuração. Pergunte ou tente o bloco "TA4 Collider Detector Worker". - -Somente um colisor pode ser operado por jogador. Portanto, não faz sentido configurar dois ou mais colisores. Os pontos de experiência são creditados ao jogador que possui o colisor. Os pontos de experiência não podem ser transferidos. - -Um colisor consiste em um "anel" feito de tubos e ímãs, além de um detector com um sistema de resfriamento. - -- O detector é o coração do sistema. É nele que os experimentos científicos são realizados. O detector tem o tamanho de 3x3x7 blocos. -- 22 ímãs do colisor TA4 (não os ímãs do detector do colisor TA4!) devem ser conectados uns aos outros por meio de 5 blocos do tubo de vácuo TA4. Cada ímã também requer eletricidade e uma conexão de gás para resfriamento. O conjunto forma (como mostrado na planta à direita) um quadrado com um comprimento de borda de 37 metros. - -A planta mostra a instalação vista de cima: - -- O bloco cinza é o detector com o bloco de trabalho no meio -- Os blocos vermelhos são os ímãs, os azuis são os tubos de vácuo - -[techage_collider_plan|plan] - -### Detector - -O detector é configurado automaticamente com a ajuda do bloco "TA4 Collider Detector Worker" (semelhante à torre). Todos os materiais necessários para isso devem ser colocados primeiro no bloco do trabalhador. O detector é mostrado simbolicamente no bloco do trabalhador. O detector é montado no bloco de trabalho. - -O detector também pode ser desmontado novamente com a ajuda do bloco de trabalho. - -As conexões para eletricidade, gás e tubos de vácuo estão localizadas nos dois lados frontais do detector. Uma bomba TA4 deve ser conectada na parte superior para sugar o tubo vazio/criar o vácuo. - -O sistema de resfriamento deve ser conectado à parte traseira do detector. O sistema de resfriamento é mostrado na planta à direita. Além do trocador de calor TA4 da unidade de armazenamento de energia (que é usado aqui para resfriamento), também é necessário um bloco resfriador TA4. - -Observação: A seta no trocador de calor deve apontar para longe do detector. O trocador de calor também deve ser alimentado com eletricidade. - -[ta4_cooler|plan] - - -- Além disso, é necessário resfriamento, que também deve ser instalado no detector. O isobutano é necessário para o resfriamento. -- O sistema requer uma quantidade considerável de eletricidade. Portanto, faz sentido ter sua própria fonte de alimentação. - -### Controle / Terminal TA4 - -O colisor é controlado por meio de um terminal TA4 (não por meio do terminal do controlador TA4 Lua). - -Esse terminal deve ser conectado ao detector. O número do detector é exibido como texto informativo no bloco de trabalho. - -O terminal suporta os seguintes comandos: - -- `connect ` (conectar-se ao detector) -- `start` (iniciar o detector) -- `stop` (parar o detector) -- `test ` (verificação de um ímã) -- `points` (consulta dos pontos de experiência já obtidos) - -Se ocorrer um erro em um ímã durante o `start`, o número do ímã será exibido. O comando `test` pode ser usado para solicitar mais informações sobre o erro do ímã. - -[ta4_terminal|image] - -### Resfriamento e energia - -Cada ímã do Colisor TA4 também deve ser abastecido com eletricidade (conforme mostrado à direita na planta) e com isobutano para resfriamento: - -- A conexão para a alimentação está na parte superior do ímã. -- A conexão para o resfriamento está na parte frontal do ímã. -- Uma bomba TA4 e um tanque TA4 com pelo menos 250 unidades de isobutano também são necessários para resfriar todo o sistema. -- O sistema também requer muita eletricidade. Portanto, faz sentido ter sua própria fonte de alimentação com pelo menos 145 ku. - -[techage_collider_plan2|plan] - -### Construção - -A sequência a seguir é recomendada ao configurar o colisor: - -- Coloque um bloco de carga forçada. Somente o detector com o sistema de resfriamento deve estar na área do bloco de carga forçada. -- Defina o bloco de trabalho, preencha-o com itens e configure o detector por meio do menu -- Construa o anel com tubos e ímãs -- Conecte todos os ímãs e o detector com os cabos de alimentação -- Conecte todos os ímãs e o detector com os tubos amarelos e bombeie o isobutano no sistema de tubos com uma bomba -- Instale uma bomba TA4 como uma bomba de vácuo no detector e ligue-a (não é necessário nenhum tanque adicional). Se a bomba entrar em "standby", o vácuo será estabelecido. Isso levará alguns segundos -- Monte o resfriador (trocador de calor) e conecte-o ao cabo de alimentação -- Coloque o terminal TA4 na frente do detector e conecte-o ao detector por meio de `connect ` -- Ligar/conectar a fonte de alimentação -- ligar o resfriador (trocador de calor) -- Ligue o detector por meio de `start` no terminal TA4. Após algumas etapas de teste, o detector entra em operação normal ou emite um erro. -- O colisor precisa ser executado continuamente e, em seguida, fornece gradualmente pontos de experiência. Para obter 10 pontos, o colisor precisa funcionar por algumas horas - -[techage_ta4c|image] - - - - -## Mais blocos TA4 - -### Bloco de receitas TA4 - -Até 10 receitas podem ser salvas no bloco de receitas. Essas receitas podem então ser chamadas por meio de um comando do TA4 Autocrafter. Isso permite que a receita do autocrafter seja configurada por meio de um comando. As receitas no bloco de receitas também podem ser consultadas diretamente por meio de um comando. - -`input ` lê uma receita do bloco de receitas do TA4. `` é o número da receita. O bloco retorna uma lista de ingredientes da receita. - -Exemplo: `$send_cmnd(1234, "input", 1)` - -[ta4_recipeblock|image] - -### TA4 Autocrafter - -A função corresponde à do TA3. - -A capacidade de processamento é de 4 itens a cada 4 s. O autocrafter requer 9 ku de eletricidade para isso. - -Além disso, o TA4 Autocrafter suporta a seleção de diferentes receitas usando os seguintes comandos: - -`recipe "."` muda o autocrafter para uma receita do bloco de receitas TA4. `` é o número do bloco de receitas, `` é o número da receita. Exemplo: `$send_cmnd(1234, "recipe", "5467.1")` - -Como alternativa, uma receita também pode ser selecionada por meio da lista de ingredientes, por exemplo: -`$send_cmnd(1234, "recipe", "default:coal_lump,,,default:stick")` -Todos os nomes técnicos de uma receita devem ser especificados aqui, separados por vírgulas. Consulte também o comando `input` no bloco de receitas do TA4. - -O comando `flush` move todos os itens do inventário de entrada para o inventário de saída. O comando retorna `true` se o inventário de entrada tiver sido completamente esvaziado. Se `false` for retornado (inventário de saída cheio), o comando deverá ser repetido em um momento posterior. - -[ta4_autocrafter|image] - -### Tanque TA4 - -Consulte o tanque TA3. - -Um tanque TA4 pode conter 2.000 unidades ou 200 barris de líquido. - -[ta4_tank|image] - -### Bomba TA4 - -Consulte a bomba TA3. - -A bomba TA4 bombeia 8 unidades de líquido a cada dois segundos. - -No modo "Flow limiter" (Limitador de fluxo), o número de unidades bombeadas pela bomba pode ser limitado. O modo de limitador de fluxo pode ser ativado por meio do menu da chave de boca, configurando o número de unidades no menu. Quando o número configurado de unidades tiver sido bombeado, a bomba será desligada. Quando a bomba for ligada novamente, ela bombeará o número configurado de unidades novamente e, em seguida, será desligada. - -O limitador de fluxo também pode ser configurado e iniciado usando um controlador Lua ou Beduino. - -A bomba também é compatível com o comando `flowrate`. Isso permite que a taxa de fluxo total através da bomba seja consultada. - -[ta4_pump|image] - -### Aquecedor de forno TA4 - -Com o TA4, o forno industrial também tem seu aquecimento elétrico. O queimador de óleo e o soprador podem ser substituídos pelo aquecedor. - -O aquecedor requer 14 ku de eletricidade. - -[ta4_furnaceheater|image] - -### Bomba d'água TA4 (obsoleta) - -Esse bloco não poderá mais ser fabricado e será substituído pelo bloco de entrada de água TA4. - -### Entrada de água TA4 - -Algumas receitas requerem água. A água deve ser bombeada do mar com uma bomba (água em y = 1). Uma "piscina" composta de alguns blocos de água não é suficiente para isso! - -Para fazer isso, o bloco de entrada de água deve ser colocado na água e conectado à bomba por meio de tubos. Se o bloco for colocado na água, é preciso garantir que haja água sob o bloco (a água deve ter pelo menos 2 blocos de profundidade). - -[ta4_waterinlet|image] - -### Tubo TA4 - -O TA4 também tem seus próprios tubos no design do TA4. Eles podem ser usados como os tubos padrão. -Mas: Os empurradores e distribuidores TA4 só atingem seu desempenho total quando usados com tubos TA4. - -[ta4_tube|image] - -### TA4 Pusher - -A função corresponde basicamente à do TA2 / TA3. Além disso, um menu pode ser usado para configurar quais objetos devem ser retirados de um baú TA4 e transportados posteriormente. -A capacidade de processamento é de 12 itens a cada 2 s, se forem usados tubos TA4 em ambos os lados. Caso contrário, haverá apenas 6 itens a cada 2 s. - -No modo "limitador de fluxo", o número de itens que são movidos pelo empurrador pode ser limitado. O modo limitador de fluxo pode ser ativado por meio do menu da chave de boca, configurando o número de itens no menu. Assim que o número configurado de itens tiver sido movido, o empurrador se desliga. Se o empurrador for ligado novamente, ele moverá o número configurado de itens novamente e depois se desligará. - -O empurrador TA4 também pode ser configurado e iniciado usando um controlador Lua ou Beduino. - -Aqui estão os comandos adicionais para o controlador Lua: - -- O `config` é usado para configurar o empurrador, de forma análoga à configuração manual por meio do menu. - Exemplo: `$send_cmnd(1234, "config", "default:dirt")` - Com `$send_cmnd(1234, "config", "")`, a configuração é excluída -- `limit` é usado para definir o número de itens para o modo de limitador de fluxo: - Exemplo: `$send_cmnd(1234, "init", 7)` - -[ta4_pusher|image] - -### Peito TA4 - -A função corresponde à do TA3. O baú pode conter mais conteúdo. - -Além disso, o baú do TA4 tem um shadow inventory para configuração. Aqui, determinados locais de pilha podem ser pré-atribuídos a um item. As pilhas de inventário pré-atribuídas só são preenchidas com esses itens durante o preenchimento. É necessário um empurrador ou injetor TA4 com a configuração apropriada para esvaziar as pilhas de inventário pré-atribuídas. - -[ta4_chest|image] - -### Baú TA4 8x2000 - -O baú TA4 8x2000 não tem um inventário normal como os outros baús, mas tem 8 lojas, sendo que cada loja pode armazenar até 2.000 itens de um tipo. Os botões laranja podem ser usados para mover itens de ou para a loja. A caixa também pode ser preenchida ou esvaziada com um empurrador (TA2, TA3 ou TA4) como de costume. - -Se o baú for preenchido com um empurrador, todos os depósitos serão preenchidos da esquerda para a direita. Se todos os 8 depósitos estiverem cheios e nenhum outro item puder ser adicionado, os itens adicionais serão rejeitados. - -**Função de linha** - -Vários baús TA4 8x2000 podem ser conectados a um baú grande com mais conteúdo. Para fazer isso, os baús devem ser colocados em uma fileira, um após o outro. - -Primeiro, o baú da frente deve ser colocado e, em seguida, os baús empilhados são colocados atrás com a mesma direção de visão (todas as caixas têm a frente voltada para o jogador). Com 2 baús em uma fileira, o tamanho aumenta para 8x4000, etc. - -As fileiras de baús não podem mais ser removidas. Há duas maneiras de desmontar os baús: - -- Esvazie e remova o baú da frente. Isso desbloqueia o próximo baú e pode ser removido. -- Esvazie o baú da frente até o ponto em que todas as lojas contenham no máximo 2.000 itens. Isso desbloqueia o próximo baú e pode ser removido. - -Os baús têm uma caixa de seleção de "pedido". Se essa caixa de seleção for ativada, os depósitos não serão mais completamente esvaziados por um empurrador. O último item permanece no depósito como padrão. Isso resulta em uma atribuição fixa de itens aos locais de armazenamento. - -O baú só pode ser usado por jogadores que podem construir nesse local, ou seja, que têm direitos de proteção. Não importa quem coloca o baú. - -O baú tem um comando adicional para o controlador Lua: - -- `count` é usado para solicitar quantos itens estão no baú. - Exemplo 1: `$send_cmnd(CHEST, "count")` -> Soma dos itens em todas as 8 lojas - Exemplo 2: `$send_cmnd(CHEST, "count", 2)` -> número de itens na loja 2 (segunda a partir da esquerda) -- `storesize` é usado para ler o tamanho de um dos oito armazenamentos: - Exemplo: `$send_cmnd(CHEST, "storesize")` -> a função retorna, por exemplo, 6000 - -[ta4_8x2000_chest|image] - - - -### Distribuidor TA4 - -A função corresponde à do TA2. -A capacidade de processamento é de 24 itens a cada 4 s, desde que os tubos TA4 sejam usados em todos os lados. Caso contrário, haverá apenas 12 itens a cada 4 s. - -[ta4_distributor|image] - -### Distribuidor de alto desempenho TA4 - -A função corresponde à do distribuidor TA4 normal, com duas diferenças: -A capacidade de processamento é de 36 itens a cada 4 s, desde que os tubos TA4 sejam usados em todos os lados. Caso contrário, haverá apenas 18 itens a cada 4 s. -Além disso, até 8 itens podem ser configurados por direção. - -[ta4_high_performance_distributor|image] - -### Peneira de cascalho TA4 - -A função corresponde à do TA2. -A capacidade de processamento é de 4 itens a cada 4 s. O bloco requer 5 ku de eletricidade. - -[ta4_gravelsieve|image] - -### Moedor TA4 - -A função corresponde à do TA2. -A capacidade de processamento é de 4 itens a cada 4 s. O bloco requer 9 ku de eletricidade. - -[ta4_grinder|image] - -### Pedreira TA4 - -A função corresponde em grande parte à do TA2. - -Além disso, o tamanho do furo pode ser definido entre blocos de 3x3 e 11x11. -A profundidade máxima é de 80 metros. A pedreira requer 14 ku de eletricidade. - -[ta4_quarry|image] - -### Fab. eletrônica TA4 - -A função corresponde à do TA2, apenas chips diferentes são produzidos aqui. -A capacidade de processamento é de um chip a cada 6 s. O bloco requer 12 ku de eletricidade para isso. - -[ta4_electronicfab|image] - -### Injetor TA4 - -A função corresponde à do TA3. - -O poder de processamento é de até 8 vezes quatro itens a cada 4 segundos. - -[ta4_injector|image] - -### Reciclador TA4 - -O reciclador é uma máquina que processa todas as receitas de Techage de trás para frente, ou seja, pode desmontar máquinas e blocos e transformá-los em seus componentes. - -A máquina pode desmontar praticamente todos os blocos da Techage e do Hyperloop. Mas nem todos os itens/materiais da receita podem ser reciclados: - -- A madeira se transforma em gravetos -- A pedra se transforma em areia ou cascalho -- Os semicondutores/chips não podem ser reciclados -- As ferramentas não podem ser recicladas - -A capacidade de processamento é de um item a cada 8 s. O bloco requer 16 ku de eletricidade para isso. - -[ta4_recycler|image] \ No newline at end of file diff --git a/techage/manuals/manual_ta5_DE.md b/techage/manuals/manual_ta5_DE.md deleted file mode 100644 index 0520715..0000000 --- a/techage/manuals/manual_ta5_DE.md +++ /dev/null @@ -1,177 +0,0 @@ -# TA5: Zukunft - -Maschinen zur Überwindung von Raum und Zeit, neue Energiequellen und andere Errungenschaften prägen dein Leben. - -Für die Herstellung und Nutzung von TA5 Maschinen und Blöcken sind Erfahrungspunkte (experience points) notwendig. Diese können nur über den Teilchenbeschleuniger aus TA4 erarbeitet werden. - -[techage_ta5|image] - -## Energiequellen - -### TA5 Fusionsreaktor - -Kernfusion bedeutet das Verschmelzen zweier Atomkerne. Dabei können, je nach Reaktion, große Mengen von Energie freigesetzt werden. Kernfusionen, bei denen Energie frei wird, laufen in Form von Kettenreaktionen ab. Sie sind die Quelle der Energie der Sterne, zum Beispiel auch unserer Sonne. Ein Fusionsreaktor wandelt die Energie, die bei einer kontrollierten Kernfusion frei wird, in elektrischen Strom um. - -**Wie funktionieren ein Fusionsreaktor?** - -Ein Fusionsreaktor funktioniert nach dem klassischen Prinzip eines Wärmekraftwerks: Wasser wird erhitzt und treibt eine Dampfturbine an, deren Bewegungsenergie von einem Generator in Strom gewandelt wird. - -Ein Fusionskraftwerk benötigt zunächst eine hohe Menge an Energie, da ein Plasma erzeugt werden muss. „Plasma“ nennt man den vierten Zustand von Stoffen, nach fest, flüssig und gasförmig. Dafür wird viel Strom benötigt. Erst durch diese extreme Energiekonzentration zündet die Fusionsreaktion und mit der abgegebenen Wärme wird über den Wärmetauscher Strom erzeugt. Der Generator liefert dann 800 ku an Strom. - -Der Plan rechts zeigt einen Schnitt durch den Fusionsreaktor. - -Für den Betrieb des Fusionsreaktors werden 60 Erfahrungspunkte benötigt. Der Fusionsreaktur muss komplett in einem Forceload Block Bereich aufgebaut werden. - -[ta5_fusion_reactor|plan] - -#### TA5 Fusionreaktor Magnet - -Für den Aufbau des Fusionsreaktor werden insgesamt 60 TA5 Fusionreaktor Magnete benötigt. Diese bilden den Ring, in dem sich das Plasma bildet. Der TA5 Fusionsreaktor Magnete benötigt Strom und hat zwei Anschlüsse für die Kühlung. - -Es gibt zwei Typen von Magneten, so dass auch alle Seiten des Magnets, die zum Plasmaring zeigen, mit einem Hitzeschild geschützt werden können. - -Bei den Eckmagneten auf der Innenseite des Rings ist jeweils eine Anschlussseite verdeckt (Strom oder Kühlung) und kann daher nicht angeschlossen werden. Dies ist technisch nicht machbar und hat daher keinen Einfluß auf die Funktion des Fusionsreaktor. - -[ta5_magnet|image] - -#### TA5 Pumpe - -Die Pumpe wird benötigt, um den Kühlkreislauf mit Isobutan zu füllen. Es werden ca. 350 Einheiten Isobutan benötigt. - -Hinweis: Die TA5 Pumpe kann nur zum Füllen des Kühlkreislaufs genutzt werden, ein Abpumpen des Kühlmittels ist nicht möglich. Daher sollte die Pumpe erst eingeschaltet werden, wenn die Magnete korrekt platziert und alle Strom- und Kühlleitungen angeschlossen sind. - -[ta5_pump|image] - -#### TA5 Wärmetauscher - -Der TA5 Wärmetauscher wird benötigt, um die im Fusionsreaktor erzeugte Hitze zuerst in Dampf und dann in Strom umzuwandeln. Der Wärmetauscher selbst benötigt dazu 5 ku Strom. Der Aufbau gleicht dem Wärmetauscher des Energiespeichers aus TA4. - -Hinweis: Der TA5 Wärmetauscher hat zwei Anschlüsse (blau und grün) für den Kühlkreislauf. Über die grünen und blauen Röhren müssen der Wärmetauscher und alle Magnete zu einem Kühlkreislauf verbunden werden. - -Über den Start-Button des Wärmetauschers kann der Kühlkreislauf auf Vollständigkeit geprüft werden, auch wenn noch kein Kühlmittel eingefüllt wurde. - -[ta5_heatexchanger|plan] - -#### TA5 Fusionreaktor Controller - -Über den TA5 Fusionreaktor Controller wird der Fusionreaktors eingeschaltet. Dabei muss zuerst die Kühlung/Wärmetauscher und dann der Controller eingeschaltet werden. Es dauert ca. 2 min, bis der Reaktor in Gang kommt und Strom liefert. Der Fusionreaktor und damit der Controller benötigt 400 ku an Strom, um das Plasma aufrecht zu erhalten. - -[ta5_fr_controller|image] - -#### TA5 Fusionreaktor Hülle - -Der komplette Reaktor muss mit einer Hülle umgeben werden, die den enormen Druck, den die Magnete auf das Plasma ausüben, abfängt und die Umgebung vor Strahlung schützt. Ohne diese Hülle kann der Reaktor nicht gestartet werden. Mit der TechAge Kelle können auch Stromkabel und Kühlleitungen des Fusionreaktors in die Hülle integriert werden. - -[ta5_fr_shell|image] - -#### TA5 Fusionreaktor Kern - -Der Kern muss in der Mitte des Reaktors sitzen. Siehe Abbildung unter "TA5 Fusionsreaktor". Auch hierfür wird die TechAge Kelle benötigt. - -[ta5_fr_nucleus|image] - -## Energiespeicher - -### TA5 Hybrid-Speicher (geplant) - -## Logik Blöcke - -## Transport und Verkehr - -### TA5 Flug Controller - -Der TA5 Flug Controller ist ähnlich zum TA4 Move Controller. Im Gegensatz zum TA4 Move Controller können hier mehrere Bewegungen zu einer Flugstrecke kombiniert werden. Diese Flugstrecke kann im Eingabefeld über mehrere x,y,z Angaben definiert werden (eine Bewegung pro Zeile). Über "Speichern" wird die Flugstrecke geprüft und gespeichert. Bei einem Fehler wird eine Fehlermeldung ausgegeben. - -Mit der Taste "Test" wird die Flugstrecke mit den absoluten Koordinaten zur Überprüfung im Chat ausgegeben. - -Die maximale Distanz für die gesammte Flugstrecke beträgt 1500 m. Es können bis zu 32 Blöcke antrainiert werden. - -Die Nutzung des TA5 Flug Controllers benötigt 40 Erfahrungspunkte. - -**Teleport Mode** - -Wird der `Teleport Mode` aktiviert (auf `enable` gesetzt), kann ein Spieler auch ohne Blöcke bewegt werden. Dazu muss die Startposition über die Taste "Aufzeichnen" konfiguriert werden. Es kann hier nur eine Position konfiguriert werden. Das Spieler, der bewegt werden soll, muss dazu auf dieser Position stehen. - -[ta5_flycontroller|image] - -### TA5 Hyperloop Kiste / TA5 Hyperloop Chest - -Die TA5 Hyperloop Kiste erlaubt den Transport von Gegenständen über ein Hyperloop Netzwerk. - -Die TA5 Hyperloop Kiste muss man dazu auf eine Hyperloop Junction stellen. Die Kiste besitzt ein spezielles Menü, mit dem man das Pairing von zwei Kisten durchführen kann. Dinge, die in der Kiste sind, werden zur Gegenstelle teleportiert. Die Kiste kann auch mit einem Schieber gefüllt/geleert werden. - -Für das Pairing musst du zuerst auf der einen Seite einen Namen für die Kiste eingeben, dann kannst du bei der anderen Kiste diesen Namen auswählen und so die beiden Blöcke verbinden. - -Die Nutzung der TA5 Hyperloop Kiste benötigt 15 Erfahrungspunkte. - -[ta5_chest|image] - -### TA5 Hyperloop Tank / TA5 Hyperloop Tank - -Der TA5 Hyperloop Tank erlaubt den Transport von Flüssigkeiten über ein Hyperloop Netzwerk. - -Den TA5 Hyperloop Tank muss man dazu auf eine Hyperloop Junction stellen. Der Tank besitzt ein spezielles Menü, mit dem man das Pairing von zwei Tanks durchführen kann. Flüssigkeiten, die in dem Tank sind, werden zur Gegenstelle teleportiert. Der Tank kann auch mit einer Pumpe gefüllt/geleert werden. - -Für das Pairing musst du zuerst auf der einen Seite einen Namen für den Tank eingeben, dann kannst du bei dem anderen Tank diesen Namen auswählen und so die beiden Blöcke verbinden. - -Die Nutzung des TA5 Hyperloop Tanks benötigt 15 Erfahrungspunkte. - -[ta5_tank|image] - -### TA5-Raumgleiter (geplant) - -Dank einem Spezialantrieb für Lichtgeschwindigkeit können mit dem Raumgleiter auch große Entfernungen sehr schnell überwunden werden. - -## Teleport Blöcke - -Mit Teleport-Blöcken können Dinge zwischen zwei Teleport-Blöcken übertragen werden, ohne dass sich dazwischen eine Röhre oder Leitung befinden muss. Für das Pairing der Blöcke musst du zuerst auf der einen Seite einen Namen für den Block eingeben, dann kannst du bei dem anderen Block diesen Namen auswählen und so die beiden Blöcke verbinden. Das Pairung kann nur von einem Spieler durchgeführt werden (Spielername wird geprüft) und muss vor einem Server-Neustart abgeschlossen sein. Anderenfalls gehen die Pairing-Daten verloren. - -Der Plan rechts zeigt, wie die Blöcke genutzt werden können. - -[ta5_teleport|plan] - -### TA5 Teleport Block Gegenstände / TA5 Teleport Block Items - -Diese Teleport-Blöcke erlauben die Übertragung von Gegenständen und ersetzen somit eine Röhre. Dabei können Entfernungen von bis zu 500 Blöcken überbrückt werden. - -Ein Teleport-Block benötigt 12 ku Strom. - -Für die Nutzung der Teleport-Blöcke werden 30 Erfahrungspunkte benötigt. - -[ta5_tele_tube|image] - -### TA5 Teleport Block Flüssigkeiten / TA5 Teleport Block Liquids - -Diese Teleport-Blöcke erlauben die Übertragung von Flüssigkeiten und ersetzen somit eine gelbe Leitung. Dabei können Entfernungen von bis zu 500 Blöcken überbrückt werden. - -Ein Teleport-Block benötigt 12 ku Strom. - -Für die Nutzung der Teleport-Blöcke werden 30 Erfahrungspunkte benötigt. - -[ta5_tele_pipe|image] - -### Hyperloop Teleport Blöcke (geplant) - -Die Hyperloop Teleport Blöcke erlauben den Aufbau von Hyperloop Netzwerk ohne Hyperloop-Röhren. - -Die Nutzung der Hyperloop Teleport Blöcke benötigt 60 Erfahrungspunkte. - -## Weitere TA5 Blöcke/Items - -### TA5 Container (geplant) - -Der TA5 Container erlaubt Techage Anlagen ein- und an einer anderen Stelle wieder auszupacken. - -Für die Nutzung des TA5 Containers werden 80 Erfahrungspunkte benötigt. - -### TA5 KI Chip / TA5 AI Chip - -Der TA5 KI Chip wird teilweise zur Herstellung von TA5 Blöcken benötigt. Der TA5 KI Chip kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 10 Erfahrungspunkte benötigt. - -[ta5_aichip|image] - -### TA5 KI Chip II / TA5 AI Chip II - -Der TA5 KI Chip II wird zur Herstellung des TA5 Fusionsreaktors benötigt. Der TA5 KI Chip II kann nur auf der TA4 Elektronik Fab hergestellt werden. Dazu werden 25 Erfahrungspunkte benötigt. - -[ta5_aichip2|image] \ No newline at end of file diff --git a/techage/manuals/manual_ta5_EN.md b/techage/manuals/manual_ta5_EN.md deleted file mode 100644 index fa90707..0000000 --- a/techage/manuals/manual_ta5_EN.md +++ /dev/null @@ -1,177 +0,0 @@ -# TA5: Future - -Machines to overcome space and time, new sources of energy and other achievements shape your life. - -Experience points are required for the manufacture and use of TA5 machines and blocks. These can only be worked out using the collider from TA4. - -[techage_ta5|image] - -## Energy Sources - -### TA5 Fusion Reactor - -Nuclear fusion means the fusing of two atomic nuclei. Depending on the reaction, large amounts of energy can be released. Nuclear fusions, in which energy is released, take place in the form of chain reactions. They are the source of the energy of the stars, including our sun, for example. A fusion reactor converts the energy released during controlled nuclear fusion into electricity. - -**How ​​do fusion reactors work?** - -A fusion reactor works according to the classic principle of a thermal power plant: water is heated and drives a steam turbine, whose kinetic energy is converted into electricity by a generator. - -A fusion power plant initially requires a large amount of energy, since a plasma has to be generated. "Plasma" is the name given to the fourth state of matter, after solid, liquid and gaseous. This requires a lot of electricity. Only through this extreme concentration of energy does the fusion reaction ignite and the heat given off is used to generate electricity via the heat exchanger. The generator then delivers 800 ku of electricity. - -The plan on the right shows a section through the fusion reactor. - -60 experience points are required to operate the fusion reactor. The fusion reactor must be built entirely in a forceload block area. - -[ta5_fusion_reactor|plan] - -#### TA5 Fusion Reactor Magnet - -A total of 60 TA5 Fusion Reactor Magnets are required to set up the fusion reactor. These form the ring in which the plasma forms. The TA5 Fusion Reactor Magnets requires power and has two ports for cooling. - -There are two types of magnets, so all sides of the magnet that face the plasma ring can also be protected with a heat shield. - -With the corner magnets on the inside of the ring, one connection side is covered (power or cooling) and can therefore not be connected. This is technically not feasible and therefore has no influence on the function of the fusion reactor. - -[ta5_magnet|image] - -#### TA5 Pump - -The pump is required to fill the cooling circuit with isobutane. About 350 units of isobutane are required. - -Note: The TA5 pump can only be used to fill the cooling circuit, pumping out the coolant is not possible. Therefore, the pump should not be switched on until the magnets are correctly placed and all power and cooling lines are connected. - -[ta5_pump|image] - -#### TA5 Heat Exchanger - -The TA5 Heat Exchanger is required to convert the heat generated in the fusion reactor first to steam and then to electricity. The Heat Exchanger itself requires 5 ku electricity. The structure is similar to the Heat Exchanger of the energy store from TA4. - -Note: The TA5 Heat Exchanger has two connections (blue and green) for the cooling circuit. The heat exchanger and all magnets must be connected to form a cooling circuit via the green and blue pipes. - -The cooling circuit can be checked for completeness using the start button on the heat exchanger, even if no coolant has yet been filled in. - -[ta5_heatexchanger|plan] - -#### TA5 Fusion Reactor Controller - -The fusion reactor is switched on via the TA5 Fusion Reactor Controller. The cooling/Heat Exchanger must be switched on first and then the controller. It takes about 2 minutes for the reactor to start up and supply electricity. The fusion reactor and thus the controller requires 400 ku of electricity to maintain the plasma. - -[ta5_fr_controller|image] - -#### TA5 Fusion Reactor Shell - -The entire reactor must be surrounded by a shell that absorbs the enormous pressure that the magnets exert on the plasma and protects the environment from radiation. Without this shell, the reactor cannot be started. With the TechAge Trowel, power cables and cooling pipes of the fusion reactor can also be integrated into the shell. - -[ta5_fr_shell|image] - -#### TA5 Fusion Reactor Core - -The core must sit in the center of the reactor. See illustration under "TA5 Fusion Reactor". The TechAge Trowel is also required for this. - -[ta5_fr_nucleus|image] - -## Energy Storage - -### TA5 Hybrid Storage (planned) - -## Logic blocks - -## Transport and Traffic - -### TA5 Flight Controller - -The TA5 Flight Controller is similar to the TA4 Move Controller. In contrast to the TA4 Move Controller, several movements can be combined into one flight route. This flight route can be defined in the input field using several x,y,z entries (one movement per line). The flight route is checked and saved via "Save". In the event of an error, an error message is issued. - -With the "Test" button, the flight route with the absolute coordinates is output for checking in the chat. - -The maximum distance for the entire flight distance is 1500 m. Up to 32 blocks can be trained. - -The use of the TA5 Flight Controller requires 40 experience points. - -**Teleport mode** - -If the 'Teleport Mode' is enabled, a player can also be moved without blocks. To do this, the start position must be configured using the "Record" button. Only one position can be configured here. The player to be moved must be in that position. - -[ta5_flycontroller|image] - -### TA5 Hyperloop Chest - -The TA5 Hyperloop Chest allows objects to be transported over a Hyperloop network. - -The TA5 Hyperloop Chest has to be placed on a Hyperloop Junction. The chest has a special menu, with which you can pair two chests. Things that are in the chest are teleported to the remote station. The chest can also be filled/emptied with a pusher. - -For pairing you first have to enter a name for the chest on one side, then you can select this name for the other chest and thus connect the two blocks. - -The use of the TA5 Hyperloop Chest requires 15 experience points. - -[ta5_chest|image] - -### TA5 Hyperloop Tank - -The TA5 Hyperloop Tank allows liquids to be transported over a Hyperloop network. - -The TA5 Hyperloop Tank has to be placed on a Hyperloop Junction.The tank has a special menu, with which you can pair two tanks. Liquids in the tank will be teleported to the remote station. The tank can also be filled/emptied with a pump. - -For pairing you first have to enter a name for the tank on one side, then you can select this name for the other tank and thus connect the two blocks. - -The use of the TA5 Hyperloop Tank requires 15 experience points. - -[ta5_tank|image] - - - -## Teleport Blocks - -Teleport blocks allow things to be transferred between two teleport blocks without the need for a pipe or tube in between. To pair the blocks, you first have to enter a name for the block on one side, then you can select this name for the other block and thus connect the two blocks. Pairing can only be carried out by one player (player name is checked) and must be completed before the server is restarted. Otherwise the pairing data will be lost. - -The map on the right shows how the blocks can be used. - -[ta5_teleport|plan] - -### TA5 Teleport Block Items - -These teleport blocks allow the transfer of items and thus replace a tube. Distances of up to 500 blocks can be bridged. - -Each Teleport blocks requires 12 ku of electricity. - -30 experience points are required to use the teleport blocks. - -[ta5_tele_tube|image] - -### TA5 Teleport Block Liquids - -These teleport blocks allow the transfer of liquids and thus replace a pipe. Distances of up to 500 blocks can be bridged. - -Each Teleport blocks requires 12 ku of electricity. - -30 experience points are required to use the teleport blocks. - -[ta5_tele_pipe|image] - -### Hyperloop Teleport Blocks (planned) - -The Hyperloop Teleport Blocks allow the construction of a Hyperloop network without Hyperloop tubes. - -The use of the Hyperloop Teleport Blocks requires 60 experience points. - - - -## More TA5 Blocks/Items - -### TA5 Container (planned) - -The TA5 container allows Techage systems to be packed and unpacked at another location. - -80 experience points are required to use the TA5 container. - -### TA5 AI Chip - -The TA5 AI Chip is partly required for the production of TA5 blocks. The TA5 AI Chip can only be manufactured at the TA4 Electronics Fab. This requires 10 experience points. - -[ta5_aichip|image] - -### TA5 AI Chip II - -The TA5 AI Chip II is required to build the TA5 Fusion Reactor. The TA5 AI Chip II can only be manufactured at the TA4 Electronics Fab. This requires 25 experience points. - -[ta5_aichip2|image] diff --git a/techage/manuals/manual_ta5_pt-BR.md b/techage/manuals/manual_ta5_pt-BR.md deleted file mode 100644 index dc90ca8..0000000 --- a/techage/manuals/manual_ta5_pt-BR.md +++ /dev/null @@ -1,177 +0,0 @@ -# TA5: Futuro - -Máquinas para superar o espaço e o tempo, novas fontes de energia e outras conquistas moldam sua vida. - -São necessários pontos de experiência para a fabricação e o uso de máquinas e blocos TA5. Eles só podem ser calculados usando o colisor do TA4. - -[techage_ta5|image] - -## Fontes de energia - -### Reator de fusão TA5 - -A fusão nuclear significa a fusão de dois núcleos atômicos. Dependendo da reação, grandes quantidades de energia podem ser liberadas. As fusões nucleares, nas quais a energia é liberada, ocorrem na forma de reações em cadeia. Elas são a fonte de energia das estrelas, inclusive do nosso sol, por exemplo. Um reator de fusão converte a energia liberada durante a fusão nuclear controlada em eletricidade. - -**Como funcionam os reatores de fusão?** - -Um reator de fusão funciona de acordo com o princípio clássico de uma usina de energia térmica: a água é aquecida e aciona uma turbina a vapor, cuja energia cinética é convertida em eletricidade por um gerador. - -Uma usina de fusão requer inicialmente uma grande quantidade de energia, pois é necessário gerar um plasma. "Plasma" é o nome dado ao quarto estado da matéria, depois do sólido, líquido e gasoso. Isso requer uma grande quantidade de eletricidade. Somente por meio dessa concentração extrema de energia é que a reação de fusão se inflama e o calor liberado é usado para gerar eletricidade por meio do trocador de calor. O gerador fornece então 800 ku de eletricidade. - -A planta à direita mostra uma seção do reator de fusão. - -São necessários 60 pontos de experiência para operar o reator de fusão. O reator de fusão deve ser construído inteiramente em uma área de bloco de carga. - -[ta5_fusion_reactor|plan] - -#### Ímã do reator de fusão TA5 - -Um total de 60 ímãs de reator de fusão TA5 é necessário para configurar o reator de fusão. Eles formam o anel no qual o plasma se forma. O TA5 Fusion Reactor Magnets requer energia e tem duas portas para resfriamento. - -Há dois tipos de ímãs, portanto, todos os lados do ímã voltados para o anel de plasma também podem ser protegidos com um protetor térmico. - -Com os ímãs de canto na parte interna do anel, um lado da conexão é coberto (energia ou resfriamento) e, portanto, não pode ser conectado. Isso não é tecnicamente viável e, portanto, não influencia a função do reator de fusão. - -[ta5_magnet|image] - -#### Bomba TA5 - -A bomba é necessária para encher o circuito de resfriamento com isobutano. São necessárias cerca de 350 unidades de isobutano. - -Observação: A bomba TA5 só pode ser usada para encher o circuito de resfriamento; não é possível bombear o líquido de arrefecimento para fora. Portanto, a bomba não deve ser ligada até que os ímãs estejam corretamente posicionados e todas as linhas de alimentação e resfriamento estejam conectadas. - -[ta5_pump|image] - -#### Trocador de calor TA5 - -O trocador de calor TA5 é necessário para converter o calor gerado no reator de fusão primeiro em vapor e depois em eletricidade. O próprio trocador de calor requer 5 ku de eletricidade. A estrutura é semelhante à do trocador de calor do depósito de energia do TA4. - -Observação: O trocador de calor TA5 tem duas conexões (azul e verde) para o circuito de resfriamento. O trocador de calor e todos os ímãs devem ser conectados para formar um circuito de resfriamento por meio dos tubos verde e azul. - -É possível verificar se o circuito de resfriamento está completo usando o botão de partida no trocador de calor, mesmo que o líquido de arrefecimento ainda não tenha sido abastecido. - -[ta5_heatexchanger|plan] - -#### Controlador do reator de fusão TA5 - -O reator de fusão é ligado por meio do controlador do reator de fusão TA5. O resfriamento/trocador de calor deve ser ligado primeiro e depois o controlador. Leva cerca de 2 minutos para o reator iniciar e fornecer eletricidade. O reator de fusão e, portanto, o controlador requerem 400 ku de eletricidade para manter o plasma. - -[ta5_fr_controller|image] - -#### Carcaça do reator de fusão TA5 - -O reator inteiro deve ser cercado por um invólucro que absorva a enorme pressão que os ímãs exercem sobre o plasma e proteja o ambiente da radiação. Sem esse invólucro, o reator não pode ser iniciado. Com a TechAge Trowel, os cabos de energia e os tubos de resfriamento do reator de fusão também podem ser integrados à carcaça. - -[ta5_fr_shell|image] - -#### Núcleo do reator de fusão TA5 - -O núcleo deve ficar no centro do reator. Veja a ilustração em "TA5 Fusion Reactor". A espátula TechAge também é necessária para isso. - -[ta5_fr_nucleus|image] - -## Armazenamento de energia - -### Armazenamento híbrido TA5 (planejado) - -## Blocos lógicos - -## Transporte e tráfego - -### Controlador de voo TA5 - -O controlador de voo TA5 é semelhante ao controlador de movimento TA4. Ao contrário do TA4 Move Controller, vários movimentos podem ser combinados em uma rota de voo. Essa rota de voo pode ser definida no campo de entrada usando várias entradas x,y,z (um movimento por linha). A rota de voo é verificada e salva por meio de "Save" (Salvar). Em caso de erro, é emitida uma mensagem de erro. - -Com o botão "Test" (Testar), a rota de voo com as coordenadas absolutas é emitida para verificação no bate-papo. - -A distância máxima para toda a distância de voo é de 1.500 m. Até 32 blocos podem ser treinados. - -O uso do controlador de voo TA5 requer 40 pontos de experiência. - -**Modo teletransporte** - -Se o "Teleport Mode" (Modo de teletransporte) estiver ativado, o jogador também poderá ser movido sem blocos. Para fazer isso, a posição inicial deve ser configurada usando o botão "Record" (Registrar). Somente uma posição pode ser configurada aqui. O jogador a ser movido deve estar nessa posição. - -[ta5_flycontroller|image] - -### TA5 Hyperloop Chest - -O TA5 Hyperloop Chest permite que objetos sejam transportados em uma rede Hyperloop. - -O Baú Hyperloop TA5 deve ser colocado em uma Junção Hyperloop. O baú tem um menu especial, com o qual você pode emparelhar dois baús. Os itens que estão no baú são teletransportados para a estação remota. O baú também pode ser preenchido/esvaziado com um empurrador. - -Para fazer o emparelhamento, primeiro você precisa inserir um nome para o baú de um lado e, em seguida, selecionar esse nome para o outro baú e, assim, conectar os dois blocos. - -O uso do Baú do Hyperloop TA5 requer 15 pontos de experiência. - -[ta5_chest|image] - -### Tanque de hyperloop TA5 - -O TA5 Hyperloop Tank permite o transporte de líquidos em uma rede Hyperloop. - -O TA5 Hyperloop Tank deve ser colocado em um Hyperloop Junction. O tanque tem um menu especial, com o qual você pode emparelhar dois tanques. Os líquidos no tanque serão teletransportados para a estação remota. O tanque também pode ser enchido/esvaziado com uma bomba. - -Para fazer o emparelhamento, primeiro é necessário inserir um nome para o tanque de um lado e, em seguida, selecionar esse nome para o outro tanque e, assim, conectar os dois blocos. - -O uso do TA5 Hyperloop Tank requer 15 pontos de experiência. - -[ta5_tank|image] - - - -## Blocos de teletransporte - -Os blocos de teletransporte permitem a transferência de objetos entre dois blocos de teletransporte sem a necessidade de um cano ou tubo entre eles. Para emparelhar os blocos, primeiro é preciso digitar um nome para o bloco de um lado e, em seguida, selecionar esse nome para o outro bloco e, assim, conectar os dois blocos. O emparelhamento só pode ser realizado por um jogador (o nome do jogador é verificado) e deve ser concluído antes de o servidor ser reiniciado. Caso contrário, os dados de emparelhamento serão perdidos. - -O mapa à direita mostra como os blocos podem ser usados. - -[ta5_teleport|plan] - -### Itens do bloco de teletransporte TA5 - -Esses blocos de teletransporte permitem a transferência de itens e, portanto, substituem um tubo. Distâncias de até 500 blocos podem ser transpostas. - -Cada bloco de teletransporte requer 12 ku de eletricidade. - -São necessários 30 pontos de experiência para usar os blocos de teletransporte. - -[ta5_tele_tube|image] - -### Líquidos do bloco de teletransporte TA5 - -Esses blocos de teletransporte permitem a transferência de líquidos e, portanto, substituem um cano. Distâncias de até 500 blocos podem ser transpostas. - -Cada bloco de teletransporte requer 12 ku de eletricidade. - -São necessários 30 pontos de experiência para usar os blocos de teletransporte. - -[ta5_tele_pipe|image] - -### Blocos de teletransporte Hyperloop (planejados) - -Os blocos de teletransporte Hyperloop permitem a construção de uma rede Hyperloop sem tubos Hyperloop. - -O uso dos blocos de teletransporte Hyperloop requer 60 pontos de experiência. - - - -## Mais blocos/itens TA5 - -### Contêiner TA5 (planejado) - -O contêiner TA5 permite que os sistemas Techage sejam embalados e desembalados em outro local. - -São necessários 80 pontos de experiência para usar o contêiner TA5. - -### Chip TA5 AI - -O chip TA5 AI é parcialmente necessário para a produção de blocos TA5. O chip de IA TA5 só pode ser fabricado na fábrica de eletrônicos TA4. Isso requer 10 pontos de experiência. - -[ta5_aichip|image] - -### Chip TA5 AI II - -O TA5 AI Chip II é necessário para construir o Reator de Fusão TA5. O TA5 AI Chip II só pode ser fabricado na fábrica de eletrônicos TA4. Isso requer 25 pontos de experiência. - -[ta5_aichip2|image] \ No newline at end of file diff --git a/techage/manuals/markdown_to_lua.py b/techage/manuals/markdown_to_lua.py deleted file mode 100644 index 28512d1..0000000 --- a/techage/manuals/markdown_to_lua.py +++ /dev/null @@ -1,271 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# install mistune v0.8.4 with: pip install mistune==0.8.4 - -import re -import mistune - -assert(mistune.__version__ == "0.8.4") - -__version__ = "1.0" - -class WikiLinkInlineLexer(mistune.InlineLexer): - def enable_wiki_link(self): - # add wiki_link rules - self.rules.wiki_link = re.compile( - r'\[' # [ - r'([\s\S]+?\|[\s\S]+?)' # name| img-type - r'\](?!\])' # ] - ) - - # Add wiki_link parser to default rules - # you can insert it some place you like - # but place matters, maybe 3 is not good - self.default_rules.insert(3, 'wiki_link') - - def output_wiki_link(self, m): - text = m.group(1) - name, itype = text.split('|') - # you can create an custom render - # you can also return the html if you like - return self.renderer.wiki_link(name, itype) - -class MarkdownToLua(mistune.Renderer): - def __init__(self, *args, **kwargs): - mistune.Renderer.__init__(self, *args, **kwargs) - self.item_name = "" - self.plan_table = "" - self.is_first_header = True - self.text_chunck = [] - self.lTitle = [] - self.lText = [] - self.lItemName = [] - self.lPlanTable = [] - print("Markdown-to-Lua v%s" % __version__) - - def m2l_formspec_escape(self, text): - text = text.replace("\\", "") - text = text.replace("[", "\\\\[") - text = text.replace("]", "\\\\]") - text = text.replace(";", "\\\\;") - text = text.replace(",", "\\\\,") - text = text.replace('"', '\\"') - text = text.replace('\n', '\\n') - return text - - def m2l_add_last_paragraph(self): - """ - Used to add a text block before the next header or at the end of the document - """ - self.lText.append(self.text_chunck) - self.text_chunck = [] - self.lItemName.append(self.item_name) - self.item_name = "" - self.lPlanTable.append(self.plan_table) - self.plan_table = "" - ## - ## Block Level - ## - def block_code(self, code, lang): - text = self.m2l_formspec_escape(code.strip()) - lines = text.split("\\n") - lines = [" " + item for item in lines] - self.text_chunck.extend(lines) - self.text_chunck.append("") - return "" - - def header(self, text, level, raw=None): - if not self.is_first_header: - self.m2l_add_last_paragraph() - self.is_first_header = False - self.lTitle.append("%u,%s" % (level, self.m2l_formspec_escape(text))) - return "" - - def hrule(self): - self.text_chunck.append("\n----------------------------------------------------\n") - return "" - - def paragraph(self, text): - lines = text.split("\\n") + [""] - self.text_chunck.extend(lines) - return "" - - def list(self, body, ordered=True): - lines = body.split("\n") - self.text_chunck.extend(lines) - return "" - - def list_item(self, text): - return " - %s\n" % text.strip() - ## - ## Span Level - ## - def emphasis(self, text): - return "*%s*" % self.m2l_formspec_escape(text) - - def double_emphasis(self, text): - return "*%s*" % self.m2l_formspec_escape(text) - - def codespan(self, text): - return "'%s'" % self.m2l_formspec_escape(text) - - def text(self, text): - return self.m2l_formspec_escape(text) - - def link(self, link, title, content): - """ - Used for plans and images: - [myimage](/image/) - [myplan](/plan/) - """ - if link == "/image/": - self.item_name = content - elif link == "/plan/": - self.plan_table = content - return content - - def wiki_link(self, name, itype): - """ - Used for plans and images: - [myimage|image] - [myplan|plan] - """ - if itype == "image": - self.item_name = name - elif itype == "plan": - self.plan_table = name - return "" - - def autolink(self, link, is_email=False): - return link - - def linebreak(self): - return "\\n" - - def newline(self): - return "\\n" - - def inline_html(self, text): - #print(text) - pass - - def parse_md_file(self, src_name): - print(" - Read MD file '%s'" % src_name) - inline = WikiLinkInlineLexer(self) - # enable the feature - inline.enable_wiki_link() - md = mistune.Markdown(renderer=self, inline=inline) - md.renderer.src_name = src_name - md.render(open(src_name, 'r').read()) - md.renderer.m2l_add_last_paragraph() - - def lua_table(self, key, lData): - lOut = [] - lOut.append(" %s = {" % key) - for line in lData: - lOut.append(' "%s",' % line) - lOut.append(" }") - return "\n".join(lOut) - - def lua_text_table(self, key, lData): - lOut = [] - lOut.append(" %s = {" % key) - for lines in lData: - for line in lines[:-1]: - line = line.replace('
', '\\n') - lOut.append(' "%s\\n"..' % line) - if len(lines) > 0: - lOut.append(' "%s\\n",' % lines[-1]) - else: - lOut.append(' "",') - lOut.append(" }") - return "\n".join(lOut) - - def gen_lua_file(self, dest_name): - print(" - Write Lua file '%s'" % dest_name) - lOut = [] - s = ",\n".join([self.lua_table("titles", self.lTitle), - self.lua_text_table("texts", self.lText), - self.lua_table("images", self.lItemName), - self.lua_table("plans", self.lPlanTable)]) - open(dest_name, "w").write("return {\n%s\n}" % s) - print("done.") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_DE.md") -m2l.gen_lua_file("../doc/manual_DE.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_RU.md") -m2l.gen_lua_file("../doc/manual_RU.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta1_DE.md") -m2l.gen_lua_file("../doc/manual_ta1_DE.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta2_DE.md") -m2l.gen_lua_file("../doc/manual_ta2_DE.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta3_DE.md") -m2l.gen_lua_file("../doc/manual_ta3_DE.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta4_DE.md") -m2l.gen_lua_file("../doc/manual_ta4_DE.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta5_DE.md") -m2l.gen_lua_file("../doc/manual_ta5_DE.lua") - - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_EN.md") -m2l.gen_lua_file("../doc/manual_EN.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta1_EN.md") -m2l.gen_lua_file("../doc/manual_ta1_EN.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta2_EN.md") -m2l.gen_lua_file("../doc/manual_ta2_EN.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta3_EN.md") -m2l.gen_lua_file("../doc/manual_ta3_EN.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta4_EN.md") -m2l.gen_lua_file("../doc/manual_ta4_EN.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta5_EN.md") -m2l.gen_lua_file("../doc/manual_ta5_EN.lua") - - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_pt-BR.md") -m2l.gen_lua_file("../doc/manual_pt-BR.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta1_pt-BR.md") -m2l.gen_lua_file("../doc/manual_ta1_pt-BR.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta2_pt-BR.md") -m2l.gen_lua_file("../doc/manual_ta2_pt-BR.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta3_pt-BR.md") -m2l.gen_lua_file("../doc/manual_ta3_pt-BR.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta4_pt-BR.md") -m2l.gen_lua_file("../doc/manual_ta4_pt-BR.lua") - -m2l = MarkdownToLua() -m2l.parse_md_file("./manual_ta5_pt-BR.md") -m2l.gen_lua_file("../doc/manual_ta5_pt-BR.lua") diff --git a/techage/manuals/ta4_icta_controller_DE.md b/techage/manuals/ta4_icta_controller_DE.md deleted file mode 100644 index 70a34ec..0000000 --- a/techage/manuals/ta4_icta_controller_DE.md +++ /dev/null @@ -1,112 +0,0 @@ -# TA4 ICTA Controller - -Der ICTA Controller (ICTA steht für "If Condition Then Action") dient zur Überwachung und Steuerung von Maschinen. Mit dem Controller kann man Daten von Maschinen und anderen Blöcken einlesen und abhängig davon andere Maschinen und Blöcke ein-/ausschalten. - -### 8 Steuerregeln - -Der Controller arbeitet auf das Basis von Regeln, wobei bis zu 8 Regeln pro Controller angelegt werden können. - -Beispiele für Regeln sind: - -- Wenn ein Verteiler verstopft ist (```blocked```), soll der Schieber davor ausgeschaltet werden -- Wenn eine Maschine den Fehlerzustand (`fault`) anzeigt, soll eine Lampe zur Fehleranzeige eingeschaltet werden -- Wenn ein Spieler in der Nähe eines Spieler Detektors ist, soll sein Name auf einem Display ausgegeben werden -- Wenn ein Minecart am Cart-Sensor erkannt wird, soll das Cart beladen werden (Schieber eingeschaltet) - -Alle Regeln sollten nur so oft wie notwendig ausgeführt werden. Dies hat zwei Vorteile: - -- die Batterie des Controllers hält länger (jeder Controller benötigt eine Batterie) -- die Last für den Server ist geringer (damit weniger Lags) - -### Zyklische Ausführung von Regeln - -Diese Regeln werden vom Controller zyklisch geprüft. Ist eine Bedingung (condition) erfüllt, wird die Aktion (action) ausgeführt. Solange die Bedingung nicht erfüllt ist, passiert nichts. Auch wenn die Bedingung bei der letzten Bearbeitung der Regel schon erfüllt war und damit die Aktion ausgeführt wurde, passiert nichts mehr. Die Bedingung muss zuerst ungültig und dann wieder gültig werden, so dass die Aktion erneut ausgeführt wird. - -Wie oft eine Regel vom Controller geprüft wird, kann für jede Regel einzeln konfiguriert werden. Pro Regel muss dazu eine Zykluszeit in Sekunden (`Cycle/s`) angegeben werden (1..1000). - -### Ereignis gesteuerte Ausführung von Regeln - -Alternativ zu den zyklisch geprüften Regeln gibt es auch die Ereignis gesteuerte Ausführung von Regeln. - -Ereignisse sind Kommandos, die von anderen Blöcken an den Controller gesendet werden. Beispiele sind Sensoren und Schalter. Diese senden `on`/`off` Kommandos. Wird bspw. der Schalter eingeschaltet, sendet dieser ein `on` Kommando, wird er ausgeschaltet, sendet dieser ein `off` Kommando an den Block mit der Nummer, die beim Schalter konfiguriert wurde. - -Bei Regeln, die Ereignis-gesteuert ausgeführt werden sollen, muss als Zykluszeit 0 angegeben werden. - -### Verzögerungszeit - -Man muss für jede Aktion eine Verzögerungszeit (```after/s```) einstellen. Soll die Aktion sofort ausgeführt werden, ist 0 einzugeben. - -#### Bedingungen / Conditions - -Für jede Regel kann eine der folgenden Bedingungen konfiguriert werden. Pro Regel kann aber immer nur eine Bedingung konfiguriert werden. - -- `initial` - Diese Bedingung ist immer nach dem Einschalten des Controllers erfüllt und dient bspw. dazu, eine Lampe auszuschalten, um sie dann beim Auftreten eines Fehlers wieder einschalten zu können. - -- `true` - Diese Bedingung ist immer erfüllt und dient bspw. dazu, eine Lampe blinken zu lassen . Dazu werden zwei Regeln benötigt. Haben bspw. beide Regeln eine Zykluszeit von 2 s, aber die erste Regel eine Verzögerungszeit von 0 s und die zweite Regel eine Verzögerungszeit von 1 s, so kann damit eine Lampe zyklisch ein- und wieder ausgeschaltet werden. - -- `condition` - Hier kann abhängig von einer anderen Regel eine Aktion gestartet werden. Dazu muss die Nummer der anderen Regel (1..8) angegeben werden. Damit können 2 Aktionen mit einer `condition` ausgeführt werden. Über die zusätzlich konfigurierbare Bedingung kam mit `was not true` erreicht werden, dass bspw. eine Lampe wieder ausgeschaltet wird, wenn die Bedingung nicht mehr erfüllt ist. - -- `inputs` - Damit kann der empfangene Wert `on` / `off` eines Kommandos (Ereignis) ausgewertet werden. Hier bitte beachten: Bei Regeln, die Ereignis-gesteuert ausgeführt werden sollen, muss als Zykluszeit 0 angegeben werden. - -- `read block state` - Damit kann der Status einer Maschine abgefragt werden. Die Nummer der Maschine (Blocknummer) muss eingegeben werden. Mögliche Maschinenzustände sind: - - - `running` --> Maschine ist am arbeiten - - `stopped` --> Maschine ist ausgeschaltet - - `standby` --> Maschine hat nichts zu tun, da bspw. das Inventar leer ist - - `blocked` -->Maschine kann nichts tun, da bspw. das Ausgangs-Inventar voll ist - - `fault` --> Maschine hat einen Fehler. Weitere Informationen liefert ggf. das Maschinen-Menü - - `unloaded` --> Maschinen in größerer Entfernung können ohne Forceload Block vom Server entladen worden sein. Diese sind dann nicht aktiv. - - Ist eine konfigurierte Bedingung erfüllt, also bspw. `block nummer 456 is stopped`, so wird die Aktion ausgeführt. - - **Info:** Eine **Blocknummer** ist eine eindeutige Zahl, die von Techage beim Setzen von vielen Techage Blöcken generiert und als Infotext hinter dem Blocknamen angezeigt wird. Die Blocknummer dient zur Adressierung bei der Kommunikation zwischen Techage Controllern und Maschinen. - - Welche Maschinen welche Statusinformationen liefern, kann am einfachsten mit dem Schraubenschlüssel /Techage Info Werkzeug direkt an der Maschine festgestellt werden. - -- `read amount of fuel` - Damit kann ausgelesen werden, wie viel Sprit eine Maschine noch hat (typisch 0-99 Einheiten) und mit einem Wert auf 'größer' oder 'kleiner' verglichen werden. Ist die konfigurierte Bedingung erfüllt, wird die Aktion ausgeführt. - `read power/liquid load` - Damit kann die Ladung eines Akkus oder des Wärmespeichers in Prozent (Werte von 0..100) abgefragt und mit der konfigurierten Bedingung auf 'größer'/'kleiner' geprüft werden. Ist die Bedingung erfüllt, wird die Aktion ausgeführt. - -- `read delivered power` - Damit kann die Strommenge abgefragt werden, die ein Generator (in ku) abgibt. Der Wert kann mit der konfigurierten Bedingung auf 'größer'/'kleiner' geprüft werden. Ist die Bedingung erfüllt, wird die Aktion ausgeführt. Da Akkus nicht nur Strom abgeben sondern auch aufnehmen, ist dieser Wert, wenn der Akku geladen wird, negativ. - -- `read chest state` - Damit kann der Zustand eines TA3/TA4 Chests/Kiste abgefragt und ausgewertet werden. Kisten liefern die Zustände: - - - `empty` - Die Kiste ist leer - - `loaded` - Die Kiste teilweise gefüllt - - `full` - Alle Stacks der Kiste sind zumindest teilweise belegt - - Ist die Bedingung erfüllt, wird die Aktion ausgeführt. - -- `read Signal Tower state` - Damit kann die Farbe eines Signal Towers abgefragt und geprüft werden. Signal Tower liefern die Werte `off`, `green`, `amber`, `red`. Ist die Bedingung erfüllt, wird die Aktion ausgeführt. - -- `read Player Detector` - Damit kann ein Spieler Detektor abgefragt werden. Der Detektor liefert den Namen des Spielers in der Nähe des Detektor. Soll nicht nur ein bestimmter, sondern jeder Spielername an einem Display ausgegeben werden, so ist bei 'player name(s)' `*` einzugeben. - Es können auch mehrere Namen durch Leerzeichen getrennt eingegeben werden. Soll die Aktion ausgeführt werden, wenn kein Spieler in der Nähe ist, ist `-` einzugeben. - -### Aktionen /Actions - -Für alle Aktionen, die einen Block (wie bspw. eine Lampe) steuern, muss die Nummer des Blocks bei der Aktion angegeben werden. Pro Regel kann nur eine Aktion konfiguriert werden. - -- `print to output window` - Bspw. für Testzwecke kann ein Text im Controller-Menü (unter 'outp') ausgegeben werden. Dies ist vor allem bei der Fehlersuche hilfreich. -- `send Signal Tower command` - Damit kann die Farbe des Signal Towers gesetzt werden. Mögliche Werte sind: `off`, `green`, `amber`, `red`. -- `turn block off/on` - Damit kann ein Block oder Maschine aus- bzw. wieder eingeschaltet werden. -- `Display: overwrite one line` - Damit kann ein Text auf dem Display ausgegeben werden. Die Zeilennummer auf dem Display (1..5) muss dabei angegeben werden. - Soll der Spielername des Spieler Detektors aus der Bedingung ausgegeben werden, ist bei 'text' ein - `*`-Zeichen einzugeben. -- `Display: Clear screen` - Löschen des Bildschirms -- `send chat message` - Damit kann man sich selber eine Chat Nachricht senden. -- `open/close door` - Damit können die Standard-Türen geöffnet und geschlossen werden. Da die Türen keine Nummern haben, müssen die Koordinaten der Türe eingegeben werden. Die Koordination einer Türe können sehr einfach mit dem Schraubenschlüssel /Techage Info Werkzeug bestimmt werden. -- `turn Distributor filter on/off` - Damit können die Filter/Ausgänge eines Verteilers ein- und ausgeschaltet werden. Der entsprechende Ausgang muss über die Farbe angegeben werden. - -### Sonstiges - -Der Controller hat eine eigene Hilfe und Hinweise zu allen Kommandos über das Controller-Menü. - -Einlesen von Maschinendaten sowie das Steuern von Blöcken und Maschinen erfolgt über sogenannte Kommandos. Für das Verständnis, wie Kommandos funktionieren, ist das Kapitel TA3 -> Logik-/Schalt-Blöcke in der In-Game Hilfe (Konstruktionsplan) hilfreich. - -Die Hilfe existiert auch als PDF zum Drucken oder offline Lesen: - -https://github.com/joe7575/techage/blob/master/manuals/ta4_icta_controller_DE.pdf - - - - - diff --git a/techage/manuals/ta4_icta_controller_DE.pdf b/techage/manuals/ta4_icta_controller_DE.pdf deleted file mode 100644 index 18d5f104e504387a4be5117e68af306288eec6e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90505 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 machine is working - - `stopped` -> machine is switched off - - `standby` -> machine has nothing to do, for example because the inventory is empty - - `blocked` -> machine cannot do anything, e.g. the initial inventory is full - - `fault` -> machine has a fault. The machine menu may provide further information - - `unloaded` -> Machines at a greater distance may have been unloaded from the server without a forceload block. Then these are not active. - - If a configured condition is fulfilled, e.g. `block number 456 is stopped`, the action is carried out. - - **Info:** A **block number** is a unique number that is generated by Techage when many Techage blocks are placed and is displayed as information text behind the block name. The block number is used for addressing during communication between Techage controllers and machines. - - The easiest way to determine which machines provide which status information is with the wrench / Techage Info tool directly on the machine. - -- `read amount of fuel` - This can be used to read out how much fuel a machine still has (typically 0-99 units) and to compare it with a value of 'larger' or 'smaller'. If the configured condition is met, the action is carried out. - `read power / liquid load` - This means that the charge of a battery or the heat storage device can be queried in percent (values ​​from 0..100) and checked for 'larger' / 'smaller' with the configured condition. If the condition is met, the action is carried out. - -- `read delivered power` - This can be used to query the amount of electricity that a generator (in ku) is delivering. The value can be checked with the configured condition for 'larger' / 'smaller'. If the condition is met, the action is carried out. Since batteries not only emit electricity but also absorb, this value is negative when the battery is charged. - -- `read chest state` - This enables the status of a TA3/TA4 chest to be queried and evaluated. Chests provide the states: - - - `empty` - the chest is empty - - `loaded` - the chest partially filled - - `full` - All stacks in the chest are at least partially occupied - - If the condition is met, the action is carried out. - -- `read Signal Tower state` - This allows the color of a Signal Tower to be queried and checked. Signal towers deliver the values ​​`off`, `green`, `amber`, `red`. If the condition is met, the action is carried out. - -- `read Player Detector` - This can be used to query a player detector. The detector provides the player's name near the detector. If not only a specific but every player's name is to be shown on a display, enter '*' in 'player name (s). - You can also enter multiple names separated by spaces. If the action is to be carried out when there is no player nearby, enter `-`. - -### Actions - -For all actions that control a block (such as a lamp), the number of the block must be specified in the action. Only one action can be configured per rule. - -- `print to output window` - e.g. a text can be output in the controller menu (under 'outp') for test purposes. This is especially helpful when troubleshooting. -- `send Signal Tower command` - This allows the color of the Signal Tower to be set. Possible values ​​are: `off`,` green`, `amber`,` red`. -- `turn block off / on` - This enables a block or machine to be switched on or off again. -- `Display: overwrite one line` - This allows text to be output on the display. The line number on the display (1..5) must be specified. - If the player name of the player detector is to be output from the condition, then 'text' is on - Enter the `*` character. -- `Display: Clear screen` - clear the screen -- `send chat message` - This allows you to send yourself a chat message. -- `open / close door` - This allows the standard doors to be opened and closed. Since the doors have no numbers, the coordinates of the door must be entered. The coordination of a door can be easily determined with the wrench / Techage Info tool. -- `Turn distributor filter on / off` - This enables the filter / outputs of a distributor to be switched on and off. The corresponding output must be specified via the color. - -### Miscellaneous - -The controller has its own help and information on all commands via the controller menu. - -Machine data is read in and blocks and machines are controlled using commands. To understand how commands work, the chapter TA3 -> Logic / switching blocks in the in-game help (construction plan) is helpful. - - - - - diff --git a/techage/manuals/ta4_lua_controller_EN.md b/techage/manuals/ta4_lua_controller_EN.md deleted file mode 100644 index 5b1b625..0000000 --- a/techage/manuals/ta4_lua_controller_EN.md +++ /dev/null @@ -1,760 +0,0 @@ -# TA4 Lua Controller - -![Lua Controller](https://github.com/joe7575/techage/blob/master/textures/techage_lua_controller_inventory.png) - -The TA4 Lua Controller is a small computer, programmable in Lua to control your machinery. -In contrast to the ICTA Controller this controller allows to implement larger and more complex programs. - -But to write Lua scripts, some knowledge with the programming language Lua is required. - -Minetest uses Lua 5.1. The reference document for Lua 5.1 is [here](https://www.lua.org/manual/5.1/). The book [Programming in Lua (first edition)](https://www.lua.org/pil/contents.html) is also a perfect source for learning Lua. - -This TA4 Lua Controller manual is also available as PDF: - -https://github.com/joe7575/techage/blob/master/manuals/ta4_lua_controller_EN.pdf - - - -## Table of Contents - -- [TA4 Lua Controller](#ta4-lua-controller) - - [Table of Contents](#table-of-contents) - - [TA4 Lua Controller Blocks](#ta4-lua-controller-blocks) - - [TA4 Lua Controller](#ta4-lua-controller-1) - - [Battery](#battery) - - [TA4 Lua Server](#ta4-lua-server) - - [TA4 Lua Controller Terminal](#ta4-lua-controller-terminal) - - [TA4 Sensor Chest](#ta4-sensor-chest) - - [Lua Functions and Environment](#lua-functions-and-environment) - - [Lua Functions and Limitations](#lua-functions-and-limitations) - - [Arrays, Stores, and Sets](#arrays-stores-and-sets) - - [Arrays](#arrays) - - [Stores](#stores) - - [Sets](#sets) - - [Initialization, Cyclic Task, and Events](#initialization-cyclic-task-and-events) - - [Initialization](#initialization) - - [Cyclic Task](#cyclic-task) - - [Events](#events) - - [Lua Controller Functions](#lua-controller-functions) - - [Controller local Functions](#controller-local-functions) - - [Input Example](#input-example) - - [Techage Command Functions](#techage-command-functions) - - [Server and Terminal Functions](#server-and-terminal-functions) - - [Communication between Lua Controllers](#communication-between-lua-controllers) - - [Further Functions](#further-functions) - - [Example Scripts](#example-scripts) - - [Simple Counter](#simple-counter) - - [Hello World](#hello-world) - - [For Loop with range(from, to)](#for-loop-with-rangefrom-to) - - [Monitoring Chest \& Furnace](#monitoring-chest--furnace) - - [Simple Calculator](#simple-calculator) - - [Welcome Display](#welcome-display) - - [Sensor Chest](#sensor-chest) - - [Read the "TA4 4x Button"](#read-the-ta4-4x-button) - - [Emails](#emails) - - - -## TA4 Lua Controller Blocks - -### TA4 Lua Controller - -The controller block has a menu form with the following tabs: - -- the `init` tab for the initialization code block -- the `func` tab for the Lua functions -- the `loop` tab for the main code block -- the `outp` tab for debugging outputs via `$print()` -- the `notes` tab for your code snippets or other notes (like a clipboard) -- the `help` tab with information to the available functions - -The controller needs power to work. A battery pack has to be placed nearby. - -### Battery - -The battery pack has to be placed near the controller (1 block distance). -The needed battery power is directly dependent on the CPU time the controller consumes. -Because of that, it is important to optimize the execution time of the code (which helps the admin to keep server lags down :)) - -The controller will be restarted (init() is called) every time the Minetest server starts again. -To store data non-volatile (to pass a server restart), the "TA4 Lua Server" block has to be used. - -### TA4 Lua Server - -The Server block is used to store data from Lua Controllers nonvolatile. It can also be used for communication purposes between several Lua Controllers. -Only configured players have access to the server. Therefore, the server has a menu to enter player names. - -For special Server functions, see "Server and Terminal Functions" - -### TA4 Lua Controller Terminal - -The Terminal is used to send command strings to the controller. -In turn, the controller can send text strings to the terminal. -The Terminal has a help system for internal commands. Its supports the following commands: - -- `clear` = clear the screen -- `help` = output this message -- `pub` = switch terminal to public use (everybody can enter commands) -- `priv` = switch terminal to private use (only the owner can enter commands) -- `send on/off` = send on/off event to e. g. lamps (for testing purposes) -- `msg ` = send a text message to another Controller (for testing purposes) - -For special Terminal functions for the TA4 Lua Controller, see "Server and Terminal Functions" - -### TA4 Sensor Chest - -tbd. - -## Lua Functions and Environment - -### Lua Functions and Limitations - -The controller uses a subset of the language Lua, called SaferLua. It allows the safe and secure execution of Lua scripts, but has the following limitations: - -- limited code length -- limited execution time -- limited memory use -- limited possibilities to call functions - -SaferLua follows the standard Lua syntax with the following restrictions: - -- no `while` or `repeat` loops (to prevent endless loops) -- no table constructor {..}, see "Arrays, Stores, and Sets" for comfortable alternatives -- limited runtime environment - -SaferLua directly supports the following standard functions: - -- math.floor -- math.abs -- math.max -- math.min -- math.random -- tonumber -- tostring -- unpack -- type -- string.byte -- string.char -- string.find -- string.format -- string.gmatch -- string.gsub -- string.len -- string.lower -- string.match -- string.rep -- string.sub -- string.upper -- string.split (result is an Array) -- string.split2 (result are multiple returns like the Lua function unpack) -- string.trim - -For own function definitions, the menu tab 'func' can be used. Here you write your functions like: - -```lua -function foo(a, b) - return a + b -end -``` - -Each SaferLua program has access to the following system variables: - -- ticks - a counter which increments by one each call of `loop()` -- elapsed - the amount of seconds since the last call of `loop()` -- event - a boolean flag (true/false) to signal the execution of `loop()` based on an occurred event - -### Arrays, Stores, and Sets - -It is not possible to easily control the memory usage of a Lua table at runtime. Therefore, Lua tables can't be used for SaferLua programs. Because of this, there are the following alternatives, which are secure shells over the Lua table type: - -#### Arrays - -_Arrays_ are lists of elements, which can be addressed by means of an index. An index must be an integer number. The first element in an _array_ has the index value 1. _Arrays_ have the following methods: - -- add(value) - add a new element at the end of the array -- set(idx, value) - overwrite an existing array element on index `idx` -- get(idx) - return the value of the array element on index `idx` -- remove(idx) - remove the array element on index `idx` -- insert(idx, val) - insert a new element at index `idx` (the array becomes one element longer) -- size() - return the number of _array_ elements -- memsize() - return the needed _array_ memory space -- next() - `for` loop iterator function, returning `idx,val` -- sort(reverse) - sort the _array_ elements in place. If _reverse_ is `true`, sort in descending order. - - -Example: - -```lua -a = Array(1,2,3,4) --> {1,2,3,4} -a.add(6) --> {1,2,3,4,6} -a.set(2, 8) --> {1,8,3,4,6} -a.get(2) --> function returns 8 -a.insert(5,7) --> {1,8,3,4,7,6} -a.remove(3) --> {1,8,4,7,6} -a.insert(1, "hello") --> {"hello",1,8,4,7,6} -a.size() --> function returns 6 -a.memsize() --> function returns 10 -for idx,val in a.next() do - ... -end -``` - -#### Stores - -Unlike _arrays_, which are indexed by a range of numbers, _stores_ are indexed by keys, which can be a string or a number. The main operations on a _store_ are storing a value with some key and extracting the value given the key. -The _store_ has the following methods: - -- set(key, val) - store/overwrite the value `val` behind the keyword `key` -- get(key) - read the value behind `key` -- del(key) - delete a value -- size() - return the number of _store_ elements -- memsize() - return the needed _store_ memory space -- next() - `for` loop iterator function, returning `key,val` -- keys(order) - return an _array_ with the keys. If _order_ is `"up"` or `"down"`, return the keys as sorted _array_, in order of the _store_ values. - -Example: - -```lua -s = Store("a", 4, "b", 5) --> {a = 4, b = 5} -s.set("val", 12) --> {a = 4, b = 5, val = 12} -s.get("val") --> returns 12 -s.set(0, "hello") --> {a = 4, b = 5, val = 12, [0] = "hello"} -s.del("val") --> {a = 4, b = 5, [0] = "hello"} -s.size() --> function returns 3 -s.memsize() --> function returns 9 -for key,val in s.next() do - ... -end -``` - -Keys sort example: - -```lua -s = Store() --> {} -s.set("Joe", 800) --> {Joe=800} -s.set("Susi", 1000) --> {Joe=800, Susi=1000} -s.set("Tom", 60) --> {Joe=800, Susi=1000, Tom=60} -s.keys() --> {Joe, Susi, Tom} -s.keys("down") --> {Susi, Joe, Tom} -s.keys("up") --> {Tom, Joe, Susi} -``` - -#### Sets - -A _set_ is an unordered collection with no duplicate elements. The basic use of a _set_ is to test if an element is in the _set_, e.g. if a player name is stored in the _set_. -The _set_ has the following methods: - -- add(val) - add a value to the _set_ -- del(val) - delete a value from the _set_ -- has(val) - test if value is stored in the _set_ -- size() - return the number of _set_ elements -- memsize() - return the needed _set_ memory space -- next() - `for` loop iterator function, returning `idx,val` - -Example: - -```lua -s = Set("Tom", "Lucy") --> {Tom = true, Lucy = true} -s.add("Susi") --> {Tom = true, Lucy = true, Susi = true} -s.del("Tom") --> {Lucy = true, Susi = true} -s.has("Susi") --> function returns `true` -s.has("Mike") --> function returns `false` -s.size() --> function returns 2 -s.memsize() --> function returns 8 -for idx,val in s.next() do - ... -end -``` - -All three types of data structures allow nested elements, e.g. you can store a _set_ in a _store_ or an _array_ and so on. But note that the overall size over all data structures can't exceed the predefined limit. This value is configurable for the server admin. The default value is 1000. -The configured limit can be determined via `memsize()`: - -```lua -memsize() --> function returns 1000 (example) -``` - -### Initialization, Cyclic Task, and Events - -The TA4 Lua Controller distinguishes between the initialization phase (just after the controller was started) and the continuous operational phase, in which the normal code is executed. - -#### Initialization - -During the initialization phase the function `init()` is executed once. The `init()` function is typically used to initialize variables, clean the display, or reset other blocks: - -```lua --- initialize variables -counter = 1 -table = Store() -player_name = "unknown" - -# reset blocks -$clear_screen("123") -- "123" is the number-string of the display -$send_cmnd("2345", "off") -- turn off the blocks with the number "2345" -``` - - -#### Cyclic Task - -During the continuous operational phase the `loop()` function is cyclically called. -Code witch should be executed cyclically has to be placed here. -The cycle frequency is per default once per second but can be changed via: - -```lua -$loopcycle(0) -- no loop cyle any more -$loopcycle(1) -- call the loop function every second -$loopcycle(10) -- call the loop function every 10 seconds -``` - -The provided number must be an integer value. -The cycle frequency can be changed in the `init()` function, but also in the `loop()` function. - -#### Events - -To be able to react directly on received commands, the TA4 Lua Controller supports events. -Events are usually turned off, but can be activated with the function `events()`: - -```lua -$events(true) -- enable events -$events(false) -- disable events -``` - -If an event occurs (a command was received from another block), the `loop()` is executed (in addition to the normal loop cycle). In this case the system variable 'event' is set: - -```lua -if event then - -- event has occurred - if $get_input("3456") == "on" then -- check input from block "3456" - -- do some action... - end -end -``` - -The first occurred event will directly be processed, further events may be delayed. The TA4 Lua Controller allows a maximum of one event every 100 ms. - - -## Lua Controller Functions - -In addition to Lua standard function the Lua Controller provides the following functions: - -### Controller local Functions - -- `$print(text)` - Output a text string on the 'outp' tab of the controller menu. - E.g.: `$print("Hello "..name)` -- `$loopcycle(seconds)` - This function allows to change the call frequency of the controller loop() function, witch is per default one second. For more info, see "Cyclic Task" -- `$events(bool)` - Enable/disable event handling. For more info, see "Events" -- `$get_ms_time()` - Returns the time with millisecond precision -- `$get_gametime()` - Returns the time, in seconds, since the world was created -- `$time_as_str()` - Read the time of day (ingame) as text string in 24h format, like "18:45" -- `$time_as_num()` - Read the time of day (ingame) as integer number in 24h format, like 1845 -- `$get_input(num)` - Read an input value provided by an external block with the given number _num_. The block has to be configured with the number of the controller to be able to send status messages (on/off commands) to the controller. _num_ is the number (data type string) of the remote block, like "1234". - -#### Input Example -- A Player Detector with number "456" is configured to send on/off commands to the TA4 Lua Controller with number "345". -- The TA4 Lua Controller will receive these commands as input value. -- The program on the SaferLua Controller can always read the last input value from the Player Detector with number "456" by means of: - -`sts = $get_input("456")` - - -### Techage Command Functions - -With the `$send_cmnd(num, ident, add_data)` function, you can send commands to and retrieve data from another block with the given number _num_. -The possible commands can be classified in two groups: Commands for reading data and commands for triggering an action. -Please note, that this is not a technical distinction, only a logical. - -**Reading data** - -- _ident_ specifies the data to be read. -- _add_data_ is for additional data and normally not needed. -- The result is block dependent (see table below) - - -| ident | returned data | comment | -| ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -| "state" | one of: "running", "stopped", "blocked", "standby", "fault", or "unloaded" | Techage machine state, used by many machines | -| "state" | one of: "red", "amber", "green", "off" | Signal Tower state | -| "state" | one of: "empty", "loaded", "full" | State of a chest or Sensor Chest | -| "state" | one of: "on", "off" | State of a TA4 Button | -| "fuel" | number | fuel value of a fuel consuming block | -| "depth" | number | Read the current depth value of a quarry block (1..80) | -| "load" | number | Read the load value in percent (0..100) of a accu, or battery block. | -| "load" | number | Read the load value in percent (0..100) of a tank or silo.
Silo and tank return two values:
The percentage value and the absolute value in units.
Example: percent, absolute = $send_cmnd("223", "load") | -| "load" | number | Read the grid storage amount (state of charge) in percent (0..100) from a TA3 Power Terminal. | -| "delivered" | number | Read the current delivered power value of a generator block. A power consuming block (accu) provides a negative value | -| "flowrate" | Total flow rate in liquid units | Only for TA4 Pumps | -| "action" | player-name, action-string | Only for Sensor Chests | -| "stacks" | Array with up to 4 Stores with the inventory content (see example) | Only for Sensor Chests | -| "count" | number | Read the item counter of the TA4 Item Detector block | -| "count" | number of items | Read the total amount of TA4 chest items. An optional number as `add_data` is used to address only one inventory slot (1..8, from left to right). | -| "count" | number of items | Read the number of pushed items for a TA4 Pusher in "flow limiter" mode | -| "count" | number of units | Read the number of pumped liquid units for a TA4 Pump in "flow limiter" mode | -| "itemstring" | item string of the given slot | Specific command for the TA4 8x2000 Chest to read the item type (technical name) of one chest slot, specified via `add_data` (1..8).
Example: s = $send_cmnd("223", "itemstring", 1) | -| "output" | recipe output string,
e.g.: "default:glass" | Only for the Industrial Furnace. If no recipe is active, the command returns "unknown" | -| "input" | \ | Read a recipe from the TA4 Recipe Block. `` is the number of the recipe. The block return a list of recipe items. | -| "name" | \ | Player name of the TA3/TA4 Player Detector or TA4 Button | -| "time" | number | Time in system ticks (norm. 100 ms) when the TA4 Button is clicked | -| "consumption" | number | TA4 Electric Meter: Amount of electrical energy passed through | -| "countdown" | number | TA4 Electric Meter: Countdown value for the amount of electrical energy passed through | -| "current" | number | TA4 Electric Meter: Current flow of electricity (current) | - - - -**Trigger an action** - -- _num_ is the number of the remote block, like "1234" -- _cmnd_ is the command -- _data_ is additional data (see table below) - -| cmnd | data | comment | -| -------------------------------- | ------------ | ------------------------------------------------------------ | -| "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" | string
`=on/off` | Enable/disable a Distributor filter slot..
Example: `"yellow=on"`
colors: red, green, blue, yellow | -| "config" | "\ \" | Configure a Distributor filter slot, like: "red default:dirt dye:blue" | -| "text" | text string | Text to be used for the Sensor Chest menu | -| "reset" | nil | Reset item and countdown counters of the TA4 Item Detector block | -| "countdown" | number | Set countdown counter of the TA4 Item Detector block to the given value and
start countdown mode. | -| "limit" | number | Configure a TA4 Pusher with the number of items that are allowed to be pushed ("flow limiter" mode)
limit = 0 turns off the "flow limiter" mode | -| "limit" | number | Configure a TA4 Pump with the number of liquid units that are allowed to be pumped ("flow limiter" mode)
limit = 0 turns off the "flow limiter" mode | -| "config" | item string | Configure the TA4 pusher.
Example: `wool:blue` | -| "exchange" | inventory slot number | TA3 Door Controller II (techage:ta3_doorcontroller2)
Exchange a block
*idx* is the inventory slot number (1..n) of/for the block to be exchanged | -| "set" | inventory slot number | TA3 Door Controller II (techage:ta3_doorcontroller2)
Set/add a block
*idx* is the inventory slot number (1..n) with the block to be set | -| "dig" | inventory slot number | TA3 Door Controller II (techage:ta3_doorcontroller2)
Dig/remove a block
*idx* is the empty inventory slot number (1..n) for the block | -| "a2b" | nil | TA4 Move Controller command to move the block(s) from position A to B | -| "b2a" | nil | TA4 Move Controller command to move the block(s) from position B to A | -| "move" | nil | TA4 Move Controller command to move the block(s) to the opposite position | -| "move2" | x,y,z | TA4 Move Controller command to move the block(s) by the given
x/y/z-distance. Valid ranges for x, y, and z are -100 to 100.
Example: `$send_cmnd("1674", "move2", "0,4,0")` | -| "reset" | nil | Reset TA4 Move Controller (move block(s) to start position) | -| "left" | nil | TA4 Turn Controller command to turn the block(s) to the left | -| "right" | nil | TA4 Turn Controller command to turn the block(s) to the right | -| "uturn" | nil | TA4 Turn Controller command to turn the block(s) 180 degrees | -| "recipe" | `,,...` | Set the TA4 Autocrafter recipe.
Example for the torch recipe: `default:coal_lump,,,default:stick`
Hint: Empty fields may only be left out at the end of the item list! | -| "recipe" | `.` | Set the TA4 Autocrafter recipe with a recipe from a TA4 Recipe Block.
`` is the TA4 Recipe Block number
`` is the number of the recipe in the TA4 Recipe Block | -| "goto" | `` | Start command for the TA4 Sequencer. `` is the time slot like `[1]` where the execution starts. | -| "stop" | nil | Stop command for the TA4 Sequencer. | -| "gain" | volume | Set volume of the sound block (`volume` is a value between 0 and 1.0) | -| "sound" | index | Select sound sample of the sound block | -| "color" | \ | Set the color of the TechAge Color Lamp and TechAge Color Lamp 2 (color = 0..255) | - -### Server and Terminal Functions - -The Server is used to store data permanently/non-volatile. It can also be used to share data between several Controllers. -- `$server_write(num, key, value)` - Store a value on the server under the key _key_. _key_ must be a string. _value_ can be either a number, string, boolean, nil or data structure. - **This function does not allow nested data structures**. - _num_ is the number of the Server. - Example: `$server_write("0123", "state", state)` -- `$server_read(num, key)` - Read a value from the server. _key_ must be a string. _num_ is the number of the Server, like "1234". - -The Terminal can send text strings as events to the Controller. -In contrast the Controller can send text strings to the terminal. - -- `$get_term()` - Read a text command received from the Terminal -- `$put_term(num, text)` - Send a text string to the Terminal. _num_ is the number of the Terminal. - -### Communication between Lua Controllers - -Messages are used to transport data between Controllers. Messages can contain arbitrary data. Incoming messages are stored in order (up to 10) and can be read one after the other. - -* `$get_msg([raw])` - Read a received message. The function returns the sender number as string and the message. (see example "Emails"). If the _raw_ parameter is not set or false, the message is guaranteed to be a string. -* `$send_msg(num, msg)` - Send a message to another Controller. _num_ is the destination number as string. (see example "Emails") - -### Further Functions - -* `$chat(text)` - Send yourself a chat message. _text_ is a text string. -* `$door(pos, text)` - Open/Close a door at position "pos". - Example: `$door("123,7,-1200", "close")`. - Hint: Use the Techage Info Tool to determine the door position. -* `$item_description("default:apple")` - Get the description (item name) for a specified itemstring, e. g. determined via the TA4 8x2000 Chest command `itemstring`: - `str = $send_cmnd("223", "itemstring", 1)` - `descr = $item_description(str)` - -* `$display(num, row, text)` Send a text string to the display with number _num_. _row_ is the display row, a value from 1 to 5, or 0 to add the text string at the bottom (scroll screen mode). _text_ is the string to be displayed. If the first char of the string is a blank, the text will be horizontally centered. -* `$clear_screen(num)` Clear the screen of the display with number _num_. -* `$position(num)` Returns the position as string "'(x,y,z)" of the device with the given _num_. - -## Example Scripts - -### Simple Counter - -Very simple example with output on the Controller menu. - -init() code: - -```lua -a = 1 -``` - -loop() code: - -```lua -a = a + 1 -$print("a = "..a) -``` - - - -### Hello World - -"Hello world" example with output on the Display. - -init() code: - -```lua -a = Array("Hello", "world", "of", "Minetest") - -$clear_screen("0669") - -for i,text in a.next() do - $display("0669", i, text) -end -``` - - - -### For Loop with range(from, to) - -Second "Hello world" example with output on the Display, -implemented by means of a for/range loop. - -init() code: - -```lua -a = Array("Hello", "world", "of", "Minetest") - -$clear_screen("0669") - -for i in range(1, 4) do - text = a.get(i) - $display("0669", i, text) -end -``` - - - -### Monitoring Chest & Furnace - -More realistic example to read Pusher states and output them on a display: - -init() code: - -```lua -DISPLAY = "1234" -- adapt this to your display number -min = 0 -``` - -loop() code: - -```lua --- call code every 60 sec -if ticks % 60 == 0 then - -- output time in minutes - min = min + 1 - $display(DISPLAY, 1, min.." min") - - -- Cactus chest overrun - sts = $send_cmnd("1034", "state") -- read pusher status - if sts == "blocked" then $display(DISPLAY, 2, "Cactus full") end - - -- Tree chest overrun - sts = $send_cmnd("1065", "state") -- read pusher status - if sts == "blocked" then $display(DISPLAY, 3, "Tree full") end - - -- Furnace fuel empty - sts = $send_cmnd("1544", "state") -- read pusher status - if sts == "standby" then $display(DISPLAY, 4, "Furnace fuel") end -end -``` - - - - -### Simple Calculator - -A simple calculator (adds entered numbers) by means of a Lua Controller and a Terminal. - -init() code: - -```lua -$events(true) -$loopcycle(0) - -TERM = "360" -- terminal number, to be adapted! -sum = 0 -$put_term(TERM, "sum = "..sum) -``` - -loop() code: - -```lua -s = $get_term() -- read text from terminal -if s then - val = tonumber(s) or 0 -- convert to number - sum = sum + val - text = string.format("+%d = %d", val, sum) -- format output string - $put_term(TERM, text) -- output to terminal -end -``` - - - -### Welcome Display - -In addition to the controller, you also need a player detector and a display. -When the Player Detector detects a player the player name is shown on the display: - -init() code: - -```lua -$events(true) -$loopcycle(0) - -SENSOR = "365" -- player detector number, to be adapted! -DISPLAY = "367" -- display number, to be adapted! - -$clear_screen(DISPLAY) -``` - -loop() code: - -```lua -if event then - name = $send_cmnd(SENSOR, "name") - if name == "" then -- no player arround - $clear_screen(DISPLAY) - else - $display(DISPLAY, 2, " Welcome") - $display(DISPLAY, 3, " "..name) - end -end -``` - - - -### Sensor Chest - -The following example shows the functions/commands to be used with the Sensor Chest: - -init() code: - -```lua -$events(true) -$loopcycle(0) - -SENSOR = "372" -- sensor chest number, to be adapted! - -$send_cmnd(SENSOR, "text", "press both buttons and\nput something into the chest") -``` - -loop() code: - -```lua -if event and $get_input(SENSOR) == "on" then - -- read inventory state - state = $send_cmnd(SENSOR, "state") - $print("state: "..state) - -- read player name and action - name, action = $send_cmnd(SENSOR, "action") - $print("action"..": "..name.." "..action) - -- read inventory content - stacks = $send_cmnd(SENSOR, "stacks") - for i,stack in stacks.next() do - $print("stack: "..stack.get("name").." "..stack.get("count")) - end - $print("") -end -``` - - - -### Read the "TA4 4x Button" - -For the `$get_input(...)` function, the Lua controller expects received `on`/`off` commands. However, the "TA4 4x Button" is not able to send an `on` command followed by an `off` command. To be able to receive commands from "TA4 4x Button", the `$get_msg()` function has to be used. - -Therefore, the "TA4 4x Button" (Type set to "button") has to be programmed with commands like: `msg 1`, `msg 2`, `msg 3`, `msg 4`. - -The following example demonstrates receiving "TA4 4x Button" commands: - -init() code: - -```lua -$events(true) -$loopcycle(0) - -BUTTON = "372" -- "TA4 4x Button" number, to be adapted! -``` - -loop() code: - -```lua -if event then - num,text = $get_msg() - if num == BUTTON then - $print("button: " .. text) - end -end -``` - -If the buttons are pressed, the "outp" window of the Lua controller will look like: - -``` -button: 1 -button: 4 -button: 3 -button: 2 -``` - - - -### Emails - -For an email system you need a TA4 Lua Server and a TA4 Lua Controller with Terminal per player. -The TA4 Lua Server serves as database for player name/block number resolution. - -* Each Player needs its own Terminal and Controller. The Terminal has to be connected with the Controller -* Each Controller runs the same Lua Script, only the numbers and the owner names are different -* To send a message, enter the receiver name and the text message like `Tom: hello` into the Terminal -* The Lua script will determine the destination number and send the message to the destination Controller -* All players who should be able to take part in the email system have to be entered into the Server form - -init() code: - -```lua -$loopcycle(0) -$events(true) - --- Start: update to your conditions -TERM = "360" -CONTROLLER = "359" -NAME = "Tom" -SERVER = "363" --- End: update to your conditions - -$print($server_write(SERVER, NAME, CONTROLLER)) -$print($server_write(SERVER, CONTROLLER, NAME)) -``` - -loop() code: - -```lua --- read from Terminal and send the message -s = $get_term() -if s then - name,text = string.split2(s, ":", false, 1) - num = $server_read(SERVER, name) - if num then - $send_msg(num, text) - $put_term(TERM, "message sent") - end -end - --- read message and output to terminal -num,text = $get_msg() -if num then - name = $server_read(SERVER, num) - if name then - $put_term(TERM, name..": "..text) - end -end -``` diff --git a/techage/manuals/ta4_lua_controller_EN.pdf b/techage/manuals/ta4_lua_controller_EN.pdf deleted file mode 100644 index 33a11a0ce5687463e5f292ac295c6fdca907352e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405494 zcmb@t1z1+w);5d?N{WO?cS!i~bVv(`G}6-D-I5B3poDZvhcqbNB}gNPASvD5>A&3P zy#IFp=e@q`{NLVQJh0|^=9=?f_ZZ_IbFDdKR}_DA9|D3Cun(`V&JsYFz)W_AmIML< zd}59!2F`YlO!wsMJS?oO4fqfsFq8H@4G4svN!G&F#hu9=jnqTJwYiu??d`2i)J+U! zES&ieFcb)e1Ukw*R*{qCWwN%gGGUT5F|x7)I;uRgw{tY$1A{Oi43bIA+|ka)gbxh^ zfkAKx7zTnsp-d9iCPvPVcD8&N5EKMqQZ_I(aJ2aMs9XemijH>1E=DE*EM+ST13myf zlMNaMeDMcd3p-nJ17{Pad*TnEU?>!f0mC3@C=!C=0fRY#AE2L{o$>#ex`$HXUZ=V)VK{bwiSpPj@+e|7p-S6MM8Fae*e^dG;~f1Q_;Wr7p% zDT^{WJGz+s?_;6<91CE|go#ho*4EA$xX8uO`HwchyA=W7qhA9(v~x5DXwU)!*MM~h z_>=(Jn6wZO36!N4dK6ABGj8jOI!fc~OPfQ|n>i;*)x z954+NpQ@4+!LMIT_Y6!Q@bTG#xrBg!|3e7+Z{vd@;2#wTNeXsz)>N5f5DCU+qh8( z5CRH8LI8{qI0y|zVc<*%2nqy8Au*W0joaSBn$O72*4f0?*$HIsY-9Zw^pIaB{&!IR zU%JJg@DWH12#i3YnBYhV2nq(Hf%`y1K?uMc|9@CFvv4+dF$5Xe+3;D~nV=9T1fR2s zk-34H37?_0ogrWeCubAKe;dS!&)ER32N+53*G)RwSzDVp>Pg6h?2S$TdZWLo&;R9( z{^|b+z)ny!1d0IsA2@=6!N8pY+Jt~Z!HECDzy9U_n7;yq{%uQO&>%1j`penj7zhXq z1p@&J1)#!UNC<=p0fqy9hC~7Q#7&%>nfT0241g%VZ;OQg8HJGFbm{++CI}S#iwFb^ zfPn&oP)IP~#Q-k=3Cz1Sk^}js`)%5Hx@T2Jit#!v51PXw+|f{QWfYyI~*zA21mBmw$i(J}_`J6a0^e z!odI2Ef{rfupJCI-c4Y&n_2?|94d_aNF`ISjg zkpIm;An4y1f&P7+{T&D#U<8O!Boh>n4G1t300aRr0{-6|1d8}gLV)Go-_2~lIS32_ zf?$wHS~h7Erg}4D*i)Dhvo13=9b@x1ca2U>GEDmw=ao z;P8K?*#9pO%x^&cQAvdY5rctZ0NsEB`h`ZoF@UQA+`wT-F#JCm!Tiq1KPsufdK3Tx zteF5H7$9a)fU80=03%Qg82ukW;F#YT`A0PsiUb&eAke_{fR>>FZUApV0gOPQkpEN> zU@h^RY5u;b{^_bf5P*PNN28bkB>{nv2n3*NNPrLs0)qSxLV(2c8;-xPslUZ86o?rZ z1_LYtA-`55C?Is9K+IskNXV~egul8fuv+*H$3Lp7z|tDP0Y#$$LSP^?1O)|r<<|oO z1_SxeB!htemi=M>sH#H203m1u2H*jR83-5-sM@auKL!f>Ae*>8q{ zpaDWqXkhK}XZD9+07B4!SN^AE5Wf@h_eJ%0ASi$k6aN7lgG9dQ#Q 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
4phrRhq%B9}S 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

voxVJ0z1wsl5O$2*K!mf*em$$L@suJp_+8jIB? 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

GY2tDOVAj{^iJ0;Vro;v9*gn{vL1D+) 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 LU;^C*G(-Ovm+adc diff --git a/techage/manuals/ta_kvstore.md b/techage/manuals/ta_kvstore.md deleted file mode 100644 index bfdbca8..0000000 --- a/techage/manuals/ta_kvstore.md +++ /dev/null @@ -1,78 +0,0 @@ -# Techage/Beduino Key/Value Store - -The key/value store simplifies the handling/comparison of strings. - -The following example shows the use of the Key/Value Store, here to check the names from the Player Detector: - -```c -import "lib/ta_kvstore.c" -import "lib/ta_iom.c" - -var s[16]; - -func init() { - // Init and fill-up the k/v store - ta_kv_init(); - ta_kv_add("singleplayer", 1); - ta_kv_add("Tom", 2); - ta_kv_add("Betty", 3); - ta_kv_add("Joe", 4); -} - -func loop() { - var val; - - if(event()) { // Signal from player detector received - request_data(5, 144, "", s); // Request player name from player detector - val = ta_kv_get(s); // Read value for the given name in 's' - if(val == 1) { - // do A... - } else if(val == 2) { - // do B... - } else if(val == 3) { - // do C... - } - } -} -``` - - - -Each controller has a key/value store that must be initialized via `ta_kv_init()` and filled via `ta_kv_add` before it can be used. - -### ta_kv_init - -Initializes the key/value store. Has to be called once at the beginning. - -```c -ta_kv_init() -``` - - - -### ta_kv_add - -Add a new key/value pair to the store. - -- *key_str* is the string -- *value* is the value to be stored, which can be read again using the key string - -```c - ta_kv_add(key_str, value) -``` - - - -### ta_kv_get - -Read a value from thre store. - -- *key_str* is the string - -The function returns 0, if *key_str* is unknown. - -```c -ta_kv_get(key_str) -``` - - diff --git a/techage/manuals/toc_DE.md b/techage/manuals/toc_DE.md deleted file mode 100644 index 93cc625..0000000 --- a/techage/manuals/toc_DE.md +++ /dev/null @@ -1,260 +0,0 @@ -# Inhaltsverzeichnis - -- [Tech Age Mod](./manual_DE.md#tech-age-mod) - - [Hinweise](./manual_DE.md#hinweise) - - [Änderungen ab Version 1.0](./manual_DE.md#änderungen-ab-version-1.0) - - [Tipps zur Umstellung](./manual_DE.md#tipps-zur-umstellung) - - [Erze und Mineralien](./manual_DE.md#erze-und-mineralien) - - [Meridium](./manual_DE.md#meridium) - - [Usmium](./manual_DE.md#usmium) - - [Baborium](./manual_DE.md#baborium) - - [Erdöl](./manual_DE.md#erdöl) - - [Bauxit](./manual_DE.md#bauxit) - - [Basalt](./manual_DE.md#basalt) -- [TA1: Eisenzeitalter](./manual_ta1_DE.md#ta1:-eisenzeitalter) - - [Köhler / Coal Pile](./manual_ta1_DE.md#köhler--coal-pile) - - [Kohlebrenner / Coal Burner](./manual_ta1_DE.md#kohlebrenner--coal-burner) - - [Wassermühle](./manual_ta1_DE.md#wassermühle) - - [TA1 Mühle](./manual_ta1_DE.md#ta1-mühle) - - [TA1 Schleusenschieber / TA1 Sluice Gate](./manual_ta1_DE.md#ta1-schleusenschieber--ta1-sluice-gate) - - [TA1 Schleusengriff / TA1 Sluice Handle](./manual_ta1_DE.md#ta1-schleusengriff--ta1-sluice-handle) - - [TA1 Apfelholzbrett / TA1 Apple Wood Board](./manual_ta1_DE.md#ta1-apfelholzbrett--ta1-apple-wood-board) - - [TA1 Apfel Mühlbachbrett / TA1 Apple Millrace Board](./manual_ta1_DE.md#ta1-apfel-mühlbachbrett--ta1-apple-millrace-board) - - [Erze und Werkzeuge](./manual_ta1_DE.md#erze-und-werkzeuge) - - [Hammer](./manual_ta1_DE.md#hammer) - - [Kiessieb / Gravel Sieve](./manual_ta1_DE.md#kiessieb--gravel-sieve) - - [Trichter / Hopper](./manual_ta1_DE.md#trichter--hopper) - - [Kies sieben mit dem Trichter](./manual_ta1_DE.md#kies-sieben-mit-dem-trichter) - - [Meridium](./manual_ta1_DE.md#meridium) -- [TA2: Dampfzeitalter](./manual_ta2_DE.md#ta2:-dampfzeitalter) - - [Dampfmaschine](./manual_ta2_DE.md#dampfmaschine) - - [TA2 Feuerbox / Firebox](./manual_ta2_DE.md#ta2-feuerbox--firebox) - - [TA2 Boiler](./manual_ta2_DE.md#ta2-boiler) - - [TA2 Zylinder /Cylinder](./manual_ta2_DE.md#ta2-zylinder-cylinder) - - [TA2 Schwungrad / Flywheel](./manual_ta2_DE.md#ta2-schwungrad--flywheel) - - [TA2 Dampfleitungen / Steam Pipe](./manual_ta2_DE.md#ta2-dampfleitungen--steam-pipe) - - [TA2 Antriebsachsen / TA2 Drive Axle](./manual_ta2_DE.md#ta2-antriebsachsen--ta2-drive-axle) - - [TA2 Stromgenerator / TA2 Power Generator](./manual_ta2_DE.md#ta2-stromgenerator--ta2-power-generator) - - [TA2 Energiespeicher](./manual_ta2_DE.md#ta2-energiespeicher) - - [TA2 Seilwinde / TA2 Winch](./manual_ta2_DE.md#ta2-seilwinde---ta2-winch) - - [TA2 Gewichtekiste / TA2 Weight Chest](./manual_ta2_DE.md#ta2-gewichtekiste--ta2-weight-chest) - - [Items schieben und sortieren](./manual_ta2_DE.md#items-schieben-und-sortieren) - - [Röhren / TechAge Tube](./manual_ta2_DE.md#röhren--techage-tube) - - [Röhren Konzentrator / Tube Concentrator](./manual_ta2_DE.md#röhren-konzentrator--tube-concentrator) - - [TA2 Schieber / Pusher](./manual_ta2_DE.md#ta2-schieber--pusher) - - [TA2 Verteiler / Distributor](./manual_ta2_DE.md#ta2-verteiler--distributor) - - [Kieswaschanlage](./manual_ta2_DE.md#kieswaschanlage) - - [TA2 Kiesspüler / Gravel Rinser](./manual_ta2_DE.md#ta2-kiesspüler--gravel-rinser) - - [Stein brechen\\, mahlen und sieben](./manual_ta2_DE.md#stein-brechen\\,-mahlen-und-sieben) - - [TA2 Steinbrecher / Quarry](./manual_ta2_DE.md#ta2-steinbrecher--quarry) - - [TA2 Mühle / Grinder](./manual_ta2_DE.md#ta2-mühle--grinder) - - [TA2 Kiessieb / Gravel Sieve](./manual_ta2_DE.md#ta2-kiessieb--gravel-sieve) - - [Items produzieren](./manual_ta2_DE.md#items-produzieren) - - [TA2 Autocrafter](./manual_ta2_DE.md#ta2-autocrafter) - - [TA2 Elektronikfabrik / Electronic Fab](./manual_ta2_DE.md#ta2-elektronikfabrik--electronic-fab) - - [Sonstige Blöcke](./manual_ta2_DE.md#sonstige-blöcke) - - [TA2 Flüssigkeitensammler / Liquid Sampler](./manual_ta2_DE.md#ta2-flüssigkeitensammler--liquid-sampler) - - [TA2 Gesicherte Kiste / Protected Chest](./manual_ta2_DE.md#ta2-gesicherte-kiste--protected-chest) - - [Techage Forceload Block](./manual_ta2_DE.md#techage-forceload-block) -- [TA3: Ölzeitalter](./manual_ta3_DE.md#ta3:-ölzeitalter) - - [Kohlekraftwerk / Ölkraftwerk](./manual_ta3_DE.md#kohlekraftwerk--ölkraftwerk) - - [TA3 Kraftwerks-Feuerbox / Power Station Firebox](./manual_ta3_DE.md#ta3-kraftwerks-feuerbox--power-station-firebox) - - [TA3 Kraftwerks-Ölbrenner / TA3 Power Station Oil Burner](./manual_ta3_DE.md#ta3-kraftwerks-ölbrenner--ta3-power-station-oil-burner) - - [TA3 Boiler unten/oben](./manual_ta3_DE.md#ta3-boiler-untenoben) - - [TA3 Turbine](./manual_ta3_DE.md#ta3-turbine) - - [TA3 Generator](./manual_ta3_DE.md#ta3-generator) - - [TA3 Kühler / Cooler](./manual_ta3_DE.md#ta3-kühler--cooler) - - [Elektrischer Strom](./manual_ta3_DE.md#elektrischer-strom) - - [Bedeutung von Speichersystemen](./manual_ta3_DE.md#bedeutung-von-speichersystemen) - - [TA Stromkabel / Electric Cable](./manual_ta3_DE.md#ta-stromkabel--electric-cable) - - [TA Verteilerdose / Electric Junction Box](./manual_ta3_DE.md#ta-verteilerdose--electric-junction-box) - - [TA Stromleitung / Power Line](./manual_ta3_DE.md#ta-stromleitung--power-line) - - [TA Strommast / Power Pole](./manual_ta3_DE.md#ta-strommast--power-pole) - - [TA Strommastkopf / Power Pole Top](./manual_ta3_DE.md#ta-strommastkopf--power-pole-top) - - [TA Strommastkopf 2 / Power Pole Top 2](./manual_ta3_DE.md#ta-strommastkopf-2--power-pole-top-2) - - [TA Stromschalter / Power Switch](./manual_ta3_DE.md#ta-stromschalter--power-switch) - - [TA Stromschalter klein / Power Switch Small](./manual_ta3_DE.md#ta-stromschalter-klein--power-switch-small) - - [TA Stromschalterbox / Power Switch Box](./manual_ta3_DE.md#ta-stromschalterbox--power-switch-box) - - [TA3 Kleiner Stromgenerator / Tiny Power Generator](./manual_ta3_DE.md#ta3-kleiner-stromgenerator--tiny-power-generator) - - [TA3 Akku Block / Akku Box](./manual_ta3_DE.md#ta3-akku-block---akku-box) - - [TA3 Strom Terminal / Power Terminal](./manual_ta3_DE.md#ta3-strom-terminal--power-terminal) - - [TA3 Elektromotor / TA3 Electric Motor](./manual_ta3_DE.md#ta3-elektromotor--ta3-electric-motor) - - [TA3 Industrieofen](./manual_ta3_DE.md#ta3-industrieofen) - - [TA3 Ofen-Ölbrenner / Furnace Oil Burner](./manual_ta3_DE.md#ta3-ofen-ölbrenner--furnace-oil-burner) - - [TA3 Ofenoberteil / Furnace Top](./manual_ta3_DE.md#ta3-ofenoberteil--furnace-top) - - [TA3 Gebläse / Booster](./manual_ta3_DE.md#ta3-gebläse--booster) - - [Flüssigkeiten](./manual_ta3_DE.md#flüssigkeiten) - - [TA3 Tank / TA3 Tank](./manual_ta3_DE.md#ta3-tank--ta3-tank) - - [TA3 Pumpe / TA3 Pump](./manual_ta3_DE.md#ta3-pumpe--ta3-pump) - - [TA Einfülltrichter / TA Liquid Filler](./manual_ta3_DE.md#ta-einfülltrichter--ta-liquid-filler) - - [TA4 Röhre / Pipe](./manual_ta3_DE.md#ta4-röhre--pipe) - - [TA3 Rohr/Wanddurchbruch / TA3 Pipe Wall Entry Blöcke](./manual_ta3_DE.md#ta3-rohrwanddurchbruch--ta3-pipe-wall-entry-blöcke) - - [TA Ventil / TA Valve](./manual_ta3_DE.md#ta-ventil--ta-valve) - - [Öl-Förderung](./manual_ta3_DE.md#öl-förderung) - - [TA3 Ölexplorer / Oil Explorer](./manual_ta3_DE.md#ta3-ölexplorer--oil-explorer) - - [TA3 Ölbohrkiste / Oil Drill Box](./manual_ta3_DE.md#ta3-ölbohrkiste--oil-drill-box) - - [TA3 Ölpumpe / Oil Pumpjack](./manual_ta3_DE.md#ta3-ölpumpe--oil-pumpjack) - - [TA3 Bohrgestänge / Drill Pipe](./manual_ta3_DE.md#ta3-bohrgestänge--drill-pipe) - - [Öltank / Oil Tank](./manual_ta3_DE.md#öltank--oil-tank) - - [Öl-Transport](./manual_ta3_DE.md#öl-transport) - - [Öl-Transport mit dem Tankwagen](./manual_ta3_DE.md#öl-transport-mit-dem-tankwagen) - - [Öl-Transport mit Fässern über Minecarts](./manual_ta3_DE.md#öl-transport-mit-fässern-über-minecarts) - - [Tankwagen / Tank Cart](./manual_ta3_DE.md#tankwagen--tank-cart) - - [Kistenwagen / Chest Cart](./manual_ta3_DE.md#kistenwagen--chest-cart) - - [Öl-Verarbeitung](./manual_ta3_DE.md#öl-verarbeitung) - - [Destillationsturm / distiller tower](./manual_ta3_DE.md#destillationsturm--distiller-tower) - - [Aufkocher / reboiler)](./manual_ta3_DE.md#aufkocher--reboiler)) - - [Logik-/Schalt-Blöcke](./manual_ta3_DE.md#logik-schalt-blöcke) - - [TA3 Taster/Schalter / Button/Switch](./manual_ta3_DE.md#ta3-tasterschalter--buttonswitch) - - [TA3 Kommando Konverter / Command Converter](./manual_ta3_DE.md#ta3-kommando-konverter--command-converter) - - [TA3 Flipflop / Flip-Flop](./manual_ta3_DE.md#ta3-flipflop--flip-flop) - - [TA3 Logikblock / Logic Block](./manual_ta3_DE.md#ta3-logikblock--logic-block) - - [TA3 Wiederholer / Repeater](./manual_ta3_DE.md#ta3-wiederholer--repeater) - - [TA3 Sequenzer / Sequencer](./manual_ta3_DE.md#ta3-sequenzer--sequencer) - - [TA3 Timer](./manual_ta3_DE.md#ta3-timer) - - [TA3 Terminal](./manual_ta3_DE.md#ta3-terminal) - - [TechAge Farblampe / Color Lamp](./manual_ta3_DE.md#techage-farblampe--color-lamp) - - [Tür/Tor Blöcke / Door/Gate Blocks](./manual_ta3_DE.md#türtor-blöcke--doorgate-blocks) - - [TA3 Tür Controller / Door Controller](./manual_ta3_DE.md#ta3-tür-controller--door-controller) - - [TA3 Tür Controller II / Door Controller II](./manual_ta3_DE.md#ta3-tür-controller-ii--door-controller-ii) - - [TA3 Sound Block](./manual_ta3_DE.md#ta3-sound-block) - - [TA3 Mesecons Umsetzer / TA3 Mesecons Converter](./manual_ta3_DE.md#ta3-mesecons-umsetzer--ta3-mesecons-converter) - - [Detektoren](./manual_ta3_DE.md#detektoren) - - [TA3 Detektor / Detector](./manual_ta3_DE.md#ta3-detektor--detector) - - [TA3 Wagen Detektor / Cart Detector](./manual_ta3_DE.md#ta3-wagen-detektor--cart-detector) - - [TA3 Block Detektor / Node Detector](./manual_ta3_DE.md#ta3-block-detektor--node-detector) - - [TA3 Spieler Detektor / Player Detector](./manual_ta3_DE.md#ta3-spieler-detektor--player-detector) - - [TA3 Lichtdetektor](./manual_ta3_DE.md#ta3-lichtdetektor) - - [TA3 Maschinen](./manual_ta3_DE.md#ta3-maschinen) - - [TA3 Schieber / Pusher](./manual_ta3_DE.md#ta3-schieber--pusher) - - [TA3 Verteiler / Distributor](./manual_ta3_DE.md#ta3-verteiler--distributor) - - [TA3 Autocrafter](./manual_ta3_DE.md#ta3-autocrafter) - - [TA3 Elektronikfabrik / Electronic Fab](./manual_ta3_DE.md#ta3-elektronikfabrik--electronic-fab) - - [TA3 Steinbrecher / Quarry](./manual_ta3_DE.md#ta3-steinbrecher--quarry) - - [TA3 Kiessieb / Gravel Sieve](./manual_ta3_DE.md#ta3-kiessieb--gravel-sieve) - - [TA3 Kieswaschanlage / Gravel Rinser](./manual_ta3_DE.md#ta3-kieswaschanlage--gravel-rinser) - - [TA3 Mühle / Grinder](./manual_ta3_DE.md#ta3-mühle--grinder) - - [TA3 Injektor / Injector](./manual_ta3_DE.md#ta3-injektor--injector) - - [Werkzeuge](./manual_ta3_DE.md#werkzeuge) - - [Techage Info Tool](./manual_ta3_DE.md#techage-info-tool) - - [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) - - [Techage Schraubendreher](./manual_ta3_DE.md#techage-schraubendreher) -- [TA4: Gegenwart](./manual_ta4_DE.md#ta4:-gegenwart) - - [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) - - [TA4 Wind Turbine Signal Lamp](./manual_ta4_DE.md#ta4-wind-turbine-signal-lamp) - - [TA4 Säule / Pillar](./manual_ta4_DE.md#ta4-säule--pillar) - - [Solaranlage](./manual_ta4_DE.md#solaranlage) - - [TA4 Solarmodul / Solar Module](./manual_ta4_DE.md#ta4-solarmodul--solar-module) - - [TA4 Solar Trägermodul / Carrier Module](./manual_ta4_DE.md#ta4-solar-trägermodul--carrier-module) - - [TA4 Solar Wechselrichter / Solar Inverter](./manual_ta4_DE.md#ta4-solar-wechselrichter--solar-inverter) - - [TA4 Niederspannungskabel / Low Power Cable](./manual_ta4_DE.md#ta4-niederspannungskabel--low-power-cable) - - [TA4 Niederspannungsverteilerbox / Low Power Box](./manual_ta4_DE.md#ta4-niederspannungsverteilerbox--low-power-box) - - [TA4 Straßenlampen-Solarzelle / Streetlamp Solar Cell](./manual_ta4_DE.md#ta4-straßenlampen-solarzelle--streetlamp-solar-cell) - - [Energiespeicher](./manual_ta4_DE.md#energiespeicher) - - [TA4 Wärmetauscher / Heat Exchanger](./manual_ta4_DE.md#ta4-wärmetauscher--heat-exchanger) - - [TA4 Turbine](./manual_ta4_DE.md#ta4-turbine) - - [TA4 Generator](./manual_ta4_DE.md#ta4-generator) - - [TA4 Rohrzulauf / TA4 Pipe Inlet](./manual_ta4_DE.md#ta4-rohrzulauf--ta4-pipe-inlet) - - [TA4 Röhre / Pipe](./manual_ta4_DE.md#ta4-röhre--pipe) - - [Stromverteilung](./manual_ta4_DE.md#stromverteilung) - - [TA4 Trenntransformator / TA4 Isolation Transformer](./manual_ta4_DE.md#ta4-trenntransformator--ta4-isolation-transformer) - - [TA4 Stromzähler / TA4 Electric Meter](./manual_ta4_DE.md#ta4-stromzähler--ta4-electric-meter) - - [TA4 Laser](./manual_ta4_DE.md#ta4-laser) - - [Wasserstoff](./manual_ta4_DE.md#wasserstoff) - - [Elektrolyseur](./manual_ta4_DE.md#elektrolyseur) - - [Brennstoffzelle](./manual_ta4_DE.md#brennstoffzelle) - - [Chemischer Reaktor / chemical reactor](./manual_ta4_DE.md#chemischer-reaktor--chemical-reactor) - - [TA4 Dosierer / doser](./manual_ta4_DE.md#ta4-dosierer--doser) - - [TA4 Reaktor / reactor](./manual_ta4_DE.md#ta4-reaktor--reactor) - - [TA4 Einfüllstutzen / fillerpipe](./manual_ta4_DE.md#ta4-einfüllstutzen--fillerpipe) - - [TA4 Reaktorständer / reactor stand](./manual_ta4_DE.md#ta4-reaktorständer--reactor-stand) - - [TA4 Reaktorsockel / reactor base](./manual_ta4_DE.md#ta4-reaktorsockel--reactor-base) - - [TA4 Silo / silo](./manual_ta4_DE.md#ta4-silo--silo) - - [ICTA Controller](./manual_ta4_DE.md#icta-controller) - - [TA4 ICTA Controller](./manual_ta4_DE.md#ta4-icta-controller) - - [Batterie](./manual_ta4_DE.md#batterie) - - [TA4 Display](./manual_ta4_DE.md#ta4-display) - - [TA4 Display XL](./manual_ta4_DE.md#ta4-display-xl) - - [TA4 Signal Tower](./manual_ta4_DE.md#ta4-signal-tower) - - [TA4 Lua Controller](./manual_ta4_DE.md#ta4-lua-controller) - - [TA4 Lua Server](./manual_ta4_DE.md#ta4-lua-server) - - [TA4 Sensor Kiste/Chest](./manual_ta4_DE.md#ta4-sensor-kistechest) - - [TA4 Lua Controller Terminal](./manual_ta4_DE.md#ta4-lua-controller-terminal) - - [TA4 Logik-/Schalt-Module](./manual_ta4_DE.md#ta4-logik-schalt-module) - - [TA4 Taster/Schalter / Button/Switch](./manual_ta4_DE.md#ta4-tasterschalter--buttonswitch) - - [TA4 2x Taster / 2x Button](./manual_ta4_DE.md#ta4-2x-taster--2x-button) - - [TA4 4x Taster / 4x Button](./manual_ta4_DE.md#ta4-4x-taster--4x-button) - - [TA4 2x Signallampe / 2x Signal Lamp](./manual_ta4_DE.md#ta4-2x-signallampe--2x-signal-lamp) - - [TA4 4x Signallampe / 4x Signal Lamp](./manual_ta4_DE.md#ta4-4x-signallampe--4x-signal-lamp) - - [TA4 Spieler Detektor / Player Detector](./manual_ta4_DE.md#ta4-spieler-detektor--player-detector) - - [TA4 Zustandssammler / State Collector](./manual_ta4_DE.md#ta4-zustandssammler--state-collector) - - [TA4 Detektor / Detector](./manual_ta4_DE.md#ta4-detektor--detector) - - [TA4 Block Detektor / Node Detector](./manual_ta4_DE.md#ta4-block-detektor--node-detector) - - [TA4 Energiespeicher-Ladungsdetektor / Energy Storage Charge Detector](./manual_ta4_DE.md#ta4-energiespeicher-ladungsdetektor--energy-storage-charge-detector) - - [TA4 Blicksensor / Gaze Sensor](./manual_ta4_DE.md#ta4-blicksensor--gaze-sensor) - - [TA4 Sequenzer](./manual_ta4_DE.md#ta4-sequenzer) - - [Move/Dreh-Controller](./manual_ta4_DE.md#movedreh-controller) - - [TA4 Move Controller](./manual_ta4_DE.md#ta4-move-controller) - - [TA4 Drehcontroller / Turn Controller](./manual_ta4_DE.md#ta4-drehcontroller--turn-controller) - - [TA4 Lampen](./manual_ta4_DE.md#ta4-lampen) - - [TA4 LED Pflanzenlampe / TA4 LED Grow Light](./manual_ta4_DE.md#ta4-led-pflanzenlampe--ta4-led-grow-light) - - [TA4 LED Straßenlampe / TA4 LED Street Lamp](./manual_ta4_DE.md#ta4-led-straßenlampe--ta4-led-street-lamp) - - [TA4 LED Industrielampe / TA4 LED Industrial Lamp](./manual_ta4_DE.md#ta4-led-industrielampe--ta4-led-industrial-lamp) - - [TA4 Flüssigkeitsfilter](./manual_ta4_DE.md#ta4-flüssigkeitsfilter) - - [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 Rezept Block](./manual_ta4_DE.md#ta4-rezept-block) - - [TA4 Autocrafter](./manual_ta4_DE.md#ta4-autocrafter) - - [TA4 Tank / TA4 Tank](./manual_ta4_DE.md#ta4-tank--ta4-tank) - - [TA4 Pumpe / TA4 Pump](./manual_ta4_DE.md#ta4-pumpe--ta4-pump) - - [TA4 Ofenheizung / furnace heater](./manual_ta4_DE.md#ta4-ofenheizung--furnace-heater) - - [TA4 Wasserpumpe / Water Pump (veraltet)](./manual_ta4_DE.md#ta4-wasserpumpe--water-pump-(veraltet)) - - [TA4 Wassereinlass / TA4 Water Inlet](./manual_ta4_DE.md#ta4-wassereinlass--ta4-water-inlet) - - [TA4 Röhren / TA4 Tube](./manual_ta4_DE.md#ta4-röhren--ta4-tube) - - [TA4 Schieber / Pusher](./manual_ta4_DE.md#ta4-schieber--pusher) - - [TA4 Kiste / TA4 Chest](./manual_ta4_DE.md#ta4-kiste--ta4-chest) - - [TA4 8x2000 Kiste / TA4 8x2000 Chest](./manual_ta4_DE.md#ta4-8x2000-kiste--ta4-8x2000-chest) - - [TA4 Verteiler / Distributor](./manual_ta4_DE.md#ta4-verteiler--distributor) - - [TA4 Hochleistungs-Verteiler / High Performance Distributor](./manual_ta4_DE.md#ta4-hochleistungs-verteiler--high-performance-distributor) - - [TA4 Kiessieb / Gravel Sieve](./manual_ta4_DE.md#ta4-kiessieb--gravel-sieve) - - [TA4 Mühle / Grinder](./manual_ta4_DE.md#ta4-mühle--grinder) - - [TA4 Steinbrecher / Quarry](./manual_ta4_DE.md#ta4-steinbrecher--quarry) - - [TA4 Elektronikfabrik / Electronic Fab](./manual_ta4_DE.md#ta4-elektronikfabrik--electronic-fab) - - [TA4 Injektor / Injector](./manual_ta4_DE.md#ta4-injektor--injector) - - [TA4 Recycler](./manual_ta4_DE.md#ta4-recycler) - - [TA4 Item Durchlaufbegrenzer / Item Flow Limiter](./manual_ta4_DE.md#ta4-item-durchlaufbegrenzer--item-flow-limiter) -- [TA5: Zukunft](./manual_ta5_DE.md#ta5:-zukunft) - - [Energiequellen](./manual_ta5_DE.md#energiequellen) - - [TA5 Fusionsreaktor](./manual_ta5_DE.md#ta5-fusionsreaktor) - - [TA5 Fusionreaktor Magnet](./manual_ta5_DE.md#ta5-fusionreaktor-magnet) - - [TA5 Pumpe](./manual_ta5_DE.md#ta5-pumpe) - - [TA5 Wärmetauscher](./manual_ta5_DE.md#ta5-wärmetauscher) - - [TA5 Fusionreaktor Controller](./manual_ta5_DE.md#ta5-fusionreaktor-controller) - - [TA5 Fusionreaktor Hülle](./manual_ta5_DE.md#ta5-fusionreaktor-hülle) - - [TA5 Fusionreaktor Kern](./manual_ta5_DE.md#ta5-fusionreaktor-kern) - - [Energiespeicher](./manual_ta5_DE.md#energiespeicher) - - [TA5 Hybrid-Speicher (geplant)](./manual_ta5_DE.md#ta5-hybrid-speicher-(geplant)) - - [Logik Blöcke](./manual_ta5_DE.md#logik-blöcke) - - [Transport und Verkehr](./manual_ta5_DE.md#transport-und-verkehr) - - [TA5 Flug Controller](./manual_ta5_DE.md#ta5-flug-controller) - - [TA5 Hyperloop Kiste / TA5 Hyperloop Chest](./manual_ta5_DE.md#ta5-hyperloop-kiste--ta5-hyperloop-chest) - - [TA5 Hyperloop Tank / TA5 Hyperloop Tank](./manual_ta5_DE.md#ta5-hyperloop-tank--ta5-hyperloop-tank) - - [TA5-Raumgleiter (geplant)](./manual_ta5_DE.md#ta5-raumgleiter-(geplant)) - - [Teleport Blöcke](./manual_ta5_DE.md#teleport-blöcke) - - [TA5 Teleport Block Gegenstände / TA5 Teleport Block Items](./manual_ta5_DE.md#ta5-teleport-block-gegenstände--ta5-teleport-block-items) - - [TA5 Teleport Block Flüssigkeiten / TA5 Teleport Block Liquids](./manual_ta5_DE.md#ta5-teleport-block-flüssigkeiten--ta5-teleport-block-liquids) - - [Hyperloop Teleport Blöcke (geplant)](./manual_ta5_DE.md#hyperloop-teleport-blöcke-(geplant)) - - [Weitere TA5 Blöcke/Items](./manual_ta5_DE.md#weitere-ta5-blöckeitems) - - [TA5 Container (geplant)](./manual_ta5_DE.md#ta5-container-(geplant)) - - [TA5 KI Chip / TA5 AI Chip](./manual_ta5_DE.md#ta5-ki-chip--ta5-ai-chip) - - [TA5 KI Chip II / TA5 AI Chip II](./manual_ta5_DE.md#ta5-ki-chip-ii--ta5-ai-chip-ii) \ No newline at end of file diff --git a/techage/manuals/toc_EN.md b/techage/manuals/toc_EN.md deleted file mode 100644 index 52c10de..0000000 --- a/techage/manuals/toc_EN.md +++ /dev/null @@ -1,261 +0,0 @@ -# Table of Contents - -- [Tech Age Mod](./manual_EN.md#tech-age-mod) - - [Hints](./manual_EN.md#hints) - - [Changes from version 1.0](./manual_EN.md#changes-from-version-1.0) - - [Tips on switching](./manual_EN.md#tips-on-switching) - - [Ores and Minerals](./manual_EN.md#ores-and-minerals) - - [Meridium](./manual_EN.md#meridium) - - [Usmium](./manual_EN.md#usmium) - - [Baborium](./manual_EN.md#baborium) - - [Petroleum](./manual_EN.md#petroleum) - - [Bauxite](./manual_EN.md#bauxite) - - [Basalt](./manual_EN.md#basalt) - - [History](./manual_EN.md#history) -- [TA1: Iron Age](./manual_ta1_EN.md#ta1:-iron-age) - - [Charcoal Pile (charcoal burner)](./manual_ta1_EN.md#charcoal-pile-(charcoal-burner)) - - [Melting Furnace](./manual_ta1_EN.md#melting-furnace) - - [Watermill](./manual_ta1_EN.md#watermill) - - [TA1 mill](./manual_ta1_EN.md#ta1-mill) - - [TA1 sluice gate](./manual_ta1_EN.md#ta1-sluice-gate) - - [TA1 sluice handle](./manual_ta1_EN.md#ta1-sluice-handle) - - [TA1 Apple Wood Board](./manual_ta1_EN.md#ta1-apple-wood-board) - - [TA1 Apple Millrace Board](./manual_ta1_EN.md#ta1-apple-millrace-board) - - [Ores and Tools](./manual_ta1_EN.md#ores-and-tools) - - [Hammer](./manual_ta1_EN.md#hammer) - - [Gravel Sieve](./manual_ta1_EN.md#gravel-sieve) - - [Hopper](./manual_ta1_EN.md#hopper) - - [Gravel seven with the hopper](./manual_ta1_EN.md#gravel-seven-with-the-hopper) - - [Meridium](./manual_ta1_EN.md#meridium) -- [TA2: Steam Age](./manual_ta2_EN.md#ta2:-steam-age) - - [Steam Engine](./manual_ta2_EN.md#steam-engine) - - [TA2 Firebox](./manual_ta2_EN.md#ta2-firebox) - - [TA2 Boiler](./manual_ta2_EN.md#ta2-boiler) - - [TA2 Cylinder](./manual_ta2_EN.md#ta2-cylinder) - - [TA2 Flywheel](./manual_ta2_EN.md#ta2-flywheel) - - [TA2 Steam Pipes](./manual_ta2_EN.md#ta2-steam-pipes) - - [TA2 Drive Axle / TA2 Gearbox](./manual_ta2_EN.md#ta2-drive-axle--ta2-gearbox) - - [TA2 Power Generator](./manual_ta2_EN.md#ta2-power-generator) - - [TA2 energy storage](./manual_ta2_EN.md#ta2-energy-storage) - - [TA2 Winch](./manual_ta2_EN.md#ta2-winch) - - [TA2 Weight Chest](./manual_ta2_EN.md#ta2-weight-chest) - - [Push and sort items](./manual_ta2_EN.md#push-and-sort-items) - - [TechAge Tube](./manual_ta2_EN.md#techage-tube) - - [Tube Concentrator](./manual_ta2_EN.md#tube-concentrator) - - [TA2 Pusher](./manual_ta2_EN.md#ta2-pusher) - - [TA2 Distributor](./manual_ta2_EN.md#ta2-distributor) - - [Gravel washer](./manual_ta2_EN.md#gravel-washer) - - [TA2 Gravel Rinser](./manual_ta2_EN.md#ta2-gravel-rinser) - - [Dig stone\\, grind and sieve](./manual_ta2_EN.md#dig-stone\\,-grind-and-sieve) - - [TA2 Quarry](./manual_ta2_EN.md#ta2-quarry) - - [TA2 Grinder](./manual_ta2_EN.md#ta2-grinder) - - [TA2 Gravel Sieve](./manual_ta2_EN.md#ta2-gravel-sieve) - - [Produce Items](./manual_ta2_EN.md#produce-items) - - [TA2 Autocrafter](./manual_ta2_EN.md#ta2-autocrafter) - - [TA2 Electronic Fab](./manual_ta2_EN.md#ta2-electronic-fab) - - [Other blocks](./manual_ta2_EN.md#other-blocks) - - [TA2 Liquid Sampler](./manual_ta2_EN.md#ta2-liquid-sampler) - - [TA2 Protected Chest](./manual_ta2_EN.md#ta2-protected-chest) - - [Techage Forceload Block](./manual_ta2_EN.md#techage-forceload-block) -- [TA3: Oil Age](./manual_ta3_EN.md#ta3:-oil-age) - - [Coal-fired Power Station / Oil-fired Power Station](./manual_ta3_EN.md#coal-fired-power-station--oil-fired-power-station) - - [TA3 power station firebox](./manual_ta3_EN.md#ta3-power-station-firebox) - - [TA3 Power Station Oil Burner](./manual_ta3_EN.md#ta3-power-station-oil-burner) - - [TA3 boiler base / top](./manual_ta3_EN.md#ta3-boiler-base--top) - - [TA3 turbine](./manual_ta3_EN.md#ta3-turbine) - - [TA3 generator](./manual_ta3_EN.md#ta3-generator) - - [TA3 cooler](./manual_ta3_EN.md#ta3-cooler) - - [Electrical current](./manual_ta3_EN.md#electrical-current) - - [Importance of storage systems](./manual_ta3_EN.md#importance-of-storage-systems) - - [TA Electric Cable](./manual_ta3_EN.md#ta-electric-cable) - - [TA Electric Junction Box](./manual_ta3_EN.md#ta-electric-junction-box) - - [TA Power Line](./manual_ta3_EN.md#ta-power-line) - - [TA Power Pole](./manual_ta3_EN.md#ta-power-pole) - - [TA Power Pole Top](./manual_ta3_EN.md#ta-power-pole-top) - - [TA Power Pole Top 2](./manual_ta3_EN.md#ta-power-pole-top-2) - - [TA Power Switch](./manual_ta3_EN.md#ta-power-switch) - - [TA Power Switch Small](./manual_ta3_EN.md#ta-power-switch-small) - - [TA Power Switch Box](./manual_ta3_EN.md#ta-power-switch-box) - - [TA3 Small Power Generator](./manual_ta3_EN.md#ta3-small-power-generator) - - [TA3 Battery Block](./manual_ta3_EN.md#ta3-battery-block) - - [TA3 Power Terminal](./manual_ta3_EN.md#ta3-power-terminal) - - [TA3 Electric Motor](./manual_ta3_EN.md#ta3-electric-motor) - - [TA3 Industrial Furnace](./manual_ta3_EN.md#ta3-industrial-furnace) - - [TA3 Furnace Oil Burner](./manual_ta3_EN.md#ta3-furnace-oil-burner) - - [TA3 Furnace Top](./manual_ta3_EN.md#ta3-furnace-top) - - [TA3 Booster](./manual_ta3_EN.md#ta3-booster) - - [Liquids](./manual_ta3_EN.md#liquids) - - [TA3 Tank](./manual_ta3_EN.md#ta3-tank) - - [TA3 Pump](./manual_ta3_EN.md#ta3-pump) - - [TA Liquid Filler](./manual_ta3_EN.md#ta-liquid-filler) - - [TA4 Pipe](./manual_ta3_EN.md#ta4-pipe) - - [TA3 Pipe Wall Entry Blocks](./manual_ta3_EN.md#ta3-pipe-wall-entry-blocks) - - [TA Valve](./manual_ta3_EN.md#ta-valve) - - [Oil Production](./manual_ta3_EN.md#oil-production) - - [TA3 Oil Explorer](./manual_ta3_EN.md#ta3-oil-explorer) - - [TA3 Oil Drill Box](./manual_ta3_EN.md#ta3-oil-drill-box) - - [TA3 Oil Pumpjack](./manual_ta3_EN.md#ta3-oil-pumpjack) - - [TA3 Drill Pipe](./manual_ta3_EN.md#ta3-drill-pipe) - - [Oil tank](./manual_ta3_EN.md#oil-tank) - - [Oil Transportation](./manual_ta3_EN.md#oil-transportation) - - [Oil transportation by Tank Carts](./manual_ta3_EN.md#oil-transportation-by-tank-carts) - - [Oil transportation with barrels over Minecarts](./manual_ta3_EN.md#oil-transportation-with-barrels-over-minecarts) - - [Tank Cart](./manual_ta3_EN.md#tank-cart) - - [Chest Cart](./manual_ta3_EN.md#chest-cart) - - [Oil Processing](./manual_ta3_EN.md#oil-processing) - - [Distillation Tower](./manual_ta3_EN.md#distillation-tower) - - [Reboiler](./manual_ta3_EN.md#reboiler) - - [Logic / Switching Blocks](./manual_ta3_EN.md#logic--switching-blocks) - - [TA3 Button / Switch](./manual_ta3_EN.md#ta3-button--switch) - - [TA3 Command Converter](./manual_ta3_EN.md#ta3-command-converter) - - [TA3 Flip-Flop](./manual_ta3_EN.md#ta3-flip-flop) - - [TA3 Logic Block](./manual_ta3_EN.md#ta3-logic-block) - - [TA3 Repeater](./manual_ta3_EN.md#ta3-repeater) - - [TA3 Sequencer](./manual_ta3_EN.md#ta3-sequencer) - - [TA3 Timer](./manual_ta3_EN.md#ta3-timer) - - [TA3 Terminal](./manual_ta3_EN.md#ta3-terminal) - - [TechAge Color Lamp](./manual_ta3_EN.md#techage-color-lamp) - - [Door/Gate Blocks](./manual_ta3_EN.md#doorgate-blocks) - - [TA3 Door Controller](./manual_ta3_EN.md#ta3-door-controller) - - [TA3 Door Controller II](./manual_ta3_EN.md#ta3-door-controller-ii) - - [TA3 Sound Block](./manual_ta3_EN.md#ta3-sound-block) - - [TA3 Mesecons Converter](./manual_ta3_EN.md#ta3-mesecons-converter) - - [Detectors](./manual_ta3_EN.md#detectors) - - [TA3 Detector](./manual_ta3_EN.md#ta3-detector) - - [TA3 Cart Detector](./manual_ta3_EN.md#ta3-cart-detector) - - [TA3 Node Detector](./manual_ta3_EN.md#ta3-node-detector) - - [TA3 Player Detector](./manual_ta3_EN.md#ta3-player-detector) - - [TA3 Light Detector](./manual_ta3_EN.md#ta3-light-detector) - - [TA3 Machines](./manual_ta3_EN.md#ta3-machines) - - [TA3 Pusher](./manual_ta3_EN.md#ta3-pusher) - - [TA3 Distributor](./manual_ta3_EN.md#ta3-distributor) - - [TA3 Autocrafter](./manual_ta3_EN.md#ta3-autocrafter) - - [TA3 Electronic Fab](./manual_ta3_EN.md#ta3-electronic-fab) - - [TA3 Quarry](./manual_ta3_EN.md#ta3-quarry) - - [TA3 Gravel Sieve](./manual_ta3_EN.md#ta3-gravel-sieve) - - [TA3 Gravel Rinser](./manual_ta3_EN.md#ta3-gravel-rinser) - - [TA3 Grinder](./manual_ta3_EN.md#ta3-grinder) - - [TA3 Injector](./manual_ta3_EN.md#ta3-injector) - - [TA3 Item Flow Limiter](./manual_ta3_EN.md#ta3-item-flow-limiter) - - [Tools](./manual_ta3_EN.md#tools) - - [Techage Info Tool](./manual_ta3_EN.md#techage-info-tool) - - [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) - - [Techage Screwdriver](./manual_ta3_EN.md#techage-screwdriver) -- [TA4: Present](./manual_ta4_EN.md#ta4:-present) - - [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) - - [TA4 Wind Turbine Signal Lamp](./manual_ta4_EN.md#ta4-wind-turbine-signal-lamp) - - [TA4 Pillar](./manual_ta4_EN.md#ta4-pillar) - - [Solar System](./manual_ta4_EN.md#solar-system) - - [TA4 Solar Module](./manual_ta4_EN.md#ta4-solar-module) - - [TA4 Solar Carrier Module](./manual_ta4_EN.md#ta4-solar-carrier-module) - - [TA4 Solar Inverter](./manual_ta4_EN.md#ta4-solar-inverter) - - [TA4 Low Power Cable](./manual_ta4_EN.md#ta4-low-power-cable) - - [TA4 Low Voltage Junction Box](./manual_ta4_EN.md#ta4-low-voltage-junction-box) - - [TA4 Street Lamp Solar Cell](./manual_ta4_EN.md#ta4-street-lamp-solar-cell) - - [Thermal Energy Storage](./manual_ta4_EN.md#thermal-energy-storage) - - [TA4 Heat Exchanger](./manual_ta4_EN.md#ta4-heat-exchanger) - - [TA4 Turbine](./manual_ta4_EN.md#ta4-turbine) - - [TA4 Generator](./manual_ta4_EN.md#ta4-generator) - - [TA4 Pipe Inlet](./manual_ta4_EN.md#ta4-pipe-inlet) - - [TA4 Pipe](./manual_ta4_EN.md#ta4-pipe) - - [Power Distribution](./manual_ta4_EN.md#power-distribution) - - [TA4 Isolation Transformer](./manual_ta4_EN.md#ta4-isolation-transformer) - - [TA4 Electric Meter](./manual_ta4_EN.md#ta4-electric-meter) - - [TA4 Laser](./manual_ta4_EN.md#ta4-laser) - - [Hydrogen](./manual_ta4_EN.md#hydrogen) - - [Electrolyzer](./manual_ta4_EN.md#electrolyzer) - - [Fuel Cell](./manual_ta4_EN.md#fuel-cell) - - [Chemical Reactor](./manual_ta4_EN.md#chemical-reactor) - - [TA4 Doser](./manual_ta4_EN.md#ta4-doser) - - [TA4 Reactor](./manual_ta4_EN.md#ta4-reactor) - - [TA4 Filler Pipe](./manual_ta4_EN.md#ta4-filler-pipe) - - [TA4 Reactor Stand](./manual_ta4_EN.md#ta4-reactor-stand) - - [TA4 Reactor Base](./manual_ta4_EN.md#ta4-reactor-base) - - [TA4 Silo](./manual_ta4_EN.md#ta4-silo) - - [ICTA Controller](./manual_ta4_EN.md#icta-controller) - - [TA4 ICTA controller](./manual_ta4_EN.md#ta4-icta-controller) - - [Battery](./manual_ta4_EN.md#battery) - - [TA4 Display](./manual_ta4_EN.md#ta4-display) - - [TA4 Display XL](./manual_ta4_EN.md#ta4-display-xl) - - [TA4 Signal Tower](./manual_ta4_EN.md#ta4-signal-tower) - - [TA4 Lua Controller](./manual_ta4_EN.md#ta4-lua-controller) - - [TA4 Lua Server](./manual_ta4_EN.md#ta4-lua-server) - - [TA4 Sensor Box / Chest](./manual_ta4_EN.md#ta4-sensor-box--chest) - - [TA4 Lua Controller Terminal](./manual_ta4_EN.md#ta4-lua-controller-terminal) - - [TA4 Logic/Switching Modules](./manual_ta4_EN.md#ta4-logicswitching-modules) - - [TA4 Button/Switch](./manual_ta4_EN.md#ta4-buttonswitch) - - [TA4 2x Button](./manual_ta4_EN.md#ta4-2x-button) - - [TA4 4x Button](./manual_ta4_EN.md#ta4-4x-button) - - [TA4 2x Signal Lamp](./manual_ta4_EN.md#ta4-2x-signal-lamp) - - [TA4 4x Signal Lamp](./manual_ta4_EN.md#ta4-4x-signal-lamp) - - [TA4 Player Detector](./manual_ta4_EN.md#ta4-player-detector) - - [TA4 State Collector](./manual_ta4_EN.md#ta4-state-collector) - - [TA4 Detector](./manual_ta4_EN.md#ta4-detector) - - [TA4 Node Detector](./manual_ta4_EN.md#ta4-node-detector) - - [TA4 Energy Storage Charge Detector](./manual_ta4_EN.md#ta4-energy-storage-charge-detector) - - [TA4 Gaze Sensor](./manual_ta4_EN.md#ta4-gaze-sensor) - - [TA4 Sequencer](./manual_ta4_EN.md#ta4-sequencer) - - [Move/Turn Controller](./manual_ta4_EN.md#moveturn-controller) - - [TA4 Move Controller](./manual_ta4_EN.md#ta4-move-controller) - - [TA4 Turn Controller](./manual_ta4_EN.md#ta4-turn-controller) - - [TA4 Lamps](./manual_ta4_EN.md#ta4-lamps) - - [TA4 LED Grow Light](./manual_ta4_EN.md#ta4-led-grow-light) - - [TA4 Street Lamp](./manual_ta4_EN.md#ta4-street-lamp) - - [TA4 LED Industrial Lamp](./manual_ta4_EN.md#ta4-led-industrial-lamp) - - [TA4 Liquid Filter](./manual_ta4_EN.md#ta4-liquid-filter) - - [Base Layer](./manual_ta4_EN.md#base-layer) - - [Gravel Layer](./manual_ta4_EN.md#gravel-layer) - - [Filling Layer](./manual_ta4_EN.md#filling-layer) - - [TA4 Collider (Particle Accelerator)](./manual_ta4_EN.md#ta4-collider-(particle-accelerator)) - - [Detector](./manual_ta4_EN.md#detector) - - [Control / TA4 Terminal](./manual_ta4_EN.md#control--ta4-terminal) - - [Construction](./manual_ta4_EN.md#construction) - - [More TA4 Blocks](./manual_ta4_EN.md#more-ta4-blocks) - - [TA4 Recipe Block](./manual_ta4_EN.md#ta4-recipe-block) - - [TA4 Autocrafter](./manual_ta4_EN.md#ta4-autocrafter) - - [TA4 Tank](./manual_ta4_EN.md#ta4-tank) - - [TA4 Pump](./manual_ta4_EN.md#ta4-pump) - - [TA4 Furnace Heater](./manual_ta4_EN.md#ta4-furnace-heater) - - [TA4 Water Pump (deprecated)](./manual_ta4_EN.md#ta4-water-pump-(deprecated)) - - [TA4 Water Inlet](./manual_ta4_EN.md#ta4-water-inlet) - - [TA4 Tube](./manual_ta4_EN.md#ta4-tube) - - [TA4 Pusher](./manual_ta4_EN.md#ta4-pusher) - - [TA4 Chest](./manual_ta4_EN.md#ta4-chest) - - [TA4 8x2000 Chest](./manual_ta4_EN.md#ta4-8x2000-chest) - - [TA4 Distributor](./manual_ta4_EN.md#ta4-distributor) - - [TA4 High Performance Distributor](./manual_ta4_EN.md#ta4-high-performance-distributor) - - [TA4 Gravel Sieve](./manual_ta4_EN.md#ta4-gravel-sieve) - - [TA4 Grinder](./manual_ta4_EN.md#ta4-grinder) - - [TA4 Quarry](./manual_ta4_EN.md#ta4-quarry) - - [TA4 Electronic Fab](./manual_ta4_EN.md#ta4-electronic-fab) - - [TA4 Injector](./manual_ta4_EN.md#ta4-injector) - - [TA4 Recycler](./manual_ta4_EN.md#ta4-recycler) - - [TA4 Item Flow Limiter](./manual_ta4_EN.md#ta4-item-flow-limiter) -- [TA5: Future](./manual_ta5_EN.md#ta5:-future) - - [Energy Sources](./manual_ta5_EN.md#energy-sources) - - [TA5 Fusion Reactor](./manual_ta5_EN.md#ta5-fusion-reactor) - - [TA5 Fusion Reactor Magnet](./manual_ta5_EN.md#ta5-fusion-reactor-magnet) - - [TA5 Pump](./manual_ta5_EN.md#ta5-pump) - - [TA5 Heat Exchanger](./manual_ta5_EN.md#ta5-heat-exchanger) - - [TA5 Fusion Reactor Controller](./manual_ta5_EN.md#ta5-fusion-reactor-controller) - - [TA5 Fusion Reactor Shell](./manual_ta5_EN.md#ta5-fusion-reactor-shell) - - [TA5 Fusion Reactor Core](./manual_ta5_EN.md#ta5-fusion-reactor-core) - - [Energy Storage](./manual_ta5_EN.md#energy-storage) - - [TA5 Hybrid Storage (planned)](./manual_ta5_EN.md#ta5-hybrid-storage-(planned)) - - [Logic blocks](./manual_ta5_EN.md#logic-blocks) - - [Transport and Traffic](./manual_ta5_EN.md#transport-and-traffic) - - [TA5 Flight Controller](./manual_ta5_EN.md#ta5-flight-controller) - - [TA5 Hyperloop Chest](./manual_ta5_EN.md#ta5-hyperloop-chest) - - [TA5 Hyperloop Tank](./manual_ta5_EN.md#ta5-hyperloop-tank) - - [Teleport Blocks](./manual_ta5_EN.md#teleport-blocks) - - [TA5 Teleport Block Items](./manual_ta5_EN.md#ta5-teleport-block-items) - - [TA5 Teleport Block Liquids](./manual_ta5_EN.md#ta5-teleport-block-liquids) - - [Hyperloop Teleport Blocks (planned)](./manual_ta5_EN.md#hyperloop-teleport-blocks-(planned)) - - [More TA5 Blocks/Items](./manual_ta5_EN.md#more-ta5-blocksitems) - - [TA5 Container (planned)](./manual_ta5_EN.md#ta5-container-(planned)) - - [TA5 AI Chip](./manual_ta5_EN.md#ta5-ai-chip) - - [TA5 AI Chip II](./manual_ta5_EN.md#ta5-ai-chip-ii) \ No newline at end of file diff --git a/techage/mod.conf b/techage/mod.conf deleted file mode 100644 index 8f76061..0000000 --- a/techage/mod.conf +++ /dev/null @@ -1,5 +0,0 @@ -name = techage -depends = default,doors,flowers,tubelib2,networks,basic_materials,bucket,stairs,screwdriver,minecart,lcdlib,safer_lua,doclib -optional_depends = unified_inventory,wielded_light,unifieddyes,moreores,ethereal,mesecons,mesecons_materials,mesecons_mvps,digtron,bakedclay,moreblocks,i3,creative,craftguide,farming -description = Techage, go through 5 tech ages in search of wealth and power! -supported_games = minetest_game diff --git a/techage/models/size.py b/techage/models/size.py deleted file mode 100644 index 620294c..0000000 --- a/techage/models/size.py +++ /dev/null @@ -1,9 +0,0 @@ -lOut = [] -for line in file("techage_boiler_large.obj"): - words = line.split(" ") - if words[0] == "v": - words[1] = "%1.6f" % (float(words[1]) * 1.2) - words[3] = "%1.6f" % (float(words[3]) * 1.2) - line = " ".join(words) - lOut.append(line.strip()) -file("techage_boiler_bigger.obj", "wt").write("\n".join(lOut)) diff --git a/techage/models/techage_cylinder_07.obj b/techage/models/techage_cylinder_07.obj deleted file mode 100644 index 2bd0f8a..0000000 --- a/techage/models/techage_cylinder_07.obj +++ /dev/null @@ -1,124 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: 'oven.blend' -# www.blender.org -o Cylinder -v 0.000000 -0.500000 -0.360000 -v 0.000000 0.500000 -0.360000 -v 0.137766 -0.500000 -0.332597 -v 0.137766 0.500000 -0.332597 -v 0.254558 -0.500000 -0.254558 -v 0.254558 0.500000 -0.254558 -v 0.332597 -0.500000 -0.137766 -v 0.332597 0.500000 -0.137766 -v 0.360000 -0.500000 0.000000 -v 0.360000 0.500000 0.000000 -v 0.332597 -0.500000 0.137766 -v 0.332597 0.500000 0.137766 -v 0.254558 -0.500000 0.254558 -v 0.254558 0.500000 0.254558 -v 0.137766 -0.500000 0.332597 -v 0.137766 0.500000 0.332597 -v 0.000000 -0.500000 0.360000 -v 0.000000 0.500000 0.360000 -v -0.137766 -0.500000 0.332597 -v -0.137766 0.500000 0.332597 -v -0.254558 -0.500000 0.254559 -v -0.254558 0.500000 0.254559 -v -0.332597 -0.500000 0.137766 -v -0.332597 0.500000 0.137766 -v -0.360000 -0.500000 -0.000000 -v -0.360000 0.500000 -0.000000 -v -0.332597 -0.500000 -0.137766 -v -0.332597 0.500000 -0.137766 -v -0.254558 -0.500000 -0.254559 -v -0.254558 0.500000 -0.254559 -v -0.137766 -0.500000 -0.332597 -v -0.137766 0.500000 -0.332597 -vt 0.5486 0.5000 -vt 0.5486 1.0000 -vt 0.4725 1.0000 -vt 0.4725 0.5000 -vt 0.4142 1.0000 -vt 0.4142 0.5000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.9239 1.0000 -vt 0.9239 0.5000 -vt 0.8415 1.0000 -vt 0.8415 0.5000 -vt 0.7654 1.0000 -vt 0.7654 0.5000 -vt 0.4142 0.5000 -vt 0.4142 0.0000 -vt 0.4725 0.0000 -vt 0.4725 0.5000 -vt 0.5486 0.0000 -vt 0.5486 0.5000 -vt 0.6310 0.0000 -vt 0.6310 0.5000 -vt 0.7071 0.0000 -vt 0.7071 0.5000 -vt 0.7654 0.0000 -vt 0.7654 0.5000 -vt 0.8415 0.0000 -vt 0.8415 0.5000 -vt 0.9239 0.0000 -vt 0.9239 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.7654 0.5000 -vt 0.7654 1.0000 -vt 0.7071 1.0000 -vt 0.7071 0.5000 -vt 0.3244 0.4749 -vt 0.3827 0.5370 -vt 0.4142 0.6181 -vt 0.4142 0.7059 -vt 0.3827 0.7870 -vt 0.3244 0.8491 -vt 0.2483 0.8827 -vt 0.1659 0.8827 -vt 0.0898 0.8491 -vt 0.0315 0.7870 -vt 0.0000 0.7059 -vt 0.0000 0.6181 -vt 0.0315 0.5370 -vt 0.0898 0.4749 -vt 0.1659 0.4414 -vt 0.2483 0.4414 -vt 0.6310 1.0000 -vt 0.6310 0.5000 -vt 0.0000 0.2646 -vt 0.0000 0.1768 -vt 0.0315 0.0957 -vt 0.0898 0.0336 -vt 0.1659 0.0000 -vt 0.2483 0.0000 -vt 0.3244 0.0336 -vt 0.3827 0.0957 -vt 0.4142 0.1768 -vt 0.4142 0.2646 -vt 0.3827 0.3457 -vt 0.3244 0.4078 -vt 0.2483 0.4414 -vt 0.1659 0.4414 -vt 0.0898 0.4078 -vt 0.0315 0.3457 -s off -f 1/1 2/2 4/3 3/4 -f 3/4 4/3 6/5 5/6 -f 5/7 6/8 8/9 7/10 -f 7/10 8/9 10/11 9/12 -f 9/12 10/11 12/13 11/14 -f 11/15 12/16 14/17 13/18 -f 13/18 14/17 16/19 15/20 -f 15/20 16/19 18/21 17/22 -f 17/22 18/21 20/23 19/24 -f 19/24 20/23 22/25 21/26 -f 21/26 22/25 24/27 23/28 -f 23/28 24/27 26/29 25/30 -f 25/30 26/29 28/31 27/32 -f 27/33 28/34 30/35 29/36 -f 4/37 2/38 32/39 30/40 28/41 26/42 24/43 22/44 20/45 18/46 16/47 14/48 12/49 10/50 8/51 6/52 -f 29/36 30/35 32/53 31/54 -f 31/54 32/53 2/2 1/1 -f 1/55 3/56 5/57 7/58 9/59 11/60 13/61 15/62 17/63 19/64 21/65 23/66 25/67 27/68 29/69 31/70 \ No newline at end of file diff --git a/techage/models/techage_cylinder_09.obj b/techage/models/techage_cylinder_09.obj deleted file mode 100644 index ab56cfb..0000000 --- a/techage/models/techage_cylinder_09.obj +++ /dev/null @@ -1,124 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: 'test.blend' -# www.blender.org -o Cylinder -v 0.000000 -0.500000 -0.450000 -v 0.000000 0.500000 -0.450000 -v 0.172208 -0.500000 -0.415746 -v 0.172208 0.500000 -0.415746 -v 0.318198 -0.500000 -0.318198 -v 0.318198 0.500000 -0.318198 -v 0.415746 -0.500000 -0.172208 -v 0.415746 0.500000 -0.172208 -v 0.450000 -0.500000 0.000000 -v 0.450000 0.500000 0.000000 -v 0.415746 -0.500000 0.172208 -v 0.415746 0.500000 0.172208 -v 0.318198 -0.500000 0.318198 -v 0.318198 0.500000 0.318198 -v 0.172208 -0.500000 0.415746 -v 0.172208 0.500000 0.415746 -v 0.000000 -0.500000 0.450000 -v 0.000000 0.500000 0.450000 -v -0.172207 -0.500000 0.415746 -v -0.172207 0.500000 0.415746 -v -0.318198 -0.500000 0.318198 -v -0.318198 0.500000 0.318198 -v -0.415746 -0.500000 0.172208 -v -0.415746 0.500000 0.172208 -v -0.450000 -0.500000 -0.000000 -v -0.450000 0.500000 -0.000000 -v -0.415746 -0.500000 -0.172208 -v -0.415746 0.500000 -0.172208 -v -0.318198 -0.500000 -0.318198 -v -0.318198 0.500000 -0.318198 -v -0.172207 -0.500000 -0.415746 -v -0.172207 0.500000 -0.415746 -vt 0.5486 0.5000 -vt 0.5486 1.0000 -vt 0.4725 1.0000 -vt 0.4725 0.5000 -vt 0.4142 1.0000 -vt 0.4142 0.5000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.9239 1.0000 -vt 0.9239 0.5000 -vt 0.8415 1.0000 -vt 0.8415 0.5000 -vt 0.7654 1.0000 -vt 0.7654 0.5000 -vt 0.4142 0.5000 -vt 0.4142 0.0000 -vt 0.4725 0.0000 -vt 0.4725 0.5000 -vt 0.5486 0.0000 -vt 0.5486 0.5000 -vt 0.6310 0.0000 -vt 0.6310 0.5000 -vt 0.7071 0.0000 -vt 0.7071 0.5000 -vt 0.7654 0.0000 -vt 0.7654 0.5000 -vt 0.8415 0.0000 -vt 0.8415 0.5000 -vt 0.9239 0.0000 -vt 0.9239 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.7654 0.5000 -vt 0.7654 1.0000 -vt 0.7071 1.0000 -vt 0.7071 0.5000 -vt 0.3244 0.4749 -vt 0.3827 0.5370 -vt 0.4142 0.6181 -vt 0.4142 0.7059 -vt 0.3827 0.7870 -vt 0.3244 0.8491 -vt 0.2483 0.8827 -vt 0.1659 0.8827 -vt 0.0898 0.8491 -vt 0.0315 0.7870 -vt 0.0000 0.7059 -vt 0.0000 0.6181 -vt 0.0315 0.5370 -vt 0.0898 0.4749 -vt 0.1659 0.4414 -vt 0.2483 0.4414 -vt 0.6310 1.0000 -vt 0.6310 0.5000 -vt 0.0000 0.2646 -vt 0.0000 0.1768 -vt 0.0315 0.0957 -vt 0.0898 0.0336 -vt 0.1659 0.0000 -vt 0.2483 0.0000 -vt 0.3244 0.0336 -vt 0.3827 0.0957 -vt 0.4142 0.1768 -vt 0.4142 0.2646 -vt 0.3827 0.3457 -vt 0.3244 0.4078 -vt 0.2483 0.4414 -vt 0.1659 0.4414 -vt 0.0898 0.4078 -vt 0.0315 0.3457 -s off -f 1/1 2/2 4/3 3/4 -f 3/4 4/3 6/5 5/6 -f 5/7 6/8 8/9 7/10 -f 7/10 8/9 10/11 9/12 -f 9/12 10/11 12/13 11/14 -f 11/15 12/16 14/17 13/18 -f 13/18 14/17 16/19 15/20 -f 15/20 16/19 18/21 17/22 -f 17/22 18/21 20/23 19/24 -f 19/24 20/23 22/25 21/26 -f 21/26 22/25 24/27 23/28 -f 23/28 24/27 26/29 25/30 -f 25/30 26/29 28/31 27/32 -f 27/33 28/34 30/35 29/36 -f 4/37 2/38 32/39 30/40 28/41 26/42 24/43 22/44 20/45 18/46 16/47 14/48 12/49 10/50 8/51 6/52 -f 29/36 30/35 32/53 31/54 -f 31/54 32/53 2/2 1/1 -f 1/55 3/56 5/57 7/58 9/59 11/60 13/61 15/62 17/63 19/64 21/65 23/66 25/67 27/68 29/69 31/70 diff --git a/techage/models/techage_cylinder_12.obj b/techage/models/techage_cylinder_12.obj deleted file mode 100644 index ac86532..0000000 --- a/techage/models/techage_cylinder_12.obj +++ /dev/null @@ -1,124 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: 'oven.blend' -# www.blender.org -o Cylinder -v 0.000000 -0.500000 -0.600000 -v 0.000000 0.500000 -0.600000 -v 0.229610 -0.500000 -0.554328 -v 0.229610 0.500000 -0.554328 -v 0.424264 -0.500000 -0.424264 -v 0.424264 0.500000 -0.424264 -v 0.554328 -0.500000 -0.229610 -v 0.554328 0.500000 -0.229610 -v 0.600000 -0.500000 0.000000 -v 0.600000 0.500000 0.000000 -v 0.554328 -0.500000 0.229610 -v 0.554328 0.500000 0.229610 -v 0.424264 -0.500000 0.424264 -v 0.424264 0.500000 0.424264 -v 0.229610 -0.500000 0.554328 -v 0.229610 0.500000 0.554328 -v 0.000000 -0.500000 0.600000 -v 0.000000 0.500000 0.600000 -v -0.229610 -0.500000 0.554328 -v -0.229610 0.500000 0.554328 -v -0.424264 -0.500000 0.424264 -v -0.424264 0.500000 0.424264 -v -0.554328 -0.500000 0.229610 -v -0.554328 0.500000 0.229610 -v -0.600000 -0.500000 -0.000000 -v -0.600000 0.500000 -0.000000 -v -0.554328 -0.500000 -0.229610 -v -0.554328 0.500000 -0.229610 -v -0.424264 -0.500000 -0.424264 -v -0.424264 0.500000 -0.424264 -v -0.229610 -0.500000 -0.554328 -v -0.229610 0.500000 -0.554328 -vt 0.5486 0.5000 -vt 0.5486 1.0000 -vt 0.4725 1.0000 -vt 0.4725 0.5000 -vt 0.4142 1.0000 -vt 0.4142 0.5000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.9239 1.0000 -vt 0.9239 0.5000 -vt 0.8415 1.0000 -vt 0.8415 0.5000 -vt 0.7654 1.0000 -vt 0.7654 0.5000 -vt 0.4142 0.5000 -vt 0.4142 0.0000 -vt 0.4725 0.0000 -vt 0.4725 0.5000 -vt 0.5486 0.0000 -vt 0.5486 0.5000 -vt 0.6310 0.0000 -vt 0.6310 0.5000 -vt 0.7071 0.0000 -vt 0.7071 0.5000 -vt 0.7654 0.0000 -vt 0.7654 0.5000 -vt 0.8415 0.0000 -vt 0.8415 0.5000 -vt 0.9239 0.0000 -vt 0.9239 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.7654 0.5000 -vt 0.7654 1.0000 -vt 0.7071 1.0000 -vt 0.7071 0.5000 -vt 0.3244 0.4749 -vt 0.3827 0.5370 -vt 0.4142 0.6181 -vt 0.4142 0.7059 -vt 0.3827 0.7870 -vt 0.3244 0.8491 -vt 0.2483 0.8827 -vt 0.1659 0.8827 -vt 0.0898 0.8491 -vt 0.0315 0.7870 -vt 0.0000 0.7059 -vt 0.0000 0.6181 -vt 0.0315 0.5370 -vt 0.0898 0.4749 -vt 0.1659 0.4414 -vt 0.2483 0.4414 -vt 0.6310 1.0000 -vt 0.6310 0.5000 -vt 0.0000 0.2646 -vt 0.0000 0.1768 -vt 0.0315 0.0957 -vt 0.0898 0.0336 -vt 0.1659 0.0000 -vt 0.2483 0.0000 -vt 0.3244 0.0336 -vt 0.3827 0.0957 -vt 0.4142 0.1768 -vt 0.4142 0.2646 -vt 0.3827 0.3457 -vt 0.3244 0.4078 -vt 0.2483 0.4414 -vt 0.1659 0.4414 -vt 0.0898 0.4078 -vt 0.0315 0.3457 -s off -f 1/1 2/2 4/3 3/4 -f 3/4 4/3 6/5 5/6 -f 5/7 6/8 8/9 7/10 -f 7/10 8/9 10/11 9/12 -f 9/12 10/11 12/13 11/14 -f 11/15 12/16 14/17 13/18 -f 13/18 14/17 16/19 15/20 -f 15/20 16/19 18/21 17/22 -f 17/22 18/21 20/23 19/24 -f 19/24 20/23 22/25 21/26 -f 21/26 22/25 24/27 23/28 -f 23/28 24/27 26/29 25/30 -f 25/30 26/29 28/31 27/32 -f 27/33 28/34 30/35 29/36 -f 4/37 2/38 32/39 30/40 28/41 26/42 24/43 22/44 20/45 18/46 16/47 14/48 12/49 10/50 8/51 6/52 -f 29/36 30/35 32/53 31/54 -f 31/54 32/53 2/2 1/1 -f 1/55 3/56 5/57 7/58 9/59 11/60 13/61 15/62 17/63 19/64 21/65 23/66 25/67 27/68 29/69 31/70 diff --git a/techage/models/techage_cylinder_12h.obj b/techage/models/techage_cylinder_12h.obj deleted file mode 100644 index 0103304..0000000 --- a/techage/models/techage_cylinder_12h.obj +++ /dev/null @@ -1,124 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: 'oven.blend' -# www.blender.org -o Cylinder -v 0.000000 -0.750000 -0.600000 -v 0.000000 1.0 -0.600000 -v 0.229610 -0.750000 -0.554328 -v 0.229610 1.0 -0.554328 -v 0.424264 -0.750000 -0.424264 -v 0.424264 1.0 -0.424264 -v 0.554328 -0.750000 -0.229610 -v 0.554328 1.0 -0.229610 -v 0.600000 -0.750000 0.000000 -v 0.600000 1.0 0.000000 -v 0.554328 -0.750000 0.229610 -v 0.554328 1.0 0.229610 -v 0.424264 -0.750000 0.424264 -v 0.424264 1.0 0.424264 -v 0.229610 -0.750000 0.554328 -v 0.229610 1.0 0.554328 -v 0.000000 -0.750000 0.600000 -v 0.000000 1.0 0.600000 -v -0.229610 -0.750000 0.554328 -v -0.229610 1.0 0.554328 -v -0.424264 -0.750000 0.424264 -v -0.424264 1.0 0.424264 -v -0.554328 -0.750000 0.229610 -v -0.554328 1.0 0.229610 -v -0.600000 -0.750000 -0.000000 -v -0.600000 1.0 -0.000000 -v -0.554328 -0.750000 -0.229610 -v -0.554328 1.0 -0.229610 -v -0.424264 -0.750000 -0.424264 -v -0.424264 1.0 -0.424264 -v -0.229610 -0.750000 -0.554328 -v -0.229610 1.0 -0.554328 -vt 0.5486 0.5000 -vt 0.5486 1.0000 -vt 0.4725 1.0000 -vt 0.4725 0.5000 -vt 0.4142 1.0000 -vt 0.4142 0.5000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.9239 1.0000 -vt 0.9239 0.5000 -vt 0.8415 1.0000 -vt 0.8415 0.5000 -vt 0.7654 1.0000 -vt 0.7654 0.5000 -vt 0.4142 0.5000 -vt 0.4142 0.0000 -vt 0.4725 0.0000 -vt 0.4725 0.5000 -vt 0.5486 0.0000 -vt 0.5486 0.5000 -vt 0.6310 0.0000 -vt 0.6310 0.5000 -vt 0.7071 0.0000 -vt 0.7071 0.5000 -vt 0.7654 0.0000 -vt 0.7654 0.5000 -vt 0.8415 0.0000 -vt 0.8415 0.5000 -vt 0.9239 0.0000 -vt 0.9239 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.7654 0.5000 -vt 0.7654 1.0000 -vt 0.7071 1.0000 -vt 0.7071 0.5000 -vt 0.3244 0.4749 -vt 0.3827 0.5370 -vt 0.4142 0.6181 -vt 0.4142 0.7059 -vt 0.3827 0.7870 -vt 0.3244 0.8491 -vt 0.2483 0.8827 -vt 0.1659 0.8827 -vt 0.0898 0.8491 -vt 0.0315 0.7870 -vt 0.0000 0.7059 -vt 0.0000 0.6181 -vt 0.0315 0.5370 -vt 0.0898 0.4749 -vt 0.1659 0.4414 -vt 0.2483 0.4414 -vt 0.6310 1.0000 -vt 0.6310 0.5000 -vt 0.0000 0.2646 -vt 0.0000 0.1768 -vt 0.0315 0.0957 -vt 0.0898 0.0336 -vt 0.1659 0.0000 -vt 0.2483 0.0000 -vt 0.3244 0.0336 -vt 0.3827 0.0957 -vt 0.4142 0.1768 -vt 0.4142 0.2646 -vt 0.3827 0.3457 -vt 0.3244 0.4078 -vt 0.2483 0.4414 -vt 0.1659 0.4414 -vt 0.0898 0.4078 -vt 0.0315 0.3457 -s off -f 1/1 2/2 4/3 3/4 -f 3/4 4/3 6/5 5/6 -f 5/7 6/8 8/9 7/10 -f 7/10 8/9 10/11 9/12 -f 9/12 10/11 12/13 11/14 -f 11/15 12/16 14/17 13/18 -f 13/18 14/17 16/19 15/20 -f 15/20 16/19 18/21 17/22 -f 17/22 18/21 20/23 19/24 -f 19/24 20/23 22/25 21/26 -f 21/26 22/25 24/27 23/28 -f 23/28 24/27 26/29 25/30 -f 25/30 26/29 28/31 27/32 -f 27/33 28/34 30/35 29/36 -f 4/37 2/38 32/39 30/40 28/41 26/42 24/43 22/44 20/45 18/46 16/47 14/48 12/49 10/50 8/51 6/52 -f 29/36 30/35 32/53 31/54 -f 31/54 32/53 2/2 1/1 -f 1/55 3/56 5/57 7/58 9/59 11/60 13/61 15/62 17/63 19/64 21/65 23/66 25/67 27/68 29/69 31/70 diff --git a/techage/models/techage_cylinder_14.obj b/techage/models/techage_cylinder_14.obj deleted file mode 100644 index 85c47e8..0000000 --- a/techage/models/techage_cylinder_14.obj +++ /dev/null @@ -1,124 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: 'oven.blend' -# www.blender.org -o Cylinder -v 0.000000 -0.500000 -0.720000 -v 0.000000 0.500000 -0.720000 -v 0.275532 -0.500000 -0.665194 -v 0.275532 0.500000 -0.665194 -v 0.509117 -0.500000 -0.509117 -v 0.509117 0.500000 -0.509117 -v 0.665194 -0.500000 -0.275532 -v 0.665194 0.500000 -0.275532 -v 0.720000 -0.500000 0.000000 -v 0.720000 0.500000 0.000000 -v 0.665194 -0.500000 0.275532 -v 0.665194 0.500000 0.275532 -v 0.509117 -0.500000 0.509117 -v 0.509117 0.500000 0.509117 -v 0.275532 -0.500000 0.665194 -v 0.275532 0.500000 0.665194 -v 0.000000 -0.500000 0.720000 -v 0.000000 0.500000 0.720000 -v -0.275532 -0.500000 0.665194 -v -0.275532 0.500000 0.665194 -v -0.509117 -0.500000 0.509117 -v -0.509117 0.500000 0.509117 -v -0.665194 -0.500000 0.275532 -v -0.665194 0.500000 0.275532 -v -0.720000 -0.500000 -0.000000 -v -0.720000 0.500000 -0.000000 -v -0.665194 -0.500000 -0.275532 -v -0.665194 0.500000 -0.275532 -v -0.509117 -0.500000 -0.509117 -v -0.509117 0.500000 -0.509117 -v -0.275532 -0.500000 -0.665194 -v -0.275532 0.500000 -0.665194 -vt 0.5486 0.5000 -vt 0.5486 1.0000 -vt 0.4725 1.0000 -vt 0.4725 0.5000 -vt 0.4142 1.0000 -vt 0.4142 0.5000 -vt 1.0000 0.5000 -vt 1.0000 1.0000 -vt 0.9239 1.0000 -vt 0.9239 0.5000 -vt 0.8415 1.0000 -vt 0.8415 0.5000 -vt 0.7654 1.0000 -vt 0.7654 0.5000 -vt 0.4142 0.5000 -vt 0.4142 0.0000 -vt 0.4725 0.0000 -vt 0.4725 0.5000 -vt 0.5486 0.0000 -vt 0.5486 0.5000 -vt 0.6310 0.0000 -vt 0.6310 0.5000 -vt 0.7071 0.0000 -vt 0.7071 0.5000 -vt 0.7654 0.0000 -vt 0.7654 0.5000 -vt 0.8415 0.0000 -vt 0.8415 0.5000 -vt 0.9239 0.0000 -vt 0.9239 0.5000 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.7654 0.5000 -vt 0.7654 1.0000 -vt 0.7071 1.0000 -vt 0.7071 0.5000 -vt 0.3244 0.4749 -vt 0.3827 0.5370 -vt 0.4142 0.6181 -vt 0.4142 0.7059 -vt 0.3827 0.7870 -vt 0.3244 0.8491 -vt 0.2483 0.8827 -vt 0.1659 0.8827 -vt 0.0898 0.8491 -vt 0.0315 0.7870 -vt 0.0000 0.7059 -vt 0.0000 0.6181 -vt 0.0315 0.5370 -vt 0.0898 0.4749 -vt 0.1659 0.4414 -vt 0.2483 0.4414 -vt 0.6310 1.0000 -vt 0.6310 0.5000 -vt 0.0000 0.2646 -vt 0.0000 0.1768 -vt 0.0315 0.0957 -vt 0.0898 0.0336 -vt 0.1659 0.0000 -vt 0.2483 0.0000 -vt 0.3244 0.0336 -vt 0.3827 0.0957 -vt 0.4142 0.1768 -vt 0.4142 0.2646 -vt 0.3827 0.3457 -vt 0.3244 0.4078 -vt 0.2483 0.4414 -vt 0.1659 0.4414 -vt 0.0898 0.4078 -vt 0.0315 0.3457 -s off -f 1/1 2/2 4/3 3/4 -f 3/4 4/3 6/5 5/6 -f 5/7 6/8 8/9 7/10 -f 7/10 8/9 10/11 9/12 -f 9/12 10/11 12/13 11/14 -f 11/15 12/16 14/17 13/18 -f 13/18 14/17 16/19 15/20 -f 15/20 16/19 18/21 17/22 -f 17/22 18/21 20/23 19/24 -f 19/24 20/23 22/25 21/26 -f 21/26 22/25 24/27 23/28 -f 23/28 24/27 26/29 25/30 -f 25/30 26/29 28/31 27/32 -f 27/33 28/34 30/35 29/36 -f 4/37 2/38 32/39 30/40 28/41 26/42 24/43 22/44 20/45 18/46 16/47 14/48 12/49 10/50 8/51 6/52 -f 29/36 30/35 32/53 31/54 -f 31/54 32/53 2/2 1/1 -f 1/55 3/56 5/57 7/58 9/59 11/60 13/61 15/62 17/63 19/64 21/65 23/66 25/67 27/68 29/69 31/70 \ No newline at end of file diff --git a/techage/models/techage_rotor.b3d b/techage/models/techage_rotor.b3d deleted file mode 100644 index afd8f0c5da8283d4848bfe51aa0b9c1ee9579514..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9983 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 diff --git a/techage/move_controller/doorblock.lua b/techage/move_controller/doorblock.lua deleted file mode 100644 index 6874479..0000000 --- a/techage/move_controller/doorblock.lua +++ /dev/null @@ -1,108 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Door block - -]]-- - -local M = minetest.get_meta -local S = techage.S - --- See also gateblock!!! -local NUM_TEXTURES = 22 - -local sTextures = "Wood,Aspen Wood,Jungle Wood,Pine Wood,".. - "Cobblestone,Sandstone,Stone,Desert Sandstone,".. - "Desert Stone,Silver Sandstone,Mossy Cobble,Desert Cobble,".. - "Copper,Steel,Tin,Coral,".. - "Glas,Obsidian Glas,Basalt Glass,Basalt Glass 2,".. - "Ice,Gate Wood" - -local tTextures = { - ["Wood"]=1, ["Aspen Wood"]=2, ["Jungle Wood"]=3, ["Pine Wood"]=4, - ["Cobblestone"]=5, ["Sandstone"]=6, ["Stone"]=7, ["Desert Sandstone"]=8, - ["Desert Stone"]=9, ["Silver Sandstone"]=10, ["Mossy Cobble"]=11, ["Desert Cobble"]=12, - ["Copper"]=13, ["Steel"]=14, ["Tin"]=15, ["Coral"]=16, - ["Glas"]=17, ["Obsidian Glas"]=18, ["Basalt Glass"]=19, ["Basalt Glass 2"]=20, - ["Ice"]=21, ["Gate Wood"]=22, -} - -local tPgns = {"default_wood.png", "default_aspen_wood.png", "default_junglewood.png", "default_pine_wood.png", - "default_cobble.png", "default_sandstone.png", "default_stone.png", "default_desert_sandstone.png", - "default_desert_stone_block.png", "default_silver_sandstone.png", "default_mossycobble.png", "default_desert_cobble.png", - "default_copper_block.png", "default_steel_block.png", "default_tin_block.png", "default_coral_skeleton.png", - "default_glass.png", "default_obsidian_glass.png", "techage_basalt_glass.png", "techage_basalt_glass2.png", - "default_ice.png", "techage_gate.png"} - -for idx,pgn in ipairs(tPgns) do - minetest.register_node("techage:doorblock"..idx, { - description = S("TechAge Door Block"), - tiles = { - pgn.."^[transformR90", - pgn, - pgn.."^[transformR90", - pgn.."^[transformR90", - pgn, - pgn.."^[transformFX", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -8/16, -8/16, -1/16, 8/16, 8/16, 1/16}, - }, - }, - - after_place_node = function(pos, placer) - M(pos):set_string("formspec", "size[3,2]".. - "label[0,0;Select texture]".. - "dropdown[0,0.5;3;type;"..sTextures..";"..NUM_TEXTURES.."]".. - "button_exit[0.5,1.5;2,1;exit;Save]") - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - local node = minetest.get_node(pos) - if fields.type then - node.name = "techage:doorblock"..tTextures[fields.type] - minetest.swap_node(pos, node) - end - if fields.exit then - meta:set_string("formspec", "") - local number = techage.add_node(pos, node.name) - meta:set_string("infotext", S("TechAge Door Block").." "..number) - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype = "light", - paramtype2 = "facedir", - use_texture_alpha = techage.BLEND, - sunlight_propagates = true, - sounds = default.node_sound_stone_defaults(), - groups = {cracky=2, choppy=2, crumbly=2, techage_door = 1, - not_in_creative_inventory = idx==NUM_TEXTURES and 0 or 1}, - is_ground_content = false, - drop = "techage:doorblock"..NUM_TEXTURES, - }, - techage.register_node({"techage:doorblock"..idx}, {})) -end - -minetest.register_craft({ - output = "techage:doorblock"..NUM_TEXTURES, - recipe = { - {"techage:basalt_glass_thin", "", ""}, - {"default:mese_crystal_fragment", "",""}, - {"group:wood", "", ""}, - }, -}) diff --git a/techage/move_controller/doorcontroller.lua b/techage/move_controller/doorcontroller.lua deleted file mode 100644 index 2b99ad7..0000000 --- a/techage/move_controller/doorcontroller.lua +++ /dev/null @@ -1,147 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Door/Gate Controller - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic - -local function formspec(meta) - local numbers = meta:get_string("numbers") or "" - return "size[7.5,3]".. - "field[0.5,1;7,1;numbers;"..S("Insert door/gate block number(s)")..";"..numbers.."]" .. - "button_exit[2,2;3,1;exit;"..S("Save").."]" -end - -local function store_door_data(pos) - local nvm = techage.get_nvm(pos) - nvm.door_state = false - local numbers = M(pos):get_string("numbers") - nvm.door_blocks = {} - for _,num in ipairs(string.split(numbers, " ")) do - local info = techage.get_node_info(num) - if info and info.pos then - local node = techage.get_node_lvm(info.pos) - table.insert(nvm.door_blocks, {pos = info.pos, name = node.name, param2 = node.param2}) - end - end -end - -local function swap_door_nodes(pos, open) - local nvm = techage.get_nvm(pos) - if nvm.door_state ~= open then - nvm.door_state = open - for _,item in ipairs(nvm.door_blocks or {}) do - if item.pos and item.name and item.param2 then - local node = techage.get_node_lvm(item.pos) - if open then - if node.name == item.name then - minetest.remove_node(item.pos) - item.removed = true - else - item.removed = false - end - elseif techage.is_air_like(node.name) and item.removed then - minetest.add_node(item.pos, {name = item.name, param2 = item.param2}) - end - end - end - end -end - -minetest.register_node("techage:ta3_doorcontroller", { - description = S("TA3 Door Controller"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_doorcontroller.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local mem = techage.get_mem(pos) - logic.after_place_node(pos, placer, "techage:ta3_doorcontroller", S("TA3 Door Controller")) - logic.infotext(meta, S("TA3 Door Controller")) - meta:set_string("formspec", formspec(meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - if techage.check_numbers(fields.numbers, player:get_player_name()) then - swap_door_nodes(pos, false) - meta:set_string("numbers", fields.numbers) - logic.infotext(M(pos), S("TA3 Door Controller")) - meta:set_string("formspec", formspec(meta)) - store_door_data(pos) - end - end, - - techage_set_numbers = function(pos, numbers, player_name) - local meta = M(pos) - local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Door Controller")) - if res then - swap_door_nodes(pos, false) - meta:set_string("formspec", formspec(meta)) - store_door_data(pos) - end - return res - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - swap_door_nodes(pos, false) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -techage.register_node({"techage:ta3_doorcontroller"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - swap_door_nodes(pos, true) - elseif topic == "off" then - swap_door_nodes(pos, false) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 1 and payload[1] == 1 then - swap_door_nodes(pos, true) - return 0 - elseif topic == 1 and payload[1] == 0 then - swap_door_nodes(pos, false) - return 0 - else - return 2 - end - end, -}) - -minetest.register_craft({ - output = "techage:ta3_doorcontroller", - recipe = { - {"", "group:wood",""}, - {"techage:vacuum_tube", "", "default:mese_crystal_fragment"}, - {"", "group:wood", ""}, - }, -}) diff --git a/techage/move_controller/doorcontroller2.lua b/techage/move_controller/doorcontroller2.lua deleted file mode 100644 index 7804314..0000000 --- a/techage/move_controller/doorcontroller2.lua +++ /dev/null @@ -1,636 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Door/Gate Controller II - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S = techage.S - -local logic = techage.logic -local fly = techage.flylib - -local NUMSLOTS = 16 - -local MarkedNodes = {} -- t[player] = {{entity, pos},...} -local CurrentPos -- to mark punched entities - --------------------------------------------------------------------------- --- helper functions --------------------------------------------------------------------------- -local function count_nodes(tbl, name) - if tbl[name] then - tbl[name] = tbl[name] + 1 - else - tbl[name] = 1 - end -end - -local function take_node(tbl, name) - if tbl[name] and tbl[name] > 0 then - tbl[name] = tbl[name] - 1 - return true - end -end - -local function next_node(tbl) - return function(tbl) - local name, cnt = next(tbl) - if cnt and cnt > 0 then - cnt = cnt - 1 - if cnt == 0 then - tbl[name] = nil - else - tbl[name] = cnt - end - return name - end - end, tbl -end - -local function get_new_nodename(item) - local name = item:get_name() - if name == "" then - return "air" - end - return name -end - -local function get_node_name(nvm, slot) - nvm.pos_list = nvm.pos_list or {} - local pos = nvm.pos_list[slot] - if pos then - return techage.get_node_lvm(pos).name - end - return "unknown" -end - -local function is_simple_node(name) - local ndef = minetest.registered_nodes[name] - return name ~= "air" and techage.can_dig_node(name, ndef) -end - --------------------------------------------------------------------------- --- Marker --------------------------------------------------------------------------- -local function unmark_position(name, pos) - pos = vector.round(pos) - for idx,item in ipairs(MarkedNodes[name] or {}) do - if vector.equals(pos, item.pos) then - item.entity:remove() - table.remove(MarkedNodes[name], idx) - CurrentPos = pos - return - end - end -end - -local function unmark_all(name) - for _,item in ipairs(MarkedNodes[name] or {}) do - item.entity:remove() - end - MarkedNodes[name] = nil -end - -local function mark_position(name, pos) - MarkedNodes[name] = MarkedNodes[name] or {} - pos = vector.round(pos) - if not CurrentPos or not vector.equals(pos, CurrentPos) then -- entity not punched? - local entity = minetest.add_entity(pos, "techage:marker") - if entity ~= nil then - entity:get_luaentity().player_name = name - table.insert(MarkedNodes[name], {pos = pos, entity = entity}) - end - CurrentPos = nil - return true - end - CurrentPos = nil -end - -local function get_poslist(name) - local lst = {} - for _,item in ipairs(MarkedNodes[name] or {}) do - table.insert(lst, item.pos) - end - return lst -end - -minetest.register_entity(":techage:marker", { - initial_properties = { - visual = "cube", - textures = { - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - "techage_cube_mark.png", - }, - physical = false, - visual_size = {x = 1.1, y = 1.1}, - collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, - glow = 8, - }, - on_step = function(self, dtime) - self.ttl = (self.ttl or 2400) - 1 - if self.ttl <= 0 then - local pos = self.object:get_pos() - unmark_position(self.player_name, pos) - end - end, - on_punch = function(self, hitter) - local pos = self.object:get_pos() - local name = hitter:get_player_name() - if name == self.player_name then - unmark_position(name, pos) - end - end, -}) - --------------------------------------------------------------------------- --- formspec --------------------------------------------------------------------------- -local function formspec1(nvm, meta) - local status = meta:get_string("status") - local play_sound = dump(nvm.play_sound or false) - return "size[8,7]".. - "tabheader[0,0;tab;"..S("Ctrl,Inv")..";1;;true]".. - "button[0.7,0.2;3,1;record;"..S("Record").."]".. - "button[4.3,0.2;3,1;ready;"..S("Done").."]".. - "button[0.7,1.2;3,1;reset;"..S("Reset").."]".. - "button[4.3,1.2;3,1;exchange;"..S("Exchange").."]".. - "checkbox[4.3,2.1;play_sound;"..S("with door sound")..";"..play_sound.."]".. - "label[0.5,2.3;"..status.."]".. - "list[current_player;main;0,3.3;8,4;]" -end - -local function formspec2() - return "size[8,7]".. - "tabheader[0,0;tab;"..S("Ctrl,Inv")..";2;;true]".. - "label[0.3,0.0;1]".. - "label[7.3,0.0;8]".. - "label[0.3,2.4;9]".. - "label[7.3,2.4;16]".. - "list[context;main;0,0.5;8,2;]".. - "list[current_player;main;0,3.3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -local function play_sound(pos) - minetest.sound_play("techage_button", { - pos = pos, - gain = 1, - max_hear_distance = 15}) -end - --------------------------------------------------------------------------- --- Configuration --------------------------------------------------------------------------- --- Store the current state of inventory and placed nodes -local function store_config(pos, nvm) - local meta = M(pos) - local inv = meta:get_inventory() - local item_list = inv:get_list("main") - local nodes = {exp_nodes = {}, inv_nodes = {}} - - nvm.pos_list = nvm.pos_list or {} - nvm.param2_list = nvm.param2_list or {} - - for idx = 1, NUMSLOTS do - local pos = nvm.pos_list[idx] - - if pos then - local param2 = nvm.param2_list[idx] or 0 - local item = item_list[idx] - if item and item:get_count() > 0 then - nodes.inv_nodes[idx] = {name = item:get_name(), param2 = param2} - end - - local node = techage.get_node_lvm(pos) - if is_simple_node(node.name) or node.name == "air" then - nodes.exp_nodes[idx] = techage.get_node_lvm(pos) - end - end - end - meta:set_string("stored_config", minetest.serialize(nodes)) -end - --- Generate a table of currently available inventory and placed nodes -local function available_nodes(pos, nvm, item_list) - local nodes = {} - nvm.pos_list = nvm.pos_list or {} - - for idx = 1, NUMSLOTS do - local item = item_list[idx] - if item and item:get_count() > 0 then - count_nodes(nodes, item:get_name()) - end - - local pos = nvm.pos_list[idx] - if pos then - local node = techage.get_node_lvm(pos) - if is_simple_node(node.name) then - count_nodes(nodes, node.name) - end - end - end - return nodes -end - -local function restore_config(pos, nvm) - local meta = M(pos) - local inv = meta:get_inventory() - local item_list = inv:get_list("main") - local stock = available_nodes(pos, nvm, item_list) - local nodes = minetest.deserialize(meta:get_string("stored_config")) or {} - nvm.pos_list = nvm.pos_list or {} - - inv:set_list("main", {}) - item_list = inv:get_list("main") - - for idx, node in pairs(nodes.inv_nodes or {}) do - if take_node(stock, node.name) then - item_list[idx] = ItemStack(node.name) - end - end - inv:set_list("main", item_list) - - for idx, node in pairs(nodes.exp_nodes or {}) do - local pos = nvm.pos_list[idx] - if take_node(stock, node.name) then - local param2 = nvm.param2_list[idx] or 0 - fly.exchange_node(pos, node.name, param2) - nvm.expected_nodenames[idx] = node.name - else - fly.remove_node(pos) - nvm.expected_nodenames[idx] = "air" - end - end - - for name in next_node(stock) do - inv:add_item("main", ItemStack(name)) - end - - return true -end - --------------------------------------------------------------------------- --- Exchange nodes --------------------------------------------------------------------------- -local function exchange_node(pos, item, param2) - local node = minetest.get_node_or_nil(pos) - if node and (is_simple_node(node.name) or node.name == "air") then - if item and is_simple_node(item:get_name()) then - fly.exchange_node(pos, item:get_name(), param2) - else - fly.remove_node(pos) - end - if not techage.is_air_like(node.name) then - return ItemStack(node.name), node.param2 - else - return ItemStack(), param2 - end - end - return item, param2 -end - -local function expected_node(pos, nvm, idx, force, new_nodename) - local expected_name = force and nvm.expected_nodenames[idx] or nil - if expected_name then - local node = techage.get_node_lvm(pos) - if expected_name == node.name then - nvm.expected_nodenames[idx] = new_nodename - return true - else - return false - end - end - nvm.expected_nodenames[idx] = new_nodename - return true -end - -local function exchange_nodes(pos, nvm, slot, force) - local meta = M(pos) - local inv = meta:get_inventory() - - local item_list = inv:get_list("main") - local res = false - nvm.pos_list = nvm.pos_list or {} - nvm.param2_list = nvm.param2_list or {} - nvm.expected_nodenames = nvm.expected_nodenames or {} - - for idx = (slot or 1), (slot or NUMSLOTS) do - local pos = nvm.pos_list[idx] - local item = item_list[idx] - if pos then - if (force == nil) - or (force == "exch") - or (force == "dig" and item:get_count() == 0) - or (force == "set" and item:get_count() > 0) then - if expected_node(pos, nvm, idx, force, get_new_nodename(item)) then - item_list[idx], nvm.param2_list[idx] = exchange_node(pos, item, nvm.param2_list[idx]) - end - res = true - end - end - end - - inv:set_list("main", item_list) - return res -end - -local function show_nodes(pos) - local nvm = techage.get_nvm(pos) - if not nvm.is_on then - nvm.is_on = true - if nvm.play_sound then - minetest.sound_play("doors_door_close", { - pos = pos, - gain = 1, - max_hear_distance = 15}) - end - return exchange_nodes(pos, nvm) - end -end - -local function hide_nodes(pos) - local nvm = techage.get_nvm(pos) - if nvm.is_on then - nvm.is_on = false - if nvm.play_sound then - minetest.sound_play("doors_door_open", { - pos = pos, - gain = 1, - max_hear_distance = 15}) - end - return exchange_nodes(pos, nvm) - end -end - -local function exch_nodes(pos) - local nvm = techage.get_nvm(pos) - if nvm.play_sound then - minetest.sound_play("doors_door_open", { - pos = pos, - gain = 1, - max_hear_distance = 15}) - end - return exchange_nodes(pos, nvm) -end - -minetest.register_node("techage:ta3_doorcontroller2", { - description = S("TA3 Door Controller II"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_doorcontroller.png", - }, - - after_place_node = function(pos, placer, itemstack) - local meta = M(pos) - local inv = meta:get_inventory() - inv:set_size('main', NUMSLOTS) - logic.after_place_node(pos, placer, "techage:ta3_doorcontroller2", S("TA3 Door Controller II")) - logic.infotext(meta, S("TA3 Door Controller II")) - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec1(nvm, meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if fields.tab == "2" then - meta:set_string("formspec", formspec2(meta)) - return - elseif fields.tab == "1" then - meta:set_string("formspec", formspec1(nvm, meta)) - return - elseif fields.record then - local inv = meta:get_inventory() - nvm.pos_list = {} - meta:set_string("status", S("Recording...")) - local name = player:get_player_name() - minetest.chat_send_player(name, S("Click on all the blocks that are part of the door/gate")) - nvm.expected_nodenames = {} - MarkedNodes[name] = {} - meta:set_string("stored_config", "") - meta:set_string("formspec", formspec1(nvm, meta)) - elseif fields.ready then - local name = player:get_player_name() - local pos_list = get_poslist(name) - local text = #pos_list.." "..S("block positions are stored.") - meta:set_string("status", text) - nvm.pos_list = pos_list - nvm.expected_nodenames = {} - unmark_all(name) - meta:set_string("stored_config", "") - meta:set_string("formspec", formspec1(nvm, meta)) - elseif fields.exchange then - if exch_nodes(pos) then - store_config(pos, nvm) - meta:set_string("status", S("Blocks exchanged")) - meta:set_string("formspec", formspec1(nvm, meta)) - local name = player:get_player_name() - MarkedNodes[name] = nil - end - elseif fields.reset then - restore_config(pos, nvm) - meta:set_string("status", S("Blocks reset")) - meta:set_string("formspec", formspec1(nvm, meta)) - local name = player:get_player_name() - MarkedNodes[name] = nil - elseif fields.play_sound then - nvm.play_sound = fields.play_sound == "true" - meta:set_string("formspec", formspec1(nvm, meta)) - end - end, - - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - return 1 - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - return 1 - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if is_simple_node(stack:get_name()) then - return 1 - end - return 0 - end, - - can_dig = function(pos, player) - if player and minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - - local inv = minetest.get_inventory({type="node", pos=pos}) - return inv:is_empty("main") - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local name = digger:get_player_name() - unmark_all(name) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -techage.register_node({"techage:ta3_doorcontroller2"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "on" then - return hide_nodes(pos) - elseif topic == "off" then - return show_nodes(pos) - elseif topic == "exchange" then - local nvm = techage.get_nvm(pos) - return exchange_nodes(pos, nvm, tonumber(payload), "exch") - elseif topic == "set" then - local nvm = techage.get_nvm(pos) - return exchange_nodes(pos, nvm, tonumber(payload), "set") - elseif topic == "dig" then - local nvm = techage.get_nvm(pos) - return exchange_nodes(pos, nvm, tonumber(payload), "dig") - elseif topic == "get" then - local nvm = techage.get_nvm(pos) - return get_node_name(nvm, tonumber(payload)) - elseif topic == "reset" then - local nvm = techage.get_nvm(pos) - return restore_config(pos, nvm) - end - return false - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 1 and payload[1] == 1 then - return hide_nodes(pos) and 0 or 3 - elseif topic == 1 and payload[1] == 0 then - return show_nodes(pos) and 0 or 3 - elseif topic == 9 and payload[1] == 0 then -- Exchange Block - local nvm = techage.get_nvm(pos) - return exchange_nodes(pos, nvm, payload[2] or 1, "exch") and 0 or 3 - elseif topic == 9 and payload[1] == 1 then -- Set Block - local nvm = techage.get_nvm(pos) - return exchange_nodes(pos, nvm, payload[2] or 1, "set") and 0 or 3 - elseif topic == 9 and payload[1] == 2 then -- Dig Block - local nvm = techage.get_nvm(pos) - return exchange_nodes(pos, nvm, payload[2] or 1, "dig") and 0 or 3 - elseif topic == 9 and payload[1] == 3 then -- reset - local nvm = techage.get_nvm(pos) - return restore_config(pos, nvm) and 0 or 3 - end - return 2 - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 147 then -- Get Name - local nvm = techage.get_nvm(pos) - return 0, get_node_name(nvm, payload[1] or 1) - end - return 2, "" - end, - on_node_load = function(pos) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - meta:set_string("status", "") - meta:set_string("formspec", formspec1(nvm, meta)) - local pos_list = minetest.deserialize(meta:get_string("pos_list")) - if pos_list then - nvm.pos_list = pos_list - meta:set_string("pos_list", "") - local inv = meta:get_inventory() - if inv:is_empty("main") then - nvm.is_on = true - end - end - local param2_list = minetest.deserialize(meta:get_string("param2_list")) - if param2_list then - nvm.param2_list = param2_list - meta:set_string("param2_list", "") - end - end, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:ta3_doorcontroller2", - recipe = {"techage:ta3_doorcontroller"}, -}) - -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - if puncher and puncher:is_player() then - local name = puncher:get_player_name() - - if not MarkedNodes[name] then - return - end - - if not minetest.is_protected(pointed_thing.under, name) then - mark_position(name, pointed_thing.under) - end - end -end) - -local Doors = { - "doors:door_steel", - "doors:prison_door", - "doors:rusty_prison_door", - "doors:trapdoor_steel", - "doors:door_glass", - "doors:door_obsidian_glass", - "doors:japanese_door", - "doors:screen_door", - "doors:slide_door", - "doors:trapdoor", - "doors:woodglass_door", - "xpanes:door_steel_bar", - "xpanes:trapdoor_steel_bar", -} - -for _, name in ipairs(Doors) do - for _, postfix in ipairs({"a", "b", "c", "d"}) do - techage.register_simple_nodes({name .. "_" .. postfix}, true) - fly.protect_door_from_being_opened(name .. "_" .. postfix) - end -end - -local ProtectorDoors = { - "protector:door_steel", - "protector:door_wood", - "protector:trapdoor", - "protector:trapdoor_steel", -} - -for _, name in ipairs(ProtectorDoors) do - for _, postfix in ipairs({"b_1", "b_2", "t_1", "t_2"}) do - techage.register_simple_nodes({name .. "_" .. postfix}, true) - fly.protect_door_from_being_opened(name .. "_" .. postfix) - end -end diff --git a/techage/move_controller/flycontroller.lua b/techage/move_controller/flycontroller.lua deleted file mode 100644 index 70a21b3..0000000 --- a/techage/move_controller/flycontroller.lua +++ /dev/null @@ -1,271 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 Fly Controller - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local S = techage.S - -local MP = minetest.get_modpath("techage") -local mark = dofile(MP .. "/basis/mark_lib.lua") -local fly = techage.flylib - -local MAX_DIST = 1500 -local MAX_BLOCKS = 32 -local EX_POINTS = 40 - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "0.5,1,2,4,6,8", - name = "max_speed", - label = S("Maximum Speed"), - tooltip = S("Maximum speed for moving blocks"), - default = "8", - }, - { - type = "float", - name = "height", - label = S("Move block height"), - tooltip = S("Value in the range of 0.0 to 1.0"), - default = "1.0", - }, - { - type = "float", - name = "offset", - label = S("Object offset"), - tooltip = S("Y-offset for non-player objects like vehicles (-0.5 to 0.5)"), - default = "0.0", - }, - { - type = "dropdown", - choices = "disable,enable", - name = "teleport_mode", - label = S("Teleport mode"), - tooltip = S("Move a player without moving blocks"), - default = "disable", - }, -} - -local function formspec(nvm, meta) - local status = meta:get_string("status") - local path = minetest.formspec_escape(meta:contains("fs_path") and meta:get_string("fs_path") or - meta:contains("path") and meta:get_string("path") or "0,3,0") - return "size[8,6.7]" .. - "style_type[textarea;font=mono;textcolor=#FFFFFF;border=true]" .. - "box[0,-0.1;7.2,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("TA5 Fly Controller")) .. "]" .. - techage.wrench_image(7.4, -0.05) .. - "button[0.1,0.7;3.8,1;record;" .. S("Record") .. "]" .. - "button[4.1,0.7;3.8,1;done;" .. S("Done") .. "]" .. - "textarea[0.4,2.1;3.8,4.4;path;" .. S("Flight route (A to B)") .. ";"..path.."]" .. - "button[4.1,1.8;3.8,1;store;" .. S("Store") .. "]" .. - "button[4.1,2.6;3.8,1;test;" .. S("Test") .. "]" .. - "button[4.1,3.4;3.8,1;moveAB;" .. S("Move A-B") .. "]" .. - "button[4.1,4.2;3.8,1;moveBA;" .. S("Move B-A") .. "]" .. - "button[4.1,5.0;3.8,1;move;" .. S("Move") .. "]" .. - "label[0.3,6.3;" .. status .. "]" -end - -minetest.register_node("techage:ta5_flycontroller", { - description = S("TA5 Fly Controller"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_movecontroller.png", - }, - - after_place_node = function(pos, placer, itemstack) - local meta = M(pos) - techage.logic.after_place_node(pos, placer, "techage:ta5_flycontroller", S("TA5 Fly Controller")) - techage.logic.infotext(meta, S("TA5 Fly Controller")) - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec(nvm, meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - if techage.get_expoints(player) < EX_POINTS then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if fields.record then - nvm.lpos1 = {} - nvm.lpos2 = {} - nvm.moveBA = false - nvm.running = nil - meta:set_string("status", S("Recording...")) - local name = player:get_player_name() - minetest.chat_send_player(name, S("Click on all blocks that shall be moved")) - mark.start(name, MAX_BLOCKS) - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.done then - local name = player:get_player_name() - local pos_list = mark.get_poslist(name) - local _, err = fly.to_path(fields.path, MAX_DIST) - if not err then - meta:set_string("fs_path", fields.path) - meta:set_string("path", fields.path) - end - nvm.running = nil - local text = #pos_list.." "..S("block positions are stored.") - meta:set_string("status", text) - nvm.lpos1 = pos_list - mark.unmark_all(name) - mark.stop(name) - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.store then - local _, err = fly.to_path(fields.path, MAX_DIST) - if not err then - meta:set_string("path", fields.path) - meta:set_string("fs_path", fields.path) - meta:set_string("status", S("Stored")) - else - meta:set_string("path", "0,0,0") - meta:set_string("fs_path", fields.path) - meta:set_string("status", err) - end - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - mark.stop(name) - nvm.moveBA = false - nvm.running = nil - elseif fields.test then - local path, err = fly.to_path(fields.path, MAX_DIST) - if err then - meta:set_string("status", err) - elseif path and nvm.lpos1 and nvm.lpos1[1] then - local pos = table.copy(nvm.lpos1[1]) - if pos then - for _, offs in ipairs(path) do - local pos2 = vector.add(pos, offs) - local s = string.format("[TA4 Fly Controller] %s + %s = %s", P2S(pos), P2S(offs), P2S(pos2)) - minetest.chat_send_player(player:get_player_name(), s) - pos = pos2 - end - meta:set_string("status", S("See chat output")) - else - minetest.chat_send_player(player:get_player_name(), S("[TA4 Fly Controller] Recording is missing!")) - meta:set_string("status", S("Error: Recording is missing !!")) - end - else - if nvm.lpos1 then - minetest.chat_send_player(player:get_player_name(), S("[TA4 Fly Controller] Invalid path!")) - meta:set_string("status", S("Error: Invalid path !!")) - else - minetest.chat_send_player(player:get_player_name(), S("[TA4 Fly Controller] Recording is missing!")) - meta:set_string("status", S("Error: Recording is missing !!")) - end - end - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.moveAB then - meta:set_string("status", "") - if fly.move_to_other_pos(pos, false) then - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - mark.stop(name) - end - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.moveBA then - meta:set_string("status", "") - if fly.move_to_other_pos(pos, true) then - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - mark.stop(name) - end - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.move then - meta:set_string("status", "") - if fly.move_to_other_pos(pos, nvm.moveBA) then - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - mark.stop(name) - end - meta:set_string("formspec", formspec(nvm, meta)) - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local name = digger:get_player_name() - mark.unmark_all(name) - mark.stop(name) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - ta5_formspec = {menu=WRENCH_MENU, ex_points=EX_POINTS}, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -local INFO = [[Commands: 'state', 'a2b', 'b2a', 'move']] - -techage.register_node({"techage:ta5_flycontroller"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "info" then - return INFO - elseif topic == "state" then - return nvm.running and "running" or "stopped" - elseif topic == "a2b" then - return fly.move_to_other_pos(pos, false) - elseif topic == "b2a" then - return fly.move_to_other_pos(pos, true) - elseif topic == "move" then - return fly.move_to_other_pos(pos, nvm.moveBA) - end - return false - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 11 then - if payload[1] == 1 then - return fly.move_to_other_pos(pos, false) and 0 or 3 - elseif payload[1] == 2 then - return fly.move_to_other_pos(pos, true) and 0 or 3 - elseif payload[1] == 3 then - return fly.move_to_other_pos(pos, nvm.moveBA) and 0 or 3 - end - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 129 then - return 0, {nvm.running and 1 or 6} - end - return 2, "" - end, - on_node_load = function(pos, node) - M(pos):set_string("status", "") - end, -}) - -minetest.register_craft({ - output = "techage:ta5_flycontroller", - recipe = { - {"default:steel_ingot", "dye:red", "default:steel_ingot"}, - {"techage:aluminum", "techage:ta5_aichip", "techage:aluminum"}, - {"group:wood", "basic_materials:gear_steel", "group:wood"}, - }, -}) diff --git a/techage/move_controller/gateblock.lua b/techage/move_controller/gateblock.lua deleted file mode 100644 index 57f6826..0000000 --- a/techage/move_controller/gateblock.lua +++ /dev/null @@ -1,94 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Gate Block to disappear - -]]-- - -local M = minetest.get_meta -local S = techage.S - --- See also doorblock!!! -local NUM_TEXTURES = 22 - -local sTextures = "Wood,Aspen Wood,Jungle Wood,Pine Wood,".. - "Cobblestone,Sandstone,Stone,Desert Sandstone,".. - "Desert Stone,Silver Sandstone,Mossy Cobble,Desert Cobble,".. - "Copper,Steel,Tin,Coral,".. - "Glas,Obsidian Glas,Basalt Glass,Basalt Glass 2,".. - "Ice,Gate Wood" - -local tTextures = { - ["Wood"]=1, ["Aspen Wood"]=2, ["Jungle Wood"]=3, ["Pine Wood"]=4, - ["Cobblestone"]=5, ["Sandstone"]=6, ["Stone"]=7, ["Desert Sandstone"]=8, - ["Desert Stone"]=9, ["Silver Sandstone"]=10, ["Mossy Cobble"]=11, ["Desert Cobble"]=12, - ["Copper"]=13, ["Steel"]=14, ["Tin"]=15, ["Coral"]=16, - ["Glas"]=17, ["Obsidian Glas"]=18, ["Basalt Glass"]=19, ["Basalt Glass 2"]=20, - ["Ice"]=21, ["Gate Wood"]=22, -} - -local tPgns = {"default_wood.png", "default_aspen_wood.png", "default_junglewood.png", "default_pine_wood.png", - "default_cobble.png", "default_sandstone.png", "default_stone.png", "default_desert_sandstone.png", - "default_desert_stone_block.png", "default_silver_sandstone.png", "default_mossycobble.png", "default_desert_cobble.png", - "default_copper_block.png", "default_steel_block.png", "default_tin_block.png", "default_coral_skeleton.png", - "default_glass.png", "default_obsidian_glass.png", "techage_basalt_glass.png", "techage_basalt_glass2.png", - "default_ice.png", "techage_gate.png"} - -for idx,pgn in ipairs(tPgns) do - minetest.register_node("techage:gateblock"..idx, { - description = S("TechAge Gate Block"), - tiles = {pgn}, - drawtype = "glasslike", - after_place_node = function(pos, placer) - M(pos):set_string("formspec", "size[3,2]".. - "label[0,0;Select texture]".. - "dropdown[0,0.5;3;type;"..sTextures..";"..NUM_TEXTURES.."]".. - "button_exit[0.5,1.5;2,1;exit;Save]") - end, - - on_receive_fields = function(pos, formname, fields, player) - local meta = minetest.get_meta(pos) - local node = minetest.get_node(pos) - if fields.type then - node.name = "techage:gateblock"..tTextures[fields.type] - minetest.swap_node(pos, node) - end - if fields.exit then - meta:set_string("formspec", "") - local number = techage.add_node(pos, node.name) - meta:set_string("infotext", S("TechAge Gate Block").." "..number) - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype = "light", - paramtype2 = "facedir", - use_texture_alpha = techage.BLEND, - sunlight_propagates = true, - sounds = default.node_sound_stone_defaults(), - groups = {cracky=2, choppy=2, crumbly=2, techage_door = 1, - not_in_creative_inventory = idx==NUM_TEXTURES and 0 or 1}, - is_ground_content = false, - drop = "techage:gateblock"..NUM_TEXTURES, - }, - techage.register_node({"techage:gateblock"..idx}, {})) -end - -minetest.register_craft({ - output = "techage:gateblock"..NUM_TEXTURES, - recipe = { - {"techage:basalt_glass", "", ""}, - {"default:mese_crystal_fragment", "",""}, - {"group:wood", "", ""}, - }, -}) diff --git a/techage/move_controller/movecontroller.lua b/techage/move_controller/movecontroller.lua deleted file mode 100644 index 5f7ce00..0000000 --- a/techage/move_controller/movecontroller.lua +++ /dev/null @@ -1,335 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Move Controller - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local S = techage.S - -local MP = minetest.get_modpath("techage") -local mark = dofile(MP .. "/basis/mark_lib.lua") -local fly = techage.flylib - -local MAX_DIST = 200 -local MAX_BLOCKS = 16 - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "0.5,1,2,4,6,8", - name = "max_speed", - label = S("Maximum Speed"), - tooltip = S("Maximum speed for moving blocks"), - default = "8", - }, - { - type = "float", - name = "height", - label = S("Move block height"), - tooltip = S("Value in the range of 0.0 to 1.0"), - default = "1.0", - }, - { - type = "float", - name = "offset", - label = S("Object offset"), - tooltip = S("Y-offset for non-player objects like vehicles (-0.5 to 0.5)"), - default = "0.0", - }, - { - type = "dropdown", - choices = "A-B / B-A,move xyz", - name = "opmode", - label = S("Operational mode"), - tooltip = S("Switch to the remote controlled 'move xyz' mode"), - default = "A-B / B-A", - }, -} - -local function formspec(nvm, meta) - local status = meta:get_string("status") - local path = minetest.formspec_escape(meta:contains("path") and meta:get_string("path") or "0,3,0") - local buttons - if meta:get_string("opmode") == "move xyz" then - buttons = "field[0.4,2.5;3.8,1;path;" .. S("Move distance") .. ";" .. path .. "]" .. - "button_exit[4.1,2.2;3.8,1;move2;" .. S("Move") .. "]" .. - "button_exit[0.1,3.3;3.8,1;reset;" .. S("Reset") .. "]" - else - buttons = "field[0.4,2.5;3.8,1;path;" .. S("Move distance (A to B)") .. ";" .. path .. "]" .. - "button_exit[0.1,3.3;3.8,1;moveAB;" .. S("Move A-B") .. "]" .. - "button_exit[4.1,3.3;3.8,1;moveBA;" .. S("Move B-A") .. "]" .. - "button[4.1,2.2;3.8,1;store;" .. S("Store") .. "]" - end - return "size[8,5]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "box[0,-0.1;7.2,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("TA4 Move Controller")) .. "]" .. - techage.wrench_image(7.4, -0.05) .. - "button[0.1,0.8;3.8,1;record;" .. S("Record") .. "]" .. - "button[4.1,0.8;3.8,1;done;" .. S("Done") .. "]" .. - buttons .. - "label[0.3,4.3;" .. status .. "]" -end - -minetest.register_node("techage:ta4_movecontroller", { - description = S("TA4 Move Controller"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_movecontroller.png", - }, - - after_place_node = function(pos, placer, itemstack) - local meta = M(pos) - techage.logic.after_place_node(pos, placer, "techage:ta4_movecontroller", S("TA4 Move Controller")) - techage.logic.infotext(meta, S("TA4 Move Controller")) - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec(nvm, meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if fields.record then - nvm.lpos1 = {} - nvm.lpos2 = {} - nvm.moveBA = false - nvm.running = nil - nvm.lastpos = nil - meta:set_string("status", S("Recording...")) - local name = player:get_player_name() - minetest.chat_send_player(name, S("Click on all blocks that shall be moved")) - mark.unmark_all(name) - mark.start(name, MAX_BLOCKS) - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.done then - local name = player:get_player_name() - local pos_list = mark.get_poslist(name) - if fly.to_vector(fields.path or "", MAX_DIST) then - meta:set_string("path", fields.path) - end - local text = #pos_list.." "..S("block positions are stored.") - nvm.running = nil - nvm.lastpos = nil - meta:set_string("status", text) - nvm.lpos1 = pos_list - mark.unmark_all(name) - mark.stop(name) - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.store then - if fly.to_vector(fields.path or "", MAX_DIST) then - meta:set_string("path", fields.path) - meta:set_string("status", S("Stored")) - else - meta:set_string("status", S("Error: Invalid distance !!")) - end - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - mark.stop(name) - nvm.moveBA = false - nvm.running = nil - nvm.lastpos = nil - elseif fields.moveAB then - meta:set_string("status", "") - if fly.move_to_other_pos(pos, false) then - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - mark.stop(name) - end - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.moveBA then - meta:set_string("status", "") - if fly.move_to_other_pos(pos, true) then - meta:set_string("formspec", formspec(nvm, meta)) - local name = player:get_player_name() - mark.stop(name) - end - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.move2 then - if fly.to_vector(fields.path or "", MAX_DIST) then - meta:set_string("path", fields.path) - end - local line = fly.to_vector(meta:get_string("path"), MAX_DIST) - if line then - fly.move_to(pos, line) - end - elseif fields.reset then - fly.reset_move(pos) - end - end, - - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not clicker or minetest.is_protected(pos, clicker:get_player_name()) then - return - end - local meta = M(pos) - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec(nvm, meta)) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local name = digger:get_player_name() - mark.unmark_all(name) - mark.stop(name) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - ta4_formspec = WRENCH_MENU, - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -local INFO = [[Commands: 'state', 'a2b', 'b2a', 'move']] - -techage.register_node({"techage:ta4_movecontroller"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - local move_xyz = M(pos):get_string("opmode") == "move xyz" - if topic == "info" then - return INFO - elseif topic == "state" then - return nvm.running and "running" or "stopped" - elseif not move_xyz and topic == "a2b" then - return fly.move_to_other_pos(pos, false) - elseif not move_xyz and topic == "b2a" then - return fly.move_to_other_pos(pos, true) - elseif not move_xyz and topic == "move" then - return fly.move_to_other_pos(pos, nvm.moveBA == false) - elseif move_xyz and topic == "move2" then - local line = fly.to_vector(payload, MAX_DIST) - if line then - return fly.move_to(pos, line) - end - return false - elseif topic == "reset" then - return fly.reset_move(pos) - end - return false - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - local move_xyz = M(pos):get_string("opmode") == "move xyz" - --print("on_beduino_receive_cmnd", P2S(pos), move_xyz, topic, payload[1]) - if not move_xyz and topic == 11 then - if payload[1] == 1 then - return fly.move_to_other_pos(pos, false) and 0 or 3 - elseif payload[1] == 2 then - return fly.move_to_other_pos(pos, true) and 0 or 3 - elseif payload[1] == 3 then - return fly.move_to_other_pos(pos, nvm.moveBA == false) and 0 or 3 - end - elseif move_xyz and topic == 18 then -- move xyz - local line = { - x = techage.in_range(techage.beduino_signed_var(payload[1]), -100, 100), - y = techage.in_range(techage.beduino_signed_var(payload[2]), -100, 100), - z = techage.in_range(techage.beduino_signed_var(payload[3]), -100, 100), - } - return fly.move_to(pos, line) and 0 or 3 - elseif move_xyz and topic == 19 then -- reset - return fly.reset_move(pos) and 0 or 3 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 129 then - return 0, {nvm.running and 1 or 6} - end - return 2, "" - end, - on_node_load = function(pos, node) - M(pos):set_string("teleport_mode", "") -- delete not working (legacy) op mode - M(pos):set_string("status", "") - end, -}) - -minetest.register_node("techage:rack_and_pinion", { - description = S("TA Rack and Pinion"), - tiles = { - -- up, down, right, left, back, front - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "default_steel_block.png", - "techage_rack_and_pinion.png", - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -6/32, -16/32, 14.1/32, 6/32, 16/32, 16/32}, - }, - }, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "facedir", - is_ground_content = false, - groups = {cracky = 1, level = 2}, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:moveblock", { - description = "Techage Invisible Move Block", - drawtype = "glasslike_framed_optional", - inventory_image = 'techage_inv_invisible.png', - tiles = {"blank.png"}, - selection_box = { - type = "fixed", - fixed = { - {-16/32, -16/32, -16/32, 16/32, -14/32, 16/32}, - }, - }, - paramtype = "light", - light_source = 0, - sunlight_propagates = true, - walkable = false, - pointable = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1}, - sounds = default.node_sound_glass_defaults(), -}) - - -minetest.register_craft({ - output = "techage:ta4_movecontroller", - recipe = { - {"default:steel_ingot", "dye:blue", "default:steel_ingot"}, - {"default:mese_crystal_fragment", "techage:ta4_wlanchip", "default:mese_crystal_fragment"}, - {"group:wood", "basic_materials:gear_steel", "group:wood"}, - }, -}) - -minetest.register_craft({ - output = "techage:rack_and_pinion 10", - recipe = { - {"", "default:steel_ingot", ""}, - {"basic_materials:steel_bar", "default:steel_ingot", "basic_materials:steel_bar"}, - {"", "default:steel_ingot", ""}, - }, -}) diff --git a/techage/move_controller/soundblock.lua b/techage/move_controller/soundblock.lua deleted file mode 100644 index 7743f0f..0000000 --- a/techage/move_controller/soundblock.lua +++ /dev/null @@ -1,149 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2021-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Sound Block - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local t = {} -for idx, ogg in ipairs(techage.OggFileList) do - t[idx] = idx .. "," .. ogg -end -local OGG_FILES = table.concat(t, ",") - -local logic = techage.logic - -local GAIN = {0.05 ,0.1, 0.2, 0.5, 1.0} - - -local function play_sound(pos, ogg, gain) - minetest.sound_play(ogg, { - pos = pos, - gain = GAIN[gain or 1] or 1, - max_hear_distance = 15}) -end - -local function formspec(meta) - local idx = meta:contains("idx") and meta:get_int("idx") or 1 - local gain = meta:contains("gain") and meta:get_int("gain") or 1 - return "size[8,8]".. - "tablecolumns[text,width=5;text]".. - "table[0,0;8,6;oggfiles;" .. OGG_FILES .. ";" .. idx .. "]" .. - "dropdown[0,6.5;5.5,1.4;gain;1,2,3,4,5;" .. gain .. "]" .. - "button[2.5,7.2;3,1;play;" .. S("Play") .. "]" -end - -local function play_predefined_sound(pos) - local mem = techage.get_mem(pos) - if not mem.blocking_time or (mem.blocking_time < minetest.get_gametime()) then - local idx = M(pos):get_int("idx") - local ogg = techage.OggFileList[idx or 1] or techage.OggFileList[1] - local gain = M(pos):get_int("gain") - play_sound(pos, ogg, gain) - mem.blocking_time = minetest.get_gametime() + 2 - return true - end -end - -minetest.register_node("techage:ta3_soundblock", { - description = S("TA3 Sound Block"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_sound.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - logic.after_place_node(pos, placer, "techage:ta3_soundblock", S("TA3 Sound Block")) - logic.infotext(meta, S("TA3 Sound Block")) - meta:set_string("formspec", formspec(meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - if fields.oggfiles then - local mem = techage.get_mem(pos) - local t = minetest.explode_table_event(fields.oggfiles) - mem.idx = t.row - end - if fields.gain then - M(pos):set_int("gain", tonumber(fields.gain) or 1) - end - if fields.play then - local mem = techage.get_mem(pos) - M(pos):set_int("idx", mem.idx or 1) - local ogg = techage.OggFileList[mem.idx or 1] or techage.OggFileList[1] - play_sound(pos, ogg, M(pos):get_int("gain")) - end - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -local INFO = [[Commands: 'on', 'sound', 'gain']] - -techage.register_node({"techage:ta3_soundblock"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "info" then - return INFO - elseif topic == "on" then - play_predefined_sound(pos) - elseif topic == "sound" then - M(pos):set_int("idx", tonumber(payload or 1) or 1) - elseif topic == "gain" then - M(pos):set_int("gain", tonumber(payload or 1) or 1) - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - print("ta3_soundblock", topic, payload[1], payload[2]) - if topic == 1 then - if payload[1] == 1 then - play_predefined_sound(pos) - return 0 - end - elseif topic == 14 then - if payload[1] == 1 then - M(pos):set_int("gain", payload[2]) - return 0 - elseif payload[1] == 2 then - M(pos):set_int("idx", payload[2]) - return 0 - end - end - return 2 -- unknown or invalid topic - end, - on_node_load = function(pos) - local meta = M(pos) - meta:set_string("formspec", formspec(meta)) - end -}) - -minetest.register_craft({ - output = "techage:ta3_soundblock", - recipe = { - {"", "group:wood",""}, - {"techage:vacuum_tube", "basic_materials:gold_wire", "techage:usmium_nuggets"}, - {"", "group:wood", ""}, - }, -}) diff --git a/techage/move_controller/turncontroller.lua b/techage/move_controller/turncontroller.lua deleted file mode 100644 index 10fb4cb..0000000 --- a/techage/move_controller/turncontroller.lua +++ /dev/null @@ -1,207 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Turn Controller - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local S = techage.S - -local MP = minetest.get_modpath("techage") -local mark = dofile(MP .. "/basis/mark_lib.lua") -local fly = techage.flylib - -local MAX_BLOCKS = 16 - -local function formspec(nvm, meta) - local status = meta:get_string("status") - local path = meta:contains("path") and meta:get_string("path") or "0,3,0" - return "size[8,3]" .. - "box[0,-0.1;7.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("TA4 Turn Controller")) .. "]" .. - --techage.wrench_image(7.4, -0.05) .. - "button[0.1,0.7;3.8,1;record;" .. S("Record") .. "]" .. - "button[4.1,0.7;3.8,1;done;" .. S("Done") .. "]" .. - "button[0.1,1.5;3.8,1;left;" .. S("Turn left") .. "]" .. - "button[4.1,1.5;3.8,1;right;" .. S("Turn right") .. "]" .. - "label[0.3,2.5;" .. status .. "]" -end - -minetest.register_node("techage:ta4_turncontroller", { - description = S("TA4 Turn Controller"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_turn.png", - }, - - after_place_node = function(pos, placer, itemstack) - local meta = M(pos) - techage.logic.after_place_node(pos, placer, "techage:ta4_turncontroller", S("TA4 Turn Controller")) - techage.logic.infotext(meta, S("TA4 Turn Controller")) - local nvm = techage.get_nvm(pos) - meta:set_string("formspec", formspec(nvm, meta)) - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - - local meta = M(pos) - local nvm = techage.get_nvm(pos) - - if fields.record then - nvm.lpos1 = {} - nvm.lpos2 = {} - meta:set_string("status", S("Recording...")) - local name = player:get_player_name() - minetest.chat_send_player(name, S("Click on all blocks that shall be turned")) - mark.start(name, MAX_BLOCKS) - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.done then - local name = player:get_player_name() - local pos_list = mark.get_poslist(name) - local text = #pos_list.." "..S("block positions are stored.") - meta:set_string("status", text) - nvm.lpos = pos_list - mark.unmark_all(name) - mark.stop(name) - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.left then - meta:set_string("status", "") - if nvm.lpos then - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "l") - if new_posses then - nvm.lpos = new_posses - local name = player:get_player_name() - mark.stop(name) - end - end - meta:set_string("formspec", formspec(nvm, meta)) - elseif fields.right then - meta:set_string("status", "") - if nvm.lpos then - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - local name = player:get_player_name() - mark.stop(name) - end - end - meta:set_string("formspec", formspec(nvm, meta)) - end - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local name = digger:get_player_name() - mark.unmark_all(name) - mark.stop(name) - techage.remove_node(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -local INFO = [[Commands: 'left', 'right', 'uturn']] - -techage.register_node({"techage:ta4_turncontroller"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "info" then - return INFO - elseif topic == "left" then - local nvm = techage.get_nvm(pos) - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "l") - if new_posses then - nvm.lpos = new_posses - return true - end - return false - elseif topic == "right" then - local nvm = techage.get_nvm(pos) - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - return true - end - return false - elseif topic == "uturn" then - local nvm = techage.get_nvm(pos) - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - return true - end - end - return false - end - return false - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 12 then - if payload[1] == 1 then - local nvm = techage.get_nvm(pos) - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "l") - if new_posses then - nvm.lpos = new_posses - return 0 - end - return 3 - elseif payload[1] == 2 then - local nvm = techage.get_nvm(pos) - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - return 0 - end - return 3 - elseif payload[1] == 3 then - local nvm = techage.get_nvm(pos) - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - return 0 - end - end - return 3 - end - return 2 - else - return 2 - end - end, - on_node_load = function(pos, node) - M(pos):set_string("status", "") - end, -}) - -minetest.register_craft({ - output = "techage:ta4_turncontroller", - recipe = { - {"default:steel_ingot", "dye:blue", "default:steel_ingot"}, - {"techage:aluminum", "techage:baborium_ingot", "techage:aluminum"}, - {"group:wood", "basic_materials:gear_steel", "group:wood"}, - }, -}) diff --git a/techage/oil/distiller.lua b/techage/oil/distiller.lua deleted file mode 100644 index ff4dec8..0000000 --- a/techage/oil/distiller.lua +++ /dev/null @@ -1,269 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Distillation Tower - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - - -local function orientation(pos, names) - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - for _,name in ipairs(names) do - if node.name == name then - local param2 = node.param2 - node = minetest.get_node(pos) - node.param2 = param2 - minetest.swap_node(pos, node) - return - end - end - minetest.remove_node(pos) - return true -end - -local function after_place_node(pos, placer) - Pipe:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) -end - -minetest.register_node("techage:ta3_distiller_base", { - description = S("TA3 Distillation Tower Base"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_appl_arrowXL.png^techage_appl_hole_pipe.png", - "techage_concrete.png", - "techage_concrete.png", - "techage_concrete.png", - "techage_concrete.png^techage_appl_hole_pipe.png", - "techage_concrete.png", - }, - drawtype = "nodebox", - paramtype = "light", - node_box = { - type = "fixed", - fixed = {-6/8, -4/8, -6/8, 6/8, 4/8, 6/8}, - }, - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - collision_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -liquid.register_nodes({"techage:ta3_distiller_base"}, Pipe, "pump", {"B"}, {}) - -minetest.register_node("techage:ta3_distiller1", { - description = S("TA3 Distillation Tower 1"), - tiles = {"techage_distiller1.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_14.obj", - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - collision_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - - after_place_node = function(pos, placer) - local res = orientation(pos, {"techage:ta3_distiller_base"}) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "B")) - after_place_node(pos, placer) - return res - end, - after_dig_node = after_dig_node, - - paramtype = "light", - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta3_distiller1"}, Pipe, "pump", {"F"}, {}) - -minetest.register_node("techage:ta3_distiller2", { - description = S("TA3 Distillation Tower 2"), - tiles = {"techage_distiller2.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_14.obj", - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - collision_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - - after_place_node = function(pos, placer) - return orientation(pos, {"techage:ta3_distiller1", "techage:ta3_distiller3"}) - end, - - paramtype = "light", - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta3_distiller3", { - description = S("TA3 Distillation Tower 3"), - tiles = {"techage_distiller3.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_14.obj", - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - collision_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - - after_place_node = function(pos, placer) - local res = orientation(pos, {"techage:ta3_distiller2"}) - return res - end, - after_dig_node = after_dig_node, - - paramtype = "light", - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta3_distiller3"}, Pipe, "pump", {"B"}, {}) - -minetest.register_node("techage:ta3_distiller4", { - description = S("TA3 Distillation Tower 4"), - tiles = {"techage_distiller4.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_14.obj", - selection_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - collision_box = { - type = "fixed", - fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - }, - - after_place_node = function(pos, placer) - local res = orientation(pos, {"techage:ta3_distiller3"}) - after_place_node(pos, placer) - return res - end, - after_dig_node = after_dig_node, - - paramtype = "light", - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -liquid.register_nodes({"techage:ta3_distiller4"}, Pipe, "pump", {"U"}, {}) - -local Liquids = {"techage:bitumen", "techage:fueloil", "techage:naphtha", "techage:gasoline", "techage:gas"} -local YPos = {-1, 2, 4, 6, 7} - -techage.register_node({"techage:ta3_distiller1"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "put" then - local nvm = techage.get_nvm(pos) - nvm.idx = nvm.idx or 1 - local outdir - if nvm.idx == 5 then - outdir = 6 -- up - else - outdir = M(pos):get_int("outdir") - end - local pos2 = {x = pos.x, y = pos.y + YPos[nvm.idx], z = pos.z} - local leftover = liquid.put(pos2, Pipe, outdir, Liquids[nvm.idx], 1) - if leftover == 0 then - nvm.idx = (nvm.idx % 5) + 1 - end - return leftover - end - end, -}) - -minetest.register_craft({ - output = 'techage:ta3_distiller2', - recipe = { - {'default:steel_ingot', 'default:tin_ingot', 'default:steel_ingot'}, - {'techage:iron_ingot', 'techage:ta3_barrel_empty', 'techage:iron_ingot'}, - {'default:steel_ingot', 'default:tin_ingot', 'default:steel_ingot'}, - } -}) - -minetest.register_craft({ - output = 'techage:ta3_distiller1', - recipe = { - {'', '', ''}, - {'techage:ta3_pipeS', 'techage:ta3_distiller2', ''}, - {'', '', ''}, - } -}) - -minetest.register_craft({ - output = 'techage:ta3_distiller3', - recipe = { - {'', '', ''}, - {'', 'techage:ta3_distiller2', 'techage:ta3_pipeS'}, - {'', '', ''}, - } -}) - -minetest.register_craft({ - output = 'techage:ta3_distiller4', - recipe = { - {'', 'techage:ta3_pipeS', ''}, - {'', 'techage:ta3_distiller2', ''}, - {'', '', ''}, - } -}) - -minetest.register_craft({ - output = 'techage:ta3_distiller_base', - recipe = { - {'basic_materials:concrete_block', 'techage:ta3_pipeS', 'basic_materials:concrete_block'}, - {'', 'techage:ta3_pipeS', 'techage:ta3_pipeS'}, - {'basic_materials:concrete_block', '', 'basic_materials:concrete_block'}, - } -}) diff --git a/techage/oil/drillbox.lua b/techage/oil/drillbox.lua deleted file mode 100644 index 63b9c92..0000000 --- a/techage/oil/drillbox.lua +++ /dev/null @@ -1,319 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Oil Drill Box - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end - -local STANDBY_TICKS = 2 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 16 - -local formspec0 = "size[5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "image[1,0;3.4,3.4;techage_ta3.png]".. - "button_exit[1,3.2;3,1;build;"..S("Build derrick").."]" - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_oildrill", { - pos = pos, - gain = 1, - max_hear_distance = 15, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function formspec(self, pos, nvm) - if not nvm.assemble_build then - return formspec0 - end - local depth = M(pos):get_int("depth") - local curr_depth = pos.y - (nvm.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;"..S("Drill Bit").."]".. - "label[0.5,3;"..S("Depth")..": "..curr_depth.."/"..depth.."]".. - "image[3.5,0;1,1;"..techage.get_power_image(pos, nvm).."]".. - "image[3.5,1;1,1;techage_form_arrow.png]".. - "image_button[3.5,2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[3.5,2;1,1;"..self:get_state_tooltip(nvm).."]".. - "label[6.2,0.5;OUT]".. - "list[context;dst;6,1;1,1;]".. - "button_exit[5,3;3,1;remove;"..S("Remove derrick").."]".. - "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 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, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) -end - -local function on_node_state_change(pos, old_state, new_state) - if new_state == techage.RUNNING then - play_sound(pos) - else - stop_sound(pos) - end -end - -local function drilling(pos, crd, nvm, inv) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) - nvm.drill_pos = nvm.drill_pos or {x=pos.x, y=pos.y-1, z=pos.z} - local owner = M(pos):get_string("owner") - local depth = M(pos):get_int("depth") - local curr_depth = pos.y - (nvm.drill_pos or pos).y - local node = techage.get_node_lvm(nvm.drill_pos) - local ndef = minetest.registered_nodes[node.name] - - if not inv:contains_item("src", ItemStack("techage:oil_drillbit")) then - crd.State:idle(pos, nvm, S("Drill bits missing")) - elseif curr_depth >= depth then - M(pos):set_string("oil_found", "true") - crd.State:stop(pos, nvm) - elseif node.name == "techage:oilstorage" then -- old oil bubble node? - nvm.drill_pos.y = nvm.drill_pos.y-1 - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - elseif minetest.is_protected(nvm.drill_pos, owner) then - crd.State:fault(pos, nvm, S("Drill area is protected")) - elseif node.name == "techage:oil_drillbit2" then - nvm.drill_pos.y = nvm.drill_pos.y-1 - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - elseif minetest.get_item_group(node.name, "lava") >= 1 then - minetest.swap_node(nvm.drill_pos, {name = "techage:oil_drillbit2"}) - inv:remove_item("src", ItemStack("techage:oil_drillbit")) - nvm.drill_pos.y = nvm.drill_pos.y-1 - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - elseif techage.can_dig_node(node.name, ndef) then - local drop_name = techage.dropped_node(node, ndef) - if drop_name then - local item = ItemStack(drop_name) - if not inv:room_for_item("dst", item) then - crd.State:blocked(pos, nvm, S("item output blocked")) - return - end - inv:add_item("dst", item) - end - minetest.swap_node(nvm.drill_pos, {name = "techage:oil_drillbit2"}) - inv:remove_item("src", ItemStack("techage:oil_drillbit")) - nvm.drill_pos.y = nvm.drill_pos.y-1 - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - elseif node.name == "ignore" then - -- load world and pause the drilling for one step - minetest.emerge_area(nvm.drill_pos, nvm.drill_pos) - end -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - local inv = M(pos):get_inventory() - if inv then - drilling(pos, crd, nvm, inv) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) - end -end - -local function can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local nvm = techage.get_nvm(pos) - if nvm.assemble_locked or nvm.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.remove 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 nvm = techage.get_nvm(pos) - if not nvm.assemble_locked and M(pos):get_string("oil_found") ~= "true" then - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) - 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 - -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(pos, inv, "dst", num) - end - end, - on_push_item = function(pos, in_dir, stack) - local nvm = techage.get_nvm(pos) - if not nvm.assemble_locked then - local meta = minetest.get_meta(pos) - if meta:get_int("push_dir") == in_dir then - local inv = M(pos):get_inventory() - CRD(pos).State:start_if_standby(pos) - return techage.put_items(inv, "src", stack) - end - 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, src, topic, payload) - return CRD(pos).State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end, - on_node_load = function(pos, node) - CRD(pos).State:on_node_load(pos) - local nvm = techage.get_nvm(pos) - nvm.assemble_locked = false - if nvm.techage_state == techage.RUNNING then - play_sound(pos) - end - end, -} - -local _, node_name_ta3, _ = - techage.register_consumer("drillbox", S("Oil Drill Box"), tiles, { - drawtype = "normal", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - on_state_change = on_node_state_change, - 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 - 5) -- oil bubble - M(pos):set_int("amount", info.amount) - M(pos):set_string("oil_found", "false") - M(pos):set_string("owner", placer:get_player_name()) - 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}, - tube_sides = {L=1, R=1}, - }, - {false, false, true, false}) -- TA3 only - -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", "techage:vacuum_tube", "default:steel_ingot"}, - }, -}) diff --git a/techage/oil/explore.lua b/techage/oil/explore.lua deleted file mode 100644 index bc2407f..0000000 --- a/techage/oil/explore.lua +++ /dev/null @@ -1,350 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Oil Explorer - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S = techage.S - -local PROBABILITY = 100 -local OIL_MIN = 4096 -local OIL_MAX = 20000 -local DEPTH_MIN = 16 -local DEPTH_MAX = 25*16 -local DEPTH_STEP = 16 -local YPOS_MAX = -6*16 -- oil can't found below this level -local OIL_BUBBLE_SIZE = 4096 - -local seed = tonumber(minetest.settings:get("techage_oil_exploration_seed")) or 1234 -- confidental! - -local InvalidGroundNodes = { - ["air"] = true, -} - -local ValidGroundNodes = { - ["default:cobble"] = true, - ["default:mossycobble"] = true, - ["default:desert_cobble"] = true, -} - -local function oil_amount(pos) - if pos.y > YPOS_MAX then return 0 end - local block_key = seed + - math.floor((pos.z + 32768) / 16) * 4096 * 4096 + - math.floor((pos.y + 32768) / 16) * 4096 + - math.floor((pos.x + 32768) / 16) - math.randomseed(block_key) - math.random(); math.random(); math.random() - local has_oil = math.random(1,PROBABILITY) == 1 - if has_oil then - local amount = math.random(OIL_MIN, OIL_MAX) - return amount - end - -- Generate new randomseed after use - math.randomseed(os.time()) - return 0 -end - -local function center(coord) - return (math.floor(coord/16) * 16) + 8 -end - -local function basis(coord) - return (math.floor(coord/16) * 16) -end - --- determine the mapblock coordinates -local function mapblock_coordinates(pos) - local pos1 = {x = basis(pos.x), y = basis(pos.y), z = basis(pos.z)} - local pos2 = {x = pos1.x + 15, y = pos1.y + 15, z = pos1.z + 15} - return pos1, pos2 -end - -local function calc_depth(pos, explore_pos) - return pos.y - explore_pos.y + 1 -end - --- posC is the center position of the oil bubble --- idx is the vmdata index --- function returns the real position {x,y,z} -local function calc_vmdata_pos(posC, idx) - local rest, xoffs, yoffs, zoffs - - rest = idx - 1 - xoffs = rest % 16 - rest = math.floor(rest / 16) - zoffs = rest % 16 - rest = math.floor(rest / 16) - yoffs = rest % 16 - return {x = basis(posC.x) + xoffs, y = basis(posC.y) + yoffs, z = basis(posC.z) + zoffs} -end - -local function calc_vmdata_index(xoffs, yoffs, zoffs) - return (xoffs + (yoffs * 16) + (zoffs * 16 * 16)) + 1 -end - --- from/to are x/z-offsets (0..15) for one layer of oil within one mapblock -local function gen_oil_slice(yoffs, from, to, vmdata, id) - for xoffs = from, to do - for zoffs = from, to do - vmdata[calc_vmdata_index(xoffs, yoffs, zoffs)] = id - end - end -end - -local function gen_oil_bubble(vmdata) - local id = minetest.get_content_id("techage:oil_source") - - gen_oil_slice(1, 3, 12, vmdata, id) - gen_oil_slice(2, 2, 13, vmdata, id) - for offs = 3, 12 do - gen_oil_slice(offs, 1, 14, vmdata, id) - end - gen_oil_slice(13, 2, 13, vmdata, id) - gen_oil_slice(14, 3, 12, vmdata, id) -end - -local function useable_stone_block(data) - local valid = {} - for _,id in ipairs(data) do - if not valid[id] then - local itemname = minetest.get_name_from_content_id(id) - if not ValidGroundNodes[itemname] then - local ndef = minetest.registered_nodes[itemname] - if InvalidGroundNodes[itemname] or not ndef or ndef.is_ground_content == false then - return false - end - end - valid[id] = true - end - end - return true -end - -local function get_next_explore_pos(pos) - local meta = M(pos) - local ypos = meta:get_int("exploration_ypos") - if ypos == 0 then - ypos = math.min(YPOS_MAX, center(pos.y)) - end - local d = calc_depth(pos, {y = ypos}) - if d + DEPTH_STEP < DEPTH_MAX then - ypos = ypos - DEPTH_STEP - local posC = {x = center(pos.x), y = center(ypos), z = center(pos.z)} - local node = techage.get_node_lvm(posC) - if node.name ~= "ignore" then - meta:set_int("exploration_ypos", ypos) - else - -- load world and pause for one step - minetest.emerge_area(posC, posC) - end - - end - return {x = center(pos.x), y = center(ypos), z = center(pos.z)} -end - -local function get_oil_amount(pos) - return M(pos):get_int("oil_amount") -end - -local function set_oil_amount(pos, amount) - minetest.set_node(pos, {name = "techage:oilstorage"}) - M(pos):set_int("oil_amount", amount) - M(pos):set_int("initial_oil_amount", amount) -end - -local function status(pos, player_name, explore_pos, amount) - local depth = calc_depth(pos, explore_pos) - minetest.chat_send_player(player_name, - "[TA Oil] "..P2S(explore_pos).." "..S("depth")..": "..depth..", "..S("Oil")..": "..amount.." ") -end - -local function marker(player_name, pos) - local posC = {x = center(pos.x), y = pos.y, z = center(pos.z)} - local pos1 = {x = posC.x - 2, y = posC.y - 2, z = posC.z - 2} - local pos2 = {x = posC.x + 2, y = posC.y + 7, z = posC.z + 2} - techage.switch_region(player_name, pos1, pos2) -end - --- check if oil can be placed and if so, do it and return true -local function generate_oil_bubble(posC, amount) - local pos1, pos2 = mapblock_coordinates(posC) - local vm = minetest.get_voxel_manip(pos1, pos2) - local data = vm:get_data() - - if useable_stone_block(data) then - gen_oil_bubble(data) - vm:set_data(data) - vm:write_to_map() - vm:update_map() - set_oil_amount(posC, amount) - return true - end - return false -end - -local function explore_area(pos, node, player_name) - if M(pos):get_int("oil_amount") == 0 then -- nothing found so far? - local posC, amount - - node.name = "techage:oilexplorer_on" - minetest.swap_node(pos, node) - minetest.get_node_timer(pos):start(2.2) - minetest.sound_play("techage_explore", { - pos = pos, - max_hear_distance = 8}) - - for i = 1,4 do - posC = get_next_explore_pos(pos) - amount = oil_amount(posC) - if amount > 0 then - break - end - end - - if amount > 0 then - if get_oil_amount(posC) == 0 then -- not explored so far? - if generate_oil_bubble(posC, amount) then - marker(player_name, pos) - else - amount = 0 - end - end - M(pos):set_int("oil_amount", amount) - end - - minetest.after(2, status, pos, player_name, posC, amount) - else - local explore_pos = {x = center(pos.x), y = M(pos):get_int("exploration_ypos"), z = center(pos.z)} - status(pos, player_name, explore_pos, M(pos):get_int("oil_amount")) - marker(player_name, pos) - end -end - --- Used as storage for already explored blocks -minetest.register_node("techage:oilstorage", { - description = S("TA3 Oil Storage"), - tiles = {"default_stone.png"}, - groups = {not_in_creative_inventory=1}, - diggable = false, - drop = "", - is_ground_content = false, -}) - -minetest.register_node("techage:oilexplorer", { - description = S("TA3 Oil Explorer"), - tiles = { - "techage_filling_ta3.png^techage_appl_oilexplorer_top.png^techage_frame_ta3_top.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_oilexplorer.png", - }, - - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - explore_area(pos, node, clicker:get_player_name()) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.unmark_region(digger:get_player_name()) - local xpos = (math.floor(pos.x / 16) * 16) - local ypos = (math.floor(pos.y / 16) * 16) - local zpos = (math.floor(pos.z / 16) * 16) - local pos1 = {x=xpos, y=ypos, z=zpos} - local pos2 = {x=xpos+15, y=ypos+15, z=zpos+15} - techage.mark_region(digger:get_player_name(), pos1, pos2) - end, - is_ground_content = false, - groups = {snappy=2,cracky=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:oilexplorer_on", { - description = S("TA3 Oil Explorer"), - tiles = { - { - name = "techage_filling4_ta3.png^techage_appl_oilexplorer_top4.png^techage_frame4_ta3_top.png", - backface_culling = false, - animation = { - type = "vertical_frames", - - aspect_w = 32, - aspect_h = 32, - length = 1.2, - }, - }, - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_oilexplorer.png", - }, - - on_timer = function(pos,elapsed) - local node = minetest.get_node(pos) - node.name = "techage:oilexplorer" - minetest.swap_node(pos, node) - end, - - diggable = false, - is_ground_content = false, - paramtype = "light", - light_source = 8, - groups = {not_in_creative_inventory=1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:oilexplorer", - recipe = { - {"group:wood", "default:diamond", "group:wood"}, - {"techage:baborium_ingot", "basic_materials:gear_steel", "techage:usmium_nuggets"}, - {"group:wood", "techage:vacuum_tube", "group:wood"}, - }, -}) - - -techage.explore = {} - -function techage.explore.get_oil_info(pos) - local amount = 0 - local depth = DEPTH_MIN - local posC = {x = center(pos.x), y = center(pos.y) - DEPTH_MIN, z = center(pos.z)} - while amount == 0 and depth < DEPTH_MAX do - amount = get_oil_amount(posC) - depth = calc_depth(pos, posC) - posC.y = posC.y - DEPTH_STEP - end - posC.y = posC.y + DEPTH_STEP - return {depth = depth, amount = amount, storage_pos = posC} -end - -function techage.explore.get_oil_amount(posC) - local meta = M(posC) - if meta:get_int("initial_oil_amount") == 0 then - meta:set_int("initial_oil_amount", meta:get_int("oil_amount")) - end - return meta:get_int("oil_amount"), meta:get_int("initial_oil_amount") -end - -function techage.explore.dec_oil_amount(posC) - local oil_amount, oil_initial = techage.explore.get_oil_amount(posC) - oil_amount = oil_amount - 1 - M(posC):set_int("oil_amount", oil_amount) - - local idx = math.floor(oil_amount * OIL_BUBBLE_SIZE / oil_initial) - idx = idx + 256 -- last level is stone, so add one level - if idx <= (OIL_BUBBLE_SIZE - 256) then -- first level is stone, too - local pos = calc_vmdata_pos(posC, idx) - local node = techage.get_node_lvm(pos) - if node.name == "techage:oil_source" then - minetest.remove_node(pos) - end - end - return oil_amount -end diff --git a/techage/oil/gasflare.lua b/techage/oil/gasflare.lua deleted file mode 100644 index e8edb96..0000000 --- a/techage/oil/gasflare.lua +++ /dev/null @@ -1,182 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Gas flare - -]]-- - - -local HEIGHT = 7 - -local function remove_flame(pos) - local idx - for idx=HEIGHT,1,-1 do - pos = {x=pos.x, y=pos.y+1, z=pos.z} - local node = minetest.get_node(pos) - if string.find(node.name, "techage:flame") then - minetest.remove_node(pos) - end - end -end - -local function flame(pos) - local idx - for idx=HEIGHT,1,-1 do - pos = {x=pos.x, y=pos.y+1, z=pos.z} - idx = math.min(idx, 12) - local node = minetest.get_node(pos) - if node.name ~= "air" then - return - end - minetest.add_node(pos, {name = "techage:flame"..math.min(idx,7)}) - local meta = minetest.get_meta(pos) - end -end - - -local lRatio = {120, 110, 95, 75, 55, 28, 0} -local lColor = {"400040", "600020", "800000", "800000", "800000", "800000", "800000"} -for idx,ratio in ipairs(lRatio) do - local color = "techage_flame_animated.png^[colorize:#"..lColor[idx].."B0:"..ratio - minetest.register_node("techage:flame"..idx, { - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/8, -4/8, -2/8, 3/8, 4/8, 2/8}, - {-2/8, -4/8, -3/8, 2/8, 4/8, 3/8}, - }, - }, - tiles = { - { - name = color, - animation = { - type = "vertical_frames", - aspect_w = 16, - aspect_h = 16, - length = 1 - }, - }, - }, - - after_destruct = function(pos, oldnode) - pos.y = pos.y + 1 - local node = minetest.get_node(pos) - if minetest.get_item_group(node.name, "techage_flame") > 0 then - minetest.remove_node(pos) - end - end, - - use_texture_alpha = techage.BLEND, - inventory_image = "techage_flame.png", - paramtype = "light", - light_source = 13, - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - is_ground_content = false, - drop = "", - drowning = 1, - damage_per_second = 4 + idx, - groups = {igniter = 2, dig_immediate = 3, techage_flame=1, not_in_creative_inventory=1}, - drop = "", - }) -end - -local function start_flarestack(pos, playername) - if minetest.is_protected( - {x=pos.x, y=pos.y+1, z=pos.z}, - playername) then - return - end - local meta = minetest.get_meta(pos) - flame({x=pos.x, y=pos.y+1, z=pos.z}) - local handle = minetest.sound_play("gasflare", { - pos = pos, - max_hear_distance = 20, - gain = 1, - loop = true}) - --print("handle", handle) - meta:set_int("handle", handle) -end - -local function stop_flarestack(pos, handle) - remove_flame({x=pos.x, y=pos.y+1, z=pos.z}) - minetest.sound_stop(handle) -end - -minetest.register_node("techage:gasflare", { - description = "gas flare", - tiles = { - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png", - "techage_gasflare.png^techage_appl_hole_pipe.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - if node.name ~= "air" then - return - end - minetest.add_node({x=pos.x, y=pos.y+1, z=pos.z}, {name = "techage:gasflare2"}) - end, - - on_punch = function(pos, node, puncher) - local meta = minetest.get_meta(pos) - local handle = meta:get_int("handle") - minetest.sound_stop(handle) - start_flarestack(pos, puncher:get_player_name()) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - --print(dump(oldmetadata)) - stop_flarestack(pos, oldmetadata.fields.handle) - local node = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}) - if node.name == "techage:gasflare2" then - minetest.remove_node({x=pos.x, y=pos.y+1, z=pos.z}) - end - end, - - paramtype = "light", - light_source = 0, - sunlight_propagates = true, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:gasflare2", { - description = "", - tiles = { - "techage_gasflare.png^techage_appl_hole_tube.png", - "techage_gasflare.png" - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -4/8, -1/8, 1/8, 4/8, 1/8}, - {-4/8, 3/8, -4/8, 4/8, 4/8, 4/8}, - }, - }, - paramtype = "light", - light_source = 0, - sunlight_propagates = true, - paramtype2 = "facedir", - diggable = false, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) diff --git a/techage/oil/pumpjack.lua b/techage/oil/pumpjack.lua deleted file mode 100644 index 2756e54..0000000 --- a/techage/oil/pumpjack.lua +++ /dev/null @@ -1,259 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Pumpjack - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta -local P = minetest.string_to_pos -local S = techage.S -local Pipe = techage.LiquidPipe -local liquid = networks.liquid - --- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end -local CRDN = function(node) return (minetest.registered_nodes[node.name] or {}).consumer end - -local STANDBY_TICKS = 2 -local COUNTDOWN_TICKS = 10 -local CYCLE_TIME = 8 - -local function has_oil(pos, meta) - local storage_pos = meta:get_string("storage_pos") - if storage_pos ~= "" then - local amount, initial_amount = techage.explore.get_oil_amount(P(storage_pos)) - if amount > 0 then - return true - end - end -end - -local function dec_oil_item(pos, meta) - local storage_pos = meta:get_string("storage_pos") - if storage_pos ~= "" then - techage.explore.dec_oil_amount(P(storage_pos)) - end -end - -local function formspec(self, pos, nvm) - local amount = 0 - local storage_pos = M(pos):get_string("storage_pos") - if storage_pos ~= "" then - amount = techage.explore.get_oil_amount(P(storage_pos)) - end - return "size[5,3]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;4.8,0.5;#c6e8ff]".. - "label[1.5,-0.1;"..minetest.colorize( "#000000", S("Pumpjack")).."]".. - "image[0.5,1.5;1,1;techage_liquid2_inv.png^[colorize:#000000^techage_liquid1_inv.png]".. - "image[4,0.8;1,1;"..techage.get_power_image(pos, nvm).."]".. - "tooltip[4,0.8;1,1;"..S("needs power").."]".. - "label[0,0.8;"..S("Oil amount")..": "..amount.."]".. - "image_button[2,2.2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[2,2.2;1,1;"..self:get_state_tooltip(nvm).."]" -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_reboiler", { - pos = pos, - gain = 1, - max_hear_distance = 15, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function on_node_state_change(pos, old_state, new_state) - if new_state == techage.RUNNING then - play_sound(pos) - else - stop_sound(pos) - end -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(CRD(pos).State, pos, nvm)) -end - -local function pumping(pos, crd, meta, nvm) - if has_oil(pos, meta) then - local leftover = liquid.put(pos, Pipe, 6, "techage:oil_source", 1) - if leftover and leftover > 0 then - crd.State:blocked(pos, nvm) - stop_sound(pos) - return - end - dec_oil_item(pos, meta) - crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - return - end - crd.State:fault(pos, nvm, S("no oil")) -end - -local function keep_running(pos, elapsed) - local nvm = techage.get_nvm(pos) - local crd = CRD(pos) - pumping(pos, crd, M(pos), nvm) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(crd.State, pos, nvm)) - end -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - CRD(pos).State:state_button_event(pos, nvm, fields) -end - -local tiles = {} - --- '#' will be replaced by the stage number -tiles.pas = { - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_hole_pipe.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_hole_pipe.png", - "techage_appl_pumpjack.png^techage_frame_ta#.png", - "techage_appl_pumpjack.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png^[transformR90]", - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png^[transformR90]", -} -tiles.act = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_hole_pipe.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_hole_pipe.png", - { - name = "techage_appl_pumpjack14.png^techage_frame14_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - { - name = "techage_appl_pumpjack14.png^techage_frame14_ta#.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png^[transformR90]", - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png^[transformR90]", -} - -local tubing = { - on_recv_message = function(pos, src, topic, payload) - if topic == "load" then - local storage_pos = M(pos):get_string("storage_pos") - if storage_pos ~= "" then - local amount, capa = techage.explore.get_oil_amount(P(storage_pos)) - if amount and capa and capa > 0 then - return techage.power.percent(capa or 0, amount or 0), amount or 0 - end - end - else - return CRD(pos).State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 134 then -- Load - local storage_pos = M(pos):get_string("storage_pos") - if storage_pos ~= "" then - local amount, capa = techage.explore.get_oil_amount(P(storage_pos)) - if amount and capa and capa > 0 then - if payload[1] == 1 then - return 0, {techage.power.percent(capa or 0, amount or 0)} - else - return 0, {math.min(amount or 0, 65535)} - end - end - end - return 2 - else - return CRD(pos).State:on_beduino_request_data(pos, topic, payload) - end - end, - on_node_load = function(pos, node) - CRD(pos).State:on_node_load(pos) - if node.name == "techage:ta3_pumpjack_act" then - play_sound(pos) - end - end, -} - -local _, node_name_ta3, _ = - techage.register_consumer("pumpjack", S("Oil Pumpjack"), tiles, { - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec = formspec, - tubing = tubing, - on_state_change = on_node_state_change, - after_place_node = function(pos, placer) - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name == "techage:oil_drillbit2" then - local info = techage.explore.get_oil_info(pos) - if info then - M(pos):set_string("storage_pos", P2S(info.storage_pos)) - end - end - Pipe:after_place_node(pos) - end, - power_sides = {F=1, B=1, L=1, R=1, D=1}, - on_rightclick = on_rightclick, - on_receive_fields = on_receive_fields, - node_timer = keep_running, - on_rotate = screwdriver.disallow, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_node(pos) - end, - - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - num_items = {0,1,1,1}, - power_consumption = {0,16,16,16}, - }, - {false, false, true, false}) -- TA3 only - -minetest.register_craft({ - output = "techage:ta3_pumpjack_pas", - recipe = { - {"", "techage:usmium_nuggets", ""}, - {"dye:red", "techage:ta3_pusher_pas", "dye:red"}, - {"", "techage:oil_drillbit", ""}, - }, -}) - -liquid.register_nodes({"techage:ta3_pumpjack_pas", "techage:ta3_pumpjack_act"}, Pipe, "pump", {"U"}, {}) diff --git a/techage/oil/reboiler.lua b/techage/oil/reboiler.lua deleted file mode 100644 index 17c6250..0000000 --- a/techage/oil/reboiler.lua +++ /dev/null @@ -1,272 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Oil Reboiler - -]]-- - -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S -local Flip = networks.Flip -local Pipe = techage.LiquidPipe -local Cable = techage.ElectricCable -local liquid = networks.liquid -local power = networks.power - -local CYCLE_TIME = 2 -local WAITING_CYCLES = 5 -- in case BLOCKED -local PWR_NEEDED = 14 - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_reboiler", { - pos = pos, - gain = 1, - max_hear_distance = 15, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function swap_node(pos, on) - local nvm = techage.get_nvm(pos) - local node = techage.get_node_lvm(pos) - if on and node.name == "techage:ta3_reboiler" then - node.name = "techage:ta3_reboiler_on" - minetest.swap_node(pos, node) - play_sound(pos) - elseif not on and node.name == "techage:ta3_reboiler_on" then - node.name = "techage:ta3_reboiler" - minetest.swap_node(pos, node) - stop_sound(pos) - end -end - -local function pump_cmnd(pos) - local leftover = techage.transfer( - pos, - "R", -- outdir - "put", -- topic - nil, -- payload - Pipe, -- Pipe - {"techage:ta3_distiller1"}) - - -- number of processed oil items - return 1 - (tonumber(leftover) or 1) -end - -local function new_state(pos, nvm, state) - if nvm.state ~= state then - nvm.state = state - M(pos):set_string("infotext", S("TA3 Oil Reboiler") .. ": " .. techage.StateStrings[state]) - swap_node(pos, state == techage.RUNNING) - end -end - -local function on_timer(pos) - local nvm = techage.get_nvm(pos) - nvm.oil_amount = nvm.oil_amount or 0 - - -- Power handling - if nvm.state == techage.STOPPED then - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed == PWR_NEEDED then - new_state(pos, nvm, techage.RUNNING) - return true - end - elseif nvm.state == techage.RUNNING then - local consumed = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if consumed < PWR_NEEDED then - local nvm = techage.get_nvm(pos) - new_state(pos, nvm, techage.STOPPED) - return true - end - elseif nvm.state == techage.BLOCKED or nvm.state == techage.STANDBY then - if not power.power_available(pos, Cable) then - local nvm = techage.get_nvm(pos) - new_state(pos, nvm, techage.STOPPED) - return true - end - end - - -- Oil handling - if nvm.state == techage.RUNNING then - if nvm.oil_amount >= 1 then - local processed = pump_cmnd(pos) - nvm.oil_amount = nvm.oil_amount - processed - nvm.waiting_cycles = WAITING_CYCLES - if processed == 0 then - new_state(pos, nvm, techage.BLOCKED) - else - new_state(pos, nvm, techage.RUNNING) - end - else - nvm.waiting_cycles = (nvm.waiting_cycles or 0) - 1 - if nvm.waiting_cycles <= 0 then - new_state(pos, nvm, techage.STANDBY) - end - end - elseif nvm.state == techage.BLOCKED then - nvm.waiting_cycles = nvm.waiting_cycles - 1 - if nvm.waiting_cycles <= 0 then - new_state(pos, nvm, techage.RUNNING) - end - else - -- STANDBY: 'put' will trigger the state change - end - return true -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - new_state(pos, nvm, techage.STOPPED) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - nvm.oil_amount = 0 - new_state(pos, nvm, techage.STOPPED) - minetest.get_node_timer(pos):start(CYCLE_TIME) -end - -minetest.register_node("techage:ta3_reboiler", { - description = S("TA3 Oil Reboiler"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_reboiler.png^techage_frame_ta3.png^[transformFX", - "techage_filling_ta3.png^techage_appl_reboiler.png^techage_frame_ta3.png", - }, - - on_timer = on_timer, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_rightclick = on_rightclick, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:ta3_reboiler_on", { - description = S("TA3 Oil Reboiler"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_pipe.png^techage_frame_ta3.png", - { - name = "techage_filling4_ta3.png^techage_appl_reboiler4.png^techage_frame4_ta3.png^[transformFX", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - { - name = "techage_filling4_ta3.png^techage_appl_reboiler4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 2.0, - }, - }, - }, - - on_timer = on_timer, - on_rightclick = on_rightclick, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - diggable = false, - groups = {not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -local liquid_def = { - peek = function(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - nvm.oil_amount = nvm.oil_amount or 0 - - if nvm.state == techage.STANDBY or nvm.state == techage.RUNNING then - if name == "techage:oil_source" and amount > 0 then - if nvm.state == techage.STANDBY then - new_state(pos, nvm, techage.RUNNING) - end - -- Take one oil item every 2 cycles - -- Hint: We have to take two items, because the pump will pause for 4 cycles, - -- if nothing is taken. - nvm.take = nvm.take ~= true - if nvm.take and nvm.oil_amount < 5 then - nvm.oil_amount = nvm.oil_amount + 2 - return amount - 2 - end - end - end - return amount - end -} - -liquid.register_nodes({"techage:ta3_reboiler", "techage:ta3_reboiler_on"}, Pipe, "tank", {"L", "R"}, liquid_def) -power.register_nodes({"techage:ta3_reboiler", "techage:ta3_reboiler_on"}, Cable, "con") - -techage.register_node({"techage:ta3_reboiler", "techage:ta3_reboiler_on"}, { - on_node_load = function(pos, node) - if node.name == "techage:ta3_reboiler_on" then - play_sound(pos) - end - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -minetest.register_craft({ - output = "techage:ta3_reboiler", - recipe = { - {"", "basic_materials:heating_element", ""}, - {"default:mese_crystal_fragment", "techage:t3_pump", "default:mese_crystal_fragment"}, - {"", "basic_materials:heating_element", ""}, - }, -}) diff --git a/techage/oil/tower.lua b/techage/oil/tower.lua deleted file mode 100644 index dfe9337..0000000 --- a/techage/oil/tower.lua +++ /dev/null @@ -1,286 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Oil Tower - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -minetest.register_node("techage:oiltower1", { - description = S("TA3 Derrick"), - 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", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, -}) - -minetest.register_node("techage:oiltower2", { - description = S("TA3 Derrick"), - 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", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, -}) - -minetest.register_node("techage:oiltower3", { - description = S("TA3 Derrick"), - 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", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, -}) - -minetest.register_node("techage:oiltower4", { - description = S("TA3 Derrick"), - 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", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, -}) - -minetest.register_node("techage:oiltower5", { - description = S("TA4 Derrick"), - 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", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - groups = {not_in_creative_inventory = 1}, - is_ground_content = false, -}) - -minetest.register_node("techage:oil_drillbit", { - description = S("TA3 Drill Pipe"), - 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", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - groups = {cracky = 1}, - is_ground_content = false, -}) - -minetest.register_node("techage:oil_drillbit2", { - description = S("TA3 Drill Pipe"), - 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", - use_texture_alpha = techage.CLIP, - 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) - minetest.chat_send_player(player_name, S("[TA] Derrick is being built!")) - techage.assemble.build(pos, AssemblyPlan, player_name) -end - -function techage.oiltower.remove(pos, player_name) - minetest.chat_send_player(player_name, S("[TA] Derrick is being removed!")) - techage.assemble.remove(pos, AssemblyPlan, player_name) -end diff --git a/techage/power/drive_axle.lua b/techage/power/drive_axle.lua deleted file mode 100644 index 6811ecc..0000000 --- a/techage/power/drive_axle.lua +++ /dev/null @@ -1,194 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Drive Axles for the Steam Engine - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local power = networks.power - -local Axle = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = 10, - show_infotext = false, - tube_type = "axle", - primary_node_names = {"techage:axle", "techage:axle_on", "techage:ta2_clutch_on"}, - secondary_node_names = {}, - after_place_tube = function(pos, param2, tube_type, num_tubes, state) - local node = minetest.get_node(pos) - local name = node.name - if name == "techage:axle_on" or name == "techage:axle" then - if state == "on" then -- texture state - minetest.swap_node(pos, {name = "techage:axle_on", param2 = param2}) - else - minetest.swap_node(pos, {name = "techage:axle", param2 = param2}) - end - else - minetest.swap_node(pos, {name = name, param2 = param2}) - end - end, -}) - --- Use global callback instead of node related functions -Axle:register_on_tube_update2(function(pos, outdir, tlib2, node) - power.update_network(pos, outdir, tlib2, node) -end) - -minetest.register_node("techage:axle", { - description = S("TA2 Drive Axle"), - tiles = { - "techage_axleR.png", - "techage_axleR.png", - "techage_axle.png", - "techage_axle.png", - "techage_axle_clutch.png", - "techage_axle_clutch.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Axle:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Axle:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/16, -3/16, -4/8, 3/16, 3/16, 4/8}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 3, cracky = 3, snappy = 3}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:axle_on", { - description = S("TA2 Drive Axle"), - tiles = { - { - name = "techage_axle4R.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - { - name = "techage_axle4R.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - { - name = "techage_axle4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - { - name = "techage_axle4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - { - name = "techage_axle_clutch4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - { - name = "techage_axle_clutch4.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Axle:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Axle:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/16, -3/16, -4/8, 3/16, 3/16, 4/8}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - diggable = false, - groups = {not_in_creative_inventory = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:axle 3", - recipe = { - {"default:junglewood", "", "default:wood"}, - {"", "techage:iron_ingot", ""}, - {"default:wood", "", "default:junglewood"}, - }, -}) - - -techage.Axle = Axle diff --git a/techage/power/electric_cable.lua b/techage/power/electric_cable.lua deleted file mode 100644 index 80b89cf..0000000 --- a/techage/power/electric_cable.lua +++ /dev/null @@ -1,193 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Electric Cables (AC) - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local power = networks.power - -local ELE1_MAX_CABLE_LENGHT = 1000 - -local Cable = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = ELE1_MAX_CABLE_LENGHT, - show_infotext = false, - tube_type = "ele1", - primary_node_names = {"techage:electric_cableS", "techage:electric_cableA", - "techage:power_line", "techage:power_lineS", "techage:power_lineA", - "techage:power_pole2", "techage:powerswitch_box", "techage:powerswitch_box_on"}, - secondary_node_names = {}, - after_place_tube = function(pos, param2, tube_type, num_tubes) - local node = minetest.get_node(pos) - local name = node.name - local color_param2 = math.floor(node.param2 / 32) * 32 - if name == "techage:powerswitch_box" or name == "techage:powerswitch_box_on" or name == "techage:powerswitch_box_off" then - minetest.swap_node(pos, {name = name, param2 = param2 % 32}) - elseif name == "techage:power_line" or name == "techage:power_lineS" or name == "techage:power_lineA" then - minetest.swap_node(pos, {name = "techage:power_line"..tube_type, param2 = param2 % 32}) - elseif name == "techage:power_pole2" then - -- nothing - elseif not networks.hidden_name(pos) then - minetest.swap_node(pos, {name = "techage:electric_cable"..tube_type, param2 = param2 % 32 + color_param2}) - end - M(pos):set_int("netw_param2", param2) - M(pos):set_int("netw_color_param2", color_param2) - end, -}) - --- Enable hidden cables -networks.use_metadata(Cable) -networks.register_hidden_message("Use the trowel tool to remove the node.") - --- Use global callback instead of node related functions -Cable:register_on_tube_update2(function(pos, outdir, tlib2, node) - power.update_network(pos, outdir, tlib2, node) -end) - -local preserve_metadata = function(pos, oldnode, oldmeta, drops) - for _,drop in ipairs(drops) do - local meta = drop:get_meta() - if meta:get_int("palette_index") == 0 then - meta:set_string("palette_index", "") - end - end -end - -minetest.register_node("techage:electric_cableS", { - description = S("TA Electric Cable"), - tiles = { - -- up, down, right, left, back, front - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - }, - overlay_tiles = { - "", - "", - "", - "", - { name = "techage_electric_cable_end.png", color = "white" }, - { name = "techage_electric_cable_end.png", color = "white" }, - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "colorfacedir", -- important! - palette = "techage_cable_palette.png", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/32, -3/32, -4/8, 3/32, 3/32, 4/8}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1}, - sounds = default.node_sound_defaults(), - preserve_metadata = preserve_metadata, -}) - -minetest.register_node("techage:electric_cableA", { - description = S("TA Electric Cable"), - tiles = { - -- up, down, right, left, back, front - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - "techage_electric_cable.png", - }, - overlay_tiles = { - "", - { name = "techage_electric_cable_end.png", color = "white" }, - "", - "", - "", - { name = "techage_electric_cable_end.png", color = "white" }, - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "colorfacedir", -- important! - palette = "techage_cable_palette.png", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/32, -4/8, -3/32, 3/32, 3/32, 3/32}, - {-3/32, -3/32, -4/8, 3/32, 3/32, -3/32}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, - techage_trowel = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_defaults(), - drop = { - items = { - { items = { "techage:electric_cableS" }, inherit_color = true }, - } - }, - preserve_metadata = preserve_metadata, -}) - -minetest.register_craft({ - output = "techage:electric_cableS 6", - recipe = { - {"basic_materials:plastic_sheet", "", ""}, - {"", "default:copper_ingot", ""}, - {"", "", "basic_materials:plastic_sheet"}, - }, -}) - -techage.ElectricCable = Cable -techage.ELE1_MAX_CABLE_LENGTH = ELE1_MAX_CABLE_LENGHT - - -for idx, color in ipairs({ "white", "grey", "black", "brown", "yellow", "red", "dark_green", "blue" }) do - minetest.register_craft({ - output = idx == 1 and "techage:electric_cableS 8" or minetest.itemstring_with_palette("techage:electric_cableS 8", (idx-1)*32), - recipe = { - { "techage:electric_cableS", "techage:electric_cableS", "techage:electric_cableS", }, - { "techage:electric_cableS", "dye:"..color, "techage:electric_cableS", }, - { "techage:electric_cableS", "techage:electric_cableS", "techage:electric_cableS", }, - } - }) -end diff --git a/techage/power/formspecs.lua b/techage/power/formspecs.lua deleted file mode 100644 index 5791c9a..0000000 --- a/techage/power/formspecs.lua +++ /dev/null @@ -1,321 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Power Formspec Functions - -]]-- - ---local P2S = minetest.pos_to_string ---local M = minetest.get_meta ---local N = function(pos) return minetest.get_node(pos).name end -local S = techage.S - -local CYCLE_TIME = 2 -local CYCLES_PER_DAY = 20 * 60 / CYCLE_TIME - -local in_range = techage.in_range -local power = networks.power -techage.power = {} - -------------------------------------------------------------------------------- --- Helper function -------------------------------------------------------------------------------- -local function round(val) - val = tonumber(val) or 0 - if val > 100 then - return math.floor(val + 0.5) - elseif val > 10 then - return math.floor((val * 10) + 0.5) / 10 - else - return math.floor((val * 100) + 0.5) / 100 - end -end - -local function calc_percent(max_val, curr_val) - return round(math.min(((curr_val or 0) * 100) / (max_val or 1.0), 100)) -end - -------------------------------------------------------------------------------- --- Local bar functions -------------------------------------------------------------------------------- --- charging > 0 ==> charging --- charging < 0 ==> uncharging --- charging = 0 ==> off --- percent: 0..100 -local function charging_bar(charging, percent) - if charging > 0 then - return "techage_form_level_off.png^[lowpart:" .. percent .. ":techage_form_level_charge.png" - elseif charging < 0 then - return "techage_form_level_unload.png^[lowpart:" .. percent .. ":techage_form_level_off.png" - else - return "techage_form_level_off.png" - end -end - -local function power_bar(current_power, max_power) - local percent, ypos - - current_power = current_power or 0 - - if current_power == 0 then - percent = 0 - ypos = 2.8 - else - percent = calc_percent(max_power, current_power) - -- 0.4 to 2.8 = 2.4 - local offs = 2.4 - (current_power / max_power) * 2.4 - ypos = 0.4 + in_range(offs, 0.4, 2.4) - end - current_power = round(current_power) - max_power = round(max_power) - percent = (percent + 5) / 1.1 -- texture correction - - return "label[0.7,0.4;" .. max_power .. " ku]" .. - "image[0,0.5;1,3;" .. - "techage_form_level_bg.png^[lowpart:" .. percent .. - ":techage_form_level_fg.png]" .. - "label[0.7," .. ypos .. ";" .. current_power .. " ku]" -end - -local function storage_bar(current_power, max_power) - local percent, ypos - max_power = (max_power or 1) / CYCLES_PER_DAY - current_power = (current_power or 0) / CYCLES_PER_DAY - - if current_power == 0 then - percent = 0 - ypos = 2.8 - else - percent = calc_percent(max_power, current_power) - -- 0.4 to 2.8 = 2.4 - local offs = 2.4 - (current_power / max_power) * 2.4 - ypos = 0.4 + in_range(offs, 0.4, 2.4) - end - current_power = round(current_power) - max_power = round(max_power) - - local percent2 = (percent + 5) / 1.1 -- texture correction - return "label[0.7,0.4;" .. max_power .. " kud]" .. - "image[0,0.5;1,3;".. - "techage_form_level_bg.png^[lowpart:" .. percent2 .. - ":techage_form_level_fg.png]" .. - "label[0.7," .. ypos .. ";" .. round(percent) .. " %]" -end - -------------------------------------------------------------------------------- --- API bar functions -------------------------------------------------------------------------------- -function techage.formspec_power_bar(pos, x, y, label, current_power, max_power) - return "container["..x..","..y.."]".. - "box[0,0;2.3,3.3;#395c74]".. - "label[0.2,0;"..label.."]".. - power_bar(current_power, max_power).. - "container_end[]" -end - -function techage.formspec_charging_bar(pos, x, y, label, data) - local charging = 0 - local percent = 50 - local ypos = 1.6 - - if data then - charging = data.provided - data.consumed - if charging > 0 then - percent = 50 + (charging / data.available * 50) - ypos = 1.6 - (charging / data.available * 1.2) - elseif charging < 0 then - percent = 50 + (charging / data.consumed * 50) - ypos = 1.6 - (charging / data.consumed * 1.2) - end - end - ypos = in_range(ypos, 0.4, 2.8) - - return "container[".. x .. "," .. y .. "]" .. - "box[0,0;2.3,3.3;#395c74]" .. - "label[0.2,0;" .. label .. "]" .. - "image[0,0.5;1,3;" .. charging_bar(charging, percent) .. "]" .. - "label[0.75," .. ypos .. ";" .. round(charging) .. " ku]" .. - "container_end[]" -end - -function techage.formspec_storage_bar(pos, x, y, label, curr_load, max_load) - curr_load = curr_load or 0 - - return "container[" .. x .. "," .. y .. "]" .. - "box[0,0;2.3,3.3;#395c74]" .. - "label[0.2,0;" .. label .. "]" .. - storage_bar(curr_load, max_load) .. - "container_end[]" -end - -function techage.formspec_meter(pos, x, y, label, value, unit) - return "container[" .. x .. "," .. y .. "]" .. - "box[0,0;2.3,0.9;#395c74]" .. - "label[0.2,0.0;" .. label .. ":]" .. - "label[0.2,0.4;" .. round(value) .. " " .. unit .. "]" .. - "container_end[]" -end - -------------------------------------------------------------------------------- --- API formspec functions -------------------------------------------------------------------------------- -function techage.wrench_image(x, y) - return "image["..x.."," .. y .. ";0.5,0.5;techage_inv_wrench.png]" .. - "tooltip["..x.."," .. y .. ";0.5,0.5;" .. S("Block has a wrench menu") .. ";#0C3D32;#FFFFFF]" -end - -function techage.storage_formspec(self, pos, nvm, label, netw_data, curr_load, max_load) - return "size[6.3,4]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "box[0,-0.1;6.1,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", label) .. "]" .. - techage.formspec_charging_bar(pos, 0.0, 0.8, S("Charging"), netw_data) .. - techage.formspec_storage_bar (pos, 3.8, 0.8, S("Storage"), curr_load, max_load) .. - "image_button[2.7,2;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. - "tooltip[2.7,2;1,1;" .. self:get_state_tooltip(nvm) .. "]" -end - -function techage.generator_formspec(self, pos, nvm, label, provided, max_available, ta2) - local tooltip = "" - if not ta2 then - tooltip = techage.wrench_tooltip(4.4, -0.05) - end - return "size[5,4]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "box[0,-0.1;4.8,0.5;#c6e8ff]" .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", label) .. "]" .. - tooltip.. - techage.formspec_power_bar(pos, 0, 0.8, S("Power"), provided, max_available) .. - "image_button[3.2,2.0;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. - "tooltip[3.2,2.0;1,1;" .. self:get_state_tooltip(nvm) .. "]" -end - -function techage.generator_settings(tier, available) - if tier == "ta3" then - return { - { - type = "const", - name = "available", - label = S("Maximum output [ku]"), - tooltip = S("The maximum power the generator can provide"), - value = available, - }, - { - type = "output", - name = "provided", - label = S("Current output [ku]"), - tooltip = S("The current power the generator provides"), - }, - { - type = "dropdown", - choices = "0% - 20%,20% - 40%,40% - 60%,60% - 80%,80% - 100%,90% - 100%", - name = "termpoint", - label = S("Charge termination"), - tooltip = S("Range in which the generator reduces its power"), - default = "80% - 100%", - }, - } - else - return { - { - type = "const", - name = "available", - label = S("Maximum output [ku]"), - tooltip = S("The maximum power the generator can provide"), - value = available, - }, - { - type = "output", - name = "provided", - label = S("Current output [ku]"), - tooltip = S("The current power the generator provides"), - }, - { - type = "dropdown", - choices = "0% - 20%,20% - 40%,40% - 60%,60% - 80%,80% - 100%,90% - 100%", - name = "termpoint", - label = S("Charge termination"), - tooltip = S("Range in which the generator reduces its power"), - default = "80% - 100%", - }, - } - end -end - - -function techage.evaluate_charge_termination(nvm, meta) - local termpoint = meta:get_string("termpoint") - if termpoint == "0% - 20%" then - meta:set_string("termpoint1", 0.0) - meta:set_string("termpoint2", 0.2) - elseif termpoint == "20% - 40%" then - meta:set_string("termpoint1", 0.2) - meta:set_string("termpoint2", 0.4) - elseif termpoint == "40% - 60%" then - meta:set_string("termpoint1", 0.4) - meta:set_string("termpoint2", 0.6) - elseif termpoint == "60% - 80%" then - meta:set_string("termpoint1", 0.6) - meta:set_string("termpoint2", 0.8) - elseif termpoint == "80% - 100%" then - meta:set_string("termpoint1", 0.8) - meta:set_string("termpoint2", 1.0) - elseif termpoint == "90% - 100%" then - meta:set_string("termpoint1", 0.9) - meta:set_string("termpoint2", 1.0) - else - meta:set_string("termpoint", "80% - 100%") - meta:set_string("termpoint1", 0.8) - meta:set_string("termpoint2", 1.0) - end -end - -techage.power.percent = calc_percent -techage.CYCLES_PER_DAY = CYCLES_PER_DAY -techage.round = round - -------------------------------------------------------------------------------- --- Still used legacy functions -------------------------------------------------------------------------------- -function techage.formspec_label_bar(pos, x, y, label, max_power, current_power, unit) - local percent, ypos - - max_power = max_power or 1 - unit = unit or "ku" - current_power = current_power or 0 - - if current_power == 0 then - percent = 0 - ypos = 2.8 - else - percent = techage.power.percent(max_power, current_power) - -- 0.4 to 2.8 = 2.4 - local offs = 2.4 - (current_power / max_power) * 2.4 - ypos = 0.4 + in_range(offs, 0.4, 2.4) - end - if current_power >= 100 then - current_power = math.floor(current_power) - end - percent = (percent + 5) / 1.1 -- texture correction - return "container["..x..","..y.."]".. - "box[0,0;2.3,3.3;#395c74]".. - "label[0.2,0;"..label.."]".. - "label[0.7,0.4;"..max_power.." "..unit.."]".. - "image[0,0.5;1,3;".. - "techage_form_level_bg.png^[lowpart:"..percent.. - ":techage_form_level_fg.png]".. - "label[0.7,"..ypos..";"..current_power.." "..unit.."]".. - "container_end[]" - -end diff --git a/techage/power/gearbox.lua b/techage/power/gearbox.lua deleted file mode 100644 index d4406dc..0000000 --- a/techage/power/gearbox.lua +++ /dev/null @@ -1,146 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Gearbox - -]]-- - --- for lazy programmers -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local PWR_NEEDED = 1 -local CYCLE_TIME = 2 - -local Axle = techage.Axle -local power = networks.power - --- Axles texture animation -local function switch_axles(pos, on) - for _,outdir in ipairs(networks.get_outdirs(pos, Axle)) do - Axle:switch_tube_line(pos, outdir, on and "on" or "off") - end -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function node_timer_on(pos, elapsed) - local consumed = power.consume_power(pos, Axle, 0, PWR_NEEDED) - if consumed == 0 then - swap_node(pos, "techage:gearbox") - switch_axles(pos, false) - end - return true -end - -local function node_timer_off(pos, elapsed) - if power.power_available(pos, Axle, 0) then - swap_node(pos, "techage:gearbox_on") - switch_axles(pos, true) - end - return true -end - --- to be able to restart the node after server crashes -local function techage_on_repair(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) -end - -local function after_place_node(pos) - Axle:after_place_node(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) -end - -local function after_dig_node(pos, oldnode) - Axle:after_dig_node(pos) -end - -local function tubelib2_on_update2_on(pos, outdir, tlib2, node) - power.update_network(pos, 0, tlib2, node) - switch_axles(pos, true) -end - -local function tubelib2_on_update2_off(pos, outdir, tlib2, node) - power.update_network(pos, 0, tlib2, node) - switch_axles(pos, false) -end - -minetest.register_node("techage:gearbox", { - description = S("TA2 Gearbox"), - tiles = {"techage_filling_ta2.png^techage_axle_gearbox.png^techage_frame_ta2.png"}, - - on_timer = node_timer_off, - techage_on_repair = techage_on_repair, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - tubelib2_on_update2 = tubelib2_on_update2_off, - paramtype = "light", - light_source = 0, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -minetest.register_node("techage:gearbox_on", { - tiles = { - -- up, down, right, left, back, front - { - name = "techage_filling4_ta2.png^techage_axle_gearbox4.png^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - }, - - on_timer = node_timer_on, - techage_on_repair = techage_on_repair, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - tubelib2_on_update2 = tubelib2_on_update2_on, - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - drop = "", - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:gearbox", "techage:gearbox_on"}, Axle, "junc") - -techage.register_node({"techage:gearbox", "techage:gearbox_on"}, { - on_node_load = function(pos, node) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -minetest.register_craft({ - output = "techage:gearbox 2", - recipe = { - {"default:junglewood", "techage:axle", "default:wood"}, - {"techage:axle", "techage:iron_ingot", "techage:axle"}, - {"default:wood", "techage:axle", "default:junglewood"}, - }, -}) diff --git a/techage/power/junctionbox.lua b/techage/power/junctionbox.lua deleted file mode 100644 index 81e0310..0000000 --- a/techage/power/junctionbox.lua +++ /dev/null @@ -1,66 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Junction box for electrical power distribution - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power - -local size = 3/32 -local Boxes = { - {{-size, -size, size, size, size, 0.5 }}, -- z+ - {{-size, -size, -size, 0.5, size, size}}, -- x+ - {{-size, -size, -0.5, size, size, size}}, -- z- - {{-0.5, -size, -size, size, size, size}}, -- x- - {{-size, -0.5, -size, size, size, size}}, -- y- - {{-size, -size, -size, size, 0.5, size}}, -- y+ -} - -local names = networks.register_junction("techage:electric_junction", 2/8, Boxes, Cable, { - description = S("TA Electric Junction Box"), - tiles = {"techage_electric_junction.png"}, - use_texture_alpha = techage.CLIP, - is_ground_content = false, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, techage_trowel = 1}, - sounds = default.node_sound_defaults(), - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local name = "techage:electric_junction" .. networks.junction_type(pos, Cable) - minetest.swap_node(pos, {name = name, param2 = 0}) - Cable:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir1, tlib2, node) - if not networks.hidden_name(pos) then - local name = "techage:electric_junction" .. networks.junction_type(pos, Cable) - minetest.swap_node(pos, {name = name, param2 = 0}) - end - power.update_network(pos, 0, tlib2, node) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - end, -}) - -power.register_nodes(names, Cable, "junc") - -minetest.register_craft({ - output = "techage:electric_junction0 2", - recipe = { - {"", "basic_materials:plastic_sheet", ""}, - {"basic_materials:plastic_sheet", "default:copper_ingot", "basic_materials:plastic_sheet"}, - {"", "basic_materials:plastic_sheet", ""}, - }, -}) diff --git a/techage/power/power_line.lua b/techage/power/power_line.lua deleted file mode 100644 index 780552d..0000000 --- a/techage/power/power_line.lua +++ /dev/null @@ -1,370 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Power line for electrical landline -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power - -local function can_dig(pos, digger) - if digger and digger:is_player() then - if M(pos):get_string("owner") == digger:get_player_name() then - return true - end - if minetest.check_player_privs(digger:get_player_name(), "powerline") then - return true - end - end - return false -end - --- legacy node -minetest.register_node("techage:power_line", { - description = S("TA Power Line"), - tiles = {"techage_power_line.png"}, - inventory_image = 'techage_power_line_inv.png', - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/32, -1/32, -4/8, 1/32, 1/32, 4/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-2/32, -2/32, -4/8, 2/32, 2/32, 4/8}, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - drop = "techage:power_lineS", - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1}, - sounds = default.node_sound_defaults(), -}) - --- new nodes lineS/lineA -minetest.register_node("techage:power_lineS", { - description = S("TA Power Line"), - tiles = {"techage_power_line.png"}, - inventory_image = 'techage_power_line_inv.png', - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/32, -1/32, -4/8, 1/32, 1/32, 4/8}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-2/32, -2/32, -4/8, 2/32, 2/32, 4/8}, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - drop = "techage:power_lineS", - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("techage:power_lineA", { - description = S("TA Power Line"), - tiles = { - "techage_power_line.png", - "techage_power_line.png^[transformR180", - "techage_power_line.png^[transformR270", - "techage_power_line.png", - "techage_power_line.png", - "techage_power_line.png", - }, - inventory_image = 'techage_power_line_inv.png', - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/32, -16/32, -1/32, 1/32, -15/32, 1/32}, - {-1/32, -16/32, -2/32, 1/32, -14/32, 0/32}, - {-1/32, -15/32, -3/32, 1/32, -13/32, -1/32}, - {-1/32, -14/32, -4/32, 1/32, -12/32, -2/32}, - {-1/32, -13/32, -5/32, 1/32, -11/32, -3/32}, - {-1/32, -12/32, -6/32, 1/32, -10/32, -4/32}, - {-1/32, -11/32, -7/32, 1/32, -9/32, -5/32}, - {-1/32, -10/32, -8/32, 1/32, -8/32, -6/32}, - {-1/32, -9/32, -9/32, 1/32, -7/32, -7/32}, - {-1/32, -8/32, -10/32, 1/32, -6/32, -8/32}, - {-1/32, -7/32, -11/32, 1/32, -5/32, -9/32}, - {-1/32, -6/32, -12/32, 1/32, -4/32, -10/32}, - {-1/32, -5/32, -13/32, 1/32, -3/32, -11/32}, - {-1/32, -4/32, -14/32, 1/32, -2/32, -12/32}, - {-1/32, -3/32, -15/32, 1/32, -1/32, -13/32}, - {-1/32, -2/32, -16/32, 1/32, 0/32, -14/32}, - {-1/32, -1/32, -16/32, 1/32, 1/32, -15/32}, - }, - }, - selection_box = { - type = "fixed", - fixed = {-2/32, -16/32, 2/32, 2/32, 2/32, -16/32}, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - drop = "techage:power_lineS", - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("techage:power_pole2", { - description = S("TA Power Pole Top 2 (for landlines)"), - tiles = { - "default_wood.png^techage_power_pole_top.png", - "default_wood.png^techage_power_pole_top.png", - "default_wood.png^techage_power_pole.png" - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -4/32, -16/32, -4/32, 4/32, 16/32, 4/32}, - { -1/32, -6/32, -16/32, 1/32, -4/32, 16/32}, - { -2/32, -4/32, -16/32, 2/32, 4/32, -12/32}, - { -2/32, -4/32, 12/32, 2/32, 4/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - M(pos):set_string("owner", placer:get_player_name()) - if techage.is_protected(pos, placer:get_player_name()) then - minetest.chat_send_player(placer:get_player_name(), "position is protected ") - minetest.remove_node(pos) - return true - end - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.chat_send_player(placer:get_player_name(), "invalid pole position ") - minetest.remove_node(pos) - Cable:after_dig_node(pos) - return true - end - return false - end, - can_dig = can_dig, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode) - end, - - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, - sounds = default.node_sound_defaults(), -}) - --- dummy node for the inventory and to be placed and imediately replaced -minetest.register_node("techage:power_pole", { - description = S("TA Power Pole Top (for up to 6 connections)"), - tiles = { - "default_wood.png^techage_power_pole_top.png", - "default_wood.png^techage_power_pole_top.png", - "default_wood.png^techage_power_pole.png" - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -4/32, -16/32, -4/32, 4/32, 16/32, 4/32}, - {-16/32, -6/32, -1/32, 16/32, -4/32, 1/32}, - { -1/32, -6/32, -16/32, 1/32, -4/32, 16/32}, - {-16/32, -4/32, -2/32, -12/32, 4/32, 2/32}, - { 12/32, -4/32, -2/32, 16/32, 4/32, 2/32}, - { -2/32, -4/32, -16/32, 2/32, 4/32, -12/32}, - { -2/32, -4/32, 12/32, 2/32, 4/32, 16/32}, - }, - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - M(pos):set_string("owner", placer:get_player_name()) - if techage.is_protected(pos, placer:get_player_name()) then - minetest.chat_send_player(placer:get_player_name(), "position is protected ") - minetest.remove_node(pos) - return true - end - local node = minetest.get_node(pos) - node.name = "techage:power_pole_conn" - minetest.swap_node(pos, node) - Cable:after_place_node(pos) - end, - - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, -}) - - --- secondary node like a junction -minetest.register_node("techage:power_pole_conn", { - description = "TA Power Pole Top (for up to 6 connections)", - tiles = { - "default_wood.png^techage_power_pole_top.png", - "default_wood.png^techage_power_pole_top.png", - "default_wood.png^techage_power_pole.png" - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "connected", - fixed = {{ -4/32, -16/32, -4/32, 4/32, 16/32, 4/32}}, - - connect_left = {{-16/32, -6/32, -1/32, 1/32, -4/32, 1/32}, - {-16/32, -4/32, -2/32, -12/32, 4/32, 2/32}}, - connect_right = {{ -1/32, -6/32, -1/32, 16/32, -4/32, 1/32}, - {12/32, -4/32, -2/32, 16/32, 4/32, 2/32}}, - connect_back = {{-1/32, -6/32, -1/32, 1/32, -4/32, 16/32}, - {-2/32, -4/32, 12/32, 2/32, 4/32, 16/32}}, - connect_front = {{-1/32, -6/32, -16/32, 1/32, -4/32, 1/32}, - {-2/32, -4/32, -16/32, 2/32, 4/32, -12/32}}, - }, - connects_to = {"techage:power_line", "techage:power_lineS", "techage:power_lineA"}, - - can_dig = can_dig, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - end, - - drop = "techage:power_pole", - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2, not_in_creative_inventory = 1}, - sounds = default.node_sound_defaults(), -}) - -power.register_nodes({"techage:power_pole_conn"}, Cable, "junc") - -minetest.register_node("techage:power_pole3", { - description = S("TA Power Pole"), - tiles = { - "default_wood.png", - "default_wood.png", - "default_wood.png" - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -4/32, -16/32, -4/32, 4/32, 16/32, 4/32}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_craft({ - output = "techage:power_lineS 24", - recipe = { - {"default:copper_ingot", "", ""}, - {"", "default:copper_ingot", ""}, - {"", "", "default:copper_ingot"}, - }, -}) - -minetest.register_craft({ - output = "techage:power_pole2", - recipe = { - {"", "default:stick", ""}, - {"techage:power_lineS", "default:copper_ingot", "techage:power_lineS"}, - {"", "default:stick", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:power_pole", - recipe = { - {"", "", ""}, - {"", "techage:power_pole2", ""}, - {"", "techage:power_pole2", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:power_pole3 4", - recipe = { - {"", "group:wood", ""}, - {"", "techage:power_lineS", ""}, - {"", "group:wood", ""}, - }, -}) diff --git a/techage/power/power_terminal.lua b/techage/power/power_terminal.lua deleted file mode 100644 index 3602ab5..0000000 --- a/techage/power/power_terminal.lua +++ /dev/null @@ -1,15 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Power Terminal Old - -]]-- - -minetest.register_alias_force("techage:power_terminal", "techage:ta3_power_terminal") diff --git a/techage/power/power_terminal2.lua b/techage/power/power_terminal2.lua deleted file mode 100644 index cc13626..0000000 --- a/techage/power/power_terminal2.lua +++ /dev/null @@ -1,342 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Power Terminal - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta -local N = function(pos) return minetest.get_node(pos).name end -local S = techage.S - -local CYCLE_TIME = 2 - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local HELP = S([[Commands -help . . . print this text -cls . . . . clear screen -gen . . print generators -sto . . print storage systems -con1 . . print consumers with power consumption between 1 and 10 ku -con2 . . print consumers with power consumption with 10 ku or above -]]) - -local function row(num, label, data) - local y = 4.0 + num * 0.5 - return - "box[0," .. y .. ";9.8,0.4;#395c74]".. - "label[0.2,"..y..";" .. label .. "]" .. - "label[8.5,"..y..";" .. data .. "]" -end - -local function formspec1(pos, data) - local mem = techage.get_mem(pos) - local outdir = M(pos):get_int("outdir") - local netw = networks.get_network_table(pos, Cable, outdir, true) or {} - data = data or power.get_network_data(pos, Cable, outdir) - - mem.star = ((mem.star or 0) + 1) % 2 - local star = mem.star == 1 and "*" or "" - local storage_provided = math.max(data.consumed - data.available, 0) - local available = math.max(data.consumed, data.available) - - return "size[10,8]".. - "tabheader[0,0;tab;status,console;1;;true]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;9.8,0.5;#c6e8ff]".. - "label[0.2,-0.1;"..minetest.colorize( "#000000", S("Network Data")).."]".. - "label[9.5,-0.1;"..minetest.colorize( "#000000", star).."]".. - techage.formspec_power_bar(pos, 0.0, 0.7, S("Generator"), data.provided, data.available).. - techage.formspec_power_bar(pos, 2.5, 0.7, S("Consumer"), data.consumed, available).. - techage.formspec_charging_bar(pos, 5.0, 0.7, S("Charging"), data).. - techage.formspec_storage_bar(pos, 7.5, 0.7, S("Storage"), data.curr_load, data.max_capa).. - - row(1, S("Number of network nodes:"), netw.num_nodes or 0) .. - row(2, S("Number of generators:"), #(netw.gen or {})) .. - row(3, S("Number of consumers:"), #(netw.con or {})) .. - row(4, S("Number of storage systems:"), #(netw.sto or {})) -end - -local function formspec2(pos) - local mem = techage.get_mem(pos) - local meta = M(pos) - local output = meta:get_string("output") - local command = mem.cmnd or "help" - output = minetest.formspec_escape(output) - output = output:gsub("\n", ",") - - return "size[10,8]".. - "tabheader[0,0;tab;status,console;2;;true]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;9.8,0.5;#c6e8ff]".. - "label[0.2,-0.1;"..minetest.colorize( "#000000", S("Network Data")).."]".. - --"style_type[table,field;font=mono]".. - "table[0,0.5;9.8,6.8;output;"..output..";200]".. - "field[0.4,7.7;7.6,1;cmnd;;"..command.."]" .. - "field_close_on_enter[cmnd;false]".. - "button[7.9,7.4;2,1;enter;"..S("Enter").."]" -end - --------------------------------------------------------------------------------------- ---Overwrite networks.power.consume_power function --------------------------------------------------------------------------------------- -local origin_consume_power = networks.power.consume_power - -function networks.power.consume_power(pos, tlib2, outdir, amount) - local nvm = techage.get_nvm(pos) - nvm.power_taken = origin_consume_power(pos, tlib2, outdir, amount) - return nvm.power_taken -end - -local function get_consumer_power_consumption(pos) - if pos then - local nvm = techage.get_nvm(pos) - if nvm.running or techage.needs_power(nvm) then - return nvm.power_taken or 0 - end - end - return 0 -end - -local function generators(pos) - local tbl = {} - local outdir = M(pos):get_int("outdir") - local resp = control.request(pos, Cable, outdir, "gen", "info") - for _, item in ipairs(resp) do - if item.running then - local s = string.format("%s (%s): %s/%u ku (%s)", - item.type, item.number, techage.round(item.provided), item.available, item.termpoint) - tbl[#tbl + 1] = s - else - local s = string.format("%s (%s): off", - item.type, item.number) - tbl[#tbl + 1] = s - end - end - table.sort(tbl) - return table.concat(tbl, "\n") -end - -local function storages(pos) - local tbl = {} - local outdir = M(pos):get_int("outdir") - local resp = control.request(pos, Cable, outdir, "sto", "info") - for _, item in ipairs(resp) do - -- TA4/TA5 heatexchangers are no storage systems - if item.capa and item.capa > 1 then - if item.running then - local s = string.format("%s (%s): %s/%s kud", - item.type, item.number, - techage.round(item.load / techage.CYCLES_PER_DAY), - techage.round(item.capa / techage.CYCLES_PER_DAY)) - tbl[#tbl + 1] = s - else - local s = string.format("%s (%s): %s/%s kud (off)", - item.type, item.number, - techage.round(item.load / techage.CYCLES_PER_DAY), - techage.round(item.capa / techage.CYCLES_PER_DAY)) - tbl[#tbl + 1] = s - end - end - end - table.sort(tbl) - return table.concat(tbl, "\n") -end - -local function consumers(pos, min, max) - local tbl = {} - local outdir = M(pos):get_int("outdir") - local netw = networks.get_network_table(pos, Cable, outdir) or {} - for _,item in ipairs(netw.con or {}) do - local number = techage.get_node_number(item.pos) - if number then - local name = techage.get_node_lvm(item.pos).name - name = (minetest.registered_nodes[name] or {}).description or "unknown" - local taken = techage.round(get_consumer_power_consumption(item.pos)) - if taken > min and taken < max then - tbl[#tbl + 1] = string.format("%s (%s): %s ku", name, number, taken) - end - else - local name = techage.get_node_lvm(item.pos).name - name = (minetest.registered_nodes[name] or {}).description or "unknown" - local taken = techage.round(get_consumer_power_consumption(item.pos)) - if taken > min and taken < max then - tbl[#tbl + 1] = string.format("%s: %s ku", name, taken) - end - end - end - table.sort(tbl) - return table.concat(tbl, "\n") -end - -local function output(pos, command, text) - local meta = M(pos) - text = meta:get_string("output") .. "\n$ " .. command .. "\n" .. (text or "") - text = text:sub(-5000,-1) - meta:set_string("output", text) -end - -local function command(pos, nvm, command) - local meta = M(pos) - - if command then - command = command:sub(1,80) - command = string.trim(command) - local cmd, data = unpack(string.split(command, " ", false, 1)) - - if cmd == "cls" then - meta:set_string("output", "") - elseif cmd == "help" then - output(pos, command, HELP) - elseif cmd == "gen" then - output(pos, command, generators(pos)) - elseif cmd == "sto" then - output(pos, command, storages(pos)) - elseif cmd == "con1" then - output(pos, command, consumers(pos, 1, 10)) - elseif cmd == "con2" then - output(pos, command, consumers(pos, 9, 1000)) - elseif command ~= "" then - output(pos, command, "") - end - end -end - -minetest.register_node("techage:ta3_power_terminal", { - description = S("TA3 Power Terminal"), - inventory_image = "techage_power_terminal_front.png", - tiles = { - "techage_power_terminal_top.png", - "techage_power_terminal_top.png", - "techage_power_terminal_side.png", - "techage_power_terminal_side.png", - "techage_power_terminal_back.png", - "techage_power_terminal_front.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -8/16, -8/16, 0/16, 8/16, 8/16, 8/16}, - }, - }, - - after_place_node = function(pos, placer) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "B")) - Cable:after_place_node(pos) - M(pos):set_string("formspec", formspec1(pos)) - local number = techage.add_node(pos, "techage:ta3_power_terminal") - M(pos):set_string("node_number", number) - M(pos):set_string("owner", placer:get_player_name()) - M(pos):set_string("infotext", S("TA3 Power Terminal").." "..number) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) - end, - on_rightclick = function(pos, node, clicker) - local mem = techage.get_mem(pos) - if mem.active_formspec == 2 then - M(pos):set_string("formspec", formspec2(pos)) - else - M(pos):set_string("formspec", formspec1(pos)) - minetest.get_node_timer(pos):start(CYCLE_TIME) - techage.set_activeformspec(pos, clicker) - mem.active_formspec = 1 - end - end, - on_timer = function(pos, elapsed) - if techage.is_activeformspec(pos) then - local outdir = M(pos):get_int("outdir") - local data = power.get_network_data(pos, Cable, outdir) - M(pos):set_string("formspec", formspec1(pos, data)) - return true - end - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - local mem = techage.get_mem(pos) - - if fields.key_enter_field or fields.enter then - command(pos, nvm, fields.cmnd) - mem.cmnd = "" - M(pos):set_string("formspec", formspec2(pos, mem)) - mem.cmnd = fields.cmnd - elseif fields.tab == "1" then - M(pos):set_string("formspec", formspec1(pos)) - techage.set_activeformspec(pos, player) - minetest.get_node_timer(pos):start(CYCLE_TIME) - mem.active_formspec = 1 - elseif fields.tab == "2" then - M(pos):set_string("formspec", formspec2(pos)) - techage.reset_activeformspec(pos, player) - mem.active_formspec = 2 - elseif fields.key_up and mem.cmnd then - M(pos):set_string("formspec", formspec2(pos)) - end - end, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - on_rotate = screwdriver.disallow, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, level = 2}, - sounds = default.node_sound_metal_defaults(), -}) - -power.register_nodes({"techage:ta3_power_terminal"}, Cable, "con", {"B"}) - -techage.register_node({"techage:ta3_power_terminal"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "load" then - local outdir = M(pos):get_int("outdir") - local value = networks.power.get_storage_percent(pos, Cable, outdir) - return techage.round(value) - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 134 then - local outdir = M(pos):get_int("outdir") - local value = networks.power.get_storage_percent(pos, Cable, outdir) - return 0, {math.floor(value + 0.5)} - else - return 2, "" - end - end, -}) - -minetest.register_craft({ - output = "techage:ta3_power_terminal", - recipe = { - {"", "techage:usmium_nuggets", "default:steel_ingot"}, - {"", "techage:basalt_glass_thin", "default:copper_ingot"}, - {"", "techage:vacuum_tube", "default:steel_ingot"}, - }, -}) diff --git a/techage/power/powerswitch.lua b/techage/power/powerswitch.lua deleted file mode 100644 index 9881524..0000000 --- a/techage/power/powerswitch.lua +++ /dev/null @@ -1,303 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Power Switch (large and small) - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power - -local Param2ToDir = { - [0] = 6, - [1] = 5, - [2] = 2, - [3] = 4, - [4] = 1, - [5] = 3, -} - -local function sign_in(pos, node) - local dir = Param2ToDir[node.param2] - local pos2 = tubelib2.get_pos(pos, dir) - M(pos2):set_int("switch_sign_in", 1) -end - -local function sign_off(pos, node) - local dir = Param2ToDir[node.param2] - local pos2 = tubelib2.get_pos(pos, dir) - M(pos2):set_int("switch_sign_in", 0) -end - -local function switch_on(pos, node, clicker, name) - if clicker and minetest.is_protected(pos, clicker:get_player_name()) then - return - end - node.name = name - minetest.swap_node(pos, node) - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5, - }) - local dir = Param2ToDir[node.param2] - local pos2 = tubelib2.get_pos(pos, dir) - - techage.legacy_switches(pos2) - power.turn_switch_on(pos2, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on") -end - -local function switch_off(pos, node, clicker, name) - if clicker and minetest.is_protected(pos, clicker:get_player_name()) then - return - end - node.name = name - minetest.swap_node(pos, node) - minetest.get_node_timer(pos):stop() - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5, - }) - local dir = Param2ToDir[node.param2] - local pos2 = tubelib2.get_pos(pos, dir) - - techage.legacy_switches(pos2) - power.turn_switch_off(pos2, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on") -end - - -minetest.register_node("techage:powerswitch", { - description = S("TA Power Switch"), - inventory_image = "techage_appl_switch_inv.png", - tiles = { - 'techage_appl_switch_off.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -1/4, -8/16, -1/4, 1/4, -7/16, 1/4}, - { -1/6, -12/16, -1/6, 1/6, -8/16, 1/6}, - }, - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local number = techage.add_node(pos, "techage:powerswitch") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA Power Switch").." "..number) - local node = minetest.get_node(pos) - switch_on(pos, node, placer, "techage:powerswitch_on") - sign_in(pos, node) - end, - - on_rightclick = function(pos, node, clicker) - switch_on(pos, node, clicker, "techage:powerswitch_on") - end, - - after_dig_node = sign_off, - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "wallmounted", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -minetest.register_node("techage:powerswitch_on", { - description = S("TA Power Switch"), - inventory_image = "techage_appl_switch_inv.png", - tiles = { - 'techage_appl_switch_on.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -1/4, -8/16, -1/4, 1/4, -7/16, 1/4}, - { -1/6, -12/16, -1/6, 1/6, -8/16, 1/6}, - }, - }, - - on_rightclick = function(pos, node, clicker) - switch_off(pos, node, clicker, "techage:powerswitch") - end, - - after_dig_node = sign_off, - drop = "techage:powerswitch", - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "wallmounted", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = 1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:powerswitchsmall", { - description = S("TA Power Switch Small"), - inventory_image = "techage_smart_button_inventory.png", - tiles = { - 'techage_smart_button_off.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -5/32, -16/32, -5/32, 5/32, -15/32, 5/32}, - { -2/16, -12/16, -2/16, 2/16, -8/16, 2/16}, - }, - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local number = techage.add_node(pos, "techage:powerswitchsmall") - meta:set_string("node_number", number) - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA Power Switch Small").." "..number) - local node = minetest.get_node(pos) - switch_on(pos, node, placer, "techage:powerswitchsmall_on") - sign_in(pos, node) - end, - - on_rightclick = function(pos, node, clicker) - switch_on(pos, node, clicker, "techage:powerswitchsmall_on") - end, - - after_dig_node = sign_off, - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "wallmounted", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - - -minetest.register_node("techage:powerswitchsmall_on", { - description = S("TA Power Switch Small"), - inventory_image = "techage_appl_switch_inv.png", - tiles = { - 'techage_smart_button_on.png', - }, - - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - { -5/32, -16/32, -5/32, 5/32, -15/32, 5/32}, - { -2/16, -12/16, -2/16, 2/16, -8/16, 2/16}, - }, - }, - - on_rightclick = function(pos, node, clicker) - switch_off(pos, node, clicker, "techage:powerswitchsmall") - end, - - after_dig_node = sign_off, - drop = "techage:powerswitchsmall", - on_rotate = screwdriver.disallow, - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - paramtype2 = "wallmounted", - groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = 1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -techage.register_node({"techage:powerswitch", "techage:powerswitch_on", - "techage:powerswitchsmall", "techage:powerswitchsmall_on"}, { - on_recv_message = function(pos, src, topic, payload) - local node = techage.get_node_lvm(pos) - if topic == "on" and node.name == "techage:powerswitch" then - switch_on(pos, node, nil, "techage:powerswitch_on") - return true - elseif topic == "on" and node.name == "techage:powerswitchsmall" then - switch_on(pos, node, nil, "techage:powerswitchsmall_on") - return true - elseif topic == "off" and node.name == "techage:powerswitch_on" then - switch_off(pos, node, nil, "techage:powerswitch") - return true - elseif topic == "off" and node.name == "techage:powerswitchsmall_on" then - switch_off(pos, node, nil, "techage:powerswitchsmall") - return true - elseif topic == "state" then - if node.name == "techage:powerswitch_on" or - node.name == "techage:powerswitchsmall_on" then - return "on" - end - return "off" - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local node = techage.get_node_lvm(pos) - if topic == 1 and payload[1] == 1 and node.name == "techage:powerswitch" then - switch_on(pos, node, nil, "techage:powerswitch_on") - return 0 - elseif topic == 1 and payload[1] == 1 and node.name == "techage:powerswitchsmall" then - switch_on(pos, node, nil, "techage:powerswitchsmall_on") - return 0 - elseif topic == 1 and payload[1] == 0 and node.name == "techage:powerswitch_on" then - switch_off(pos, node, nil, "techage:powerswitch") - return 0 - elseif topic == 1 and payload[1] == 0 and node.name == "techage:powerswitchsmall_on" then - switch_off(pos, node, nil, "techage:powerswitchsmall") - return 0 - else - return 2 - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local node = techage.get_node_lvm(pos) - if topic == 131 or topic == 142 then - if node.name == "techage:powerswitch_on" or - node.name == "techage:powerswitchsmall_on" then - return 0, {1} - end - return 0, {0} - else - return 2, "" - end - end, -}) - -minetest.register_craft({ - output = "techage:powerswitch 2", - recipe = { - {"", "", ""}, - {"dye:yellow", "dye:red", "dye:yellow"}, - {"basic_materials:plastic_sheet", "basic_materials:copper_wire", "basic_materials:plastic_sheet"}, - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:powerswitchsmall", - recipe = {"techage:powerswitch"}, -}) diff --git a/techage/power/powerswitchbox.lua b/techage/power/powerswitchbox.lua deleted file mode 100644 index 14cde4c..0000000 --- a/techage/power/powerswitchbox.lua +++ /dev/null @@ -1,148 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Power Switch Box -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta -local N = techage.get_node_lvm -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power - -local node_box = { - type = "fixed", - fixed = { - { -1/4, -1/4, -2/4, 1/4, 1/4, 2/4}, - }, -} - -function techage.legacy_switches(pos) - local meta = M(pos) - local node = N(pos) - - if node.name == "techage:powerswitch_box" then - if meta:get_int("netw_param2") == 0 then - node.name = "techage:powerswitch_box_off" - else - node.name = "techage:powerswitch_box_on" - end - minetest.swap_node(pos, node) - elseif meta:get_string("netw_name") == "techage:powerswitch_box" then - if meta:get_int("netw_param2") == 0 then - meta:set_string("netw_name", "techage:powerswitch_box_off") - else - meta:set_string("netw_name", "techage:powerswitch_box_on") - end - end - - if meta:contains("tl2_param2_copy") then - meta:set_string("netw_param2_copy", meta:get_string("tl2_param2_copy")) - meta:set_string("tl2_param2_copy", "") - end -end - - --- The on-switch is a "primary node" like cables -minetest.register_node("techage:powerswitch_box_on", { - description = S("TA Power Switch Box"), - paramtype = "light", - drawtype = "nodebox", - node_box = node_box, - tiles = { - "techage_electric_switch.png^[transformR90", - "techage_electric_switch.png^[transformR90", - "techage_electric_switch.png", - "techage_electric_switch.png", - "techage_electric_junction.png", - "techage_electric_junction.png", - }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - on_rightclick = function(pos, node, clicker) - techage.legacy_switches(pos) - if M(pos):get_int("switch_sign_in") ~= 1 then - if power.turn_switch_off(pos, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on") then - minetest.sound_play("doors_glass_door_open", { - pos = pos, - gain = 1, - max_hear_distance = 5}) - end - end - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode, oldmetadata) - end, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy=2, cracky=2, crumbly=2, techage_trowel = 1}, - sounds = default.node_sound_defaults(), -}) - --- The off-switch is a "secondary node" without connection sides -minetest.register_node("techage:powerswitch_box_off", { - description = S("TA Power Switch Box"), - paramtype = "light", - drawtype = "nodebox", - node_box = node_box, - tiles = { - "techage_electric_switch_off.png^[transformR90", - "techage_electric_switch_off.png^[transformR90", - "techage_electric_switch_off.png", - "techage_electric_switch_off.png", - "techage_electric_junction.png", - "techage_electric_junction.png", - }, - on_rightclick = function(pos, node, clicker) - techage.legacy_switches(pos) - if M(pos):get_int("switch_sign_in") ~= 1 then - if power.turn_switch_on(pos, Cable, "techage:powerswitch_box_off", "techage:powerswitch_box_on") then - minetest.sound_play("doors_glass_door_open", { - pos = pos, - gain = 1, - max_hear_distance = 5}) - end - end - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - end, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - drop = "techage:powerswitch_box_on", - groups = {choppy=2, cracky=2, crumbly=2, techage_trowel = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_defaults(), -}) - -power.register_nodes({"techage:powerswitch_box_off"}, Cable, "con", {}) - -minetest.register_craft({ - output = "techage:powerswitch_box_on", - recipe = { - {"", "basic_materials:plastic_sheet", ""}, - {"techage:electric_cableS", "basic_materials:copper_wire", "techage:electric_cableS"}, - {"", "basic_materials:plastic_sheet", ""}, - }, -}) diff --git a/techage/power/powerswitchbox_legacy.lua b/techage/power/powerswitchbox_legacy.lua deleted file mode 100644 index 9fd27b5..0000000 --- a/techage/power/powerswitchbox_legacy.lua +++ /dev/null @@ -1,71 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Old Power Switch Box -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local M = minetest.get_meta -local N = function(pos) return minetest.get_node(pos).name end -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power - -local node_box = { - type = "fixed", - fixed = { - { -1/4, -1/4, -2/4, 1/4, 1/4, 2/4}, - }, -} - --- legacy node -minetest.register_node("techage:powerswitch_box", { - description = S("TA Power Switch Box"), - tiles = { - -- up, down, right, left, back, front - 'techage_electric_switch.png^[transformR90', - 'techage_electric_switch.png^[transformR90', - 'techage_electric_switch.png', - 'techage_electric_switch.png', - 'techage_electric_junction.png', - 'techage_electric_junction.png', - }, - - drawtype = "nodebox", - node_box = node_box, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) - minetest.swap_node(pos, {name = "techage:powerswitch_box_on", param2 = node.param2}) - - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - on_rotate = screwdriver.disallow, -- important! - paramtype2 = "facedir", - drop = "techage:powerswitch_box_on", - groups = {choppy=2, cracky=2, crumbly=2, techage_trowel = 1, not_in_creative_inventory = 1}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) diff --git a/techage/power/protection.lua b/techage/power/protection.lua deleted file mode 100644 index 639c3af..0000000 --- a/techage/power/protection.lua +++ /dev/null @@ -1,71 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3/TA4 Power line Protection -]]-- - -local M = minetest.get_meta -local S = techage.S - -local RANGE = 8 - -local IsNodeUnderObservation = {} - --- Register all nodes, which should be protected by the "techage:power_pole" -function techage.register_powerline_node(name) - IsNodeUnderObservation[name] = true -end - -local function powerpole_found(pos, name, range) - local pos1 = {x=pos.x-range, y=pos.y-range, z=pos.z-range} - local pos2 = {x=pos.x+range, y=pos.y+range, z=pos.z+range} - for _,npos in ipairs(minetest.find_nodes_in_area(pos1, pos2, { - "techage:power_pole", "techage:power_pole_conn", - "techage:power_pole2"})) do - if minetest.get_meta(npos):get_string("owner") ~= name then - return true - end - end - return false -end - -local function is_protected(pos, name, range) - if minetest.check_player_privs(name, "powerline") - or not powerpole_found(pos, name, range) then - return false - end - return true -end - -function techage.is_protected(pos, name) - return is_protected(pos, name, RANGE+3) -end - - -local old_is_protected = minetest.is_protected - -function minetest.is_protected(pos, name) - local node = techage.get_node_lvm(pos) - if IsNodeUnderObservation[node.name] and is_protected(pos, name, RANGE) then - return true - end - return old_is_protected(pos, name) -end - -minetest.register_privilege("powerline", { - description = S("Allow to dig/place Techage power lines nearby power poles"), - give_to_singleplayer = false, - give_to_admin = true, -}) - -techage.register_powerline_node("techage:power_line") -techage.register_powerline_node("techage:power_lineS") -techage.register_powerline_node("techage:power_lineA") -techage.register_powerline_node("techage:power_pole3") diff --git a/techage/power/steam_pipe.lua b/techage/power/steam_pipe.lua deleted file mode 100644 index a46fb95..0000000 --- a/techage/power/steam_pipe.lua +++ /dev/null @@ -1,116 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Steam pipes for the Steam Engine - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Pipe = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = 12, - show_infotext = false, - force_to_use_tubes = true, - tube_type = "pipe1", - primary_node_names = {"techage:steam_pipeS", "techage:steam_pipeA"}, - secondary_node_names = {"techage:cylinder", "techage:cylinder_on", "techage:boiler2"}, - after_place_tube = function(pos, param2, tube_type, num_tubes) - minetest.swap_node(pos, {name = "techage:steam_pipe"..tube_type, param2 = param2}) - end, -}) - -minetest.register_node("techage:steam_pipeS", { - description = S("TA2 Steam Pipe"), - tiles = { - "techage_steam_pipe.png^[transformR90", - "techage_steam_pipe.png^[transformR90", - "techage_steam_pipe.png", - "techage_steam_pipe.png", - "techage_steam_hole.png", - "techage_steam_hole.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Pipe:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -1/8, -4/8, 1/8, 1/8, 4/8}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly=3, cracky=3, snappy=3}, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_node("techage:steam_pipeA", { - description = S("TA2 Steam Pipe"), - tiles = { - "techage_steam_knee2.png", - "techage_steam_hole2.png^[transformR180", - "techage_steam_knee.png^[transformR270", - "techage_steam_knee.png", - "techage_steam_knee2.png", - "techage_steam_hole2.png", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Pipe:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -4/8, -1/8, 1/8, 1/8, 1/8}, - {-1/8, -1/8, -4/8, 1/8, 1/8, -1/8}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly=3, cracky=3, snappy=3, not_in_creative_inventory=1}, - sounds = default.node_sound_metal_defaults(), - drop = "techage:steam_pipeS", -}) - -minetest.register_craft({ - output = "techage:steam_pipeS 3", - recipe = { - {'', '', "default:bronze_ingot"}, - {'', 'techage:iron_ingot', ''}, - {"default:bronze_ingot", '', ''}, - }, -}) - -techage.SteamPipe = Pipe diff --git a/techage/power/ta4_cable.lua b/techage/power/ta4_cable.lua deleted file mode 100644 index 40ef060..0000000 --- a/techage/power/ta4_cable.lua +++ /dev/null @@ -1,189 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Low Power Cable for solar plants - -]]-- - --- for lazy programmers -local S2P = minetest.string_to_pos -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local power = networks.power - -local ELE2_MAX_CABLE_LENGHT = 200 - -local Cable = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = ELE2_MAX_CABLE_LENGHT, - show_infotext = false, - tube_type = "ele2", - primary_node_names = {"techage:ta4_power_cableS", "techage:ta4_power_cableA", - "techage:ta4_cable_wall_entry"}, - secondary_node_names = {}, - after_place_tube = function(pos, param2, tube_type, num_tubes) - local name = minetest.get_node(pos).name - if name == "techage:ta4_cable_wall_entry" then - minetest.swap_node(pos, {name = "techage:ta4_cable_wall_entry", param2 = param2}) - else - minetest.swap_node(pos, {name = "techage:ta4_power_cable"..tube_type, param2 = param2}) - end - end, -}) - --- Use global callback instead of node related functions -Cable:register_on_tube_update2(function(pos, outdir, tlib2, node) - power.update_network(pos, outdir, tlib2, node) -end) - -minetest.register_node("techage:ta4_power_cableS", { - description = S("TA4 Low Power Cable"), - tiles = { - -- up, down, right, left, back, front - "techage_ta4_cable.png", - "techage_ta4_cable.png", - "techage_ta4_cable.png", - "techage_ta4_cable.png", - "techage_ta4_cable_end.png", - "techage_ta4_cable_end.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -1/16, -4/8, 1/16, 1/16, 4/8}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_defaults(), -}) - -minetest.register_node("techage:ta4_power_cableA", { - description = S("TA4 Low Power Cable"), - tiles = { - -- up, down, right, left, back, front - "techage_ta4_cable.png", - "techage_ta4_cable_end.png", - "techage_ta4_cable.png", - "techage_ta4_cable.png", - "techage_ta4_cable.png", - "techage_ta4_cable_end.png", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_tube(pos, oldnode) - end, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/16, -4/8, -1/16, 1/16, 1/16, 1/16}, - {-1/16, -1/16, -4/8, 1/16, 1/16, -1/16}, - }, - }, - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1}, - sounds = default.node_sound_defaults(), - drop = "techage:ta4_power_cableS", -}) - -minetest.register_node("techage:ta4_power_box", { - description = S("TA4 Low Power Box"), - tiles = { - "techage_ta4_junctionbox_top.png", - "techage_ta4_junctionbox_top.png", - "techage_ta4_junctionbox_side.png^techage_appl_ta4_cable.png", - }, - - paramtype2 = "facedir", -- important! - drawtype = "nodebox", - node_box = { - type = "connected", - fixed = { - { -3/16, -3/16, -3/16, 3/16, 3/16, 3/16}, -- box - { -1/16, -7/16, -1/16, 1/16, -3/16, 1/16}, -- post - { -3/16, -8/16, -3/16, 3/16, -7/16, 3/16}, -- base - }, - - connect_left = {{ -1/2, -1/16, -1/16, 0, 1/16, 1/16}}, - connect_right = {{ 0, -1/16, -1/16, 1/2, 1/16, 1/16}}, - connect_back = {{-1/16, -1/16, 0, 1/16, 1/16, 1/2}}, - connect_front = {{-1/16, -1/16, -1/2, 1/16, 1/16, 0}}, - }, - connects_to = {"techage:ta4_power_cableA", "techage:ta4_power_cableS", - "techage:ta4_solar_inverter", "techage:ta4_solar_carrier", - "techage:ta4_solar_carrierB", "techage:ta4_cable_wall_entry"}, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - Cable:after_place_node(pos) - end, - tubelib2_on_update2 = function(pos, dir1, tlib2, node) - power.update_network(pos, 0, tlib2, node) - end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:after_dig_node(pos) - end, - - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky=2, crumbly=2, choppy=2}, - sounds = default.node_sound_defaults(), -}) - -power.register_nodes({"techage:ta4_power_box"}, Cable, "junc", {"L", "R", "F", "B"}) - -minetest.register_craft({ - output = "techage:ta4_power_cableS 8", - recipe = { - {"basic_materials:plastic_sheet", "dye:red", ""}, - {"", "default:copper_ingot", ""}, - {"", "dye:red", "basic_materials:plastic_sheet"}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_power_box 2", - recipe = { - {"techage:ta4_power_cableS", "basic_materials:plastic_sheet", "techage:ta4_power_cableS"}, - {"basic_materials:plastic_sheet", "default:copper_ingot", "basic_materials:plastic_sheet"}, - {"techage:ta4_power_cableS", "basic_materials:plastic_sheet", "techage:ta4_power_cableS"}, - },}) - -techage.TA4_Cable = Cable diff --git a/techage/power/ta4_cable_wall_entry.lua b/techage/power/ta4_cable_wall_entry.lua deleted file mode 100644 index fb96be6..0000000 --- a/techage/power/ta4_cable_wall_entry.lua +++ /dev/null @@ -1,57 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 cable wall entry - -]]-- - -local S = techage.S - -local TA4_Cable = techage.TA4_Cable - -minetest.register_node("techage:ta4_cable_wall_entry", { - description = S("TA4 Cable Wall Entry"), - tiles = { - -- up, down, right, left, back, front - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png", - "basic_materials_concrete_block.png^techage_ta4_cable_hole.png", - "basic_materials_concrete_block.png^techage_ta4_cable_hole.png", - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not TA4_Cable:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - TA4_Cable:after_dig_tube(pos, oldnode) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - groups = {crumbly = 2, cracky = 2, snappy = 2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta4_cable_wall_entry", - recipe = { - {"", "techage:ta4_power_cableS", ""}, - {"", "basic_materials:concrete_block", ""}, - {"", "",""}, - }, -}) diff --git a/techage/recipe_checker.lua b/techage/recipe_checker.lua deleted file mode 100644 index aa81d50..0000000 --- a/techage/recipe_checker.lua +++ /dev/null @@ -1,39 +0,0 @@ --- --- Script to check recipe overlaps --- -local Recipes = {} - - -local function recipe_key(items) - local tbl = {} - for idx = 1,9 do - tbl[#tbl + 1] = items[idx] or "#" - end - return table.concat(tbl, "-") -end - -minetest.after(1, function() - for name,_ in pairs(minetest.registered_items) do - local mod = string.split(name, ":")[1] - if mod == "techage" or mod == "signs_bot" or mod == "vm16" or mod == "beduino" then - local recipes = minetest.get_all_craft_recipes(name) - if recipes then - for _,recipe in ipairs(recipes) do - if recipe and recipe.items then - --print(dump(recipe.items)) - local key = recipe_key(recipe.items) - if Recipes[key] then - if not string.find(name, "slab") and not string.find(name, "stair") then - local text = Recipes[key].." and "..name.." have the same incredients" - minetest.log("error", text) - end - end - Recipes[key] = name - end - end - end - end - end -end) - -print ("[techage] Recipe checker loaded") diff --git a/techage/screenshot.png b/techage/screenshot.png deleted file mode 100644 index d3aa7b6dada5c2b64cff89688e3522a010ba5c7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 334873 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%0AbIuybUqPzd* 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

p)?-@5_!LP*^y{rSTO^41&wIt3^UkB_V25Y{^k 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 diff --git a/techage/settingtypes.txt b/techage/settingtypes.txt deleted file mode 100644 index a118e13..0000000 --- a/techage/settingtypes.txt +++ /dev/null @@ -1,43 +0,0 @@ -# Maximim number of Forceload Blocks per player (default 20) -techage_max_num_forceload_blocks (Max. number of Forceload Blocks) int 20 - -# Rarity factor to find ores when sieving with the Gravel Sieve -# 1.0 is according to the mapgen generator -# 2.0 means half as many ores as result -# 0.5 means twice as many ores as result -techage_ore_rarity (Rarity factor to find ores) float 1.0 - -# Enable alternative recipes for steel and bronze. -# Instead of the furnace the player has to use the Coal Burner. -techage_modified_recipes_enabled (Enable alternative recipes for steel and bronze) bool false - -# Seed for the oil exploration random function. -# Change this for your server in order not to be able to predict the oil reserves! -techage_oil_exploration_seed (techage oil exploration seed) int 1234 - - -# Use the external Lua library 'lua-marshal' for faster serialization/deserialization -# of node meta data. See also 'README.md'. -techage_use_marshal (use lua-marshal as serialize/deserialize functions) bool false - -# Use the external library 'lsqlite3' for for faster storing of data. -# See also 'README.md'. -techage_use_sqlite (use sqlite database) bool false - -# To reduce the server CPU load, the number of sent techage commands -# per player and minute can be limited. -techage_command_limit (Max. number of commands sent per minute) int 1200 - -# Colliders are huge systems and should not be built on the surface. -# 'techage_collider_min_depth specifies' the min. depth (Y) to build a TA4 Collider -techage_collider_min_depth (Min. depth to build a TA4 Collider) int -30 - -# Average waiting time in minutes to get one Collider expoint. -# Default value is 40, which means one point every 40 min. -techage_expoint_rate_in_min (average waiting time for one expoint) int 40 - -# For testing purpuses only -techage_recipe_checker_enabled (test techage recipes) bool false - -# Enables stair aliases (to prevent unknown nodes) -techage_stair_aliases_enabled (Enable stair aliases) bool false \ No newline at end of file diff --git a/techage/solar/inverter.lua b/techage/solar/inverter.lua deleted file mode 100644 index dc65574..0000000 --- a/techage/solar/inverter.lua +++ /dev/null @@ -1,266 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Solar Power DC/AC Inverter - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos - -local Cable = techage.ElectricCable -local Solar = techage.TA4_Cable -local power = networks.power -local control = networks.control - -local CYCLE_TIME = 2 -local PWR_PERF = 100 -local COUNTDOWN_TICKS = 1 - -local function determine_power(pos, nvm) - -- determine DC node position - local outdir = M(pos):get_int("leftdir") - local netw = networks.get_network_table(pos, Solar, outdir) or {} - local num_inv = #(netw.con or {}) - local max_power = 0 - for _, power in ipairs(control.request(pos, Solar, outdir, "junc", "power")) do - max_power = max_power + power - end - - if num_inv == 1 then -- only one inverter is allowed - nvm.max_power = math.min(PWR_PERF, max_power) - else - nvm.max_power = 0 - end - return max_power, num_inv -end - -local function has_dc_power(pos, nvm) - local time = minetest.get_timeofday() or 0 - if time < 6.00/24.00 or time > 18.00/24.00 then - nvm.ticks = 0 - nvm.max_power = 0 - return false - end - nvm.ticks = nvm.ticks or 0 - if (nvm.ticks % 30) == 0 then -- calculate max_power not to often - determine_power(pos, nvm) - else - nvm.max_power = nvm.max_power or 0 - end - nvm.ticks = nvm.ticks + 1 - return nvm.max_power > 0 -end - -local function formspec(self, pos, nvm) - local max_power = nvm.max_power or 0 - local provided = nvm.provided or 0 - local arrow = "image[2.5,1.5;1,1;techage_form_arrow_bg.png^[transformR270]" - if techage.is_running(nvm) then - arrow = "image[2.5,1.5;1,1;techage_form_arrow_fg.png^[transformR270]" - end - return "size[6,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;5.8,0.5;#c6e8ff]".. - "label[2.5,-0.1;"..minetest.colorize( "#000000", S("Inverter")).."]".. - techage.formspec_power_bar(pos, 0, 0.8, S("Power DC"), max_power, PWR_PERF).. - techage.formspec_power_bar(pos, 3.5, 0.8, S("Power AC"), provided, max_power).. - arrow.. - "image_button[2.5,3;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[2.5,3;1,1;"..self:get_state_tooltip(nvm).."]" -end - -local function can_start(pos, nvm, state) - local max_power, num_inverter = determine_power(pos, nvm) - if num_inverter > 1 then return S("solar network error") end - if max_power == 0 then return S("no solar power") end - return true -end - -local function start_node(pos, nvm, state) - local meta = M(pos) - nvm.provided = 0 - nvm.ticks = 0 - local outdir = meta:get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) - techage.evaluate_charge_termination(nvm, meta) -end - -local function stop_node(pos, nvm, state) - nvm.provided = 0 - nvm.running = nil -- legacy - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta4_solar_inverter", - cycle_time = CYCLE_TIME, - standby_ticks = 2, - formspec_func = formspec, - infotext_name = S("TA4 Solar Inverter"), - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local running = techage.is_running(nvm) - local has_power = has_dc_power(pos, nvm) - if running and not has_power then - State:standby(pos, nvm) - stop_node(pos, nvm, State) - elseif not running and has_power then - State:start(pos, nvm) - -- start_node() is called implicit - elseif running then - local meta = M(pos) - local outdir = meta:get_int("outdir") - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Cable, outdir, nvm.max_power, tp1, tp2) - local val = power.get_storage_load(pos, Cable, outdir, nvm.max_power) - if val > 0 then - nvm.load = val - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - determine_power(pos, nvm) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - return {level = (nvm.load or 0) / nvm.max_power, perf = nvm.max_power, capa = nvm.max_power * 2} - end -end - -minetest.register_node("techage:ta4_solar_inverter", { - description = S("TA4 Solar Inverter"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_ta4_cable.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_inverter.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - - after_place_node = function(pos) - local nvm = techage.get_nvm(pos) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - M(pos):set_int("leftdir", networks.side_to_outdir(pos, "L")) - Cable:after_place_node(pos) - Solar:after_place_node(pos) - local number = techage.add_node(pos, "techage:ta4_solar_inverter") - State:node_init(pos, nvm, number) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end, - - after_dig_node = function(pos, oldnode) - Cable:after_dig_node(pos) - Solar:after_dig_node(pos) - techage.del_mem(pos) - end, - - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - get_generator_data = get_generator_data, - ta3_formspec = techage.generator_settings("ta4", PWR_PERF) -}) - -power.register_nodes({"techage:ta4_solar_inverter"}, Cable, "gen", {"R"}) -power.register_nodes({"techage:ta4_solar_inverter"}, Solar, "con", {"L"}) - -techage.register_node({"techage:ta4_solar_inverter"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "delivered" then - return math.floor((nvm.provided or 0) + 0.5) - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 135 then -- Delivered Power - return 0, {math.floor((nvm.provided or 0) + 0.5)} - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, -}) - -control.register_nodes({"techage:ta4_solar_inverter"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA4 Solar Inverter"), - number = meta:get_string("node_number") or "", - running = techage.is_running(nvm) or false, - available = nvm.max_power or 0, - provided = nvm.provided or 0, - termpoint = meta:get_string("termpoint"), - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta4_solar_inverter", - recipe = { - {'default:steel_ingot', 'dye:green', 'default:steel_ingot'}, - {'', 'techage:ta4_wlanchip', 'techage:electric_cableS'}, - {'default:steel_ingot', "techage:baborium_ingot", 'default:steel_ingot'}, - }, -}) - -techage.register_node_for_v1_transition({"techage:ta4_solar_inverter"}, function(pos, node) - power.update_network(pos, nil, Solar) -end) diff --git a/techage/solar/minicell.lua b/techage/solar/minicell.lua deleted file mode 100644 index a95839f..0000000 --- a/techage/solar/minicell.lua +++ /dev/null @@ -1,171 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Streetlamp Solar Cell - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local CYCLE_TIME = 2 -local PWR_PERF = 1 -local PWR_CAPA = 2400 -- ticks (2s) with 1 ku ==> 80 min = 4 game days - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.capa = nvm.capa or 0 - pos.y = pos.y + 1 - local light = minetest.get_node_light(pos) or 0 - local t = minetest.get_timeofday() - pos.y = pos.y - 1 - - if t > 0.25 and t < 0.75 then - if nvm.providing then - nvm.providing = false - nvm.provided = 0 - end - if light >= (minetest.LIGHT_MAX - 1) then - nvm.capa = math.min(nvm.capa + PWR_PERF * 1.2, PWR_CAPA) - end - else - if nvm.capa > 0 then - if not nvm.providing then - power.start_storage_calc(pos, Cable, 5) - nvm.providing = true - else - nvm.provided = power.provide_power(pos, Cable, 5, PWR_PERF, 0.8, 1.0) - nvm.capa = nvm.capa - nvm.provided - end - else - power.start_storage_calc(pos, Cable, 5) - nvm.providing = false - nvm.provided = 0 - nvm.capa = 0 - end - end - return true -end - -local function after_place_node(pos) - local meta = M(pos) - local number = techage.add_node(pos, "techage:ta4_solar_minicell") - meta:set_string("node_number", number) - meta:set_string("infotext", S("TA4 Streetlamp Solar Cell").." "..number) - local nvm = techage.get_nvm(pos) - nvm.capa = 0 - nvm.providing = false - minetest.get_node_timer(pos):start(CYCLE_TIME) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode, oldmetadata) - Cable:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -minetest.register_node("techage:ta4_solar_minicell", { - description = S("TA4 Streetlamp Solar Cell"), - tiles = { - -- up, down, right, left, back, front - "techage_solar_cell_mini_top.png", - "techage_solar_cell_mini_bottom.png", - "techage_solar_cell_mini_side.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-14/32, -8/32, -14/32, 14/32, -6/32, 14/32}, - {-7/32, -16/32, -7/32, 7/32, -8/32, 7/32}, - }, - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - use_texture_alpha = techage.CLIP, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_timer = node_timer, -}) - -power.register_nodes({"techage:ta4_solar_minicell"}, Cable, "gen", {"D"}) - -control.register_nodes({"techage:ta4_solar_minicell"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA4 Streetlamp Solar Cell"), - number = meta:get_string("node_number") or "", - running = nvm.providing or false, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = "80% - 100%", - } - end - return false - end, - } -) - -techage.register_node({"techage:ta4_solar_minicell"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - if nvm.providing then - return "discharging" - elseif (nvm.capa or 0) > 0 then - return "charging" - else - return "unused" - end - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 145 then -- Solar Cell State - if nvm.providing then - return 0, {2} - elseif (nvm.capa or 0) > 0 then - return 0, {1} - else - return 0, {0} - end - else - return 2, "" - end - end, - on_node_load = function(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -minetest.register_craft({ - output = "techage:ta4_solar_minicell", - recipe = { - {"", "techage:ta4_wlanchip", ""}, - {"techage:ta4_silicon_wafer", "techage:ta4_silicon_wafer", "techage:ta4_silicon_wafer"}, - {"default:tin_ingot", "techage:iron_ingot", "default:copper_ingot"}, - }, -}) diff --git a/techage/solar/solarcell.lua b/techage/solar/solarcell.lua deleted file mode 100644 index c0c92fa..0000000 --- a/techage/solar/solarcell.lua +++ /dev/null @@ -1,293 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Solar Module and Carriers - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local PWR_PERF = 3 - -local Cable = techage.TA4_Cable -local power = networks.power -local control = networks.control - -local function temperature(pos) - local data = minetest.get_biome_data(pos) - if data then - return math.floor(data.heat) or 0 - end - return 0 -end - --- return the required param2 for solar modules -local function get_param2(pos, side) - local dir = networks.side_to_outdir(pos, side) - return (dir + 1) % 4 -end - --- do we have enough light? -local function light(pos) - if minetest.get_node(pos).name ~= "air" then return false end - local light = minetest.get_node_light(pos) or 0 - return light >= (15 - 1) -end - --- check if solar module is available and has the correct orientation -local function is_solar_module(base_pos, pos, side) - local pos1 = techage.get_pos(pos, side) - if pos1 then - local node = techage.get_node_lvm(pos1) - if node and node.name == "techage:ta4_solar_module" and - light({x = pos1.x, y = pos1.y + 1, z = pos1.z}) then - if side == "L" and node.param2 == M(base_pos):get_int("left_param2") then - return true - elseif side == "R" and node.param2 == M(base_pos):get_int("right_param2") then - return true - end - end - end - return false -end - --- provide the available power, which is temperature dependent -local function on_getpower1(pos) - local pos1 = {x = pos.x, y = pos.y, z = pos.z} - if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then - return PWR_PERF * M(pos):get_int("temperature") / 100.0 - end - return 0 -end - -local function on_getpower2(pos) - local pos1 = {x = pos.x, y = pos.y+1, z = pos.z} - if is_solar_module(pos, pos1, "L") and is_solar_module(pos, pos1, "R") then - return PWR_PERF * M(pos):get_int("temperature") / 100.0 - end - return 0 -end - -local function after_place_node(pos) - M(pos):set_int("temperature", temperature(pos)) - M(pos):set_int("left_param2", get_param2(pos, "L")) - M(pos):set_int("right_param2", get_param2(pos, "R")) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Cable:after_dig_node(pos) -end - -local function tubelib2_on_update2(pos, outdir, tlib2, node) - power.update_network(pos, 0, tlib2, node) -end - -minetest.register_node("techage:ta4_solar_module", { - description = S("TA4 Solar Module"), - inventory_image = "techage_solar_module_top.png", - tiles = { - -- up, down, right, left, back, front - "techage_solar_module_top.png", - "techage_solar_module_bottom.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/2, 7/16, -1/2, 1/2, 8/16, 16/16}, - }, - }, - techage_info = function(pos) - local power = 0 - local pos1 = {x = pos.x, y = pos.y + 1, z = pos.z} - if light(pos1) then - power = PWR_PERF * temperature(pos) / 200.0 - end - local light = minetest.get_node_light(pos1).." / " ..15 - return S("power").." = "..power..", "..S("light").." = "..light - end, - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.register_node("techage:ta4_solar_carrier", { - description = S("TA4 Solar Carrier Module"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", - "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/8, -8/16, -1/2, 3/8, -6/16, 1/2}, - {-1/8, -6/16, -1/2, 1/8, 6/16, 1/2}, - {-3/8, 5/16, -1/2, 3/8, 7/16, 1/2}, - }, - }, - after_place_node = function(pos) - M(pos):set_int("temperature", temperature(pos)) - M(pos):set_int("left_param2", get_param2(pos, "L")) - M(pos):set_int("right_param2", get_param2(pos, "R")) - end, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - tubelib2_on_update2 = tubelib2_on_update2, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:ta4_solar_carrierB", { - description = S("TA4 Solar Carrier Module B"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", - "techage_concrete.png^[brighten^techage_appl_ta4_cable.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-3/8, -8/16, -1/2, 3/8, -6/16, 1/2}, - {-1/8, -6/16, -1/2, 1/8, 8/16, 1/2}, - }, - }, - after_place_node = function(pos) - M(pos):set_int("temperature", temperature(pos)) - M(pos):set_int("left_param2", get_param2(pos, "L")) - M(pos):set_int("right_param2", get_param2(pos, "R")) - Cable:after_place_node(pos) - end, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - tubelib2_on_update2 = tubelib2_on_update2, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_node("techage:ta4_solar_carrierT", { - description = S("TA4 Solar Carrier Module T"), - tiles = { - -- up, down, right, left, back, front - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - "techage_concrete.png^[brighten", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -8/16, -1/2, 1/8, 6/16, 1/2}, - {-3/8, 5/16, -1/2, 3/8, 7/16, 1/2}, - }, - }, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -power.register_nodes({"techage:ta4_solar_carrier", "techage:ta4_solar_carrierB"}, Cable, "junc", {"F", "B"}) - -control.register_nodes({"techage:ta4_solar_carrier"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "power" then - return on_getpower1(pos) - end - end, - } -) - -control.register_nodes({"techage:ta4_solar_carrierB"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "power" then - return on_getpower2(pos) - end - end, - } -) - -minetest.register_craft({ - output = "techage:ta4_solar_module", - recipe = { - {"techage:ta4_silicon_wafer", "techage:ta4_silicon_wafer", "techage:ta4_silicon_wafer"}, - {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, - {"", "", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_solar_carrierB 2", - recipe = { - {"", "default:steel_ingot", ""}, - {"", "techage:ta4_power_cableS", ""}, - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_solar_carrierT 2", - recipe = { - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - {"", "default:steel_ingot", ""}, - {"", "techage:ta4_power_cableS", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_solar_carrier", - recipe = { - {"", "techage:ta4_solar_carrierT", ""}, - {"", "techage:ta4_solar_carrierB", ""}, - {"", "", ""}, - }, -}) diff --git a/techage/sounds/techage_booster.ogg b/techage/sounds/techage_booster.ogg deleted file mode 100644 index 63faeadf5052717c03fac6b3d8d32b700cd9d61c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16776 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 VwQjB}po`hs*<^ZmweH!2{{h#>>xlpW diff --git a/techage/sounds/techage_button.ogg b/techage/sounds/techage_button.ogg deleted file mode 100644 index 3d6b28c5c80ea289c99f5ce09813b7e145a0dbb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5825 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 diff --git a/techage/sounds/techage_gasflare.ogg b/techage/sounds/techage_gasflare.ogg deleted file mode 100644 index 1338c886841ce45abce1c3cb66fbd094f0b0e1b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15113 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 diff --git a/techage/sounds/techage_mill.ogg b/techage/sounds/techage_mill.ogg deleted file mode 100644 index de0617b975786b299cbeabb162a8c6ee823ae7ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26619 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 diff --git a/techage/sounds/techage_oildrill.ogg b/techage/sounds/techage_oildrill.ogg deleted file mode 100644 index 2300bc96b272249d4a2887747c6e9f73371b55c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8599 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 Bd_MpH diff --git a/techage/sounds/techage_quarry.ogg b/techage/sounds/techage_quarry.ogg deleted file mode 100644 index fec51bd753bf1ab698ec178ea1b5cfb8c93aa644..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12389 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 G1o$5xGFVvv diff --git a/techage/sounds/techage_reactor.ogg b/techage/sounds/techage_reactor.ogg deleted file mode 100644 index 27329b0699ed631d0604d82fe4da00064102dc59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8799 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 diff --git a/techage/sounds/techage_steamengine.ogg b/techage/sounds/techage_steamengine.ogg deleted file mode 100644 index 649a3de5202327c4a20a9d746f37ad265f2505be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12427 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 Qjst^k)=?8T*ykYs0`r6Z9smFU diff --git a/techage/sounds/techage_tool2.ogg b/techage/sounds/techage_tool2.ogg deleted file mode 100644 index 8b4dc5dbf79d3c96a91f1ec77f34ec373430382d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7678 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 Nz}??hfnjdoKL7$ArdR*~ diff --git a/techage/sounds/techage_valve.ogg b/techage/sounds/techage_valve.ogg deleted file mode 100644 index c293fbf61a72d74543795de12c2deb9af19c5608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6871 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 F{td`k-)Vkea$ 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 Cz&R8E diff --git a/techage/steam_engine/boiler.lua b/techage/steam_engine/boiler.lua deleted file mode 100644 index dbb0bf1..0000000 --- a/techage/steam_engine/boiler.lua +++ /dev/null @@ -1,139 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Steam Engine Boiler - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local CYCLE_TIME = 4 -local WATER_CONSUMPTION = 0.5 - -local Pipe = techage.SteamPipe -local boiler = techage.boiler - -local function steaming(pos, nvm, temp) - if temp >= 80 then - local wc = WATER_CONSUMPTION * (nvm.power_ratio or 1) - nvm.water_level = math.max((nvm.water_level or 0) - wc, 0) - end -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local temp = boiler.water_temperature(pos, nvm) - steaming(pos, nvm, temp) - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", boiler.formspec(pos, nvm)) - end - return temp > 20 -end - -local function after_place_node(pos) - local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) - if node.name ~= "techage:boiler1" then - minetest.remove_node(pos) - return true - end -end - -local function after_dig_node(pos, oldnode) - Pipe:after_dig_node(pos) - techage.del_mem(pos) -end - --- boiler2: Main part, needed as generator -minetest.register_node("techage:boiler2", { - description = S("TA2 Boiler Top"), - tiles = {"techage_boiler2.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_09.obj", - selection_box = { - type = "fixed", - fixed = {-10/32, -48/32, -10/32, 10/32, 16/32, 10/32}, - }, - - can_dig = boiler.can_dig, - on_timer = node_timer, - on_rightclick = boiler.on_rightclick, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - on_punch = boiler.on_punch, - - paramtype = "light", - groups = {cracky=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:boiler2"}) - -techage.register_node({"techage:boiler2"}, { - on_transfer = function(pos, in_dir, topic, payload) - if topic == "trigger" then - if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name ~= "techage:boiler1" then - return 0 - end - local nvm = techage.get_nvm(pos) - nvm.fire_trigger = true - if not minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):start(CYCLE_TIME) - end - if (nvm.temperature or 20) > 80 then - nvm.power_ratio = techage.transfer(pos, 6, "trigger", nil, Pipe, { - "techage:cylinder", "techage:cylinder_on"}) or 0 - return nvm.power_ratio - else - return 0 - end - end - end, -}) - -minetest.register_node("techage:boiler1", { - description = S("TA2 Boiler Base"), - tiles = {"techage_boiler.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_09.obj", - selection_box = { - type = "fixed", - fixed = {-8/32, -16/32, -8/32, 8/32, 16/32, 8/32}, - }, - - paramtype = "light", - groups = {cracky=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - - - -minetest.register_craft({ - output = "techage:boiler1", - recipe = { - {"techage:iron_ingot", "", "techage:iron_ingot"}, - {"default:bronze_ingot", "", "default:bronze_ingot"}, - {"techage:iron_ingot", "default:bronze_ingot", "techage:iron_ingot"}, - }, -}) - -minetest.register_craft({ - output = "techage:boiler2", - recipe = { - {"techage:iron_ingot", "techage:steam_pipeS", "techage:iron_ingot"}, - {"default:bronze_ingot", "", "default:bronze_ingot"}, - {"techage:iron_ingot", "", "techage:iron_ingot"}, - }, -}) diff --git a/techage/steam_engine/cylinder.lua b/techage/steam_engine/cylinder.lua deleted file mode 100644 index ecdcef2..0000000 --- a/techage/steam_engine/cylinder.lua +++ /dev/null @@ -1,176 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2020 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Steam Engine Cylinder - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.SteamPipe - -local function transfer_flywheel(pos, topic, payload) - return techage.transfer(pos, "R", topic, payload, nil, - {"techage:flywheel", "techage:flywheel_on"}) -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_steamengine", { - pos = pos, - gain = 0.5, - max_hear_distance = 8, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function after_place_node(pos) - Pipe:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - stop_sound(pos) - Pipe:after_dig_node(pos) - techage.del_mem(pos) -end - -local function tubelib2_on_update2(pos, outdir, tlib2, node) - swap_node(pos, "techage:cylinder") - stop_sound(pos) -end - -minetest.register_node("techage:cylinder", { - description = S("TA2 Cylinder"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_open.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_steam_hole.png", - "techage_filling_ta2.png^techage_cylinder.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_cylinder.png^techage_frame_ta2.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - tubelib2_on_update2 = tubelib2_on_update2, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:cylinder_on", { - description = S("TA2 Cylinder"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_open.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_steam_hole.png", - { - name = "techage_filling4_ta2.png^techage_cylinder4.png^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - { - name = "techage_filling4_ta2.png^techage_cylinder4.png^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - }, - - tubelib2_on_update2 = tubelib2_on_update2, - - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -Pipe:add_secondary_node_names({"techage:cylinder", "techage:cylinder_on"}) - -techage.register_node({"techage:cylinder", "techage:cylinder_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "trigger" then -- used by firebox - local power = transfer_flywheel(pos, topic, payload) - if not power or power <= 0 and nvm.running then - swap_node(pos, "techage:cylinder") - stop_sound(pos) - nvm.running = false - return 0 - end - return power - elseif topic == "start" then -- used by flywheel - swap_node(pos, "techage:cylinder_on") - play_sound(pos) - nvm.running = true - return true - elseif topic == "stop" then -- used by flywheel - swap_node(pos, "techage:cylinder") - stop_sound(pos) - nvm.running = false - return true - end - end, - on_node_load = function(pos, node) - --print("on_node_load", node.name) - if node.name == "techage:cylinder_on" then - play_sound(pos) - end - end, -}) - -minetest.register_craft({ - output = "techage:cylinder", - recipe = { - {"basic_materials:steel_bar", "techage:iron_ingot", "default:wood"}, - {"techage:steam_pipeS", "basic_materials:gear_steel", ""}, - {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/steam_engine/firebox.lua b/techage/steam_engine/firebox.lua deleted file mode 100644 index cca8ece..0000000 --- a/techage/steam_engine/firebox.lua +++ /dev/null @@ -1,172 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Steam Engine Firebox - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local firebox = techage.firebox - -local CYCLE_TIME = 2 -local BURN_CYCLE_FACTOR = 0.8 - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - if nvm.running then - local power = techage.transfer( - {x=pos.x, y=pos.y+2, z=pos.z}, - nil, -- outdir - "trigger", -- topic - nil, -- payload - nil, -- network - {"techage:boiler2"} -- nodenames - ) - nvm.burn_cycles = (nvm.burn_cycles or 0) - math.max((power or 0.1), 0.1) - if nvm.burn_cycles <= 0 then - local taken = firebox.get_fuel(pos) - if taken then - nvm.burn_cycles = (firebox.Burntime[taken:get_name()] or 1) / CYCLE_TIME * BURN_CYCLE_FACTOR - nvm.burn_cycles_total = nvm.burn_cycles - else - nvm.running = false - firebox.swap_node(pos, "techage:firebox") - M(pos):set_string("formspec", firebox.formspec(nvm)) - return false - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", firebox.formspec(nvm)) - end - return true - end -end - -minetest.register_node("techage:firebox", { - description = S("TA2 Firebox"), - tiles = { - -- up, down, right, left, back, front - "techage_firebox.png^techage_appl_open.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_appl_firehole.png^techage_frame_ta2.png", - }, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {cracky=2}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - - on_timer = node_timer, - can_dig = firebox.can_dig, - allow_metadata_inventory_put = firebox.allow_metadata_inventory_put, - allow_metadata_inventory_take = firebox.allow_metadata_inventory_take, - on_rightclick = firebox.on_rightclick, - - on_construct = function(pos) - local nvm = techage.get_nvm(pos) - nvm.running = false - nvm.burn_cycles = 0 - local meta = M(pos) - meta:set_string("formspec", firebox.formspec(nvm)) - local inv = meta:get_inventory() - inv:set_size('fuel', 1) - end, - - on_metadata_inventory_put = function(pos, listname, index, stack, player) - local nvm = techage.get_nvm(pos) - nvm.running = true - -- activate the formspec fire temporarily - nvm.burn_cycles = firebox.Burntime[stack:get_name()] / CYCLE_TIME - nvm.burn_cycles_total = nvm.burn_cycles - M(pos):set_string("formspec", firebox.formspec(nvm)) - nvm.burn_cycles = 0 - firebox.swap_node(pos, "techage:firebox_on") - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -minetest.register_node("techage:firebox_on", { - description = S("TA2 Firebox"), - tiles = { - -- up, down, right, left, back, front - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - "techage_firebox.png^techage_frame_ta2.png", - { - name = "techage_firebox4.png^techage_appl_firehole4.png^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.4, - }, - }, - }, - paramtype2 = "facedir", - light_source = 8, - on_rotate = screwdriver.disallow, - groups = {cracky=2, not_in_creative_inventory=1}, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), - drop = "techage:firebox", - - on_timer = node_timer, - can_dig = firebox.can_dig, - allow_metadata_inventory_put = firebox.allow_metadata_inventory_put, - allow_metadata_inventory_take = firebox.allow_metadata_inventory_take, - on_receive_fields = firebox.on_receive_fields, - on_rightclick = firebox.on_rightclick, -}) - -minetest.register_craft({ - output = "techage:firebox", - recipe = { - {'default:stone', 'default:stone', 'default:stone'}, - {'techage:iron_ingot', '', 'techage:iron_ingot'}, - {'default:stone', 'default:stone', 'default:stone'}, - }, -}) - -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() - if firebox.Burntime[stack:get_name()] then - if inv:room_for_item("fuel", stack) then - inv:add_item("fuel", stack) - minetest.get_node_timer(pos):start(CYCLE_TIME) - return true - end - end - return false - end, -}) - -minetest.register_lbm({ - label = "[techage] Steam engine firebox", - name = "techage:steam_engine", - nodenames = {"techage:firebox_on"}, - run_at_every_load = true, - action = function(pos, node) - local nvm = techage.get_nvm(pos) - nvm.running = true - minetest.get_node_timer(pos):start(CYCLE_TIME) - end -}) diff --git a/techage/steam_engine/flywheel.lua b/techage/steam_engine/flywheel.lua deleted file mode 100644 index c68cedd..0000000 --- a/techage/steam_engine/flywheel.lua +++ /dev/null @@ -1,238 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Steam Engine Flywheel - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local STANDBY_TICKS = 4 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 2 -local PWR_PERF = 25 - -local Axle = techage.Axle -local power = networks.power - --- Axles texture animation -local function switch_axles(pos, on) - local outdir = M(pos):get_int("outdir") - Axle:switch_tube_line(pos, outdir, on and "on" or "off") -end - -local function formspec(self, pos, nvm) - return techage.generator_formspec(self, pos, nvm, S("Flywheel"), nvm.provided, PWR_PERF, true) -end - -local function transfer_cylinder(pos, topic, payload) - return techage.transfer(pos, "L", topic, payload, nil, - {"techage:cylinder", "techage:cylinder_on"}) -end - -local function can_start(pos, nvm, state) - return (nvm.firebox_trigger or 0) > 0 -- by means of firebox -end - -local function start_node(pos, nvm, state) - switch_axles(pos, true) - local outdir = M(pos):get_int("outdir") - transfer_cylinder(pos, "start") - power.start_storage_calc(pos, Axle, outdir) -end - -local function stop_node(pos, nvm, state) - switch_axles(pos, false) - local outdir = M(pos):get_int("outdir") - nvm.provided = 0 - transfer_cylinder(pos, "stop") - power.start_storage_calc(pos, Axle, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:flywheel", - node_name_active = "techage:flywheel_on", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - nvm.firebox_trigger = (nvm.firebox_trigger or 0) - 1 - local running = techage.is_running(nvm) - if running and nvm.firebox_trigger <= 0 then - State:standby(pos, nvm) - stop_node(pos, nvm, State) - elseif not running and nvm.firebox_trigger > 0 then - State:start(pos, nvm) - -- start_node() is called implicit - elseif running then - local outdir = M(pos):get_int("outdir") - nvm.provided = power.provide_power(pos, Axle, outdir, PWR_PERF) - local val = power.get_storage_load(pos, Axle, outdir, PWR_PERF) - if val > 0 then - nvm.load = val - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm,_ = techage.get_nvm(pos, true) - State:state_button_event(pos, nvm, fields) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function after_place_node(pos) - local nvm = techage.get_nvm(pos) - State:node_init(pos, nvm, "") - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - Axle:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode) - Axle:after_dig_node(pos) - techage.del_mem(pos) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 4} - end -end - -minetest.register_node("techage:flywheel", { - description = S("TA2 Flywheel"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_axle_clutch.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_open.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_flywheel.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_flywheel.png^[transformFX]", - }, - - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_generator_data = get_generator_data, - - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:flywheel_on", { - description = S("TA2 Flywheel"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - { - name = "techage_filling4_ta2.png^techage_axle_clutch4.png^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - "techage_filling_ta2.png^techage_appl_open.png^techage_frame_ta2.png", - { - name = "techage_filling8_ta2.png^techage_frame8_ta2.png^techage_flywheel8.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 64, - aspect_h = 64, - length = 1.2, - }, - }, - { - name = "techage_filling8_ta2.png^techage_frame8_ta2.png^techage_flywheel8.png^[transformFX]", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 64, - aspect_h = 64, - length = 1.2, - }, - }, - }, - - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_timer = node_timer, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_generator_data = get_generator_data, - - drop = "", - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:flywheel", "techage:flywheel_on"}, Axle, "gen", {"R"}) - -techage.register_node({"techage:flywheel", "techage:flywheel_on"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "trigger" then - nvm.firebox_trigger = 3 - if techage.is_running(nvm) then - return math.max((nvm.provided or PWR_PERF) / PWR_PERF, 0.1) - else - return 0 - end - end - end, - on_node_load = function(pos, node) - State:on_node_load(pos) - end, -}) - -minetest.register_craft({ - output = "techage:flywheel", - recipe = { - {"basic_materials:steel_bar", "dye:red", "default:wood"}, - {"", "basic_materials:gear_steel", "techage:axle"}, - {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/ta1_watermill/mill.lua b/techage/ta1_watermill/mill.lua deleted file mode 100644 index c511ce3..0000000 --- a/techage/ta1_watermill/mill.lua +++ /dev/null @@ -1,178 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA1 Mill - -]]-- - -local M = minetest.get_meta -local S = techage.S - -local function start_mill(pos) - local obj = minetest.add_entity(pos, "techage:ta1_mill_entity") - minetest.remove_node(pos) -end - -local function stop_mill(pos, self) - minetest.swap_node(pos, {name = "techage:ta1_mill", param2 = 0}) - minetest.get_node_timer(pos):start(2) - self.object:remove() -end - -local function has_power(pos, y_offs) - local pos1 = {x = pos.x, y = pos.y + y_offs, z = pos.z} - local nvm = techage.get_nvm(pos1) - nvm.watermill_trigger = (nvm.watermill_trigger or 1) - 1 - return nvm.watermill_trigger > 0 -end - -techage.ta1_mill_has_power = has_power - -minetest.register_node("techage:ta1_mill_gear", { - description = S("TA1 Mill Gear"), - tiles = { - "default_wood.png^techage_axle_bearing.png^[transformR90", - "default_wood.png^techage_axle_bearing.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/2, -1/2, -1/2, 1/2, -1/8, 1/2}, - {-1/8, -1/8, -1/2, 1/8, 1/8, 1/2}, - }, - }, - - after_place_node = function(pos, placer) - techage.TA1Axle:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.TA1Axle:after_dig_node(pos) - end, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2}, -}) - -techage.register_node({"techage:ta1_mill_gear"}, { - on_transfer = function(pos, in_dir, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "trigger" then - nvm.watermill_trigger = 4 - return true - end - end, -}) - -minetest.register_node("techage:ta1_mill", { - description = S("TA1 Mill"), - tiles = { - -- up, down, right, left, back, front - "techage_mill_side.png", - "techage_mill_side.png", - "techage_mill_side.png", - "techage_mill_side.png", - "techage_mill_front.png", - "techage_mill_front.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -1/8, -1/8, 1/8, 4/8, 1/8}, - {-3/8, -3/8, -4/8, -1/8, 3/8, 4/8}, - {-3/8, -4/8, -3/8, -1/8, 4/8, 3/8}, - { 1/8, -3/8, -4/8, 3/8, 3/8, 4/8}, - { 1/8, -4/8, -3/8, 3/8, 4/8, 3/8}, - }, - }, - - after_place_node = function(pos, placer) - minetest.get_node_timer(pos):start(2) - end, - - on_rightclick = function(pos, node, clicker) - start_mill(pos) - end, - - on_timer = function(pos, elapsed) - if has_power(pos, 1) then - start_mill(pos) - end - return true - end, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2}, -}) - -minetest.register_entity("techage:ta1_mill_entity", { - initial_properties = { - physical = true, - visual = "wielditem", - wield_item = "techage:ta1_mill", - visual_size = {x=0.67, y=0.67, z=0.67}, - static_save = true, - automatic_rotate = -math.pi * 0.2, - pointable = false, - }, - - on_step = function(self, dtime) - self.dtime = (self.dtime or 0) + dtime - - if self.dtime > 2 then - local pos = vector.round(self.object:get_pos()) - if not has_power(pos, 1) then - stop_mill(pos, self) - end - self.dtime = 0 - minetest.sound_play("techage_mill", {gain = 0.3, pos = pos, - max_hear_distance = 10}, true) - end - end, - - on_rightclick = function(self, clicker) - local pos = vector.round(self.object:get_pos()) - stop_mill(pos, self) - end, -}) - -techage.register_node({"techage:ta1_mill"}, { - on_node_load = function(pos, node) - minetest.get_node_timer(pos):start(2) - end, -}) - -minetest.register_craft({ - output = "techage:ta1_mill_gear", - recipe = { - {"default:wood", "", "default:wood"}, - {"techage:ta1_axle", "default:wood", "techage:ta1_axle"}, - {"default:wood", "techage:ta1_axle", "default:wood"}, - }, -}) - -minetest.register_craft({ - output = "techage:ta1_mill", - recipe = { - {"", "techage:iron_ingot", ""}, - {"stairs:slab_stone", "techage:iron_ingot", "stairs:slab_stone"}, - {"", "", ""}, - }, -}) diff --git a/techage/ta1_watermill/millboard.lua b/techage/ta1_watermill/millboard.lua deleted file mode 100644 index 445b9ce..0000000 --- a/techage/ta1_watermill/millboard.lua +++ /dev/null @@ -1,91 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA1 mill boards - -]]-- - -local M = minetest.get_meta -local S = techage.S - -local function register_board1(output, description, tiles, input) - minetest.register_node(output, { - description = description, - tiles = tiles, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/2, -4/8, -1/2, 1/2, -3/8, 1/2}, - }, - }, - paramtype2 = "wallmounted", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, - sounds = default.node_sound_wood_defaults(), - }) - - minetest.register_craft({ - output = output .. " 3", - recipe = { - {"", "", input}, - {"", "", input}, - {"", "", input}, - }, - }) -end - -local function register_board2(output, description, tiles, input1, input2) - minetest.register_node(output, { - description = description, - tiles = tiles, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/2, 3/8, -1/2, 1/2, 4/8, 1/2}, - {-1/2, 3/16, -2/16, 1/2, 6/16, 2/16}, - {-1/2, -5/16, -1/16, 1/2, -3/16, 1/16}, - }, - }, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, fence = 1}, - sounds = default.node_sound_wood_defaults(), - }) - - minetest.register_craft({ - output = output, - recipe = { - {"", input1, ""}, - {"", input2, ""}, - {"", "", ""}, - }, - }) -end - -register_board1("techage:ta1_board1_apple", S("TA1 Apple Wood Board"), {"default_wood.png"}, "stairs:slab_wood") -register_board1("techage:ta1_board1_jungle", S("TA1 Jungle Wood Board"), {"default_junglewood.png"}, "stairs:slab_junglewood") -register_board1("techage:ta1_board1_pine", S("TA1 Pine Wood Board"), {"default_pine_wood.png"}, "stairs:slab_pine_wood") -register_board1("techage:ta1_board1_acacia", S("TA1 Acacia Wood Board"), {"default_acacia_wood.png"}, "stairs:slab_acacia_wood") -register_board1("techage:ta1_board1_aspen", S("TA1 Aspen Wood Board"), {"default_aspen_wood.png"}, "stairs:slab_aspen_wood") - -register_board2("techage:ta1_board2_apple", S("TA1 Apple Millrace Board"), {"default_wood.png"}, "techage:ta1_board1_apple", "default:fence_rail_wood") -register_board2("techage:ta1_board2_jungle", S("TA1 Jungle Millrace Board"), {"default_junglewood.png"}, "techage:ta1_board1_jungle", "default:fence_rail_junglewood") -register_board2("techage:ta1_board2_pine", S("TA1 Pine Millrace Board"), {"default_pine_wood.png"}, "techage:ta1_board1_pine", "default:fence_rail_pine_wood") -register_board2("techage:ta1_board2_acacia", S("TA1 Acacia Millrace Board"), {"default_acacia_wood.png"}, "techage:ta1_board1_acacia", "default:fence_rail_acacia_wood") -register_board2("techage:ta1_board2_aspen", S("TA1 Aspen Millrace Board"), {"default_aspen_wood.png"}, "techage:ta1_board1_aspen", "default:fence_rail_aspen_wood") diff --git a/techage/ta1_watermill/sluice.lua b/techage/ta1_watermill/sluice.lua deleted file mode 100644 index 5af0371..0000000 --- a/techage/ta1_watermill/sluice.lua +++ /dev/null @@ -1,195 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA1 Sluice Gate - -]]-- - -local S = techage.S - -local M = minetest.get_meta -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos - -local function check_position(pos, facedir) - local dir = minetest.facedir_to_dir(facedir) - local pos_ = vector.add(pos, dir) - local node = minetest.get_node(pos_) - return (node.name == "default:water_source" or node.name == "default:water_flowing"), pos_ -end - --- Function checks if water is avaliable and --- returns the pos for the new water block, and the result (true/false). -local function has_water(pos, facedir) - local res1, pos1 = check_position(pos, (facedir + 1) % 4) - local res2, pos2 = check_position(pos, (facedir + 3) % 4) - - if res1 and not res2 then - M(pos):set_string("millrace_pos", P2S(pos2)) - return pos2, true - end - - if not res1 and res2 then - M(pos):set_string("millrace_pos", P2S(pos1)) - return pos1, true - end - - local pos3 = S2P(M(pos):get_string("millrace_pos")) - if pos3 then - return pos3, true - end - return pos1, false -end - -local function on_rightclick(pos, node, clicker, itemstack, pointed_thing) - if minetest.is_protected(pos, clicker:get_player_name()) then - return - end - - local pos2 = vector.add(pos, {x = 0, y = -1, z = 0}) - local node2 = minetest.get_node(pos2) - local pos3, res = has_water(pos2, node2.param2) - local node3 = minetest.get_node(pos3) - - if node2.name == "techage:ta1_sluice_closed" then - minetest.swap_node(pos, {name = "techage:ta1_sluice_handle_open", param2 = node.param2}) - minetest.swap_node(pos2, {name = "techage:ta1_sluice_open", param2 = node.param2}) - if res and (node3.name == "air" or node3.name == "default:water_flowing") then - minetest.add_node(pos3, {name = "default:water_source"}) - minetest.get_node_timer(pos3):start(2) - end - minetest.sound_play("doors_door_open", {gain = 0.5, pos = pos, - max_hear_distance = 10}, true) - elseif node2.name == "techage:ta1_sluice_open" then - minetest.swap_node(pos, {name = "techage:ta1_sluice_handle_closed", param2 = node.param2}) - minetest.swap_node(pos2, {name = "techage:ta1_sluice_closed", param2 = node.param2}) - if res and node3.name == "default:water_source" then - minetest.add_node(pos3, {name = "air"}) - end - minetest.sound_play("doors_door_close", {gain = 0.5, pos = pos, - max_hear_distance = 10}, true) - end -end - -minetest.register_node("techage:ta1_sluice_closed", { - description = S("TA1 Sluice Gate"), - tiles = { - "default_wood.png^techage_junglewood_top.png", - "default_wood.png", - "default_wood.png^techage_junglewood.png", - "default_wood.png^techage_junglewood.png", - "default_wood.png", - "default_wood.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, 5/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, 8/16, 8/16, -5/16}, - {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16}, - {-1/16, -5/16, -7/16, 1/16, 8/16, 7/16}, - }, - }, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta1_sluice_open", { - description = S("TA1 Sluice Gate"), - tiles = {"default_wood.png"}, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, 5/16, 8/16, 8/16, 8/16}, - {-8/16, -8/16, -8/16, 8/16, 8/16, -5/16}, - {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16}, - }, - }, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta1_sluice_closed", -}) - -minetest.register_node("techage:ta1_sluice_handle_closed", { - description = S("TA1 Sluice Handle"), - tiles = {"default_wood.png"}, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, 0/16, 8/16}, - {-1/16, 0/16, -1/16, 1/16, 4/16, 1/16}, - {-1/16, 2/16, -4/16, 1/16, 4/16, 4/16}, - }, - }, - on_rightclick = on_rightclick, - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta1_sluice_handle_open", { - description = S("TA1 Sluice Handle"), - tiles = {"default_wood.png"}, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-8/16, -8/16, -8/16, 8/16, 0/16, 8/16}, - {-1/16, 0/16, -1/16, 1/16, 14/16, 1/16}, - {-1/16, 14/16, -4/16, 1/16, 16/16, 4/16}, - }, - }, - on_rightclick = on_rightclick, - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1, not_in_creative_inventory = 1}, - sounds = default.node_sound_wood_defaults(), - drop = "techage:ta1_sluice_handle_closed", -}) - -minetest.register_craft({ - output = "techage:ta1_sluice_closed", - recipe = { - {"", "", ""}, - {"techage:ta1_board1_apple", "techage:ta1_board1_jungle", "techage:ta1_board1_apple"}, - {"", "techage:ta1_board1_apple", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta1_sluice_handle_closed", - recipe = { - {"default:stick", "default:stick", "default:stick"}, - {"", "default:stick", ""}, - {"", "stairs:slab_wood", ""}, - }, -}) diff --git a/techage/ta1_watermill/ta1_axle.lua b/techage/ta1_watermill/ta1_axle.lua deleted file mode 100644 index 51aaa5a..0000000 --- a/techage/ta1_watermill/ta1_axle.lua +++ /dev/null @@ -1,176 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA1 Axles for the Watermill - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Axle = tubelib2.Tube:new({ - dirs_to_check = {1,2,3,4,5,6}, - max_tube_length = 10, - show_infotext = false, - tube_type = "axle1", - primary_node_names = {"techage:ta1_axle"}, - secondary_node_names = {"techage:ta1_mill_gear", "techage:ta1_axle_bearing1", "techage:ta1_axle_bearing2"}, - after_place_tube = function(pos, param2, tube_type, num_tubes, state) - minetest.swap_node(pos, {name = "techage:ta1_axle", param2 = param2}) - end, -}) - -Axle:set_valid_sides("techage:ta1_mill_gear", {"F", "B"}) -Axle:set_valid_sides("techage:ta1_axle_bearing1", {"F", "B"}) -Axle:set_valid_sides("techage:ta1_axle_bearing2", {"F", "B"}) - -minetest.register_node("techage:ta1_axle", { - description = S("TA1 Axle"), - tiles = { - "techage_axle_bearing.png^[transformR90", - "techage_axle_bearing.png^[transformR90", - "techage_axle_bearing.png", - "techage_axle_bearing.png", - "techage_axle_bearing.png", - "techage_axle_bearing.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/8, -1/8, -4/8, 1/8, 1/8, 4/8}, - }, - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - if not Axle:after_place_tube(pos, placer, pointed_thing) then - minetest.remove_node(pos) - return true - end - return false - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Axle:after_dig_tube(pos, oldnode, oldmetadata) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {crumbly = 3, cracky = 3, snappy = 3}, - sounds = default.node_sound_wood_defaults(), -}) - --- Bearings are defined as secondary nodes which forward received 'on_transfer' commands -minetest.register_node("techage:ta1_axle_bearing1", { - description = S("TA1 Axle Bearing"), - tiles = { - "default_stone_brick.png^techage_axle_bearing.png^[transformR90", - "default_stone_brick.png^techage_axle_bearing.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/2, -1/2, -1/2, 1/2, -1/8, 1/2}, - {-1/8, -1/8, -1/2, 1/8, 1/8, 1/2}, - }, - }, - - after_place_node = function(pos, placer) - Axle:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Axle:after_dig_node(pos) - end, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2}, -}) - -minetest.register_node("techage:ta1_axle_bearing2", { - description = S("TA1 Axle Bearing"), - tiles = { - -- up, down, right, left, back, front - "default_stone_brick.png", - "default_stone_brick.png", - "default_stone_brick.png", - "default_stone_brick.png", - "default_stone_brick.png^techage_axle_bearing_front.png", - "default_stone_brick.png^techage_axle_bearing_front.png", - }, - - after_place_node = function(pos, placer) - Axle:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Axle:after_dig_node(pos) - end, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2}, -}) - -techage.register_node({"techage:ta1_axle_bearing1", "techage:ta1_axle_bearing2"}, { - on_transfer = function(pos, in_dir, topic, payload) - return techage.transfer( - pos, - in_dir, -- outdir - topic, - payload, - Axle, -- network - nil) -- valid nodes - end, -}) - - -minetest.register_craft({ - output = "techage:ta1_axle", - recipe = { - {"", "", ""}, - {"techage:iron_ingot", "dye:black", "techage:iron_ingot"}, - {"", "", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta1_axle_bearing1", - recipe = { - {"", "", ""}, - {"", "techage:ta1_axle", ""}, - {"", "stairs:slab_stonebrick", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta1_axle_bearing2", - recipe = { - {"", "", ""}, - {"", "techage:ta1_axle", ""}, - {"", "default:stonebrick", ""}, - }, -}) - -techage.TA1Axle = Axle diff --git a/techage/ta1_watermill/watermill.lua b/techage/ta1_watermill/watermill.lua deleted file mode 100644 index e1673a4..0000000 --- a/techage/ta1_watermill/watermill.lua +++ /dev/null @@ -1,319 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA1 Watermill - -]]-- - -local M = minetest.get_meta -local S = techage.S - -local function calc_dir(dir, facedir) - if facedir == 1 then - return {x = dir.z, y = dir.y, z = -dir.x} - elseif facedir == 2 then - return {x = -dir.x, y = dir.y, z = -dir.z} - elseif facedir == 3 then - return {x = -dir.z, y = dir.y, z = dir.x} - end - return {x = dir.x, y = dir.y, z = dir.z} -end - -local function add_node(pos, dir, facedir, node_name) - local pos2 = vector.add(pos, calc_dir(dir, facedir)) - local node = minetest.get_node(pos2) - if techage.is_air_like(node.name) then - minetest.swap_node(pos2, {name = node_name}) - end -end - -local function remove_node(pos, dir, facedir, node_name) - local pos2 = vector.add(pos, calc_dir(dir, facedir)) - local node = minetest.get_node(pos2) - if node.name == node_name then - minetest.swap_node(pos2, {name = "air"}) - end -end - -local function water_flowing(pos, facedir, tRes) - facedir = ((facedir or 0) + 1) % 4 - local dir = minetest.facedir_to_dir(facedir) - - local pos2 = vector.add(pos, dir) - pos2.y = pos2.y + 1 - local node = minetest.get_node(pos2) - if node.name == "default:water_flowing" or node.name == "default:river_water_flowing" then - tRes.backward = false - return true - end - - pos2 = vector.subtract(pos, dir) - pos2.y = pos2.y + 1 - node = minetest.get_node(pos2) - if node.name == "default:water_flowing" or node.name == "default:river_water_flowing" then - tRes.backward = true - return true - end -end - -local function enough_space(pos, facedir) - local pos1 = vector.add(pos, calc_dir({x =-1, y =-1, z = 0}, facedir)) - local pos2 = vector.add(pos, calc_dir({x = 1, y = 1, z = 0}, facedir)) - local _, nodes = minetest.find_nodes_in_area(pos1, pos2, {"air"}) - return nodes["air"] and nodes["air"] == 8 -end - -local function remove_nodes(pos, facedir) - remove_node(pos, {x = 0, y = 1, z = 0}, facedir, "techage:water_stop") - remove_node(pos, {x =-1, y = 0, z = 0}, facedir, "techage:water_stop") - remove_node(pos, {x = 1, y = 0, z = 0}, facedir, "techage:water_stop") - remove_node(pos, {x =-1, y = 1, z =-1}, facedir, "techage:water_stop") - remove_node(pos, {x = 1, y = 1, z =-1}, facedir, "techage:water_stop") - remove_node(pos, {x =-1, y = 1, z = 1}, facedir, "techage:water_stop") - remove_node(pos, {x = 1, y = 1, z = 1}, facedir, "techage:water_stop") -end - -local function start_wheel(pos, facedir, backward) - local obj = minetest.add_entity(pos, "techage:ta1_watermill_entity") - local dir = minetest.facedir_to_dir(facedir) - local yaw = minetest.dir_to_yaw(dir) - if backward then - obj:set_rotation({x=-math.pi/2, y=yaw, z=0}) - else - obj:set_rotation({x=math.pi/2, y=yaw, z=0}) - end - local self = obj:get_luaentity() - self.facedir = facedir - - add_node(pos, {x = 0, y = 1, z = 0}, facedir, "techage:water_stop") - add_node(pos, {x =-1, y = 0, z = 0}, facedir, "techage:water_stop") - add_node(pos, {x = 1, y = 0, z = 0}, facedir, "techage:water_stop") - add_node(pos, {x =-1, y = 1, z =-1}, facedir, "techage:water_stop") - add_node(pos, {x = 1, y = 1, z =-1}, facedir, "techage:water_stop") - add_node(pos, {x =-1, y = 1, z = 1}, facedir, "techage:water_stop") - add_node(pos, {x = 1, y = 1, z = 1}, facedir, "techage:water_stop") - minetest.remove_node(pos) -end - -local function stop_wheel(pos, self) - self.facedir = self.facedir or 0 - if self.facedir == 0 or self.facedir == 2 then - minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 4}) - M(pos):set_int("facedir", self.facedir) - minetest.get_node_timer(pos):start(2) - elseif self.facedir == 1 or self.facedir == 3 then - minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 13}) - M(pos):set_int("facedir", self.facedir) - minetest.get_node_timer(pos):start(2) - end - - remove_nodes(pos, self.facedir) - self.object:remove() -end - -local function trigger_consumer(pos, facedir) - local outdir = facedir + 1 - local resp = techage.transfer( - pos, - outdir, -- outdir - "trigger", -- topic - nil, -- payload - techage.TA1Axle, -- network - nil) -- valid nodes - if not resp then - outdir = tubelib2.Turn180Deg[outdir] - resp = techage.transfer( - pos, - outdir, -- outdir - "trigger", -- topic - nil, -- payload - techage.TA1Axle, -- network - nil) -- valid nodes - end -end - -minetest.register_node("techage:ta1_watermill", { - description = S("TA1 Watermill"), - tiles = { - -- up, down, right, left, back, front - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, - - {-4.5/2, -1/2, 0.8/2, 4.5/2, 1/2, 1.0/2}, - {-4.5/2, -1/2, -1.0/2, 4.5/2, 1/2, -0.8/2}, - {-3.8/2, -1/2, 2.1/2, 3.8/2, 1/2, 2.3/2}, - {-3.8/2, -1/2, -2.3/2, 3.8/2, 1/2, -2.1/2}, - - { 0.8/2, -1/2, -4.5/2, 1.0/2, 1/2, 4.5/2}, - {-1.0/2, -1/2, -4.5/2, -0.8/2, 1/2, 4.5/2}, - { 2.1/2, -1/2, -3.8/2, 2.3/2, 1/2, 3.8/2}, - {-2.3/2, -1/2, -3.8/2, -2.1/2, 1/2, 3.8/2}, - }, - }, - on_rightclick = function(pos, node, clicker) - start_wheel(pos, M(pos):get_int("facedir")) - end, - - on_timer = function(pos, elapsed) - local tRes = {} - if water_flowing(pos, M(pos):get_int("facedir"), tRes) then - start_wheel(pos, M(pos):get_int("facedir"), tRes.backward) - end - return true - end, - - paramtype2 = "facedir", - paramtype = "light", - use_texture_alpha = techage.CLIP, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 2, crumbly = 2, choppy = 2, not_in_creative_inventory = 1}, - node_placement_prediction = "", - drop = "techage:ta1_watermill_inv", -}) - --- A smaller one for the inventory -minetest.register_node("techage:ta1_watermill_inv", { - description = S("TA1 Watermill"), - --inventory_image = "techage_waterwheel_inv.png", - --wield_image = "techage_waterwheel_inv.png", - tiles = { - -- up, down, right, left, back, front - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - "default_wood.png", - }, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-1/4, -1/4, -1/4, 1/4, 1/4, 1/4}, - - {-4.5/4, 0.8/4, -1/4, 4.5/4, 1.0/4, 1/4}, - {-4.5/4, -1.0/4, -1/4, 4.5/4, -0.8/4, 1/4}, - {-3.8/4, 2.1/4, -1/4, 3.8/4, 2.3/4, 1/4}, - {-3.8/4, -2.3/4, -1/4, 3.8/4, -2.1/4, 1/4}, - - { 0.8/4, -4.5/4, -1/4, 1.0/4, 4.5/4, 1/4}, - {-1.0/4, -4.5/4, -1/4, -0.8/4, 4.5/4, 1/4}, - { 2.1/4, -3.8/4, -1/4, 2.3/4, 3.8/4, 1/4}, - {-2.3/4, -3.8/4, -1/4, -2.1/4, 3.8/4, 1/4}, - }, - }, - - after_place_node = function(pos, placer) - local node = minetest.get_node(pos) - M(pos):set_int("facedir", node.param2) - remove_nodes(pos, node.param2) - if (node.param2 == 0 or node.param2 == 2) and enough_space(pos, node.param2) then - minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 4}) - minetest.get_node_timer(pos):start(2) - elseif (node.param2 == 1 or node.param2 == 3) and enough_space(pos, node.param2) then - minetest.swap_node(pos, {name = "techage:ta1_watermill", param2 = 13}) - minetest.get_node_timer(pos):start(2) - else - minetest.remove_node(pos) - return true - end - end, - - paramtype2 = "facedir", - node_placement_prediction = "", - diggable = false, -}) - -techage.register_node({"techage:ta1_watermill"}, { - on_node_load = function(pos, node) - minetest.get_node_timer(pos):start(2) - end, -}) - - -minetest.register_entity("techage:ta1_watermill_entity", { - initial_properties = { - physical = true, - collisionbox = {-0.5, -1.5, -1.5, 0.5, 1.5, 1.5}, - visual = "wielditem", - wield_item = "techage:ta1_watermill", - visual_size = {x=0.67, y=0.67, z=0.67}, - static_save = true, - automatic_rotate = -math.pi * 0.2, - pointable = false, - }, - - on_step = function(self, dtime) - self.dtime = (self.dtime or 0) + dtime - - if self.dtime > 2 then - self.dtime = 0 - local pos = vector.round(self.object:get_pos()) - if not water_flowing(pos, self.facedir, {}) then - stop_wheel(pos, self) - end - trigger_consumer(pos, self.facedir) - minetest.sound_play("techage_watermill", {gain = 0.5, pos = pos, - max_hear_distance = 10}, true) - end - end, - - on_rightclick = function(self, clicker) - local pos = vector.round(self.object:get_pos()) - stop_wheel(pos, self) - end, - - on_activate = function(self, staticdata) - self.facedir = tonumber(staticdata) or 0 - end, - - get_staticdata = function(self) - return self.facedir - end, -}) - -minetest.register_node("techage:water_stop", { - description = "Water Stop", - drawtype = "glasslike_framed_optional", - tiles = {"blank.png"}, - inventory_image = 'techage_invisible_inv.png', - - use_texture_alpha = "blend", - paramtype = "light", - walkable = false, - pointable = false, - diggable = false, - buildable_to = true, - sunlight_propagates = true, - is_ground_content = false, - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - sounds = default.node_sound_glass_defaults(), - drop = "", -}) - -minetest.register_craft({ - output = "techage:ta1_watermill_inv", - recipe = { - {"techage:ta1_board1_apple", "techage:ta1_board1_apple", "techage:ta1_board1_apple"}, - {"techage:ta1_board1_apple", "default:wood", "techage:ta1_board1_apple"}, - {"techage:ta1_board1_apple", "techage:ta1_board1_apple", "techage:ta1_board1_apple"}, - }, -}) diff --git a/techage/ta2_energy_storage/ta2_clutch.lua b/techage/ta2_energy_storage/ta2_clutch.lua deleted file mode 100644 index 4438135..0000000 --- a/techage/ta2_energy_storage/ta2_clutch.lua +++ /dev/null @@ -1,128 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Axle clutch - -]]-- - --- for lazy programmers -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local DESCR = S("TA2 Clutch") - -local Axle = techage.Axle -local power = networks.power -local control = networks.control - --- Search for a gearbox, which is part of the axle network -local function get_gearbox_pos(pos) - local outdir = M(pos):get_int("outdir") - local pos1, dir1 = Axle:get_connected_node_pos(pos, outdir) - if pos1 then - local node = minetest.get_node(pos1) - --print("get_gearbox_pos", node.name) - if node.name == "techage:gearbox_on" or node.name == "techage:gearbox" then - return pos1 - end - end -end - --- Send to the winches -local function control_cmnd(pos, topic) - -- The clutch is not part of the axle network, - -- so we have to use a helper function to be able - -- to send a command into the network. - local pos1 = get_gearbox_pos(pos) - if pos1 then - control.send(pos1, Axle, 0, "sto", topic) - end -end - -local function switch_on(pos, node) - if node.name == "techage:ta2_clutch_off" then - control_cmnd(pos, "on") - node.name = "techage:ta2_clutch_on" - minetest.swap_node(pos, node) - Axle:after_place_tube(pos) - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5}) - end -end - -local function switch_off(pos, node) - if node.name == "techage:ta2_clutch_on" then - control_cmnd(pos, "off") - minetest.swap_node(pos, {name = "techage:ta2_clutch_off", param2 = M(pos):get_int("outdir") - 1}) - Axle:after_dig_tube(pos, node) - minetest.sound_play("techage_button", { - pos = pos, - gain = 0.5, - max_hear_distance = 5}) - end -end - -minetest.register_node("techage:ta2_clutch_off", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_appl_clutch.png^techage_appl_arrow3.png^techage_frame_ta2.png^[transformR90", - "techage_filling_ta2.png^techage_appl_clutch.png^techage_appl_arrow3.png^techage_frame_ta2.png^[transformR270", - "techage_filling_ta2.png^techage_appl_clutch.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_clutch.png^techage_frame_ta2.png^[transformR180", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_clutch_clutch.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_clutch_clutch.png", - }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "B")) - end, - on_rightclick = switch_on, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta2_clutch_on", { - description = DESCR, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_appl_clutch_on.png^techage_frame_ta2.png^[transformR90", - "techage_filling_ta2.png^techage_appl_clutch_on.png^techage_frame_ta2.png^[transformR270", - "techage_filling_ta2.png^techage_appl_clutch_on.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_clutch_on.png^techage_frame_ta2.png^[transformR180", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_clutch_clutch.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_clutch_clutch.png", - }, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Axle:after_dig_tube(pos, oldnode, oldmetadata) - end, - on_rightclick = switch_off, - paramtype2 = "facedir", - drop = "techage:ta2_clutch_off", - groups = {cracky=2, crumbly=2, choppy=2, not_in_creative_inventory=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta2_clutch_off", - recipe = { - {"default:junglewood", "techage:axle", "default:wood"}, - {"techage:axle", "basic_materials:gear_steel", "techage:axle"}, - {"default:wood", "techage:axle", "default:junglewood"}, - }, -}) diff --git a/techage/ta2_energy_storage/ta2_rope.lua b/techage/ta2_energy_storage/ta2_rope.lua deleted file mode 100644 index 492461e..0000000 --- a/techage/ta2_energy_storage/ta2_rope.lua +++ /dev/null @@ -1,85 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - Rope for TA2 gravity-based energy storage - -]]-- - -local Entities = {} - --- Return first pos after start pos and the destination pos -local function get_positions(pos, length, force) - local pos1 = {x = pos.x, y = pos.y - 1, z = pos.z} -- start pos - local pos2 = {x = pos.x, y = pos.y - 1 - length, z = pos.z} -- end pos - if force then - return pos1, pos2 -- force given length - end - local _, pos3 = minetest.line_of_sight(pos1, pos2) - return pos1, pos3 or pos2 -- new values -end - -local function del_rope(pos) - local key = minetest.hash_node_position(pos) - local rope = Entities[key] - if rope then - rope:remove() - Entities[key] = nil - end - return key -end - -local function add_rope(pos, pos1, pos2) - local key = del_rope(pos) - - pos1.y = pos1.y + 0.5 -- from - pos2.y = pos2.y - 0.5 -- to - local pos3 = {x = pos1.x, y = (pos1.y + pos2.y) / 2, z = pos1.z} -- mid-pos - local length = math.abs(pos1.y - pos2.y) - - local rope = minetest.add_entity(pos3, "techage:ta2_rope") - if rope then - rope:set_properties({visual_size = {x = 0.06, y = length}, collisionbox = {x = 0.06, y = length}}) - end - Entities[key] = rope -end - -minetest.register_entity("techage:ta2_rope", { - initial_properties = { - visual = "cube", - textures = { - "techage_rope.png", - "techage_rope.png", - "techage_rope.png", - "techage_rope.png", - "techage_rope.png", - "techage_rope.png", - }, - use_texture_alpha = false, - physical = true, - collide_with_objects = true, - pointable = true, - static_save = false, - visual_size = {x = 0.06, y = 10, z = 0.06}, - shaded = true, - }, -}) - -------------------------------------------------------------------------------- --- API functions -------------------------------------------------------------------------------- -function techage.renew_rope(pos, length, force) - local pos1, pos2 = get_positions(pos, length, force) - if pos1 then - add_rope(pos, pos1, pos2) - return pos1, pos2 - end -end - -techage.del_rope = del_rope diff --git a/techage/ta2_energy_storage/ta2_weight_chest.lua b/techage/ta2_energy_storage/ta2_weight_chest.lua deleted file mode 100644 index 16b97b0..0000000 --- a/techage/ta2_energy_storage/ta2_weight_chest.lua +++ /dev/null @@ -1,137 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - Chest for TA2 gravity-based energy storage - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local function valid_weight_items(stack) - local name = stack:get_name() - local ndef = minetest.registered_nodes[name] - if ndef then - if minetest.get_item_group(name, "stone") > 0 then - return true - end - if minetest.get_item_group(name, "cobble") > 0 then - return true - end - if minetest.get_item_group(name, "gravel") > 0 then - return true - end - if minetest.get_item_group(name, "sand") > 0 then - return true - end - end -end - -minetest.register_entity("techage:ta2_weight_chest_entity", { - initial_properties = { - physical = true, - pointable = false, - collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, - visual = "wielditem", - textures = {"techage:ta2_weight_chest"}, - visual_size = {x=0.66, y=0.66, z=0.66}, - static_save = false, - }, -}) - -local function allow_metadata_inventory_put(pos, listname, index, stack, player) - if minetest.is_protected(pos, player:get_player_name()) then - return 0 - end - if not valid_weight_items(stack) then - return 0 - end - return stack:get_count() -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 can_dig(pos, player) - if minetest.is_protected(pos, player:get_player_name()) then - return false - end - local inv = minetest.get_meta(pos):get_inventory() - return inv:is_empty("main") -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) -end - -local function formspec() - return "size[8,6.7]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "list[context;main;1.5,0.2;5,2;]".. - "list[current_player;main;0,3;8,4;]".. - "listring[context;main]".. - "listring[current_player;main]" -end - -minetest.register_node("techage:ta2_weight_chest", { - description = S("TA2 Weight Chest"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2.png^techage_weight_bottom.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_weight_bottom.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png^techage_weight_side.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png^techage_weight_side.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png^techage_weight_side.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_chest_back_ta3.png^techage_weight_side.png", - }, - - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size('main', 10) - end, - - after_place_node = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec()) - end, - - techage_set_numbers = function(pos, numbers, player_name) - return techage.logic.set_numbers(pos, numbers, player_name, S("TA2 Weight Chest")) - end, - - can_dig = can_dig, - after_dig_node = after_dig_node, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta2_weight_chest", - recipe = { - {"", "", ""}, - {"basic_materials:steel_strip", "techage:chest_ta2", "basic_materials:steel_strip"}, - {"", "", ""}, - }, -}) diff --git a/techage/ta2_energy_storage/ta2_winch.lua b/techage/ta2_energy_storage/ta2_winch.lua deleted file mode 100644 index b9fd848..0000000 --- a/techage/ta2_energy_storage/ta2_winch.lua +++ /dev/null @@ -1,225 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - Winch for TA2 gravity-based energy storage - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local MIN_LOAD = 99 -- 1 stack -local MAX_ROPE_LEN = 10 -local CYCLE_TIME = 2 - -local Axle = techage.Axle -local power = networks.power -local control = networks.control - - -local function chest_pos(pos) - local pos1 = {x = pos.x, y = pos.y - 1, z = pos.z} -- start pos - local pos2 = {x = pos.x, y = pos.y - 1 - MAX_ROPE_LEN, z = pos.z} -- end pos - local _, pos3 = minetest.line_of_sight(pos1, pos2) - return pos3 or pos2 -end - -local function chest_load(nvm, pos) - local amount = 0 - local inv = minetest.get_inventory({type = "node", pos = pos}) - nvm.stored_items = {} - for i = 1, inv:get_size("main") do - local stack = inv:get_stack("main", i) - nvm.stored_items[i] = {name = stack:get_name(), count = stack:get_count()} - amount = amount + stack:get_count() - end - return amount * 3 -end - -local function chest_full(pos) - local nvm = techage.get_nvm(pos) - local pos1 = chest_pos(pos) - local node = minetest.get_node(pos1) - if node.name == "techage:ta2_weight_chest" then - return chest_load(nvm, pos1) >= MIN_LOAD - end -end - -local function add_chest_entity(pos, nvm) - local mem = techage.get_mem(pos) - local length - - if not nvm.capa or nvm.capa == 0 then - length = (nvm.length or MAX_ROPE_LEN) * (1 - (nvm.load or 0)) - else - length = (nvm.length or MAX_ROPE_LEN) * (1 - (nvm.load or 0) / nvm.capa) - end - local y = pos.y - length - 1 - techage.renew_rope(pos, length, true) - if mem.obj then - mem.obj:remove() - end - mem.obj = minetest.add_entity({x = pos.x, y = y, z = pos.z}, "techage:ta2_weight_chest_entity") -end - --- Add chest node, remove chest entity instead -local function add_chest(pos) - local mem = techage.get_mem(pos) - local nvm = techage.get_nvm(pos) - if mem.obj then - mem.obj:remove() - mem.obj = nil - end - if nvm.capa and nvm.capa >= MIN_LOAD then - local pos1 = {x = pos.x, y = pos.y - (nvm.length or 1) - 1, z = pos.z} - minetest.add_node(pos1, {name = "techage:ta2_weight_chest", param2 = 0}) - local ndef = minetest.registered_nodes["techage:ta2_weight_chest"] - ndef.on_construct(pos1) - ndef.after_place_node(pos1) - local inv = minetest.get_inventory({type = "node", pos = pos1}) - for i, item in ipairs(nvm.stored_items or {}) do - inv:set_stack("main", i, item) - end - end - nvm.capa = 0 -end - --- Remove chest node, add rope and chest entity instead -local function remove_chest(pos) - local mem = techage.get_mem(pos) - local nvm = techage.get_nvm(pos) - local pos1 = chest_pos(pos) - local mass = chest_load(nvm, pos1) - if mass > 0 then - nvm.length = pos.y - pos1.y - 1 - nvm.capa = mass * nvm.length / MAX_ROPE_LEN - minetest.remove_node(pos1) - mem.obj = minetest.add_entity(pos1, "techage:ta2_weight_chest_entity") - techage.renew_rope(pos, nvm.length) - return true - end -end - -minetest.register_node("techage:ta2_winch", { - description = S("TA2 Winch"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_appl_arrow2.png^techage_frame_ta2.png^[transformR270", - "techage_filling_ta2.png^techage_appl_arrow2.png^techage_frame_ta2.png^techage_appl_winch_hole.png^[transformR270", - "techage_filling_ta2.png^techage_axle_gearbox.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_winch.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_winch.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_appl_winch.png^techage_frame_ta2.png", - }, - - after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - local outdir = networks.side_to_outdir(pos, "R") - M(pos):set_int("outdir", outdir) - Axle:after_place_node(pos, {outdir}) - minetest.get_node_timer(pos):start(CYCLE_TIME) - techage.renew_rope(pos, MAX_ROPE_LEN - 1) - end, - - on_timer = function(pos, elapsed) - local nvm = techage.get_nvm(pos) - local outdir = M(pos):get_int("outdir") - nvm.capa = nvm.capa or 1 - nvm.load = nvm.load or 0 - - if nvm.blocked then - -- Keep the network active - power.get_storage_load(pos, Axle, outdir, nvm.capa) - return true - end - if not nvm.running and power.power_available(pos, Axle, outdir) and chest_full(pos) then - remove_chest(pos) - nvm.running = true - power.start_storage_calc(pos, Axle, outdir) - elseif nvm.running and nvm.load < 2 and not power.power_available(pos, Axle, outdir) then - add_chest(pos) - nvm.running = false - power.start_storage_calc(pos, Axle, outdir) - end - - if nvm.running then - nvm.load = power.get_storage_load(pos, Axle, outdir, nvm.capa) or 0 - if nvm.load > 2 then - add_chest_entity(pos, nvm) - end - else - techage.renew_rope(pos, 50) - end - return true - end, - - after_dig_node = function(pos, oldnode, oldmetadata) - add_chest(pos) - techage.del_rope(pos) - local outdir = tonumber(oldmetadata.fields.outdir or 0) - power.start_storage_calc(pos, Axle, outdir) - Axle:after_dig_node(pos, {outdir}) - techage.del_mem(pos) - end, - - get_storage_data = function(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - nvm.capa = nvm.capa or 1 - if nvm.running and not nvm.blocked then - return {level = (nvm.load or 0) / nvm.capa, capa = nvm.capa} - end - end, - - paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:ta2_winch"}, Axle, "sto", {"R"}) - -techage.register_node({"techage:ta2_winch"}, { - on_node_load = function(pos, node) - minetest.get_node_timer(pos):start(CYCLE_TIME) - local nvm = techage.get_nvm(pos) - if nvm.running then - add_chest_entity(pos, nvm) - end - end, -}) - -control.register_nodes({"techage:ta2_winch"}, { - on_receive = function(pos, tlib2, topic, payload) - --print("on_receive", topic) - local nvm = techage.get_nvm(pos) - if topic == "on" then - nvm.blocked = false - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Axle, outdir) - elseif topic == "off" then - nvm.blocked = true - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Axle, outdir) - end - end, - } -) - -minetest.register_craft({ - output = "techage:ta2_winch", - recipe = { - {"farming:string", "farming:string", "farming:string"}, - {"farming:string", "techage:gearbox", "farming:string"}, - {"farming:string", "farming:string", "farming:string"}, - }, -}) diff --git a/techage/ta3_power/akkubox.lua b/techage/ta3_power/akkubox.lua deleted file mode 100644 index 120fee4..0000000 --- a/techage/ta3_power/akkubox.lua +++ /dev/null @@ -1,214 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Accu Box - -]]-- - --- for lazy programmers -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local CYCLE_TIME = 2 -local PWR_CAPA = 2000 - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control -local in_range = techage.in_range - - -local function formspec(self, pos, nvm) - local data - - if nvm.running then - local outdir = M(pos):get_int("outdir") - data = power.get_network_data(pos, Cable, outdir) - end - return techage.storage_formspec(self, pos, nvm, S("TA3 Accu Box"), data, nvm.capa, PWR_CAPA) -end - -local function start_node(pos, nvm, state) - nvm.running = true - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local function stop_node(pos, nvm, state) - nvm.running = false - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta3_akku", - cycle_time = CYCLE_TIME, - standby_ticks = 0, - formspec_func = formspec, - start_node = start_node, - stop_node = stop_node, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - if nvm.running then - local outdir = M(pos):get_int("outdir") - local capa = power.get_storage_load(pos, Cable, outdir, PWR_CAPA) or 0 - if capa > 0 then - nvm.capa = capa - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return true -end - -local function on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function get_storage_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if nvm.running then - return {level = (nvm.capa or 0) / PWR_CAPA, capa = PWR_CAPA} - end -end - -local function get_capa(itemstack) - local meta = itemstack:get_meta() - if meta then - return in_range(meta:get_int("capa") * (PWR_CAPA/100), 0, 3000) - end - return 0 -end - -local function set_capa(pos, oldnode, oldmetadata, drops) - local nvm = techage.get_nvm(pos) - local capa = nvm.capa - local meta = drops[1]:get_meta() - capa = techage.power.percent(PWR_CAPA, capa) - capa = (math.floor((capa or 0) / 5)) * 5 - meta:set_int("capa", capa) - local text = S("TA3 Accu Box").." ("..capa.." %)" - meta:set_string("description", text) -end - -local function after_place_node(pos, placer, itemstack) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local own_num = techage.add_node(pos, "techage:ta3_akku") - meta:set_string("owner", placer:get_player_name()) - meta:set_string("infotext", S("TA3 Accu Box").." "..own_num) - local outdir = networks.side_to_outdir(pos, "R") - meta:set_int("outdir", outdir) - meta:set_string("formspec", formspec(State, pos, nvm)) - Cable:after_place_node(pos, {outdir}) - State:node_init(pos, nvm, own_num) - nvm.capa = get_capa(itemstack) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - local outdir = tonumber(oldmetadata.fields.outdir or 0) - Cable:after_dig_node(pos, {outdir}) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -minetest.register_node("techage:ta3_akku", { - description = S("TA3 Accu Box"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_hole_electric.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_source.png", - }, - - on_timer = node_timer, - on_rightclick = on_rightclick, - on_receive_fields = on_receive_fields, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_storage_data = get_storage_data, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), - preserve_metadata = set_capa, -}) - -power.register_nodes({"techage:ta3_akku"}, Cable, "sto", {"R"}) - --- for logical communication -techage.register_node({"techage:ta3_akku"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "load" then - return techage.power.percent(PWR_CAPA, nvm.capa) - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 134 then -- load - return 0, {math.floor(techage.power.percent(PWR_CAPA, nvm.capa) + 0.5)} - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, -}) - -control.register_nodes({"techage:ta3_akku"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - return { - type = S("TA3 Accu Box"), - number = M(pos):get_string("node_number") or "", - running = nvm.running or false, - capa = PWR_CAPA , - load = nvm.capa or 0, - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta3_akku", - recipe = { - {"default:tin_ingot", "default:tin_ingot", "default:wood"}, - {"default:copper_ingot", "default:copper_ingot", "techage:electric_cableS"}, - {"techage:iron_ingot", "techage:iron_ingot", "default:wood"}, - }, -}) diff --git a/techage/ta3_power/axle2power.lua b/techage/ta3_power/axle2power.lua deleted file mode 100644 index 1f6ff63..0000000 --- a/techage/ta3_power/axle2power.lua +++ /dev/null @@ -1,202 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA2 Power Generator - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos - -local Cable = techage.ElectricCable -local Axle = techage.Axle -local power = networks.power -local control = networks.control - -local CYCLE_TIME = 2 -local PWR_PERF = 24 - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function node_timer_on(pos, elapsed) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local outdir = meta:get_int("outdir") - nvm.buffer = nvm.buffer or 0 - - local amount = math.min(PWR_PERF * 2 - nvm.buffer, PWR_PERF) - local taken = power.consume_power(pos, Axle, networks.Flip[outdir], amount) - nvm.buffer = nvm.buffer + taken - 1 -- some loss - - if nvm.buffer >= PWR_PERF then - nvm.provided = power.provide_power(pos, Cable, outdir, PWR_PERF, 0.8, 1.0) - nvm.load = power.get_storage_load(pos, Cable, outdir, PWR_PERF) - nvm.buffer = nvm.buffer - nvm.provided - end - if amount > 0 and taken == 0 then - swap_node(pos, "techage:ta2_generator_off") - local outdir = M(pos):get_int("outdir") - nvm.running = false - power.start_storage_calc(pos, Cable, outdir) - end - return true -end - -local function node_timer_off(pos, elapsed) - local nvm = techage.get_nvm(pos) - local outdir = M(pos):get_int("outdir") - - if power.power_available(pos, Axle, networks.Flip[outdir]) then - swap_node(pos, "techage:ta2_generator_on") - nvm.running = true - power.start_storage_calc(pos, Cable, outdir) - end - return true -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if nvm.running then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - - -minetest.register_node("techage:ta2_generator_off", { - description = S("TA2 Power Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2_top.png^techage_appl_arrow.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_hole_electric.png", - "techage_filling_ta2.png^techage_axle_clutch.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_generator_red.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_generator_red.png^[transformFX]", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - - after_place_node = function(pos) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Cable:after_place_node(pos) - Axle:after_place_node(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - M(pos):set_string("infotext", S("TA2 Power Generator")) - end, - - after_dig_node = function(pos, oldnode) - Cable:after_dig_node(pos) - Axle:after_dig_node(pos) - techage.del_mem(pos) - end, - - on_timer = node_timer_off, - get_generator_data = get_generator_data, -}) - -minetest.register_node("techage:ta2_generator_on", { - description = S("TA2 Power Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta2.png^techage_frame_ta2_top.png^techage_appl_arrow.png", - "techage_filling_ta2.png^techage_frame_ta2.png", - "techage_filling_ta2.png^techage_frame_ta2.png^techage_appl_hole_electric.png", - { - name = "techage_filling4_ta2.png^techage_axle_clutch4.png^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - { - name = "techage_filling4_ta2.png^techage_appl_generator_red4.png^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - { - name = "techage_filling4_ta2.png^techage_appl_generator_red4.png^[transformFX]^techage_frame4_ta2.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - }, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - is_ground_content = false, - drop = "", - groups = {not_in_creative_inventory=1}, - diggable = false, - - on_timer = node_timer_on, - get_generator_data = get_generator_data, -}) - -techage.register_node({"techage:ta2_generator_off", "techage:ta2_generator_on"}, { - on_node_load = function(pos, node) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -power.register_nodes({"techage:ta2_generator_off", "techage:ta2_generator_on"}, Axle, "con", {"L"}) -power.register_nodes({"techage:ta2_generator_off", "techage:ta2_generator_on"}, Cable, "gen", {"R"}) - -control.register_nodes({"techage:ta2_generator_off", "techage:ta2_generator_on"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA2 Power Generator"), - number = "---", - running = true, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = "80% - 100%", - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta2_generator_off", - recipe = { - {"basic_materials:steel_bar", "dye:red", "default:wood"}, - {'techage:axle', 'basic_materials:gear_steel', 'techage:electric_cableS'}, - {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/ta3_power/power2axle.lua b/techage/ta3_power/power2axle.lua deleted file mode 100644 index 82f2e6e..0000000 --- a/techage/ta3_power/power2axle.lua +++ /dev/null @@ -1,186 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Electric Motor - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos - -local Cable = techage.ElectricCable -local Axle = techage.Axle -local power = networks.power - -local CYCLE_TIME = 2 -local PWR_PERF = 40 - --- Axles texture animation -local function switch_axles(pos, on) - local outdir = M(pos):get_int("outdir") - Axle:switch_tube_line(pos, outdir, on and "on" or "off") -end - -local function swap_node(pos, name) - local node = techage.get_node_lvm(pos) - if node.name == name then - return - end - node.name = name - minetest.swap_node(pos, node) -end - -local function node_timer_on(pos, elapsed) - local nvm = techage.get_nvm(pos) - local outdir = M(pos):get_int("outdir") - nvm.buffer = nvm.buffer or 0 - - local amount = math.min(PWR_PERF * 2 - nvm.buffer, PWR_PERF) - local taken = power.consume_power(pos, Cable, networks.Flip[outdir], amount) - nvm.buffer = nvm.buffer + taken - 1 -- some loss - - if nvm.buffer >= PWR_PERF then - nvm.provided = power.provide_power(pos, Axle, outdir, PWR_PERF) - nvm.load = power.get_storage_load(pos, Axle, outdir, PWR_PERF) - nvm.buffer = nvm.buffer - nvm.provided - end - if amount > 0 and taken == 0 then - swap_node(pos, "techage:ta3_motor_off") - switch_axles(pos, false) - local outdir = M(pos):get_int("outdir") - nvm.running = false - power.start_storage_calc(pos, Cable, outdir) - end - return true -end - -local function node_timer_off(pos, elapsed) - local nvm = techage.get_nvm(pos) - local outdir = M(pos):get_int("outdir") - - if power.power_available(pos, Cable) then - swap_node(pos, "techage:ta3_motor_on") - switch_axles(pos, true) - nvm.running = true - power.start_storage_calc(pos, Cable, outdir) - end - return true -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if nvm.running then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - -minetest.register_node("techage:ta3_motor_off", { - description = S("TA3 Electric Motor"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_axle_clutch.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_appl_hole_electric.png^techage_frame_ta3.png", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator_red.png^[transformFX]", - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_generator_red.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - - after_place_node = function(pos) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Cable:after_place_node(pos) - Axle:after_place_node(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - M(pos):set_string("infotext", S("TA3 Electric Motor")) - end, - - after_dig_node = function(pos, oldnode) - Cable:after_dig_node(pos) - Axle:after_dig_node(pos) - techage.del_mem(pos) - end, - - on_timer = node_timer_off, - get_generator_data = get_generator_data, -}) - -minetest.register_node("techage:ta3_motor_on", { - description = S("TA3 Electric Motor"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png", - "techage_filling_ta3.png^techage_frame_ta3.png", - { - name = "techage_filling4_ta3.png^techage_axle_clutch4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.6, - }, - }, - "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_hole_electric.png", - { - name = "techage_filling4_ta3.png^techage_appl_generator_red4.png^[transformFX]^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - { - name = "techage_filling4_ta3.png^techage_appl_generator_red4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.3, - }, - }, - }, - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - is_ground_content = false, - drop = "", - groups = {not_in_creative_inventory=1}, - diggable = false, - - on_timer = node_timer_on, - get_generator_data = get_generator_data, -}) - -techage.register_node({"techage:ta3_motor_off", "techage:ta3_motor_on"}, { - on_node_load = function(pos, node) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -power.register_nodes({"techage:ta3_motor_off", "techage:ta3_motor_on"}, Axle, "gen", {"R"}) -power.register_nodes({"techage:ta3_motor_off", "techage:ta3_motor_on"}, Cable, "con", {"L"}) - -minetest.register_craft({ - output = "techage:ta3_motor_off", - recipe = { - {"basic_materials:steel_bar", "dye:red", "default:wood"}, - {'techage:electric_cableS', 'basic_materials:gear_steel', 'techage:axle'}, - {"default:wood", "techage:iron_ingot", "basic_materials:steel_bar"}, - }, -}) diff --git a/techage/ta3_power/tiny_generator.lua b/techage/ta3_power/tiny_generator.lua deleted file mode 100644 index 2a8ea35..0000000 --- a/techage/ta3_power/tiny_generator.lua +++ /dev/null @@ -1,400 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA3 Tiny Power Generator - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local firebox = techage.firebox -local fuel = techage.fuel -local Pipe = techage.LiquidPipe -local power = networks.power -local liquid = networks.liquid -local control = networks.control - -local CYCLE_TIME = 2 -local STANDBY_TICKS = 1 -local COUNTDOWN_TICKS = 2 -local PWR_PERF = 12 -local EFFICIENCY = 2.5 - -local function formspec(self, pos, nvm) - return "size[5,4]".. - default.gui_bg.. - default.gui_bg_img.. - default.gui_slots.. - "box[0,-0.1;4.8,0.5;#c6e8ff]".. - "label[0.2,-0.1;"..minetest.colorize( "#000000", S("Tiny Generator")).."]".. - fuel.fuel_container(0, 0.9, nvm).. - "image[1.4,1.6;1,1;techage_form_arrow_bg.png^[transformR270]".. - "image_button[1.4,3.2;1,1;".. self:get_state_button_image(nvm) ..";state_button;]".. - "tooltip[1.5,3;1,1;"..self:get_state_tooltip(nvm).."]".. - techage.formspec_power_bar(pos, 2.5, 0.8, S("Electricity"), nvm.provided, PWR_PERF) -end - -local function play_sound(pos) - local mem = techage.get_mem(pos) - if not mem.handle or mem.handle == -1 then - mem.handle = minetest.sound_play("techage_generator", { - pos = pos, - gain = 1, - max_hear_distance = 10, - loop = true}) - if mem.handle == -1 then - minetest.after(1, play_sound, pos) - end - end -end - -local function stop_sound(pos) - local mem = techage.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function has_fuel(pos, nvm) - return (nvm.burn_cycles or 0) > 0 or (nvm.liquid and nvm.liquid.amount and nvm.liquid.amount > 0) -end - -local function can_start(pos, nvm, state) - if has_fuel(pos, nvm) then - return true - end - return S("no fuel") -end - -local function start_node(pos, nvm, state) - local meta = M(pos) - nvm.provided = 0 - local outdir = meta:get_int("outdir") - play_sound(pos) - power.start_storage_calc(pos, Cable, outdir) - techage.evaluate_charge_termination(nvm, meta) -end - -local function stop_node(pos, nvm, state) - nvm.provided = 0 - local outdir = M(pos):get_int("outdir") - stop_sound(pos) - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:tiny_generator", - node_name_active = "techage:tiny_generator_on", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - infotext_name = S("TA3 Tiny Power Generator"), - can_start = can_start, - start_node = start_node, - stop_node = stop_node, -}) - -local function burning(pos, nvm) - local ratio = math.max((nvm.provided or PWR_PERF) / PWR_PERF, 0.02) - - nvm.liquid = nvm.liquid or {} - nvm.liquid.amount = nvm.liquid.amount or 0 - nvm.burn_cycles = (nvm.burn_cycles or 0) - ratio - if nvm.burn_cycles <= 0 then - if nvm.liquid.amount > 0 then - nvm.liquid.amount = nvm.liquid.amount - 1 - nvm.burn_cycles = fuel.burntime(nvm.liquid.name) * EFFICIENCY / CYCLE_TIME - nvm.burn_cycles_total = nvm.burn_cycles - else - nvm.liquid.name = nil - end - end -end - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local running = techage.is_running(nvm) - local fuel = has_fuel(pos, nvm) - if running and not fuel then - State:standby(pos, nvm, S("no fuel")) - stop_node(pos, nvm, State) - elseif not running and fuel then - State:start(pos, nvm) - -- start_node() is called implicit - elseif running then - local meta = M(pos) - local outdir = meta:get_int("outdir") - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Cable, outdir, PWR_PERF, tp1, tp2) - local val = power.get_storage_load(pos, Cable, outdir, PWR_PERF) - if val > 0 then - nvm.load = val - end - burning(pos, nvm) - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) -end - -local function on_rightclick(pos, node, clicker) - local nvm = techage.get_nvm(pos) - techage.set_activeformspec(pos, clicker) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - -minetest.register_node("techage:tiny_generator", { - description = S("TA3 Tiny Power Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_appl_electric_gen_top.png^techage_frame_ta3_top.png", - "techage_appl_electric_gen_top.png^techage_frame_ta3.png", - "techage_appl_electric_gen_side.png^techage_appl_hole_electric.png^techage_frame_ta3.png", - "techage_appl_electric_gen_side.png^techage_frame_ta3.png", - "techage_appl_electric_gen_front.png^[transformFX]^techage_frame_ta3.png", - "techage_appl_electric_gen_front.png^techage_frame_ta3.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - - after_place_node = function(pos, placer, itemstack) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:tiny_generator") - nvm.burn_cycles = 0 - if itemstack then - local stack_meta = itemstack:get_meta() - if stack_meta then - local liquid_name = stack_meta:get_string("liquid_name") - local liquid_amount = stack_meta:get_int("liquid_amount") - if liquid_name ~= "" and fuel.burntime(liquid.name) and - liquid_amount >= 0 and liquid_amount <= fuel.CAPACITY then - nvm.liquid = nvm.liquid or {} - nvm.liquid.name = liquid_name - nvm.liquid.amount = liquid_amount - end - end - end - State:node_init(pos, nvm, number) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - M(pos):set_int("outdir", networks.side_to_outdir(pos, "R")) - Pipe:after_place_node(pos) - Cable:after_place_node(pos) - end, - - after_dig_node = function(pos, oldnode) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - - preserve_metadata = function(pos, oldnode, oldmetadata, drops) - local nvm = techage.get_nvm(pos) - if nvm.liquid and nvm.liquid.name and nvm.liquid.amount > 0 then - -- generator tank is not empty - local meta = drops[1]:get_meta() - meta:set_string("liquid_name", nvm.liquid.name) - meta:set_int("liquid_amount", nvm.liquid.amount) - meta:set_string("description", S("TA3 Tiny Power Generator") .. " (fuel: " .. - tostring(nvm.liquid and nvm.liquid.amount or 0) .. "/" .. - tostring(fuel.CAPACITY) .. ")") - end - end, - - get_generator_data = get_generator_data, - ta3_formspec = techage.generator_settings("ta3", PWR_PERF), - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_punch = fuel.on_punch, - on_timer = node_timer, -}) - -minetest.register_node("techage:tiny_generator_on", { - description = S("TA3 Tiny Power Generator"), - tiles = { - -- up, down, right, left, back, front - "techage_appl_electric_gen_top.png^techage_frame_ta3_top.png", - "techage_appl_electric_gen_top.png^techage_frame_ta3.png", - "techage_appl_electric_gen_side.png^techage_appl_hole_electric.png^techage_frame_ta3.png", - "techage_appl_electric_gen_side.png^techage_frame_ta3.png", - { - name = "techage_appl_electric_gen_front4.png^[transformFX]^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.8, - }, - }, - { - name = "techage_appl_electric_gen_front4.png^techage_frame4_ta3.png", - backface_culling = false, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 32, - length = 0.8, - }, - }, - }, - - paramtype = "light", - paramtype2 = "facedir", - groups = {not_in_creative_inventory=1}, - diggable = false, - light_source = 4, - on_rotate = screwdriver.disallow, - is_ground_content = false, - - get_generator_data = get_generator_data, - ta3_formspec = techage.generator_settings("ta3", PWR_PERF), - on_receive_fields = on_receive_fields, - on_rightclick = on_rightclick, - on_punch = fuel.on_punch, - on_timer = node_timer, - can_dig = fuel.can_dig, -}) - -local liquid_def = { - fuel_cat = fuel.BT_GASOLINE, - capa = fuel.CAPACITY, - peek = function(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - if techage.fuel.valid_fuel(name, fuel.BT_GASOLINE) then - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, fuel.CAPACITY) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return leftover - end - return amount - end, - take = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local taken = liquid.srv_take(nvm, name, amount) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return taken - end, - untake = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - local leftover = liquid.srv_put(nvm, name, amount, fuel.CAPACITY) - if techage.is_activeformspec(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return leftover - end, -} - -power.register_nodes({"techage:tiny_generator", "techage:tiny_generator_on"}, Cable, "gen", {"R"}) -liquid.register_nodes({"techage:tiny_generator", "techage:tiny_generator_on"}, Pipe, "tank", nil, liquid_def) - -control.register_nodes({"techage:tiny_generator", "techage:tiny_generator_on"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA3 Tiny Power Generator"), - number = meta:get_string("node_number") or "", - running = techage.is_running(nvm) or false, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = meta:get_string("termpoint"), - } - end - return false - end, - } -) - -techage.register_node({"techage:tiny_generator", "techage:tiny_generator_on"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "delivered" then - return nvm.provided or 0 - elseif topic == "fuel" then - return techage.fuel.get_fuel_amount(nvm) - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 135 then - return 0, {nvm.provided or 0} - elseif topic == 132 then - return 0, {techage.fuel.get_fuel_amount(nvm)} - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, - on_node_load = function(pos, node) - State:on_node_load(pos) - if node.name == "techage:tiny_generator_on" then - play_sound(pos) - end - local inv = M(pos):get_inventory() - if not inv:is_empty("fuel") then - local nvm = techage.get_nvm(pos) - nvm.liquid = nvm.liquid or {} - local count = inv:get_stack("fuel", 1):get_count() - nvm.liquid.amount = (nvm.liquid.amount or 0) + count - nvm.liquid.name = "techage:gasoline" - inv:set_stack("fuel", 1, nil) - end - end, -}) - -minetest.register_craft({ - output = "techage:tiny_generator", - recipe = { - {'default:steel_ingot', 'techage:usmium_nuggets', 'default:steel_ingot'}, - {'dye:red', 'basic_materials:gear_steel', 'techage:electric_cableS'}, - {'default:steel_ingot', 'techage:vacuum_tube', 'default:steel_ingot'}, - }, -}) diff --git a/techage/ta4_power/electricmeter.lua b/techage/ta4_power/electricmeter.lua deleted file mode 100644 index 7951ff0..0000000 --- a/techage/ta4_power/electricmeter.lua +++ /dev/null @@ -1,255 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Electric Meter (to separate networks) - -]]-- - --- for lazy programmers -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local CYCLE_TIME = 2 -local PWR_PERF = 200 - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "200 ku,150 ku,100 ku,50 ku,20 ku", - name = "current", - label = S("Max. power"), - tooltip = S("Maximum power passed through"), - default = "100 ku", - values = {200, 150, 100, 50, 20} - }, - { - type = "number", - name = "countdown", - label = S("Power countdown"), - tooltip = S("Amount of power to be provided before the device turns off"), - default = "0", - }, -} - -local function max_current(pos) - local meta = M(pos) - if meta:contains("current") then - local current = meta:get_int("current") - return current > 0 and current or PWR_PERF - end - return PWR_PERF -end - -local function formspec(self, pos, nvm, power) - local units = (nvm.units or 0) / techage.CYCLES_PER_DAY - nvm.countdown = nvm.countdown or M(pos):get_int("countdown") - power = power or 0 - - return "size[5,4]" .. - "box[0,-0.1;4.8,0.5;#c6e8ff]" .. - techage.wrench_image(4.4, -0.08) .. - "label[0.2,-0.1;" .. minetest.colorize( "#000000", S("TA4 Electric Meter")).."]" .. - techage.formspec_power_bar(pos, 0.0, 0.7, S("Power"), power, max_current(pos)) .. - techage.formspec_meter(pos, 2.5, 0.7, S("Consumption"), units, "kud") .. - techage.formspec_meter(pos, 2.5, 1.7, S("Countdown"), nvm.countdown, "kud") .. - "image_button[3.2,3.0;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. - "tooltip[3.2,2.2;1,1;" .. self:get_state_tooltip(nvm) .. "]" -end - -local function start_node(pos, nvm, state) - local outdir = M(pos):get_int("outdir") - nvm.load = 0 - nvm.countdown = M(pos):get_int("countdown") - power.start_storage_calc(pos, Cable, outdir) - outdir = networks.Flip[outdir] - power.start_storage_calc(pos, Cable, outdir) -end - -local function stop_node(pos, nvm, state) - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) - outdir = networks.Flip[outdir] - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta4_electricmeter", - infotext_name = S("TA4 Electric Meter"), - cycle_time = CYCLE_TIME, - standby_ticks = 0, - formspec_func = formspec, - start_node = start_node, - stop_node = stop_node, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local data - if techage.is_running(nvm) then - local outdir2 = M(pos):get_int("outdir") - local outdir1 = networks.Flip[outdir2] - local current = max_current(pos) - data = power.transfer_simplex(pos, Cable, outdir1, Cable, outdir2, current) - if data then - nvm.countdown = nvm.countdown or M(pos):get_int("countdown") - nvm.load = (data.curr_load1 / data.max_capa1 + data.curr_load2 / data.max_capa2) / 2 * current - nvm.moved = data.moved - nvm.units = (nvm.units or 0) + data.moved - State:keep_running(pos, nvm) - if nvm.countdown > 0 then - nvm.countdown = nvm.countdown - (data.moved / techage.CYCLES_PER_DAY) - if nvm.countdown <= 0 then - State:stop(pos, nvm) - end - end - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm, nvm.moved)) - end - return true -end - -local function on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) -end - -local function after_place_node(pos, placer, itemstack) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local own_num = techage.add_node(pos, "techage:ta4_electricmeter") - meta:set_string("owner", placer:get_player_name()) - local outdir = networks.side_to_outdir(pos, "R") - meta:set_int("outdir", outdir) - Cable:after_place_node(pos, {outdir, networks.Flip[outdir]}) - State:node_init(pos, nvm, own_num) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - local outdir = tonumber(oldmetadata.fields.outdir or 0) - Cable:after_dig_node(pos, {outdir, networks.Flip[outdir]}) - techage.del_mem(pos) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - -- check for secondary/generator side - if outdir == M(pos):get_int("outdir") then - if techage.is_running(nvm) then - local current = max_current(pos) - return {level = (nvm.load or 0) / current, perf = current, capa = current * 2} - end - end -end - -minetest.register_node("techage:ta4_electricmeter", { - description = S("TA4 Electric Meter"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_arrow.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_meter.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_meter.png", - }, - - on_timer = node_timer, - on_rightclick = on_rightclick, - on_receive_fields = on_receive_fields, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - ta4_formspec = WRENCH_MENU, - get_generator_data = get_generator_data, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:ta4_electricmeter"}, Cable, "gen", {"R", "L"}) - --- for logical communication -techage.register_node({"techage:ta4_electricmeter"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "consumption" then - return math.floor((nvm.units or 0) / techage.CYCLES_PER_DAY) - elseif topic == "countdown" then - return math.floor((nvm.countdown or 0) + 0.5) - elseif topic == "current" then - return math.floor((nvm.moved or 0) + 0.5) - else - return State:on_receive_message(pos, topic, payload) - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 146 then - if payload[1] == 0 then -- Consumption - return 0, {math.floor((nvm.units or 0) / techage.CYCLES_PER_DAY)} - elseif payload[1] == 0 then -- countdown - return 0, {math.floor((nvm.countdown or 0) + 0.5)} - else -- current - return 0, {math.floor((nvm.moved or 0) + 0.5)} - end - else - return State:on_beduino_request_data(pos, topic, payload) - end - end, -}) - -control.register_nodes({"techage:ta4_electricmeter"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA4 Electric Meter"), - number = meta:get_string("node_number") or "", - running = techage.is_running(nvm) or false, - available = max_current(pos), - provided = nvm.moved or 0, - termpoint = "-", - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta4_electricmeter", - recipe = { - {"default:steel_ingot", "dye:blue", "default:steel_ingot"}, - {"techage:electric_cableS", "basic_materials:gold_wire", "techage:electric_cableS"}, - {"default:steel_ingot", "techage:ta4_wlanchip", "default:steel_ingot"}, - }, - replacements = { {"basic_materials:gold_wire", "basic_materials:empty_spool"}, }, -}) diff --git a/techage/ta4_power/laser.lua b/techage/ta4_power/laser.lua deleted file mode 100644 index f8acb13..0000000 --- a/techage/ta4_power/laser.lua +++ /dev/null @@ -1,168 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 Joachim Stolberg - - GPL v3 - See LICENSE.txt for more information - - TA4 Laser beam emitter and receiver - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Cable = techage.ElectricCable -local power = networks.power - -minetest.register_node("techage:ta4_laser_emitter", { - description = S("TA4 Laser Beam Emitter"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_laser.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_laser.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_laser_hole.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - }, - - after_place_node = function(pos, placer) - local tube_dir = networks.side_to_outdir(pos, "F") - Cable:prepare_pairing(pos, tube_dir, "") - Cable:after_place_node(pos, {tube_dir}) - local number = techage.add_node(pos, "techage:ta4_laser_emitter") - M(pos):set_string("node_number", number) - local res, pos1, pos2 = techage.renew_laser(pos, true) - if pos1 then - local node = techage.get_node_lvm(pos2) - if node.name == "techage:ta4_laser_receiver" then - Cable:pairing(pos2, "laser") - Cable:pairing(pos, "laser") - else - minetest.chat_send_player(placer:get_player_name(), - S("Valid destination positions:") .. " " .. - P2S(pos1) .. " " .. S("to") .. " " .. P2S(pos2)) - end - else - minetest.chat_send_player(placer:get_player_name(), S("Laser beam error!")) - end - minetest.get_node_timer(pos):start(2) - end, - - on_timer = function(pos, elapsed) - local nvm = techage.get_nvm(pos) - local res, pos1, pos2 = techage.renew_laser(pos) - if pos1 then - local node = techage.get_node_lvm(pos2) - if node.name == "techage:ta4_laser_receiver" then - Cable:pairing(pos2, "laser") - Cable:pairing(pos, "laser") - nvm.running = true - else - local metadata = M(pos):to_table() - Cable:stop_pairing(pos, metadata, "") - local tube_dir = tonumber(metadata.fields.tube_dir or 0) - Cable:after_dig_node(pos, {tube_dir}) - nvm.running = false - end - elseif not res then - techage.del_laser(pos) - local metadata = M(pos):to_table() - Cable:stop_pairing(pos, metadata, "") - local tube_dir = tonumber(metadata.fields.tube_dir or 0) - Cable:after_dig_node(pos, {tube_dir}) - nvm.running = false - end - return true - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.del_laser(pos) - Cable:stop_pairing(pos, oldmetadata, "") - local tube_dir = tonumber(oldmetadata.fields.tube_dir or 0) - Cable:after_dig_node(pos, {tube_dir}) - end, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_node("techage:ta4_laser_receiver", { - description = S("TA4 Laser Beam Receiver"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_laser.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_laser.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_laser_hole.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - }, - - after_place_node = function(pos, placer) - local tube_dir = networks.side_to_outdir(pos, "F") - Cable:prepare_pairing(pos, tube_dir, "") - Cable:after_place_node(pos, {tube_dir}) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - Cable:stop_pairing(pos, oldmetadata, "") - local tube_dir = tonumber(oldmetadata.fields.tube_dir or 0) - Cable:after_dig_node(pos, {tube_dir}) - end, - - paramtype2 = "facedir", - on_rotate = screwdriver.disallow, - groups = {choppy=2, cracky=2, crumbly=2}, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -techage.register_node({"techage:ta4_laser_emitter"}, { - on_recv_message = function(pos, src, topic, payload) - if topic == "state" then - local nvm = techage.get_nvm(pos) - return nvm.running and "running" or "stopped" - else - return "unsupported" - end - end, - on_beduino_request_data = function(pos, src, topic, payload) - if topic == 142 then -- Binary State - local nvm = techage.get_nvm(pos) - return 0, {nvm.running and 1 or 0} - else - return 2, "" - end - end, -}) - -power.register_nodes({"techage:ta4_laser_emitter", "techage:ta4_laser_receiver"}, Cable, "special", {"F"}) - -minetest.register_craft({ - output = "techage:ta4_laser_emitter", - recipe = { - {"techage:ta4_carbon_fiber", "dye:blue", "techage:ta4_carbon_fiber"}, - {"techage:electric_cableS", "basic_materials:energy_crystal_simple", "techage:ta4_leds"}, - {"default:steel_ingot", "techage:ta4_wlanchip", "default:steel_ingot"}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_laser_receiver", - recipe = { - {"techage:ta4_carbon_fiber", "dye:blue", "techage:ta4_carbon_fiber"}, - {"techage:electric_cableS", "basic_materials:gold_wire", "default:obsidian_glass"}, - {"default:steel_ingot", "techage:ta4_wlanchip", "default:steel_ingot"}, - }, -}) diff --git a/techage/ta4_power/transformer.lua b/techage/ta4_power/transformer.lua deleted file mode 100644 index 82d86bc..0000000 --- a/techage/ta4_power/transformer.lua +++ /dev/null @@ -1,211 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2023 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Isolation Transformer (to separate networks) - -]]-- - --- for lazy programmers -local P2S = minetest.pos_to_string -local M = minetest.get_meta -local S = techage.S - -local CYCLE_TIME = 2 -local PWR_PERF = 100 - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local WRENCH_MENU = { - { - type = "dropdown", - choices = "300 ku,200 ku,150 ku,100 ku,50 ku,20 ku", - name = "current", - label = S("Max. power"), - tooltip = S("Maximum power passed through"), - default = "100 ku", - values = {300, 200, 150, 100, 50, 20} - }, -} - -local function max_current(pos) - local meta = M(pos) - if meta:contains("current") then - local current = meta:get_int("current") - return current > 0 and current or PWR_PERF - end - return PWR_PERF -end - -local function formspec(self, pos, nvm, data) - data = data or {curr_load1 = 0, curr_load2 = 0, max_capa1 = 0, max_capa2 = 0, moved = 0} - return "size[7.5,5.2]".. - "box[0,-0.1;7.3,0.5;#c6e8ff]".. - techage.wrench_image(6.9, -0.08) .. - "label[0.2,-0.1;"..minetest.colorize( "#000000", S("TA4 Isolation Transformer")).."]".. - techage.formspec_storage_bar(pos, 0.0, 0.7, S("Storage"), data.curr_load1, data.max_capa1).. - techage.formspec_power_bar(pos, 2.5, 0.7, S("Power"), data.moved, max_current(pos)).. - techage.formspec_storage_bar(pos, 5.0, 0.7, S("Storage"), data.curr_load2, data.max_capa2).. - "image_button[3.3,4.3;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. - "tooltip[3.3,4.3;1,1;" .. self:get_state_tooltip(nvm) .. "]" -end - -local function start_node(pos, nvm, state) - local outdir = M(pos):get_int("outdir") - nvm.load = 0 - power.start_storage_calc(pos, Cable, outdir) - outdir = networks.Flip[outdir] - power.start_storage_calc(pos, Cable, outdir) -end - -local function stop_node(pos, nvm, state) - local outdir = M(pos):get_int("outdir") - power.start_storage_calc(pos, Cable, outdir) - outdir = networks.Flip[outdir] - power.start_storage_calc(pos, Cable, outdir) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta4_transformer", - infotext_name = S("TA4 Isolation Transformer"), - cycle_time = CYCLE_TIME, - standby_ticks = 0, - formspec_func = formspec, - start_node = start_node, - stop_node = stop_node, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local data - if techage.is_running(nvm) then - local outdir2 = M(pos):get_int("outdir") - local outdir1 = networks.Flip[outdir2] - local current = max_current(pos) - data = power.transfer_duplex(pos, Cable, outdir1, Cable, outdir2, current) - if data then - nvm.load = (data.curr_load1 / data.max_capa1 + data.curr_load2 / data.max_capa2) / 2 * current - nvm.moved = data.moved - end - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm, data)) - end - return true -end - -local function on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) -end - -local function after_place_node(pos, placer, itemstack) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local own_num = techage.add_node(pos, "techage:ta4_transformer") - meta:set_string("owner", placer:get_player_name()) - local outdir = networks.side_to_outdir(pos, "R") - meta:set_int("outdir", outdir) - Cable:after_place_node(pos, {outdir, networks.Flip[outdir]}) - State:node_init(pos, nvm, own_num) -end - -local function after_dig_node(pos, oldnode, oldmetadata, digger) - local outdir = tonumber(oldmetadata.fields.outdir or 0) - Cable:after_dig_node(pos, {outdir, networks.Flip[outdir]}) - techage.del_mem(pos) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - local current = max_current(pos) - return {level = (nvm.load or 0) / current, perf = current, capa = current * 2} - end -end - -minetest.register_node("techage:ta4_transformer", { - description = S("TA4 Isolation Transformer"), - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta4_top.png^techage_appl_trafo.png", - "techage_filling_ta4.png^techage_frame_ta4.png", - "techage_trafo.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_trafo.png^techage_frame_ta4.png^techage_appl_hole_electric.png", - "techage_trafo.png^techage_frame_ta4.png", - "techage_trafo.png^techage_frame_ta4.png", - }, - - on_timer = node_timer, - on_rightclick = on_rightclick, - on_receive_fields = on_receive_fields, - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_generator_data = get_generator_data, - ta4_formspec = WRENCH_MENU, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_wood_defaults(), -}) - -power.register_nodes({"techage:ta4_transformer"}, Cable, "gen", {"R", "L"}) - --- for logical communication -techage.register_node({"techage:ta4_transformer"}, { - on_recv_message = function(pos, src, topic, payload) - return State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return State:on_beduino_request_data(pos, topic, payload) - end, -}) - -control.register_nodes({"techage:ta4_transformer"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA4 Isolation Transformer"), - number = meta:get_string("node_number") or "", - running = techage.is_running(nvm) or false, - available = max_current(pos), - provided = nvm.moved or 0, - termpoint = "-", - } - end - return false - end, - } -) - -minetest.register_craft({ - output = "techage:ta4_transformer", - recipe = { - {"default:steel_ingot", "dye:blue", "default:steel_ingot"}, - {"techage:electric_cableS", "basic_materials:copper_wire", "techage:electric_cableS"}, - {"default:steel_ingot", "techage:ta4_wlanchip", "default:steel_ingot"}, - }, -}) diff --git a/techage/teleport/teleport_pipe.lua b/techage/teleport/teleport_pipe.lua deleted file mode 100644 index 84d19e0..0000000 --- a/techage/teleport/teleport_pipe.lua +++ /dev/null @@ -1,198 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 teleport pipe - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Pipe = techage.LiquidPipe -local teleport = techage.teleport -local Cable = techage.ElectricCable -local power = networks.power -local liquid = networks.liquid - -local STANDBY_TICKS = 4 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 2 -local PWR_NEEDED = 12 -local EX_POINTS = 30 -local MAX_DIST = 500 -local DESCRIPTION = S("TA5 Teleport Block Liquids") - -local function formspec(self, pos, nvm) - local title = DESCRIPTION .. " " .. M(pos):get_string("tele_status") - return "size[8,2]".. - "box[0,-0.1;7.8,0.5;#c6e8ff]" .. - "label[0.5,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. - "image_button[3.5,1;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. - "tooltip[3.5,1;1,1;" .. self:get_state_tooltip(nvm) .. "]" -end - -local function can_start(pos, nvm, state) - return teleport.is_connected(pos) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta5_tele_pipe", - infotext_name = DESCRIPTION, - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - countdown_ticks = COUNTDOWN_TICKS, - formspec_func = formspec, - can_start = can_start, -}) - -local function consume_power(pos, nvm) - if techage.needs_power(nvm) then - local taken = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if techage.is_running(nvm) then - if taken < PWR_NEEDED then - State:nopower(pos, nvm) - else - return true -- keep running - end - elseif taken == PWR_NEEDED then - State:start(pos, nvm) - end - end -end - -minetest.register_node("techage:ta5_tele_pipe", { - description = DESCRIPTION, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_tele_pipe.png", - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_pipe.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local node = minetest.get_node(pos) - local pipe_dir = techage.side_to_outdir("L", node.param2) - local number = techage.add_node(pos, "techage:ta5_tele_pipe") - State:node_init(pos, nvm, number) - meta:set_int("pipe_dir", pipe_dir) - meta:set_string("owner", placer:get_player_name()) - Pipe:after_place_node(pos, {pipe_dir}) - Cable:after_place_node(pos) - teleport.prepare_pairing(pos, "ta5_tele_pipe") - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - if teleport.is_connected(pos) then - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - else - teleport.after_formspec(pos, player, fields, MAX_DIST, EX_POINTS) - end - end, - - on_rightclick = function(pos, clicker, listname) - if teleport.is_connected(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - else - M(pos):set_string("formspec", teleport.formspec(pos)) - end - end, - - on_timer = function(pos, elapsed) - local nvm = techage.get_nvm(pos) - consume_power(pos, nvm) - -- the state has to be triggered by on_push_item - State:idle(pos, nvm) - return State:is_active(nvm) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - teleport.stop_pairing(pos, oldmetadata) - Pipe:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - is_ground_content = false, - groups = {choppy=2, cracky=2, crumbly=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta5_tele_pipe", - recipe = { - {"techage:aluminum", "dye:red", "techage:aluminum"}, - {"techage:ta3_pipeS", "techage:usmium_nuggets", "techage:ta5_aichip"}, - {"techage:ta4_carbon_fiber", "", "techage:ta4_carbon_fiber"}, - }, -}) - -local blocked = false -- flag to prevent stack overruns (not to pump into the own "tank") -liquid.register_nodes({"techage:ta5_tele_pipe"}, Pipe, "tank", {"L"}, { - peek = function(pos) - local nvm = techage.get_nvm(pos) - return liquid.srv_peek(nvm) - end, - put = function(pos, indir, name, amount) - local nvm = techage.get_nvm(pos) - nvm.oil_amount = nvm.oil_amount or 0 - if not blocked and techage.is_operational(nvm) then - local rmt_pos = teleport.get_remote_pos(pos) - if rmt_pos then - local rmt_nvm = techage.get_nvm(rmt_pos) - if techage.is_operational(rmt_nvm) then - local pipe_dir = M(rmt_pos):get_int("pipe_dir") - blocked = true - local leftover = liquid.put(rmt_pos, Pipe, pipe_dir, name, amount) - blocked = false - if leftover < amount then - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - State:keep_running(rmt_pos, rmt_nvm, COUNTDOWN_TICKS) - end - return leftover - else - State:blocked(pos, nvm, S("Remote block error")) - end - end - end - return amount - end -}) - -techage.register_node({"techage:ta5_tele_pipe"}, { - on_recv_message = function(pos, src, topic, payload) - return State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return State:on_beduino_request_data(pos, topic, payload) - end, -}) - -power.register_nodes({"techage:ta5_tele_pipe"}, Cable, "con", {"B", "R", "F", "D", "U"}) -Pipe:set_valid_sides("techage:ta5_tele_pipe", {"L"}) diff --git a/techage/teleport/teleport_tube.lua b/techage/teleport/teleport_tube.lua deleted file mode 100644 index 4755c02..0000000 --- a/techage/teleport/teleport_tube.lua +++ /dev/null @@ -1,190 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2017-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA5 teleport tube - -]]-- - --- for lazy programmers -local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local S2P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local Tube = techage.Tube -local teleport = techage.teleport -local Cable = techage.ElectricCable -local power = networks.power - -local STANDBY_TICKS = 4 -local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 2 -local PWR_NEEDED = 12 -local EX_POINTS = 30 -local MAX_DIST = 500 -local DESCRIPTION = S("TA5 Teleport Block Items") - -local function formspec(self, pos, nvm) - local title = DESCRIPTION .. " " .. M(pos):get_string("tele_status") - return "size[8,2]".. - "box[0,-0.1;7.8,0.5;#c6e8ff]" .. - "label[0.5,-0.1;" .. minetest.colorize( "#000000", title) .. "]" .. - "image_button[3.5,1;1,1;" .. self:get_state_button_image(nvm) .. ";state_button;]" .. - "tooltip[3.5,1;1,1;" .. self:get_state_tooltip(nvm) .. "]" -end - -local function can_start(pos, nvm, state) - return teleport.is_connected(pos) -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta5_tele_tube", - infotext_name = DESCRIPTION, - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - countdown_ticks = COUNTDOWN_TICKS, - formspec_func = formspec, - can_start = can_start, -}) - -local function consume_power(pos, nvm) - if techage.needs_power(nvm) then - local taken = power.consume_power(pos, Cable, nil, PWR_NEEDED) - if techage.is_running(nvm) then - if taken < PWR_NEEDED then - State:nopower(pos, nvm) - else - return true -- keep running - end - elseif taken == PWR_NEEDED then - State:start(pos, nvm) - end - end -end - -minetest.register_node("techage:ta5_tele_tube", { - description = DESCRIPTION, - tiles = { - -- up, down, right, left, back, front - "techage_filling_ta4.png^techage_frame_ta5_top.png^techage_appl_tele_tube.png", - "techage_filling_ta4.png^techage_frame_ta5_top.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_hole_tube.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", - "techage_filling_ta4.png^techage_frame_ta5.png^techage_appl_teleport.png", - }, - - after_place_node = function(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local node = minetest.get_node(pos) - local tube_dir = techage.side_to_outdir("L", node.param2) - local number = techage.add_node(pos, "techage:ta5_tele_tube") - State:node_init(pos, nvm, number) - meta:set_int("tube_dir", tube_dir) - meta:set_string("owner", placer:get_player_name()) - Tube:after_place_node(pos, {tube_dir}) - Cable:after_place_node(pos) - teleport.prepare_pairing(pos, "ta5_tele_tube") - end, - - on_receive_fields = function(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - if teleport.is_connected(pos) then - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - else - teleport.after_formspec(pos, player, fields, MAX_DIST, EX_POINTS) - end - end, - - on_rightclick = function(pos, clicker, listname) - if teleport.is_connected(pos) then - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - else - M(pos):set_string("formspec", teleport.formspec(pos)) - end - end, - - on_timer = function(pos, elapsed) - local nvm = techage.get_nvm(pos) - consume_power(pos, nvm) - -- the state has to be triggered by on_push_item - State:idle(pos, nvm) - return State:is_active(nvm) - end, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - techage.remove_node(pos, oldnode, oldmetadata) - teleport.stop_pairing(pos, oldmetadata) - Tube:after_dig_node(pos) - Cable:after_dig_node(pos) - techage.del_mem(pos) - end, - - paramtype2 = "facedir", -- important! - on_rotate = screwdriver.disallow, -- important! - is_ground_content = false, - groups = {choppy=2, cracky=2, crumbly=2}, - sounds = default.node_sound_wood_defaults(), -}) - -minetest.register_craft({ - output = "techage:ta5_tele_tube", - recipe = { - {"techage:aluminum", "dye:red", "techage:aluminum"}, - {"techage:ta4_tubeS", "techage:usmium_nuggets", "techage:ta5_aichip"}, - {"techage:ta4_carbon_fiber", "", "techage:ta4_carbon_fiber"}, - }, -}) - -techage.register_node({"techage:ta5_tele_tube"}, { - on_push_item = function(pos, in_dir, stack) - local nvm = techage.get_nvm(pos) - if techage.is_operational(nvm) then - local rmt_pos = teleport.get_remote_pos(pos) - if rmt_pos then - local rmt_nvm = techage.get_nvm(rmt_pos) - if techage.is_operational(rmt_nvm) then - local tube_dir = M(rmt_pos):get_int("tube_dir") - local leftover = techage.push_items(rmt_pos, tube_dir, stack) - -- Moved any items - if leftover then - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - State:keep_running(rmt_pos, rmt_nvm, COUNTDOWN_TICKS) - return leftover - end - return leftover - else - State:blocked(pos, nvm, S("Remote block error")) - end - end - end - return false - end, - is_pusher = true, -- is a pulling/pushing node - - on_recv_message = function(pos, src, topic, payload) - return State:on_receive_message(pos, topic, payload) - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - return State:on_beduino_receive_cmnd(pos, topic, payload) - end, - on_beduino_request_data = function(pos, src, topic, payload) - return State:on_beduino_request_data(pos, topic, payload) - end, -}) - -power.register_nodes({"techage:ta5_tele_tube"}, Cable, "con", {"B", "R", "F", "D", "U"}) -Tube:set_valid_sides("techage:ta5_tele_tube", {"L"}) diff --git a/techage/textures/generate.py b/techage/textures/generate.py deleted file mode 100755 index 7103ade..0000000 --- a/techage/textures/generate.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# Script to generate the palette PNG file. -# -# Copyright (C) 2022 Joachim Stolberg -# LGPLv2.1+ - -from PIL import Image - -MainColors = [ - 0x000080, 0x008000, 0x800000, 0x008080, 0x808000, 0x800080, - 0x0000FF, 0x00FF00, 0xFF0000, 0x00FFFF, 0xFFFF00, 0xFF00FF, - 0x0080FF, 0x8000FF, 0x80FF00, 0x00FF80, 0xFF8000, 0xFF0080, -] - -def generate(): - img = Image.new("RGB", (18, 15), color='#000000') - - # Main colors - for x in range(0,18): - img.putpixel((x, 0), MainColors[x]) - - # Grey scale - for x in range(0,18): - img.putpixel((x, 1), (x * 15, x * 15, x * 15)) - - # 216 colors palette - idx = 36 - for r in range(0,6): - for g in range(0,6): - for b in range(0,6): - x = idx % 18 - y = int(idx / 18) - img.putpixel((x, y), (r * 0x33, g * 0x33, b * 0x33)) - idx += 1 - - img.save("techage_palette256.png", "PNG") - -generate() diff --git a/techage/textures/techage_aichip.png b/techage/textures/techage_aichip.png deleted file mode 100644 index 85403ae14780d69f07d6c0347e067dd88de95cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-uI>dsKxSM-#HV-nbnGVl z267lng8YIR9G=}s19CQbx;TbdoIX1FEazbZ9ye#P7ansLaa4WO_-3@Xq*Kny`P+-5 z+qG6b`QfhS7d*>>#q7nw?*eA8cE!G`wX==?_>1>Td1&9k6$ck{=1q?YXWYxSjx}v! z>4w=NH5RT}1x)K$osI-``W&cZJm{FVV(E$o7lp7G@vVmPe9^}`}(l9<3!8}aH@=C&`sZ}$q{p194SUgzPrUksmxnsnk7 SwpIdN&*16m=d#Wzp$P!ro@j{x diff --git a/techage/textures/techage_aluminum_inv.png b/techage/textures/techage_aluminum_inv.png deleted file mode 100644 index 26f5e620ab1cecfb2ddff9ba152915d158ce7daf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1226 zcmV;*1U37KP)Px#7*I@9MT(D=SzTWO0s@wsqj-OaZE|;|sjV+GHAL^0 zqyPW}P)S5VR7l5tRJ)SfI1ro@AF*Y7eW?U5wJ9wUa7v3LE`^E5rP#&8@v6%Ie*=*6 zK7xa)R4R3&rw5n@#CW!m$H?*9`ltA20j?OI?21O-`ll1ymb0*~H-tW(Ubem^uor@b zH|vGq65$N**G4G*pD?0A;cd~ow*;;AO`*#K|B6uQyfVR!H^NpTg9<;hx+yqb^tNE# zIqR;ddQsrkBEc2BIOBga?p#s)l?binwp|I`4*$(iR#_F!NT_{W6)t)6yzbUN_Io5O z;9dx1^{&;={ko8F{ScAhiV_LX;MN+(H=(zB}&UEr`F!F|H1Qaql29A2@hywCyf8!p98e$yh!EJf(BS%j}M~t=rs0#^5+W-H|#G zVE6Yk`LmTd=aPZ~uux}(b3(Vxj765d8K3}w-}TlJ@~oVZsF3%vL`u_Hqrgz&)`#DN z;Qha5@q6` zmtrG#<@72#MO#nkviNl@=IE}F=uL#Z;tslU4iNJbnlu<{?t7J_qnHbTS?4|FNOEq>c z1V7r;X5kwaqGY4tG#Z@KTlQcoSczS*;bc;cDU5+vF&wsNY8aSL0*Mff7rydXgQYgA zl#CgM)&mf^9OMqE|c)1zLpZ$|sPO|+6GNn}@=kH##Hx^T;qeraP=3QM7?W5d9VTs3K67v;!H0Am z-@h7*XIz?|PS&IdW}Lu0`3WnGI}%)FL$B~KYvCK66G}cM!r-AQuEb#%QOrEm*fL5! z0NmF}VETshZqUBy%}B?v`-8*9qlt1@kbqsdfEU&(x2*N^d6OXw_S$YAp-2>g@cf0W>%`I%f(oHR0@t((m8|F$q5Hc)16|)4 z^uUE#I+PGbpwEBF!|`qo)Qk(h0WNi62D4~tk_7tvPL7Xs=8}*4yuETdlutpTMDp1c z*Q5EQj8vY=lgm#4*1q6=6Xah(==Q3=$j=H*e3Q%i22@6*F0cqnfIRBE$3C0T=Tp8- zG`BP+7lEiNoTMPpgppdV`4cMa4%+<{907*qoM6N<$f?DNHN&o-= diff --git a/techage/textures/techage_appl_arrow.png b/techage/textures/techage_appl_arrow.png deleted file mode 100644 index 56bf16b2b40c99b1afc0030e9f7642522fb4efa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NfXw+?ErCFau_VYZ zn8D%MjWi%f$bP0l+XkKBNH7I diff --git a/techage/textures/techage_appl_arrow2.png b/techage/textures/techage_appl_arrow2.png deleted file mode 100644 index e86ad35de6cbaac5e4a0c255d4df0ac13ca393a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NfXw+?ErCFau_VYZ zn8D%MjWi%f#?!?ygyVX0f&+68uS3&Mh6xGv3@ShD4R|yd7?$}nYnv>b76(+v;OXk; Jvd$@?2>_7_8|eT5 diff --git a/techage/textures/techage_appl_arrow3.png b/techage/textures/techage_appl_arrow3.png deleted file mode 100644 index e34eaf617d3fe3e47899b33960b6ea5c638eeba6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(N?#RlvU-mcv6k#k0 z@(X5gcy=QV$dT}LaSY+Oo}93NsenO{Q(+NX$=eZG6WfO{nTDOsTQb#!PC{xWt~$(69BtkDfa*X diff --git a/techage/textures/techage_appl_arrow_white.png b/techage/textures/techage_appl_arrow_white.png deleted file mode 100644 index 17a299d590d8709893fb6de764c4bd1a3d8d6a34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=ET|Nnpflts=U>5?G7U zkyn?amjjdM0YeW~j|YMUg*=6fLWd7t2y{@W^;o9r=glnS!PI-%sDVYUvG16qtV5E8 zgcTRZ68^+w=j3FCMwNh!96pr~98<(+O=s?WnD9bFVr@KImdKI;Vst02eq#NB{r; diff --git a/techage/textures/techage_appl_blackhole.png b/techage/textures/techage_appl_blackhole.png deleted file mode 100644 index 54137e669c792e1d9c41dd4822c5e4685fc53365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=BWne(+;0zuLxL4Lsu4$p3+0XagRE{-7_*OLL(F@xROhVn73rb+h(c>qr8v09xtl=d#Wzp$Pz8H6{)K diff --git a/techage/textures/techage_appl_cartdetector.png b/techage/textures/techage_appl_cartdetector.png deleted file mode 100644 index c0e92f632d8f780cbf460229938259890b33bdb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc&`E>1n&T_M(L-$5!$g8YIR9G=}s19CJyT^vIsE+;1}uu6zx zW#K)+b8O|pg^7Gqj5o}X;bKwHYzr`ON(%s*9PB0Mbn9@K3Q!Y+r>mdKI;Vst0BHj$ AKL7v# diff --git a/techage/textures/techage_appl_cartdetector_on.png b/techage/textures/techage_appl_cartdetector_on.png deleted file mode 100644 index f498b015ae3d6d07f47324f6946d24e83446a356..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc(Q-CZ|1IXzsQ=CzBqffSVl`2{mLJiCzwzwzNii!mKlY~na{ltWo#0u;z_4t!TEy~w>B>M|44$rjF6*2U FngB4-EH?lE diff --git a/techage/textures/techage_appl_chest_back_ta3.png b/techage/textures/techage_appl_chest_back_ta3.png deleted file mode 100644 index 770f0fa1a6dadd7aeb1c89e5028bad8dc8646191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8%RCNP*dX+mpTOJ!9> zZf*`Mqj@?|0dq-^UoeBbg}h$TJs{WG)5S4F<9u?0go%RyC&Ny)b85%b)YQ%$J9g}x z+PQOTJS!6yCN5mL&f&o%A*orj*g_63VPWUuS=_+Jz#v)6EiL$uO&@3sgQu&X%Q~lo FCIG$AEiwQA diff --git a/techage/textures/techage_appl_chest_back_ta4.png b/techage/textures/techage_appl_chest_back_ta4.png deleted file mode 100644 index 5d90801c9ed7ac158e0dcb8783fa43a825ec16b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSN8%RCNMZ~aR2;;^EYkT zIAKEH>NTr2Cm2Kk)i9R?`2{m5*%Yn*R|(`=d%8G=Xq-<@kT7u&;AGgj?BKFv%a$!W zcna*SN8%RCMG5z4+z>j+NVsN zTv=7Ib=#IDOBaVnhUezyI5^sG->cCIlx8Uj@(X4#Nq0Ciak?6ipX2G`7@~1LIYC0F zAy9ym!@yw2jC&c4({?g8o}RR2OX_Ngp57^G=jJS7VVPx| zuB9p6%%iER%Oa^JC#T0?xV2O(!a+$$Enp+_qD8x9)h;j!zG&cNc*}lKAibx6fkDq% V`p{jkQ};mb^mO%eS?83{1OQC|N-zKb diff --git a/techage/textures/techage_appl_chest_front_ta4.png b/techage/textures/techage_appl_chest_front_ta4.png deleted file mode 100644 index bbb24005626e7059c100c5b902455726365b51f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICa0X`wF?gc)KjEq3ugNOI`?Av|m%EgnXPlSetzJ2$4)v6UGWyK{Gldl1# znM;EFf*DNHyC;5{4CEGix;TbtoKH@W&}j%1;N&ncn87w%YWA#IY|`ZsEVJ3zXB+x_ zEcsY6a}pCv=H-}}WoJ?ZM1r*R^@Et0zJ4lFb#Cp1i)Bs7WPLcks-1!G4BEd_=x utQrnoTO(LGeovbqxuUU0kXPimE`#bGov+>XSNnnXF?hQAxvX-4h``Pq1*vtDhx|J1RIz>tyT3uz{>G~djX4)n@IoNS%G}U;vjb? zhIQv;UIID%0X`wF?gc&!|ACO|!#3{qDTds4F7?U;Xe>F{BN!jxeQWQ666=m;PC858jxe@>EamTaXdNU z0N;!$Q$#*+^ROP!XgHH>wxIVw0JDys9^VgEj^>MB3}@N7T|S=iOTt%v@yq5(Ul}+kD<2_Pw-;ZxG^rqtGPpa-xaDTOg1_Nsg)WShK^Toq`@) ujF~#^1Ps|--Y^KtI~-v?#-{R_gPGy*JQ+V-@mfEiQ4F50elF{r5}E+ls3>^= diff --git a/techage/textures/techage_appl_command_converter_on.png b/techage/textures/techage_appl_command_converter_on.png deleted file mode 100644 index b4b6adb649e2544621d5119732324fc6feeb3b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(N4zaOqvN&=ED8g70 zgTe~DWM4fKV>O< diff --git a/techage/textures/techage_appl_compressor.png b/techage/textures/techage_appl_compressor.png deleted file mode 100644 index 5add5164fd71f8e819a64a4414e86cc3345b6362..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*67cAbeb^ZN^_Y4dT=Um^<0a8~ItO0FYJZ25oa~YCZy??FG6m~taV}DgUzlA`XJI8xfrknj6jq(eU?JlVn zd6zjnanOE|5#2nsTl5THT62-(mXmvLZMx&ITj>~c*+eUb)0``1Px#8&FJCMMrQ$Ia246ObjKPQd(^VaV0b&+J5pKj%ldl^;@|{U`)% zlph6Ft-LntfY^A!5ma}+Mdb%p{-ec72cC||H_;FNKuI^p=tltB4-7TR4_Va0kFe2; zALsYO+NB?sqy1P5cvOC@?b92BsDri6NlgUL-hWx;#{iTc0L}p@KLD;@NS%G}U;vjb? zhIQv;UIICC0X`wFK>Ax**~#O_ckkM@{@9(VEB7`|TH+ZTtDvHhU)NiA^V%Jtik+S= zjv*T7lLcIud9E;?^78Uh$YD7mAb9T6CpH6R#zX8U8$%j6IyhE)-|(3*Nuaz%GC+CC z!eiTZw)mz$@F?_kpTT&{&C89aK=q*m>rBxA(NhBD8rqtNLk%|UYTJ=^uA!)Bia^!^ zCz+>H74vuto(ga)tZUSoG4qv>!BNqLPLhv=TCBB#V~r$E2`qEq31HK1>6pSKYOuw> zS-VlP;ltZ03<5VfLz)IsKXdn%m$`4~RV(SLm?de(oSCm1|k{an^L HB{Ts5s7`R} diff --git a/techage/textures/techage_appl_cooler4.png b/techage/textures/techage_appl_cooler4.png deleted file mode 100644 index 952cf552cb80324984158407ba80bc89df65fef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 624 zcmV-$0+0QPP)Px#Ay7x z9U&z+KS#{q5U~IN0qsddK~zY`&6T}w!Y~lWJ%C8q`U>F<@&pV=oOWWsh%zylRPDrI zg^mnBfhj{zSTto64uep67S zGx;VDC#UfIY~hW!8lGR&BOEU0L)y6TUWcTV4^`a(#)ms+D|vM|HK*3*N^1M-5`8BqBun$1B8r;&S?c@u4J-QZQVW@KK|J z4sUTj+|LCMHo3aw`Ec1CjHWc#rSg32?%0hZe@ix=%VYfN|75%|~5sdVp{~ zWJ`pPy#QD`kf40HY4h2OX8HLdDGJKZ7u|+PDIYr?{>VpiDIZ@?(Y(M_#m7|u0000< KMNUMnLSTYHnI>ld diff --git a/techage/textures/techage_appl_ctrl_unit.png b/techage/textures/techage_appl_ctrl_unit.png deleted file mode 100644 index 765e9316ba87cecb609ffc32718e8429f405b53c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDN0X`wF?gc(Co<3bLfBw3)Yfm0K*0z4Phr4?ND=X`KPL9{Cxgb3yL4Lsu z4$p3+0Xc4-E{-7@=aUl@*fq2zH5oS=b+B+ta2;wia8WQZxOnvF#z3bHF&sJzI7Aqj y#KjL6b#S@1h;?u&C#xzet17GRShzUh0V9KJAWw*u@dquSi42~uelF{r5}E)U={yhs diff --git a/techage/textures/techage_appl_ctrl_unit4.png b/techage/textures/techage_appl_ctrl_unit4.png deleted file mode 100644 index 4423392d5b071c67ea5d794109868a138cbba6d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDa8Pv5LfpCpBGP`E|@=m-P*M$ zj~(-HckkSCU_LuL>wM0Jr5k>5bEoUD0o5`vmIV0)GdMiEkp|?%d%8G=cpOhoP+-^4 zmege2Xw<>NEx~oD(ZEF^H)%n4ck<$v2U?078j{kI6a;qckXYBWBETi1afN|Vn2}MC zQBae#6<3>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*IA24{ix|}_8c=p_x>=KpkAax}{e!&b5&u*jvIk}!Ljv*T7 z&-OL)9#G(5@l0X7`C#S(T91D?=Dw$(&*Q#wY5(Yh*7 diff --git a/techage/textures/techage_appl_detector.png b/techage/textures/techage_appl_detector.png deleted file mode 100644 index f8499d02b3d1c14bcde7d12f4c7836e8ceb51e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=DkySVU23(NsYmjw9*GdMiEkp|@Wdb&7^})e%r~6yU^*?Yc!f`!0;Q()z1B-P> zLJorvD|L0}do&X>v;QO@G2d{)gXt`Sa}}7DH2r4`xcvV=zXHn)?x_rthxm>9 i_+36UaPYA)F)$q1#P{W}-sc*i!3>_RelF{r5}E*7lr{bU diff --git a/techage/textures/techage_appl_distri.png b/techage/textures/techage_appl_distri.png deleted file mode 100644 index b3ad288959fb1cda17fd13b3c45203d3cf4934a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85p>QL70(Y)*K0-pm%^zh^tR#A&|NM$jQUUP8~RWe8=v6x9{8s zitO5Z;KZ2=&z?P>GjIO91q(T4IGKc*)^Awf*4r8o<$vSa^&`hm*?L&37^}=(xG*t0 zDJ?%U-fLqwP$zFmkY6yvv6kGE>ts*-apr8O7tG1{36%Kb>Eak-aeC_I+nbsdcvu7U z7aY7SVDRAO|N2bbCb!jPyXH%z^Ue^^ivDiCGB-4Q`^we-FmJngx&CvaW|AH)ogG&tKFD0%EEgFn$44gddyV*Z$_A+E`YL^v| z&0p}iL0+LD($U*Yy;0_Z_Js#UYDv$FJHi$u=q%Ko%<{-ud^Xovcc0Yg;~{>}J92h)Z L{an^LB{Ts52{5^{ diff --git a/techage/textures/techage_appl_distri4.png b/techage/textures/techage_appl_distri4.png deleted file mode 100644 index ad2494ef9cf4c022d9f362cb1861a53c600d4ff3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1134 zcmV-!1d;oRP)Px#32;bRa{vGf6951U69E94oEQKA076hqR7Ff_alysO z%FE5d#mKzB!@9n~&(P5T006|r$N&HU3LOdq6a%`vzOb>ePFYT)rKE(4gV)v8XmDua z-{CDfER>j)0alQQ0000AbW%=J0ERkQ*svSO{>I9gsQLf^1D{DmK~z}7?N@7Wq%aIz zc7eKyorFC8|6e`l1rE^mPP%@m)JT=8^^li6^_2d2V>3Dy1YgS`KZcoJdKqiR+Tstuk41;M0_3r zSfK>?vzAg;Oju;HCd$7BZW(=4fjQE>aJ#@mf0VuG!-AgA*usYJc`3OUlfNWAx1?TB zqdrUkS!xmI*EjLvS09dKaAQpNULV#ObG_@FE_34_R^0VLw37qC@s0LsQr_ZOAFLG! zj&C^X14eToI3ALL=hznYjwo@iN~sSNGw&**#aUt`pfWQfdR(cocOQrzSCV?RvpaFk zw)g;`E-Gx)tXEe+qrYY9Aauml9&p?m7aAhU88CCQ#JM|H1h;Pim~4v|l_&`9VAO{m z?+7zkwZ{Zok2eI;Ngwk1dp)og(etVgsw%$D1%t1vKJXRAa$MuE>&MwYur_3UI9k@P zK75ydK%1K*EbIOIf&g=S%vwL)y)U>Ymad$i8TPCX%zy6IwAo%X?xYV>W@m2fdr_t7 zF%)g7N45sd9%s`l^H}8aQcXym!k+wt5;mqj_C|f^kC@^ziXg!$-PAYl1F_9;@VXRCUxnp` zYiGJzR;)Lq?PhoV7@OM6KFxWy7qt6}AEFO`0Ky?(Cs-6V2mk;807*qoM6N<$f;6B8 A_5c6? diff --git a/techage/textures/techage_appl_distri_blue.png b/techage/textures/techage_appl_distri_blue.png deleted file mode 100644 index 8d424982540c1546e96a97ef6d755dd373a64aa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*9cGedzT-d&SyPEset-PNTLF!6^{DK)Ap4~_TavVKf978nD zCnqeBO(-lZJfPpe)-!d=l&MpDraWNkYD!RG5jSuVZ&)R;%!OM|)Ja9ctL?A>3s6B% g<3IB>2^R*2N#}SrEq^_$9B3GWr>mdKI;Vst0D9&-X8-^I diff --git a/techage/textures/techage_appl_distri_green.png b/techage/textures/techage_appl_distri_green.png deleted file mode 100644 index 20d7eb78e760d0b6a347c92e20e98fb1ee6b758d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*9cGedzT-d&SJHvm5;EdBZK3s6B% g<3IB>2^R*2N#}SrEq^_$9B3GWr>mdKI;Vst0DG}JYybcN diff --git a/techage/textures/techage_appl_distri_red.png b/techage/textures/techage_appl_distri_red.png deleted file mode 100644 index 51cf93006ee4368d4ebaddbe2d337d5debf01751..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*9cGedzT-d&S`+o+8x+_fXAax}{e!&b5&u*jvIgXw#jv*T7 zlM@!mCKMJH9?)-K>zO)b%G9YnQywsNH6?s^=EAKf>ZBs!)ppo`1*o8> g@t=8`gbM@1q;ou*mcO1=4m6Cx)78&qol`;+04~cqsQ>@~ diff --git a/techage/textures/techage_appl_distri_yellow.png b/techage/textures/techage_appl_distri_yellow.png deleted file mode 100644 index 5b19ada0600d9b1de024ad1b965f56c7fe1b9283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*9cGedzT-d&S`~Uw8Z$JDu1*t0u@(X5gcy=QV$Z_;^aSYKo zpPaBjHleVv@PK{;ThG)fQ>ISsneu?Ct0_T&MclweykV8VG8b+=Q707%ueQSmEIzopr05fVm9smFU diff --git a/techage/textures/techage_appl_doorcontroller.png b/techage/textures/techage_appl_doorcontroller.png deleted file mode 100644 index 5bd9b21a0d87cc31096d286a679ca937866dfc3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=E9YH55;G&KN8mjw9*GdMiEkp|>Adb&7~APk^T(sNq_l+zRNFRUL&4#ijl2^NuPls Xt46EsxoTN5&@cv1S3j3^P6iWSN8%R6CQ!L*51by)q!H) zt}*mUDSSA0-bz=G-GMnFAz_F1l!ZVErjj7PV1{Y=|9^V|dAXi0jv*T7lM@zj1voLS zVA9g_%V09*&A Srl|ofX7F_Nb6Mw<&;$St-a>)^ diff --git a/techage/textures/techage_appl_electric_gen_front4.png b/techage/textures/techage_appl_electric_gen_front4.png deleted file mode 100644 index a89f7a185937ae8533c95ea12abbd1149c989ac9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDU|@95LfpC9}^ydx7Oar6xD%Z z->xzANhy3dcRo7A$x2s`-GN!;i)OFw(O#e&Q%R6tFvGO`|Gzzfy!oCkjv*e$lM50Y z7LW`UAT}CBD!qhjNS%G}U;vjb? zhIQv;UIIBn0X`wF?gc)J7cU0#{{R1f_wL=av@`>uZ5be?B|(0{3=Yq3qyagOo-U3d z8t0P}7H|bPF3W3-7cA^% jxD(Z*pd#@~gqh(7gIds++4qfshB0`$`njxgN@xNAV|qB? diff --git a/techage/textures/techage_appl_electric_gen_top.png b/techage/textures/techage_appl_electric_gen_top.png deleted file mode 100644 index 008bfcc821b607e509dc4e06f637a2b529b6c26e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8%R6CQ#8|NkFTRA*vf zxDp+IzpZoS)qq-{0_Kt+zhH)G&PF?aW&pW{o-U3d8t0P}7H}E3F&*LB!O&>j8@fSZ ywZMU8O(!i(MYs+vNK4@0>A2h(=orwD#K3UR-R@!1OJ;VUW(H4JKbLh*2~7Z!GcKqA diff --git a/techage/textures/techage_appl_electrolyzer.png b/techage/textures/techage_appl_electrolyzer.png deleted file mode 100644 index 9cbcaa8636c2632893c222aec26b67a9bbc75593..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*V{<&VBaST%~{Qv*|RB3!UNL@*gUoeBivm0qZj*q8{V~EE2 zkUkxB19AJDMmQ=*O!=6!nrWHNZV`njxgN@xNA+X*}K diff --git a/techage/textures/techage_appl_electrolyzer4.png b/techage/textures/techage_appl_electrolyzer4.png deleted file mode 100644 index f60de71c6785a9a6216c91f422aab737baaabd3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}`~f~8uI>ds?Ebl4o^cFQF8u%h|5RywIY?bekY6x^!?PP{Ku(gUi(`n# z@#F*vuLe&}E|CPLzP@wEj-BgMDqwUL6i!YS7EEm6a!ghbaN&?>+9IKxeK4R=FM&z0 zz-<$&%7YH~?uE)>&aNLa4BMDkWA@3iE`FJ8Qrokv|KbF5Dam Pw2i^j)z4*}Q$iB}vsOgr diff --git a/techage/textures/techage_appl_electronic_fab.png b/techage/textures/techage_appl_electronic_fab.png deleted file mode 100644 index 61d53e36383222aa3a8329471ae48d95c33758e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc&t#Rb-O*1f$wDd{Pbou+>RsVfQc3ubV5b|VeQ(eZR~4AD5B zoFHLvUdsy}e!5cGd;O1u5w%E0)%*%2QthQd$z^7tG-B>_!@pCD%la>VN}e!Xp258_^@Bn7<>x>X89ZJ6T-G@yGywn~dpx56 diff --git a/techage/textures/techage_appl_explosive.png b/techage/textures/techage_appl_explosive.png deleted file mode 100644 index 6141f84cfc55fd23b02632fa8b239ab17e6f07c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%RAoGzo!v-scDh&p= z-~Hi0K4VFcUoeBivm0qZj*h2`V~EE2ds49pxhHZ}~5ObiUn z4D9^Tk&z6HKxIJ0$iT<~WGgExGcYi*v9SS3poo{JXLNM5nYlU8jFQ4aZ!a%9TU%cr zpN#ah&aRGxJ5wBi5+Wr*e!&dNpZ1^Qn)m2NXp8fo`QNg(@BRAtqG!(^p!{i17sn8b z(^n^*-qvKmm7YxvVsXR^M(wfEuN z*VliueB1q-XTnmsp0wSE8fWTmou%>QGlRie=>@MVPPB%x9!P5U>kYWVW^2C2Db%rG zcU({QSCv^4F8MxrKd($@<^-{qeQlhZjl9a`pX;ji=&LL%?B=}8Ju!2p*$f5wX&RR9 zis$}w|MP8L(a-h$Bs)6?0}~4a3(y8821X{J zBm)C810x6}CMH-~S~4($ERTtb3h?)Lb#^H(EVQ$=_44%e_3=?vRq5<(Km1I27f^*z zNswPK!@N&UToLX6FF)A*>!te4xtov858C(*Xf&6ni(^Q{;kVN-maQ@naP? zukrW4{o4syCw(S8w7a!VPCh1&&BgiKEJq8Dd0K~eIz1QiJ?HyshyTg<&p+#Tefr^H zce#3 zUZ}s=vWneHe2saiz+&%vzcWvNle=EwZn?)xZc+Y$}i>l{xH7dG{x@{J1iyWru^e&>;?8&jlt< z-a;C^7bdYx;n!kykai3QVsECYf>TriBpp2wjHQB6lQJY77vAEK3U#}%!pNz0i(rnEN7x% z&rKy|iOsHV25H?r1?EoSLI&yFZXoP>2oV!e^kA N=IQF^vd$@?2>_ft9-aUI diff --git a/techage/textures/techage_appl_firehole.png b/techage/textures/techage_appl_firehole.png deleted file mode 100644 index 5581214bafca2b9691f5b8d2c17172de8d25c250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8%RAQK1-4UK?gR8(9= zMP>Wta2+6rxg^Lhn8BeSitE>NAlK8=#W6(Vd~$+>mqVZcm&gJpCA|Oz2GIh})&_wY z4IUc|B^0<-q?rXLHO$;-DA2m&0P6v+9%q*eX9XO$yRzJsReGTpnkaFJfx+dkxIn3_ RXA;m*22WQ%mvv4FO#r&&Ewumu diff --git a/techage/textures/techage_appl_firehole4.png b/techage/textures/techage_appl_firehole4.png deleted file mode 100644 index a2e73afdece1100839871c794e892ee110565986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!3-p0cg)rRQfUD`A+GKPKF9NfkA?CbN|K3+ zirb{m(XYY+l!Sn1?)*#DSU**Zyi4LbWFWA}llQ74`|T8!^X)+mrPq2tFYeueAdQR{c`^L#F?wUA40S+d~*`;qUp2C|?29WeO+ZU2t% w3%A%Ol+{o8a6{f_8~+5MdFN%nKb*dkVYZ2ETewb}G$}+kD<2_Pw-;ZxG_`F-VG2?U^x=LwQ4|B1cQyj>;BB2Dx}y V#}#M0_XBk>c)I$ztaD0e0sugOB2NGS diff --git a/techage/textures/techage_appl_flipflop_on.png b/techage/textures/techage_appl_flipflop_on.png deleted file mode 100644 index 73d09e918a8add504cef6202ec38fd7b881fcf65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(N4zaOqvN&=ED8g70 zIg~eaDsr^M?Wk;FWRQ!O VbzE__dp}SIgQu&X%Q~loCIF87BT)bV diff --git a/techage/textures/techage_appl_forceload.png b/techage/textures/techage_appl_forceload.png deleted file mode 100644 index 7036991e2da8ff4a647ae5097c0374c7063239ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}asfUeu5S6ej!jNHzqCj@Z0YqaZ9?`FI#xV7fBt-5Z%=Z^*{L1{kAS-V zdAc};cpN`Fd1IEgp@1tpQ{xn&wjEa$Hk@ua$^K@;hTHaYewm*CtEYLV%5aD8?EPoY zU42%#H7_{jRI^0pJDE;b@65|Nx6Gc3Bu%-Sa@Tb3*>m4&Ja>D3d;hk~$J~2+n)R!? zDLJ!rv;6`WpHnrIS(!9JLb63A>uRUQ--tHyQ{K_CrHO3fOUppN7Sr; z?0+wX%(Jt%mnjj?6lUg~q&*?T#5iNomSYP-Z}#(iYksq?=IuMBm35gr*l$)?WM8Y~ zd2O?9(p2S~iR|q%sv+4KO*5jpcAAEMw*8qm`<>Lev(N6>_@{2K{B8F>EPt0QQ<=4X z*x4YCuDkzwkTGB4=+^6M+{^F3f^ z1}QXXkmmt2uOI4vwe+D}%HxL*+@~JjaPIKm2OJOGMK}FE_#phJVhG5X6@EM9KmD*h z8Q%!eW7sSd!I%cr-dvaY>i>tUV2dOU@Uubf{1NpdaIeXo<{TTDKPx^-T&vt6FQfQp zg;SZm#2+ntKDe3xn7wUfpzb-dfF-O!66mxA@w0x}*Az3@BN+%}?h~sE(dYfHAkEKi tzsjbqRPG(SJBR(M33vI~>>nQ&{}proSm5E68-Qts!PC{xWt~$(695*;8D#(f diff --git a/techage/textures/techage_appl_fuelcell.png b/techage/textures/techage_appl_fuelcell.png deleted file mode 100644 index bc9f2405fea03206955343902f2e997f9c18927e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8%RFV8sJ%}*GnT;NM? z^Kf^c5Pb=xoUtUxFPOpM*^M+HN6pj4F+}5ha)N|cL!bZ`O9IovQ+jR=B3$AeO&lxu f*hOFLlLac1c`3}l?AknkF)-{DO;J7mtjHH=0)wZkpUXO@geCyX%`GVa diff --git a/techage/textures/techage_appl_funnel.png b/techage/textures/techage_appl_funnel.png deleted file mode 100644 index b4dc474b6c140504883b17df79d313bcad918630..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(_3UbzV)@=@Re}Gh!1o;IsI6S+N2IN?Kx;TbNTux3{pct`L z%S2?VqLh>rQ(DGaF5YYg!yRF*YzvHLgtb~7l!y#yc9Ogx5v3Tw7S7Htk)@O1TaS?83{1OWRbEQJ67 diff --git a/techage/textures/techage_appl_furnace.png b/techage/textures/techage_appl_furnace.png deleted file mode 100644 index 0bb6c5fce78102791d4e4ff1197be3d7cbb34401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wF?gc(`H}1Io_^FGl>$=0I;^O05r_L@cDoPSrF#)8ZB*-tA!Qt7B zG$5zP)5S4FX)Zw*mEs7W32UzO^(%ud1K9l-JRWc{&5TWE#V67&M<2+pYc||_Imw^Bicr`GuA)! zZaFa_JWSD|eWtq4g$@^AX(zFVm$yyxw|m>K5Gbs*&$##fwORUKS6IENIBf2=UUm2S T#sCeVyBIuO{an^LB{Ts5saR-w diff --git a/techage/textures/techage_appl_gaze_sensor.png b/techage/textures/techage_appl_gaze_sensor.png deleted file mode 100644 index 6ad92ea18d79bff46095f8b12705d4b33859d201..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NfXw+?ErCFau_VYZ zn8D%MjWi&~(9^{+gyVX0f`aUadIljgGlxaLA5Doyf)DmoCVehhO0iZGT0 z`2{mLJiCzw{h3*S=?ts4 h!;}Wm=B*RC82r)&S+{W6Edy$1@O1TaS?83{1OQ&XC!YWS diff --git a/techage/textures/techage_appl_generator.png b/techage/textures/techage_appl_generator.png deleted file mode 100644 index 4a4a102ac2dc8f35ab96ab2fe15bf0278667e9b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKSN8%R`xu{q(gbY>(}rC$ z+59|GCRLm~etg0FX`8vY_L(Sj164AX1o;IsI6S+N2IM4rx;TbtoKH?zpp?MN%9zqv zq@dv{wnAt93k}y$#YR1b>yMVOu&nZE+oixTiOV2>@$=;ip-WV`4mC(bIB4=RDlom! zVwozyptK-|huJNGF}Xza*r5W^Hi33dB?gy<4PB0$4EZb7`zv%blFzi8%ar+QmF3MG=>!OS$zprmX$^)p#>^+1ojf*b5K+x)JrMmho>u>+Hho$Ny~5b+B(KsNGk! zaILk0{fumTkGjhNiUL99cki+9%DbOe@C*&%bWX2WKm; z{EP>Grm{s=sck8pzUYS|)8Do^+^o!R{w_T5XKLG&Pv(k;T~oQ(=H*Ge=fCx*o^jzK W>*MYpT0aAWjlt8^&t;ucLK6VaRKn;0 diff --git a/techage/textures/techage_appl_generator_red.png b/techage/textures/techage_appl_generator_red.png deleted file mode 100644 index dc80c9a8aac1e401fe88a23347197df7326dab82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 297 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyP60k4uI>ds%PlPO^73kGYJ7Zr z{H3I>Ha6C4X~o6G%`-K%u&_An<;BU#nWm&9EiFB9;=~jM1vNFbWy_Xz>FRFC%F0nz zUen}h4>XOjB*-tA!Qt7BG$3cHr;B5V#p$z?4)Pr`;Bnqwx>%DjitW$;^+`K&%9bkl zedxP7dA5sO+y2zG3A`;Cw-+U;vPM`sE)ZM>lVrgaYYWZ`(BLo*}pEx*^6<13ufeeKgBk3+A87oD6Spt4Zh tPE{k~@}om9Cfqmo;=aroHDmrK7G*tdqsQGFgn=crZhCDVPRii zUsP07Nl8h3DJh;cHEL>VbtWb`IXRXxGDsH}2?+^vb91UZJYyjtZX_g*FE4{DD*EK9M=r3sGz|BvfgnhR$(!iv;~Nagd3g+{~LoEaS!i!aObZ{m4Ea88Nygdp3+ zyEvN=q(6vsO7N2y3x4GcD;^0k7I6CbK*SRcAZQwN5Kn{{37V2oq&wpMkWw}rnZ-ml z7J$Q15XUz`l1NSo4kR#)Q|8X_E-(fi;IB3&IWhL&;BLY&a7Yq>!`TVWpK(Br?q?n+ zCkhVv>4_32H9=!a#Z>1t6JQxqyGtu7%rD<$oV z#ft;9+-+NysxYk!cH5GTfoBokuE<-tT&v+uCpZI1lxbfL$e|#CV1h{fwOFq1Zo()E zJcl5Rf?%_q`(f^ff3!bTddvs=L&dp>!{dPqn1fDW9w`3c0EcXvTrmtxwUk}XJ{ICn zrGgH)KUj|P_6OTC_TK)04&MGy>^WZa3Qp^#8y!+7NGBXp8i#oDaq~^=gYddvA+Ai+ z)7%gLZ9mkoHhcY0bNqhr9IzkI!Rv<(*JiIDIMV9}bnxP@p~N7(B!Kq|NR~0^z_%b0 tsB8VeJ506S+W|Uw?-y4c=J$(h`~i$*uHKZz3Wfjx002ovPDHLkV1mi(W{m&< diff --git a/techage/textures/techage_appl_grinder.png b/techage/textures/techage_appl_grinder.png deleted file mode 100644 index bf4566993f87c87c8a9244a76cd932de772a3ca5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 984 zcmV;}11J26P)Px#u24)=MY_GfxokY3qotOZo2ywb#ez<prl_gK z$jU(+4oNjJx4OG>P(xHWFHbNfX9;mw|eZkC4^Z*t2v{Xk}-JaAq12 z5J5jaJt7+ z%8#NLr+>pRPH?8WPA!W*zrO(oAwU3rPMU^cIYFn?G)>(ERRxtC%<&>&pn?V%rl$T! zM!)l&BZW9M2p(!T~EF^UNEsLt=B)~rvp#{?5no~o`|Aq;7c+@Bj0@K6aifa8&pq- zAZ)6tiU#+Ug!S&()2|N+K(@xC2=hHjlGe`Lim^g`c=``O2amN_!Z`SRct53?zp%Jy z#CY=&IDvxOZ|k^Xy_?Ox@4NHN>!Au`VW)T=2&gb!BjE`rog8-tlEUN-kym@~*8$)j z{B;{rZT&3_O?0bKT1Sz7~{^;xy;DAUi;a1TE;xiT~JS`pl)o5*e+bKQ-}1nTTbns z$8}`mX`@Lz=lC7$Ot{XayJ1mu-Ny1T3C2q*0TU0>6Jx;wXDNz@pQ&A3uso>(K4s(= zaIVc;^84LqVtj4U3170&0 zCSil+(6(z_^Ulr)L4aC#Y4*Jd-X2;D!yLz62mK|Lw`o{lTBa;0uW3F})x;?1?56icQsP3+F2aWX$8Gl9~DBQ75c&N56X`oL2@u-}iO8Sia-1f8KA-gKi(>EpY9IR8bbkRS-bI8cw`0=)0000NS%G}U;vjb? zhIQv;UIIB10X`wF?gc(`VZh(d56En2XvoOOkbk~+4ak6!AirP+!{P&+K8!nn{GXmK zjv*e$-%fGlYjWUm4SY0@w_5n|y%`nFtD+sOV;T-}cf{S#Y&5vw=Mke-e|!4<%%7@V zVt?0$?Y{hWM$7B$l-%@Jj!8#dnRyr8Q+?aOog`;=pi3sCTcnX^-jfAU4`gKmnV47f zK42)2jdI}II+t~_@60aBL$tv7uP-bRav;07q&MD?|QA!siK7U|%n;bajmt5<&owW*=jn5Z8 zl=J#zyHs#)t8x@L?s(YD4wlbr+@ca*UU>>C0VNdsX#B|m+^Quna{@GXD_4aX!K(= znogfTF8G38#`F1jGMT-+y&>cx+eS7*Kc1hTpm}(r`3$c4e2y#&S?>rg`}%r%g4Q9z z>?-&+w8UtOR~Q%W>mYi1g68QHn$4mAH|QR((^S?ft^JK!xoA*4jh>&-WIn`4=+!q` z7)4a4lvoxK1o;7yCp4O0+bXWJx9SlH^Kt=6Gnhc4+(0JkWds(_d;LJ+4J>+AuqI%+Wq+t;L4`W>74B!by90 z-zH&{WeKB{P*q_NJfjf=*a$yo$uYyLEQ|Me+bHD`sVrCz5Ljq+A-M=5YvpDzGYf@* z=>&v0Tm=&gMKz&DwYwrpR-4PEu#zO&Y8kY{7zn1YabN|E3BuRaDGk#qa?!CJNoU+zUWLjjg zRr!+hl88LX><@vfsFJ+d_B@4riS01aoKmTd*GUdbz4K`Ry*!VI!x3ZTrd(5h2fI9- zLPjAg4zz?+VX7%*kat~MYfbzxw(UUxyNL>|B%u&Pl^*vvCsK$6rii8^5DW>oky-~z zYEB5(gbLqDU>RYA31s#687RU^X{r<2W6PdBm^^HUY5aJ`7ZN7K;+9%u~K0(%a|K^cy0Y%ies+CH6t290N9xMrY$ zRldqTK1P%2WHJK53kU}HjbGkwt=G|^bv}6mcMk!e{rmSBJO}TOhR25hO!0{i^FQ$c z{fQ6upZHMxHy^4>*S@T)B>a*OX%AKqT_A|?6S7f%EiZ)aVo2yd?*|e(4^gji`UD>y;L|3wMS?W{NzIg5HvuT z1J1(B`4VMCz~ENt<|iMj8VF*_0B0_C3(Kx5AM8zad*cHaH4tR)7U9l{t+mYkT55lN z zTmrZKwOh56#hm%Hd#ykb)HKvDKO_|l_7g&Wv~0t zfxOR?J3jP^1&8Av7w7ZEMtEB{rJ%u$4@`P8+h>rNo9I&QqYYC=vh>CWE?I|dcY)4@ zy9{w6;B?D*^@|V0GiLAhbpY zPv1KRhs6351vxg(PfU2fqN!PBR=!N zFG~*?Q^O|cp^8|F_JI!ptS+4V4k-sj@a0$agKwI~1N$?mNS%G}U;vjb? zhIQv;UIIBh0X`wF?gc)*y*&>0_Dh#8ak35D4N_DRNS%G}U;vjb? zhIQv;UIIBn0X`wF?gc)*y*-mEE0!)@lB1&&XlCaB#3C7_v?Rzcn8D%MjWi&~#nZ(x zMB{vNf`owr2YUcxVzP!o3s*;5+b#x2j|_zn2M!0tEC~v mE7sXDjcKCx$F?9@28IchQo?Iz`y>I)WAJqKb6Mw<&;$TL<2R-N diff --git a/techage/textures/techage_appl_hole_electric.png b/techage/textures/techage_appl_hole_electric.png deleted file mode 100644 index 6dfbaec69137d4797f3cb0ae526f3a9572ec3a2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wF?gc*iWffPioLDe_T2Oez*?JxALhW}CMOVaaG688Q3GxeOaCmkj z4am{y#QFb6OAb`cy!Nb#2F!aC;3Eu-cK)hwf1hEol!!@#E3=AL2S(dq5 S|9S`1#^CAd=d#Wzp$Pz-k~Q%F diff --git a/techage/textures/techage_appl_hole_pipe.png b/techage/textures/techage_appl_hole_pipe.png deleted file mode 100644 index d80786213f91bd54fa672d937e29394fcd3ee3df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc(TCIq}W>^Ldn$_5~Zxg^Lhn87G&&JGP%AXm-P#W6(Vd~$-s zqXtg_4v`5g60r>q43P(J-nh~7jp@a;B#RsmCI;Oej>Y#BI6(F@c)I$ztaD0e0st^R BD}Vq1 diff --git a/techage/textures/techage_appl_hole_ta5_pipe1.png b/techage/textures/techage_appl_hole_ta5_pipe1.png deleted file mode 100644 index fa8de797d322c6ef70696189f347399d97e23c11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%RAQK3pmc;?dRXm0# zffRE|kY6x^wtrS?>NX%(+0(@_MB{vNg2cZD&wv0%*M^HXA{ass9GN+RVV4+>bGteN Z!}{Ay?P+e0t^<`bc)I$ztaD0e0swD`BFO*% diff --git a/techage/textures/techage_appl_hole_ta5_pipe2.png b/techage/textures/techage_appl_hole_ta5_pipe2.png deleted file mode 100644 index ab2e41ee52d7e85e0724a0a2613089082490cf27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%RAQK3pqt^q;_j>G3 zK#I8}$S;^d+dnHcbsLbY?CIhdqH#VsLE>M7XFvd>Ys1AG5e%URj?A3EuuF``xm}%s ZVf}5U_B6Lg*MZ6zJYD@<);T3K0RUXNB8C6} diff --git a/techage/textures/techage_appl_hole_tube.png b/techage/textures/techage_appl_hole_tube.png deleted file mode 100644 index ca4ffd6dc52113b5a926e950d663b290e8b7e13c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8&+Wvi9~d7HOynlPoG z#XjLYki%FK_gkJ6b*pOlmtqIh>sz?G9>`b55NsdW!@f#xxIy85}S Ib4q9e0A}DV(EtDd diff --git a/techage/textures/techage_appl_hopper.png b/techage/textures/techage_appl_hopper.png deleted file mode 100644 index 7eaf8a28e88462a1505b5204880f96e26d3237f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=BWne(+;0)Z4$NswPKL;W_*g;Rk%5l@v1;LQ7N9(Xr>mdKI;Vst03I+R5dZ)H diff --git a/techage/textures/techage_appl_hopper_right.png b/techage/textures/techage_appl_hopper_right.png deleted file mode 100644 index 48e10370fc8ad25c94742069834f9f365d769009..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(TCJ=~ab4~_QOeH~n!3_1=G#5?<@}xao977~7Cv&tiu~{@n lF|0r7vpUT5LYreO1H-NmnZJHJLXLqnd%F6$taD0e0sxNQBdh=b diff --git a/techage/textures/techage_appl_hopper_top.png b/techage/textures/techage_appl_hopper_top.png deleted file mode 100644 index 4c2fb4d8b89a4c157aeb918b3e3b74ce4073aad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(dDoWON*1KAFe+Q{33GxeOaCmkj4al+cba4!kxSX7@K6pUD?BI3=F+5C1lb#WmJK>89ZJ6T-G@yGywpeO)Xde diff --git a/techage/textures/techage_appl_injector14.png b/techage/textures/techage_appl_injector14.png deleted file mode 100644 index dff0fc34df4cfb3af3902f1cfa4111279122c0c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU42UwVaEW`Bjk3dQ^z$e7jy}$>^w6(Rpefze* zzyIOGhc|54a5?*A0#KB>B*-tAK~eci-vWOiH^bA#F(l&f+e;fc8w^BTFRoc2ZQ)$P zw7KyG+q?ZuAD9D=IC($3qckDBMMQn6y?M!6yS5t5wx@giOC`MZie=Wf|CauJ>(;#g yigrI9H1k6V0r^MHH68pP538bg=d#Wzp$Pz!NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc*9cGedzT-d&SyWBsyZy-e_L4Lsu4$p3+0XYtyE{-7*my;6~ zNd4GabzR#aIV&SWVn(6pF@~;|#hy$3n!T3lakqErG+5v=J!ESQ6wH%;50sMjDXg=;`7ZqH#VsVF8zc8&d+KvZ_Tu8>a>rQ=`Bp zhYoKKjjo2(-K(`{G0fuPFG@yX7Jp0pkWN2 Lu6{1-oD!M<@Dwm% diff --git a/techage/textures/techage_appl_inverterDC.png b/techage/textures/techage_appl_inverterDC.png deleted file mode 100644 index 6487d6c0a5429753527afb82cd22a75ab93beeac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc)c)5Ib+O9KU#90}C|DJlu_3ubV5b|VeQQSo$f43W5;oS?wg y(!@An;#Mw>FrkD!aob;iJz&^Tpm@i+g^}TRew=fR(zjVa^$eb_elF{r5}E)OmMb~{ diff --git a/techage/textures/techage_appl_laser.png b/techage/textures/techage_appl_laser.png deleted file mode 100644 index 70f706243ee2cd73024e35d326779a6498d9251c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 567 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!%mREuT-^(NfJ_KrW@Lpi3DEiL zR?G(~5iAMv3uZ7msK)*MYU-5NE#mnhE^Fos-b&ibz`!`))5S3);_%yP(bHNKcw8#? z2X6j<)~~6|+rOX7V*a(|$6Hj)rx<;Ead9!*$_ejO3mCrn?YY7bch^IKLG;*Tbp{>B z(+^qL`j0C;yZFO}dBTk&CSvlnjtvTD44k?`>I77;p1VJ{M{&;g$ZyBfpNN;wx~mad z`^Kih=t}QpxAH|j5|j2flw>dplsfO#_{qJnC|iD;u&Q4{V&Nj68S1M)9oc&Pa;2c- zr%4Bz-ne+mPM$33$T=n6Y|0|$g@I46^l&o0o&3hpbNw?Gy-hcZPgogPCabIF1~+ZJ z@uYTARKrKZjQQV>Mb-2yJNAf)EuH_+iv`;*?#nwadWctIdBq;KO>MVZ0ye66>{Gcg zPvqMzJ;6tpKDpe|+Mx1p?}K!^Fe`zSR}UOd>|cLF@X*w4MG2eC9{ASzPBdLm^ZQ1N z$jwLU9tomFQ{=6yerZO`j$BeVbj diff --git a/techage/textures/techage_appl_lightdetector.png b/techage/textures/techage_appl_lightdetector.png deleted file mode 100755 index ebd2db73d2124476f2e3a80dfb34c0900a6d144c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1957 zcmV;W2U_@vP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+T~YUw&W%Z{AU$e0+JAqrewB*CS?t{-)cz&|G+Y5$C z(8}=`=h?r)uJ-{coc8u?cd4I#^67~D)6`-!+x<9$JRJ!ib~>M3IS17Ekk0wze!9KV zdU*~BU<`#nVaHQQ{J!!rlh}`??$)jW9Z3}TENNTvkNCM8bYB2?yL-XUUy;cjj>FNF zR(!$fw3EKrXUyw9`IXhnrm!y?Xv zpW;64v*66W`VQ6xQf{)*N%nIhR}u7eN_QS7J#e zmr`oQq%~Cds_0)~XxyZQrY*MAax1NN$ft*{J@(XdFTD;PGEf5Ch$D?W%BYhjq%_0S z8E2Y#mRT3Hwq%8+E3UNiDy!aDJ6U~Z?UlLDtkKCDZ=$SUy0ZpzN|y_=a-zl=7~?=- zJQ)KJG#h6=QwVI#8E3w*I1yz;sYcEqV+;(2Nvw-*+})Xb%bNqb-{pC4+4wx@5k?z;p2!;X5WHTO7U39~H8 zNkrkg8O)k61={3G#4PHr{FDo!ud*5c46dq{2mW zpH;&QfapL2SF0@8(K_nb;k2<_bR%f@i&;Hnx1H3mP-~A_z;6i-Vo%Bt`%TFnrFlyY zqJT7(foKNvW9sA+`W{2Jj%V)$8h7I+UJYBwBe;+?xW3@Gr?S8Ul* zPI*{~s0zvTVSTRx!7;wiN9j-rlQJHUn>I=sRh+@LAfw+`6Bwg)KVB7hzN@ zEmvU*y+2h3_l*+rv2~wnjXij*Fe?sNh}Yr|rTn;KI{K|0(*MlSv4t8gD0ZmV{0Ww) z*8L0c{7)R=OSRy?``_HZHcUrhLJ9x?0fcEoLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ z#b48kA5;|VAmWgrI$01Eanvdlp+cw?T6HkF^b49aBq=VAf@{ISkHxBki?gl{u7V)= z0pjT7r060g{x2!Ci1FaKAMfrx?%n}Hz05Q#G!AIGZKe`&F_T>tJ6|CngfP0%FEh)S zlcXek$Jadqe7%eDEdO(Vj$SoqF(4ok&oaZbi8qL+H*JISK5>K8V^%aZ;wj>&s_B$3WIR?mZ*kVjRo1*Ge_=SMuPk$& z<}eai#1bTkP*6n)W!Q+(s*_?NMf-6d|B&mK$fc001V)YpRG>k2{osG_yIU(iIpHOR z<3PuY<9v(&ox4Dz<~ZNSj?*{+g3rK}-tt%Kz|1G;acMz~GZ1 zo3bkfX$tu~@P0<$lm!NEfu1$5x8^=hAAmG%wEwTz3P{A1|*K+n+DqOiltXfUNQYB r%+VIQ7V;*ib(>i#4#Z+uES|reF*g}iVt-bE00000NkvXXu0mjf*KeAc diff --git a/techage/textures/techage_appl_lightdetector_on.png b/techage/textures/techage_appl_lightdetector_on.png deleted file mode 100755 index 69940331e52729819b57df016d6c50eb0c211859..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2250 zcmV;*2sQVKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+T~YSmgA@r{bv=u1g0QhIl**J@8B)JZvax-&U95} zz5435j*WyQh`2+5&G_Hn)BJ^xPuZGCoKs23;uA|OUT~7_{_NJ-xPI5ipIf+o>Nocd zkFJ0=?8`LH^MZc*c!A^Tuh0F4+ZiXHft-DsI_S)L-cOKcpx}4EJJ+V17bHETbH2Wv zVXw4at|J4CP8ctE<4178u3x`r3i|ayR;#}e54u1&_kmXrf5y+;(0u{mefEN%y&?-A zaO{Duw9*Ssr{B>_f4HadPZ2qP&+H!~qG^kL{5;?{XU}tvot?yF09QImU8$@yJXir| zSg$1|a+bYk=YV4dKZ3|TWM9F6BSXF;N*_Z=ASZjB8}G1N&wBE^8|4K= zP)IOI20;R{Vx*Yhw+so1p+J#{5;0{eBq^krD5by&Wd$i#`6GZ&T|a?F%d=A3iM zQhW(0V`NGyTyiNz1d~b>j3szp&{2I2HCC#ra?Q0=X^>Bgjaq8law|=`@1dgvn4UWK z+)J0?2Bb9NppgcTJj##>t<5mwq?snqJj;}uwZrN&Yp=}xm^F7;^NT2bjz3sKH}f@w z({e(}85r}?fpJy_AZV|g+3aHU%A9g$iw`CQ@`#d@obHq{Fc^pPG~LbJ2Xk+EGeGyd zy!o$~GfLf`V9qFY56pe$?F-hrta2L`LFz(aiV7KEKYdMnmO-ISt7llAzSWxVzVI&| zXi@_KHH6mYkkINF6Urhpr7N?=D*%UR(3-#y4AM zMlCd;T(sCKHJb>+oIP@>y+clj7Gmr?vCa%3V#saAoo#K{4(xL)@m5Fw>~EO z>3bELTqm^Nz0l}>ND zGK(J84^>mbC?5}I?jkGjb z7PG*_y|-4S+o>BvO|j0Vg5ebiz`F1u4mc%I@GE z)Mg+z_lgU2-om2F!|ZshwDJa;J7e?P&|H$;5DoJ^i0)FNZKvUr#$Awv2@~7r>gbkD zp-}AhsJ=kZj3PL(1ptEZX&Nf)IZ~=o03a%loHD}D$jFz3G=7)?L2fhDV+M{Z$N(?U z^1`H3aXa=X=C{_KFP0v&Yt%6(@wWIe`1(IXcUd|<%&#sCYC^MJxQm5*DQ@;I6Hnk} zu^;UPy~)RhJNABJuPb(xa&@7`KIJL&&(+D;)W3)w`gn@|#Q%fv%@zOiinCbX)fueU z&3av|M`iuZH*V$^cXnIMy8XbCT)eyL4gL<4gpxB+k48FstiJYG6Sl)YDAGL^ z&_8)o?D>;nA6xV8#&=sCXqT_B7v=gM*Syx__BE=;{-OQxe{mp`&)Ex>;(q`&Ni>%Qhp*mR*6>-!m z6rn<>6nNgNw7S4z7YA_yOYRM#hx^1QsaWRu!6+2%cAcQcw(JwR0n3JR=e8<;40(`xT@htyye~w-? zXE7ik63;Tjw23!}r#Eeb^FDEe6=jw9oOsNn3lcwaUGeyhbHQbSXGY9)YMwYkEEd{W zX=7G2HR37asH*9dFJwGcId5^+%2n39Cx2l$r>`t?o#rqSSi}+}h)_^P31!%b(W;YT zAw~OfAODc+m&m1%s{}@l1yrCxcKzUg@Vi?pKRMwgh2ucSi{pHZ0G+!)qvkl@$BxrD z0fNuKmEQ7K>cGq=>9v*?Jp%f+fs5;wrtATiJHX(RA)B%*1!)TTJn()--;@OgZh@XP zueattP9K0Yb(OpU4i16Q0%foJyt}Ktw|~zx`}+afhjMB{vkn3P000S4OjJbxz=TI| zOo0CY&A_{Q00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmYE+YT{E+YYW zr9XB6000McNliru<^lu^8wbZDF;xHn08dFoK~xyiV_+Z^aKRW_P?}=}OlAR$(Et~L zG8|Th#;;ftj-kBA~Sj2v#67;8MtnVV16fIS{6V0j7kZfn?tT Y05>-oUBF3x`2YX_07*qoM6N<$f(k`3ssI20 diff --git a/techage/textures/techage_appl_liquid_hopper.png b/techage/textures/techage_appl_liquid_hopper.png deleted file mode 100644 index 467111d40848ed2618b40baaea8f60830898f970..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc(hPEHHv&%Y@v`)Mi1C6J<$AirP+hi5m^fSe3Z7sn8Z%gG4} z{2SVs92q7Y+{VSB*5Km6Gl4_7;~_&*%G#){LPru93=iB|6t*^sEA7Pp|NmL1D*pTb zU(}%a@BjbYD|oK`|Id7Y=h*-MvI;%F_6x8%|BYuear+al;rx$#ilWpZ2R#Oc#=Sa! UZXS`i2(**I)78&qol`;+0PgZmG5`Po diff --git a/techage/textures/techage_appl_liquidsampler.png b/techage/textures/techage_appl_liquidsampler.png deleted file mode 100644 index 1c44174d66852317550f6dc0a8bc1288c0a79d0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8%RcNZ5Rud=2#>V&&8 zki}RM)Si>sO!)DNISR!hr%rn=KlYt>TMAlua SNPG{_a0X9TKbLh*2~7aX8#H?W diff --git a/techage/textures/techage_appl_logic.png b/techage/textures/techage_appl_logic.png deleted file mode 100644 index 9dc009b1556fb98aff7cd23a6db0096799254af2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=C3I5=dAva^7sOM?7@862M7NCR?oJzX3_IIbrrC~#h}XArcP zkeDHVqk%(C!Mu^zZ-ab;pn>5Ap$$nJ%sLoV7#Q4k@~(ez(QF}5BZH@_pUXO@geCxl Cohd>9 diff --git a/techage/textures/techage_appl_mesecons_converter.png b/techage/textures/techage_appl_mesecons_converter.png deleted file mode 100644 index 8709e5da32c5d7affe20774ec03f1fb77e8074c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc)c?rz>5?z&nUG81me0>zn2g8YIR6atIqHOc|GWu7jMArhCT zoh7TT-+ic~UdJ~4Bl zZNjd(9gCZeyTmfZEK+MO75}jL5VNymy$_p?M2EJR^Mthz*diu=I(>pA=8DCV>}7KU l`7hs#lk`ie{r_mQ+~r*cTzf-2U4SlN@O1TaS?83{1OQ9OQDOi9 diff --git a/techage/textures/techage_appl_meter.png b/techage/textures/techage_appl_meter.png deleted file mode 100644 index 449e972121eaf5d8bca9ef2800c44ab2f40b6f1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8&+|Ns9R85x~9a|S5Z z(a{kZ8Tofrpc#8x@_rr8pEg6IL)}nVY$pF&_@#Sw2~>K~PRY5oB=8TIq%@ S|4Y^ZnGBw;elF{r5}E*N$uU&` diff --git a/techage/textures/techage_appl_movecontroller.png b/techage/textures/techage_appl_movecontroller.png deleted file mode 100644 index 36c22b8ec3c0b75ba258c89780cbede4f5e0c878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NEW^^fmxrVSMHowh z{DK)Ap4~_Ta&$di978y+CnqR~d3Z2zN(%(CE9EhB9-C>LAY{RLawf0CwOoPid@eT* csB|zhBr34auROl}22dk|r>mdKI;Vst0O_tH2><{9 diff --git a/techage/textures/techage_appl_nodedetector.png b/techage/textures/techage_appl_nodedetector.png deleted file mode 100644 index 11d0d7746fc4c8160080f29702d6b99867509c8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc&`E>06COb81L+rD*c>c=UnAax}{e!&b5&u*jvIli7Qjv*T7 zlM@!GC%8QC=2-MGHiqTmj}uA)c9S?3E4s8Q#T<}OQCiWW!XP3T;v{Hb7P4q(gMkaf t$+w3T7)9=LN^33r86Pmgq2r=714DbAkVB=j=p3NI44$rjF6*2UngGhGJqG{) diff --git a/techage/textures/techage_appl_nodedetector_on.png b/techage/textures/techage_appl_nodedetector_on.png deleted file mode 100644 index 16504292bb5836d720d18193c732316808e76257..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc(uV`C>;T6(xRohdG!P;u-sNL@*gUoeBivm0qZj<2VSV~EE2 z~#|b3?yGb0Ija*s{VjMVCl5{#$7(@)kTm%Dx#Fp%A5OiTU t`PNN=QRKd)CikMB_ixN_=(s4&z)%=1u<4LrGSF2F44$rjF6*2UngG?pJ<|XH diff --git a/techage/textures/techage_appl_oildrill.png b/techage/textures/techage_appl_oildrill.png deleted file mode 100644 index 70ea863994e87923b1acfe6ea1e63c080ab00db0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=Bu8ykPxb9*01x+KUin8D%MjWi%f-_yl0gyVX0!U4`3@&`Ds zv1+jVXID6A$vAn!e?}D+YXi>T_6|-PSttMaFYoq%fx&C1P`ZS!-&3Gg22WQ%mvv4F FO#nINF6aON diff --git a/techage/textures/techage_appl_oilexplorer.png b/techage/textures/techage_appl_oilexplorer.png deleted file mode 100644 index 68b9e718bf840c330f5850d962bb659ef319c138..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvl>na*SN8%RXJ=;z2M2q5dw+lb z;NV~&*UHN3`t|ET_U6r-`}_O9lxg<^)w7ob`2{mn?!RLxKcA7O@F7qr-_yl0MB{vN z!UDwvH}M2>2Vo6;m#4z0yw=L%0vY4x7G53b`FIYG=4zSKRwS4ieW=EO3`U>}_ cUNGQdG(KXqY$vPXC7{&|p00i_>zopr0KB14cK`qY diff --git a/techage/textures/techage_appl_oilexplorer_top.png b/techage/textures/techage_appl_oilexplorer_top.png deleted file mode 100644 index cc6af98982005e4eee596e767d35c8fbad605707..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(TW@b+9wuu+SKq^Xt{DK)Ap4~_Ta-=<7977~7CnqeBP2gc= mVi!mj6$qHhXgu>70|V0%*_anHD>nj_F?hQAxvX`N5+JA0=l>Dk%CT_X%eXoO?cwb#wp89j*c|O&E hp9_xf4!>Jt_H^Hj#4qd%Hvk>L;OXk;vd$@?2>{VERw@7h diff --git a/techage/textures/techage_appl_open.png b/techage/textures/techage_appl_open.png deleted file mode 100644 index f161069cd90e9d47e446e69b97939f0d2052dd3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv^#Gp`SN8%RAd?`d>(ycdD&i># z@(X5oz&|7MpsB`(b>)ed)`U$2il=+JIEHAPPfl1MmayHT*v*UaVESZBW)^orCA0Jc z4>)?xSF&-5EzoMvPPArb7YLRRWMWKclxjJkxZ!|I%Yn=d4*X6J6e1q*2q}a!91h^g vHk4_5Si*BYu|nRs!JtXNc!J@gMkfY_dwVu-Rq8(e5#(M^S3j3^P6NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc*9cGl<5pWnWHJKL6*N+3lgL4Lsu4$p3+0XeRoE{-7*my;6~ zNd4GabzR#aIV&SWVn(6pF@~;|#a?%#rfuUnGh^m7E7>zUfF!S4)3FBcyHVRpr1+R0 i_FR2kzJB?< Z$T0QC?frmdT6;6Ch4f53 zpfb*qAirSk|6su2pa1w|2+*<%o-U3d6}R5b?w!=6AmZk&d)u`BQtkirSOFK8xA(TK zym`}he%jIkktari0LJa>IK4^Nd%wg$lcpN*o zPicXG3X{?D?6TMsZwiDM*M?p;3rk=B(c4%q)3xEGS?ZeX&DY9aTZ*YNIX#;y-N_Br(<&;dFk$dlWf%xX@<|>z?#I+_JTf?=i&bqIv`oYA4 zcgK(BetGCKpW}hP&7%)XKq1J$@PYpWKf@lj3*1%P>jT!f#pZwJ-?X$|;G5Rp=E^Ux z-S)kGBDdmCbIK1{yWNIcIDQCyscMk_-oI2rcf#h+a#HV^YyvtrM%AjOO}zH*VDz8n zExO|NANcq5r4_#KXSu9Z=l^dhZ~8A6h9B%;+ZY)BF`oBe_{K0-K`e#A+D@$j0OYkPuOPdwgZR_!9ls8{RMVPTXo!#~nLTY+ciI*y;` zSTkN9xc+cMV0-hge3fj?{KuDhS9;z0v`JBW)+XMW3-nIj)nxE*H?CD;_ybB7An?B- xU4@~V;hDZcedAAV)z9KDgc%>m10@#d>}TA;v+eE$ldLq5LQhvemvv4FO#q+Z__Y84 diff --git a/techage/textures/techage_appl_playerdetector.png b/techage/textures/techage_appl_playerdetector.png deleted file mode 100644 index d2efb22bc1818d74ec092d99a7b82bcf0f2ee70b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NfXw+?ErCFau_VYZ zn8D%MjWi&~)zif>gyVX0f`XV#LRvzCP0fzR#*IG}rX=LqR5Uc++{fr~MV>+ErTqgI zkDkBG6Egl)Fs!&Cup-&6V@Lko0|yEY&&r5qEIlgqk)i6vJ)nUMp00i_>zopr0QI>u Ax&QzG diff --git a/techage/textures/techage_appl_playerdetector_on.png b/techage/textures/techage_appl_playerdetector_on.png deleted file mode 100644 index d72b959b6c2b91fb3b3f6cde31c02647d1276824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=ByXJ+2{j_oZ-x+KUin8D%MjWi&~)zif>gyVX0f`XV#LRvzC zP0fzR#*IG}rX=LqR5Uc++{fr~MV>+ErTqgIkDkBG6Egl)Fs!&Cup-&6V@Lko0|yEY c&&r5qEIlgqk)i6vJ)nUMp00i_>zopr0C{sgIsgCw diff --git a/techage/textures/techage_appl_pump.png b/techage/textures/techage_appl_pump.png deleted file mode 100644 index 1044af7278ab7e96ae9680962fa32ee2b6ec1fda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc&`9v%zk&%Y@v8)SX(6i87?kY6x^!?PP{K#shpi(`ny<>Z6~ v0tRcNwi^9mxXE+u!i4}Q9gTe~DWM4f!a*sl diff --git a/techage/textures/techage_appl_pump8.png b/techage/textures/techage_appl_pump8.png deleted file mode 100644 index ca32aff3f0dfa4545f8eaa17e27a8c80c057f3bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU43{1>G*81~vo&qVBbVpxD28NCO+o3?;{|{9;Zqc4&0ya9k+LENiEI_`kfuY(^fI zCXj*`A7)1Jm-1WkBq#`^1Y{g#Xy-SWrtnU&`=Er^44{U^FVh2-&%gL7UFCW_gZ|6& VE~;nZBZ0Ouc)I$ztaD0e0sv}lN=ENS%G}U;vjb? zhIQv;UIIBh0X`wF?gc&`9v%zk&%Y@v8)SX(6i87?kY6x^!?PP{K#sDfi(`ny<>Z6~ y0tWxto0w1V91Bn=IB-58YO6_BD08iZ2qS}G*81~vo&qVBbVpxD28NCO+VjT6a=URO8mVZnP{%)ra{9G=$2WTXNr>mdKI;Vst0G~!cr2qf` diff --git a/techage/textures/techage_appl_pumpjack.png b/techage/textures/techage_appl_pumpjack.png deleted file mode 100644 index d6a34db839ed3894c47876f088697ea1e1c6fd86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iR|6iNNmC|AyLEkjKbk*E{=|d z3L-u%i3-h(M;JFNDs}QCWGZ+IXq^-2Vl&_cf&>M@0L47UNH71~v{xlrKvNk!UHx3v IIVCg!006x!j{pDw diff --git a/techage/textures/techage_appl_pumpjack14.png b/techage/textures/techage_appl_pumpjack14.png deleted file mode 100644 index 5bc4fe6f2aedc5e5391dc88afc7edc90f8813cef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl;P)Emsv4)78?3h=rG#mI`1RA^-pY=Sf6CR9M69S%SGW~$1KEEB ztAAH6X+nUaK8!}OAm+Um+S0cZGAQ1i(5DkxI?)PcVsIMbW86Xsi}1?p#>^YHTWY5q z&+Ry`bZDi$6FK#weW=ihUcU;}LMc431wUq>uRg0H^=L5(eM9JD0vAsg#}JM4$sD|)LP80`Wo2SOXvoEz%D~xSxPX%*fkQ9YDn;o-U3d5r^N- zJjmN@Ai(0R^SLd6aS2lpv+f$}1AnIr{7DsF@Bi=ojCtNZ2IHfRiDR1w>`v-+5?|0>2;mEbPM7B+7W%H(G zd`gWvOIZ|7D@8>2pVZ0C;Q7lpZ$=;EHwh1*n%M4?TZg~=;$LUVu z3PLA>ycjm=Oqt?n$t|bDW`?N2S%#s{Y$kTk(@&?AN6jp{{rGlvLTgWuf60>xv{Rwj0R`ns0*c z%kQ(V^Zfhk(e>%GuDtjE`)`ZV*XPmo`__8>tvPf4cvg^o{P)jayRO_n|MU0G{g?EY Y9lC!+c%rB~FoGC7UHx3vIVCg!04NS%G}U;vjb? zhIQv;UIICs0X`wF?gc)&IyzC2kzopr04sSiKmY&$ diff --git a/techage/textures/techage_appl_reboiler.png b/techage/textures/techage_appl_reboiler.png deleted file mode 100644 index 956d23ff50e7726c65d1c50431bf64e81ab84162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=BWne(+;0zuLxL4Lsu4$p3+0Xa^dE{-7_*OLa>UQVlBh9SQB5Zv6kxF627`;{q?2UakbY~YztSrJh*ru)FEib{(q}q^737NzAHdp xC63R7Hl)bSkv~~z>Z2%J)4ccH^>@E)7;WWJlj_&(+79#rgQu&X%Q~loCID-kb#(v$ diff --git a/techage/textures/techage_appl_recipeblock.png b/techage/textures/techage_appl_recipeblock.png deleted file mode 100644 index ae14cc95873359852faaa8403c29131d0d5781d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8%R%dqr{p6OGUuKVXT z^(|1Gu_VYZn8D%MjWi&~$kW9!MB;LCf`V{ITU%R`Br6Y3kHV~v3_S-Kk`2~IUG?A< owBeayEMYi@v0UQN$`l5M&&<4SI(u3pfVvqxUHx3vIVCg!04$a$hyVZp diff --git a/techage/textures/techage_appl_recycler.png b/techage/textures/techage_appl_recycler.png deleted file mode 100644 index ddfa0cc33bb20bbd1ca4b9226398315a83d1a5da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!Yyx~jT-^(NtjPtR)=gXhG)K53 z$S;_|<#JceQMOqt@?u{I7<{=et+qqvUX&vP1LIUr7srr@!*9cGZ)#THnNrQ*I_3ZW z>x;v@7i>LJc5e3XM;5atoKADTes@RVKF91ij^ zM7yq;dhI~d($?mzs}~>DUA4Wuy8iyt8LV;)Llb3TF zHmy}P+!D%|X4$W=`(}qm#;-)VB(75mJNB9wEdX&xHa8K0nM(k4te#cKrCg$C8-t5~77~b8AYj(OiUBn^&_L_j) ztXb>QGuPhs*tgOpO+Mjx9D~3$zx#31r>*)^@zCg%JNv~l^SnD55BQrGn@zp; diff --git a/techage/textures/techage_appl_ribsB.png b/techage/textures/techage_appl_ribsB.png deleted file mode 100644 index 508e6f6d3841d3dcb24e5956d5562b4bf69a44df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc(4jvWK?&Rx9Dz%h{xq^KmwFPOpM*^M+HN6FL0F+}2Wa>9dX wRu*Xq35g2l#sv%~B+``r{BL}~%v{O9V87YzTW{=iS)ghLPgg&ebxsLQ0Qom5!&nmJ7tG-B>_!@p~XXs+h_W7V03KtmZk MUHx3vIVCg!0B*)Ej{pDw diff --git a/techage/textures/techage_appl_ribsT.png b/techage/textures/techage_appl_ribsT.png deleted file mode 100644 index 092529624fc380d39bd1caa0e1e5b77b8caaf3f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc(4jvWK?&Rx9Dz%h{xq^KmwFPOpM*^M+HN5Rv@F+}2Wa>4?E v5C7Sl_#N2pYbo4dNcqslNS%G}U;vjb? zhIQv;UIIBh0X`wF?gc(hPELu5i9mtn^IQZ$ib{g~f*Bm1-ADs+!aQ9ZLnJOICoB-y z(4;89VbP#4fpHmYz>|gsNk3_sh7A=G2_{oY88{raFbXsskd#{>67j^qWpajwK#PL$ yjEFMdD+9eo!vCFwb1|N9ieh2#2QZNV!CV za&V>s<&r#v0~R-{T%tiZ*kgSP$|V~DdNX)l)5bxKEh(3kDN)&3f(wzO zV17j(LA2x%Tk1${IY^4Ozho2lIK+iMKT(-}%oW|ra0WQ7Kmh&M*3sZ3=nqgVb3!vN| zUY_^s!~9nt^K#hlMIZCz_G_gR*XIeqrYv~CN%X-B9_H*JrIsBEm*jD9^Kow~sg4hc zsfF*N4|Pl)&-SwaTA${5#(kzPc|;%6%5hNhWOQu`hJXt_|^8&@$OOF?jG^4`m~8rwwoAbyNS`8O^o8YiBUh@JwD?8 zh|!AIO&#@lQ%BWrd+9d4nCgG?FvBLsxaINhEWfRfe*ma4o#!b<^11*3002ovPDHLk FV1n2gx_STr diff --git a/techage/textures/techage_appl_rinser_top.png b/techage/textures/techage_appl_rinser_top.png deleted file mode 100644 index 4abb220338903e9c8c8450de2c0879bfd488dd35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSN8&+1@mY2_fNREy!6P# zxKnepuWxBRd-m*!%MQXoHH;-ee!&b5&u*jvIkP=o978nDubp7XcgTRpwYv2i+eEM3 z+Y4`a9%9_UZS6UEZ{zR9vlLHAGx1OR`uXdpx66KduUr>8x41e#^1;cA_e8mEBF`Ut zHDlh@gZ`BQJhfsxxvYoJHx=qPP2|5S$gxg4Kxy&a=o8F24beNk9&y?wBDGld@k$+? z1)OPq4ctuEWG*{DvG}IMUa_-Vcz4U!*VQT_Jd?h6$nXCXqaWU{eciuS&=2TL22WQ% Jmvv4FO#r?1|86Zks1Vx!wf4Cwo7efo12rq=t^Pgf zDtp$P`DXmsOWrErm0AIxy|dz2I~~Nr|c=^ zep+|v#)fMzE@?ekzSc)d_*}}9(?8b!VqN|GK-+HrE1ZtaRU(0oZFj^zNvB5mFe(4N z+-Lj9Aj@s$#TL7ttp_+3vu#-!A@y+P0%=CBV}{0ewH@VH_}sM1Wl!@QdGzPZ0=_1d z*F0{8%L=!Z?F#4pz|hssCMUIJC7bg0u8dgQy3gNh>&qS8=KtEloy41OG53bkzAX!R zXU{MD{_gS@-9t(}{-)NGf0qc|=H3^uQ=(96-z-VSPck0CHa*=dc+ezf-}-k~ zMc+xDhSSqk&OMxdK=#jxr+WEqhmW~FRNvgaHhl86^=Zq_GDTzc mPze0r&zPcdqk`!hGsDUUlK=XWQu={LGkCiCxvXNS%G}U;vjb? zhIQv;UIIBh0X`wF?gc(hPEJ5xVq&7tjz3-?MI}Lg!3+-1ZlnP@$(}BbArhC96Bfut zY~^w)UK_QQ;mn1oty!!gY)Z#jl1vyR7cF!UXgc%Y|9^WE6NVEBY=$xps~mYYl>Ppn zpz83~MPx#6;Mo6MMrQ~AxS$Va4zo{ zrZsUNT*BZSkT10uSDb@(_#9lKIOo99?o{&(>KxAGH9MEfFgRpP#(!pU4p6zFbGZ!8 zq22ZOKDdOzIUIECgG*%blh{Oiiz|bJSZ{;N)FJ-!`g;8>TIn1rs17cdVQ>(X1}4#l zEY*wQCjH$PJ*^*%$2UcBFWlwjQRS1`?8~N#W_oJqNO-XS;{#?Z?MD`u?R`<0!jd_Y0SykfXc3Xf;vu1X1X7Ax6c8D#G1my{91Mt>z&X3`95QuvE-~v4jCCI)u|<}_ z;pxQ=F0*`q)G`h(b1an*P8(ci8yp9)%KOUTpawj+%#lKN$~?GShQYxn6$h8N;vA}( z3@$N2&cSEZ?EVhw9Kgj=U;1P!wW+}162zQ?;{xS5Fw6-d``98z`MqU5d~Xfss&{`% z4!y*l5d*W&C85HEyy6&19qOan&C57kyb{c9t6QwrOinjE8yhKXf!bANH>Ra9M zh@C_Gy1g8MSlQ+~=1+%DP+B2^mglYC%2(MIenhoEr)ybOowHuH$Jeb?D9?P07!_8| zeNAbZQ}}=5;6vZU8|ITh-e){pNS%G}U;vjb? zhIQv;UIIBh0X`wF?gcGkV19t-BrJUV4ZEJ#sFkY6x^!?PP{K#sJhi(`ny<>Ukf rwkgew6DG2gTe~DWM4fO7tqR diff --git a/techage/textures/techage_appl_silo.png b/techage/textures/techage_appl_silo.png deleted file mode 100644 index ea6addc11141021e10b92d13758ae6d9a57d62e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc&`9v%zk&%Y@v8)SX(6i87?kY6x^!?PP{K#sGgi(`ny<>Ukf z-WDdt856f=UG>T`c=iAPe{U=0fB*llPiXt`|9|)ao@@XAGaukN_G>?%!1iPHtyWS0 gxTh#eIV~!eWGH!S*5c;(A7m$kr>mdKI;Vst0GVY$5dZ)H diff --git a/techage/textures/techage_appl_sound.png b/techage/textures/techage_appl_sound.png deleted file mode 100644 index 4efea6445812aae57e8ed2c6486c61b76f12d46d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NOiWDFuAPeqiZGT0 z`2{mLJiCzwTO1ZRWgr-2#A4jDwRg@z9_Pe`Co6JU a7;YTqe*AX+^mRZ(7(8A5T-G@yGywq2Ks&Yo diff --git a/techage/textures/techage_appl_switch_inv.png b/techage/textures/techage_appl_switch_inv.png deleted file mode 100644 index 74374933bcc5bf5782b4e097597e375fc8ff5ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#Q>iW*Z-l~|DV-83s(DoFKF)) z+uhD`K$)ZV&P!Tt|9?K|<0zi|u=Ng5sL0dBF+}5h@(hg*CKrj8-h&5pB%Nj-V3~B* zL+pS7Gg|_a8{?W&Cz#w8^6)G?<-z2|$iuV7i-S?QqroV~fm3NgOYi{>wFNnIe5@G{ zy*p51)%LvMAft%Gw|yHKnVB~mZe=}l`gC_8=Z*$PcXxO084p<*RxFQb*Ll209cVj) Mr>mdKI;Vst0G`K7P5=M^ diff --git a/techage/textures/techage_appl_switch_off.png b/techage/textures/techage_appl_switch_off.png deleted file mode 100644 index 1191be205999a5febf5733989e778b6c77b08fbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBP0X`wF?gc*6<}dnxFX-W6kM&!({}0uE7OeK~dB?t`w)>nk*x8ttw%bN> z#?Jw1E(!7rW^j0RBMr!T<>}%W;&D9rMh*|-(PJ71WW1scBs3izCJJ!{v|l>)C2+w3 z1~whNzNP?$M~@f;lcho(Tv?w!Wlbov)LOy7y=nUN!@dn})2=CTtZhtW4LPW!>%*$0 zr_ivDLFa`_8`BQy0?h`-6xObU{mvpQe0zPGG#I$K7HS8~mXxwG=In3UvU1_ViJ3b@ zS2&8OJPet@7C6Ce8`C6K1C8RJ;W)5K7_aZEamzVdDhrtO? zzJ(0#vzAO`da`D@W$`nWJ(a@UOcCGSGc@1bUH+cIc$dMZ{~3;6?5xc3pUs3bNS%G}U;vjb? zhIQv;UIICa0X`wF?gc*6=P&+$FX-W6kM&!({}0uE7OeK~dB^TWw)>nk*x8sAB`+v~ zbe0791v5B2yO9RuJo0pL4DmRgoMG11kd!Qvz_(OaqGyW20uN5s70#Kdzcd087?{Px z-5oUq3JV)L412W}ENc4niOFEMjA%#$>&?@rAF4ShduI!_TsyFVX;s2Rv1Lr6;sOrg z3}Pip&Wv|>cZeKd*u>&W69=
x@OIha|^$ITGe+(WlfWibn2P~AqUs=JguH1dU5f!zsHn1H`Ud8C|@jK p{akvu=(5zb$dhSb+PuF#W94#}`DW6xIU48&22WQ%mvv4FO#rLZVio`Z diff --git a/techage/textures/techage_industriallamp1_on.png b/techage/textures/techage_industriallamp1_on.png deleted file mode 100644 index 60a160f3473493a3c33065d2c526eb174652502b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSN8&+rOTJioj>o(yZ`Gq zuD^Hd#iet%r%sz1%_yl4RKr*jNS%G}U;vjb? zhIQv;UIIBh0X`wF?gc)VE?%^@vU>jfnFMQsIY?1SkY6x^!?PP{Ku)Nqi(`ny<>Z8f zgs82n8W~w0@Ep71!EVrO`S%&)B1wybpZ?!}_5a-e`tHQcjEIaES1xF@g$6VTG_F?k zG>rR@dv(=M0k;f|DU4TIn;DHH&oJC>Nnl{8yA*nP=F^|cfEF-#y85}Sb4q9e0FQ!5 AtpET3 diff --git a/techage/textures/techage_industriallamp2_on.png b/techage/textures/techage_industriallamp2_on.png deleted file mode 100644 index b35eeb50df0c3b47e72698f9135f95c38b768be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(T=KpVNOiQPNS%G}U;vjb? zhIQv;UIIBh0X`wF?gc)VE?%^@vU>jfnFMQsIY?1SkY6x^!?PP{K#qZ@i(`ny<>Z8f z2T@zI7@0W^NUjM!%yfX~-p~775+~RT-WD)_jA(3k>?vEdTi_4_gL#4qt61&*X+XUU Mp00i_>zopr0A^7#x&QzG diff --git a/techage/textures/techage_industriallamp3_on.png b/techage/textures/techage_industriallamp3_on.png deleted file mode 100644 index 1ab99aca3d8e98775054152e95b0cc0da5619544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc(T=6^%O{|pSRHonh6ib{g~f*Bm1-ADs+^gUf1LnJOICnO~B z^71AyFj_QgXFp{!Xx9J#oQ>@hV~q732b-`5i2{q~zS3(kV7Tg`IP>GPNxnd>44$rj JF6*2UngHHWF2Mi* diff --git a/techage/textures/techage_industriallamp_inv1.png b/techage/textures/techage_industriallamp_inv1.png deleted file mode 100644 index d7fbb6de312e3eb530098fd3ec35670d84fadd26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmV;J0cZY+P)Px#4^T{0MMrQk-opY-6fgd00001bW%=J z06^y0W&i*I8c9S!R7l6|)lqVTAP@#%9C84E;Q;B@17OJkg7yAq>Z%DLm0c#2mp+uq z8{h1|D?yFqJlk8>b8%K&Qys)b|_S1<}^ zl`B+29$;Pp1rhjd{}__@_X0%My2$&-5c_MNJ}UnRccNllkHVNsDXNDykP@=3Sqs^M z=2l2ofX}KpJ%Px#7*I@9MMrQ<{`ai}1pzTGCDP52T39`fiD<5>d3QJB zkpKVy0d!JMQvg8b*k%9#0rg2lK~zY`?UYS#+b|4ZjMtDq`m=Rg&CJ1zuN%XxCF(1Ixrx{vS2^d41gI*T(Q3az74ZLfjwLRGt9zB zb~OOFRKmzr2XJMuY(gGrW#LTq)r7S%@6n8BUvlNa-AKWegc?U52;NPDx zotz8p0GY+?3QFJ^_^ILpTeScsq0WW|7cq^KUlOovkMa}B@?i7D*}+jKKvtflTticd z2dql0MQ?6#b=UwPx#El^BUMTUia1_lHF00RFnFaIAQX%iHn9Ud|X2~rOa z>nJJGC@6GpXTefWopEb0GcfUn*PQ?W0qRLaK~zY`#n!z`!$1@O@XkiT8zh}ir-C3{ zEW}BY`vY`|byK7f+%lzWhvF&*KN=i_(v}tnoptEoW(!>f3pyzX{TsYoK6;njRiUD9 zD5dw~()aRmFS*>0WBASboIjXK7EU3&8i?1F;NuxWXzDwkvJDh10H_K&l3m_o(9jAZ za;Iu5S_B|0WdANu5shsM2ns5rEbhfHd+W+mjiIb{P~*zGx5Fv>dGX} Ts8sGB00000NkvXXu0mjfE^Gr9 diff --git a/techage/textures/techage_inv_blue.png b/techage/textures/techage_inv_blue.png deleted file mode 100644 index b8d75c17a492bfc50f36dd921b5c092fe61427ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%B90G|+7gRJ{p`BOk@c|2VlLpZJ{Cn)d&c?JxO$5*xX0a*;5u6{1-oD!M< Dnco;L diff --git a/techage/textures/techage_inv_button_error.png b/techage/textures/techage_inv_button_error.png deleted file mode 100644 index c01e36a0eeaeee953d064e8e5da7c37251997f84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)Px#Ay7r~mHm z|9^k~T3SM?!YTj&0MSWAK~yNub&*R7!Y~kq$B+Y<7JRK@mjO z1PCsI4N(<=V~tXP<|jjhngU5HqJ?F!mMo5+?1;Kd)DV4HluLh;$s-;NeA<2LPq73?BgdnAVvWXdK&i+ep8R!IVui3O>ahYM& m+95h@{9XYu?iN%%3ei9RxhbR}suC#x0000z}|NsBO!o%wS>dpVnvHr0y%`lJtk8u5P-(HSS0003wNkl$@!Ab)$ z5Qc}8y*IlkR4>_-+`FAxi#Ksti(VFGA3*HEtJs4Nu;5t)@1idtzM%6@iYPcN$>z(S znaoTm#N=Y^q8aIzVkmUBkuZk5rK;5Tol{tQ?<-bo^ry_g)2eRo(F(IG~&`9%Gwko-nP#bt|_f440vRcLA*8qiGm}&$4Gs=A;A;% zF^f6My_En_9Kcf69+Jf^fL?tiki0N|Ar~aK6?uFTB)JzY{bPY?M$I_p0u2BcxnjXe zsE6+O2mCJb6{WvzaQ`%FXJ}?{F;SwvpuR_6i=s!vW9YDHFCw}04Wsp2yBnW!Z2$lO M07*qoM6N<$g0rT%N&o-= diff --git a/techage/textures/techage_inv_button_off.png b/techage/textures/techage_inv_button_off.png deleted file mode 100644 index 355fee5cda4e3b8eea7d90fed5582de193462993..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmV;(0XP1MP)Px#Do{*RMGPbi&CSiq%F6%$|HZ|{=IG`qJSi6}7`(o` zK~qBa_xGZ!qJfQpVsT>%f5I9700BHnL_t(I%Z-#-lEfegKn00QjQ79pu&E?dQ#E|p zHa=xf0t5g;S@{Qom@)zB-jTCMSqPf}uRF4##-e|dyz-~035-CU{R?0O>d1LSfG80K zpjl;s0Tn7Z#*K0tOt0Si-(0+2~P;nXe@Ewcn5KcdC$ z0~-*XM=_LMPO1+NYg*l53O>~b(oj=n3->&En8HV(ARlzgq!=#@TsusX92mgP==uUc z09t@2%>mMCl09vKdD62L4R^Uk1G`G)_9&3R!xZ;-p)0rrz3rLQ+(4-;UC#A^2qYA3 z#xe9b532>hu4d6{ENNEFSJRep&YyZ(E_76Hw~Ak1Ef;&T_Bng(N%{c4<^umSI3FSO y`Lj8chT&-yL7hh#Nj@S|;d+72aEFh8Z0H9=*$Dz;pV!a;0000Px#Ay7u~QqdE{5IP$&bTxSD zXee~8p>$5(z)PPqcc+iIrH3TY@BTX72N4+}@}y?s4&{>15rftzo@O$@4iS7HpcfcBVyYoTDD!3GL|vt4@u0~!Y1h=&yPf=>bWcuG%3 z%#z0rkD@RuH`TqpG}fVx3I$bPz_S8LpTS*Px#Ay7hqn*;$NrF zcC^;-_WERQ)^q>>0OUzTK~yNuZIVq6f$YwZ~)P8 z1jEjqVG9?v!|>BFzQvS$nZA~G06+kM3%zs@hRmml{kN1-M@KPv3_SLvHv>76b^@dg z*p0erI`jlLjW8ioF@qJRo>ewS<#Rw8%JK*>)nN9ZjH%OCRXrn&)s#{q#yUfdW$Pxt z diff --git a/techage/textures/techage_inv_button_warning.png b/techage/textures/techage_inv_button_warning.png deleted file mode 100644 index ba0640633b1e2d3041c158b91caf9b7b6cd6a209..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmV+{0n`48P)!WZNJ&Jz(n&#zO)~%h0Le*2K~yNub&*{P!Y~ZSW9b3x z#!%mC=mjJ=eRb>t!zUkycmVMTp1>R1kEE`Xh0?&U=|5ippe=wu!GhDEF!*pIC65P<`XU`y0SfUHpq(EKGws5y|dB3fAnjbuUovLhM_QA6}$ zQ7-*Wri^$o@M-s{m$UQ&muYjA2PxuyoV8!K30MKmQ^3;1%qXINBLpdZC?=MH{gpm4 y&Zb5aE5d8%gkSL&i!*isxjddOjv*Y^lM@tpfjk2S#^bA6`+zJ4Pgg&ebxsLQ E0IH%GqyPW_ diff --git a/techage/textures/techage_inv_invisible.png b/techage/textures/techage_inv_invisible.png deleted file mode 100644 index f8e65ad852d0b6c1a8f710aac43761387c33e7f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(N{{R0!f65|fpa^40 zkY6x^!?PP{K#sJhi(?4K_2eCMcfU1rW@ctqW|nA(Y;NH$l4AH9%6~jGZBYhL8H1;* KpUXO@geCxplpt>a diff --git a/techage/textures/techage_inv_powerT2.png b/techage/textures/techage_inv_powerT2.png deleted file mode 100644 index e49c0c9b3c69a912febf9018e962cd01cd5170f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICC0X`wFMg|5RZf;^?VnBhAprEs7&n{cCWXhyTx!KuW9UbNqE(if7m`j5E zf`9z^X?v1sKaji8)5S4F?Xcjj|#-5p}x9@$fLQq?DW>mrp}r@7oa-(Iax_|2Hci#X2 diff --git a/techage/textures/techage_inv_powerT3.png b/techage/textures/techage_inv_powerT3.png deleted file mode 100644 index f833cab8675b6bc106f83769dd72b2814020c466..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wF?gc*iWffPioLDe_+Sz&??LzH$4@KF#8}mS_OM?7@862M7NCR># zJY5_^G|nd{C@>pvDKRoCu}*o=P{Ej*Y+!ImIYCP5)uTr~sf@zn)3mdKI;Vst E0Ex{PzyJUM diff --git a/techage/textures/techage_inv_wrench.png b/techage/textures/techage_inv_wrench.png deleted file mode 100644 index f95cc5558a3ef6f3309383aa57bbeae9228de64d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T!HkWMT>41>Er=fiJmTw zAsp9z&mH7!FyLu@7;jUtM*52Ht2EsmGae{4ackVOG1(WuQv9Prk6)`R;*<~~VrkKa3Ui8p7h SzJL|bG6qjqKbLh*2~7YKZ9PW- diff --git a/techage/textures/techage_inv_yellow.png b/techage/textures/techage_inv_yellow.png deleted file mode 100644 index 8ac93436cf5c8bfac4d0533ab0b3604f7c9b7bd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%B90G|-ok6#4pqy-)TxjddOjv*Y^lM@tpfjk2S#^bA6`+zJ4Pgg&ebxsLQ E0KEAb1ONa4 diff --git a/techage/textures/techage_invisible_inv.png b/techage/textures/techage_invisible_inv.png deleted file mode 100644 index 9374d177ff668d5edb99ef44d285d27cbc36b8f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBm3-AeXbuaMY;AC+4owooaT@vIM%;50sMjDW_+tbA{MC1I`iyH--4R}~D zy#Flw?hKPmu|+x0WI+v0*Qu&TJ?@2O2`w+YwSrO@WA;8$ewhE@xeDhL!HDPwD+DEP zI=entDEi?7V@N;4&T5t&HcUBkjA{K5D}HQfqddyP4l0wd$2%~ ztM4AqRO?QiT@42=Ol{l7`bzXczf{HdXvh1G6Ro_1H*9y?u*7S_HXYANqLz~?w(53% w?U;3BmaEUxZG5<7>*u2sw~9qEHUGV)L|*^)?SGztfw!rw)%=lOzCA6b~It`-jukC l^M;ICy7G)lFP$o*zd#e!?TqSVx)*_-QRu$M!qS z)JC3610&ToyXA~QnoFmm(#5VHDg`umRPL;jVlE*_W9FgC?t3aFmO9I(RuR;H@&{@D Y0DrC;ce%urrvLx|07*qoM6N<$f?$HS>Hq)$ diff --git a/techage/textures/techage_junglewood.png b/techage/textures/techage_junglewood.png deleted file mode 100644 index 43c37339096e8396abe32d6e4a3837e7b9867088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uI>ds7V13SrlPWfj32*# zn*tPPED7=pW^j0RBMr#0^mK6y;kcfh5VQ4CW8=^N|CxDu7B1xD=~=0uWU`u3>DZR6 vP-d5=%xn#xSdoC9%v2GNq)KLHEe3|)YeXjdsW~y9XCZe2rn=FBX zj3q&S!3+-1ZlnP@!k#XUAsp9}6BwA)*nOHNrZ90Z^qys&98`a{6DZB#>FVdQ&MBb@ E0F2)m4*&oF diff --git a/techage/textures/techage_laser.png b/techage/textures/techage_laser.png deleted file mode 100644 index 43e14f69030a1f0e8c5a2dddc86cba3f2478b93e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uI{WK(m38v=YM-;L#7H) zkhvttFSw(lgEe#db|6>W)5S4_<9c$!0dA+phD1>T2Mz;qeFg@5dG?bP0l+XkK6eAtz diff --git a/techage/textures/techage_leds.png b/techage/textures/techage_leds.png deleted file mode 100644 index d5f2e60807e1a7a1cd62ab4a90188ad049ef426d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3705 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 diff --git a/techage/textures/techage_lighter.png b/techage/textures/techage_lighter.png deleted file mode 100644 index 47ec8ccfa443a5cd1a981af4976ba9488c8f8a59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 762 zcmV-xa0GcCq zjUiZZ6hQ>7bA8!_WdPi0h^{quQCNX;=32>OGIjuphA=EwaXDPVa?Q+95FuRvMI}NK zXqv38>?ciS0R|$C04t<6RU$J)Xr0}iRYg@GEda`LRb(Il5fg|sNcfrE+MWO>tf)g# z5fw9^a&yrD5s91toX+jpm}ZQ&Kh)ta^dLwKAH$=#&t=-+<+Rvowt)>)(09Sg5GF-?s zB36y_%x=&(ivY-`SKZklC3Z0!+BeODTuJ~zuf|6C%*cq`INUYV8nR3P%y)Zr_ew-W zG9t}BXARU%KOXJ~ros&@ECyhC$0D7lnwI_U*Q6+qV z0(Z(tM*w6*ashtHMNFB7td?;^WO@KZrBzj$q$oo&GR8!tHG_))Mx{-LL?=)-AbV3Se^4ThWjW+}B=oWb!#5Y$Dh*yT8skkCwuw`DI2^8D zEkP<6^^zo#NFnYs17$21`P~4WHyHO20>ODLBwD;90007jNkleoV-4>O6It&)4V`m-9zBjgB6ilUS8Al>AnOPKUu(zU0IH~2pM0KYp-G0E z3tx#o#!u(X%*Gf#-}h~Li~X-)#T%PrO0jHU8PBm&nqTL~K_G#d9jO@Xj2bDWcrdvDFY70&nM3y{_j1K%jT^`Yk0Z35Eg|ofA^jugd{S z08o72dzGhxqzQt?Ot2y>#^N1<&`9@vpI!NbHd(7IAO;Eu`~)&khc)0#UP$XP2IDI} zE12%^gEMA^trrBK2F0>g*lktUgS}HKh$xF>kU+_jQfs=xfD7`L5v&3)FTsDNh@rFH zsSNN24>kZq{32U7->DF@nw1YMjw#Ml7!X8)SLTUh5@B9~6KB-7FWX)F_tFsdOz|?OLwwEj~Me7!X0SHsQ(U_UPdlw z)6d2Wbauy0ROs!FxDJNCI-csa_fw#CyU;Mk_|$=4|DnaG)B!+@PTc`e;m9X00R{d8 X-Uug8Cr#aQ00000NkvXXu0mjf{`6`4 diff --git a/techage/textures/techage_liquid1_inv.png b/techage/textures/techage_liquid1_inv.png deleted file mode 100644 index f4bf71ce1c41d8fa476ee3aa3f847b882211b04a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBm3-AeXbuaMw|NsB|DT|yz(j`HD!3+-1ZlnP@hMq2tAsXkC6C_wQ92m?G zGc*S_%noEs{&OJV&%uO0htK}#Kbdjh@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBm3-AeXbuaMg?CMlG_Fft!T@vIM%;50sMjDXQ=;`7ZqH%ud#f`iT20Sbd z0XC;|V!Ijh2?PE=;SAGv&0jEIhbyrtG?c&hIBKJ>qnIRg*MzS-pU4j7!0Z-1Oat o`1ZJa+&OMGXUFHih5GMVPBZTRtx)6M40H^Gr>mdKI;Vst0RAsrvj6}9 diff --git a/techage/textures/techage_liquid_filter_filler.png b/techage/textures/techage_liquid_filter_filler.png deleted file mode 100644 index b89fee99beebcaa6b1a772abcfdc38ea9142ade5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8&+^z`(vS3_PMa_T8j zyS~ZVC$4)7P?oVI$S;_|;n|HeASc+<#W6(Vd~yN3uiYbc5l*R%tlt?k|9$A^y`ds%}G`zp$1zf1ZDW> zSZatZuJep?P-S3d@HCa1Jay8fY|Ev~mw0%(t81vGrlnL>m5HaZuL5dkED7=pW^j0R zBMrz|;pyTSVsZNHBul1d10EK`AN!vC-*49EG-qp|v+FXG%Lcb{e+%!qZ~ZDIeakmF zmgjTg7#CjCW7!_?TENS2?uGy^j)$Krg*tdHn|^N2;8-i!c&$xfv3SSFz5<>%3@vkV zz5dLwE4Vnvv0{Hzz!a~|3U`x)mP9uQEH3GOslO!p&dUq4R2;Gv<*U9(c^I+O;pAn@ xH(S_OGIQAM^k$zS)Bo*KV${|vj4kbzjIrGO8>oXa{B-P diff --git a/techage/textures/techage_liquidsampler4.png b/techage/textures/techage_liquidsampler4.png deleted file mode 100644 index 7e811968954ee8277265480fcf5291c995c56fb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmV-30?hr1P)HS{9SZ00001 zbW%=J06^y0W&i*Iu}MThR7l6ol)-HRF%(2;!K*ZYuN++glIZ|PG!R1t>ofpy3siuV zBiC)g4dk#5a7YWAZ+q+y>>d$e_QH;kcK-PJ&t?yiGHdOZjz-smY6 zs?upA(RyiY0pnGqsJuHqw7%sdB~Lhj4_R>lA2ihs4uNq9(_D2m?_>gyeTxr^P89v4& zSAh>s4nEibAKS8EEgIYSgQxqnHwJucJUPig>wNnC6Hov6o>J~88w|et*dHGh)u*UP z%KH?2h^FKy+p^yMFkR57LRI$(mb5zK7{sIY#~=8KvZSUTB{~2A002ovPDHLkV1myU B?7jd1 diff --git a/techage/textures/techage_lua_controller.png b/techage/textures/techage_lua_controller.png deleted file mode 100644 index 450dc9de2d2749789e6a886c53bdb9b2239b0dba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICa0X`wF?gc)l&Y!;jBV&!6D90Qph0003c zNkl1pw6b4|KK!;9!1U#fo3qC=DuHY+p@K!Av(gSGiQs@OVWb~>jo^^#> zA@l};oS=P{WLt`4heCdY9_RxkzD2fte_r3~2?g&Le62a41SZoNPL2*DSSVS)SN8&++mD|DdEvpq89BMz zHf{R3JB5dtd3JEHkEYlPpaf${kY6x^!?PP{K#rHEi(`n!`Q(HJVgXFdDvYj<3Ia}I z1uRS=jDiXZfvjx{C76!2WiW}gWu!5LT1;ATXpW9(Q-;=&OBX^Ga3=gv72(KO&lJm` asl{08D7Js^CYE@hsSKX3elF{r5}E+{YBOd4 diff --git a/techage/textures/techage_lua_server_front.png b/techage/textures/techage_lua_server_front.png deleted file mode 100644 index bc7f2e8cd7764e6e401a7ab6b8b849d3af5cedd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QlbGqA+GKPK0xN}$4^_P&c1&A zdRRa}$eR#;Gj|@KC}T;GUoeBivm0qZj=iUgV~EA+Y)lIU z7azSK;LEVWfoH!MPou*jEhf&@94c#+1lD(5{NlL$i=x$)OY98RZ92DDF6U+fjbiY0 L^>bP0l+XkKONS%G}U;vjb? zhIQv;UIID%0X`wF?gc(T=IzH%4GfLK0t0#Ow!Q_aD+%%oW^j0RBMr#W@N{tu(Kw%+ zuz)R~$jpsFctV4Mkbs=1g1bY@1}?!vS}q)`1r9D|VyF_6W3kCOy%MO0!PC{xWt~$( F69A*oD+&Mr diff --git a/techage/textures/techage_lua_server_top.png b/techage/textures/techage_lua_server_top.png deleted file mode 100644 index 04093dfe4166ded2ebb1b1429e1111fb69a64680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8&++mD|b7#aZuJUl!b zWMf-_ET)nmzhDOKTlyvyK%T0ni(`n!`Q!uzJ_}98My^Q>n+ydc4puO|VB%TK)Evs7 cto4zR!Tp%L`vP%^ZlDGRPgg&ebxsLQ0O9;0D*ylh diff --git a/techage/textures/techage_magnet_hole.png b/techage/textures/techage_magnet_hole.png deleted file mode 100644 index 5e00e1e66a11d994636786bcc93cb26e814148a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NO08UGa+FE|MHowh z{DK)Ap4~_Tazs5{978y+C;#AQ;SmwEfAUdKM2eq5$F)kF`4@)@PyvIdtDnm{r-UW| D*xwl+ diff --git a/techage/textures/techage_meltingpot.png b/techage/textures/techage_meltingpot.png deleted file mode 100644 index ecbea25f6453915a4524ba4521cb1b985a02a113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wF?gc)ZD%=<6*d3l(xUVz%#G2j-F-Es`DL-TkZ3k&63GxeOaCmkj z4ahO|ba4#PIG-F4BqCC1X2!>BS|}nC66BTap(P?xZfM5OYsP3aWy&duDI%h*v2!Md d^fXOmW{`fy`QBgM{tM6m22WQ%mvv4FO#lE8H7x)D diff --git a/techage/textures/techage_meltingpot_top_active.png b/techage/textures/techage_meltingpot_top_active.png deleted file mode 100644 index 5fc447cdaf632a044936b72890069dfd6b74b808..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551 zcmV+?0@(eDP)Px#Ay7mqgmw^k-@L%Ye%2O<$KKN_!XjHEKB1NKK z8dieG>uY@qk9uAFQp-H?=FrD%vR{5DKes%{Pthmm$Ndja=uDnOF`J9>bN^RC%rrmh=2@u6H36 z0ub}1r&G#2Cws~IJe)1^Q}odoRO%Dsz&wYkF<~mW>WuTvjs85cB3WOiB>aXSsCFjYq37A*#`_(lddxBQ0T8PEZod#kDys f#{Qj*_6!U{uel|2?sKdHn#kbk>gTe~DWM4fsuDji diff --git a/techage/textures/techage_meridiumaxe.png b/techage/textures/techage_meridiumaxe.png deleted file mode 100644 index 830410e29e8f841dbb67b11d55d1898ea3bc7188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUbuaL-QsED>kj(WIdT_V! z-OHM@r{aEo?FgS^vmU61u_VYZn8D%MjWi&~*we)^gyVX0f&-ggz^ttzrwa7T8w`RD zHM1zJxniKve3o~Whb5zvvE(5ZmJZPbffNT;1_nvi?WsQ(><4OR@O1TaS?83{1OU&% BFdYB@ diff --git a/techage/textures/techage_meridiumpick.png b/techage/textures/techage_meridiumpick.png deleted file mode 100644 index b2629477ce8e695d5f26e380c366bb80b03b0cb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(abuaL-QW3avzBe<7d z|G$>ycnW`fGrcO4^WG9ZL!dIok|4ie28U-i(tsQfPZ!4!j_b(@4a{m^1td;yWjQC* zwrNTes{)T(sD|?n)3V9MseA~AzYfr*EQOMp>;S&6~Or-4zF Zfk9_3dt6iXL^Gh744$rjF6*2UngEL7Gl~EJ diff --git a/techage/textures/techage_meridiumshovel.png b/techage/textures/techage_meridiumshovel.png deleted file mode 100644 index 78be1d4243f0312279ab887c5ea7cdfecc728804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv4DbnYbuaMw`mx#1RLoLE;Mn2F zTu-3~cM4uVtNQ!1``bIGcqf5{?XO<~6*HCu`2{mLJiCzw_D*|5_obi;B7UTtmTrV~qyH5w()at2geFEn9z?86aQwOMxo P&=dwwS3j3^P6aBp-i+PgO7(hhMaSXI}@J*L&DW`O|;=;Bp6X90AR3_ ztgeYojmW~dbBR{I_fXXi0eLQj_U8TkH4UB(0HL1aWi~PsSRv6i#$`ZYa|o#%V+?Zw zID0_=F2p25BUofQ^#`_+BBjOas2%llVK{z!9mPi^Ul3gozX5ZD$1d3_M}Hylz<~4- zd_rXN7!VpSG$uZwv^k&;W(O$h83DZ8y|#j>4*;tD8GIgAE^K?%ws6Q?d)EfQR@r+i owZ9#>m(8Dzi*5h^SHM@uf5kvFz(ct}djJ3c07*qoM6N<$f=uwBO8@`> diff --git a/techage/textures/techage_mill_front.png b/techage/textures/techage_mill_front.png deleted file mode 100644 index 97351d4cee7ea3823a1ecf88091fb0419adcba8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8&+dGqI4Yw@pLw^mw! z!P8V!bM3t=Kv~9;AirP+hi5m^fE+zf7sn8d^T`Pb25d~~R~1AB&N48yH8mYlU=*;` qa#+*AEwF$?;j*&_!!#ZR69&8WIuokcZyEq~GI+ZBxvXm32-qJPNEw_BTl*05>UrcNydkaZgYCoHV3)Lh%DpqA^CvM$^@bG2`FZX= z$I&rLpN%B?8YGFIBj@-rLK;aFKSrYYVzv^0x0e zAux`)npEAw6>9Sjz6G76d=!aRgO!z2qNS1STKLc#bF)LKrOpI;y~g ztz?lxO#sT5$!8?s9FYpi*F!$ADnX%&8mK9szBdS)K(enbJr*)OsZLMwaNSEwfnisu2(^g3LKfOIBS$8m3B=?gOd%b} zX%cb0K9irF5gvy9?vJ3CDF%9f&p>=oX9u-4A_iiJDXL=lEurP&h z+9T{kqSu-=JuZjRzC3PonLz%kDdtSyAn8wfdQjb{u;4AVs`!>vOg_V72K@1mtl_IF zG|dJ>_SKy2R#jQ&vUpoRQZ(KK;veItylaPJp(>*jbzPlDishn`?Sty^Z0{+^4UE5X2>>Q^ZoK4*Z@`8 T7xUD200000NkvXXu0mjfR*_Z! diff --git a/techage/textures/techage_mill_side.png b/techage/textures/techage_mill_side.png deleted file mode 100644 index d7ee649d808e1676651dd262cbb1e77439755129..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmV-10nYx3P)3K~yNuT~bjF!ypLd z3f6c4A>F_B3TFQ{=>@i>_dmiwoZ@JT@&ulM01zBYt-MqRB8~{<%ZRlB8(|Y(q5`tT zENW*n)Dv?Sg#W}@0(C=z2pxDi?*N}9&X9-M0FTyYo{bubD$D}V^dO3o!-R;3Ztq)H z1u{NLc^LqYPbp6epaQKtW$7N1I_{x9w#q|sanS^S0u$NZ>wKI6S`njxgN@xNAozyS0 diff --git a/techage/textures/techage_oil_animated.png b/techage/textures/techage_oil_animated.png deleted file mode 100644 index 7b9937564cc96115d316913cca6e90cc93f1582f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmV;)0XF`LP)Px#22e~?MFRr@3JD2o)Bgbg00Ci1L_t(2&wY_QPQySH zMbBgc4hoV}QXrg?GG&0mL2Sfg1)*~R*wC^F1PxoDbPx+*2TX*JC_ z5iyN8Um^`j15!z85lo?6LVHxLf0!4OoKvrBBVVPe6xFPvD0qU=z*XktOFdshW}3+q zZBUmE-QmSQo$H71w1y|J+hw~)vxn%>9v}!(WM*IYtilY&Qdd`1w*-EB`_GQ!@pw2KhO!^3sw|2M9}dUk9|j+q zqU`&s>HDU_t1Qc^Da(Q%tG4M-S$mE5lIdlDGB-{q)4nN4*UF7)gxQMRRxK+5{p|+BjoWRrB5_anXP;-7Gw@M-U$1WIHkzu zKP(^slw#}vKwaW#K|#Gp*^&jQQvlwmQSu~!at9y{Ll1}|&dai57^JRMQT2Uav=kz| z+HUJ%C89x=m6SZc-o*Pd!J;itP+1%DEkM_|3~$gajhH1?6jBosq8HSI6#yt&=e7WE z(;#IcVa8OAI6%3{S8_o)(ID)|&bb|ft{xzf-ZhCk0{T8hw`o9sOFJgzl+|Vf;Jxnx z;-@Z5LnUTYN>wb&Exbr2Zu{W1cFrr~zM{3M1OB{FnBWmE25v{tU6wZa4)3~dssmCP z<1qXkKzSd6Gj19tLeOT6X`1SK!RT<+bzRL>!2!U9+8I;(F90O3Ia7DTEqt0J-?ZES zx?ofQpi(B(bqF949wdNH4Gc_lx7-Xy(gd*J$|zHJ9>E+Up*D90IkqccdCnj_IZV1NmyuS4@pajaAN>dlfU!+{{v^OuV`i zAOZkfeG{OJhb7KG0GJ45+zxzUR<7!M{DQu7sSsWSP|9N`o6*V5n+#MG82$lZ!F>R* z0}PbV0q3$ifE&js%%ve<5BfAL8-NguQE?p6fKC9k$sQS;=FuhsY?h#rYXh)QyVJ=> z4yD|~PB0ov0AYeyNe6cEs3rP@>R1S447S4qKyFX-yet$V-Aafj07&Rk6VVE59sx2l z&ew4yi!lUgo8<{0Wu^xX|CxtI97l*5e#QE4WN&Y02Tn}_xHaE z0Tz}P?g69|A>QHwSQ``H;<#MT>-$G*ZV(I4fh_>}r=g8PJ+h62xWp9{K0iN1$jta> z3Kr?L#!I6Ln-kH@%e=1ZUmu_A`+B_**aKJ%4O-)k0=59TI?d3qt{>|edj@RA z7=c3vxHwRV*+UR9$1U`DDisx zt%9kU5F-%IuK`j4EQB>BoGGk((tWFI?heUm9X02cUR!$ZnGwQ@@8zqz(Pxh>zrIXrbuK{uug&`AZIY3gl zO&m1UlYq^?`?;R$v{FQ~;pB?xr2}1*?PTru&kOjb{*{c4Z&gy9EYy@oa@h}09C@k~ zStNicDtODL@pC-3g*d>4ih82dfd>&$iI)HNnMq5^CSpWb407*qoM6N<$ Ef)v@s3IG5A diff --git a/techage/textures/techage_oil_drill.png b/techage/textures/techage_oil_drill.png deleted file mode 100644 index 95a9aa6334532bf0fc8f2b902dd961efa6d83623..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wF?gc&>85t7t4kaZeiW)wwJh~Qkaei0tq=8hI1o;IsI6S)n;@tFf zaSYKoA3O0b?;!)87TJvse1{oqKHQs}$Z(2fis-KYJU93hb=Qh4pZ_lAf5)tqf(Fcg z4HO@RF4fEkG3>BEZ56NVe`xR%ltN-@)rjhb|jO|7aAi_}6qsk=tap@au*b3nK3w zs9k>GZKJM6O!_t66Nd~OB$sYqGGmkFmqUN1y**yC+29-F!bqiUf=OQ8?RO_^&rbL% sb4Rah-GlpDmfPgnU6X%XZTrtS+sts2mhf+PpeGqTUHx3vIVCg!0J*G(SpWb4 diff --git a/techage/textures/techage_oil_drillbit.png b/techage/textures/techage_oil_drillbit.png deleted file mode 100644 index 7ef8775d1257e7d5d5f3dbfb4415e3309079b169..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?ST-3xql4LuxOqJqM*^42+pfE1Mk`2{mLJiCzwNS%G}U;vjb? zhIQv;UIIBn0X`wF?gc*o|Nr+3&NH`(Ov!9gQc{}1CKU>lWhx2s3uci1^Nr;SkZ0!U z;uxZFJ~`n4Uxc$W^Ms#g7CIy}=p;xBHgUW1YX2aA9h YLr05DwJWo(3(y1xPgg&ebxsLQ0Ox8m-2eap diff --git a/techage/textures/techage_oil_tower1.png b/techage/textures/techage_oil_tower1.png deleted file mode 100644 index 30acbf2575ddc86bc3df5bb1487b1c965c0dacdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-~$P)&u!t!3{Fz*-^I5O6hI z>I2X*De!REiiWP;WSiu0$DPzL<7huPrmPFPiXUgXGB)@&Nk`}4+nCdr)HUnvBHw&; zLi?WTBaLbRlj(r&4=Vk*`3WK~?YO+$0~0b*M{f*a7p&nM6d4D7qs$5Prhi%b1gYtt bPx|r)NeUp9Ect+A00000NkvXXu0mjfQ8I>+ diff --git a/techage/textures/techage_oil_tower2.png b/techage/textures/techage_oil_tower2.png deleted file mode 100644 index 8ce94d9be7822d48aa7b7285ce4aa6d29490c0fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmV-90mlA`P)g%^kdO|5 zm;oBIK$~{|nTn#c-XVzm^9o?=P%f(H{hc_~GdOQ&)?$`lp19E0?$Mzmp=)zndiZ%} zze>cONaCagS*oXEVdKEmF!N$zqk?0SKsyALc4h)EHyMy)G#WYzsQna6SGwZn zAM}jJrKNi7(;r6;#U`EfHwM31f0OGRX(alfHlO~-rk|bTjOia=H%l11?qtbx00000 LNkvXXu0mjfl-q=m diff --git a/techage/textures/techage_oil_tower3.png b/techage/textures/techage_oil_tower3.png deleted file mode 100644 index 4c9b80b008ff7d7b17cdf8b3d7e7e2463e7ce9c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8&+%F4>DtgM29f*DVm zt^mauOM?7@862M7NCR?~c)B=-NL)@%U}*YzwLaU?#5wlb@97C{yv)qzGYn@pHj17( zk(}^=-8j$8;6sz-Z0QAAYPJavSd8s_8dlxhz^G;VkUeCT18defw(J#G*z#sb?PCsj zdxlrwE$bQf8;V&o%p6KY4PqKPY7#0A^QXRW5H+6RyhP2Q!12t@0|(d*EgKs5i)tOJ zkUEuck1zC0f$*xfhuR@s2j$M3SpP4YJ?#ur8ykbSn%2T6QnOQm?q%?F^>bP0l+XkK DFf^}97nt?%X{g3yR_Q5$$M{q4JZUo8R_!e5 znHS*putX!-QFO}032dn%I_*YsCk`*UlE5=Vly#25TLW#m4+pP&Sk%4dfm8aPX3wdc zoF!)(Os@awEO|25!2J0^ox6OgH4*%qy}3{AVCC+;w3^{YzO2lo2HQnI2QYZL`njxg HN@xNAC;v*? diff --git a/techage/textures/techage_oil_tower_inv.png b/techage/textures/techage_oil_tower_inv.png deleted file mode 100644 index 7710535456ecb04a6801014477cead6bdc22d4f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7348 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 diff --git a/techage/textures/techage_palette256.png b/techage/textures/techage_palette256.png deleted file mode 100644 index 6880d05d21b97c512d9701ecb3a7079a3bb8ec53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^LO{&V!2~4Jo^ZGVDIZT4$B>FSZ_jSzYz<&=zWDjT zy~KL~>n57cF%t{>=eFf01LYE?IK1@v9~C8SiI1OuO&uf4-+v iTy6UM-oKY`RoOcf)&KMqxn}^)W$<+Mb6Mw<&;$TLU^2G= diff --git a/techage/textures/techage_pipe_wrench.png b/techage/textures/techage_pipe_wrench.png deleted file mode 100644 index ebc487a652e86c2e4930d060857b9298c891baf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv-2k5uSN8&+|GByUO-%j=1}@yV zVakp)@Fyru3E6B$)@OlvzZb;(-} z22Dqff_zra7Nwa|yRt-?(>s`*8jddAQ*!U*DQ1td4efgK?Vc-aTB^u5r?^FQf)C@& z4iyC+GeN}z8fy+UXeE>|#x^A0;4pAz)jM$5nbU{MP=J-8(@OE4)>p^rKo>E1y85}S Ib4q9e0I>{VUH||9 diff --git a/techage/textures/techage_plasma.png b/techage/textures/techage_plasma.png deleted file mode 100644 index 1e7cf86a9b2a9924fa9a148f82c0c1e2e0352e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 865 zcmV-n1D^beP)*tERClqfkeok}frc)UV`c(oHC4RVjDNCOx&5 z()VA^xF-Ve86I))qzV8400000`~&z00K5<2s~{0DeydggR0LS7!0op>1rtHH?R(=N z#0J8Ejpy{lwo~aJ^gIM_9#l3iZ@#O{TL=Yj;{DFs8WEKU*zaGBwno3b%n670dj)_A z+t&!d`CHDH0jA@blzX+@ zIbuT>(`xWy3hQ=9$8Kl8%%^raTGcJv}8>J}Lu}rA=i0BAIUr zIEn}`$w`;(#Q{Un0FLu*fV-j?1J~(5iL$8^>Oo9Ah||ItE|t^B^A=CzMm>#j8BrmH zI$CQB>FiRzo6qOb+PUY$$u#MfbL*D#{CGX%o(KT^13c;i0000000930{s91Ze*y0= r;Qa->zkv4_0DymhCshCdI7fd09c2Z&=rt_*00000NkvXXu0mjfbjWYn diff --git a/techage/textures/techage_powder_inv.png b/techage/textures/techage_powder_inv.png deleted file mode 100644 index 4ec099af244a0567ecde001e258be2a238055465..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)+9p=|Qn<+O-eUP^>?aw0rhmu0nFo zw%kyJ8gkkqwh<9YNc)NxBB`v~6pMR%>kDWKC-MA65dM)y;W#>dTcBMP8p0J3Kj9(cdbP zMu{LsSV7ULk6KmgxW_&(2RykM)Cv;G+5U<><-<6_h;krHH9Aq7>zH83v1*nsvaWL# zcR_=7k}RRvO*1_fqp<690`a@W6wm55xJFRER}q4j+Y1i7Ce;ZXCb2{bq+GNp>wIvG z(nE_o9QcBXmw7xq0*E~3qmTyn7D6aOosR;Kh6n&09&W5NrqoX2eiR;4&j!QYPxk?5 z*>_3x2z{VaB*4n}fyOx7r#-EDHdy719|eK?3fY8{NHe-;qv61SalB{Z#iS^85R~)^ z43@kPj=+OIvns}|Pf098gOwV35sJW1^z@_G~?PIu#<2WqIM9gaylD@0kHWC z*(|a)9eME$RRm~h8P|%?`bJ8}ngcp{ru;_u<(wEqeBTHJ25L{G!;?3uLbDR!FJkqHz34tKymVlBQ zBT70S;#J$W%rUb&z^4p7W*j4&>T>dYXM5)^>-I`iVn%I@b9+91_y1%40JNV7d6Dfa Q)c^nh07*qoM6N<$g0Txo(EtDd diff --git a/techage/textures/techage_power_line.png b/techage/textures/techage_power_line.png deleted file mode 100644 index 64d474b7f997a5406d554e1af939ef617987aaa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc)&V$5zzY)J+jdJ{iv2PrBE@(X5gcy=QV$Z_;^aSV~ToSXmz zISCC6YU~=#l6pl9rxt9Tb#rt2`CYs!5}!VOD!R_dxnb6p^z-u?ubyG^Y;>9D=qmA0 dX-gPx#8&FJCMMrQJ763^g04^2-HYpZ2A`LJd3oaQ2 zx#=}EA@#$ZVlBc&*XCGg9g*#k}PW{<*BH-YAT^KR$u-dwNuzka=nmm~TI-**B# zmW!_X_YnE416T*9z@& zF6sg1fN@lLx`jxr0LNy^Yqs4-CA1CgQW^%&7QcB|hXyoKF6f{~3qqlJJ0VJdwqdcRj3 diff --git a/techage/textures/techage_power_pole.png b/techage/textures/techage_power_pole.png deleted file mode 100644 index e3390fc26e9fd551e6c5764a69011ed635596b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc)lPMv!F^x*E@yHjVsxC~NM666=m;PC858jz#w>Eak7aXC3* zf$ffHIk{@vJ>TpPYiTT)!f5p2)z#J4CHKYcjgFJ6wx3p($Ig%xZ@FLk^5+RajSQZy KelF{r5}E)O)HZ(r diff --git a/techage/textures/techage_power_pole_top.png b/techage/textures/techage_power_pole_top.png deleted file mode 100644 index 82d570f4bd16cdd0a3d2edc5084e0296d241387c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc*o|Nnpc=IN231v!W=1bbP0l+XkKUP)t-s|Ns90 z(EzKz*#);5?e6az zwzI>)QG2l5k-ei+Vz$j%e!#wg@!LNhqD;$wo;EDiv1vIJw#r4ZJPU*&SUcroVoc#cJ0Nx7~4nWouq7k6E7`=uB5E&=0I4(%M z(0CR~z;qu3VFUp^fJLlB3oc`s>q%w|OuGAl3HZ7Y01ofDwr?R0&EiSo8zJq;Eyf!= z{oq7`!^d0F5O?q2AKRKqc=-Itv$y@f@3vwRmH_NdEpG&N2tj`5SqzXQfTEtT5TKR{ zDLM4FRsbiI(x388r0zn1V2=p=N7?UunFdtwTra(;qp9h&!Hc&MJK?S}fd`cjx z05Ad|1ISjPIzXC$q#t-jKqx`33Tpr)2uLN!i@`bo4+PW^cpw1k2+UVuHGnAry#%vk zup+>iK(YXg2!ID*jtc7nTnSi`a9#}728aZb58y(8PYbON5XK7<9k=2Cu1D>2e?*%4 zJ}2ELYn-1ZHqDJeN*n%U$%KVEAJcZ$N%!gOT;HHp>c(J{zSyuQvYx>O2BV?{XQt`w zlF-QI`#NJ~n6-}PC$Dp@4`kX5b}r|9p;CS8Fn`((?YtZ|-)}YcWA{mzXnmNxhH-Z_U96>{>1UvvBvl%5*w;GE;gDl1nO;dIDyunJOMdkdF>j$9b`hltdmDdkw zUI{F=hUO2gs02|j3G=Hw%NwAm@(L1&Kc9qROTsM)nTzopr0MJJvqyPW_ diff --git a/techage/textures/techage_power_terminal_front.png b/techage/textures/techage_power_terminal_front.png deleted file mode 100644 index 6ece161e7ddd8800d55914e428cd0c83ed8216e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvl>na**QwJcrKY4@yLK%qGIIU; z)v=XH6aD>n?b^A+&(Cdd)SNjdTwPt0n7fjJ>bH8jIEHAPPfk!^HsAsRhK&jxi3~yk zK|w+SK|w(*h6+qsnGTIxTojU}T@*N1BuRU?UQ*l8Am!n07U1B^>8X$@?3D05Pkcc` zmvX=X)-3J-2TqLzETRtO?5qa_Qu-9k7_Tw31+bmtyK;DLaJZ*o|~ z0t~|rEj@JP2#d;sH*emw#I|;A-rTuS@B)u;a(eO_trw5~9@J{!W7zOU<KtBbBuVFVdQ&MBb@08(iqkN^Mx diff --git a/techage/textures/techage_programmer.png b/techage/textures/techage_programmer.png deleted file mode 100644 index 6618e540b3c384c34a874f8a536ba25ff6e46220..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 750 zcmVKwF$ILwm5{oD;ks~b9)ztd@`lhF<;N{|VTUeNccIr=7vMMs2C^Rk` zBfolt%`HB%shmtwt$!w0_-d~$00001bW%=J06^y0W&i*JR7pfZR9M69m(7ynAPj`T zAOsjN{>kq9zv)UCdz{*fNRGRGh-XsuHKHYOMXCQ9lqG%3e`8^P^ez99gAK1AK8;&g zyXEcTV+vv1V9w08k5?ErxYpjb&Ax#6S%9V!z;f9YYOBrIZ%?r3eEJNCr>k+aktUZcy-+>3oU+Fu*@=+~-kqC>#^EalOivma>~4(ekI&`JU@Cr=sB(T~MYoK*u)5CmZW-Zu;H zvgQZL7O?XrTb|k5a!><6tti}6(?tlY0kDxdJ z|C0ed?f_l>gvVMj@dO5E||0nk}K zLY;3DSotC)UNAw=2wNZNS-pAj{^?3pO1cGqyYMY$pk2vY$qhP;Z35BKB{(}>r0=n3 zAL$y#owR95fR8QsZgOaxrpalo&FGt)Etaa$xrU?kRsI-+dMu51+Dt~N0SE6_dWRkR ze)7#>z+k5u)^$1jg_A}KAWf5LK~B2!dW=^k=aMIu{)i`svhUOFVAKcd74QfYrM_{< g>T}Jcf9l8ZA2Dbr*zoSvxBvhE07*qoM6N<$f-NmrzW@LL diff --git a/techage/textures/techage_programmer_wield.png b/techage/textures/techage_programmer_wield.png deleted file mode 100644 index 6afe96be7a8c6c3a2ea47cdfc2a77fb192b2b95a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 558 zcmV+}0@3}6P)Kwi<>LDM`im$nks~b9)zs=wRyPzB%`HBZQBZnZQJ92wzlxW`$IDk$ zjKY8A&{!44g|_y7?i4V=L@7%)7JjDJ7VH`7Xep z1PAac`sjeidDS_|-(^hjt&AzY3T%Mi_ucu94+!rKH*L2?2tWxt-!d2P1F#3>$@uWo zYQPInN_;8Zmv83He`#P?SdPl;_^JUrh%d|Q`q%Irx|d>r^6B~qoT-H2P@d&%24`R) zvd*JCxBE{BIt*F+_xrNyyFJ~ zkS7DZO!7=40d@|^1a=8NqZpaL=FM{iTy0Pu*ue51UndaZy9jF^^-5xpgVb~hw!0Bo zb1taC1#_EV=y9}*pnhhc0sR)_GRc-#>``p*3y5Snp%0SJAW)72d_9ka^bE_#F~l#2 w)*uwKC_cig*45M?S3B`iv#qMXcf((&e*x_tAFLA_k^lez07*qoM6N<$g0v|782|tP diff --git a/techage/textures/techage_quarry_left.png b/techage/textures/techage_quarry_left.png deleted file mode 100644 index 002be37814cf0753ae5b230b1ca2b9f6f63caa3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKSN8&+IdkUN+S>vJgoK1N zG&Dj&LekRGDk>_vySo`BFYE z;O_0Gp{1j#qsw%qK?JCVu_VYZn8D%MjWi%f-P6S}MB{vN0s~{Jqk=(_14F8~f`g!j ox3;&lAO|axNMoRJ+d@f((m>sXU7VZPfm#?mUHx3vIVCg!0N+_8ZvX%Q diff --git a/techage/textures/techage_ramchip.png b/techage/textures/techage_ramchip.png deleted file mode 100644 index efb064eeb8594326cc1725d652c5188905fc7f45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0Px#9#BkFMMrQ0qWtc8c@7C zngL_dFM$QMQi3d`3P>T9K!iMxV>Ot@t7-<@b^ttfuvhj>Gw3p~*~#?qB#?)+u?-&o z8+P7v6d`TOz}+MgL+7>0k8~y3fRNrtrsBL%OMXy z9`Yse)gu`tUqQ=k>Zl9In_xWkU|#SgdE&nRJ&OW6bJ0L4DbP0jARLH zdAjq-Dw_}?#blKuSpY{`lf{B5d*Mi{I?v!8fUYCiy6jsooYqV4*wwA0PM|kvyn*yl zms?QdO-u@jm8A@6o(%BN#b6G79IZ#JnhgM3vkEX%ux0>eLttQ31F8+>s@zaox1{z> e?eu-~kIOed{f*uAM?HrC0000NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc*gA3dKuW8vlN_l}>wym{-c-kzRUuRrYGe{BBJ^-uRZe!Ut3 zRNGUc_I#eB2FQq#AirP+hi5m^fSjYAE{-7@=a=?vJ#n|rsf1W|Y_(soz&r4Z07&9EpG-41m zaOP=Sn^-p0^o3TJQo(vnetx_2xAxT^C^NB}{q3dUW%km2saAMx&esg`GT0om!W-Ua2&f t&RMy|P zG>GmHH&$raym2EZvyq0GS)rq7fw`HxV1b#VxPzfHC*K05uBHG57GVw%Q5Iz{mJ7T` eHNS%G}U;vjb? zhIQv;UIICy0X`wF3+B&%dB|z`^5tKzhTPg>0~D^!)izhsya8m@d%8G=Xq?}B;Vf^1 z0uO7#V>aFj^Slc-kLCuj8%*T9Q_r3qQfKmU8SnCbrhc=t@uo|x7Va;*#qGg!z=@N| zgK$>tR pcRVVVis}DRbG+7}U$8D-`qW>!4>2*ELO`c5c)I$ztaD0e0syoJRvZ8T diff --git a/techage/textures/techage_reactor_inv.png b/techage/textures/techage_reactor_inv.png deleted file mode 100644 index 3a8af3eda33eb5604221184fec6e89823066c578..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5789 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 byI%Yc0BtQNNS%G}U;vjb? zhIQv;UIICs1s;*b3=G`DAk4@xYmNj^P&&XT#P#~Ehf`)Q-n#SPo3|eyKYexb+|~Vu z&&*r0ZsqzNa-7X+KxH>PT^vI+&Zkb;%h#+R(&{<&-L4a74sd^9TE;oox4AmG$69!e z-@dZ<{418co?g7K*m1>P@!r~5M}5jfs)b%TD11%YC+Xt#LYr~ww1(}A?=0?6bUY-< z<}UKmXNs4@@!cV8ld5L?RnX|XX645*Vc7zPJK9^CE=@}pRX@OZAh0RzC7-%cMwf^z zbEuqY#+%nw++KTYH%<}WYqPZG_}Pi+wWTjV)K~2kk?C71+_dUZ@zGR+ss9U%t|aVH zH`_d~Q?l{e(Tgi3?IQE5wtk8;e8M5CwyAjuPYs*G+dBC*S(SM+qDp~&WbkzLb6Mw< G&;$SpypkgT diff --git a/techage/textures/techage_reactor_shell.png b/techage/textures/techage_reactor_shell.png deleted file mode 100644 index 52165c9d1e35eb43258a23e6c5920e1225559b29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmV4$# z5QWEVK&kF`3#S55Ney7$ z0dPcAwgPRfr6&;vfc6u8>OV=oQE+#H*Wxu?%dNW`MUrk_6mhSAM$hW2v7^}i>VI7 zDm@l3O`fvLZ?#8ugom0y_IqVG`aS-F%}+5-<50dsh43pyH|voso(Sg!B+cub|B#(q zdj+u)ArDxi)E2*7XIe;U#1dRV7pryfiZ`xHp9nbDRcr6ns;3j>NN#oqgI+cLvU6n( zy_=IYLUFfS=12Go$t`owtdae0S?DjCk;U}@p9^@UHLy~pV-+jbe`PPMj2A%D1m~xc nqbP#@J};$c`=RZ5dv4qRp=X;%PbCL|00000NkvXXu0mjf_EX-f diff --git a/techage/textures/techage_reactor_side.png b/techage/textures/techage_reactor_side.png deleted file mode 100644 index 9ac7a5333c50ea63561378aca13aefdb199f7481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3172 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 diff --git a/techage/textures/techage_reactor_stand_bottom.png b/techage/textures/techage_reactor_stand_bottom.png deleted file mode 100644 index 459fb3c7c31dff287286959f27a2d022790c4622..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmV-H0lxl;P)nidPr8uMUw z@Yh+m45VkVSRi@tGgrqJ&{{D-trYz&7Ax>v1t;@jrjZlCc<;guT{FpZ`$$0=eqX+Ad^?uh6+Xoz0{(={^A>BfWBq$boFyt=akR{0F_F7p#T5? diff --git a/techage/textures/techage_reactor_stand_side.png b/techage/textures/techage_reactor_stand_side.png deleted file mode 100644 index 199c2471f52b28d467afcdb57fbf144c88975a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wF?gc)VFCBYv*j1%=*Vn5d%$XbRZnyQDcHB?o%^8q}k|4ie28U-i z(tw;cPZ!4!jq__KUgT^r;BkpPDC+cr=@M(-116<^(=YMfxi7MIZQz&VivvELP|dvc zb7in$%9-tM>;g3n73?`WXEq#2yRz-{g^aV3#mfI#-c5^}sxfii6YhkYp^ZX957`{< zw^uNUJA`}pH7#H~v7%}3YVP{Ci*+R5H!SXvcP;h$9Vphay7io;nYBmoMtiM!CxI?v N@O1TaS?83{1OT3uXP^K8 diff --git a/techage/textures/techage_reactor_stand_top.png b/techage/textures/techage_reactor_stand_top.png deleted file mode 100644 index a2875831cef4dc1f634388d72b0763cb7974c90d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 344 zcmV-e0jK_nP)cc|y)l~oh01Z=r4r7|s)5j`xqM)Ca(w#LcaVwz}y^a6?0O?6YK~yNu zU6Cyg!!QhmBNa@A4VualG!<1c$OV>>(Uc8N#gz(%+Y^))_8i^d&@MGQar$TVNBZRV zZ0m_E)WmNlWT$nnW1W?dO6v=;p1x9vMSzuii4vQVBsl>;Rj(N4&+yKvU?C$#F(Y qQIr^BPjTYoC2Q0k#MV4SJpBP^-(F-ubc=5Q0000sXn00001bW%=J06^y0W&i*Iw@E}nRA}Dqmc4Go zFbKzQ$zHQ`HcwEgFVLY6kmdGHx1TEYUcZe~%XR=mzEr8=KV(SYX95Irxwu^C>B?xY z{~E&ex{okOfN^I4)({36Fq#7pxMsj8MP>!8d_e5RU4TIZ3sGxuzyS_$fCJ6~Jd!>&r`pT`2Lf(M^OLWeqT1}^{{TYLW4b)wgQD8($pK41k`AcM z4hC$H06@e@jeqW<2>_ENAs~B~1*DS}wlmZgL9(5$k(`gg3|J5(e*qA~FF{FwoP&^3 zPzWITi&a<R9APY6wjZ(EunfFdJhj2eX%Yo|O z2lSF>>;u(b>BPn#Rsx7WAA|@X@vki-DFCdP%6tKNf;zopr0I}E?Z~y=R diff --git a/techage/textures/techage_rope_inv.png b/techage/textures/techage_rope_inv.png deleted file mode 100644 index 7d54ddf8286d4631ec45ff21a3bc700b68052b0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*Z=?jyBGL48ma_asWqRE zdNS%G}U;vjb? zhIQv;UIICs0X`wFKzcn7&;S4bpKP=X0CJ=~T^vIsE+Px#32;bRa{vGf6951U69E94oEQKA076hqR7Ff_ammQZ z%xh}QNl4Gm(9X=x#K*|ZLqo@wmBqTh*Vot3&d$op%G1-+&M+|6+}zGrSJbVo%fG+X zkB`oOf6i%XDTMp&0000AbW%=J0I7P;(RNY({vxJPBz^z@15ZgrK~z}7rI!hEgD?z5 z6Ov%CEbzwtuUaj}IL!)CJJad3ethXm7CBw}aXkGJ;LbmtKRE}k{|!KhYyTU-0bIx9 zH4p;g?H~g6IOlOY1h9aXLQ8Q(gp>1DGr{wC6o91^usaV20?-^FMz_~e=M+GNM6{7( z*p-Kiq#wiy3MYW28~3E3={tHpT2Kj->Ats7(`NvOD)45yjJp6)0Tu%vo{XpXGLO~5 z2$n05Ck_EDaQ+gYIbca&f&o6yc>4|j($3<5o2rByi2AuJYz=Y1EvjIM^NiBppSpVk zXbxdA^!TivXn(&)SgZujfn1P)4d4*^4=$_{^0Hd!V*_}9=WQ7Pnrb0C&=Lso8h~m9 zMcOR9%R$1vxbv*$Ab?;t3-Ld|+2>t>ipB&ILL@WOL~r0P+vp z7}gxL!1SdOA}Lsm$^P!Hpo^HVQU`hSFwJXk6oAfaT*M{Lq_K3o%HODsR|zRVJzgcm z5QZe@r-cBaz5e?vUngY_eU$vS(*m%NQbYq+b?>=AZ)Q|DFu^?Wz*E$HkJEnV_RikFV-p0mxKXLmW^E zR0Ol6Xq!Fo60oWu9Ri>h$k}WDbF&BD08V4CwNL;r+)2}K6mXLE&4n-JLW+V6)vf#kK)3Qw074Az Y53{#l&5$61;Q#;t07*qoM6N<$f|A(a4FCWD diff --git a/techage/textures/techage_rotor_blades.png b/techage/textures/techage_rotor_blades.png deleted file mode 100644 index 70b5192b3bf967bfac06198b44327cd526e1d83f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xPx#7*I@9McLWe>FMd--rn@|^w7-A;F+1>Ha6m6VIBpT zVE_OERY^oaR7l5tmBEhMFc60A1oiBhq~hvvcmRUi`@*jFzAMqaqDu4$y6o$BekUXl z>>3o1^6B%;cr-RKvkpF_r9aOm2hhA40JH?Q(|e8z>^9v3=;aEC0==cDrD6g)1vW(P zc>(OE9ir*?mT2`Kz!4L*rv+gLpjM#LNa)+&e4>p48UnZH?LL>N(|?8zM6YjT{$vsr z0DUX%nP`2=B#Qc&NQc+AKo?U#qm%VXh<&q2 zv>Aa&_99Fy_I{7FLjwBs3DpvJcdF7&K)mRApyX8vII$zL3&oE(1Cay@cdxhw`oN+J z>!bigmM|!q0?-F4D6VbK;*uhC1wa)RA9e*`Qb=6@RDn2zLjh0)<3uP(0njdUP*7;{ zK-BiPP&h6CJ<6R*+U0?$C#G@ePObo`LQ9UFx;y{{6BOL!0aa+6P)Htt!l5^qx;!u_ zQm}a-MIjc!)_DMm;2a)#01C3I&}8xe6b=d=Q+*hugF>cMAAmu@$hXS^Ng+wWc>oIb z0g5^cM331Ku8It>!;q{bRXqzNg~LNM)e&eO6ds`nkHF3}4^bF>1nL0%{Q5k8e06z6 z0zQw&oMclh8jbC9^UhK{;7+|^>}NmCi)@xaQQ{XawCL7!0M&x!y5002ovPDHLkV1ili BK%f8s diff --git a/techage/textures/techage_rotor_lamp_off.png b/techage/textures/techage_rotor_lamp_off.png deleted file mode 100644 index 742fe82b82ace0f7437ecf8a38ea7f355bbd9bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*U6lmYzz#GSXqCIES3Ta zmU_B4hDcoYop4&TL4k)Q+{;tdu6hGwe@NqY56L?oQ-$nSTb`A+yUFrgCq`+}D*ir3 z^G6L`wFlZFWQvRrDw-zqUE`5?u&m=*UQ@=aV=il@JCbHhTF#j%wf@(^{~gnR*3_O5 r%Q+>XEwR|h=6ED?QHoyT+NZ4lro_y@#OwM9=l}*!S3j3^P6NS%G}U;vjb? zhIQv;UIICs0X`wF?^sy8q@?}>mD=vf2MU&Yx;TbNT=t!CTC_odhb7$0Q`N3|17m+k z<8}|pJ04So>{eTzmA1Rd@?0lIY0)bFK1TCL4PCVd+9G6%j1MZBCi7k6k$JGJ<5^x) z#;ap4Yo$AqW=vYnnJKmY*TMfC(|^{~o)F79C7~^`*vRI1By&-UUgFxPtpBFO%)i9z R`UvO%22WQ%mvv4FO#lMgO49%U diff --git a/techage/textures/techage_rotor_top.png b/techage/textures/techage_rotor_top.png deleted file mode 100644 index 2d2372f75fe180696fa478a08f50442f2f6ab0d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x{`vFg|NsAOe}n!2MG`z+978y+C;#AQ;rW02>3`#zfB*m69)A4) z|Ndr<1riKIth=<0&zgN`CJpcdz0d!JMQvg8b*k%9#0Zd6mK~zY`?bN|e!!Qg6 z;DRd7xMaEGz|PPt4-m=P87btxb

J1Y##0qBQFr_Dhz$F2n?4?ox4o2HwTR*fJyd=g5P*w1uQqy#CK9e1gXeF=@j?( z0zTu8mg6(ntbk?{pK9PB;30lgfX;u~E~?8w2f7UQ+ZyOH@M;CLwRJzeA8KGff!Y>_ d>&y4Q!lvI6;x#X;^) z4C~IxyaaM=0(?STeKHGsZog1yTwiehcJRsTJ|UlcZ@zMKafywNW}kguOHLc zA_q&rqV16vFMpo&|Nr$FN^g_oZ`Cq0H_x2AOj|zcNli{i!m-Da9KX#AnXWMTsWQm> zcIMy9S3Gek>V4FeQ%Xl;*KcD9?eCUel=1PCimU&+BUy$vLdGJQ&U@6KXc_aqSj^0& h<9O=+295t$*%c159-pVWIT7dt22WQ%mvv4FO#m5fY5xEK diff --git a/techage/textures/techage_server2_back.png b/techage/textures/techage_server2_back.png deleted file mode 100644 index c91583d0c4f3474cfa682f16c22b100a23e617e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#Q>iWS0J60lXLs=)BpefZ`-t~ zva&KfIJmE`Z_b=KKX<3h4i3Iy7<3Y-XqBgnV~EE2)`=T=4=V_``sXw(eQl_n(yCJs z^kO2n_&eo2j+>gcpN&;GAus-u_2}o%*AHH-Yu=N|V9m+o&*`Y-b|8EL$D|XxE4)5% zT}!>>Vy(vdXj|$v7wcyV;fEIoS}!nJDVS_taw+SN)sDtI1JUWL1Fh$A%_`j9vZ(p# zQ;S`STw$ztH+UMKOKhvnZu?(0r>Dx&KtjI5^8@GC>4p0L4{q>U$lhd>_x~&7(%z_> UinHumfv#roboFyt=akR{0ELxsApigX diff --git a/techage/textures/techage_server2_front.png b/techage/textures/techage_server2_front.png deleted file mode 100644 index 973849e58587d6d7287a367ca82389a5e1782fa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@Qi=gSA+GKPKH1sXEmLP-zkVGk zcKh+u%F4>VzP_-4fCUQ{guDs4TcY zphSz@k$|U0yY2F)Yrj2aej>Nxt&W#@ Q7SNRpp00i_>zopr0EVJ$4FCWD diff --git a/techage/textures/techage_server2_side.png b/techage/textures/techage_server2_side.png deleted file mode 100644 index 0887f4b438f75dafccf000bf1a15722c12644f7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*UHMuf`WpqtSla8=Kufy zCnqQS`v-UfWhZ#LIEHAP@11y&lf{sO)l}3)`@(gnC=XWl+x6Phb8Z-WScH9gd|*MP z&|(LD^A6|LQWH0HGp*TScgSUL|M!rcyLs32F<(*6*!s8Y77ND%$pxxQ_k?({O*@`< zpzlB?i=vq`V zFr8%a6PTvNIptAWA) Rc|Z#oJYD@<);T3K0RZjfJ7WL< diff --git a/techage/textures/techage_server_back.png b/techage/textures/techage_server_back.png deleted file mode 100644 index 66549c2ea74957cbfb1ab2ae59a4da8ff5b2f419..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)SN8&++mD|DdEvpq89BMz zHf{R3JB5dtd3JEHkEYlPpaf${kY6x^!?PP{K#rHEi(`n!`Q(HJVgXFdDvYj<3Ia}I z1uRS=jDiXZfvjx{C76!2WiW}gWu!5LT1;ATXpW9(Q-;=&OBX^Ga3=gv72(KO&lJm` asl{08D7Js^CYE@hsSKX3elF{r5}E+{YBOd4 diff --git a/techage/textures/techage_server_front.png b/techage/textures/techage_server_front.png deleted file mode 100644 index bc7f2e8cd7764e6e401a7ab6b8b849d3af5cedd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QlbGqA+GKPK0xN}$4^_P&c1&A zdRRa}$eR#;Gj|@KC}T;GUoeBivm0qZj=iUgV~EA+Y)lIU z7azSK;LEVWfoH!MPou*jEhf&@94c#+1lD(5{NlL$i=x$)OY98RZ92DDF6U+fjbiY0 L^>bP0l+XkKONS%G}U;vjb? zhIQv;UIID%0X`wF?gc(T=IzH%4GfLK0t0#Ow!Q_aD+%%oW^j0RBMr#W@N{tu(Kw%+ zuz)R~$jpsFctV4Mkbs=1g1bY@1}?!vS}q)`1r9D|VyF_6W3kCOy%MO0!PC{xWt~$( F69A*oD+&Mr diff --git a/techage/textures/techage_server_top.png b/techage/textures/techage_server_top.png deleted file mode 100644 index 04093dfe4166ded2ebb1b1429e1111fb69a64680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8&++mD|b7#aZuJUl!b zWMf-_ET)nmzhDOKTlyvyK%T0ni(`n!`Q!uzJ_}98My^Q>n+ydc4puO|VB%TK)Evs7 cto4zR!Tp%L`vP%^ZlDGRPgg&ebxsLQ0O9;0D*ylh diff --git a/techage/textures/techage_sieve_gravel_ta1.png b/techage/textures/techage_sieve_gravel_ta1.png deleted file mode 100644 index 1d2a9689c5e40617bc99cda2bc861c6f3db136e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529 zcmV+s0`C2ZP)rhIlv+nXH)~;4#+qYxYhKZ%RJ4Lcg?nzOdO|LDeG&iw0isDnK~yNu zEzz-S<1iG*@h1#6g&QOUE`ghb0s$`)1{p&qlPn#B116KrfwSD;5I7UaS_qyJ3<-g* z2R9#=F;k(X(5Y+5|8h?v%Y(Ol`2HZ0f3xZApZIhql5m}T$+67Empj)9h`Ah2wok*% z9We(n62XF>@%caV1*6Rv5fNJ3Zpyo2dh zd1btyCg3XJ(=EsuODJKi-01^7${FO30a1(iULD`feuuC~whB^8Vy)kxLD+TjnrKyW z?*DqJR~9zc-YU?v8W;)`VPZ4@rXFJU;Df3VHZF)>!Ov6Lw}dSbcJ8?8;YV09gf_XA z-g!(V2Ufu;HVB(;@APsv@O0|08;Y<<2F$SXKuWJ~c>ahEphpsfb=>u<9eTE|YTLyXvmNd$Ke1h0 zG5toHZyWYuySQSu!(y+NwhO{!;kLaEjIeCzw!ICEuqboe-Ude4MYwHm17E~{?7f$t T3dW#b00000NkvXXu0mjfDBL_t(2 z&y|opZp0uEh35)`3u1|i89$eg*`Etvvp~)3xyaMeCA_LDLg2o*N(-7C4`wg+2a+7*~So} zch)l?ONl6-^GQ2{NG@9M_J=#p+IEPY*d}c1L>U2F>9NYN0m0;>HO=&}-dB`DH?aXD zZn}&`6>U0gw1J{f)o4{|rhrxoQHdsAz~CxZiA`*vXw)~;3q4H(M~YHEGZfDd|DDl} z746mn)pz7eNxb9AIoLM1RP82n1yf%icLm1O54wWd{RZ+4$UlJLZN`94Igw8p<4>}| P00000NkvXXu0mjfC=Hli diff --git a/techage/textures/techage_sieve_top_ta1.png b/techage/textures/techage_sieve_top_ta1.png deleted file mode 100644 index 8dca866eef97a49be0f7798d4376bb839f5273d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wF2PcK^>GbmO@HjOuuA!k}!TgzP>zor<93B7_Z1i+-4AD5Bd+{RY zVFMnP3&K$j?TXALO$}xoCH&8i|LzZPmC%~4vY=l<@4VfGJi(HCmKhQfY|QUvm=_!i zxA!dyIOt}3SJv_d!{2G_UGJ_x|6j&lbF-jhdaJihU6?tKV3cu_!)j?p=@pXvIfX1e zYtvYArn0Tk=X(=Wxx`dCVYRYTc>7zvjb{rBih1(-zDuu`d~d#Oj%(tqyXTsi)uw^S kGK1Z7S=nz8#kJF+X4k!3410B!c>FVdQ&MBb@0BoXa8vpNS%G}U;vjb? zhIQv;UIICs0X`wFU%q^CaB%qh_wR-)Ezf|0J)SO(ArhBs`#18k8ge)Xt_oge5i43b zf4~0}t)#9FuF6yVFJ2XYW!c91saiGuLCIz92XTHz4c9E)8dj7jsVi<~;JF+o_dIQx zlz7%sE~8+(!c&(sR&&k1vn7i0^GVL0ww!rJ9_yW+zGR$u*Wd5i-IY<_Wj6cF_5SN2 s=eB5;zwi|Hd%5W`8?K)FetP{sk;5s~4ma<`0Nusl>FVdQ&MBb@06>pl2><{9 diff --git a/techage/textures/techage_signallamp2.png b/techage/textures/techage_signallamp2.png deleted file mode 100644 index 93d5f073a935805f6afaed57092d848f22ffaa15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T(@uE{`>duCo$W<0Y!v8 qT^vI=t|uojH2(Vk|39xC6AMGHZ$|d{9er&;X$DVMKbLh*2~7aB!X4HC diff --git a/techage/textures/techage_signaltower.png b/techage/textures/techage_signaltower.png deleted file mode 100644 index daa794c4b8f8d0316eeebd9058c0611835332fba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy_5nU2uI>dsax$`Oq?9hj^1Mjp zid$OrbE&1evJz*m$vz3i`);ZB7M3b?KBt^wA4QcOF|sP$-12aW!K+f0h=4#zaft}Q zt@S{o7)yfuf*Bm1-ADs+d_7$pLo7}wCpa*;xh3Z1xhW*29N=@|&`fyr&2^*sza_p~00)&fO?^ Q7SLb@Pgg&ebxsLQ0AyQ5?*IS* diff --git a/techage/textures/techage_signaltower_amber.png b/techage/textures/techage_signaltower_amber.png deleted file mode 100644 index 2c432ef50143d7d4936be6fc4de4f4d1b94a9679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy#sNMduI>dsKet3Y>2(km5-v8h zwTp88Fv(6`St(UPS<*>U)yufT%GE8w=k4mCkF$I%O-u#&`M=yK$Omd?ED7=pW^j0R zBMr#$_jGX#u{izof~8o40*~v(mI<8fH~wcW6_m1lsq_!@p&bFh^jtaBIF(@CI5mFN} oN92Wm0gG=#pa2KU2~h?Ho~=gO+vgq72b#y=>FVdQ&MBb@0N?pHiU0rr diff --git a/techage/textures/techage_signaltower_red.png b/techage/textures/techage_signaltower_red.png deleted file mode 100644 index 14f1f0b279117951ab03674aea016c2cc15b2464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy#sNMduI>ds!a_m?HWHOSDvq)4 zRrca<6H3*Ul_Z@suUb1cMrx>f8QX+AHpUsvhNXw1|$})Jm`njxgN@xNAI@BY5 diff --git a/techage/textures/techage_silicon_wafer.png b/techage/textures/techage_silicon_wafer.png deleted file mode 100644 index 261e9de9d20b5b08b694f0c13a3fc6b34189c3b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1559 zcmV+y2I%>TP)Pw?GnN0>rvIUW{`sT-vj5aAjgS{|66*e|Hc1bKhgiEcmL-9Rdx9Oaq$1_|4e_i|FHjMKgj?8!6I(3 z{{N&Jo65=1o* zMJrk{EDlS3WYVo9$!`CBW*J>bjosKSOQEiDuy1sKeMGq90oK?D00001bW%=J06^y0 zW&i*LnMp)JR9M69mU&a+SQN!OA<2`d37fdkEMiy$ghs^;mr=1=oVMNCrL>n>zW;Za zbM6c1wDz>le^cYNDrFVCANQPl-phOQ=Cxky|4<6`?^m);ZU+CU7p^@mm42=I{$eDu z$nsC03*oQs?d`pL_jYx)RH|015tbkEegE^&?;vC#rzRWo1)9_Z)h zNd%-%PL5BHk55mmv^U$MV9YI((P|MP3>fN*sZZ!o>i3!KOm=ddlwZi`fe{ZGR6<81 zTpsZkA2*>?u{kxhFqNG|p^Ke~iT38&sAhx+QBsX8awd`QoKUKp=oT09&8eB}?Ck6i z(bEWFaIjDU1f5v?8$qeq;$`%LTDUH?dwU=JP|uI1z2Qu@)jY*HB8N zdZGpml#Ns>W#($J?M4EKeJWW95!09nr95S5C_-IZWv5c9q*8)dN&vE-58W6rR_+a5 zp4ZXXDs6=TYs|9Kj^k8PE)cuh+e=G86a~RHCN*NHWDZL7X6p-~Z@(Y2EH7yoMASMl zFwjR=OOe425N#?M1!8Vblzb&XUD>u}p$jivNCJT-V!Mq7x)4X3Lo;@0Mwksz0)_y- zB+IsC6JdMlq~Qo6rrlUye~6%;B1I!GRsq~OAlRM_B{U;VM6L$NVS_^vL$w)Xu#dKw zL4p9>jFBu9%H=Y<0HVMy$eRGfe|SbinXDOLPF?NHBtq_JRySgl%A-Otjm_aRGeFnHhXtBg*!B z>Hq=BsF;jr?C=mH>2`}c;^9~&Vkj}OA`#4 z2oDU#BGLW+To*z#B!GdLG8gnhqJ=$z1A~Yd5oeFzEFG@K`XHd0=)#m-aHbT3zjA?7 zVyMPuiQQLdR0US0rdewL9vBPp?9z%PGt#XztFDS!f35cRraI7wK6Q|t0Mx16hQ9RT!1LM8P& z0(yD%ynB{h$F9ygosP~0+i>r$Uv||y8C(wgFTWn~)B=%HgruFwDg002ov JPDHLkV1l`q_f`M^ diff --git a/techage/textures/techage_sluice1_inv.png b/techage/textures/techage_sluice1_inv.png deleted file mode 100644 index 201f742ecf8874b25aeb8e2ac5f1c845c741fe2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 607 zcmV-l0-*hgP)7J8TR2@v zD{NFUPd+A?Blh|L000YgQchC(;9l2-p9A>xO_`K&ohVhC zm2?Y!L>sQaPHzaj_tx6j2k)ccr(19)0S*GJ2;jBW_8r0Dl(+@KdcW(>gN+3O)8|~I z!RcoSBv)V%UIaLZLj}$;yFeK@RG>9afSHITHBxXh2G^yrsmvA7!pspUHCn*#0yZ~e zXTe%tCSo;u;h6&OdBw!r7Z%!?MhY+!k#7hN*9T7F>q6&)Yn%MMa>VDX8$f5QaJZ1W zV1sidfJ$KB65z@gwo#xDVg-hv^iv9fCj@=G=%W%)(`4!6_!vRr69LV)DhAE0FDTAj z4+0~BC-@)&137C5Ak8WMl;Ien7BoTzNyof89Ege3B`|3~UJ5X1(?ZJBCA`Mejt_xw z1yBe=$66_G&-Npsm|(1ib~N8|+1~qV%M0o#$O| zNrga^h1S@^5=BSCyV75mavG~ArL%Lz;uePv;^e8E9f8^xsAqyady1mK(9>Uak~OxV td#zO2;3zIxC;I;i<|XISWT}WPe*tS8S^T5JYMcN7002ovPDHLkV1hp41xx?{ diff --git a/techage/textures/techage_sluice2_inv.png b/techage/textures/techage_sluice2_inv.png deleted file mode 100644 index 80a4cb1efbdd11d3db5f416f7ff4ac740efe8f96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835 zcmV-J1HAl+P)P)t-sM{rDo zWgYQ9mYmT{UV{HBde!Ur8%mM=NJfEpk~nR6!_KLn&%gG-OOGg=axUH6eat zJyk*{KQJA0SvO8RBwI!+ns`VWSrz#J000hjQchCAT6rrTLwD0~xOC-LRwPd}vF zdDiV{Xjg`w*8nq%KJ@t?RE9PHCmrzF0E8lYRTn_Z$n|P(!{9^%ot60)Lj%k4tp>P> zFeKZx0Vm^lwp_ar036b#HUCN>56tsxfXxzwYXZ773<=vOqZVINkFUt*2Eau%0~bj{dB#q-{9}P_lSZ>0}$r-v(|ts1Nsb5 zBOo%q1t3Jg#}E`JcA*K#36g!3G(aM9Y1XX*lw=xQQmwq`x{YAYrleVUShBGKn8?S- z2k8y~sT7n7P<93T{9kv{GLcJMy|PehPffD3YivXWNT-xeogLe&GO{Kzd!2h2UtxeZ`y zH&FW&PN@k<98=1nS=$B>JJC#6^=fh_b|+{63|K1C4!|4%xSFc~&PAg|Kp6nXz%^Td z_<$>OrvR+sjLklH0AwekGN-QXM2o)CHvmy0ppfqG4Sfb8zaN1-=E8_{G^QVMc_Vu^ zvcYj|=w?^~RvIlYq}~H5X89CM-r{i_O$f}5ejNLhBJSM$uuukUPhkN>nGJ;u00JSv zV51QD!47~+i3qhlA8532W~qMxpDywSYawa!6~H|s$(N#k1`Jg$ZUCp!Z?KBI75N7t z$EF$*X!V^7Re-x)Ni3E7l=lEcX&H8-7QjrVmiYyM!!yA1D=|Ujxc~c5?q5!0!T%BKXs<>I)XVb9|!UYP)gveI$hWt*(b3U)acKYl|J>Z%prD}CJ`?5u0004WQchC>GlvK5P{LO)07X_}^<|q>c?BuS2T?&bLo!tqnlL z$AlVy+z^2QILn5lgL6707f9~`k}OdA9N1v#qJW(O>L0qmXCr{{@@7ro2fzxg0y>QV Yu7TOb6{^4XJpcdz07*qoM6N<$f=(K8;Q#;t diff --git a/techage/textures/techage_smart_button_on.png b/techage/textures/techage_smart_button_on.png deleted file mode 100644 index 3d25ae5ee398da4974908cdec888db60aee731cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e=>VS)SN8&+SFc`e-@g6Ci4zwu zUi|<6e@S8CkEND(?%d(@ymSMojIkuhFPOpM*^M+HXTGP4V~EG`x0f8bnjLr?E^6*= z&=g6tl~Z&#uys1PRv|9&TBJx-j&fhHxY}lorUmliMs~vDRvJ(G7`4pHqvtMr*CB49 zeItX-J9MA&pRJryygx*;8g3pgS?RzsTlmjs-K`7O|2Xmb!bZcyUv1~27!8a39pe=l zcoejgRAg&jy1FX-WoJ9dwDK=Q+tOVuQ#fz=&z66}_>gHiYkxwBJado9#J!^Tzq~31 PI+elG)z4*}Q$iB}@}FmC diff --git a/techage/textures/techage_smartline.png b/techage/textures/techage_smartline.png deleted file mode 100644 index e009a78e59a8f01d3b3b4690aabe9bbb7ab67d11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSD}KXqIEk3(x$u3JkAqT z>Cm$+ciknX%(^}qOiY+`II1xZN(0Zw8Hq6S=t8X2at#5gdm zJa+Kd!88R%aW=IH4hkMoA}R-3R1|nFE@BWeXyJAUl~BqIbh>`1WtA&qY&X-93l1vI z7jq68G;==sk`mlX=|!z zAdZj4^@m7VS)SBLH`x$7>u%{>0($&-@8 z!iyI#{{R0!Vflr)Ir}-j-UF&)2=R1r4DmRgEO3NhMWSoU2PW1wrQ|&fOAhGpa!mTD z$zV7~Gx)(Hr=3j!d$^o9wHTOAiR@rtv}0{)niY^@Y9PR{_+_GrZO^jyi(d?8$+=x- b7JSLb5WKLGr@iaKagYU`u6{1-oD!M@jRu?6^qxVjhk{9I&Ic+>eQP=v80 z$S;_|;n|HeAV=8K#W6(Vd~$*Ue~m(uAy=C{14AAs^TF7LS4V)-44$rjF6*2UngCBt B9994T diff --git a/techage/textures/techage_smartline_button_4x_on2.png b/techage/textures/techage_smartline_button_4x_on2.png deleted file mode 100644 index 34cad03c0dd5bf099096552b15725e3d5f5696ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{9I&Ic+>eQP=v80 z$S;_|;n|HeAV=8K#W6(Vd~$+>+yiF8o@jRu?6^qxVjhk{9I&Ic+>eQP=v80 z$S;_|;n|HeAV=8K#W6(Vd~$*W>lOz2jszZd1_sl!%m-KQF@jRu?6^qxVjhk{9I&Ic+>eQP=v80 z$S;_|;n|HeAV=8K#W6(Vd~$*Wt1@GaLX#sO1B2vx=7YOVmI7G}44$rjF6*2UngBjd B8-oA< diff --git a/techage/textures/techage_smartline_button_inv.png b/techage/textures/techage_smartline_button_inv.png deleted file mode 100644 index 97ff12daef51188bff90cab9244e3d900184cdb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sl51o(uwRu*PHe*D;>XPev1;}i8x(jPF0M;B#1gwuyM&Sdj^#$D>)V4SusAM0*!;iYNcn+T8XXFg(z17U9dL1o zu~Mw#cQI~!p?V}pf^o}(;sCZ9wsrh{JNId`UMP9G*XpP44n_m{g!bKfFM5 z_iF9&1j!{QmoqM6obu{PrnuXM64sv|?l*VTew%B5Smy?V#oL>64ZdIG20Dwu)78&q Iol`;+0M|}yCIA2c diff --git a/techage/textures/techage_smartline_button_off.png b/techage/textures/techage_smartline_button_off.png deleted file mode 100644 index e5dec3d1ff4e0190cafc473610c744e42932b719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc&k8vD@A^yxDJ==|3ubV5b|VeQarJa@ z4DmRgoFKuvIKhHh)k5M5*OcDI103_2CX}h45@~7EvgG0lTIL|IoypNL(XolEp}~k% m&!NGek%uPNS%G}U;vjb? zhIQv;UIIBn0X`wF?gc&!lvI6;x#X;^) z4C~IxyaaN10(?ST-3xq9T{wOJ$pfGOn{*n;6vmPuzhDN3XE)M-oH|bz#}JFtZ_h2{ zZ7>jMP2^FW^3-7Zs%60?A~wHfZP^!`@ap1^Sz1x${fq}boYtSdN4jnQ`k*_vSaoFm zDhmy(D;EkCGjM3CFw8&1dcgEhSC{FvzaNipWBTF4A(gmnTFXVTXoeLLdoG+yVR+ob qT;Rf{Ae_k=Jl{6q>Br;uci%l_Y{5R!Qtk=RB@CXfelF{r5}E-0V_Cic diff --git a/techage/textures/techage_smartline_collector_inv.png b/techage/textures/techage_smartline_collector_inv.png deleted file mode 100644 index 5cb5f1fb8d4c911f52cfd16c3fddf8f767483641..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ISkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skQ1^9%xI`nKib^bJv=Qi{B{U;A{*Ii0ld+Q*O|H9M7F~s8Z+AFtt4=eDn z2CPpo>$u8m!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xsF|Nqa##AI2tK`-f?uhl)7hxiOjkjyz>3uK!S z)^gVM4@ArU8!yd^dT?HaXOhM?{yE*EE)5f=-Ft1E%FiUg&izB~lj1o?j`a=aRm>MW zJE_&cy~aU2s97wiTx(+4KDJ9IT0{N>TE|NZRL;M~B;PgV(c*K}9dDmrY!cm)c;Vd* s|C2Il#Yc^czgi1iJYV-A-GWv8eA5=mv_FVdQ&MBb@0Pu@lJOBUy diff --git a/techage/textures/techage_smartline_detector_on.png b/techage/textures/techage_smartline_detector_on.png deleted file mode 100644 index 1d4cc93e071acab2f54fefaa00daf2696c1b36ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xr)F)%PQGk3Y42dZRXED7=pW^j0RBMrz2^K@|xu{fQaAi>Ja z8sXfi&~S@s<-&y%HJE~(r?)NS@ZpZN;*D(3HOkI<#Uj#}s(q2=P})L{4d-}f&uYuc xxN$0T#XF8}ms0nPFp*i8gIB))8|V diff --git a/techage/textures/techage_smartline_mba_detector.png b/techage/textures/techage_smartline_mba_detector.png deleted file mode 100644 index 660fe10cffd9d5ba8aa5c502beb3810e94d500ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmV;J0cZY+P)n~si-y}i9{ZEeiV%>V!Y>FMcxeSM~;ruzE&J3Bk_^72qnPyqn};o;%c)zx8P zVI(9Z6ciNLY%y>E0004WQchCS2W<2)5}`55P@ zSYLQh8V(sn*yVMJ>hr{9UC%gfgNeuG?I0P)t-s|Ns9F z4-cfIr0D4Aetv#!uF}cL$p8QVK#aCVna4IZHu3TCyu7@Xm6e{Jo^x|^`1trtOiUso zB4A)(LPA2*)6<28g{`fv-{0SELH5r800Iq3L_t(Y$IX`QmZKmHhCy613-Tq1-v5r400{mX7y$f2r1O%DBaz-ovUq^u z6`%mLB_z(ca0CdOBOz7;s20dy)&G>11!)ZlD9!1ZqX#(p$A@)>RDc+VGZLJG-vKFL z1})Lwb^;sDDK)+j@&+jIa-FGik(>aDPSJUleh;Gs7=;C=Sp_)FnN5IYTssgeI$waY znz#ZCke5z$P?!rkQ~Y2KRM5HG$I@spzKKKfeon5l~lMI1CGqq zWNF%qrj{lc+xI6>J&Y+wO{R6p%>=dwY))p1QFlPB{ekoV3Dr~V00VwZ=H_v?AWCC) z`Qg(pHhH)KBD@E_v7{Y1f~MD?={4vb_{O&OiQ7^|wZO6$ZsIB$fkN+m;S&AVg-dyvW&C}PZMOkx}Kjw>tPudG+VOZzt&`?k)wH` zP#ihLzv4YceS_gNXgNE&lo@MQcQ{{X(mbM2Pa7|!f$i2Gg UOKEEFW}ul2p00i_>zopr0Jq~fOaK4? diff --git a/techage/textures/techage_smartline_signal_4x.png b/techage/textures/techage_smartline_signal_4x.png deleted file mode 100644 index ec3e9fcb354556542ae9b1725eb467167e746460..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e(Ey(i*X*^I+-4qk=-F0MSoq}0 z6KiX0$JRAkMVF=m6?k~MIEHu}Pfj?%FCi(x`jN?y%}sm{!;%B0A{gTe~ HDWM4f&EGNg diff --git a/techage/textures/techage_smartline_signal_amber1.png b/techage/textures/techage_smartline_signal_amber1.png deleted file mode 100644 index ff3d5e75898087efd70c14cdaa311ac3c667facd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{9nM(zm+ExD8g70 z9G&zGM*|YX*knsq8=fSPcV!@(iA?elF{r5}E)p C>>CFF diff --git a/techage/textures/techage_smartline_signal_amber2.png b/techage/textures/techage_smartline_signal_amber2.png deleted file mode 100644 index fb9df3df005d6fd6ecb5c523143a72d0a2c70142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{9nM(zm+ExD8g70 z@jRu?6^qxVjhk{9nM(zm+ExD8g70 zM+S!T_t<~hxX$zk$}@Pn`njxgN@xNA DLz5gj diff --git a/techage/textures/techage_smartline_signal_amber4.png b/techage/textures/techage_smartline_signal_amber4.png deleted file mode 100644 index 3267c8f65711274bbc921e8ceab3ea7b834d9f01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{9nM(zm+ExD8g70 z@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfk!^GWfrcFIj}gnt|bXD*I1AR>J_GJcFmJpUXO@geCyc C?iqLh diff --git a/techage/textures/techage_smartline_signal_green2.png b/techage/textures/techage_smartline_signal_green2.png deleted file mode 100644 index 34685ec77393b1d34867defccec3d9e81190941f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfn0%YWT@tDzUgBiGjg;CHv2pP9Xw7c?M5cKbLh*2~7b1 C2pe$# diff --git a/techage/textures/techage_smartline_signal_green3.png b/techage/textures/techage_smartline_signal_green3.png deleted file mode 100644 index 956cc49ac79e235339a96dbd751fd42d429fb90a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfn0v6=8m6e@jRu?6^qxVjhkF#KoW;j2^ziZGT0 z`2{mLJiCzwIEHAPPfn0vJkqy&;@(iA?elF{r5}E+y C=Nha4 diff --git a/techage/textures/techage_smartline_signal_off1.png b/techage/textures/techage_smartline_signal_off1.png deleted file mode 100644 index edabb430c385f3ebdd06402fda4b77f043779e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkloS@;{o;E7D8g70 z9G&zGM*|YX*knsq8=fSPcV!@(iA?elF{r5}E*K Cj2rg= diff --git a/techage/textures/techage_smartline_signal_off2.png b/techage/textures/techage_smartline_signal_off2.png deleted file mode 100644 index 2065fa4a885d50e7b5bccc9273f3adf23614f381..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkloS@;{o;E7D8g70 z@jRu?6^qxVjhkloS@;{o;E7D8g70 zM+S!T_t<~hxX$zk$}@Pn`njxgN@xNA Dc{3d< diff --git a/techage/textures/techage_smartline_signal_off4.png b/techage/textures/techage_smartline_signal_off4.png deleted file mode 100644 index 1ffcbacca469c4265e74fabaca52c4e53bfded9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhkloS@;{o;E7D8g70 z@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAV@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAV@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAVT8lxOgC^>bP0l+XkK DK5HB_ diff --git a/techage/textures/techage_smartline_signal_red4.png b/techage/textures/techage_smartline_signal_red4.png deleted file mode 100644 index 7220fb58430ceffbd3e287e900415573151dfa44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxVjhk{AXZL+_Yg2P=v80 z$S;_|;n|HeAVtQ~F{|ot=IT#p1l-Pf6i)@$%lxOgC^>bP0l+XkK DK)oC_ diff --git a/techage/textures/techage_smoke.png b/techage/textures/techage_smoke.png deleted file mode 100644 index 344982cdcbf545432fe133a8eee66b7164e94573..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF2p+HnHPv$hS#{ z?w5zvoSl=lW5!qc?!>=~UVqNb5f?4t_hF4YQ<5&_cFp&|PE(amVfLd3kGDPgab}~} z%0B@dDPa#Yl{RVS)R}Bq~^=sF(HaF#$Rb0Jt zV!`}rUNQb>>vi5e6qQRY`wUc8;OXKRqH#W1z=fG-29uWtgGz%AzfeGk%ZJt$2PP*D zM%N7u3Nf7%6kHhAxd>`81S_d<2n!@IFuP4+nbg~RHh{$^CT30`tCRCZmP1}Z9L<^O zXfAR%YSP@kceOnXPW(&tp~K5!PC{xWt~$(69Aj) BK#BkW diff --git a/techage/textures/techage_solar_cell_mini_side.png b/techage/textures/techage_solar_cell_mini_side.png deleted file mode 100644 index 5cd0274c608f968c5257eb5092b639b050d1a9d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*Qltd^=sFprKYqtH%(%k zk_Z%6@^oxrPq)nRK{jD;j5EIiX4wlFg&&kXx|YJ=JoplSwB LS3j3^P6978nDCl@#}^SE$WNGmf6PiSapP*N72q7d%jsp;V<>eVCVCF^`q cx$DUZHU`5|U-vAlXps2~p00i_>zopr03p00EC2ui diff --git a/techage/textures/techage_solar_module_bottom.png b/techage/textures/techage_solar_module_bottom.png deleted file mode 100644 index d3ed8ff14e231ab66b6112c55d3793446eaaad8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xPMwDp25@A&t;ucLK6TA3?W(o diff --git a/techage/textures/techage_solar_module_inv.png b/techage/textures/techage_solar_module_inv.png deleted file mode 100644 index aa9e3d09f67bc526816b4b460f8acc96a9a9f3aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1625 zcmV-f2B!ImP)Px#32;bRa{vGf6951U69E94oEQKA09{Z_R7Ff_acpXH zWn^wKEHn=e4_R1Za&UQ7Q(iC}zjhf8O)!WM{`XOA^^URKZhs%USmmnnuBx2Juj5l)Yo+ph zv)SaJEK)24->y|%JLf%Nz4KtGL8HKk>s~2Whr067&QEQ%&G~gf$NGWFEL`m>uPOz6 zegKx>bhOs4W}@e7<&;)h$C^Qnu>302STtd4L9cLKTgGkS5_-|JLq630UBYGvmYwtl;F$;)9mPjt<7iYo4F1e)7lBOC$cXv7S(h`Uez6 z&4DL4ODW4l)b%KKIO+SjZi{GkYtlHijpT@rGHmjo$WTDIid-6xNT5m$%TlAl(GVVsF#Re20$dh^yxH`C zz~azXkV?i4nxE3JjYuJVz(=2aX;iIE(=CdIu(7>r^& zFQSU!#Q5GPQQS4DDpi<8;&ND7li*F(_9J|}H<5^*y2g#;(J3iGHTG*Ve;RHO-OKog zR^vz@ew&T>cE7t9h=`hoz`DtFCQ2iXvy&eQ!`NrE*2VQeH)VMtSU>jIm@<7$)d3f3 z5hIz&%Uh`d{K8fkw~{G-B4|O7KOvA|CEt>s5A;86u9Z4}7N|{nBjuXHUkGewpAt~j zw9OG+ESXG$0fsF~YO5~r0lu{6VjUZ!kd@h>RQ5arj064^hIygw5|JnJhg)k%b%p;qEZJ&TbW3HRP1}}CBesy~Zv=Ni zA||G29QK}@!YBM|nE3?L#7r8j)74)oSZDK^KxV}X=Y{q9FFd#6TvM13oboUCn$@bn zk?bYa6#hOE!KvI7-#WQ5C2Ys}BY}C2FZIq^t2f2WLt;_ntoBGSw$-(;w*>n0b2I-i zx{D&fgE;0fgU_E3m?`olk+#2nA_VyY0{v{k&k6qf+%F(dFKlD31mnQ_1p+gD2@ViQ zB%A)2;LbJu;c)2i+b05Dp#}>H%%r|kk;V*CqiGb`Z5G@xt?$OpZ5G$}AkcQVjNqDr zxz+2200*P;rvwkpb(#>=L(?uJcopU*EA5(P1j@WHOzSsF*V$N5bHq3MTH3nG1+ z5C~dz=w=WUd)~cgS+wPpCFRo}`sSd^7AMuSO?_Jde_hPkEyXy(qO?8UkX&NWO=L6b z5IW$`+m6r9Y+D?Pvn(h*^oUyqae+3r0)AO6*zc1iam*d8@*xWzvfyUpaFfxo(Z{aq zS9ACKw!G`Hww3=eR6Kphwr#qR=EVBW#Q!LEn+@*p2|Jl@DJ9$(^9}{ou@+8iSl@oZ zB$8&>?45dg>XHo~cW|gqw;2DN%x=S*r@OP`cz9`5{2~6iD9{XtZ=B?>3CJrSyTdQw zpHIZQ-Hs>k$l4^eyzaKe$8QGD-AJcam=`dxkNLm)|20^G(|-T)PhORG|pePeCkqxqZ|JJx&QC{|IhU=7G^u>v@$X*DX6~BB~hIX P)WG2B>gTe~DWM4f1c)Wl diff --git a/techage/textures/techage_steam_hole.png b/techage/textures/techage_steam_hole.png deleted file mode 100644 index 8a4132adec5f3586bca55b1543a5aa5606189e53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc(TCIsv(*PoW4HZ3FhE0E7z666=mU=%fHhlVSVtKsS57@~1L zIYHu4gQoz8$OIM%=a`rn)(Nb0dV75{^c(VY+YYy>Ffat( zoF6_nL$79ktU6GLu_VYZn8D%MjWi&~+|$J|MB{vNf<&3Z%^Np(Tn~77dd~dDByr7( zi>qsbhJc2KhSx5JT?-GfuwK}bU~yN~VS)SN8&+r<1K-E{%RTKm1Og z#ie%Bebq*9wv;U>w6okL@CvAmu_VYZn8D%MjWi&q!qdeuMB{vNf<)N@kCQh%I9YBj zWa?^c5}3du%uy&JB2vif$idRJ!-}hmi%ZR!l}Fa`m8+8gQ-JaW7N(1=GDmxRr}Xwd zxW;A0wb0^BK!|{^gG+!!sDpsBL(75&jadu(GPbF(E#lPRTEw|!>C)5%Yzw$flh@TDFd(2~LWAL| zhQ$jua?EO2C{V}f>ci+*qRVnOv16rEi_3lsp%V5s2MvJ*tP6!qI2b#8xvXj(ZaxB< O#^CAd=d#Wzp$Pz(9yN0S diff --git a/techage/textures/techage_steam_pipe.png b/techage/textures/techage_steam_pipe.png deleted file mode 100644 index da965cf2e3836a09b969a6320ff945021701c41e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc(iCtJN-7IVADe0zoQ-8o^aBYZtUN=t(Lf*Bm1-ADs+Y&=~Y zLp07OCrG$CxSED=@`N-yED>(*Qs8RfmXKyL3~{(2F`LVTae~qYHRl|yhO$Xq^YdY($j>6hIDp$Rg|dR0002(Nkle(L2kq#3`I>&0L~&?i_@%07*qoM6N<$g1{w}jsO4v diff --git a/techage/textures/techage_steel_tiles_side.png b/techage/textures/techage_steel_tiles_side.png deleted file mode 100644 index 59fb186ef207a5a433dd79faa67d3c3ba0c7269d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8&+MT-_qpFVx{n$_2@ zUw@D*EdrEcED7=pW^j0RBMrz=@pN$v(Kw%6kl?_~^n!`&1rr-fD940#P7Pvd5)g1nKDHt$n+6V zkg+7lFPOpM*^M+HN6^#7F+}2WG6!$7Lt9`2F9XB3ZA@$DzrQ2_lw|O9^>bP0l+XkK D8SNa6 diff --git a/techage/textures/techage_steel_tiles_top2.png b/techage/textures/techage_steel_tiles_top2.png deleted file mode 100644 index f5e2e7e8e166d4167febeea68e15ba0c8a91d312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8&+%U3R6xNzatty@#3 zOj){g>5?T&wj4OT6{vu*B*-tA!Qt7BG$2RK)5S4F<9xC~kcf%nF&-|Sj0QC(&XSF; m4GX#$N*I}US>&8(VQ07=%`T{O{mBoY4hBzGKbLh*2~7a?doDr% diff --git a/techage/textures/techage_steel_tiles_top3.png b/techage/textures/techage_steel_tiles_top3.png deleted file mode 100644 index 3eb4c8a2125a6902c289f485314e33b1ad659c35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8&+t5>g1nKDHt$n+6V zkg+7lFPOpM*^M+HN66E~F+}2WG6!$71Di#%hyo+S6@S*qr8Y})fU*ppu6{1-oD!M< D2a_6~ diff --git a/techage/textures/techage_steelmat.png b/techage/textures/techage_steelmat.png deleted file mode 100644 index 06b1571f28d5121b83a8743e500f13aa4e5ba3e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8&+t{~0Di3aO4P0QSs z<1M7Q3f|lR$}*M&`2{mLJiCzwzTvpp!c4b-bV+P}f+b$lC{`;0Qvw3qQt}t^6n;6(LrBU2i-r8%!#NFy% z2G{35)9QQh_^hULe$8(c?XR9U7IpDVDa?=(4Qrj>y7N-*<$bG9eUmp{mR%gO*llLC z)1u^OA=}>8C$5!WzG-V~yu0LFuEHhFR%JRjbLNOA=1=*kc=~G|$049o89ZJ6T-G@y GGywq7|76wx diff --git a/techage/textures/techage_streetlamp.png b/techage/textures/techage_streetlamp.png deleted file mode 100644 index 22c71479492c089cb9342cb5f0b350ebc51b4e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSN8&+pI~5ZXPuOiq^6%q2m7!3zopr E0Fz-a8vp3`#zfB*m69)A4) z|Ndr<1riV4Pdrel|h40caP4r>mdKI;Vst03Rn%K>z>% diff --git a/techage/textures/techage_streetlamp2_off.png b/techage/textures/techage_streetlamp2_off.png deleted file mode 100644 index 9af136fccda2058e99243bb84f69db6b0c5542cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc&@Hg29WW!j#-`?u`qJp)oy666=m;PC858jz#z>Eak7aXC5R z0K1E`v-1I-mv`UKYmof(|9}0$jU2LT8oCeIc5pK=?5cCS{N>HVl|U^Fp00i_>zopr E0IZ=kF#rGn diff --git a/techage/textures/techage_streetlamp2_on.png b/techage/textures/techage_streetlamp2_on.png deleted file mode 100644 index febb593e764e18c5a22d1330d33d5da962be1792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc*0Ev@tB&Hw-Z|JQHRGeL?iWSN8&+pFe+E+gYn=sOf5H zEN%^0zG``PT8xjsPkOjPYI^F4*&-)^ikV7+{DK)&ZKq4t19@vaT^vI+&d;5=QSguf zk86GNrAeYrY7K3(I5V8qwtZge-Ku9Q%Uy7*!EhpVlH+0*(1cDWW^0UrMe9C6jyzd}jdw@;D^h94l)&!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xsF|NjryU2)z4*}Q$iB}=RG)O diff --git a/techage/textures/techage_symbol_powder.png b/techage/textures/techage_symbol_powder.png deleted file mode 100644 index ced809883953a99269bf0f521bd36a509ab2345d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 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 z z)KUc<{qk3QJmz%p0^SzR|ZB1PZY9e*E)F&*KcyBp%6XGS5<&+IG*NZTBRkxHJAa9&(F3}--`CM7H66p zMF=kfMoW_2hjv|F^O8AZ)wMj(3zm_&9-2zKZg9P?GsL*6I*8}78rr&na4##pGeB-z zLcJ^%FM`C_u-WLShQot;5%POrr>KxyAHZ$5fj&1nY>6_nuo;;%mq9yjF-ftIwrQT% zscSpLb$ow69;;(J)YWmB=I}sT3yS=}u`1nQ4e&CPrBs5Y26> zxz|x{Uc?B+K!6=*+`8@v;kk4pZrT6}w_SUz=LM5<8pjErA;fKasiOK?c6tQ7w5QoK z(LgU|R{-+S$j+wKA{ZQrgVpI=SY+sB_LaY2+=lLW1UipELmcwT52Du@w! zr7c_Boc%bRUK_o-n|P6!t%4KkX?NPS{f;TRDVRw7V}$~;2Afc0xG~bl_Pv6S89F5Q zJVTJDX#vz@ckHJ3_fHJ=<+5y*TJ@MZD~eoRPA}YP-%DX&=Ua|Gib+uPG7??$wE~>$ zG+x))rF1gTCnO1kXG9{83xFPuEh_Z;Cs6t_EP)J@8gO69%SOOJ10C4k%AB(R9d+sv zW%M6&|7>ODv8B5XS zy_fvZAJ8&wv~I>za_2s-A=r3a&w9*ba|-eU&p2?k>qLE*d9@4~J5)DN=VJxnkN6s( z1%$o<&2GDC;2_gGs$s&hBnNH)GnQFY4nDgQLyr%c9|YR?ftC-aPJP$YY%J$h2|A`I zK0YQLJ#)u3ldTvv#(ID%FY^^AJp!1YCeR&%Mq!30@h{gr*2GBjsYa=6YENo6r-m9? z1L_HgKDxaPC?9@CtsRTtWqyQhzAtDic8Dd|plB=BXizk+)XNP5eC*nB8BhY*bKqK_ zSz<`UnCEIxRci0_+!(U2(dTg?*R`A-Xq_$R)qHr%6-lvPufSgc-Q_q-wAbs@zN4bC z9lAiEKLPa6pk3ES2ohq7Q4(ez-}EOd{)sr@h?Vu1TmXnrFRB%oB0ZzE!Fj z{PrN9%rF(UNYco)1f!{}u8zRNsjYx0p98~2S}z;Fag~KBrWs5%&GOWIu+hukgqmBC z4@$eNc~i8_5!Bs0?y7DmZ_qmdvWf6Int<29vIno530wOKEcpZhfs;JWfE^DIXX;lJ zcHpV0u8zz#P5h62{mG+rF?w04Pffk?k|b|IaY8MFYu-l#JVwNdZ=44neu2T79gm7GF@GFeULzTre3wkwMEahghj|rwE;764~dWY2%f81OqsVN)ty4 z`H<9G=X)V;6kWOwX`*1$0n$56(_P9Qyc|u%JG%=o(h%u+Je@u%)W=VZ_QJV};jZ+2 z(kUNnokSv|yM1|Su(|D+8N8_DKr>}laF)xnxWQ+wsBY^W;bFN0A}`1bDAWrsW@8`) zGoCY4PYf0P;^cT*YP}^Q09*7iJU7*hf z@dH{cj}ChJ2Vq!2qpOZBUBVPHv^PHLd{?2m|<6rp>S%^G-)MwN)7OJ!3g_+ zXrQxvV8b;}cL4TMk1^N)6_XC2!|4Dj57a!-uVwk9FvHJ~eJIoLChtciIfKS;q_Epc zw{`J3pRB$Vpb;^&kmp94+o-d-H48N+GCJX9Qq)cc*ND|nV|~P7ji8m-ZHrnN2x7z^hRnZi5qSxxZvdcMY<5S1jSBvLM3Ph@Us4p)sp)W`i25jCkWjv0JGk1AhLrK0uOCQ3nvfvT$nL1lp4ehfN$u$w(hpsgM zXkT3*(npN-1p1&=1P5CWh&>HrZZqzHX#n))qkpTqj{}mUKD47l4IDx70MPnm*aE`- zY`MrEE42%3s$)3mNbe-sxNo_-X5*$r3%RQwuFyXZiY$&l1d z_3?4|czZh@-abBt!Gi|aWJ(nA##?3yHkI{CK40o$j6W!~>l2$Xdylv|p^gbbACV!` z14U#+@OPvIY8*6FaE`%>0_X;ss1H2e-adfXmmTPBE<(?s!O#p6=~x`H`{Nn3p>D{1 zBooR;uW0B&^Qh?n)X4b+#8;D*3R zgOEUwX_|Gr-7e5qkIf0HAV7ZO|Blb>aA9V+8*hA|$8D(C1G}O)5~W{}nxuQgnwad1 zBIqj*^d{gIfaYM=T?;`*TvDM_6 zx}MiD`jOTITzNS)^K`Y1=#y>8mpc;R#^ocH^Z7EiImj7w(_IKJJkV4z7m`r&W6P3} z+&(o1?PwjK^XE3PKg(i(y9#RVvR={})Hp?QY-I4yn!Xx(=m%B@1NN@Yom>vf&7QrBJgqL4RWEw0yfzm+Lp z0wJL1*@@i+FBb>Fv7R@4oPGzXU4c9L#xy=#IhZ-@jyq(Fd zVd%yEJujaCJ_SvP2b|NP!A8EdxEedpPu$oXJMu2~=ys6HZm}3$yzh_4=qvdSG^FT+ z6N}|G-{}oa^UiWt3cP@T+B|g77Yi~%Mwdq!(sT-W=1RR&J6?6%lHcK?OM4+!wjtF( zgMohuTFT;i+U~$1Is|m@ZlBOkr=#?yxcYa=kh$x?t?#Ws<~ZkqXMx^=t@LX3&MQt) z%D9b;L_fO1Q#;6AcfO{D0N>~7P9HJ(E2qFacj`Vk5eI?X@{_1OgFr4oyK3#V*<>T- z3m>zJzcNBkCjgC%;pq>OzoUZ0dS>f88pghrBMcv7Y127 zz_OGiUrT~tX`+pZNROCOEbK>w2JcGMMAk6sn!QJdmuXRqSNv_7?<*(z1fVgr6_q5F*B%91=1bl%6~>gj z9@wGl{juU@a5`d|vERGjA2+~zou(Ryii5S%!MTObli6o9Dq;cjGbw z=o6UH%lIQ=dWTfhzi1au>4JKYEdg>#)Klkz7P-DZ5{>|td3^wS-~`CvoieblX+38d zj^hK@iA%$fp^P}$0z(Z^9wstHTuI=OD~cx&>khso2bgvTA&0YO#Yw8ksy%0ez z4tUmS6up7xLJ0ecGjN85H0cpsX{?sWL*G$Zjsaz7jpIO8ahFZi8yO+79EKn!_d>w zZEj(_(RN(ub;H?GSF(t$xG7TuPCha7;8>S*pJtlC9|bgy>ko$t7X~+nK|^eD#2|a# zIO@wU`P;k|J*s5bYUq*~fZV_?)!JFo2 zS5$^4g(io-D0o(XIAT;#E?ry5b@&J9yNB zZ%35s$9+6PDF#{`-{0R)V3c^YfuJiW>6wrt{3{z6e@+3AyLOy_Qe|9rkrr_;qaQd)0 zxp=yKJX(DaMbItq(e7O0_a&yh!+9TRIfE3mVYt%;8AKuCt^JYW4;lnd%HZNSxYO07+1)!^zKr`YBZ63PhV~uN> zWx7dv1+$iV@uH-iQa0GFU-FIy4LIkcUMCQX)4;!(HMR8M3pTd7p6@ddq^d#bK9L>_ zxrK5LRq=Q@99vuj+MZZkUbkn?K4+dLSy3W%x0aeCD==|yvm=grgKmQex#5Ah)#Dv) zJ_HmJu{qbD@3ajY)3RM^z&tEdCN=S3%dLNIKislIwCgQmEE>FMdwZfuie9B_DVMXh ziaAlV^WkU4;r_rr1q@yF{z*Z`jpG#;mUaMkqBQn65y8~JUJr_MA~!LFl8R?XzU0k;#Z(8eAy%C&gX0b82un8~c8S?fiE zAJpm^x}N#yb_4ixu2Sa8<zv10!QFVmSZ(o*p}_27tKKMve7~{6wDQ!{4I141a+}8$s>g(gYxp13K+L{%UP$OR zx5^N_mn&Rd$c{+&{U+NYm!DD79Nd1YCuF)UH&pIsP5DY>@oFQEbSDV%0dWt@h8w3S z{Wi_kVtQB#wR9df$!Q@3r!d!?=FCCbGG*Pvzx>8eEBZ_Dt^&=?1|BIv}%HD@8XK?32g zQY>2gP39;%x>zmywj|y&?eD&&m-dEWHn&*hORt8Uauturhl!!9EJ|#*R4ZSlite1d zS<**!%<2qEq^j5tUCT(^9oLmpQmU+8#T?Ygt)uu=^Qe;1#!JIQx;R-*y>V?AF%kLQF7uD+}*zl!<>py zMtst}VtZG<=+*VzvE0b!+Vr5U7TAyI)T<%O{nZ9?9o}aT-Q^%1<{|{T?pN}O=&xe9k^a^Y;@}838ss?Bj)L( zB%(JdcIPHtLvd=NcR0&t(x+7>xu1BYQVBzN=1eg|2yu@%y88ujPE^Vn2RfG}pLQXo z7bbIe)?EUoJ;jp?boPOTYqn`kSr7faPGu{yubCnEelip`U)r)5eL!6Trl0(hx59aC zB2Pb(_aFP7HTfB_=xi1BQg3&caFZRU#;Py7?0QeRS^xk6P)S5VRLXl)pPi=-3qthk z!s@>D&PZ+~rVhsbh2RZNCxcvqo%W8**8R1?u#V@+*uR46H;+U&$MEy}+zI4sT=NAI zT6Xk)mdS8O*`(q|#@;0aH}nZF`jQvK4o}A7`6Ps*e7kXZ%r~};Sw>U7C!yRxHn24{ z`m0575);bklw$VFBbb*gfxD{^)X`NH{rbCjXxS)iY0X`nW0`e7UK0i}Hpe1ott|pO!3m;dNuZ zFN^63d5F8=hrc!azEJbc?DLRX4T-xuSctn_2xT9X*KuBbm6xDj_9lBO`}^7ZQtmk! g{Zgn6a+LW01B!0cXLjHEF8}}l07*qoM6N<$f?GD*zyJUM diff --git a/techage/textures/techage_ta3.png b/techage/textures/techage_ta3.png deleted file mode 100644 index e61e01eb40917d1e0bc1a44f6f9585f315b8be7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8447 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 diff --git a/techage/textures/techage_ta3b.png b/techage/textures/techage_ta3b.png deleted file mode 100644 index 24cf11e940d4abec6b911e77c2a4f0e5b0069c37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3778 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 M07*qoM6N<$f+=pc4*&oF diff --git a/techage/textures/techage_ta4_cable.png b/techage/textures/techage_ta4_cable.png deleted file mode 100644 index 62fb9559ceac96ce1c0b99370362a0d33b08270b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc*U7>s5!=-xi&Eak7aXC2w2x1Q~ zFs>0ckl-|MW0-PKvO%w@mGSb?nGO!&86g@ROAHx04FuQ^F)*=p_`C>mDmy5VbHsvY e@20 diff --git a/techage/textures/techage_ta4_cable_end.png b/techage/textures/techage_ta4_cable_end.png deleted file mode 100644 index 82d329e799e42b01004eecdec23943df5cb0dd8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc*U7>s5xXrHJu&Yrew6G%}>kY6x^!?PP{K#s4ci(`ny<>Uk) zh&{l-xJKAOg44i_Vah?t2EC?M#>+=%Iyi)9gk)T~bm4+Y+l31kUMvq>xKMy?LIOjP pLy$M;P1fWMf{zV+jxqhoVwj*QK4Dg|)H0yK44$rjF6*2UngB*~Jy`$% diff --git a/techage/textures/techage_ta4_cable_hole.png b/techage/textures/techage_ta4_cable_hole.png deleted file mode 100644 index f936c9c7e5605d604dadd8fe55464c6920dcb7f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8&+84TJds*F=FHVFU) z8B2ovf*Bm1-ADs+Bs^UlLnJOICrD%*kYY&P;OmfnU@03P0|Un{#_O^C0n>qM7(8A5 KT-G@yGywo*=^O3< diff --git a/techage/textures/techage_ta4_cable_inv.png b/techage/textures/techage_ta4_cable_inv.png deleted file mode 100644 index 38753eb104da1ca137d675f3d4bfd53fa5b161d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8&+bqq$c8FX(Sb8-d> zGL{7S1v5B2yO9RuD0#X#hDcmaPLK!?kP_u$%H(lS;yKc2(9poBB)qF6L6(ETT!~wF TkLVOLplSwBS3j3^P6na*SN8&+Q|C|LfAV1Fb$<&> z3u`;;pFe*tU$s2G#n`nZ__43=$#bVRJcv9FRL@uv*53pW>t#=OC64$WbHW-?r?(ZYmvZ#Lxa diff --git a/techage/textures/techage_ta4_controller_inventory.png b/techage/textures/techage_ta4_controller_inventory.png deleted file mode 100644 index eb92d12e5ed3fc9edb2f747742fa736d0731cc95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmV;L0cHM)P)0001)*H2bgR&B1*BPtuNvcGV4aV~>O<55x8+t<7~IkhGZlmGw$C`m*? zR5;76)G=zqFcb!08A9n2=!0Mi4IO+1UmyWpL7-L3BNRGo_F&N1B}2Ak74!o2)IBHY zA##R3ONy{u*`bghp$GcF@_S%2t?Rm?`2AY7W_N_TW|`3GEG#yR@uURcoGtifP^O`( zCLR^wZ{~p3BphNsQrL@Y*bG=}k6Cy?^dlL=qcM4iLv$dGkg_E>y5r@^&uTAP(aKg5 z(8cx>?8$fTLD0_d{RiIw)fkqjO2iBlsGf1>!Cf9<*MOlFp?@m}4Y)Mp&I<@}015P$ z&w%SZ1!L&;9Qb&6inA-$-~Dk1ZdNeJ`h13$uMS-2P=e|gZ63M^DiFZy)Qdng9R* diff --git a/techage/textures/techage_ta4_filter.png b/techage/textures/techage_ta4_filter.png deleted file mode 100644 index 90ca758a1710e81e82bfb9579467018da6517f6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16984 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 diff --git a/techage/textures/techage_ta4_junctionbox_side.png b/techage/textures/techage_ta4_junctionbox_side.png deleted file mode 100644 index f91e72f216be00c10fecb5343c68dbc9d6776e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc*6r%YMRV7P6|mb%*7^yK74G2YD}r6oar!3+-1ZlnP@W}YsN zAsXkC6C|PzNbpQx;bCobm=VFKD$u~uF!Kq=ghbu4<;DgrZHp?;A5CRoF_2N?U`tSA ZILsjQfBm`>Q9u(IJYD@<);T3K0RYqBG^+pr diff --git a/techage/textures/techage_ta4_junctionbox_top.png b/techage/textures/techage_ta4_junctionbox_top.png deleted file mode 100644 index b564c011d681ed07f8936e8222a897761bddf51c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 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 P00000NkvXXu0mjf+oT4} diff --git a/techage/textures/techage_ta4_streetlamp.png b/techage/textures/techage_ta4_streetlamp.png deleted file mode 100644 index 2e18a08f203973f398151d2839910c067ef09614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmV+c1OEJpP)3 zhlHi4r2PK-!Nb5~WnxTDODQWUZR_Q}0007{NklfL`PV%XMkw5jiF>aKmZ#9bCw4J%vU<* z&eA#fnyejxGs`>cAW0I#o#ihQFeku+i-9rAm;jFiNLD-(iX7;~oi%HgVT$HU188Dc zd&V$%bzn_^HF56^XdO5cmf%+|DyJp59JkV*vkdk84Zxb^)Vw1!F?im~m-i-I489Aw zhsUcJJWE>T`YHzBE1~pN4BmI@Ly#1M|D}8}Z!rKO<5oXkg8ZS8)l8Ql4V5(KQTe)& zD^0h{_keCRIs;J4tQxF`vLDsb;lp$BeX;;@2LzG(;yclXn;BS;8*mhxW zRJd~l1HgS1Kie3#0zhyk3C~8b4vGNUi1w+@Q3OyCS^)oID|7%DF(A+lfd9WTmjd)q z02>JaMSxri=t=>*5Q6NG9wG%aluPr%dXDVY7ofV>5;3t`^{00#kx#tS$|JMFi$ zlJ15BC?x<%qg(*}E12~Kn5KgPEP4klB>+hwTogooDX`zBG3^2XV!)9PNM(RH69Tdp zQ1SsN1f(KB5XXc7L8r~_*KiON!Y}~w--Yl8w9WT!4w^C)00000NkvXXu0mjfxwk)L diff --git a/techage/textures/techage_ta4_tes.png b/techage/textures/techage_ta4_tes.png deleted file mode 100644 index 240cc9644adff1167fd41bbeb9aec7166673a8e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7160 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 YKZy5_7suXH*Z=?k07*qoM6N<$f+_CF*8l(j diff --git a/techage/textures/techage_ta5_gaspipe.png b/techage/textures/techage_ta5_gaspipe.png deleted file mode 100644 index 7f9106da16678c2cf974b27944cd0a70044a83e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8%R=LRe9e#e3veoKLZ zj3q&S!3+-1ZlnP@GM+AuArhC96C?rzxR??bF63FgfZ-rVYg1#X0>e)e{!h=EL->K} O7(8A5T-G@yGywnt^B&p& diff --git a/techage/textures/techage_ta5_gaspipeB.png b/techage/textures/techage_ta5_gaspipeB.png deleted file mode 100644 index 17659c4b6cc5ef840e0c0fb324b40f4d64ea347f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8%Rd7By)_v!ve4uJ$2 zOM?7@862M7NCR>tJY5_^BrYc>NCXIQvGS~5z;Lj^n^%K@;l~XAkL^<*=>XL*c)I$z JtaD0e0svo)9FqV5 diff --git a/techage/textures/techage_ta5_gaspipe_hole.png b/techage/textures/techage_ta5_gaspipe_hole.png deleted file mode 100644 index 821059dd473e7eb885e2186fdad774e3f6c06546..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8%R=SC~<364O47gBYe zK#H*>$S;_|;n|HeAV=BL#W6(Ua&p1~{TW+%PI2(I8a=B&e6pk6(CP4ko)t?=%Jdnk XtTbP0l+XkKR(d0{ diff --git a/techage/textures/techage_ta5_gaspipe_hole2.png b/techage/textures/techage_ta5_gaspipe_hole2.png deleted file mode 100644 index 9097b83608c48e88b1362ef82415684c2682235d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%R=LRd!UI(CnroW1u z^o7$v7Gp_}UoeBivm0qZj=iUgV~EE2~ae%Vi}fm?|AvoSTxvm zRkZ6I`5DabbZ)yankN4`cG^&o>x}FXtLH3#gtS$a|GQXSI%oQBdx2?=a@@R-br%D& zx9H5}O4wxi@Zxp9rIiyUdtP1ezopr0HcXpga7~l diff --git a/techage/textures/techage_ta5_gaspipe_knee.png b/techage/textures/techage_ta5_gaspipe_knee.png deleted file mode 100644 index bafe337013bcd671e19b3179b26361eec6447a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8%Rmu744en(Azm2c0l z<^jbSOM?7@862M7NCR?QJzX3_BrYc>EU>@OY?$K6lAV!}q0@12Th3K4j^wASB8w09 ztTb53X>e3{!7WFngacv>$vz5a5{^!3%A7C7mip&^zYY__R#PD_u^tyepn(jYu6{1- HoD!M<6Kyi2 diff --git a/techage/textures/techage_ta5_gaspipe_knee2.png b/techage/textures/techage_ta5_gaspipe_knee2.png deleted file mode 100644 index d0ea4696be18c3801a6e05446dca63dfe9338edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8%R=VmLfJ_k*Im8wF$ zWS}@>NswPKgTu2MX+Vypr;B5V#O36K1^OJktwx)S7WQ26DVextYJgjsR?o!Fb#rr> vrW~|ljBU|naQ0rcFgpuV zadB~2SXfR@j+K?w{Q2_@_H-Tts?7IvaSY+O9(q=huh~JM^`W}i0{2H|#??)J{2MCY zh?;HnP+9hn?W;##^s*JZ^!NWX^iz7SBAxaA_v-I0kDh&=?DAPAW5qmOZQ-`#Ic|DC zViF$yVqeO3XUZM}i^V!CemOhsz8H{au@)TPTFv0;>gTe~ HDWM4fkAY1P diff --git a/techage/textures/techage_tank_cart_front.png b/techage/textures/techage_tank_cart_front.png deleted file mode 100644 index a2dab4ade5a4e2d4b7ce760cb7f80749c8a7b737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;Vt9yY@SXh`xEW4hbUSJ+q zadB~orON#I^9|&MCr_U2tRr2Jo0aUYy=Ki?D=RBmVeYopwlC(bJwWY@B|(0{3=Yq3 zqyahAo-U3d5|?9pd-;wia5NX%uT^+;?|&wL-tD7z#I+Y@uJCZuy7_e3=dP_sUxe^J zz9lxJQ~Bn;{}Vaax!t*FvEbKauk7be*+Jg18leRXcik@Om+X#kXRTr4C>0jCJTXnG zhh^_9MN?jr%GW=xoQ^KH`x^9b!p45v`)fDWGXw>)wLJNf?hSMXgQu&X%Q~loCIGQH BUkLyJ diff --git a/techage/textures/techage_tank_cart_side.png b/techage/textures/techage_tank_cart_side.png deleted file mode 100644 index 70f253d98011d9ad4f149461df0b66b2b2a16f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHF4e$wZbuaKKDk?Hml?lw@nm>QO zvySwnNs~e>RGeZtfJ)Y^S*s|{8x|Ips0goK2TpS*zNgQDn3Pj{R-+t|34nMcfEgG93<6SH{B#s)=IRbH0M5-bZF9Njs2 z_zb6r-tFBNU1B>|an*`HWtF8rgW4wCUU=2v#VLUz%`F;RtnN%@Tym8)gTZO{1)sUb o>3-)zQZC%Fe0kUU?9IsxO6EG2;!3vvflgrXboFyt=akR{0Ek>xFaQ7m diff --git a/techage/textures/techage_tank_cart_top.png b/techage/textures/techage_tank_cart_top.png deleted file mode 100644 index 5cb4f8e03b8a90e2e9c1bb35ba0f8a5e79db9e2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUojZ5#s#U8uZQ8`n!jv|F zH?fNA#EBC<<&l5NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc*j);4w>OB{WCQ}gov|NkHI>A^0L(vl#*UOHXub47@BoK`fV0byi-N8UuC1F5Wo9(6@(6OZ bNJ=m)+An{0Q9Ijvpdk#Nu6{1-oD!MNS%G}U;vjb? zhIQv;UIICs0X`wF?gc*j);12_J`*0Kd4p7x1o;IsI6S+N2INS4x;TbNTuz>GjDhX4 ngqx(oF)f1`#|%tGcn&c{T+y}?61ZFpRL0=x>gTe~DWM4f6O$yV diff --git a/techage/textures/techage_terminal1_top.png b/techage/textures/techage_terminal1_top.png deleted file mode 100644 index cd25c337150d783cb5e3a593e0ddce53fcfefaae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8%R3kwTDUdD5*SmHEex7gG@RgK7JU?y$ie8~>XxC^5_nd?MC4e0n_ynK1~)eo;{}cdT5q%r pY}olY#KqOUSPghw1tmln7-n;7e)i6qs13A_!PC{xWt~$(695r3Ggklr diff --git a/techage/textures/techage_terminal2_back.png b/techage/textures/techage_terminal2_back.png deleted file mode 100644 index 481cd25541cdfb4b7525dffe0b92f9d30da2324b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFix$smX|3P1d9C)=JZqq!s;7%%h{WaOgayn3ysS+E3eH)g0y>OF nDh`LVn2$DCGru#K!@#il5O4pfyFVI%8W=oX{an^LB{Ts5Dzqkt diff --git a/techage/textures/techage_terminal2_front.png b/techage/textures/techage_terminal2_front.png deleted file mode 100644 index 7239366dbf833174babd868cb71c2bcfb8ce1dd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKSN8%RlQgeIi|6dzwJEeM zCw*$ITSZLSqMrZ%|4-hzEK11j0#GGmNswPKgTu2MX+Tbar;B5V#`)v~38w=RoDHl! zQyw@-Dha&O;9yf)8qnAw(9xjnb6~5gpppQa=!pWx*Mh~KEnFPS9Ji=&9b$RVu#725 zAWzE2;f$-mBLnjl4q9jQRRbD77<4rJE?MEgapkw>!c#YxIg~jJS*A>2U}k2hTdI1~ T`G9UE&~64#S3j3^P6NS%G}U;vjb? zhIQv;UIICs0X`wFix$t>w0Ui9ZKdeE?(;xF8BZ6-5Q)pl2@51STAA3`71{+`*zB3# dJqrzBVDQT2Z|}LCqYPBX;OXk;vd$@?2>|~oBN+ey diff --git a/techage/textures/techage_terminal2_top.png b/techage/textures/techage_terminal2_top.png deleted file mode 100644 index c67ac2f36bbfd5c72120e8b43ef030a861c9d798..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8&+HEWkIT093Rke8P; zVPf~1mEk#-98o|%V@Z%-FoVOh8)-mJgr|#Rh{pNkgaiQ>CLRTaB`oY+i|~XFrX$4&Xa|F*tDnm{r-UW|3=26F diff --git a/techage/textures/techage_tes_inlet.png b/techage/textures/techage_tes_inlet.png deleted file mode 100644 index 89f0b7d2c858768499e282c07013d4408e65cad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8&+TYJ3rEq45JJ(Piw z;qh*hxm{*kcQIT9Dqt)L@(X5gcy=QV$O-UtaSYKopPaCOHzBBrnYE)qLB@f#rFY>0 z0ks8e57iH{PEugXYO~lXA>Ftpz)g&Ul}V&gKwLch7I#8K_dA1<<;fL%hkw6_GH4R8 dov@OhAwE>==JYD@<);T3K0RXMdIduR4 diff --git a/techage/textures/techage_tool_hammer_bronze.png b/techage/textures/techage_tool_hammer_bronze.png deleted file mode 100644 index 65ebfbc9a2218c9a91aa4ba4377cd4b7337abbbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647 zcmV;20(kw2P)J5qLHQen3?xAMpL|93}%jQ#7{Zf~OJ zqa0>YK_v_L83Rc90Pq+CbcjgD5rC9AK>9Yo3CJW_4*}*}om4`I43P0-Rj++OC%asnqJm7)+84MU@fbCQ zfxBnlLQ%p}*g_MY`XNUOnK_@JUD>Ac5JTqaEO7JfQZ&gT14qY-7q=!0jv7U)|e^Y9D7GU1%SG_1S+Lu=wJa2Ed&+x zN;(g4jsScNg%wQa_)d-iR~CT7!dVz&svtoR=oNrZdF%t~+Px-Hz*0W>fco$pNl_ge zAYiozScUn#dmBKCvtSFa0bwQj7!aIqURoF|JEIuj{M`eRzX046o7hM7TgL(H!&Mx> h*ta+U>ze)7`U5B=4%zxHiYEX7002ovPDHLkV1ne^52647 diff --git a/techage/textures/techage_tool_hammer_diamond.png b/techage/textures/techage_tool_hammer_diamond.png deleted file mode 100644 index 3721d62930932afa64c7a8dc0345d58673cf6e1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 628 zcmV-)0*n2LP)Px#9#BkFMMrQ<0000sg^fg|uXEGfkwO6g005~^0BA1& zF>`ru1b@{40007XQchC{+=<2q%T=nDQ&!3X5)MppKL-IVUaF-Nx z&?BS(043r>3Q!QjrT_pHeyr#w0XNByOMo>%QS@l+N}ZcU2c#eqh`Zb$B%-6^HLM*P zw2$5&7cGKwni1CfX2D_sPHRn37<@d`#~4sRQR#b9geG+?7-yto()0$+kGO?nhpi4p zO{|SgW{!qv??(k?Ay$&1b8PYN6%kLt({YP|jnc{lf&_M}_1r@uGU~e>r{EqIQS>l# zj}ft86A3W{$v_CZlQs>uvx|=87l|i=Vm|~OqQT_C3fVw-S0ZKJ#0M)Dd()tHgLdnW}xRIU! O0000Px#9#BkFMMrQ<0001`qFK$!Z~FG0kwO6g005~^0BA1& zj*Ct$uo(mZ0007XQchCng|uySb7 z-h01aj0nzYMp*Bgg@^?>tu>9p;O(y7$AAKgN?(&AnAEXg?2(R1(;GB@VhhI!TOEo_ ztc^ovj+$t%M+MD7tRzF{IO6*W5qH7evBkhaX=MUI0=v|qgwhnYP_ z#6nCY#1JF{A?#MhG}z85I+7nH!hDS>Z)cA<2?qVP6f>Jf!F>#!vF1{&+)gnkkE0OK zeA-h8i+5_V({WlQsn@aKFfJtQw5)pEMj>+l#Pe=L%n~ZsMIjE}_wz=Emao_`0(k#m zCzFzI7zn_w?!lN1-JEbo*8)&CFUaK_NQVGucp;?VS5icPM*`4e=!0OhqIYr*cn$y> z7R|yK(}@HVU{WAGWfcSJdVEb;m}m4sBtU(7j;!d`F<>_Xg2F^oJ_E4guh_y@fUMk~ z1H}2^vxUV9GfDv-|9e3G17MtDlloCz`7}UXJf{IlHE96VtNPXY0JVC_%a@o)7ytkO M07*qoM6N<$g5RbH*Z=?k diff --git a/techage/textures/techage_tool_hammer_mese.png b/techage/textures/techage_tool_hammer_mese.png deleted file mode 100644 index 291e9c80dcc88337aad8b05854ad1cef1948aa0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)PKN+)|j3~7hgvgC)CnEMz3n2GWWj2#@HrG=n^UP&JSHVDAS zpqyZ_!gn$TJURdl3uj@it)m13U{C-)<#`Bb8vmL|0r&Dl2x!jFkregV00G+*z$t7n z?IAr`pW)k Z{RZ6!2|cAfjQ{`u002ovPDHLkV1ndy6ea)w diff --git a/techage/textures/techage_tool_hammer_steel.png b/techage/textures/techage_tool_hammer_steel.png deleted file mode 100644 index 7a8fd95eb7e21b5217d5346a2e0d632d86a87d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627 zcmV-(0*w8MP)Px#9#BkFMMrQ<0001~sj1S^(*OVekwO6g005~^0BA1& zl97?9jYT{F0007XQchC3pl zt$>Ie@&LYiwhaM&fK+RiHa7+y4tH;Rq-^IJ(N(v$T=nDof0B}|)MppKI(eQ|xK9c? z=n+x?fD&DF8r)?<=}Vz$W=|39tbuiXM$!sZ+CPZ zVr?8UbJRq8J1S@vVkH?m#}WTt5OEjW9a{_>lvXAXB(OWJXAgQveLrtxX!(krBY^im z?POB&4Fdr<)IAupqni`%=vDyg<`ub|1L+U|4KIWg{7Q-l@JIl941EynHuO%e0WSeS z!=hOjV>*#w0!#{|r>tT?U5~FR3-gRVhyPx#9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN010qNS#tmY3ljhU3ljkVnw%H_001XYOjJcoX>kAm0Bvn_+KPch3lOj-xlwr2vNy!UR3$N}I%B^sHEaDJM; z!EOK(Xg!T01F&a^ommht4ly`U)HBbBStnqOc>pKyYUJPOXGF|Ax6T*_q8&TF4xFb% zcu0mi4%_kMh2A1aXI&gr38;40LO6~-q#ev3`wGI zRRz>n#D*9SiLq4zoJJ0;sxEJeBr$p{fPgv~Tvj7PtS7}M00UPU$isz*FAW7i16KsB z*s2C&=dq!nCZtdTh9L;?!Bi|7=(4;x?75v>^-yWM8Cy3K@yyyY#h~iaHmFh9PEHPt zTiK$MW-c-;&T(j5Du7m>Rlf}}hWq<^G;*NMJfi11uq_s%cFJnk9FDXhD$ygA_dp4l zC$EE08)6$pyx0h1tG<+Sd8i4Z=%E8maY2S!D(7-(2u40nU$>vo%?Z;}xqNO2{N87Z zSj0gf>6N61rl4m-vn>EZiP=X@a7F@p3_J%K?=iz&!EG*}uy_+Di$#d&?iDD4)(&A8 z-|7P2FJ6K;N#y_Th1>w#L&{uba~fq%qFS;004_gL_t(2&&86#4MH&tL!)fa4T6;o za_9nC0mK5Z0u!(|ZoYuup7K#7A3!&JlJ$h6<=E8vs8cKel$vR?9?nvDL5bc#0@I-q16B!~7uyP7y9xD)9;9n8I Z!@#PqCF!{Na4b+UgQu&X%Q~loCIEw&Bzgb< diff --git a/techage/textures/techage_trowel.png b/techage/textures/techage_trowel.png deleted file mode 100644 index 11d7941b0a3a11a1b6aee5c44fb8e954e53976cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv-2k5uSN8%RZf@@TacWP~GWb}PtxvOjM3#Q)}cy{g;KKtnQ?(ae( zH)NS%G}U;vjb? zhIQv;UIID%0X`wFKADBfRxJhcHgDfFVM>2cRfi8qT}hB%FoVOh8)-m}i>HfYh{pNk z1PK=hmjD+RiH?U%ZHJl^GC0HqLYSBxTevzH!lvI6;x#X;^) z4C~IxyaaOO0(?STeKHG|ty&7?ZQHqZce(xL$-xt*^l!{GUm9zalbc;7?85@mRubeF z%;50sMjDXQ>FMGaVsZNIL~lN3MIPtlrLzpa?=R?Gpd}c&ah9vD9n(A>zUyDZg=7NC z3(iO{_*-XUz0vx?Rt^oBum?vN=P}qJp)78&qol`;+0D!4t>i_@% diff --git a/techage/textures/techage_tube_junction.png b/techage/textures/techage_tube_junction.png deleted file mode 100644 index 433d2e8c27d9dbc10048233fced4561a3520f182..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)R}P)Inb<00DGTPE!Ct=GbNc00A3GL_t(2 z&rOkAYQsPbMQ00QTZGJUHapH3no4`EU@IkUX%e zsIvV^R?FQAAQu0K*lNk2021MLJAnYa<-h=#NeL4`6r6!M;t;s5Yh8f43}W}{ zFv(%Ed%)JgV3Itf5saxmyQ9%SDJ4d9z$Vu$Sh>R_g%O}71Gn?j>S!$sTAL2~;*xB9 zh&qFJjd=0qthJ@vWzg3C#7nn4(f=y6^^lkDBV69tN9bu&UuXl01**R2!BHUfxI6N9 pX{-KnShf`)k`K!s@!lvI6;x#X;^) z4C~IxyaaL-1AIbUeKHGgEsQ%<=em8@wq>i9UYQnls>5qXk?n*j{i~Bra&oiXRv$43 z=`0EI3ubV5b|VeQdFtun7-Dhy?Ido#76T5K?KP+G{Xf7R@>;_7(4w`Sd(JSteg3&W z+F4ICT)F*tI`%TiMp&{yzD3~p)~!_orctZ3>9%) zyeZe(F0!#O#5F8C$`-P~BhrD5L5IJaZ3SbfD|ex~HRGl%3&s~tG9pqZc0?|5@=IWz z>du{apliXrj(u7p3wT3r`VA*u z+_Gt!?@%f@(KzqH(M2MD2mZP$a`$n>GlcO^5Bt`7^q-^R?RmzREt|X_vhzM+f729O RRRQ!cgQu&X%Q~loCIB(alEwf4 diff --git a/techage/textures/techage_tube_knee2.png b/techage/textures/techage_tube_knee2.png deleted file mode 100644 index 50b32056a129ec927c097f8cbf02b2f8de74aea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-1AIbUeKHG=G`cNYwRBIp!|i#|mnH@8-nVPx)(sP;^sh@Z%gN0?_JzqD zq_ZT*FPOpM*^M+HXN#wcV~EA+x03?-jwo=roK|4{_K!Vo%hr{G-&nl&_vnAtnfds~ zd86l*Ok(qyIu7&ISQ)MpEj%IAvGS|pNg;-=OkWiSMl%OpCN+nw>O;H%3@#oFZyQW9 znJ>gPa%V6HsBqOW&Sc`A@aHI#2-m-*7yhwL^D9^-!O1^CbIS7OVpcr`j&GkPG7FUH ze=}hGl*IqecwxYf;4xDYgf)Xx^-{%f7aO-S^pJJ SSo9X?eg;ohKbLh*2~7a!Sa`Pp diff --git a/techage/textures/techage_tube_tube.png b/techage/textures/techage_tube_tube.png deleted file mode 100644 index 72b8602b07b5f163ca1ec8d00fd1d19dd4d1b550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-1AIbUeKHFV)w$kX7`trM(rvr8UY!=UtHka^yVry%{cBTAb8@r)ZIoF9 z(peJZ7tG-B>_!@pv(eMVF~s8Z+dxjC76l$=;RQebv*+_`zjz~jM&s5p-YHW)9ds08 zQd}S(&mx!+ckCY6LL2Zb{e|C9bhfKx&%A$sQ{a z(IAK9w#BS{Whw`lG$u~D%)R#Fxq|I+k=*&L)`wTG&;7G7xZ(d1;eAJcbGi9EVE!q# z_k85nlRsDG7EN8z6ub5Akyqc1-5qCrHFzP|8W}SGY<_9@m+MY?yX`INj%%=Q-Ealo zaXvXg!o|Va)7hD|;~|rumY2c{7V!WhHfGfpt_}t{Q7HjN-aA@03QTf4LRUDjgsgbY z*O5Olr}2ka;^`|BwtU(2blt=sET=AAV7)Ybt&gTe~DWM4fGs939 diff --git a/techage/textures/techage_tubeta4_junction.png b/techage/textures/techage_tubeta4_junction.png deleted file mode 100644 index 0c27a9dd5dd7e8cf6bdfb07e2e58e14cbef1e94f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 404 zcmV;F0c-w=P)Ix$HpIQZyD2ZQ%g)Nh#>20%uIcOOIzO_Vo}44D0!07-00DGTPE!Ct z=GbNc009_DL_t(2&t=jvOT;h~2k`e5(m=)Wnx%(R5)ivLn`2ZE9g5hqZZ0a0Culo* z1!+Hk3WpBonpGF6ql@@qd}%po+BcN&h!h!9sU8RB#68`6*C0@0000Iz(-P%S)Ma0F!>Fem!*3-SeyUNVSud%K&IIx|boJmf#xJ15k00002 zbW%=J068g^MKAyW0KiE^K~yNuV_+B*fDuf(Ab>wuz}XlMY;g$K?B2b5`M$JMt5&Un z2$*XqX-rj5D~+5v3nrk^0Tfs{6HQ=~Qjj`KpaUdOI(6!Fh=4UvMG#ORG%^aRqNAfD zs6B0ys**O`7KjviqaKjX^3R0ak6IDPnXeKEt82{d>-d?@x?0o?s2LSs= VTJxUEB}V`N002ovPDHLkV1g8deG>ox diff --git a/techage/textures/techage_tubeta4_knee2.png b/techage/textures/techage_tubeta4_knee2.png deleted file mode 100644 index 983a79edd9a1d7f2d976e22bcfb02cd8756f4be3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvtpJ}8SN8%RAQK3@0#56j9eMTU z#om3pA3b?^`_4@_SJ$i8FK^niarWF<`X+$2eiy-4juJqO}8fzvdkmiP*;#dsK@_Yt@8MgS&et iPurXO{pM~a2R;T1RiD)*kv~^~9PR1q=d#Wzp$Py-uvtI= diff --git a/techage/textures/techage_tubeta4_tube.png b/techage/textures/techage_tubeta4_tube.png deleted file mode 100644 index ba51f736bbb9fab9de575c29409cd2497b145fa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKSN8&+M^7HSdh_z;?dx6v zr}fQ_?AyQR$g#uQcWhm-aDL9-dN!a+#*!evU3NZ5RLQ62@)y?Sa}Uv z7BTuXzI+-mfsJh@&&gwLZA}gdIyo6UEMh!okDXYsqiLasrw1nw3oCD9)=>!|-bALh zwgg=R(JqJL2BkEf)~+Te1w}NS%G}U;vjb? zhIQv;UIID%0X`wF?gc(TW>x=^q>|QvxEz7)e?9{FOeH~n!3=ts-a)tvE-Ia@P@z{BK*2h?Q37*{+ z71w$}=#}@B-2s~Oww~PY!4NS%G}U;vjb? zhIQv;UIIB<0X`wF?gc)gf_!IB97v7GT0Hg1jP7fUjEvDvuj|sfKki}u|NlSJpFcAv zP1(L?vr}^II*<`1L4Lsu4$p3+0Xg$LT^vI+&L<}v;G5FG(7Jxwv}r9Whn8q)OjFZX z(h#7ap*$^PMq9ul4Gm?D3=NGI0S^%oA8&7G4h`w%M!^_|tM1{RFE340uwm+Ja!_be zdGJW-(Thh-{;i7_F5F;nmGwgIM}wSg0(p)?1?-$t6u29e#0boj|HrP z%Y39{cbAu&Xeu1-cB`zMEVOS%@(hE<$&+0eSr{0m%{Fn}!YP{tbSZ67#f!QPGfY}@S$+wu| z)y*9=E!~}j7PH-9?#X6OVRSKiXx;U}sw8mk>xKRMgr-P8jBlI2?0k4m!0a0i?zN2j XZ8^@H9d}9v8qVP9>gTe~DWM4fzE?a+ diff --git a/techage/textures/techage_watermill1_inv.png b/techage/textures/techage_watermill1_inv.png deleted file mode 100644 index b7f26fcfd31787bdf3ee07d9e0dc5d01dd2ea11b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^3h)VWbuaK)+ThumX;YtQ5bmrR zWUs7KxLFG*%UBZR7tG-B>_!@pqweYA7{YNqSs;OdS&eNDPZ}F5NApCDHb%DQ4Wd3g hhx*#iooYPg$k4o;+3TH1W7cWHK47|z7 Y5O<8};TOdVra;vUp00i_>zopr0RF}!jsO4v diff --git a/techage/textures/techage_watermill3_inv.png b/techage/textures/techage_watermill3_inv.png deleted file mode 100644 index e58e307c114d871f4b715780d4d174c2a5284a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uI>dsOB=l!l8nNgRa@4$ z^aI5iOM?7@862M7NCR@DJY5_^IIbrrD99N!a-<0ybP0l+XkKb>|>4 diff --git a/techage/textures/techage_watermill4_inv.png b/techage/textures/techage_watermill4_inv.png deleted file mode 100644 index 8198c86bf7831571baca43fc8c7946f44911a643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZbuaL#OE757v{}~Z72=@0 zu+F1B+xG5qfipk_j3q&S!3+-1ZlnP@cAhSdAsp9}1A=(W%=m(Xk_r+Sn8nx_IhrRr zG9F53>NHTkB5~jf$AXoKM-18}6;m4$`C?ApF!A&ZymCW=q1m3*@N%)dB+w)VPgg&e IbxsLQ06~W^jQ{`u diff --git a/techage/textures/techage_weight_bottom.png b/techage/textures/techage_weight_bottom.png deleted file mode 100644 index be4db17a0ff725e206b2325bc996122ee5b71814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iS0L?P-~%Khy&e4>%;wCR zS(uwuebKcHD8yV6gnPbqH%uigp0g~6?j}GCNQSGUcMG`Rmi|e+ z@JHTz!^D{jx1?yeyB%Rse;_*F>}Yt@q_Ycd9h$L!0{h#ENB^Bav|KkoH^V7Z`A?bx P(7_Czu6{1-oD!MS{hZs}eXIs9K_>X!Typ`Uc(IJwOx^j%6#1iFsF)78&qol`;+0DU7^JOBUy diff --git a/techage/textures/techage_wind_turbine_inv.png b/techage/textures/techage_wind_turbine_inv.png deleted file mode 100644 index f589768d2789fd66b05f24ee0a33fa153e4b2b4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1643 zcmV-x29)`UP)s5%gf8>=l{FC(bUt^$j8T(m8QbN!n?e@4g>_q%HpD- zvzVf(a0m*muD#&k`I()aq`TUT3=PPcnbg+rld;u`m6lEd0@>T!GyniBTN7ShWJY5) z9U~{hhK5ajI%sQjgoTh_dR2LOf_#vA#>mikdU0rqV>38EOi^0Nx3{9MpQv$imO472 zUtp0Z*~0(;1%ydNK~z}7jhBmhsyYybQ)4lb7!*a_T1pYc3u3G7e*afHlbH~L)^kp* zeqLDrteMG$vi?~z98&4G{`0Y%tY3c{tRGqc5SGu?^Vi|<3E-`9AXW4<^b<7#`kXz_ z!3#ZintA*7bq)ZRgVM|U(8DJ59Axt+4whg+!h=a2Ix(qToHlBQ0^b6le`ZY*ltU-< ze+>f&$$$YY`;#?gJ--V#zmM)YpgvFzOQUyJKFQlB89+OibhHe^U_HP0KY!xiI%xaA zqc8{nVT$m73NU&_a2>{@ zkp;LM5D;J<$oReXHaN%!765aJ5L{~$-XJiOaB`Ol^kv=z$3XyE4~79nFrhskwxUKk zC+m}B)W{tmv{hu8PJ&5*2qZKWrN+YR8m&8h16aCELDt)p5LO?!#zOEQZe!yZSwLUd zPD*ioA8$|LWYQo)*VwhKnWp5P=0W^1 zh<|?m?*8_$7zZo{Il$CEQT~FX1%%DU#-i`t>MA(TzHKo~TQLPAr_`<72e`SEDaE)_ zTFGyh2^J%P%5AnCxdFVma2)q-9W z0ECL@JySnEVfHBhJOLoRM8YAATv!K+XIKX3<53>RY?@xugyi_t@Jayuyz$D=>&mwv zAC1`MSS=Gx*F$Xd;Q%c99KSz0K>2=vn+sc{RhmRi0YwMEc`zAx2rHkFoEA1qFXb^6 z+L+f@ZTkoS4wLZ=OJL$5NdE50jf1M1-o(m`-A<7Obif5a^XP8 zuM;5N9Oy=oLm#wV5Ds8AStx})9UcKAlfq5X#VfOs`9-vMUf@BTac}?CL3xbm+KeNh zEn<6Inw`qDqtg@t5qI}Tc$?M&To>ARu*MV}aD&5sPXN`N>(bt#7(}EW9WY#8QlN=+zuEYJ z_Bt-iUeIyS=?8;tLL{fn1_28LV9o*jakePV2#~VV1qYO7uSxbTfU~R(097jUi>X0m zopl`;8gyMqks81P2IH6jOZ*4&r-X~4u+-YQ_1yguz0$NUI? pi^FM=)^&bK7m@0&2rmt=@DKC}qDPM=DG&ev002ovPDHLkV1i2d`zrtd diff --git a/techage/textures/techage_wlanchip.png b/techage/textures/techage_wlanchip.png deleted file mode 100644 index 9ebe01cdc3dcb9779b62509e06b5319a9439d199..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmV-!1CjiRP)Px#IZ#YgMMrQ&W@ek4o6gVDOG``s{{9LI3W|z~@9*!hu&|7;x~c#G019+cPE!E?|Nri;V`ecp z=3P^x0008LNkl|2Z$+y?Zxa=^EbvIvj!vWLFP4-j5`243g8nU%R|1xp%JKHv#iEU zw8aBwzdQ>C;7-8Ln<#|_HS`{{WGtgzSiRQ3?E<#1cN4Wisam}UmdF@St3ir3(*|Io zAh$9_y>F`reJZ;RuoBpuqcq|JU?b&R0CMjV(3%LeA^}M+@Bkor!ImE63V3OvbUkE4 z5OW0x3uFxPC&*6)v?e|tQZzObP1XTKFP+{2m?;Elr+>zH08nZJJRZw)B1Ls;T)!C=+{J9E;@&@H7N3S(_0hA&d&-RVFh_LSqGVL-=Uo zN|9leNslEnHNE8%c_pdm-Amu9NpT!y1BZ0yK`Gq^##L>zhKzo z1>=5A{00;E*E~BA&1+sY(GCGFX5lWN49!$QEnKI7?vsaH0<3M@?gG1Dl~;iCz~QNh_9{>OV diff --git a/techage/textures/techage_wood50.png b/techage/textures/techage_wood50.png deleted file mode 100644 index 18914f2df86b11f938e6325d54fadbc9d62834dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZbuaK)+Ta=Hq|%mYQ=e!s zx6(D)TkF>=KP{jF#*!evU 0 then - local names = table.concat(tbl, ", ") - minetest.chat_send_player(user:get_player_name(), S("Pump connected to tank(s) with: @1", names)) - else - minetest.chat_send_player(user:get_player_name(), S("Pump connected to no/empty tank(s).")) - end - end - - minetest.chat_send_player(user:get_player_name(), S("Position")..": "..minetest.pos_to_string(pos).." ") - itemstack:add_wear(65636/200) - return itemstack - end - elseif ndef and ndef.description then - if ndef.techage_info then - local info = ndef.techage_info(pos) or "" - minetest.chat_send_player(user:get_player_name(), ndef.description..":\n"..info) - end - local owner = M(pos):get_string("owner") or "" - if owner ~= "" then - minetest.chat_send_player(user:get_player_name(), S("Node owner")..": "..owner.." ") - end - minetest.chat_send_player(user:get_player_name(), S("Position")..": "..minetest.pos_to_string(pos).." ") - itemstack:add_wear(65636/200) - return itemstack - end - end -end - -local context = {} - -local function settings_menu(pos, playername) - if minetest.is_protected(pos, playername) then - return - end - -- Check node settings in addition - local access = M(pos):get_string("access") - local owner = M(pos):get_string("owner") - if access == "private" and playername ~= owner then - return - end - - local number = techage.get_node_number(pos) - local node = minetest.get_node(pos) - local ndef = minetest.registered_nodes[node.name] - local form_def - - if ndef then - if ndef.ta3_formspec or ndef.ta4_formspec then - form_def = ndef.ta3_formspec or ndef.ta4_formspec - elseif ndef.ta5_formspec then - local player = minetest.get_player_by_name(playername) - if techage.get_expoints(player) >= ndef.ta5_formspec.ex_points then - form_def = ndef.ta5_formspec.menu - end - end - end - - context[playername] = pos - if form_def then - minetest.show_formspec(playername, "techage:ta_formspec", - menu.generate_formspec(pos, ndef, form_def, playername)) - end -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "techage:ta_formspec" then - return false - end - - local playername = player:get_player_name() - local pos = context[playername] - if pos then - --context[playername] = nil - local number = techage.get_node_number(pos) - local node = minetest.get_node(pos) - local ndef = minetest.registered_nodes[node.name] - local form_def = ndef and (ndef.ta3_formspec or ndef.ta4_formspec or (ndef.ta5_formspec and ndef.ta5_formspec.menu)) - - if form_def then - if menu.eval_input(pos, form_def, fields, playername) then - --context[playername] = pos - minetest.after(0.2, function() - minetest.show_formspec(playername, "techage:ta_formspec", - menu.generate_formspec(pos, ndef, form_def, playername)) - end) - if ndef.ta_after_formspec then - ndef.ta_after_formspec(pos, fields, playername) - end - end - end - end - return true -end) - - -local function on_place(itemstack, placer, pointed_thing) - if pointed_thing.type == "node" then - local pos = pointed_thing.under - local playername = placer:get_player_name() - if placer:get_player_control().sneak then - settings_menu(pos, playername) - end - end -end - -minetest.register_tool("techage:end_wrench", { - description = S("TechAge Info Tool (use = read status info)"), - inventory_image = "techage_end_wrench.png", - wield_image = "techage_end_wrench.png", - groups = {cracky=1, book=1}, - on_use = read_state, - on_place = on_place, - node_placement_prediction = "", - liquids_pointable = true, - stack_max = 1, -}) - -minetest.register_craft({ - output = "techage:end_wrench", - recipe = { - {"", "", "default:steel_ingot"}, - {"", "techage:iron_ingot", ""}, - {"default:steel_ingot", "", ""}, - }, -}) diff --git a/techage/tools/pipe_wrench.lua b/techage/tools/pipe_wrench.lua deleted file mode 100644 index 27182df..0000000 --- a/techage/tools/pipe_wrench.lua +++ /dev/null @@ -1,41 +0,0 @@ -local S = techage.S - -local function remove_pipe(itemstack, user, pointed_thing) - local pos = pointed_thing.under - if pos and user then - if minetest.is_protected(pos, user:get_player_name()) then - return itemstack - end - end - - if(pos ~= nil) then - local node = minetest.get_node(pos) - if(node.name == "techage:oil_drillbit2") then - minetest.set_node(pos, {name = "air"}) - itemstack:add_wear(65636/200) - return itemstack - - end -- if(node.name - - end -- if(pos ~= nil) - -end -- remove_pipe - - -minetest.register_tool("techage:ta3_drill_pipe_wrench", { - description = S("TA3 Drill Pipe Wrench"), - inventory_image = "techage_pipe_wrench.png", - wield_image = "techage_pipe_wrench.png", - groups = {cracky=1}, - on_use = remove_pipe, - stack_max = 1, -}) - -minetest.register_craft({ - output = "techage:ta3_drill_pipe_wrench", - recipe = { - {"default:diamond", "default:diamond", ""}, - {"dye:red", "default:steel_ingot", "dye:red"}, - {"default:steel_ingot", "", "default:steel_ingot"}, - }, -}) diff --git a/techage/tools/screwdriver.lua b/techage/tools/screwdriver.lua deleted file mode 100644 index 47a3639..0000000 --- a/techage/tools/screwdriver.lua +++ /dev/null @@ -1,160 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2020-2022 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Screwdriver - -]]-- -if minetest.global_exists("screwdriver") then - -local S = techage.S -local M = minetest.get_meta - -local USES = 2000 - -local function base_checks(user, pointed_thing) - if pointed_thing.type ~= "node" then - return false - end - - if not user then - return false - end - - local pos = pointed_thing.under - local player_name = user:get_player_name() - - if minetest.is_protected(pos, player_name) then - return false - end - - local node = minetest.get_node(pos) - local ndef = minetest.registered_nodes[node.name] - - if not ndef then - return false - end - - if ndef.on_rotate == screwdriver.disallow and not ndef.ta_rotate_node then - return false - end - - local yaw = user:get_look_horizontal() - local dir = minetest.yaw_to_dir(yaw) - local facedir = minetest.dir_to_facedir(dir) - - return true, pos, player_name, facedir, node, ndef -end - - -local function store_node_param2(user, node) - user:get_meta():set_int("techage_screwdriver_param2", node.param2) - minetest.chat_send_player(user:get_player_name(), S("Block alignment stored!")) -end - -local function turn_node_param2(pos, node, ndef, user) - local param2 = user:get_meta():get_int("techage_screwdriver_param2") or 0 - if ndef.ta_rotate_node then - ndef.ta_rotate_node(pos, node, param2) - else - minetest.swap_node(pos, {name = node.name, param2 = param2}) - minetest.check_for_falling(pos) - end -end - -local function turn_left(pos, node, ndef) - local param2 = techage.param2_turn_left(node.param2) - if ndef.ta_rotate_node then - ndef.ta_rotate_node(pos, node, param2) - else - minetest.swap_node(pos, {name = node.name, param2 = param2}) - minetest.check_for_falling(pos) - end -end - -local function turn_up(pos, node, ndef, facedir) - local param2 = techage.param2_turn_up(facedir, node.param2) - if ndef.ta_rotate_node then - ndef.ta_rotate_node(pos, node, param2) - else - minetest.swap_node(pos, {name = node.name, param2 = param2}) - minetest.check_for_falling(pos) - end -end - --- on_use == on_left_click == turn left -local function on_use(itemstack, user, pointed_thing) - local res, pos, player_name, facedir, node, ndef = base_checks(user, pointed_thing) - if res then - if ndef.paramtype2 == "facedir" then - if user:get_player_control().sneak then - store_node_param2(user, node) - else - turn_left(pos, node, ndef) - end - else - return screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, USES) - end - - if not minetest.is_creative_enabled(player_name) then - itemstack:add_wear(65535 / (USES - 1)) - end - end - return itemstack -end - --- on_place == on_right_click == turn up -local function on_place(itemstack, user, pointed_thing) - local res, pos, player_name, facedir, node, ndef = base_checks(user, pointed_thing) - if res then - -- Support for anvil - if node.name == "anvil:anvil" then - return screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, USES) - end - - if ndef.paramtype2 == "facedir" then - if ndef.on_rotate ~= screwdriver.rotate_simple then - if user:get_player_control().sneak then - turn_node_param2(pos, node, ndef, user) - else - turn_up(pos, node, ndef, facedir) - end - else - return itemstack - end - else - return screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS, USES) - end - - if not minetest.is_creative_enabled(player_name) then - itemstack:add_wear(65535 / (USES - 1)) - end - end - return itemstack -end - -minetest.register_tool("techage:screwdriver", { - description = S("Techage Screwdriver\n(See: TA3 > Tools)"), - inventory_image = "techage_screwdriver.png", - on_use = on_use, - on_place = on_place, - node_placement_prediction = "", - stack_max = 1, -}) - -minetest.register_craft({ - output = "techage:screwdriver", - recipe = { - {"", "default:diamond", ""}, - {"", "basic_materials:steel_bar", ""}, - {"", "techage:baborium_ingot", ""}, - }, -}) - -end diff --git a/techage/tools/trowel.lua b/techage/tools/trowel.lua deleted file mode 100644 index bffeb91..0000000 --- a/techage/tools/trowel.lua +++ /dev/null @@ -1,68 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Trowel tool to hide/open cable/pipe/tube nodes - -]]-- - --- for lazy programmers -local P = minetest.string_to_pos -local M = minetest.get_meta -local S = techage.S - -local function replace_node(itemstack, placer, pointed_thing) - if pointed_thing.type == "node" then - local pos = pointed_thing.under - local name = placer:get_player_name() - if minetest.is_protected(pos, name) then - return - end - local node = minetest.get_node(pos) - local res = false - if minetest.get_item_group(node.name, "techage_trowel") == 1 then - res = networks.hide_node(pos, node, placer) - elseif networks.hidden_name(pos) or M(pos):get_string("techage_hidden_nodename") ~= "" then - res = networks.open_node(pos, node, placer) - else - minetest.chat_send_player(placer:get_player_name(), "Invalid/unsuported block!") - return - end - if res then - minetest.sound_play("default_dig_snappy", { - pos = pos, - gain = 1, - max_hear_distance = 5}) - elseif placer and placer.get_player_name then - minetest.chat_send_player(placer:get_player_name(), "Invalid fill material in inventory slot 1!") - end - end -end - -minetest.register_tool("techage:trowel", { - description = S("TechAge Trowel"), - inventory_image = "techage_trowel.png", - wield_image = "techage_trowel.png", - use_texture_alpha = techage.CLIP, - groups = {cracky=1}, - on_use = replace_node, - on_place = replace_node, - node_placement_prediction = "", - stack_max = 1, -}) - - -minetest.register_craft({ - output = "techage:trowel", - recipe = { - {"basic_materials:steel_bar", "basic_materials:steel_bar", ""}, - {"basic_materials:steel_bar", "default:stick", ""}, - {"", "", "default:stick"}, - }, -}) diff --git a/techage/wind_turbine/pillar.lua b/techage/wind_turbine/pillar.lua deleted file mode 100644 index 31c83b9..0000000 --- a/techage/wind_turbine/pillar.lua +++ /dev/null @@ -1,44 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2021 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - pillar - -]]-- - -local S = techage.S - -minetest.register_node("techage:pillar", { - description = S("TA4 Pillar"), - tiles = {"techage_concrete.png"}, - drawtype = "mesh", - mesh = "techage_cylinder_07.obj", - selection_box = { - type = "fixed", - fixed = {-10/32, -16/32, -10/32, 10/32, 16/32, 10/32}, - }, - collision_box = { - type = "fixed", - fixed = {-4/32, -16/32, -4/32, 4/32, 16/32, 4/32}, - }, - climbable = true, - walkable = true, - paramtype = "light", - backface_culling = true, - groups = {cracky=1}, - on_rotate = screwdriver.disallow, - is_ground_content = false, - sounds = default.node_sound_stone_defaults(), -}) - -minetest.register_craft({ - type = "shapeless", - output = "techage:pillar", - recipe = {"basic_materials:concrete_block"}, -}) diff --git a/techage/wind_turbine/rotor.lua b/techage/wind_turbine/rotor.lua deleted file mode 100644 index d84245a..0000000 --- a/techage/wind_turbine/rotor.lua +++ /dev/null @@ -1,396 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019-2022 DS-Minetest, Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - TA4 Power Wind Turbine Rotor - - Code by Joachim Stolberg, derived from DS-Minetest [1] - Rotor model and texture designed by DS-Minetest [1] (CC-0) - - [1] https://github.com/DS-Minetest/wind_turbine - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local STANDBY_TICKS = 4 -local CYCLE_TIME = 2 -local PWR_PERF = 70 -local COUNTDOWN_TICKS = 2 - -local Cable = techage.ElectricCable -local power = networks.power -local control = networks.control - -local Rotors = {} - -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} -} - -local function pos_and_yaw(pos, param2) - local dir = Face2Dir[param2] or Face2Dir[0] - local yaw = minetest.dir_to_yaw(dir) - dir = vector.multiply(dir, 1.1) - pos = vector.add(pos, dir) - return pos, {x=0, y=yaw, z=0} -end - -local function is_windy() - local time = minetest.get_timeofday() or 0 - return (time >= 5.00/24.00 and time <= 9.00/24.00) or (time >= 17.00/24.00 and time <= 21.00/24.00) -end - -local function check_rotor(pos, nvm) - local resp, err = techage.valid_place_for_windturbine(pos, nil, 1) - if not resp then - nvm.error = err - return false - end - - local npos = techage.get_pos(pos, "F") - local node = techage.get_node_lvm(npos) - if node.name ~= "techage:ta4_wind_turbine_nacelle" then - nvm.error = S("Nacelle is missing") - return false - end - - local own_num = M(pos):get_string("node_number") or "" - M(pos):set_string("infotext", S("TA4 Wind Turbine")..": "..own_num) - nvm.error = false - return true -end - -local function formspec(self, pos, nvm) - return techage.generator_formspec(self, pos, nvm, S("TA4 Wind Turbine"), nvm.provided, PWR_PERF) -end - -local function add_rotor(pos, nvm, force) - if (force and not nvm.error) or check_rotor(pos, nvm) then - local hash = minetest.hash_node_position(pos) - if Rotors[hash] then - Rotors[hash]:remove() - end - local node = minetest.get_node(pos) - local npos, yaw = pos_and_yaw(pos, node.param2) - local obj = minetest.add_entity(npos, "techage:rotor_ent") - obj:set_animation({x = 0, y = 119}, 0, 0, true) - obj:set_rotation(yaw) - Rotors[hash] = obj - end -end - -local function start_rotor(pos, nvm, state) - if not nvm.error then - local meta = M(pos) - nvm.provided = 0 - techage.evaluate_charge_termination(nvm, meta) - power.start_storage_calc(pos, Cable, 5) - local hash = minetest.hash_node_position(pos) - if Rotors[hash] and is_windy() then - Rotors[hash]:set_animation_frame_speed(50) - end - end -end - -local function stop_rotor(pos, nvm, state) - nvm.provided = 0 - nvm.load = 0 - power.start_storage_calc(pos, Cable, 5) - local hash = minetest.hash_node_position(pos) - if Rotors[hash] then - Rotors[hash]:set_animation_frame_speed(0) - end -end - -local function can_start(pos, nvm) - check_rotor(pos, nvm) - if nvm.error then - return nvm.error - end - add_rotor(pos, nvm) - return true -end - -local State = techage.NodeStates:new({ - node_name_passive = "techage:ta4_wind_turbine", - cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, - formspec_func = formspec, - start_node = start_rotor, - stop_node = stop_rotor, - can_start = can_start, -}) - -local function node_timer(pos, elapsed) - local nvm = techage.get_nvm(pos) - local running = techage.is_running(nvm) - local windy = is_windy() - if running and not windy then - State:standby(pos, nvm) - stop_rotor(pos, nvm, State) - elseif not running and windy then - State:start(pos, nvm) - -- start_node() is called implicit - elseif running then - local meta = M(pos) - local tp1 = tonumber(meta:get_string("termpoint1")) - local tp2 = tonumber(meta:get_string("termpoint2")) - nvm.provided = power.provide_power(pos, Cable, 5, PWR_PERF, tp1, tp2) - local val = power.get_storage_load(pos, Cable, 5, PWR_PERF) - if val > 0 then - nvm.load = val - end - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - end - if techage.is_activeformspec(pos) then - M(pos):set_string("formspec", formspec(State, pos, nvm)) - end - return State:is_active(nvm) -end - -local function on_rightclick(pos, node, clicker) - techage.set_activeformspec(pos, clicker) - local nvm = techage.get_nvm(pos) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function on_receive_fields(pos, formname, fields, player) - if minetest.is_protected(pos, player:get_player_name()) then - return - end - local nvm = techage.get_nvm(pos) - State:state_button_event(pos, nvm, fields) - M(pos):set_string("formspec", formspec(State, pos, nvm)) -end - -local function get_generator_data(pos, outdir, tlib2) - local nvm = techage.get_nvm(pos) - if techage.is_running(nvm) then - return {level = (nvm.load or 0) / PWR_PERF, perf = PWR_PERF, capa = PWR_PERF * 2} - end -end - -local function after_place_node(pos, placer) - local meta = M(pos) - local nvm = techage.get_nvm(pos) - local number = techage.add_node(pos, "techage:ta4_wind_turbine") - State:node_init(pos, nvm, number) - meta:set_string("owner", placer:get_player_name()) - M(pos):set_string("formspec", formspec(State, pos, nvm)) - add_rotor(pos, nvm) - Cable:after_place_node(pos) -end - -local function after_dig_node(pos, oldnode, oldmetadata) - local hash = minetest.hash_node_position(pos) - if Rotors[hash] and Rotors[hash]:get_luaentity() then - Rotors[hash]:remove() - end - Rotors[hash] = nil - Cable:after_dig_node(pos) - techage.remove_node(pos, oldnode, oldmetadata) - techage.del_mem(pos) -end - -minetest.register_node("techage:ta4_wind_turbine", { - description = S("TA4 Wind Turbine"), - inventory_image = "techage_wind_turbine_inv.png", - tiles = { - -- up, down, right, left, back, front - "techage_rotor_top.png", - "techage_rotor_top.png^techage_appl_hole_electric.png", - "techage_rotor.png", - "techage_rotor.png", - "techage_rotor.png", - "techage_rotor.png^techage_appl_open.png", - }, - - after_place_node = after_place_node, - after_dig_node = after_dig_node, - get_generator_data = get_generator_data, - on_timer = node_timer, - on_rightclick = on_rightclick, - on_receive_fields = on_receive_fields, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), - ta4_formspec = techage.generator_settings("ta4", PWR_PERF), -}) - -power.register_nodes({"techage:ta4_wind_turbine"}, Cable, "gen", {"D"}) - -control.register_nodes({"techage:ta4_wind_turbine"}, { - on_receive = function(pos, tlib2, topic, payload) - end, - on_request = function(pos, tlib2, topic) - if topic == "info" then - local nvm = techage.get_nvm(pos) - local meta = M(pos) - return { - type = S("TA4 Wind Turbine"), - number = meta:get_string("node_number") or "", - running = techage.is_running(nvm) or false, - available = PWR_PERF, - provided = nvm.provided or 0, - termpoint = meta:get_string("termpoint"), - } - end - return false - end, - } -) - -minetest.register_node("techage:ta4_wind_turbine_nacelle", { - description = S("TA4 Wind Turbine Nacelle"), - tiles = { - -- up, down, right, left, back, front - "techage_rotor_top.png", - "techage_rotor_top.png", - "techage_rotor.png", - "techage_rotor.png", - "techage_rotor.png^techage_appl_open.png", - "techage_rotor.png", - }, - paramtype2 = "facedir", - groups = {cracky=2, crumbly=2, choppy=2}, - is_ground_content = false, - sounds = default.node_sound_metal_defaults(), -}) - -minetest.register_entity("techage:rotor_ent", {initial_properties = { - physical = false, - pointable = false, - visual = "mesh", - visual_size = {x = 1.5, y = 1.5, z = 1.5}, - mesh = "techage_rotor.b3d", - textures = {"techage_rotor_blades.png"}, - static_save = false, -}}) - -techage.register_node({"techage:ta4_wind_turbine"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - local node = minetest.get_node(pos) - if node.name == "ignore" then -- unloaded node? - return "unloaded" - end - if nvm.error then - return "error" - elseif techage.is_running(nvm) then - return "running" - else - return "stopped" - end - elseif topic == "delivered" then - return nvm.delivered or 0 - elseif topic == "on" then - State:start(pos, nvm) - elseif topic == "off" then - State:stop(pos, nvm) - else - return "unsupported" - end - end, - on_beduino_receive_cmnd = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 1 and payload[1] == 1 then - State:start(pos, nvm) - elseif topic == 1 and payload[1] == 0 then - State:stop(pos, nvm) - else - return 2 - end - return 0 - end, - on_beduino_request_data = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == 129 then - local node = minetest.get_node(pos) - if node.name == "ignore" then -- unloaded node? - return 0, {techage.UNLOADED} - end - if nvm.error then - return 0, {techage.FAULT} - elseif techage.is_running(nvm) then - return 0, {techage.RUNNING} - else - return 0, {techage.STOPPED} - end - elseif topic == 135 then -- Delivered Power - return 0, {nvm.delivered or 0} - else - return 2, "" - end - end, - on_node_load = function(pos) - local nvm = techage.get_nvm(pos) - add_rotor(pos, nvm, true) - start_rotor(pos, nvm) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end, -}) - -minetest.register_craftitem("techage:ta4_carbon_fiber", { - description = S("TA4 Carbon Fiber"), - inventory_image = "techage_carbon_fiber.png", -}) - -minetest.register_craftitem("techage:ta4_rotor_blade", { - description = S("TA4 Rotor Blade"), - inventory_image = "techage_rotor_blade.png", -}) - - -minetest.register_craft({ - output = "techage:ta4_wind_turbine", - recipe = { - {"dye:white", "techage:ta4_rotor_blade", "dye:red"}, - {"basic_materials:gear_steel", "techage:generator", "basic_materials:gear_steel"}, - {"techage:ta4_rotor_blade", "techage:electric_cableS", "techage:ta4_rotor_blade"}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_wind_turbine_nacelle", - recipe = { - {"default:steel_ingot", "", "default:steel_ingot"}, - {"dye:white", "techage:ta4_wlanchip", "dye:red"}, - {"", "default:copper_ingot", ""}, - }, -}) - -minetest.register_craft({ - output = "techage:ta4_rotor_blade", - recipe = { - {"techage:ta4_carbon_fiber", "dye:white", "techage:ta4_carbon_fiber"}, - {"techage:canister_epoxy", "techage:ta4_carbon_fiber", "techage:canister_epoxy"}, - {"techage:ta4_carbon_fiber", "dye:red", "techage:ta4_carbon_fiber"}, - }, - replacements = { - {"techage:canister_epoxy", "techage:ta3_canister_empty"}, - {"techage:canister_epoxy", "techage:ta3_canister_empty"}, - }, -}) - -techage.furnace.register_recipe({ - output = "techage:ta4_carbon_fiber", - recipe = {"default:papyrus", "default:stick", "default:papyrus", "default:stick"}, - heat = 4, - time = 3, -}) diff --git a/techage/wind_turbine/signallamp.lua b/techage/wind_turbine/signallamp.lua deleted file mode 100644 index e4884e4..0000000 --- a/techage/wind_turbine/signallamp.lua +++ /dev/null @@ -1,109 +0,0 @@ ---[[ - - TechAge - ======= - - Copyright (C) 2019 Joachim Stolberg - - AGPL v3 - See LICENSE.txt for more information - - Colored Signal Lamp (requires unifieddyes) - -]]-- - --- for lazy programmers -local M = minetest.get_meta -local S = techage.S - -local logic = techage.logic - -local COLORED = minetest.get_modpath("unifieddyes") and minetest.global_exists("unifieddyes") - - -local function switch_on(pos, node) - node.name = "techage:signal_lamp_on" - minetest.swap_node(pos, node) -end - -local function switch_off(pos, node) - node.name = "techage:signal_lamp_off" - minetest.swap_node(pos, node) -end - -minetest.register_node("techage:rotor_signal_lamp_off", { - description = S("TA4 Wind Turbine Signal Lamp"), - tiles = {"techage_rotor_lamp_off.png"}, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2/16, -8/16, -2/16, 2/16, -3/16, 2/16}, - }, - }, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - minetest.get_node_timer(pos):start(2) - end, - - on_timer = function(pos, elapsed) - minetest.swap_node(pos, {name = "techage:rotor_signal_lamp_on"}) - return true - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - paramtype2 = "glasslikeliquidlevel", - sunlight_propagates = true, - sounds = default.node_sound_glass_defaults(), - groups = {cracky = 3, oddly_breakable_by_hand = 3}, - is_ground_content = false, - drop = "techage:rotor_signal_lamp_off" -}) - -minetest.register_node("techage:rotor_signal_lamp_on", { - description = S("TA4 Wind Turbine Signal Lamp"), - tiles = {"techage_rotor_lamp_on.png"}, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-2/16, -8/16, -2/16, 2/16, -3/16, 2/16}, - }, - }, - - on_timer = function(pos, elapsed) - minetest.swap_node(pos, {name = "techage:rotor_signal_lamp_off"}) - return true - end, - - paramtype = "light", - use_texture_alpha = techage.CLIP, - light_source = 8, - paramtype2 = "glasslikeliquidlevel", - sunlight_propagates = true, - sounds = default.node_sound_glass_defaults(), - groups = {cracky = 3, oddly_breakable_by_hand = 3, not_in_creative_inventory=1}, - is_ground_content = false, - drop = "techage:rotor_signal_lamp_off" -}) - -minetest.register_lbm({ - label = "Restart Lamp", - name = "techage:rotor_signal_lamp", - nodenames = {"techage:rotor_signal_lamp_on", "techage:rotor_signal_lamp_off"}, - run_at_every_load = true, - action = function(pos, node) - minetest.get_node_timer(pos):start(2) - end, -}) - - -minetest.register_craft({ - output = "techage:rotor_signal_lamp_off", - recipe = { - {"", "dye:red", ""}, - {"", "default:torch", ""}, - {"", "default:glass", ""}, - }, -}) From 72947f1f58144f5078b583b3b9e7495898f5a088 Mon Sep 17 00:00:00 2001 From: Andrey Stepanov Date: Sat, 7 Dec 2024 23:33:46 +0500 Subject: [PATCH 2/2] [techage] add API for custom sieving recipes --- techage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/techage b/techage index ce8b08d..e33bf60 160000 --- a/techage +++ b/techage @@ -1 +1 @@ -Subproject commit ce8b08d2d7937a46e643da1eb745a8ac6bf4598f +Subproject commit e33bf6050a6f75dd1aa6c551eb389f0dd5228124

zFM&hN(n`bOWK{v{j!$aKm?FNtcVLZ`xLLnNVQF(ybP0l+XkKp&EWn diff --git a/techage/textures/techage_appl_ta4_cable.png b/techage/textures/techage_appl_ta4_cable.png deleted file mode 100644 index ab2fe7aa248f07ba903e13fee00d8097ca7496e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8%RAQK4M7}VA=7@epx zPCnJO2*_tH3GxeOFpkMNu*VR{)%0|64AD5BoFGx=5Eu}^;p%YX#tnhc14mhX516)0 iU}zI7aW-5dE5^XEteQ2jQg=PbOa@O^KbLh*2~7Y3kR=@e diff --git a/techage/textures/techage_appl_tank.png b/techage/textures/techage_appl_tank.png deleted file mode 100644 index 62fd1ecebd1c6ab25b5eadb4f83243a9c59f6f8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc&`9v%zk&%Y@v8)SX(6i87?kY6x^!?PP{Ku(aSi(`ny<>Z6~ zb^^S-yo?un0#}FWmNFPcgfluaOgPAv vS$7mNrYLkU8ci_#_y7NTz7x}eBpDdG)*D<1Ig?ccG@ZfI)z4*}Q$iB}fIvHH diff --git a/techage/textures/techage_appl_tele_pipe.png b/techage/textures/techage_appl_tele_pipe.png deleted file mode 100644 index 4cd509baab857c7e8ae091437fe4811ca09e92c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8&+C;ObfT?>7GK1gqZ z|9+r2V@Z%-FoVOh8)-m}j;D)bh{WaO1PKWNDJd!Lv^`OO^F?QD%=))_YJ%I#zkj_I il^hs?Wvm?Du`n>M;L|ETVV?@r$KdJe=d#Wzp$P!5r6`sF diff --git a/techage/textures/techage_appl_tele_tube.png b/techage/textures/techage_appl_tele_tube.png deleted file mode 100644 index aaffc3d6d78e6f186ada45cae1fdd93bca93dc21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%ReX}D64({8&V{1-k z<}UAV96%|?k|4ie28U-i(tsR4PZ!4!jq}L~5SbC;Roieq@ zcS5LywxpzDhy^oiL)C;34d$IEn9jMmxg9%p%%e?8n_1T}jL}TwWYi%&Ss@07&uP5M UoNk;AK$96fUHx3vIVCg!00y@)TmS$7 diff --git a/techage/textures/techage_appl_teleport.png b/techage/textures/techage_appl_teleport.png deleted file mode 100644 index 1a18d594730e5058ac03a116f03e2578a525d78f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NeCp4xzM*{(D8g70 zBN5qp|AfXBqaX-&reABcc8wZaqr)U%xq=9?fE5c zy!x+dVDM)GyH@1^K9xTEwwDaTLP8Er8yP(edm_N*7(!O@Y|0yLJv)78&q Iol`;+0Av<5BLDyZ diff --git a/techage/textures/techage_appl_tes_core.png b/techage/textures/techage_appl_tes_core.png deleted file mode 100644 index e5afacafb093a146fb32e98cfecb7a9408a2fb8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=Bu8XD>{@YI2%OM?7@862M7NCR?IJzX3_IIbrrD2V;}&#%m9 ukSx^BZ)~tZzNn5t@j%R)R|3lf*ctkiM7|cDF!Tg!VDNPHb6Mw<&;$T;3nzX6 diff --git a/techage/textures/techage_appl_tes_turb.png b/techage/textures/techage_appl_tes_turb.png deleted file mode 100644 index d693c1483b0c3799988c70442e274c54b7a9fe34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=Dkxw&0hSP7Oc3GxeOaCmkj4Ja+|>Eal|aXmRff!Uy$BTrzX nR7dzj)dOA%T{|CEb+R*j)#t3S=lS^?sFcCe)z4*}Q$iB}3Oy)e diff --git a/techage/textures/techage_appl_timer.png b/techage/textures/techage_appl_timer.png deleted file mode 100644 index 249393484c73a6aabe163c090bb06eaba70f24e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=E9YH55;G&KN8mjw9*GdMiEkp|=>db&7Zc2Ys)Mu(B6-^Qo%J@dXi;M7|__h05&kAlTh{o-z( z+#IZ?<=ULm$MRuv=Prkj+wvP`%wV7QAYzWLSf+g3C#JqPg0r`AIfnu*WAJqKb6Mw< G&;$UH=tx2U diff --git a/techage/textures/techage_appl_trafo.png b/techage/textures/techage_appl_trafo.png deleted file mode 100644 index 30c99c728fb0546cfc69cda106347a075af5ed00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(N?Ck6etG#4_B8(+L ze!&b5&u*jvIhvj>jv*Y^lM@tpB=`-?4Gb&{7-zcHIXG!Cc@(f7h*0Tl^l6;oF2lf} Xx}WoSM$E(sKurvuu6{1-oD!M<@Z%q4 diff --git a/techage/textures/techage_appl_turbine.png b/techage/textures/techage_appl_turbine.png deleted file mode 100644 index e3068f4ae89d4778f489b69415e41bdfd76aaf9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)SN8%RFV8q2ud1RVC@9F# zz~JQZ;|u1`PfJbBiuC&elwd3g@(X5gcy=QV$Z7C&aSYKopPaBjPe4S(<)JZ`rsg6p zm4%!fi#R#B7IJVf{XD^>pcliCA>9(sBFa$gP&1>Uz=%VHxpAYS%K{0uS<(lYlvE8K zJmL^EXk=W`utJlkh0Td2%8|j-VFf2sPtOEdHZjLSD-V{l#VeQ+TwgFgX_0G@V0zKm eBgmV=%KP)7bN=aUHYim0&FwVZdQc_ZYe}AK#oP%CoopEuml$2cx3hy4!RsaA10d!JM zQvg8b*k%9#0QN~lK~zY`?bI;}!axuO&qW0^$wADz=KT7bFKzynt9(TZpv~ zun$-Y60jG^ecajE2|JU*#v)*T_aA{wX2S--Z=;lAy%i1z95w=!02MM&ruzW31oJlR zZwIzOC+KV;g-JX`C@2opi{eIC4~m2ClaeeEZV(T`43p>nU{=`ZcO&BCIKV@hTu^0& zU!iggwTaf6^>)ta) zj8Bwgg|L8l5X~^hqd%AxHadv-I1ct9xuBg~VFl!pE5}fqH1|hye>C^U|J)xR%^)q3 TNhXcw00000NkvXXu0mjfoFS46 diff --git a/techage/textures/techage_appl_turn.png b/techage/textures/techage_appl_turn.png deleted file mode 100644 index fbc8b33d657dc5b78fbb564c351a8c9565534d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(NEW^^fmxrVSMHowh z{DK)Ap4~_Ta%??a978y+CnqR~X>4HVWHD1HY?#^DxDf~&fA;@nWP4Wsm0d#OHg7ufEm2$(61)$%3$QZ;KIHj0m9Mi5Xb^*^tDnm{r-UW|TEi^A diff --git a/techage/textures/techage_appl_warehouse.png b/techage/textures/techage_appl_warehouse.png deleted file mode 100644 index f4fb3a0e45093f6b2e561b47008f5cc9758ded3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%xx)=CZ+gZEcs;LA?mjw9*GdMiEkp|?*db&7VS)SN8%RJ3G77l$83qy6%pS zxwB>k2L}Ts*Q{DKxpmVkAd9gi$S;_|;n|HeAjibh#W6(Vd~(79aRHZf0mTVCtObo6 z8V%el92hS$J#AVRpb+7=jzRKT(noJ05spdn4qMn67RSpU)MV(H2Gq~s>FVdQ&MBb@ E0Eh@K)c^nh diff --git a/techage/textures/techage_appl_winch_hole.png b/techage/textures/techage_appl_winch_hole.png deleted file mode 100644 index d4c26740ee2fc9e79b800e090056eecf7986f84a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9t9yYDkU3wgB@jq4mIV0) wGdMiEkp|=ldb&7!Lje1&X`gzqdMyi*@D03rAG3e#&0ee+MQX^ zo>AC*n4_dJz~yd5`%>R!?+tEMRKGo6^10`$!Fh>I5-o*FPPSgft7YW7BDYzD=oR`d i3z&V*zfSP_BYqxH_M-P&*5w1OWAJqKb6Mw<&;$T^%}7uH diff --git a/techage/textures/techage_ash_side.png b/techage/textures/techage_ash_side.png deleted file mode 100644 index f382e26ce644ce4677dc92299529b16b5decc64b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uI>dsU%!5R`SRtzfB)K= zeu@Ic8B2ovf*Bm1-ADs+tUO&DLpZJ{NBpnLlW_ie{YypL_x)M_jn4e8|7(5t^rzL^ yCCm1&|8r`B;7`^03swCdDK$F_Gz&8)GBCK#5Nk{|_;Lei3WKMspUXO@geCxlaymc& diff --git a/techage/textures/techage_axle.png b/techage/textures/techage_axle.png deleted file mode 100644 index 6de95a61b3b465c46c959f43a50c2077d4a0eb81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv^#Gp`SN8&+w)*OoYgZKHWK@@jt)kn@w7Z&;r}N#F`4y}7 zOVsvpYx(mVS)c#BnNdh*?H|W) zm3ulkCP;3Jk(X_kkTpmuE1vr!L42_br<1aDdv1Bw?A;es94_X}Z<)KeGNbc}m#FT) zrKVo4370ml5y@P;!t8{EhfhA6yV+Oa{KgHXyDqN{kFWfiW8wdwX~k0OFOP2vZw2~? N!PC{xWt~$(69D6fdvpK* diff --git a/techage/textures/techage_axle4.png b/techage/textures/techage_axle4.png deleted file mode 100644 index e7998ec966b5fd84279147fca866cef55b367a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}iUB?$uI>dstJW+B@+S6mwl!3j7UZTU#k+X=>6qCpnKNzA!9A9BNl_r3 zB|(0{3=Yq3qyag1JY5_^JdVGex|@$lQNZ=NI7jQQrS%(Te%<=^TvqO(56oQGj-_Yo zY%$Mv%KQ_kXksVjExhw7Z%p0{;f8m!AEc|kpD8kPiqn%vdd8gVBrTt}2=rd7dM1<5 zYO(E%kBR79Z^mhy>l2;pjJdb5b#T4n|F-*bovFHhzQVUC>-9^Op7Mr;_})rifB2ZX zp@IH3E2(8+DF+RtWu2cdF>!8u@hegHwP|2zQkpa6!O=v0FOQSU5(Av%b7bPCeh|&eyfE=!fp_41A%3-E za%pqs3Y~j=qc6&1?(6MQGkDHEbj`nYaZf>umX4pJ`=6&PobN^*=~k9~7;*oluepgo zTiEw%*@>s$mK>QLWA%21%Z>amJ(s5S`>WbKzow^@U+NZe$gF!o`2Mz-GmkWl_w3`} zo%Hqf|6Dtcp9)W!C-6HVGZwJRmmgqPmhY)C_;m0DyVa|J?P4DvG1y7`d;pX=$o`Ex vdA|XOSg@F{G+Xc?^Y7M;@jv9hoHjo_=k;H~S0?9y;m6?V>gTe~DWM4fnrE+p diff --git a/techage/textures/techage_axleR.png b/techage/textures/techage_axleR.png deleted file mode 100644 index be3697f201e93d08a62579b226262c4e1e559022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmV-&0ge8NP)FP*`>nsU!tgp012Sj(memA1+t28kN}E`*7+|3kyV&BqZw)f zR1tC*%~}&-B!Mv5`R}iYA`1u`o0=>})&lh0LS!vwE{$&8$SSV6B&MvEMK;5&BklK6 zBmparjuvTTEm3J1F4Cb$0)`ohDbmPJzgU>)B90s{VW7xH@k^m#iU=h30fy69nVi@4 Q5dZ)H07*qoM6N<$f+#bS+5i9m diff --git a/techage/textures/techage_axle_bearing.png b/techage/textures/techage_axle_bearing.png deleted file mode 100644 index 61be451bdad12ea1efe842b83c8b4467af80a43b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8%RAX8ac*IMt@QSB57vmN5>@|q?04M-?yHYwUyAAdzYa8t!PC{xWt~$(6963OE@%J% diff --git a/techage/textures/techage_axle_bearing_front.png b/techage/textures/techage_axle_bearing_front.png deleted file mode 100644 index 175fb565ff4e455c7f8ab5a9c85d803bda4c133f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efSN8%RWo2a`Z}C=bejvqI z666=m;PC858jz#n>Eak7aXC3*fxZB5qmj~dC&^6Xg*|Jg2DquUdE5#rdHaQl;r%3b U=9^h8AS)O=UHx3vIVCg!0CXlG8UO$Q diff --git a/techage/textures/techage_axle_clutch.png b/techage/textures/techage_axle_clutch.png deleted file mode 100644 index e53996a1a1bac7ccb015e9bc980a6d5a96b6d358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8%RAQJ*MY+Mx@96V#@ zq}RFu^MFFkB|(0{3dsKqdri*tjY*IC#d)Nw0MS<^hG6OM?7@84SWN*qc=Wxr;nq z978;gznyxJ_pkzw>t(+Sc^704=p#eNi@17~~&MS3j3^P6iWSN8%RAQK3dty&5sH*H<- ztidy3N`I!KcxZ6&jG2=fe;@w|lwd9i@(X4#2)|%&Rt4mq_H=O!(Kx?$q9I?CfkbPk zxk1Z@s@7#!?$2E`v3CpavCyV9OAfL6Okmzo(q0`E<&%|E@-X-Br+?SKZ=bh)$`TQV zBa9dKz3RHbxSdlbhJCHoD=Q9$V&kyv#b;|+P8`uVa)L>R_kjp+i1x?Kr1c9-=Q~K9 z+j*O*aMhHuDdEhwgg!0~^5@lKoAaxx!>})C|9fFon=Ep)90ggUs-3(bdJb&mD~dK O7K5j&pUXO@geCy7!hg*G diff --git a/techage/textures/techage_axle_gearbox4.png b/techage/textures/techage_axle_gearbox4.png deleted file mode 100644 index 5c68afd7b11430bab7423d86fef4ebc022a1f23f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 573 zcmV-D0>b@?P)Px#8&FJCMMrQ<0001{s-*w`0J62Ol9iBRJrz|`Q#vCG z5g3*b00002bW%=J05i!$tS$fm0kTO%K~zY`)s??)gD?=r(>G{Q@&I6*FmoVS10?Fo zA4Qp?)?yBW_mDcB}j+ZwPuksV)by6fr5zVbk2r-yBu<#7<+9e>3x!^BkUZ*x=pp-e9FCpw2 zGY%-Nm~arnmZZ6BS;#j?D=di_w@JxoE0pq=#ie!Z>$FX}XinEUVxTT6ihPE%fd+8QYd^ZD#*3Mtm$u3Ci^MTp04<=#IzvXwDiR za@dGZjvo7A=fH=JxX?P@A>(fGu~^Zbk3B!?F4g#e z5g)F`2L;qUCxQ=JF+R$J#s~S(_>lX1jE^O$)#>lbTIFNpn3#`mPTI(X9eVN200000 LNkvXXu0mjftq|^< diff --git a/techage/textures/techage_baborium.png b/techage/textures/techage_baborium.png deleted file mode 100644 index bccad7cb8e4db142686ecf96cf084e1f4d0f23d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFs4`rP0LXbd-|iu9h;8x{@HjUZlBQ*3U|`iC!It5s(KLl4VPiw%MTQj-l1GXd dqFUClF!a7-io0Lz-2*g=!PC{xWt~$(698DiG_n8y diff --git a/techage/textures/techage_baborium_ingot.png b/techage/textures/techage_baborium_ingot.png deleted file mode 100644 index a3e0feb2a6a3860e0fd63a4dd424e34da339232e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZbuaL#(N#PZq_kI3@UWW5 zWK;F6P6m}(du)LU7)yfuf*Bm1-ADs+Ts&PILpZJ{Cmi6CU|q0f!Xk#2upp+54qH}D zU})hhGE7Mb;bppXtc^#>D`njxgN@xNA6|XRi diff --git a/techage/textures/techage_baborium_lump.png b/techage/textures/techage_baborium_lump.png deleted file mode 100644 index b4a922085f78ddbfecb4ab00699bcfba4a4ac9c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)Z=8Q5@RWE>p1I2xlz z8=*uRoj#(1JAPhqx1_NeG(xm%Fd;dEIoTk$Y^!-VrktD>QaAWuGDsIz9B2r4x zcv+3zsVbG{MAN{5DTNqg$a73*4g|ZBZFn`~X0_Jd>joQFFC_xX%3!lvI6;x#X;^) z4C~IxyaaN10(?ST-3xpsPMiqj{r~^JrZ{yENKr|UUoeBivm0qZ&OA>S#}JFt$q5R= zf7qEVrvLnZH9&#me?5bmJQr(#>6!3EriTKme-;*eVAM(I7FfZ^{X&_gu7P!nVA>uA z?t+84KesdJ9M~fDtS_8bpfPl{f?n)aENS%G}U;vjb? zhIQv;UIIBn0X`wF|G?n?|NlU`prD|>zJA$F=Wd`ZTS<^#u$h}?_>noC7ou~3A`d)W z978nD$4>I*J7mD)BHPV;BJETxC^4c7Bd9%isb_=C~`P;WGEashf yWa{kb9jAEr?mB*Z$EoZ4Ufj78C|AG#F#GO$wFyz01^a=1W$<+Mb6Mw<&;$UN6Op3; diff --git a/techage/textures/techage_basalt_glass2.png b/techage/textures/techage_basalt_glass2.png deleted file mode 100644 index e7a7b9c7c6de4b86182c238e7ecf90df3fac22e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wF|Ns9lEiL``?;nr>1VBbsR@TdxFQ+)9_yN^$lmz(&=j6I5GU*Sp7kmJBl(O2Z?@iSeR3!6({JlZ zkMqBOmjdHYxh_a?*EF{hpUz<|`JzVCIOIqv zbP0l+XkKwh*bz diff --git a/techage/textures/techage_basalt_glass3.png b/techage/textures/techage_basalt_glass3.png deleted file mode 100644 index 672f79462546861d5a67150fdf41e99a5af4b697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF|G?n?|NlU`prD|>zJA$F=Wd`ZTS<^#u$h}?_>noC7ou~3A`d)W z978nD$4>I*J7mD)BHPV;BJETxC^4c7Bd9%isb_=C~`P;WGEashf yWa{kb9jAEr?mB*Z$EoZ4Ufj78C|AG#F#GO$wFyz01^a=1W$<+Mb6Mw<&;$UN6Op3; diff --git a/techage/textures/techage_battery_green.png b/techage/textures/techage_battery_green.png deleted file mode 100644 index 25edc3d2c7181d4a53509393748ba18c816c0ea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LKSN8%R6ELpZJ{8?-U8J?<4cHf^orWXUyA z&0^A>JG6`&IAnO5H?gD%96Nqsv8+qOnnZ@kj6Hz@8P*~U3?-a$OuHiaI)J7yc)I$z JtaD0e0su(!H75W7 diff --git a/techage/textures/techage_battery_red.png b/techage/textures/techage_battery_red.png deleted file mode 100644 index c825a05459e870a2082a4bcab8037943584e5d30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|exd5LKSN8%R6bP0l+XkKfMh!e diff --git a/techage/textures/techage_bauxit_overlay.png b/techage/textures/techage_bauxit_overlay.png deleted file mode 100644 index f5ea5d6941b85fd15144b9408240700e219ac03d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-uI>ds=eDokvuNhCJ2%g1 zwiW=zSxSQZf*J1Kz5C1T>LDOs!PCVtgyVX00t2%e8%st)LP5d-1}>f+jT*5MR<;Bo Z29sn)34z=fKY(f(JYD@<);T3K0RY1!B;^1A diff --git a/techage/textures/techage_bitumen_inv.png b/techage/textures/techage_bitumen_inv.png deleted file mode 100644 index 6ece17733de477a6975c7e665d383cec5c85ceaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBm3-AeXbuaJ%GUscx1cIbXg8YIR9G=}s19BQYT^vI+&M&>Vk+;Eshs8m_ z^;FLR4awe~X@L@os;rM3H{CxXcwxe;UG?>C4?p|1t>I`})Ny3bH;<_|M7SIG9`0yv zNE2c_At$KO(sI^?Y1MJ2oR*e_2N%wiU02Zg{luk5oUX5GlBO=J7m$r{DL9dvzWWg0 n9(RvB$Ia&K`24p}|2@lT#{It)YTTQFj$!b0^>bP0l+XkKu>@Md diff --git a/techage/textures/techage_boiler.png b/techage/textures/techage_boiler.png deleted file mode 100644 index c0489e17bb6f663d82f38f848959e078e5cb6241..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmV-G0>AxhlXZfM9;Y;OaK4@+DSw~R7l6om0ga)AP~og zM4`TcVGmHU7w`s>aF9M#kKt9k>CP8zjbIa>7TY?>{21uW{3(Q&ak=0f!Vg`UZTNQp z=(yuOsm%@##?!yE4vu&ma8T`Kq8G!GJ;-D$5xmASx`$l%@YFr9E6ZxFP2&0?rBS#B zfc|r$5jp@sVSgGubN~rJA=-dZfBN;N3Df{7;ToTT&;-m1jFP;0rc4fO+j-pry@!Jn zxQU+wKk@eh-~=wCnP6ZW$6*DM50~d#EzB#>*yIMd?g9QgV3P;GlgSaj0v=(nSj#3x zZ#Z=mUqjUeKwOGxoITmwL=|v%w$WO8l3K1t7#3-WxY$ok`v#!R?S4)qj1VxYgB#b{ z&0<&K$de~cEZ(8ouhPpc`R@W-ZRUX??HVNQkrUTII$OlauFrf$# zQJXD*y>w+ zrDF_#haAb9IDDfgN-)Pi<(vDM}`()$A(9k>j{l)~Kr O0000Px#9#BkFMa_RK0001pe_MBMPitgHymTm^nSW+xX3&{f zO)?Z{o!gxN00HnxL_t(Y$IX>ZZo?oDg(oNkvI|x>-C<;PUF8H3;s919njEJ`Xm8y4 z!ExL`t+tyIH+c~sGr-JiAS}l5h<_nG(Gyw2zXPC*3xFPr<_QnV)2GpA*l7a_3{3jE z(2LNc2C%Z2H7%E+${ymhhgkN&Q&FFV$TGu9$cCgFx*0F=?M`8-ku%!M^7=}Brz%m5{V zy;@^7SELi)0jQUR0C(OwaKC<>U&2%_=ZB8KD8Fz5oyC%^DEgG%!aE=&wMB`Oq$CIJrsIa|Q;;ZKW1P zF91)S!qvl;cI)?t^w*N!0E3Mx;oIW0E?Sk0YVjcyDgS3?P)>J*1K+^^Z4H{ zv+u0YyP_8jqv&gvA2mB^KZR(wTxpqB({j7_u8U1y+N%S@(tRm_F0000< KMNUMnLSTX;8V;KP diff --git a/techage/textures/techage_box_back.png b/techage/textures/techage_box_back.png deleted file mode 100644 index 7cb14c0fbaa68389b1593b045c41b50dbef7f3a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 395 zcmV;60d)R}P)Px#8&FJCMFIi>M{rEe(9PoH;o92QJ3c$SzPs)2>#C}# zC7iih00002bW%=JGyu)HKFL-%qLcE@lso{cP| zt{t+Mq$nPZT9VFoG5xc9PCA_O27Uavcaomqr@o+f(K&ZS)W-yhkVu)7l4%W^7nq`T z^)&<+lF_z`aN2{=<`wk&PN?vJodhMq={W-}sH~!B!RAdhSVcWi(>K@9lTrlB5Qn%_ zESzFoe!-5?QZ@`^({1$#KH%IvR^;FUA+wZUaL$2-(Cwby?mM2@GLO7C+{A$I(RUJT zHQ*>M1p)451wWqy5@3UCK+GqW&Sf!o)hIvg^ pQJp?{B!m3f9;5T#c^eU{;Sc^HRY4(Fi0J?T002ovPDHLkV1lY@P)Px#32;bRa{vGf6951U69E94oEQKA03=XMR7C;;0!(Rf z($vx2-P=1pJG{QTWP@00MMUPE#}h&AC3$0003! zNkl!lZueZuaV9@hV5c7MzlGXp2KL4rI&OcA}bg}v}ALCdCT%A!1!cW~r>#I`JnlBV2+ zgu^lbP1Zehk5f$(0)C(atAo|s2oyj^9+Ltv*OS@^Ar(<51byBnR8VgY=Zt6k{4RC) zPx#32;bRa{vGf6951U69E94oEQKA03=XMR7C>=159ag z00000007?J+|AC+)Yj8GK0E5{>AkSJ40f00eYWPE#}hL1<>to02JcP5arg*Pxy;3H7n8^J2YUR0_SatEw+n32XJ+yQIj2vrIa z1215am&@`~fJ^sr_Uv*NC|8*XWiF+>NP(XTpz^s2Ql(USV#40SckZ)Q8raNMAIR4Q zoGloXwgC6b7?d7@u!cYraDE#B2hcLim%gTk?tp)Ury9{)V2LxBxWMt1Eu*$}YO~=` z6?t*%z`o9_8YH#MJ8+o6vm#)a%Q%Xozi2l#CSeP11mftvCvbr)jh)kb0*6jvwTgSM z$ROxE8bBVJg6pwqiF<`6A!u8gF^z&+evciXvHP|qcqfm3F;cknapcjjJ~e350U!@O zYXUOS`>$~3?=;&Lad8_=9ZV4t{9Q{00000NkvXXu0mjfCK}6( diff --git a/techage/textures/techage_bucket_oil.png b/techage/textures/techage_bucket_oil.png deleted file mode 100644 index 7b64680b382139de404eb9168eb2f9b6426715ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa4)6(abuaLlIbni=fJsdjsG%Xpl*-X4`NqM`z(aiUj0F>nXDDiDaHSb&bTv(7kW@V9 drcvg|$Z+l`SJ_fU-4>v+44$rjF6*2UngGW;I!*up diff --git a/techage/textures/techage_button_off.png b/techage/textures/techage_button_off.png deleted file mode 100644 index 60a325c3efb7f38df431e97dd4ea651a7586949e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc&!j0`&7I@X-2T_6=DL4Lsu4$p3+0Xfp1E{-7*my;6~NO7<- n87OC8T{V^Yc!PDb76U`tK^5;mU%0OWl`(j_`njxgN@xNAoI@k) diff --git a/techage/textures/techage_button_on.png b/techage/textures/techage_button_on.png deleted file mode 100644 index 3c24226384290a48e328f9000167f7b0827312e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc&!j0{$btsF0w{ROEg3GxeOaCmkj4akx9ba4!kxSX7@K#GHv n$v`>#>Z+;C#~ZAhwHO%E4yt(n`NDl2sEonW)z4*}Q$iB}6OSda diff --git a/techage/textures/techage_cable_palette.png b/techage/textures/techage_cable_palette.png deleted file mode 100644 index da528b5df7b4bf8a54c27dfb09c078df805e0ae7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUU2AP^YHHe&Zt2jV=v2J) z-W0*|^78-x|4&IFMGa!f`!Wqn(M(LYbFKfX7k8!C=Y)hJzffOf1a863&cG e51CjC*ci5l%O1>m^KunX6N9I#pUXO@geCw1$R%$8 diff --git a/techage/textures/techage_canister_filling.png b/techage/textures/techage_canister_filling.png deleted file mode 100644 index 04ad10fc2ddfb9bf91d3c2accc6ed583554d4ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBm3-AeXbuaMg?CMlG_Fft!T@vIM%;50sMjDVK=IP=XqH#VsK|<}ozyJUF f7xPFo=P@vZ-;Q^enG_WORKeis>gTe~DWM4fAx|bh diff --git a/techage/textures/techage_canister_frame.png b/techage/textures/techage_canister_frame.png deleted file mode 100644 index 4f7e18f2d08e9c2156e1767eb0b07479af1c04cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc(ajvapS;zegyr@5I~P+*{tnXL*)X-SY@FoVOh8)-mJl&6bh zh{y5d1c{u6Kmi^WjuXkD51E))L^%#I`mqY|MRGYgHYl;4&^z*q-=xyVn1#KODY?X9 z6H}IjkbHT_!4*w`tj>{)OP@9iSt&#|J_yk0l4Ru!(Rjklpnco$zRbFf-+;C-c)I$z JtaD0e0sxl^KM4Q; diff --git a/techage/textures/techage_carbon_fiber.png b/techage/textures/techage_carbon_fiber.png deleted file mode 100644 index 8f9e3f6aec4b63c707f6b7ade082bb3e85737420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFYN}d6L6MyuQyXSjd;|*0c)B=-NL)_#XkcRF)JRBZW@>ZOaOgO2 cwMQbBVMe8a=gmr%+dy>;p00i_>zopr0G8JxT>t<8 diff --git a/techage/textures/techage_ceilinglamp.png b/techage/textures/techage_ceilinglamp.png deleted file mode 100644 index 7545650fc4edc1a2fddfc4e67d46e7d15a07595e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8&+OEYbL{rS14-RAI2 z8^xj}JAhJ*B|(0{3=Yq3qyaf4o-U3d8s}Rl9^_>);$sO0I{n}1%mDVH()a&qkk_55p``#10w-wC&#XjiLXr>U9x#2IKmgQu&X J%Q~loCID{tPD=m) diff --git a/techage/textures/techage_ceilinglamp_bottom.png b/techage/textures/techage_ceilinglamp_bottom.png deleted file mode 100644 index 3bd03fe6d33b4dd6d259a7bafbd210437bd17116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8&+pTB>c>~q`GWxb)? z?$TV_L$hreilu9T3K&a*{DK)Ap4~_Ta;iOD978nDuf1@Q_lN=y^M!Q<+A1xK21yOO zUNNjZ@^A5!e_I~ftxxZquP)6w?Wz9HmOp%78&>8NIlsJmWuf_k;7M*Ltkljhx*Yk& zq4mMcdG3LTRc|;NzFGx4ubo=J9%kC+wp*%j61&B6&dHPcRSIn0G4d@)uKwH_|G`TA YT!jj+dCNL4pfeaeUHx3vIVCg!08c_zy#N3J diff --git a/techage/textures/techage_ceilinglamp_top.png b/techage/textures/techage_ceilinglamp_top.png deleted file mode 100644 index abe139e99ff17c77beb336a4df40c33b2b83b407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 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 O000019|Nq=| zmx2z=QwK^d@pN$vu{gc<%5B~T1s>K5>n?0yl$Hof_&;+?SjJ1|WG4BhId`s1Qux9b zu>RnA!}#6Oj0;$qAIKIkUvL+g!eh|9xMIcBtOPbQql0cNJ}w7b7}VAXvSzy+7P^>T znsC9=*>gbx+p4Zt&0WcCLWT;0+{Q_XZZXf5AN8{sS16s1{3ymY*L)_^gXtXaZhkdX wQoPW_c=t!skGefhzghQw-pc=vXZHh^LwC1oCeG$N4RkMqr>mdKI;Vst0L|B4djJ3c diff --git a/techage/textures/techage_charge_detector_off.png b/techage/textures/techage_charge_detector_off.png deleted file mode 100644 index fef26f4d0cd186aeadcba3f5a1dafe7ed9ee1961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-uI>ds|NsAIVq#+W&+ubm zv^7wiu_VYZn8D%MjWi%9(9^{+#Nu>vf&?owYlL&70z+himSf}67fjX{S-&mhelx#I z?}JF}1NB`8^m#;sFR}(*WL3JzddMJWW|!WCEzopr0C|Bn7ytkO diff --git a/techage/textures/techage_charge_detector_on.png b/techage/textures/techage_charge_detector_on.png deleted file mode 100644 index ad2743cace3840b413da8ad56cc18f715a16862a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSJOMr-uI>ds|NsAIVq*Hwz;IP| z(h{IJV@Z%-FoVOh8)-mJkf)1dh{fsT1PNAV)(GcD1%}83Eyu>CFPMxkvMx)UVJI4_ z07OEu3S6-YRa(0a1eY|rcFgpuV zadB~2SXfR@j+K?w{Q2_@_H-Tts?7IvaSY+O9(q=huh~JM^`W}i0{2H|#??)J{2MCY zh?;HnP+9hn?W;##^s*JZ^!NWX^iz7SBAxaA_v-I0kDh&=?DAPAW5qmOZQ-`#Ic|DC zViF$yVqeO3XUZM}i^V!CemOhsz8H{au@)TPTFv0;>gTe~ HDWM4fkAY1P diff --git a/techage/textures/techage_chest_cart_front.png b/techage/textures/techage_chest_cart_front.png deleted file mode 100644 index 3bf8f769cddcf042f70a20a005da5f9724107c66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!O@L2`t9yaZ{Q2|s^z@cDcpAtH zhlPbro;=w>Pp+`AFvL=&BF-YkL;J+Mw2mB?ZT(?ZR#vjY+z&TbwY9cw+O&y*@mf64 z9LAC$zhDN3XE)M-oC;4D#}J9jslD8M%!(W?j)7K3^S}Qq*G;>-?5^G11^Oz^OY8+E z+L>RqbnRKY^@f+`^oaLH&+jbS_QHBz#97xg`=672`lVGo_jx!~IG!n)@$(D+OGd^V zh7U4c2|R}2J1i{h#JseQ92Y%3y>0zrR#sLIH&<=iw5hGN zt&zR)KhQMBk|4ie28U-i(tw<1PZ!4!iOZqA+c$|5?J()G~E*k|}?#n!k-o3Gd2U!I}-iC=hjuuf<)_|DO%xjNVMW@?(@h{9*Z;W>2pZVGI$0X-^ ZW|g-b?2{JAsR5nC;OXk;vd$@?2>{&~W!nG% diff --git a/techage/textures/techage_chest_cart_top.png b/techage/textures/techage_chest_cart_top.png deleted file mode 100644 index 646f9ecfbbd2131b0e358b25ee423b11697338f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!S%6Q7>(qR!B@N!k=cSc~>z+7q zVtar1yb8zFExz{p3Y#`rF{{BxFKap7ec9Dh2l?fNVHEsLbFL>zAoHMn4XN2@_ZJn=f zoSeI0{+}4e^M5%6ivvR)R!mh`=&-52Rgf`YHIKpk7p+&@xUcm-f2C?mNV0CWh0r>mdKI;Vst08!y&ga7~l diff --git a/techage/textures/techage_clutch_clutch.png b/techage/textures/techage_clutch_clutch.png deleted file mode 100644 index 5b0d30b3f88c024ef3b25e8308b32e819387fa0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iSN8%RAQJ*MY+Mx@96V#@ zq}RFu^MFFkB|(0{40<7R%Om80Tz^j&#}JM4$q5o?8axGfL>@5p=xORXs5A(8n6WVl zt1zZdXpro3$k15Db@{@Dgp|ePx#5>QN3Mb*;BvaX)LysgW~y58N>i-&m;y27CV00B=) zL_t(2&mEEB733fYgeQRl*3A`QVhTW^01_zR`mg5L`{R2e&ddj(2JiuY*-znZp&cPj zK90n2P63iLhR0?O7CV7B16_83xPUjrY+g-u4K@6}W_rRiq1)b=szASzyNCNhUY_0J zMHyt4SSi<|lt}$ci%>+@zs6h*uNtvptlMWW3q9{jUs(Elh(OZX_gGF)QSzxhj$WsB zDE8fik=M|exkFM&9J++PG$)2k9cHvih4S;j&^Fe=y?d|-y%^*3L>F43nRhbCa9+BG z3Z>hp3gRUBsMM_7?*jkK3h>w{QuFfjz{p~?fLU@B{%C}d^zA(ufeJr%m7=xSQU~UD zwgd7X3U_%9-v-1;37|U-*Y~3LhF(HHA;)#f{6lL31;5wk4x(KbSE_a{5BjW002ovPDHLkV1i;<%ftWx diff --git a/techage/textures/techage_coal_boiler4.png b/techage/textures/techage_coal_boiler4.png deleted file mode 100644 index 66b72286d84b902499544e687914431c7668dd2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 479 zcmV<50U-W~P)Px#5>QN3Ma;^*)zZhZuAaofvfka(i-&oV+|$Sa00C=B zL_t(Y$L*5Aq2M40L?K#$L<&gE79e5)5^3P~-^}v2hCSvwz{rz<(unvX+iU~*Owg`{ z4R0eSHFgAY_T6or*@$HhpglH;R3tPcK4BltqKU*-pL83zyE&OV!C4!Z5bCdFX3Oj; z2H}*~rg*@8#UOALF-&64^I9FY^qj1^0_nFIy#mL45+MDXd5-f~Tb_n;o1dC!& zOlK&QhNje$6t{VYAXd@ej!0xS9qc}2z?*xJWM6fetzT6dgn=y~gF9S}Q2W zR&Aujzd}=^^6vw1NED@X-HZ%zP+1;}IZUa{#1>}>xGx`HKE8Z>`S|kj<>UY7<1dw< VC;S%U!nyze002ovPDHLkV1f^x)iVG9 diff --git a/techage/textures/techage_coal_boiler_fire_hole.png b/techage/textures/techage_coal_boiler_fire_hole.png deleted file mode 100644 index fbb4ef2b49c3bb3527b71da02311a4686ae21507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 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 diff --git a/techage/textures/techage_collider_detector_appl.png b/techage/textures/techage_collider_detector_appl.png deleted file mode 100644 index fa8776b93f0d18de2e904d6ccf18e22d475d1b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0L3?#3!&-4XSoB=)|uI>dsdb+xwq@}N35Ag;H zGL{7S1v5B2yO9Ru=ycxArhC9Be+<33fvf&B?=TJxD|N9Sdw?F>TF`NU}gvik$r5) S@}nB4n8DN4&t;ucLK6T6tQ=$j diff --git a/techage/textures/techage_collider_detector_core.png b/techage/textures/techage_collider_detector_core.png deleted file mode 100644 index b0edd8dc66eede7ceed43a681b8bae65e3d4fcc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 490 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e^#Gp`SN8%RAd?`d>(ycdD&i># z@(X6r42)@>E{-7{$IphI4rDguxjL!kB#%`9L%VJRGi!j8 z*8&zkkqOQ~%BwJ8vf_uXq}=11wtl;H#(?KdV!GvplocC4!@ar6JO;EzRJ!)=Be)i+f( zPFxXjBq82u<)SZ>rq!FhiD;NO;e%@ZzCclfInC}4>I~28)f-;UY5mkRgK3>J$6>?c zi{C9`mhf-(Q>>8IRlm=j9u#9eHQ>3OL~|aS>!+JWhLUlatkRiocJJ-{lzd`z++`2% z)v&jhx{%tC))6*o+nL{6&h&fEbX_DQ9=o8bLpLyFb=qB#S*pwvwpBNt=P8&aIb&+i zouym9-8_*R%$wEocOgfFW%T<+4!mfmaMEjEo^XXHG>OJ@DcCpXYyh{&zq6 zXUxF5U=t6Yk3`phLxU^E3U7WKK9JC#a@>)PEluTU{p0$#?vqk?teVTfz;RUn?sWUN R3xF0ec)I$ztaD0e0ssb~KfwS1 diff --git a/techage/textures/techage_collider_magnet_appl.png b/techage/textures/techage_collider_magnet_appl.png deleted file mode 100644 index 2f748e1fe91d0a30bee8cccb4675d3784546938e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8%RAoKr!hDrVX$%%;v z_UyTF#OxqYh_NKdFPOpM*^M+H$JEosF+}5ha)N|HLQYScZ*%WN!{+YIo!mxg2?dUa wo!L3G7CNyhx`v!+SmrQ+(YNse!%i6nlf!~%D-syZfCeyly85}Sb4q9e0DB%JuY_q{4JN6Ox)twLuwSee=;vOb7AcWdh_ j^%)cQSO528V`F$diTC8Qdr3cm`WQT2{an^LB{Ts5&;lvK diff --git a/techage/textures/techage_collider_magnet_tube.png b/techage/textures/techage_collider_magnet_tube.png deleted file mode 100644 index 040c3e5bae07270a7f34dc0ae81a08818f22892b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T-^(N3D S<}w+moWax8&t;ucLK6VkmLNd@ diff --git a/techage/textures/techage_collider_plan.png b/techage/textures/techage_collider_plan.png deleted file mode 100644 index 3cdc09d7d187b3b035942f20e08ddff559067072..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 585 zcmeAS@N?(olHy`uVBq!ia0y~yV6*^Y2Nq_a$SsB1uRw}Fz$e7@|Ns9$rcB(zbR);* z%aTVR7;h|i#o}?dUM*^pS!d6|FzFh>_e=gA z=vt(H_1~k*Z_B(^=7#MGoAcFG)^6V`+jGD8e@7j5)?B@O{r^YbmR~OXBP}p!pug^K}`s={qgQZ79?|hzD_xLW`xp~davu#3clh@zddB^zM z%2swhAXulY_vQKNwJdyo_gCe&Hcu`t@;i6%;7Lo%^z$%kFWM6Vof1vZd|GEybAY#$~^1{zk9;_^`eCwoYE}wE)efaZB}_=6zkSBKA%Q Qm>?KDUHx3vIVCg!0LRfFM*si- diff --git a/techage/textures/techage_collider_plan2.png b/techage/textures/techage_collider_plan2.png deleted file mode 100644 index 14386a8df06f861e16106cec53969031001ea9cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22883 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 X-Sf}>%k4{nE@SX?^>bP0l+XkKUDI2w diff --git a/techage/textures/techage_collider_tube_open.png b/techage/textures/techage_collider_tube_open.png deleted file mode 100644 index 21af706e86212443eefd16e3a630fb1f3005d523..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{SN8%R-|AiFnJaBeb{h(a zx#q86E#P_qlw~Xl@(X5gcy=QV$l2@Z;uxZFK6c_o-opkQEd!E7va3>a&+GcxJJ1vj3;eFE>u!*|{o@qrunqil(vVq?iMILR|m<|G)f*^a&uB+tbA{ dgyVX0LIOyRfl=Y=l;c1agQu&X%Q~loCIIZ!6lVYc diff --git a/techage/textures/techage_compressed_gravel.png b/techage/textures/techage_compressed_gravel.png deleted file mode 100644 index f5d7f23a3e1a1ae946d461e865620364e69921be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455 zcmV;&0XY7NP)+MoFbN0nt16zT0A^n+BZ(?hf{K9O>YR1$%kz)dSA(wRqL&2p}ikU3G# ziSU4>l#)}tciw3n8IzpV;f>$vAA`r#D=gXC2{|9fhtq9#j#AV(Ypv2B%rb87iI$@USzQd(Q;6n8su6oex z9-$OxtUH1?hj0ar@49-2cg>wg*_kw7&2W%T?`evI6 xQ08wxpkEqZkOISHW0}K&ARAIZk$67Tr(f0jV2t1YAPN8g002ovPDHLkV1iIX&`baT diff --git a/techage/textures/techage_concrete.png b/techage/textures/techage_concrete.png deleted file mode 100644 index 2bead6bab23268469d55a9360687d6c0b15e14f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T<0&CKYix(SI=Ml0g9A( zx;Tb#To3Kp$l2;3;4;6cQDSZaqqc;^zXMER1_Fz<4;!sx@xI`fbFlBuza`k( zWSw@VpQ{w)Vsg2wd|Q#((_@WOZn}`b`xGy(lhfTx43SLGO*>a(M{tM_>*k+ zP2T4?z6@ALM;;QZQ{y=r3;J>3d&w0L{|tl`cWC!IWLZl}(@pKx1fZqse%3{RSV^N= zq##I7y=_1#h6izjzMLI%FC;nZ*d9%U3;F4Cf0Fm^mP&-9sqn z4n1{?9f%E|PB!Dq7ampp;hqz6FrK_`p2L9n=!#Fpr{eQ3eEtB^$ousM1QneC0000< KMNUMnLSTY1@td3g diff --git a/techage/textures/techage_constr_plan.png b/techage/textures/techage_constr_plan.png deleted file mode 100644 index 30771d2bb97053252b2abdd47edace59ba1d1a2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 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 diff --git a/techage/textures/techage_constr_plan_de.png b/techage/textures/techage_constr_plan_de.png deleted file mode 100644 index e11af2ebc3a72603d084231591516ebb1ca7109d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1011 zcmVq^J{Rd2L%|W@ehg_0d z|A3xz@KKlc(tn`Q#bBQVLOJ9b=*3V{Fq9VCnAWnY$f~5>?Ruq{mxDE%x8s?W1jz%T z-S_MJ-pqS5EB2mk(HHkN0RW%4E>yV)L#^H<7h#yn#p9(d4txMW_v{pC)~e+DXZHt# z&YkY?@4IS3-#^>p@BRK^sXIKp$8`q>2YCQ!kJ_6$Qs?LA#rOF-4*;OuZ{KRxs)S~( zN^_U@fu&iij;$ydfru;sAR;j+53yYq;bV zR#fMY*#o}s!v=uOt#9)HRsbLz^x&2&siab;vt`LF|5rOdUlHKW-#z^yacDK_0FWe+ z|KljcB#u(=dB;uiY<&4Rli2C&og~(hN~w^b@;@B(5)dhQ$4ylx!2uw*06EZ z`*k~U6Qj@rZOo{u2#aQqt&RR)u?0d z`A=H%CUMIZc%FB)0&2rOeDp+HiR=;GO7R@?P7RPThB`5Akq&HLeL_GTLzS3Gbk&A~ z9&$@g5~toB(gy(SIPf!Xtt@a;rD`s9+vHRw*Rk$an^mQ{rz)v%&`aH{+|Ds<-}h5Y zx$u=~HR=gLT{Ce&es1tp(h*KBqpX|IL{N%)P|ee<$vF@OBQ4k>G7HdDTojC8JIlqC zfgeP(mM=@6WtUs&EEge~wJLq}&12(5leIEB`>e6$G08XKZ!dNL0G{V*gO--ldihnW z>gSO-@WC7327s@h{&>GwEDtU(MKOww$DRNFr?OKJLI@GZG0Nq2JC}1OrPAv0aM-WKs~1x&%^b7=BgR4f4a=lsvlI-S?< z(b2CDwzs#flat?XcDu)GL?le4h{z_Q91-1^`dPcXyVK``{M0UO#yn#0*%nPl@zV3W h8#;6#f#q$t=f}K{T?Bty1aUARqxNNWc_nBP|^+?gIpk z^a*Mb5acQHKmrTK_7u~kD!__uIcb3hs&jMh_3_W7sU`i0bI(2ZobUYEH?76hAb)pq z3IKTJI54qGQ&C=qU7BjP_<7pfCourv?$2*vIUDDVt^a2%XXCv6T+RvYEZIJr^DNoI zvU|t)dGj>~p1ud-IEDoPr-M(*KpJh}czw+%$)vq1)al>OuhHhp05H9{#M$H=XOnZK zNJi*+pQTEl*4&Oa8p0b5@n-rN0N{;=nq$6J1ju+8_}Y^kaVH(y(IV^EhY}riZ2&;D zS|eJmwQ~}*Dd16=#2)rpVUO$6Z%&48WSC(qYW#&GWfe@|M@J7P|L5n-< z*p7;XHxTa!LKyg(JPds8%-#2(;7o$`_WcQfL#oV%BjXZCPDJV^gt7n}O4i<`sn}>- z$^2cW!|{4NDRe*Zm>Evis$$N^j_dGLJ6^w#p=h;cR(bkf>JYahy1<4vm_BN+y^+MR7x;kR85*yy$9${_%Amd z6Lk*Df>U=w4*nvlOJ9||YM)AJ_m0t8&c^wNk6*+L)ZOW%{kpN`XKv@$k5lmL#~c9Q zx~_Pr+tcNAt2O0Kuuo#}#(()|^g^JuxEka%icj5yS+d1nTWO8_%Uxbk00000NkvXX Hu0mjf`8i#N diff --git a/techage/textures/techage_constr_plan_inv.png b/techage/textures/techage_constr_plan_inv.png deleted file mode 100644 index 83371e75835038e52c10525c438826560b0f7e24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wF?gc*2udKE*ko@p)_m&R7b1Msu%t~DSQPt_5Ui3-~AUpTk^AI^cI}?StA~NivQ8Z z_{H;6OAAB$JN8Toz10&X!aIlIPRt@Ug_ISpb6LcVf*OUctVmiLdHDk4hbA``_PfhJ zg*>kLy6|J;if1)43`HzPOMITb&2>9{?2N8tSIQSA1ykQQhXk@7$T{`q^xj^kyL@)| zo}JusJ6zg#OX&W{ybxjA=;6htXJ&FJQ}g>D!C9x1cD}tR>HhwA-JIy3?lp`HXM6rA T^?O$h^bCWitDnm{r-UW|R~v#x diff --git a/techage/textures/techage_constr_plan_inv_br.png b/techage/textures/techage_constr_plan_inv_br.png deleted file mode 100644 index 2efd26c37bac995993e7541433075966c0ca6085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4680 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 diff --git a/techage/textures/techage_constr_plan_inv_en.png b/techage/textures/techage_constr_plan_inv_en.png deleted file mode 100644 index 6ff53645040e35557b6574b74cd1a8eaa0896c53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmV-M0=fN(P)1ZC>X1d_y~Cp>*NhCfiy-q zkZZI|o9D1nRs=0gA+t9-&i+(M5x-_{=Vo@k`MW)UGyXeDvvKdB8cnFy>%Zb~x7nCy zy?D-wMpE{rkm~cSaC_Bhi$2Pd zvgAM_;>&{Sw2f1Mq7+>3qz7oqQMub6ojA|4)RN~}YS}EOlc6PJOF%gi z2|2_p02J9R(+#hWRAUa8yfqkFB|t2v6N_xJ+iaZ7r7`3CN==<)2uJKlPFed(O<5zE zP{R-rzIXLT$gUvAN_GBf%7gMlyD4 z06b&pVjY9f)KC}#()dwgE=bWzcLhItztzQU=yT$8?uyjceB7Va11=&lHRYuCTW#H} z^gZ>F==Ca!DgD$+%|sn?J6|B?GK#qgUFG1Ji)mKtI}mH+Ldez^T*6<_4^b$6KDqBb z%~)wR?j3IKp2R3ZBk22ojIlBQgx|9_002;prZ*Z1)q36f)1`6_)T51m#uRu-2LXu% zhDcSGuB?nKY-}v85=CmpG8A8Z7vCiX2?qL>OMGYh*|E<7w)pSxCgZ^}>h{nM!(VZ@ z$aD3a&1VPz;OOK+3Ckiws}pHTB$M`Bs5}4saJwSF51(CLs{?5g1AsC@YguHKcmBL{ zcn$!t<@DqAQJwcmNCI+7D>kmg_B)r!pgJuvMQr7^EHng#Bg1WBZPz0p*w8_f%wPBRaXN{Qht5zx|?$Fe81)_$L zRD4Y*qnWuT#j4!{O_gk@({%+Gm>c{es!N|s?%L-W^CsiL^7!=1I%t~ykbFl+{S&@S x?f?K$x95yTLOTq#KV2?2LFahkZ?VOn;}h(-DWz`t_oDy+002ovPDHLkV1nh?1^)m5 diff --git a/techage/textures/techage_constr_plan_ru.png b/techage/textures/techage_constr_plan_ru.png deleted file mode 100644 index 5e4c49f542d07629a7f3be9f7a3f75642e814aa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmV&OC6GW=s)U620~H$#=>ifgu<-+! z89HWxg+BmUirOhs6b4o#mP&|9T|jMB0cl9n;KVkr6ROM5Joowa*-0h1OYHk~&b{wm zzp&Nk3v}uF901^qX+o9*&r|B-!NOBV9tXe8kVRp91pmoO0%#`f>KWD&k z9OwWrw{SlVU{y9F~}h$Q7Yl`Tnz`F~h`bwogPe(>a3=uoSa0U%7me|x@%e&9#m z(}o%5Ie+sZ03df+4P0M;8^&r}$rT)w|9W;S1mTi4%t&P%8~{?|Mr_407J%apa4@-L z{JkIe5g^&0Kc@{7>_##H`~C5=CK_aLv1-*>in`OxhA3eN_&M^Hi`Cs*e0(CXRw+mH zwMsdRp)bkX+`(}R^o!SyK5D$Z^1$)rD&cxgBh~P!TB#EGLp92= zWzhIURL}p_%KA|xa2<$)uLHpCCokr+*}Q#t$g;k_-D~{%O?e~37-K950_5|vdMai1 zbGhm5PN#WQ`*WDK&dzS`?QLC2r850i%iX0Kq|sUy3m_uK7$X2%L}W6?`T)KPE+c~jz|71{vsx-1tzj-Vy~9D`0tVpx*^Bc#t!M!7 zegDh3M&q-&we|7N($bQ)v$H5L^=_rh-hr!r>(5444yaA13S0H=3%SP p7ih4Ghn8iHshs}T5c+Nxe*u#>DoHQNb2b0~002ovPDHLkV1mL&-lPBk diff --git a/techage/textures/techage_cooler.png b/techage/textures/techage_cooler.png deleted file mode 100644 index bce55c95f52a607c1783dce45d6376784fdb1efb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wF?gc)Jmn`k-?#a%{-L`GJho@Jtzh^K=X-SY@FoVOh8)-mJo2QFo zh{pM?7ajRp6a-itlzuf_<6mR^abMD&>IaO{z5oAr^-Rn;eAm)(>CBR*V*S33x}W!$ z_Fh>a>hZOOIm>}@{<*gsteAAQO~mZ|#gorm@V~q14?~SygVY(8W=DmFgLZZW`QF}p zQ%(r)_-mM7ez@K;N7L!$#fIC9TSPP*vpzUJIjg^iVbXIU<8LR}T!AiP@O1TaS?83{ F1OT8RVFdsH diff --git a/techage/textures/techage_cube_mark.png b/techage/textures/techage_cube_mark.png deleted file mode 100644 index 132145138709c484888462feae86a83a85fb4f08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbUh3qG|7x=j4?=t-zdIl)SToU9L+{w_{@a=vmkn8E`;uyklo%fg_ zSA&57%YnZ~SaVqC3uP;BXMZ_)Imb4qcl+OkG{=6JAa3^Qh?2OD?S!q?Yr@Y4b6>u7 mCGE0~Osme16OGM#KAz&&>J+uCj?@P^j=|H_&t;ucLK6UT20xVm diff --git a/techage/textures/techage_cylinder.png b/techage/textures/techage_cylinder.png deleted file mode 100644 index deca03aca68460f9d703f40182fc1e97b4aa79ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF?gc*67cAbeb^ZN^_xOtVdqIjyg8YIR9G=}s19B`qT^vIsE+;1} z5a?)Qa%7mG_+OqwFCq0vvqX3U&xBhS1X2W(Bnn~!S2rYZO;BV_@;Pv-VRyR~1H;Ep WPFEB^>IDD|VeoYIb6Mw<&;$TYG&U3f diff --git a/techage/textures/techage_cylinder4.png b/techage/textures/techage_cylinder4.png deleted file mode 100644 index 5f678bf004bc0323bfb0bdbee85faed26867306a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}(g8jpuI>dsQ|2uMq6?SLYia8|cyxc$hSf6`F1fUIOTFtoZ=f>fk|4ie zhRb?ATjS3HxmP`1978;gznx;p*KEM!x{zDDBr!MAqTwiS74s3%LtK)tw7=X~+E>`p z*u{A0!amNu9u05i%iD@vJSgH?xVXJ~TI!F7nL$FT4p#+CyVF`+l@@JODY9F~IDth< zWDY~3`^8u5B^H+Nf9LA1^zG0(j=F~i)3iHJ8?4eW*=*5ru6@D}$?~e-(X3SmyALV+ zJn*%~V&aRM9DypiNS%G}U;vjb? zhIQv;UIICs0X`wFKzhkL*TjT`=vfC6fgBM}7sn8Z%gG$AOl=d-IIwxip0Hsk6!hIJ TS<bP0l+XkKdp;hJ diff --git a/techage/textures/techage_displayXL.png b/techage/textures/techage_displayXL.png deleted file mode 100644 index f0d43631d07fc260b9623d8cc93e667f1d4aad9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH#0(_wf1V}|q*&4&eH|GXHuiJ>Nn{1`8HNS%G}U;vjb? zhIQv;UIIBn0X`wFKzhkLS8s3c^z?K_Muz#%ojsmR&H##Lc)B=-Xq?}B{w{BW0uRdr zYqbnv_KZhtc@Nm$+4pX_rZ8#7k3+T}K3{ZVxVNxO@Qtlb@=+BAlL_Vq)BP80n8xX< zx-c($$-#pR>-XxlR&j^i+FbdR-RJ+mdWj&f9x>rCc6IHvx^2C(>dzlYt`9OiJOOAY NgQu&X%Q~loCIG6kO3MHM diff --git a/techage/textures/techage_display_inventoryXL.png b/techage/textures/techage_display_inventoryXL.png deleted file mode 100644 index bd4b3221027089b0f48510eb5f7370057c935a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(T=8|`=e1X$JMlhBH`2{mLJiCzwwp0V z>xGz2-sP;t^Ggc)7c5`H*(UOGlKlzieTqxx98r?~yH1Vyk+FjU|7K>E%q9WPRnr%G zU#@(2x8>_5Ep-XKf_pWm*3SC-=R;S{oF}YX>@pAK?TS_d+QH!I>gTe~DWM4ft!70U diff --git a/techage/textures/techage_distiller1.png b/techage/textures/techage_distiller1.png deleted file mode 100644 index 12314906a498b95262c58b416c0b9da57c464a20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3911 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 NSee_KRWN)K{s&=&<+%U= diff --git a/techage/textures/techage_distiller_inv.png b/techage/textures/techage_distiller_inv.png deleted file mode 100644 index 5b3cc19d08ce2e8ab08ee75108fe2c17d6aa5c34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1056 zcmV+*1mF9KP)Px#32;bRa{vGf6951U69E94oEQKA05(ueR7Ff_ai^%h zo1V0ZjGj`p`*HYdysE)hhJiHk(8>dtHL!nL9npKC@L~iRTP7TacXTfnl4$5 z00001bW%=J06^y0W&i*KW=TXrR9M69SL<@FAPkgCNI+Zl{a^MZK@bqX_WUoMQ9G4& zlih@LS^n1IAjatZe!xbAy6Ac!S?H1tAy~c`v#!B-f9xlDkT-Z^0XUoh(7mq$flEP` z>^EVJK1E~zfDQmsWpM2WdE$FzV0Z;#U?B-W!+1;Er> z8G0+Til#Ubvkx?c8=$F$PDbnjM8=ZD2H;o4WQvRzKwP zb1{jGTnj@nWdL#`0FLEcasW2MP)yXdG;CU0lf_zUNwqnJ5XIZlK6NS3^NP<798*ixcbvlH)OY-@*KJ?6?VH#3z3EaULEQMd?TXAV??NqdD-_!KosHj+tqY^b z(qHCF{-_`D`PKZz46<#Db0jUzCERj4NV3o_F+$FuE>DS|wDmzo#AZ4xPEsS5F^{J- z|KVinhOFYGc199M%qEoDktzb{>0F#>%dDIM{_kX>ZqU>LQEW*8l(i=UO-Y z0rC|*T^vI=t|xP_GPV5z3M&co@HjYSv)VDOVF{H!p~2u7r4hK|peip=ErX}4pUXO@ GgeCyrs2%T^vI=t|v#Zvhe%{3b*?h7%*^N6sTc|;9O-kA&}v&la64-X-1HN44$rjF6*2U FngG|{9wz_* diff --git a/techage/textures/techage_electric_cable.png b/techage/textures/techage_electric_cable.png deleted file mode 100644 index d6262837a4eb4c51920945e24d514084805fa562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(4j_;@Y@OW4aCkYHD8$yX=}*2?%P@bdcUuSI*A8Y*m*H#cbow|;J2$Y?3O`Tsht z9@a~zst++5eNvG1xwYv@*C7cWq3%wDlyCa~8#-crRt8U3KbLh*2~7aVTTYt* diff --git a/techage/textures/techage_electric_cable_end.png b/techage/textures/techage_electric_cable_end.png deleted file mode 100644 index 0b021e101960c2276c4cd4dea724c32c4194fbc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8&+1@ot!t=G{m)PDC+ z)bI2zPoNZINswPKgTu2MX+VyYr;B5V#`)v~iB5+A0bhp*L0^Xx6DLfY$jESG6~mbs T(Z&~msu(<7{an^LB{Ts5Yh@!) diff --git a/techage/textures/techage_electric_cable_inv.png b/techage/textures/techage_electric_cable_inv.png deleted file mode 100644 index 1c718678681241f9e7c5ecb637eb419e94d16d9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(qE+0Q}eD~k|86ZK%k|4ie28U-i(tsRGPZ!4!iOb0e5*z~C zOhh;qEi-Cqb8GYC<@HTH!84mv$cweR#mz0%sHL?@wACo3t*zNS%G}U;vjb? zhIQv;UIICa0X`wF?gc*Uw{E|B<;3&_i_e}paOBAD{IZG#^QU>m_@AxUdG}CsagqKv zkj|1IzhDN3XE)M-oJF24jv*T7=T7wIJ7mD)vbO7;qv-Ffl+Ejl7(-O6qrS4}Xypa$ zU=!y!JD#dGNgVv5apP*$ zoB8qKuiIB&PYrTrD%x_t@64*(TP#DD`UKm#S7|R<7b{c!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xqx%n4Kan}ZV0fK-$O`2{mLJiCzwM|g zwY*#Jfl`bmL4Lsu4$p3+0Xfm0E{-7@=aUm8R2)1#PeyPuP3di5X`v(6U+a5KmWI#9Y0cj-)ojO_E-x g3g$PjJSe2gprk9l*(Fo4251d~r>mdKI;Vst0GGZwOaK4? diff --git a/techage/textures/techage_electric_switch_off.png b/techage/textures/techage_electric_switch_off.png deleted file mode 100644 index 2880073d1b3695aaf43d7a30919383864184f510..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8&+Y4aCt*tUJa@>R!V zt>V{Y?FLFQmIV0)GdMiEkp|=>dAc};Xq-<@kWg{(^gJ2C$uy<6fu(to0+)c3kbs+@ zKw%4qWFt$@M3xo_o{1q2TR0YTJMf4Uwp|clboLQ-U`&i*Y7=;!5Y-|n!n^Tyl14{P oo8cX82S(M@9p?{TN$3<~*y$)9cwlQm63{jVPgg&ebxsLQ0F%r*#Q*>R diff --git a/techage/textures/techage_electric_trowel.png b/techage/textures/techage_electric_trowel.png deleted file mode 100644 index 11d7941b0a3a11a1b6aee5c44fb8e954e53976cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv-2k5uSN8%RZf@@TacWP~GWb}PtxvOjM3#Q)}cy{g;KKtnQ?(ae( zH)Px#JWxzjMMrQ&;B%VBed80oF&_fZ_J;R?*55B^;@#kH0RU!W0K5v^c`PP@e&lumL`yuQ z+V{@EooADP>jLfy9H@X;t`M>F4gfD6#pD46=Z1nF#HNsAKq3`uCbX2B)7DM&n?^6O66;^)so2rUW@nm>>pv6fBbH z`Kw$>Fq9nCeI|F4}T;ymP%eGvNCn~CxvXvvfmEZ6=? zA8Gm|=k^X{q8o1%wdQNBS_3@6ugW{FxoS6K+ReO%AAPDhm*6LPb~VRLbNt@ytNEJG zDW0@^xZ6Lq^&NITGH_P=*z6zn^c9Ade~rH*TJ7O0s1H^H-~vvRZ%ZHO<0n3+cxvf$ z;M**B^s$F83wHPYBwv(wTK*ZD|5jX^zkoh}qN0!3P(C^*+ljT(7(f2B@!v-6JjT>; zZ?cd5G+t4z!h=5y{tpkj>w!x>Z9HEBLqV62a*Cz=uM2?t3iyJi^6z{~N!r|Nd=S&z z9|9D0aq9s(h5Hi66HCcOm0X%x8aN~lBFD8K-*{V@u1}2UiNJR zCV_j%w;sh%EK~Hq|A)2+X%?q{Dc~i)^mVvIndVghX`a^$=oS;_{nsC=824#@X}jBJ hd2u#fNdMxW_&>V}92o~V*D3%2002ovPDHLkV1g(|UxWYv diff --git a/techage/textures/techage_fc_stack_inv.png b/techage/textures/techage_fc_stack_inv.png deleted file mode 100644 index baad1100184de9467bc5a39920d923b29ded8bd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF3{x(6xVr;+e93LLo1Yxd4-f-#G(BA$Lp07O2RJeF%wTF#I>W|y vOvm9!&I1h&p#n#a9UOhDBo1kD9JOOmvvqmz!CRsX)WqQF>gTe~DWM4fqUtB$ diff --git a/techage/textures/techage_fermenter_foil.png b/techage/textures/techage_fermenter_foil.png deleted file mode 100644 index 73be5d1ada8bda77985cf0a2376cb6726050fbe6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?sk&2l#}zO4k-YnG#k8Px#2~bQ_MR#dkfO2Grdu-GQbZ!6u0NF`IK~y-)?a(o5 z!!Q)a@lW7n$mD`G%o z62nDK35h?tV4he^XhwJ|_!eB6?$`VXtewCv@cj=4YXmWaTa&t=rR( za9)#(B!AAj&A16@!gJ|x(@n+-S6yyT)v$)I6rc34K_sQ4?lzDwAiN=TKig zzn~(^uerU&#|Wu^LVF0QZJLFpomDSiE~d!F9 zH$Rv*$sJtn7e5hn{gPqQ6*ssDwfVkZd>AHI{3iG2Qk(j_k9FJ?!uzyHwApq54#v1} z5auIopd;bISYOT@?hWUuHs3(Pf!u@ef<$Rr#pJclFREfKbzLj?-KDW}2mT3C5U zAq0AK(!iJ8RRO4wy~h86z|%~IA%vm*oY2)6L1a=PMAKP?;Ptt{K?GsKi|TiI{;JQp zQiBAce6*wG02ieS5t6w0b6dl&QoUWr2**`L$rG<%72*2{f=@_A$k(9%l0=t@4?~|8 z$E2DBr#lk88Tz1YS|Y5+rxl4JZG&agqN;A!=NE(|iDd)p5`^8+;DVAkW?f*M5?mZT zMbIP0fjRZ!;p8JBzRw(R-G6=XeIEcFX!`J)KHU30&gwqkzK=!QN83l+N83l+N888$ a`}hmE`{RI|mv;#O0000T2I^ErKfNo&$boFyt=akR{0J7~&xc~qF diff --git a/techage/textures/techage_filling8_ta2.png b/techage/textures/techage_filling8_ta2.png deleted file mode 100644 index 69a88f47f78c3b6e26a9a7b4770dc912e1253d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmV-R0kr;!P)Px#2~bQ_MR#dkfO2Grdu-GQbZ!6u0N_bPK~zY`?a(o5 z!!Q)a@lW7n$mD`GexYZtH!eE);V8bQn;7smI5JCl1R`SbCM-tB2h zIB&^Cl0RqNXWRs|;IRz2=`Le~tFB*9&9sGY6rc38LnNi69(VAqGC_|ThgO!xAHYzn zBRtE3b*QckZqz#Dg`Xg&y`X|RDi-vzRP#c0UTUZ}#a1Fb@?P)B zYuqpt!0~6!fp(K{k~s*9$yQ^crHfm1gxf-}a=opfpd}rO4=THpuTaip3N#nTTe<1b z6ewhIzro#y>Qfv_p9u7OTzwxVM)MsV$3{A7&8U1f&f>^(#$Ds7-PT~$+#lR zWrPeJ9O}gfE^}65hbL#UI5tj0C|+`5AYsg%|z}dYz>)xu^wPV5q^NM@)?5U z8N}M{F_r;+jW84To0~WvpsbCs)}8VWU!k;|)l%3^%;0E>6A^7@^_j3NHt=eSr$n?I z*SP6dX5h$(TL*1TLd%vd99M3F+~ZBdO?+HI)!|K3(q1n}*u+%_RV&U8pMdT+Mb$#r z!CS8A6akh7SNM#yN*s^@BpE#-l=um8y+WY8|CyeCL8!Wkgqch~ZdE$LiS!9%&VLQ? zkXAP*IY^=VUg?+RyyvU$2Li@IYX|r9H+pp|5i-T~V}CIHywj^2k%0h}UTFutmU0Xb zg5p>G_T=VL6NEg60DvkyW_!7Jr?tp|0z{hk{qDowh1OXH5fsIrJ|g`2 z1;p&{KH`7+V7?FEhwsDp;rsA?_&$6ez7OAr@5A@u`|y4IcYXW@`C>dmcG`9?00000 LNkvXXu0mjfn|=%J diff --git a/techage/textures/techage_filling8_ta4.png b/techage/textures/techage_filling8_ta4.png deleted file mode 100644 index b9d631199d571464882f4308f196f345ed5b3b15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU43@pqbR)3}|km3*U330u1_txX5kItMq0~C1k z?zO$mqa8q2yQhm|NW|f{lN`Ak6a-w|{U0>2bL@7UtMK7pde)rIpzMjeJN}C|`R`Ny zk@42aJIiQ4(;1n~Ix2wNS%G}U;vjb? zhIQv;UIID%0X`wF`R%p!GkPofTcS#``B8d7xY$9V{BLd54K|)ck;?NwRkPOfiwR7b$B-4%aEmEfI+)k+f&$;A z4;NM~_`x~z;X-2`7Y)~pcN0w3$=>Zflo)ZEt96cUqRFF&ZK+54q$Fk3lXOd6PG9+c zxIzDEwRd^JmK}{V@)+hMa~kH%Tll$fk*-qzbCbvHm*1Kl UFY`{B40J7nr>mdKI;Vst0Nbl+Pyhe` diff --git a/techage/textures/techage_filling_ta2.png b/techage/textures/techage_filling_ta2.png deleted file mode 100644 index 7767eebfc0bdd8c524287120618a71c8d5c6379b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF<(aV!MJXNCIafGJ@_>SeJY5_^Brf}&+1Pc+L8SFzv0_w2s$%dD z2C;pujY~YA9@u-@YVQKOuDRTs6L#sSojDWyPS$YE-Q)ES6gXq1Oqq~!zx7+^(Vkzd z`J(n+(RXcc#kX!XKEf(_&){a5pz)2?kCO~IcI&=A|J`1y{DJ1fU1{Qx_3M_Md?9M{ zIMV9NvU3p+^G=;FHeLHrd(!5aW*t6ivkIB_FE*QT@xhMEK|hsQwpbkO7SnMq6!&mF xJ)yhCVR`c+hPfUhz0)3r?l`lQrFP;Cd&Sy#^?6^Ww*h^_;OXk;vd$@?2>>WedMf|` diff --git a/techage/textures/techage_filling_ta3.png b/techage/textures/techage_filling_ta3.png deleted file mode 100644 index fe5a2147167df26b535a6de0448ec3c6f88c8d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmV+e0{s1nP)SFve0p;#_)+zZtJ00EatL_t(2&n?hB zi`y_52k^&9`~k#exm88fN2j7jG?|>BazUewAX)2+AYDt5Ae}Oty_OgszNs88*LW{? z;M+SiAF7X>8}-xwd67WQ=_Gf1C4W;&h@1l<41r0xpfn(a0GX$g!m&}jU>a|IBF&;b z8^I^-fxN<-5rjI0pa*Uc00x{xi4YKB5)Z?a!-t@UDxu7SfNc-v3?Y`7!1s8CVJ+a& zCw}x0$3rOq{FL{7kN7^UIl!2}MR`ta!-IfeEaCFTR4Yp3X_%hjq7l_9Voej`9%S5r zQsUqN--4hNsMZ{!NS82RDUqs0;G4IFhvW=x%Rl1>mGOY4QnnuSN9Sk>i-h4Bq1LM> z7nSjnGNsxY?kk#i&-*V3RJF4jY7>3`=L!#nYNrMve?geV%Rj~O*Oh^-v0aDobJ^v` zhqVEdS^MPdx>>%1*|=h7ckA-{WDzzXCJ4Lks=V%ORf!1*-NWt8qjLxvc;fP1 zceE_?y-QnZl>Fem#*3;SB*wE3=!o$FPJcdpH008qzL_t(2&vlTY z4#F@HhEGl4mStgbISXbv!3!X;h$WL#Hwzf!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xpYI~I4Z+W+$Iw9_CJB|(0{3=Yq3qyag$o-U3d9M_W*8W`4w zu6A;EPMDIBq0y1V^if7a!a;<2&ZQ{UDM<+rqC}+{7R(516k)pBVx$llrFdn50|UdA W7D=D_2;NGdK@6U*elF{r5}E+f1vNeZ diff --git a/techage/textures/techage_firebox.png b/techage/textures/techage_firebox.png deleted file mode 100644 index 6267f3d6a94c45da91c98c257f3d7c9d0bf25614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 609 zcmV-n0-pVeP)Px#JWxzjMQvGAd|6F9Ff*v9p~Azyj%!=Cwy4#R zh*3h()z5lNNj^bBdTnZ%er}RpQ+#Mxmz0lRH91;ZT^kpT2mk;9!%0LzR5;6RlM9xt zAPhtUfe`s9$o}{GDxf`mW?rcrl}ji>p!1_VT8#TO#2B4(8Q&DoxP-qgxyy81;!IH% z@aT+zh^+g#uHYPzbNmfN0J=jI7aXNT#J!(%{QynNRtu#h%z>DVSXgrA@kj!*K+M^0 z5%TIQjRw{ znnj?{H^6Wea)6xxZy{uB>^;j8bxm8IXEj4+L~gxJr3`8xAS}a*X7Wv&NCIFJ>O=Fs zA_%VR%{pfYNmbG9}{ZaXV&WXjN9h+RCe9Q?pa@P!9c zwDW9?k+u3dtG~65!$cB~s}#g>F=2%ZfXNS_d@P`oOFA%Aji|nO-N4P(UbI#))cdtY zOz{FqHn1{^dO!sr-wa8%eDg9Hgo2f$?PY7SlY=-yuO_XT3hr`@`}SL$Rv-?diUfrOSN(bT@Fw=0CmXG{e4@<6zWm=NBS<1})ol zZ^dqXn-kjjan_;5%0F&f&b{~TZuILpTR(BKFr>{|aV=VWaq*-}j=%XY_{{a%cdf&8 zPjP2UYw@&&dWYngg--rTTqb<|uJDa1QQEB^*ZTM67Cn(!sl-shI`xtI10k6MIZ~g) z_~xz`ocH^&p`st-)`D3a4=$dI@X)oGucq+fR62jTP0eS!*S_`Xa*I+PT~ST72vIOg z3E9fE)%-zzRmhP$lRJ14gr0qRYa_1|&wpoARKOt(1F?qds_|dgs*0b6HSFMLk9uvp zy?TY`GM=*zUxa*3;uM5z5>vcZepgAIv8-u{z{zDrGTZisrQB}o;9zG^XZ*q_QNWcT zzKC%FV?xZ=UknWwIvifur1wnUIZsu|KOx1$+nrV6ew65(zv5hn>JNIJf3j7kR6jWB z>|Kueu``RFZVcZZwY@LLF~VojInlEp7+x_SV3lf7`Fu->;VWy$Kl!k8lP}+Cn9h1* z#f_+I0ea2R*DjPCSl%D}jxH t?)SQSNq<;<#NWiP?N{Y78UKRof3V5q)o|_?;=Tq-bDpk#F6*2UngH$#H;e!P diff --git a/techage/textures/techage_flame.png b/techage/textures/techage_flame.png deleted file mode 100644 index 0470816a293e49eaa517dc48b3bedc8121cd2c8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU{r|xE?+LTNyNv$Nvio<@ z{{Nrc|8LX&Z}pn?vpxo>CdbpoF@)o~>dB3~Oolve57Yg^qU4nuT>4qe9p14OtoqXV zeLkbR$+zYI4d*}Zxt=Uke5UG3YxR}yD~?1y{-t6z(N~iFg3m<#rrD=*8J#~Jip#KA zA^M$X(KXiS1>0o;&*s@SR)(EDx@nrd&3%5iRf4Mby(7N>?Pc(E^>bP0l+XkKp)pf~ diff --git a/techage/textures/techage_flame_animated.png b/techage/textures/techage_flame_animated.png deleted file mode 100644 index 74185509fe6c227fdff0d8c54bfbda053534a1e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644 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 TVtR2^00000NkvXXu0mjf===HN diff --git a/techage/textures/techage_flywheel8.png b/techage/textures/techage_flywheel8.png deleted file mode 100644 index c364684cd8b0074892acb71be6350e4e89c58bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5162 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 diff --git a/techage/textures/techage_form_add_arrow.png b/techage/textures/techage_form_add_arrow.png deleted file mode 100644 index 2be20934c3b170cd17501283796a272a361f5b9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaT3?y&uT)!Jgv7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgBm3-AeXbuaMw-@qVcsPP>nT@vIM%;50sMjDW#xLip%*>Dfv#~w<&n|J}zkR}k|Nk2u|NZB$*~PeZ6F1+o3n!NW^)Yz5`njxgN@xNA DF9S0n diff --git a/techage/textures/techage_form_arrow.png b/techage/textures/techage_form_arrow.png deleted file mode 100644 index 8f7a90b006d3337ab4040f85666c360fec2e742f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xpYI~I4Z+W+$Iw9_CJB|(0{3=Yq3qyag8o-U3d9M_W*8kku* zmNG8fvLJ-HC5mBTn8S)t1s)b&fh@+Bs75E<#(-c67iZ_qVXO@+r}8Dd^;TTw(-^>* o;3cecbOG1KFcv4y1G4N4P4@Eq&s#KZ15IY|boFyt=akR{00@FO-T(jq diff --git a/techage/textures/techage_form_arrow_bg.png b/techage/textures/techage_form_arrow_bg.png deleted file mode 100644 index ea2901a2cf0348b9668f3d765eb43f30e1ddaad9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xqteSMRXk}gk?QUj?d3GxeOaCmkj4al+aba4#fxSpKQz_^aV zV5upq&)O(1rI}%COBg)YMzK!1619~}WoMSC$0SYwE<`jgQu&X%Q~loCIB$vF;oBm diff --git a/techage/textures/techage_form_arrow_fg.png b/techage/textures/techage_form_arrow_fg.png deleted file mode 100644 index 49124ccdccc678b2f1f9444c6f6deb2cefef7f4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xpYI~I4Z+W+$Iw9_CJB|(0{3=Yq3qyafLo-U3d9M_W*8W`6x z7%Vkq^;sLmr8F~aZ3%Px#7*I@9MMrQQ&M5swD6yA$OETCgA@3v56T#v&t+Q@zfERNi2pq7<(kKD($H(JVmAWDH_ zkSFg5U}Sp*JgLV(Q^++Q2sk1o!CvXhPp+XH;3D|GHdjgE-(I=nn8Ko!-&{1^w3M~> zzw(cqI+UUJqDN2C_3I~TH89!pOrT4JfD!@jwnT@vIM%;50sMjDW#>*?Yc!f`!0;Q;fK|Nj#n z{QuwB`1e0E+q3`d5)%K-4GjLUdtG7N$SdG&Ai%_sQOnKu_pfd@P$Pq!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xrWSM5*iSp0&kv=pSGB*-tA!Qt7BG$6;()5S4_<9c#J1H;7& z0vw`TPpum?!#Iw1Ocr7cRC3_B!m-H3`G80^!;Gd=jaL^2My(E8>kyz(bP0l+XkKI;%FD diff --git a/techage/textures/techage_form_input_arrow.png b/techage/textures/techage_form_input_arrow.png deleted file mode 100644 index 9f76dcfc4a824f86792503b03a2adad397f3cf20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xpYI~I4Z+W+$Iw9_CJB|(0{3=Yq3qyafbo-U3d9M_W*7N`mE z^70;VH8j|u6dbcUOqU_ZXLXoq!;aNqjZe3PHE6D5P3T(5m}kTglgPtcYjI~eP&b38 LtDnm{r-UW|a^W$F diff --git a/techage/textures/techage_form_inventory.png b/techage/textures/techage_form_inventory.png deleted file mode 100644 index 0c37bbaea5c25d2ea4e4e364e00b052d2d2abda7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xpYI~I4Z+W+$Iw9_CJB|(0{3=Yq3qyae^o-U3d9M_W*8kjC# zxFEpN%JtzyW&?}q1Ca<0zloa5w{mfW9nj!lU`SOEE$08bz7D8|!PC{xWt~$(69Bko BE*Jm+ diff --git a/techage/textures/techage_form_level_bg.png b/techage/textures/techage_form_level_bg.png deleted file mode 100644 index f09ac762f572b8159db81a5bd09c3fe9ad4c4c62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@#0(_a9?Z1`QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|I0Jk_T-^(NqN1V_I~LFQ8@&Rgq9n*Kn8D%MjWi%f-qXb~MB{vNLId-% sP=^Z*b2plpm}E^c{3NksGK&ZU!wJ`()XPmeUO=S`p00i_>zopr0J^~{LjV8( diff --git a/techage/textures/techage_form_level_charge.png b/techage/textures/techage_form_level_charge.png deleted file mode 100644 index c7d2c5092afb565508f270954579a3cd39f0797b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|_yc@GT-^(NqN1V%{tF~_EdKxh|G_hE`$6hTg8YIR9G=}s19J2{T^vI! zPA4ZEV4Bgp@IV6#qpE>~sKhHKJr9Q63<2E=5(+a7wG2X7J?qREmi;k diff --git a/techage/textures/techage_form_level_off.png b/techage/textures/techage_form_level_off.png deleted file mode 100644 index 04a8cf38e7e48b70f2cfc2918eee9d6450de1a03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@#0(_a9?Z1`QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|cmjMvT-^(NqN1V_I~M={|9{iu%yTU#Z2_uh@O1TaS?83{1OTLh BEoA@z diff --git a/techage/textures/techage_form_level_red_fg.png b/techage/textures/techage_form_level_red_fg.png deleted file mode 100644 index 15aa5f21d048adcdc1a3da4f28c016f9f23207f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@#0(_a9?Z1`QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|I0Jk_T-^(N5<3>(l$90TIc*(CMM;ofFoVOh8)-m}s;7%%h{pNkga+ng z0SW~N&T%9pBpf~15w$hzrAG1$qXKnK4F-mJGbcZl-XC`bsDZ)L)z4*}Q$iB}%R?=a diff --git a/techage/textures/techage_form_level_unload.png b/techage/textures/techage_form_level_unload.png deleted file mode 100644 index 54d2cea635a079b488097a2e0ca307b608d86e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@!VDxk7i7!@QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|_yc@GT-^(NqN1Yyb8sYfEdKxhf9sv&^&oX6L4Lsu4$p3+0Xce}E{-7< zr;`&7FwN*)c%XrW(a}IcRN@tro(IEjhJbD%35A)4S_UDk9_Lt<8 diff --git a/techage/textures/techage_form_output_arrow.png b/techage/textures/techage_form_output_arrow.png deleted file mode 100644 index 3301c015a9ffe918f742dcacae2bd35713e6cb14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU-3xpYI~I4Z+W+$Iw9_CJB|(0{3=Yq3qyafbo-U3d9M_W*6xcN! zGBCesg;SF&0z{lgXspg3Px#7*I@9MMrQ{e~&I$Zp9wy zZ2$lO0(4SNQvheBMLEL&009n3L_t(Y$Gz6E4uUWc24Du_?kg0YfEwloPo4mF5=>`9 z@cqR?OI2+DO9=nqK=1PkL$67)M^Z9T%z9jq3$sC_g$e<+^}hj-(hi{3Hun{*55MTyu6uKHk7mej+rbq0=dxAo8_^}xE+x(8HaU7#seaYn|Nb%J3p~5LqHJ~o9mU}3>gTe~ HDWM4f;15~W diff --git a/techage/textures/techage_form_temp_fg.png b/techage/textures/techage_form_temp_fg.png deleted file mode 100644 index b7e4f4edb7ee6003a108201c5301603a908f3f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^3P9|@#0(_a9?Z1`QY`6?zK#qG8~eHcB(ehejKx9j zP7LeL$-D$|cmjMvT-^(N($dnpSM5*iSghjHArBO1DhcunX0VC;vvEI=*X8Nr7@~3h z?WK*J%!WLy0fOR0K0d~;67X^Vi7#u8 z&OfnMd9tZm%9%CK7(LZf98SyIH$_Qs%6#A{x|}qxv9@uy{!R7@%O4E)=3ErfC~NG0 zv#Ex89^dVTD}h^e*4`J2jNTtNonxL%s0G)7&C;c-&hT-`&Sq0lv2Fmmiow&>&t;uc GLK6UD*ITCm diff --git a/techage/textures/techage_formspec_bg.png b/techage/textures/techage_formspec_bg.png deleted file mode 100644 index 1ff04530b4585e87dc496a8f7ccca9ee4deb99b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;bAV5Xt5A^l#pt&nbv&Lfjv*Y^ clM@tpfjk2S#^bA6`+zJ4Pgg&ebxsLQ07uIZp#T5? diff --git a/techage/textures/techage_frame14_ta2.png b/techage/textures/techage_frame14_ta2.png deleted file mode 100644 index b7a119a454dd0246bd193bfd0f7cc9600161ef1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 431 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU42UwVaEW`Bjk3fng-O<;Pfnj4m_n$;oAfK@~ z$lZxy-8q?;K#p{PPl&5~fe(-g1gGX?U0hLieQW!n{@Al;&-V59Bt}I|07@{I1o;Is zC_0uKEwBcfpzP`57!q;#?IpvqW&<9!gs*J5`4{32_MOa2yfJa1^~%|@laBLE$rd+y za`WEqzf%7lt0vh^>Xuk7{dTWr?1fpYB6nT&>-7mbvuwu7eLp{Em=(_6-M30^rO4SJ zBkQ$WuAaH_eSTo8gV)|mo8x*EPZutzUUl4J1^cUK7B9q-WZB<2orzTNy)@g-$uUARj{lJ`IS~LzPa|#wzpxXTki+|-n`;?zW?*tH>K`fDYdB6KJ@K~ rk{*j)*8^rdqR`{`ni+qS=KTD@EH5dO*WUUr3>2=Ou6{1-oD!MoR{{T0pX)+uN%a@*97D zU~1nbBa*vEedWP(uRrBpl-YYxS!a*>e73X4w5^(6)J@3jFn_5jRdXS9LDBltwh`Z% zr#hcHIRBV%KCkY&REwK=n{#$rs-ApOx0vh8eXZ_8TA@#kmqcmGzBuNy_0(slcc;rP sMLu7%+Ir$g@fXc@M4`v`YyL3RNV}Yv6FlVuFi06ZUHx3vIVCg!0I+Muc>n+a diff --git a/techage/textures/techage_frame14_ta4.png b/techage/textures/techage_frame14_ta4.png deleted file mode 100644 index 2892065c01a3d0b98c2582d4429b66f3ada9cb78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU42UwVaEW`Bjk3dQyz$e5NNV^yK0Lgpz?g2@C zvm@StXYB3mnSX_U2lAOqg8YK*7;>LC2rdM2vpiiKLn02py=2JSU?Adpk)P`Tqg>WP zP9UXmpgtk%Qd#1wl6w``%OB;5T@QTw=J4dzZzo<7OD*<_pK)!ItAyw-=~u3K-;_Tb sWS6h`pa_KzE$x0hXy!){i8K1eU7r1Yv3mDZ9iXiYp00i_>zopr0RO*GbN~PV diff --git a/techage/textures/techage_frame14_ta4_hp.png b/techage/textures/techage_frame14_ta4_hp.png deleted file mode 100644 index 74cbad73dbd87569e532a8d9285c84ea63a54b42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU42UwVaEW`Bjk3dQyz$e5NNV^yK0Lgpz?%l7~ z12XPT479hmk5YMX0mxx43GxfJW5|8pAh;07&GK|{42d}W_L3oQgMo7; diff --git a/techage/textures/techage_frame4_ta2.png b/techage/textures/techage_frame4_ta2.png deleted file mode 100644 index 98bb0e6b056bcdceca65f36b7fb439bdf0bc4cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407 zcmV;I0cie-P)Px#8&FJCMF0Q*M{rEjt9i(oX3wH=*R+O?jf~CB&A*FU zq_ADf00002bW%=JA^_1Lix>a^0Srk*K~zY`?b5MsgFp}j(8(VpzW~_o?*LP?dyebl z4ybJ`rv@9PPEf*U$4R7U&wVRlvSDcWT;RnHl1xw@mRUhZI61}VSV*^ zug{Lo?MF|$3s#nmHEiOP6)8?Iy+d44KnI{Y{c}_ZPlFgSY>1T+5L8F^6RZzK2tvE z?`~b07`ARd7aVbvVA;pAk7XarK9+qf`}l`_d;$5YNpw@Jz(N23002ovPDHLkV1mtP BtA79h diff --git a/techage/textures/techage_frame4_ta2_top.png b/techage/textures/techage_frame4_ta2_top.png deleted file mode 100644 index 98bb0e6b056bcdceca65f36b7fb439bdf0bc4cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 407 zcmV;I0cie-P)Px#8&FJCMF0Q*M{rEjt9i(oX3wH=*R+O?jf~CB&A*FU zq_ADf00002bW%=JA^_1Lix>a^0Srk*K~zY`?b5MsgFp}j(8(VpzW~_o?*LP?dyebl z4ybJ`rv@9PPEf*U$4R7U&wVRlvSDcWT;RnHl1xw@mRUhZI61}VSV*^ zug{Lo?MF|$3s#nmHEiOP6)8?Iy+d44KnI{Y{c}_ZPlFgSY>1T+5L8F^6RZzK2tvE z?`~b07`ARd7aVbvVA;pAk7XarK9+qf`}l`_d;$5YNpw@Jz(N23002ovPDHLkV1mtP BtA79h diff --git a/techage/textures/techage_frame4_ta3.png b/techage/textures/techage_frame4_ta3.png deleted file mode 100644 index 3c837edbbbb77dfdfd372e2e32f6806ed2f7ab83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 380 zcmV-?0fYXDP)z{rZI4xnCv3 z%iZJcJop}Ch(HNu_8^p?ZVwg$Z}#9w7!DC=LDe2iE~#;pps2<&;H)CBy)a49xUF|M zM_t~xU}F@$#S(o{4qPPBMO33tlTK|ipt%Q&l7@OLl{Bc6Q;nxrL*N@s}Ke8X$kL*YGBm40` aKRy9>0%9(cJid+q0000z{rZI4xnCv3 z%iZJcJop}Ch(HNu_8^p?ZVwg$Z}#9w7!DC=LDe2iE~#;pps2<&;H)CBy)a49xUF|M zM_t~xU}F@$#S(o{4qPPBMO33tlTK|ipt%Q&l7@OLl{Bc6Q;nxrL*N@s}Ke8X$kL*YGBm40` aKRy9>0%9(cJid+q0000TQ>EamTaXi_>nVDzhLJb9;-~~rmS$7yq zNNXD$V4S?sFrXn&fRDwE^@VDKAn%HXgRHy)iUzan+%6x__$A>hzxZWxNCVqTW(Jpa W%6}>+{Rsw|$>8bg=d#Wzp$PzjQ8P*a diff --git a/techage/textures/techage_frame4_ta4_hp.png b/techage/textures/techage_frame4_ta4_hp.png deleted file mode 100644 index 39658cb5674e88d95ed56bf7dbed434989a01e41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDTx4|5LY1WUf=^H@7=q1zg`c> zxH~b>-rhb+<-r9Yhq)xkFIbVmj%mi%ML@2Hr;B5V$MIwjXJ#HvJ&gmr!3#`8SX+!G zq_qtWFizfR7|;+Xz{ldo`a-oqkatCcq6n{mqQNXXx68*feo6SsFMgRE(!lnTnL+)f W&H-(U{{KKT89ZJ6T-G@yGywo(f-%tm diff --git a/techage/textures/techage_frame4_ta4_top.png b/techage/textures/techage_frame4_ta4_top.png deleted file mode 100644 index f52be611701451a6fc90783395e73a116d78fe48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3P9Yz!VDy5c$8@ZDVB6cUq=Rpjs4tz5?O(K#^NA% zCx&(BWL^R}`~f~8u0Yzozz0Zr2cFh9J2LI-`@cXAb4ie2up)yU(~Pf+fLt3-7sn8f zs3sz*XW18`G5s+)+>EamTaXi_;jhRPHPvgK$4MtWriv%Wa1Fl1j2Ualb zWieRP_+-Tq55C1OlTB)Smi1r!VmQmrjWuI}9fS2>xesFL%pZW}FnGH9xvX+RXwC*Kd0U@i&r3sz*X zW18`G5zquaPZ!6Kh{JCu8Ri`};Bmbb0*c|g?y=R`CPhR1+;YgQ= z*5O7|o|_az9_uY zzAnL+uY@I(spZ0x1E1fCuU+1RodX^S7jv8UtnO_urWm&a@eW&{O9dF+)?BY4S zoB60*P++sagGbxc(jJ!;@9+Mq;@oV1_TOi*cX!S1s^;-+FPQglSLm*vm3cvj?lXRL o{v%+2gdcFVdQ&MBb@0BX{#hX4Qo diff --git a/techage/textures/techage_frame8_ta3.png b/techage/textures/techage_frame8_ta3.png deleted file mode 100644 index c30737dc94ebb82973e01005b19551f94a50f149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU43@pqbR)3}|kYY)9^mSxl*x1kgCy^D%XDkkK zcVbv~PUa<$BOTxq0#f8&-~%KtU%hz${@qt^ULHSjZ14U(8#b=@H`&Awlwd9i@(WgE zuw$C>brH}6eoq(2kch)?Cwb=`Q4nykwsb6NzO(RWMgD;|)qifzcHI2kN3A+p{WzcJ zl8FyF0uQfaxw>>6yJz2uk9{57iz3)KmdKo(*YWG5%k2YI;cnk9NqH~7@QQ!OtlECP z+E(ulJud#w|JeFJ@5v5$@4vqPvryWOV@@v|b}SaKKJZc_hoi`XE4^i@W{cp55|OY~ zHs_=^e7GUDW2Vyy{g~9KK3=nR!+&)KK6FUT}n!b%(Kp zw6?(k#>pEE0~!Ja_*mRnU#K<+@~&t&$jU3AXfVsp?eg)AUlP9Zi(e*(B$(9paP=(f n4{W^n#ZU_*nVcuFgrA|{l>7I7rd#qrYZyFT{an^LB{Ts5TBbTN diff --git a/techage/textures/techage_frame8_ta4_hp.png b/techage/textures/techage_frame8_ta4_hp.png deleted file mode 100644 index efc510cbb5d87f546b24198ee1043ef1189206be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU43@pqbR)3}|kdg@S2?5dW1wKIX-o1PG>-B() zyAuQL?d_vf9$Wx&m`j5Ef)yF;m}Y!k1ms40x;TbJ98UIdX6Dh<(>TBzyud_+wZ&LM zTHD|N+jitq|38qBhDyL>$3mxQnU;+M%G2`05YTs_PB m0~;@XG1LM{Cg({k;b+)8Ewa93t#=~O8U{~SKbLh*2~7YoBsnYq diff --git a/techage/textures/techage_frame8_ta5.png b/techage/textures/techage_frame8_ta5.png deleted file mode 100644 index bd643e1ef41ce65ed5de72522fdaf76afda6d296..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU43@pqbR)3}|kdhAY2?5dW1wKIX-o1OXRg{5@ zMZP}$iVEv;bALrWG6V9NOM?7@6&dW9W_(=)isIEF+VPR{UlW|ZX7)YCY?8?3Nb zhINXegtWH70mjK24Fehi1^8IpSYN0%2=cCIP!!=6P&Alj=XUvc#xDt9`Nc1jLlR7C sd$@X*^#?Xy{9>pDl1$E%Si;Y+;7R89qgh$^fEF=$y85}Sb4q9e05T3c-~a#s diff --git a/techage/textures/techage_frameB_ta4.png b/techage/textures/techage_frameB_ta4.png deleted file mode 100644 index 530a4b90c18e3fe0271c127e1c8f0cf348344498..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%RAQK4g-Ma@Qxvy0j z0V(E^AirP+MZ4`CXQlzUnw~C>AsXkC4a~$68kpUZli8#=H7*>TCaAYSgM-~EfidL3 fgC;f(ZUzRQy&69Y`YH{8nixD?{an^LB{Ts5Ju@Pg diff --git a/techage/textures/techage_frameM_ta4.png b/techage/textures/techage_frameM_ta4.png deleted file mode 100644 index cf15fe9fe955423e198bf946cbccae986bf005f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc(T=DmCO-mhVM4P-Hu1o;IsC|doxn+D{Gc)B=-NL)^iczS?= hrDwH-o8%1%h6yD`3vZ{V#RBCSJYD@<);T3K0RX5{B~AbU diff --git a/techage/textures/techage_frameT_ta4.png b/techage/textures/techage_frameT_ta4.png deleted file mode 100644 index 1204e83910cb7dcf302819c289f0b294f1d4558b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSN8%RAQK4g-Mgo6cEmgI z43KSaZ@>2LqeDOzb4ie2FoUAq_Kq{tfLs$#7sn8d^T`~p%sh&E8V5v!7wGV^E-{vn z*5*3YIANn>QcW<%3 zU%#S4&A<68fI`eAL4LuC40cR2zAgfCO*~y3Lp07ObGS0|96Y9RKqOc}hnIDU(T*J& y1_u}?cXJ0c1Pbu6xUt5>hzK${g$OK|eVNgIqD%YKFJ{p|{S2P2elF{r5}E*&e=1D? diff --git a/techage/textures/techage_frame_small_ta3.png b/techage/textures/techage_frame_small_ta3.png deleted file mode 100644 index a030d5d6552e09dd85a3fcf922018f7ff9a29298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmV-r0h<1aP)O&?CG$vuSEHu?*IS*0d!JMQvg8b*k%9#0RBltK~yNuosqqA!Y~ko zZzdl12u!b&MUD02n&bq%59B&y5#Ik1Vv%5tQ%2YA?6=yvgQN$PxIsjLsKgD3TgN&w za~y5(2beak)lqxv`ASCa;UCD>-tWPs2VE$*pn6cop5XUYwCey_f4+p8HG<|?99a+& z7e^JFAtT2H(a5WeiW`}QC8Hj+fTp_^lH&Y#DdHnK#O4!s`GAuudyI+ z8JWARtG9eE$ls>*90=QYSDHHYkrz~u&_0Dn-xFP23Zb_KT0@kV>^&;7)WLMX#Co2{ z%DG8EGR|yJ%Aaeg4y?Y}f|wB!D=LV``EuF&LgfA%EY3NS%G}U;vjb? zhIQv;UIICs1s;*b3=G`DAk4@xYmNj^P&&XT#1%;UWENgrUV42?>#4cf$EGHpJ$tsV zw`XrhgzMKF2cR@lNswQ#62nEsZjh!=o-U3d8s~E-?#*j45NJ`)pRni9ExVxgyzaR< z3!bUFpH-arOF^TwWa6hAoLwR}HG=D+&i17pkbje!7`1k9fOB$Tlx6gjoQh|k&Q8~! zw0fP}{*Cu9oqjP%aMs!cN2kd2rK*Si_BkAGIA?3~_vOa*ik2+C?Vlx@Qk=H6DMTye za)fX%60k8(5N_(@TlV~8#xAGT0w<)D*u>UxINoz`kKf{A>UuFgP*2ff?_t-AsqCVz z;kGVU*k{-O+9CT(VB*Sc3pjqT#b4z4$)FY%mXX{!bIIN9zMGfMzFc-LK5zeRv8z|} q+sw*m{;G{uPWf0ISO0CxYw1owuY|hlzKcNLGkCiCxvX-zw%hSu1Ydo^vuwe$PjjfLB2t94kI_+ShWhA6A{f^?fDF+nz$*gF6oX5PHGp zB0Awg2$QS&<=-V{u@g%$pTk-0vkHFZnvyVQhVH=`*_DnRWt8DRe$qt^YU+3zje4&?D)2m gv)Q~UxriRGi|C51OJF@*4G5ttL6peVmTWQ1mGyu0TM6zjgvz>A(6w~|SLJaW@|(x| zl838AGr?5AONgq5D8Pm_xtz!_8%t-maop4rnNS%G}U;vjb? zhIQv;UIIDN0X`wFK-#^)2S{GNdh!1KyRY87JbvQX-u-(vY+UbevWXuk!CVsL7p%x& z$28;XA|Uszr;B5V#`)Mu-g$=&cwCm-I#xH|Yy4G_?|E(B$Mk&H6ZiZk?@d)dzV0?t zqiWW72VQm=rIYha?sjA-2?e(wIJGfn=1y6kEuzzA8*Q3;EyAuf>b~LZ+-^PF!>TUg zt;cuNJ`8<7yX{xq@0zRb5{AclOa$I>Br!|%C8(Zw$8oM@=gP8szXkO4j=peZR^Gi|W38&7kFCN+4xR7UHx-<_B=_yTVaDHj;a~rl8%-mM Ul4^gc06os&>FVdQ&MBb@03n^3#sB~S diff --git a/techage/textures/techage_frame_ta3_bottom.png b/techage/textures/techage_frame_ta3_bottom.png deleted file mode 100644 index 4e23692472548729d5c4c1927bf1fbe7f7fa3a72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvS0D`micjc*Pvq)_*?^t-i<4wtM^e@Y)INUmXO$@Xc}hW?jLRw71#w!F0Zm6OZ}) zq)pV?N~HYzHA^47y5P7)-n(t(?4p=sD>lb{e6vr*`N=`6a;dtKs%wdkXO&C*?y`EB zr?S4@aJhKr@q(%?q28JNS%G}U;vjb? zhIQv;UIIDN0X`wFK-#^)2S{GNdh!1KyRY87JbvQX-u-(vY+UbevWXuk!CVsL7p%x& z$28;XA|Uszr;B5V#`)Mu-g$=&cwCm-I#xH|Yy4G_?|E(B$Mk&H6ZiZk?@d)dzV0?t zqiWW72VQm=rIYha?sjA-2?e(wIJGfn=1y6kEuzzA8*Q3;EyAuf>b~LZ+-^PF!>TUg zt;cuNJ`8<7yX{xq@0zRb5{AclOa$I>Br!|%C8(Zw$8oM@=gP8szXkO4j=peZR^Gi|W38&7kFCN+4xR7UHx-<_B=_yTVaDHj;a~rl8%-mM Ul4^gc06os&>FVdQ&MBb@03n^3#sB~S diff --git a/techage/textures/techage_frame_ta4.png b/techage/textures/techage_frame_ta4.png deleted file mode 100644 index b5326f77c9e36c8d66cf631ed6f45ec2c9d0a88d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvS0L?P-~%M@-Ma@Q_05iW z2cEIFw`cwp{vF6?E(!7rR%Eban(=iJkZb1Y;uxZFKH0;WnP=rf4F#Uy1xHv}cNj}Z zYa1M3oV?L6pdnCzkHwAkg=&K!?}~!p_F_uTf#c4pxT#!{#UFIm>{QFnGH9xvX7 zwG9q1PTpu3&=4rV$KuBNLbXAVcSVDu2(N$`1B3iJZ{5{$`Tal>7(8A5T-G@yGywqN CXee9& diff --git a/techage/textures/techage_frame_ta4_top.png b/techage/textures/techage_frame_ta4_top.png deleted file mode 100644 index ce405c6a721901dde2d67a4a5733620a8e34787a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4S0L?P-~%MR15fLl9hvs^ z{a+x5xg^LhSdqbwX~x$@K(3aji(`n!`D6n(W*#*?jRP|^7+KjY5}3FRxDGWQSi!KD i#b8n6lNB!hd<^Om?mNpATJ?dt7(8A5T-G@yGywp>>Lcm^ diff --git a/techage/textures/techage_frame_ta4_top_hp.png b/techage/textures/techage_frame_ta4_top_hp.png deleted file mode 100644 index 1bd16b973d4ee157034ac179ae796aae9ced778e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4S0L?P-~%M@ObonVuUC0* z&2u1!xg^LhSdqbwX~x$@K(3aji(`n!`D6n(W*#*?jRP|^7+KjY5}3FRxDGWQSi!KD i#b8n6lNB!hd<^Om?mNpATJ?dt7(8A5T-G@yGywqBgd`UL diff --git a/techage/textures/techage_frame_ta5.png b/techage/textures/techage_frame_ta5.png deleted file mode 100644 index 6609d1f4fdf64b16deb0c22cd03f5c32713a3fd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)S0L?P-~%M@-McqiMH$Fg z#@9tau7#(IV~EE2MG;;BF$MbP0 Hl+XkKq~|IX diff --git a/techage/textures/techage_frame_ta5_top.png b/techage/textures/techage_frame_ta5_top.png deleted file mode 100644 index 85b4276242c546f9c44dfb31fca6f1e760e94c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0L?P-~%L=hK9^mQC^py zSHz*Z2gqkG3Gxe8WUynJ@pTc9tK;e77@~1LnZwMDaT$-Ap2mTh8jP%L770w;23&_4 n53FF=%VMyo@yQAoe?EpnDfho2^H0bC^)Yz5`njxgN@xNA^*$uc diff --git a/techage/textures/techage_frame_waterpump.png b/techage/textures/techage_frame_waterpump.png deleted file mode 100644 index 90b5165eef78b0e44581fecce834629a3b86505a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDN0X`wFK-#^)M^ZvUPgnQy)r-%bKLv^$IJkeq#`Tet=NJPy%q2m7!JZ7~ zemZ^i}x}w~f3q$L_~hRC$z6f4!o`q`IK#gJ6p@mn+v1jxU!K1U!mT$^%wfO!3;P zkm>#{Q6$iPv4{5O66N-(KXWf#;?ZF2t(@_*sJcGi)V){mii5Iyan5g!ZL+>66jvPo cu~bfe0e7(QjpondK-V#Ny85}Sb4q9e0Bt>G@Bjb+ diff --git a/techage/textures/techage_frame_waterpump_top.png b/techage/textures/techage_frame_waterpump_top.png deleted file mode 100644 index f7116ac1b855ff5777fdddb9e0ec148e3af9c0d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc((rlvaD+KtaMUjqf1N`m}?8UE=^6H*59T0LDHLnJQe_B(Pp z8S=P17s|6~SimmyGVbGdhflM&vKTKnxy+yTP``1XkMTlgb2eKUnI-85rzxD}&FbZO z(lUe7P_@G3RL5)HNbM@033~Zv!2~;OXk;vd$@?2>_enTLJ(8 diff --git a/techage/textures/techage_framexl_ta3.png b/techage/textures/techage_framexl_ta3.png deleted file mode 100644 index 5683d19b2d2323c8b2fbd1ea974f6c27ea1efe63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)S0L?P-~%Lq;PTarhmIV) zfB){QH!nAAT<>z~(Q}|EOG%JluqQ+9qVLDHfXtce>EaloalUopLD547JkG4b2iSTJ z2$UUW@O#1Fdy0YYEyGd+v+HiQSC0QziS|DxwQ7Znpy9-GT9dNB8SMORGTp*%gNtq= zSF+^axomGIo_a3)`ImQXmt~p$4c^(7+FwfUo;f-pYQjas31S>f%-N2q-NpfIZOVS)S0L?P-~%Lq;PTarhmIV) zfB){QH!nAAT<>z~(Q}|EOG%JluqQ+9qVLDHfXtca>EaloalUopLD547JkGqr2iSTJ z2$UUS@H@fady0YYB|~mvj)mE)g?9hcZ&n$db?nNo(^+XJ0G+|4UV;Ae& z0}bBBXEP!L1FH-cHf8QBU+=T!*QrB|GpF8sX}{9b?EaZGzN$U_^1nTuM3Zi_&IEbL M)78&qol`;+09Vm$U;qFB diff --git a/techage/textures/techage_furnace_ceramic.png b/techage/textures/techage_furnace_ceramic.png deleted file mode 100644 index 4b0a82bfd222c90cad369a2a6ca26330649a96af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 643 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�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 P00000NkvXXu0mjf1{v|5 diff --git a/techage/textures/techage_gas_cylinder_large.png b/techage/textures/techage_gas_cylinder_large.png deleted file mode 100644 index 5a420db62cfcad54e741ee1b1c9aa229db31e602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|emUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gcGsSO{y>5M|NkdGNtpstR}$nG%;50sMjDVa+tbA{#N+te zOBXp?40zZQ6op$#8im<6{1Fz}^xr2v=$(iUm)*UK@?VdhH#wqndb7X=e#RMwIsr3N zLz<>Uwl7$*P4R*9em)MiPl?P)3z%Ncu|Bb^_R92I`6>2Y55r>)NsBC~TFm%Ce7;A~ zA6TaFD~edcLXD5kSFE_XJ!|h4kuO^~)n+6#)idU^ X6vjk1y}0-c=u8GrS3j3^P6NS%G}U;vjb? zhIQv;UIID%0X`wF?gcGln^zrX+g|NoD^cDe~tR}$nG%;50sMjDWF+SA1`#N+te ztATun6nNMkv`SAYV0f|TfRTQ~!++_UraW{D|8Uaf@jrE8yPK2#ZOHt!S0QzW9K#z2 zi754lzoi+L??0;htn~YfrU@Q9QhqZCvAQ*UetsZ<^~F~$2i65smHL0NZkhNz@Oojk z^7C~!f@Un(y6lgnWmfjK* YEbNp1f$jSoptl%2UHx3vIVCg!0IH&gu>b%7 diff --git a/techage/textures/techage_gas_inv.png b/techage/textures/techage_gas_inv.png deleted file mode 100644 index ea6868d840576ff1e719006d8be226e22abb706c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 514 zcmV+d0{#7oP)ZCkVa4-2V(yV(9!@L zNSbpY34+h$l-dPx=la8B+eLn4fgZV z*IgYhUcu+p^HTLp>xrt7*?vwRp8#U!x6gVv-u_|y0tARxMRK3`d;kCd07*qoM6N<$ Ef{{_!BLDyZ diff --git a/techage/textures/techage_gasflare.png b/techage/textures/techage_gasflare.png deleted file mode 100644 index 4530dcce7171b9611d84dea114f236209de1a1dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmV-T0kZyyP)Px#6;Mo6MZCbnsI9Pxj**|Fr?IxUm71K!%gv@ZgHQkf z0MI4B(CR1d@jX0R^20*~pl4+ijxg zpoY&*9TPF3KsNvyT?0rUf&wx_Yv!<#YG|9Tt_@il04xyQkhZyk8IGippp6;YKrO`r z4uS#=CLqi#i14o)&zV3@W$<+Mb6Mw<&;$Tj(MtRP diff --git a/techage/textures/techage_gaspipe_hole.png b/techage/textures/techage_gaspipe_hole.png deleted file mode 100644 index a7917683de481741c54c8217082af48f8c914ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$DvSN8&+Z`VR!A94T+T-{*v zXt&*qQvtQP+TI)XCIf{SOM?7@862M7NCR@}JzX3_G|r#Bc$&9Cfrl+2{72`bnO-sn zjx(&_Q8>ux(^LL^KZo3ke%3c1z3Xqa>HH3y7~1e*%7F!Z8^n0rdt;}VH*m@t`6tLm zE=u)c2+6(8z?stWj@LGvuh~=f dq5jt-;ffRyn@r6S(5+& diff --git a/techage/textures/techage_gaspipe_hole2.png b/techage/textures/techage_gaspipe_hole2.png deleted file mode 100644 index 7caba326f59cfe47f6c2c09a3aeaec348a5bdb77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LKSN8%RAoKMh$8Xm{fs9A{ zoUd-Qd4E2rr$ntbS9?NqVi!=9sU*lRm_hrNzDWg;x8BpmF+}71(F+Ip4k_@kJ+N&$ zA0Tt@=V7t+X}=f*Zr-&lmpAOre^9HhBjKE=udw`?cl52WtNZWwIZLrFkWrNgVE-^H z(RRW7c*z7VN$<%CCMH6$@|+E|*XK5{tmQ8_>2SQqSZDf{`$Fdzm~YroeRIl*6CaH0 zwFSx<`O~g5oHdk>wPWW!Y8&%*VV<7#xhHG2)?KZ>FQV|qXnI3jE`#L?3w6(X-~Lw5 g5#;l@)FDyNpq!!?(&q7h3DD^bp00i_>zopr067_JDgXcg diff --git a/techage/textures/techage_gaspipe_junction.png b/techage/textures/techage_gaspipe_junction.png deleted file mode 100644 index 2905b281af45e173a714f5922a8f26afa9b019b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 400 zcmV;B0dM|^P)Px#7*I@9MMrQ<0002vyg%p3Pwc}%_SRL5bSBiWJTm1{ zkN^Mx0(4SNQvfU4FEn@n009U|L_t(2&wY_WZ-X!lg*}P=5eUs4H|n+05_+AQ814w# z>y*Lr_h-Y(njQ9X;>(NuYyemxDr;@5;i21)b`a!VSqHyzL|1s$8~G*&hWZS+nnDiD z4!U=MR63+Sl>o03v}ftzK79~RF>YX55JSghi#xO*;;4y&Bq;`HXB%}=QKd4fX!!|W zdgH{w3L|I%n!%CC&}oDNcSNkvGy)oa!k26@=IRYkxYaU u-}*ur^CffYr_Uf^qjLZJ>~);DI=%sk{8~~@>ihcu0000NS%G}U;vjb? zhIQv;UIID%0X`wF?gc(?4m*Cm8uDO|V^4`1^BT_(kh+o}zhDN3XE)M-oO(|e#}JM4 zXD3|bJ#4_?GC7TD4yT2h!Mp>x-{)%{?2L6@S~p$4!b(==^rz`xE7&$%W7wwuVVCrx zy#iDBluuw_Rj6btVtVp!VeXtp-$w^jA4=JzFxBKO-54gkW3FAps)_>w;^%x~Ym7@Z vg-x1P1pEov@VCuN>Ot*w_e4!D)1!NS%G}U;vjb? zhIQv;UIICy0X`wF?gc(T=8J<)U$2H--DuNOqE?%$9qJjK2oz;13GxeO(7vT_QUT;m z@N{tu(Kvr}LNqV4ArA|`li`})1aqy19U@&1eiW}LUUklo^U5iAqgg*nW&ZcM#~S)B zdd#M%BEUUI?eS(tS1B3u89N@8GA|XJB4uzRqan&O^=?G!ZE-eU*&P>mF|Lu>eCpX{ zlaStbP0l+XkK!~9~U diff --git a/techage/textures/techage_gaspipe_valve_closed.png b/techage/textures/techage_gaspipe_valve_closed.png deleted file mode 100644 index 8b758b6444bf46471555d2eb4cb6c51a15f71feb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc(Trmn8;Sq6rnprFNTcV&Upl?3?(GdMiEkp|?bdb&7_ly BDD(gT diff --git a/techage/textures/techage_gaspipe_valve_hole.png b/techage/textures/techage_gaspipe_valve_hole.png deleted file mode 100644 index de078239f59343a990d8c0ac3bb9710f3e4fee75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^SN8%RAX8de`psd-&DAY> zKn`O`kY6x^!?PP{K#qo|i(`ny<>Z6~iVvc;W--n)VVe8vKK cti22jRW2g=CaaIB1NAU?y85}Sb4q9e0LZQ)w*UYD diff --git a/techage/textures/techage_gaspipe_valve_open.png b/techage/textures/techage_gaspipe_valve_open.png deleted file mode 100644 index ef27b6f0d05a2fdc91097c3c588405ee3c4b01ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4SN8%RAX8UYSM{W7P*9Lo z@Hb^3pRpv!FPOpM*^M+HN7d8CF+}5ha)LzE0Z&ejkO?dztc?yGPK?P42lO3SqYdWR ai2zMI%07A4;yJoN4Gf;HelF{r5}E*EoFEYZ diff --git a/techage/textures/techage_gate.png b/techage/textures/techage_gate.png deleted file mode 100644 index ac51f19d56730490ad7552e99f0e42f9a5ae765c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 425 zcmV;a0apHrP) zVK6@_M8{x?8oiSO9h`wg5SS?=9}yZwyrEY1L@P|+)&d1RFwnzdQe z%nVCNwFN|d;crs#ZJBp3Sz_ehCT<%Hxxbe&wf}#MbuL*Jw6Tr62(EM}V_oteSfEP} TU9ITp00000NkvXXu0mjfmxHlI diff --git a/techage/textures/techage_gravel4.png b/techage/textures/techage_gravel4.png deleted file mode 100644 index 736b74dea1b2fc7bd481a13087f3d597fcf61f1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmV+z0q6dSP)u;?-TJC4>hv61j^Q; zV-H-cM{sFBp82UB`SvWoJpJJr%WR&aJUn=k=bZk}U%HwwZs_bciN(-TbPw(*!}wD3 eet715dcFY97%@qtTp%|90000M diff --git a/techage/textures/techage_growlight_back.png b/techage/textures/techage_growlight_back.png deleted file mode 100644 index 0c6be8cd3208d7f7112e1ee904efa5c9c2fde897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF8#Zpc|V<+Z+ZoLl_)b@0743W5;9Kp)U6YP9Yp(jzyB|-8q t51TgTe~DWM4fHB2kb diff --git a/techage/textures/techage_growlight_on.png b/techage/textures/techage_growlight_on.png deleted file mode 100644 index 4e94a1adc723ff838f290bad578de1ee2443ef93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*Oe<*FIv3h4(pL0+qW$4 zyFRNnx(+C1?djqeqH#Vs!GXP}NyDL`Q7}|aPx#8&FJCMMrQL0; z*cj_s00001bW%=J06^y0W&i*I#z{m$R7l5#)y;C-AP@&|PkTs@MRvG@GP(y|Ac_{w z^@L5%8e?7|d4uG!yAXNYnJ#M%KA4~XyL?FA?fw~G?{$3aI-^ae^IM1f`lM-$-uA>D z{dyg}w}TEu7=W{{!w%MFWWW#lwSPP{U^V;?etK_0+J6IU8Q`Gga1wym_&U@CL-PX% z3P5aNReXswPhqJ5BcA|JV(S5qJTQQ9YzZ9@0pKJ7eBJ8?^0C*$whC2P;OLa_vQaFc zfGh$;svv=~t)d4!wcmEK3#f;7JAaNt-cD1o;F@6g1bTNS%G}U;vjb? zhIQv;UIIBh0X`wFhYlSAGVk8KJ9X;Rg3g|2K#rlOi(`ny<>UxfR-WAr396CSiCzopr02*E_ A(f|Me diff --git a/techage/textures/techage_hopper.png b/techage/textures/techage_hopper.png deleted file mode 100644 index f714af35ac55873582300e288c6bcab1e546979c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1763 zcmV<91|0c`P)Px#32;bRa{vGf6951U69E94oEQKA04h*SR7Ff_aaw47 ze}s;BfQ~peIYK}~PD@WJC@dZvA68XbVqs`*Zgd6*0{{aCuZ?U@00004bW%=J06_SR z`(jVz000IuNkl&G%4*?|a>JI{&Zr&g{g$w*6pMnpjopyXTv}@O~Nh&GfF4S*DG=_$=F3Pb;mIj*0Rj z&$7%uN|Vx@c#3UlOd?69loc?=Z~U}&JapBsyN!>n>ttfINh!C5&4Ou`5v^K#ZCo0; z_VzOHlGfAa2DZy`zjKkLS&GoAD8fG$A}RIH%fL9+Cgx2UNJ%6Wsh9x)BD16Vp80ks zaKw(3HUq!=n!(56gal4+B0*VRz)4b-!00fa)wIrmjUDbwljC$5ykxC>CB!&TDlB%jAnWZ3g zTu(|Ivo7P0Jdnz~DEd`p48BE7N>SIqzRZxVYMnEJ?}(7&a~{Yj&FvT#vrSTdQMY8E zUxKSSaVkPV0o-EXc$TI}#ait)Ha5MzKm4>o&~-C2ag+ze0Pu%67^SJixi?OpZYCZu zrbMOdsjHBOtW^v=6p_!3YzDG6nIf~LA;!p{OP1g&MOl*=QVE`Vw zx^9~9eWM;Y#x9~PqO^-?V;JxruzzVv4M4D9r_S99K<7MMM8x4Jog@T6@xI7Cd(iL& z@s_n~7Qhj>hy=va)f$6~1ccxL6S_krtS;xOOD)jJaoSNY%`jbJpFvg*1KM|ofPHD| z%4`8|S`LQ`E-B$16p5qznKPJAnD+X@erh%8p}U_&i$r$o-85^b zK1Ua5o|3DWmMY2@!!%Vln*o>pQfCi0zRD2!^r^j3Z622?{Fx5LB{-Z4=~;;D|;ZmP6n)6M2gSxF5tb#3<$l@%?Oh2 z>H!ao#a*-vyaqt@-DU`@e;oiff;MgYV00`4uRoq&t?C&ALJyn!0EF6F442Emp~v&D zsv!d=akZNvWk9%)Y)%pfSq2V!53UpnQmto>RDFl|Dc80T+?`u~U(M%#`t$KLgb2l% z*&XUC*_!h_+XZ|)e-Pp=A#DuOGu)wVM`+jJb+Q~%=j9e?CnH^eht@o4+*EddS+-v} z?g1S}X^hgA1L0Ga;ApPd^9o(*eEk4f53?7!Ni`2Wp=%syxUur2H|raJ@m!;j8UT0& z;bxnZ=H|+iAH;_r#{ORN#jUa~gw)44xc&4e^dp3>80aJ5AB7jt?PtBYe~UFgkwPOL zN1^FCkNTqsWqZeW)eq16AHadzE1mtdzxLPu+F$?K`UhO%#@yW3fAatU002ovPDHLk FV1gQ=COrTE diff --git a/techage/textures/techage_hydrogen_inv.png b/techage/textures/techage_hydrogen_inv.png deleted file mode 100644 index 82aeff0795a8f36819db5ff455cae7759839495e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^jzH|d#0(@Yj(#czQY`6?zCgi^{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF?gc&!L0u_pABL)JxCl~F666=m;PC858jy3;)5S5w;`Guh2Su9| zc-RswESP>9IPv|l-Qjq5xpIX@uvm@MB!|_tMStRiScK;8-pItj8qBDoc_Yk3QH#UC z@t=T^r;@G=Q*;~mPqibdMh5HG24pbl9TqzNXz7IrHO)*NN3L~TQ;yUx(Gjax`x5<3 zXX(4GPo_`3dFt~`ujIoyBSS&LBBE|ZOPL*$+KN9Ki}DGk#)Vmcg7n@j1#Q(ID`N_#Ng@b K=d#Wzp$Pz4ly(6C diff --git a/techage/textures/techage_industlight4_on.png b/techage/textures/techage_industlight4_on.png deleted file mode 100644 index 0e4aa14b08fc1a3a1757eb3eec5c019c304f414f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFd-m=>dhEpi|NoUvg?t1Gs(QLOhDcma=4fSNV`no+NGWLLU@_XU nmZ`b(@O;MaMm7Qo2bma_UFgWvd-ORDsDZ)L)z4*}Q$iB}58Eno diff --git a/techage/textures/techage_industriallamp1.png b/techage/textures/techage_industriallamp1.png deleted file mode 100644 index 17b4c76b217fd5b80c07847a175d2f3eadfea1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF?gc(uwryRyeA&4R=Z+jba`Vt-U68txAirP+hi5m^fSd|X7sn8d z^LzU*@-`^&xO59w@G?gnV%yMg;Gc1)THCh!$A0hjes|0Li-rN;rCSBN9vsPQVu

FIQI_+Qxl_qvMXd`*8vt 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 XRjD9kvZMb100000NkvXXu0mjf^FmJ& diff --git a/techage/images/watermill.png b/techage/images/watermill.png deleted file mode 100644 index 69ac56074356f75094e4bbd5e24134ff37ef4c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175997 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
0{J6I{CGQ(z|NSXmIjk{p!xTafdZo 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 LXTd)e98IV$gPpTvtHkV(iB|Zx-b1T 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 diff --git a/techage/images/wind_plant.png b/techage/images/wind_plant.png deleted file mode 100644 index 15075826a0de6cf2150d705876882172558b4592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144306 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�M-gymEz50UdzX{1aFiUu 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