From de035e9d2eb67e00415ad01212b07daec9b116b9 Mon Sep 17 00:00:00 2001 From: Ponali Date: Sat, 14 Jun 2025 17:48:27 +0200 Subject: [PATCH] Reapply "Nonfunctional virtual component support" This reverts commit bc06ec457d0de77256a9fee5918d8a41b1115683. --- halyde/core/datatools.lua | 4 +- halyde/lib/component.lua | 85 ++++++++++++++++++++++++++++++++++----- init.lua | 4 +- 3 files changed, 81 insertions(+), 12 deletions(-) diff --git a/halyde/core/datatools.lua b/halyde/core/datatools.lua index e56d591..b7b80e5 100644 --- a/halyde/core/datatools.lua +++ b/halyde/core/datatools.lua @@ -12,8 +12,8 @@ local conversionTables = { } } -function table.find(table, item) - for k, v in pairs(table) do +function table.find(tab, item) + for k, v in pairs(tab) do if v == item then return k end diff --git a/halyde/lib/component.lua b/halyde/lib/component.lua index 54b5058..4d25161 100644 --- a/halyde/lib/component.lua +++ b/halyde/lib/component.lua @@ -1,15 +1,82 @@ -local componentlib +local compLib +local LLcomponent if table.copy then - componentlib = table.copy(component) + compLib = table.copy(component) + LLcomponent = table.copy(component) else - componentlib = {} + compLib = {} + LLcomponent = component end -function componentlib.get(address) +local ocelot = LLcomponent.proxy(LLcomponent.list("ocelot")()) +ocelot.log("loaded") + +_G.componentlib = {["additions"] = {}, ["removals"] = {}} +compLib.virtual = {} + +function compLib.virtual.add(address, componentType, proxy) checkArg(1, address, "string") - assert(#address >= 3, "abbreviated address must be at least 3 characters long") - local components = component.list() - for currentAddress, name in pairs(components) do + checkArg(2, componentType, "string") + checkArg(3, proxy, "table") + componentlib.additions[address] = {["componentType"] = componentType, ["proxy"] = proxy} + if componentlib.removals[address] then + componentlib.removals[address] = nil + end +end + +function compLib.virtual.remove(address) + checkArg(1, address, "string") + if componentlib.additions[address] then + componentlib.additions[address] = nil + else + table.insert(componentlib.removals, address) + end +end + +function compLib.list(componentType) + checkArg(1, componentType, "string", "nil") + local componentList = table.copy(LLcomponent.list(componentType)) + for address, dataTable in pairs(componentlib.additions) do + if dataTable.componentType == componentType or not componentType then + componentList[address] = dataTable.componentType + end + end + for _, address in pairs(componentlib.removals) do + componentList[address] = nil + end + local i, value + setmetatable(componentList, {__call = function(self) + i, value = next(self, i) + return i, value + end}) + return componentList +end + +function compLib.proxy(address) + if componentlib.additions[address] then + ocelot.log("vcomponent") + return componentlib.additions[address].proxy + else + return LLcomponent.proxy(address) + end +end + +function compLib.invoke(address, funcName, ...) + ocelot.log("Invoking " .. funcName .. " from " .. address) + if componentlib.additions[address] then + ocelot.log("vcomponent") + return componentlib.additions[address].proxy[funcName](...) + else + return LLcomponent.invoke(address, funcName, ...) + end +end + +function compLib.get(address) + checkArg(1, address, "string") + if #address < 3 then + return nil, "abbreviated address must be at least 3 characters long" + end + for currentAddress, name in compLib.list() do if currentAddress:find("^" .. address) then return(currentAddress) end @@ -17,6 +84,6 @@ function componentlib.get(address) return nil, "full address not found" end -componentlib.invoke = component.invoke +compLib.invoke = component.invoke -- trust me, this is needed -return componentlib +return compLib diff --git a/init.lua b/init.lua index 0e623ad..93e15e1 100644 --- a/init.lua +++ b/init.lua @@ -25,7 +25,9 @@ gpu.setBackground(0x000000) gpu.fill(1, 1, resx, resy, " ") local result, reason = xpcall(loadthething, handleError) if not result then - local computer = import("computer") or computer + if import then + local computer = import("computer") + end gpu.setBackground(0x000000) gpu.fill(1, 1, resx, resy, " ") gpu.setBackground(0x800000)