From 1ba43d2ef4b377d51412e4d9a0b7a03e0b55e6a4 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 1 Mar 2020 12:32:11 +0100 Subject: [PATCH] manuals updated --- README.md | 10 +++-- doc/items.lua | 4 ++ doc/manual_DE.lua | 80 +++++++++++++++++++++++++++++++-- icta_controller/action.lua | 2 +- icta_controller/battery.lua | 23 +++++----- icta_controller/commands.lua | 21 +++++---- icta_controller/condition.lua | 2 +- icta_controller/controller.lua | 10 ++--- icta_controller/display.lua | 33 +++++++------- icta_controller/signaltower.lua | 22 ++++----- icta_controller/stopwatch.lua | 6 +-- icta_controller/submenu.lua | 14 +++++- init.lua | 1 + manuals/manual_ta3_DE.md | 2 +- manuals/manual_ta4_DE.md | 58 ++++++++++++++++++++++++ manuals/toc_DE.md | 5 +++ 16 files changed, 224 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index 36c945a..86135c8 100644 --- a/README.md +++ b/README.md @@ -7,18 +7,20 @@ Tech Age, a mod to go through 4 tech ages in search of wealth and power. ### License -Copyright (C) 2019 Joachim Stolberg +Copyright (C) 2019-2020 Joachim Stolberg Code: Licensed under the GNU GPL version 3 or later. See LICENSE.txt Textures: CC BY-SA 3.0 ### Dependencies -Required: default, tubelib2, basic_materials, bucket, stairs +Required: default, doors, tubelib2, basic_materials, bucket, stairs, lcdlib Optional: unified_inventory, wielded_light, minecart Highly recommended: signs_bot, minecart ### History -- 2019-06-16 V0.01 * First upload -- 2019-09-28 V0.02 * TA3 finished +- 2019-06-16 V0.01 * First upload +- 2019-09-28 V0.02 * TA3 finished +- 2020-02-29 V0.04 * TA4 ICTA controller added + diff --git a/doc/items.lua b/doc/items.lua index 43308fd..bc74d42 100644 --- a/doc/items.lua +++ b/doc/items.lua @@ -133,5 +133,9 @@ techage.Items = { 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_signaltower = "techage:ta4_signaltower", --ta4_ "", } diff --git a/doc/manual_DE.lua b/doc/manual_DE.lua index 1b76c4e..6073941 100644 --- a/doc/manual_DE.lua +++ b/doc/manual_DE.lua @@ -3,7 +3,7 @@ techage.manual_DE = {} techage.manual_DE.aTitel = { "1,Tech Age Mod", "2,Software Update", - "3,Was hat sich am Spiel geändert", + "3,Was hat sich am Spiel geändert?", "2,Hinweise", "2,Erze und Mineralien", "3,Meridium", @@ -139,6 +139,11 @@ techage.manual_DE.aTitel = { "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 Signal Tower", "2,Weitere TA4 Blöcke", "3,TA4 Tank / TA4 Tank", "3,TA4 Pumpe / TA4 Pump", @@ -163,18 +168,35 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", - "\027(c@#ffffff)Da sich mit dem Update die Art und Weise wie Daten der Maschinen gespeichert werden\\, geändert hat\\, sind nach dem Update alle Maschinen erst einmal ohne Daten und damit Funktionslos und müssen \"repariert\" werden. \n".. + "Zum 23.02.2020 gab es ein größeres Software-Update\\, was einige Änderungen und aus Sicht der Spieler auch \"Probleme\" mit sich bringt. Das Software-Update war aber nötig\\, um die techage Mod weiter ausbauen und entwickeln zu können.\n".. + "\n".. + "Da sich mit dem Update die Art und Weise wie Daten der Maschinen gespeichert werden\\, geändert hat\\, sind nach dem Update alle Maschinen erst einmal ohne Daten und damit Funktionslos und müssen \"repariert\" werden. \n".. "\n".. "Dazu gibt es ein Reparaturset\\, bestehend aus dem Schraubenschlüssel (Techage Info Werkzeug) und der Werkzeugtasche (TechAge Reparaturset). Beide Werkzeuge können gecraftet werden.\n".. "\n".. " - Mit dem Schraubenschlüssel können die Verbindungen über das Stromnetz geprüft werden. Dazu einfach auf einen Generator oder eine Junction klicken\\, dann werden alle verbundenen Blöcke in der Umgebung markiert. Bei Unterbrechungen immer den letzten markierten Block (Junction) in der Kette neu setzen.\n".. + " - normale Maschinen müssen nur neu gestartet werden. Hilft dies nicht\\, einfach neu setzen.\n".. + " - Generatoren (auch Akkus und Brennstoffzelle) können entweder neu gesetzt\\, oder mit dem Reparaturset angeklickt und damit repariert werden.\n".. + " - Die Trägermodule der Solarzellen müssen ebenfalls mit dem \"Reparaturset\" angeklickt werden.\n".. + " - Die Stromschalterbox und die Stromschalter müssen neu gesetzt werden. Die Stromschalterbox verhält sich beim Setzen nun ähnlich wie Stromkabel.\n".. + " - Der TA4 Solar Wechselrichter besteht jetzt nur noch aus einem Block. Der zweite Block muss entfernt und durch ein rotes Kabel ersetzt werden.\n".. " - Wasserstoff ist nun wie eine Flüssigkeit zu behandeln. Elektrolyseur und Brennstoffzelle müssen daher nicht mehr über Röhren und Schieber sondern über Pumpen und Flüssigkeitsleitungen miteinander verbunden werden.\n".. "\n", + " - der TA1 Hopper ist weg\\, dafür kann jetzt der Hopper aus der Mod Minecart genutzt werden.\n".. + " - Blöcke für Wasser und andere Flüssigkeiten (Boiler\\, Tanks) haben kein Inventory mehr. Diese muss man nun füllen bzw. leeren\\, in dem man mit einem vollen bzw. leeren Behälter auf den Block klickt. Bei Wasser ist das der Eimer\\, bei Öl und anderen Flüssigkeiten die Fässer oder Kanister.\n".. + " - für TA2 und TA3 gibt er jetzt einen Steinbrecher (Quarry) zum Abbau von Steinen.\n".. + " - Die Stromschalterbox und die Stromschalter wurden überarbeitet und sind nun leichter zu Platzieren.\n".. + " - Alle Menüs werden nun automatisch und zyklisch aktualisiert\\, den \"Update\" Button gibt es nicht mehr.\n".. + " - Die Tanks können nun nicht mehr direkt über Schieber gefüllt oder geleert werden. Hierzu ist zusätzlich ein TA Einfülltrichter (TA Liquid Filler) notwendig.\n".. + " - Gas\\, was beim Destillieren entsteht (Propangas)\\, kann über den Reformer in Wasserstoff umgewandelt und dann zu Strom gemacht werden.\n".. + " - Der TA4 Solar Wechselrichter besteht jetzt nur noch aus einem Block.\n".. " - Generator und Wärmetauscher beim Energiespeicher arbeiten nun unabhängig von einander und können auch einzeln mit dem Stromnetz verbunden sein.\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/blob/master/manuals/toc_DE.md\n".. + " - Short Link: https://tinyurl.com/y2lwl35h\n".. "\n".. "Die Konstruktionspläne (Diagramme) für den Aufbau der Maschinen sowie die Bilder sind aber nur ingame verfügbar.\n".. "\n".. @@ -744,7 +766,7 @@ techage.manual_DE.aText = { " - 'standby' --> nichts zu tun\\, da Quell-Inventar leer\n".. " - 'blocked' --> kann nichts tun\\, da Ziel-Inventar voll\n".. "\n".. - "Dieser Status wird bei vielen Blöcken gleichzeitig auch über den Info-Text angezeigt.\n".. + "Dieser Status und weitere Informationen werden auch ausgegeben\\, wenn mit dem Schraubenschlüssel auf den Block geklickt wird.\n".. "\n".. "\n".. "\n", @@ -1122,6 +1144,48 @@ techage.manual_DE.aText = { "\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".. + "\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", "", "Siehe TA3 Tank.\n".. "\n".. @@ -1286,6 +1350,11 @@ techage.manual_DE.aItemName = { "ta4_reactorstand", "ta4_reactorbase", "ta4_silo", + "ta4_icta_controller", + "ta4_icta_controller", + "ta4_battery", + "ta4_display", + "ta4_signaltower", "", "ta4_tank", "ta4_pump", @@ -1437,5 +1506,10 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", + "", + "", + "", + "", } diff --git a/icta_controller/action.lua b/icta_controller/action.lua index b578d31..2a44b17 100644 --- a/icta_controller/action.lua +++ b/icta_controller/action.lua @@ -66,7 +66,7 @@ end -- return the Lua code function techage.code_action(kvSelect, environ) if kvSelect and kvRegisteredActn[kvSelect.choice] then - if techage.submenu_verify(kvRegisteredActn, kvSelect) then + if techage.submenu_verify(environ.owner, kvRegisteredActn, kvSelect) then return kvRegisteredActn[kvSelect.choice].code(kvSelect, environ) end end diff --git a/icta_controller/battery.lua b/icta_controller/battery.lua index 335d6ac..017b81d 100644 --- a/icta_controller/battery.lua +++ b/icta_controller/battery.lua @@ -29,7 +29,7 @@ local function on_timer(pos, elapsed) meta:set_string("infotext", S("Battery").." ("..percent.."%)") if percent == 0 then local node = minetest.get_node(pos) - node.name = "techage:battery_empty" + node.name = "techage:ta4_battery_empty" minetest.swap_node(pos, node) return false end @@ -37,7 +37,7 @@ local function on_timer(pos, elapsed) end local function register_battery(ext, percent, nici) - minetest.register_node("techage:battery"..ext, { + minetest.register_node("techage:ta4_battery"..ext, { description = S("Battery").." "..ext, inventory_image = 'techage_battery_inventory.png', wield_image = 'techage_battery_inventory.png', @@ -63,7 +63,7 @@ local function register_battery(ext, percent, nici) local meta = minetest.get_meta(pos) meta:set_int("content", BATTERY_CAPACITY * percent) local node = minetest.get_node(pos) - node.name = "techage:battery" + node.name = "techage:ta4_battery" minetest.swap_node(pos, node) on_timer(pos, 1) minetest.get_node_timer(pos):start(30) @@ -75,13 +75,13 @@ local function register_battery(ext, percent, nici) local percent = calc_percent(tonumber(oldmetadata.fields.content)) local stack if percent > 95 then - stack = ItemStack("techage:battery") + stack = ItemStack("techage:ta4_battery") elseif percent > 75 then - stack = ItemStack("techage:battery75") + stack = ItemStack("techage:ta4_battery75") elseif percent > 50 then - stack = ItemStack("techage:battery50") + stack = ItemStack("techage:ta4_battery50") elseif percent > 25 then - stack = ItemStack("techage:battery25") + stack = ItemStack("techage:ta4_battery25") else return end @@ -104,7 +104,7 @@ register_battery("75", 0.75, 1) register_battery("50", 0.5, 1) register_battery("25", 0.25, 1) -minetest.register_node("techage:battery_empty", { +minetest.register_node("techage:ta4_battery_empty", { description = S("Battery"), tiles = { -- up, down, right, left, back, front @@ -141,7 +141,7 @@ minetest.register_node("techage:battery_empty", { if minetest.global_exists("moreores") then minetest.register_craft({ - output = "techage:battery 2", + output = "techage:ta4_battery 2", recipe = { {"", "moreores:silver_ingot", ""}, {"", "default:copper_ingot", ""}, @@ -150,7 +150,7 @@ if minetest.global_exists("moreores") then }) else minetest.register_craft({ - output = "techage:battery 2", + output = "techage:ta4_battery 2", recipe = { {"", "default:tin_ingot", ""}, {"", "default:copper_ingot", ""}, @@ -159,7 +159,8 @@ else }) end -techage.register_node({"techage:battery", "techage:battery25", "techage:battery50", "techage:battery75"}, +techage.register_node({"techage:ta4_battery", "techage:ta4_battery25", + "techage:ta4_battery50", "techage:ta4_battery75"}, { on_node_load = function(pos) minetest.get_node_timer(pos):start(30) diff --git a/icta_controller/commands.lua b/icta_controller/commands.lua index cbec723..f5dccf4 100644 --- a/icta_controller/commands.lua +++ b/icta_controller/commands.lua @@ -163,7 +163,7 @@ techage.icta_register_condition("state", { title = "block state request", formspec = { { - type = "digits", + type = "number", name = "number", label = "block number", default = "", @@ -201,7 +201,7 @@ techage.icta_register_condition("fuel", { title = "fuel request", formspec = { { - type = "digits", + type = "number", name = "number", label = "block number", default = "", @@ -238,7 +238,7 @@ techage.icta_register_condition("load", { title = "load request", formspec = { { - type = "digits", + type = "number", name = "number", label = "block number", default = "", @@ -275,7 +275,7 @@ techage.icta_register_condition("chest", { title = "chest state request", formspec = { { - type = "digits", + type = "number", name = "number", label = "chest number", default = "", @@ -314,7 +314,7 @@ techage.icta_register_condition("signaltower", { title = "Signal Tower state request", formspec = { { - type = "digits", + type = "number", name = "number", label = "Signal Tower number", default = "", @@ -419,7 +419,7 @@ techage.icta_register_action("display", { type = "textlist", name = "row", label = "Display line", - choices = "1,2,3,4,5,6,7,8,9", + choices = "1,2,3,4,5", default = "1", }, { @@ -449,7 +449,7 @@ techage.icta_register_action("cleardisplay", { title = "Display: Clear screen", formspec = { { - type = "numbers", + type = "number", name = "number", label = "Display number", default = "", @@ -537,7 +537,6 @@ techage.icta_register_action("door", { function techage.icta_player_detect(own_num, number, name) local state = techage.send_single(own_num, number, "name", nil) - print("state="..state.."< name="..name.."<") if state ~= "" then if name == "*" or string.find(name, state) then return state @@ -552,7 +551,7 @@ techage.icta_register_condition("playerdetector", { title = "Player Detector name request", formspec = { { - type = "digits", + type = "number", name = "number", label = "Player Detector number", default = "", @@ -582,7 +581,7 @@ techage.icta_register_action("set_filter", { title = "turn Distributor filter on/off", formspec = { { - type = "numbers", + type = "number", name = "number", label = "distri number", default = "", @@ -612,7 +611,7 @@ techage.icta_register_action("set_filter", { end, code = function(data, environ) local payload = '{slot = "'..data.color..'", val = "'..data.value..'"}' - return send_multi_string(environ, data.number, "filter", payload) + return send_single_string(environ, data.number, "filter", payload) end, }) diff --git a/icta_controller/condition.lua b/icta_controller/condition.lua index 01bf510..4e025d0 100644 --- a/icta_controller/condition.lua +++ b/icta_controller/condition.lua @@ -61,7 +61,7 @@ end -- return the Lua code function techage.code_condition(kvSelect, environ) if kvSelect and kvRegisteredCond[kvSelect.choice] then - if techage.submenu_verify(kvRegisteredCond, kvSelect) then + if techage.submenu_verify(environ.owner, kvRegisteredCond, kvSelect) then return kvRegisteredCond[kvSelect.choice].code(kvSelect, environ) end end diff --git a/icta_controller/controller.lua b/icta_controller/controller.lua index 9f2dd51..b25e6dd 100644 --- a/icta_controller/controller.lua +++ b/icta_controller/controller.lua @@ -236,7 +236,7 @@ end local function battery(pos) - local battery_pos = minetest.find_node_near(pos, 1, {"techage:battery"}) + 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)) @@ -408,7 +408,7 @@ local function on_receive_fields(pos, formname, fields, player) end end -minetest.register_node("techage:ta4_controller", { +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", @@ -433,7 +433,7 @@ minetest.register_node("techage:ta4_controller", { after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) - local number = techage.add_node(pos, "techage:ta4_controller") + 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()) @@ -467,7 +467,7 @@ minetest.register_node("techage:ta4_controller", { minetest.register_craft({ - output = "techage:ta4_controller", + output = "techage:ta4_icta_controller", recipe = { {"basic_materials:plastic_sheet", "dye:blue", "basic_materials:plastic_sheet"}, {"", "default:copper_ingot", ""}, @@ -491,7 +491,7 @@ local function set_input(pos, own_number, rmt_number, val) end end -techage.register_node({"techage:ta4_controller"}, { +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") diff --git a/icta_controller/display.lua b/icta_controller/display.lua index f3980b7..70d35ff 100644 --- a/icta_controller/display.lua +++ b/icta_controller/display.lua @@ -11,8 +11,10 @@ ICTA Controller - Display ]]-- - - + +local NUM_ROWS = 5 +local RADIUS = 6 + lcdlib.register_display_entity("techage:display_entity") local function display_update(pos, objref) @@ -21,8 +23,7 @@ local function display_update(pos, objref) text = string.gsub(text, "|", " \n") local texture = lcdlib.make_multiline_texture( "default", text, - --120, 120, 9, "top", "#000") - 70, 70, 5, "top", "#000") + 70, 70, NUM_ROWS, "top", "#000") objref:set_properties({ textures = {texture}, visual_size = {x=0.94, y=0.94} }) end @@ -30,10 +31,10 @@ end local function on_timer(pos) local node = minetest.get_node(pos) -- check if display is loaded and a player in front of the display - if node.name == "techage:display" then + if node.name == "techage:ta4_display" then local dir = minetest.facedir_to_dir((node.param2 + 2) % 4) - local pos2 = vector.add(pos, vector.multiply(dir, 6)) - for _, obj in pairs(minetest.get_objects_inside_radius(pos2, 6)) do + 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) break @@ -48,7 +49,7 @@ local lcd_box = { wall_top = {-8/16, 15/32, -8/16, 8/16, 8/16, 8/16} } -minetest.register_node("techage:display", { +minetest.register_node("techage:ta4_display", { description = "TA4 Display", inventory_image = 'techage_display_inventory.png', tiles = {"techage_display.png"}, @@ -66,7 +67,7 @@ minetest.register_node("techage:display", { }, after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:display") + local number = techage.add_node(pos, "techage:ta4_display") local meta = minetest.get_meta(pos) meta:set_string("number", number) meta:set_string("text", "My\nTechage\nTA4\nDisplay\nNo: "..number) @@ -90,10 +91,10 @@ minetest.register_node("techage:display", { minetest.register_craft({ - output = "techage:display", + output = "techage:ta4_display", recipe = { {"", "", ""}, - {"default:glass", "dye:green", "techage:ta4_wlanchip"}, + {"techage:basalt_glass_thin", "dye:green", "techage:ta4_wlanchip"}, {"", "default:copper_ingot", ""}, }, }) @@ -107,7 +108,7 @@ local function add_line(meta, payload) else rows = string.split(text, "|") end - if #rows > 8 then + if #rows >= NUM_ROWS then table.remove(rows, 1) end table.insert(rows, payload) @@ -119,7 +120,7 @@ local function write_row(meta, payload) local text = meta:get_string("text") if type(payload) == "table" then local row = tonumber(payload.row) or 0 - if row > 9 then row = 9 end + if row > NUM_ROWS then row = NUM_ROWS end local str = payload.str or "oops" if row == 0 then meta:set_string("infotext", str) @@ -132,8 +133,8 @@ local function write_row(meta, payload) else rows = string.split(text, "|") end - if #rows < 9 then - for i = #rows, 9 do + if #rows < NUM_ROWS then + for i = #rows, NUM_ROWS do table.insert(rows, " ") end end @@ -143,7 +144,7 @@ local function write_row(meta, payload) end end -techage.register_node({"techage:display"}, { +techage.register_node({"techage:ta4_display"}, { on_recv_message = function(pos, src, topic, payload) local node = minetest.get_node(pos) local timer = minetest.get_node_timer(pos) diff --git a/icta_controller/signaltower.lua b/icta_controller/signaltower.lua index 58efa4a..5d51f05 100644 --- a/icta_controller/signaltower.lua +++ b/icta_controller/signaltower.lua @@ -16,18 +16,18 @@ local function switch_on(pos, node, color) local meta = minetest.get_meta(pos) meta:set_string("state", color) - node.name = "techage:signaltower_"..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:signaltower" + node.name = "techage:ta4_signaltower" minetest.swap_node(pos, node) end -minetest.register_node("techage:signaltower", { +minetest.register_node("techage:ta4_signaltower", { description = "TA4 Signal Tower", tiles = { 'techage_signaltower_top.png', @@ -44,7 +44,7 @@ minetest.register_node("techage:signaltower", { }, after_place_node = function(pos, placer) - local number = techage.add_node(pos, "techage:signaltower") + 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) @@ -70,7 +70,7 @@ minetest.register_node("techage:signaltower", { }) for _,color in ipairs({"green", "amber", "red"}) do - minetest.register_node("techage:signaltower_"..color, { + minetest.register_node("techage:ta4_signaltower_"..color, { description = "TA4 Signal Tower", tiles = { 'techage_signaltower_top.png', @@ -98,12 +98,12 @@ for _,color in ipairs({"green", "amber", "red"}) do groups = {crumbly=0, not_in_creative_inventory=1}, is_ground_content = false, sounds = default.node_sound_glass_defaults(), - drop = "techage:signaltower", + drop = "techage:ta4_signaltower", }) end minetest.register_craft({ - output = "techage:signaltower", + output = "techage:ta4_signaltower", recipe = { {"dye:red", "default:copper_ingot", ""}, {"dye:orange", "default:glass", ""}, @@ -111,10 +111,10 @@ minetest.register_craft({ }, }) -techage.register_node({"techage:signaltower", - "techage:signaltower_green", - "techage:signaltower_amber", - "techage:signaltower_red"}, { +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 diff --git a/icta_controller/stopwatch.lua b/icta_controller/stopwatch.lua index e83364f..4122c5c 100644 --- a/icta_controller/stopwatch.lua +++ b/icta_controller/stopwatch.lua @@ -66,7 +66,7 @@ techage.icta_register_condition("stopwatch", { title = "stopwatch", formspec = { { - type = "numbers", + type = "number", name = "number", label = "Switch number", default = "", @@ -89,7 +89,7 @@ techage.icta_register_action("stopwatch", { title = "stopwatch", formspec = { { - type = "numbers", + type = "number", name = "number", label = "Display number", default = "", @@ -126,7 +126,7 @@ techage.icta_register_action("stopwatch", { code = function(data, environ) local idx = ({time=1, highscore= 2, name=3})[data.type] local s1 = string.format('local payload = {row = %s, str = "%s "..env.stopwatch_result['..idx..']}', data.row, techage.escape(data.text)) - local s2 = string.format('techage.send_multi("%s", "%s", "row", payload)', environ.number, data.number) + local s2 = string.format('techage.send_single("%s", "%s", "row", payload)', environ.number, data.number) return s1.."\n\t"..s2 end, }) diff --git a/icta_controller/submenu.lua b/icta_controller/submenu.lua index b637013..f428532 100644 --- a/icta_controller/submenu.lua +++ b/icta_controller/submenu.lua @@ -119,14 +119,24 @@ local function field_to_kvSelect(kvDefinition, kvSelect, fields) return kvSelect end -function techage.submenu_verify(kvDefinition, kvSelect) +function techage.submenu_verify(owner, kvDefinition, kvSelect) local error = false local lControls = kvDefinition[kvSelect.choice].formspec for idx,elem in ipairs(lControls) do if elem.type == "numbers" then if not kvSelect[elem.name]:find("^[%d ]+$") then error = true - end + 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 diff --git a/init.lua b/init.lua index 3abc958..93e85a0 100644 --- a/init.lua +++ b/init.lua @@ -219,6 +219,7 @@ else dofile(MP.."/icta_controller/edit.lua") dofile(MP.."/icta_controller/battery.lua") --dofile(MP.."/icta_controller/stopwatch.lua") + --dofile(MP.."/icta_controller/expression.lua") dofile(MP.."/icta_controller/display.lua") dofile(MP.."/icta_controller/signaltower.lua") diff --git a/manuals/manual_ta3_DE.md b/manuals/manual_ta3_DE.md index 9e601c7..2f5506b 100644 --- a/manuals/manual_ta3_DE.md +++ b/manuals/manual_ta3_DE.md @@ -408,7 +408,7 @@ Mögliche Antworten des Schiebers sind: - `standby` --> nichts zu tun, da Quell-Inventar leer - `blocked` --> kann nichts tun, da Ziel-Inventar voll -Dieser Status wird bei vielen Blöcken gleichzeitig auch über den Info-Text angezeigt. +Dieser Status und weitere Informationen werden auch ausgegeben, wenn mit dem Schraubenschlüssel auf den Block geklickt wird. [ta3_logic|image] diff --git a/manuals/manual_ta4_DE.md b/manuals/manual_ta4_DE.md index 62a376f..37d627b 100644 --- a/manuals/manual_ta4_DE.md +++ b/manuals/manual_ta4_DE.md @@ -284,6 +284,64 @@ Teil des Chemischen Reaktors. Wird zur Aufbewahrung von Stoffen in Pulver- oder + +## 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. + +[ta4_display|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] + + + ## Weitere TA4 Blöcke diff --git a/manuals/toc_DE.md b/manuals/toc_DE.md index f2eb59c..9fd84cb 100644 --- a/manuals/toc_DE.md +++ b/manuals/toc_DE.md @@ -138,6 +138,11 @@ - [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 Signal Tower](./manual_ta4_DE.md#ta4-signal-tower) - [Weitere TA4 Blöcke](./manual_ta4_DE.md#weitere-ta4-blöcke) - [TA4 Tank / TA4 Tank](./manual_ta4_DE.md#ta4-tank--ta4-tank) - [TA4 Pumpe / TA4 Pump](./manual_ta4_DE.md#ta4-pumpe--ta4-pump)