From 1ea86db763cf1007d94b0d411a0a7a6279d4ce71 Mon Sep 17 00:00:00 2001 From: Merith Date: Sun, 22 Jun 2025 12:44:17 -0700 Subject: [PATCH] Convert to magefile for validation Convert Makefile to Magefile Add json validations --- .../Buildables/Recipe_DS_AtomicCrafter.json | 1 - .../Recipe_DS_CentralStorageAdapter.json | 1 - .../Buildables/Recipe_DS_CraftingAdapter.json | 1 - .../Buildables/Recipe_DS_CraftingServer.json | 1 - .../Recipe_DS_CraftingTerminal.json | 1 - .../Recipe_DS_DoubleNetworkPlug.json | 1 - .../Buildables/Recipe_DS_DriveTerminal.json | 1 - .../Recipe_DS_FactoryConnectionAdapter.json | 1 - .../Recipe_DS_FluidConnectionAdapter.json | 1 - .../Buildables/Recipe_DS_NetworkCable.json | 1 - .../Recipe_DS_NetworkDistributor.json | 1 - .../Buildables/Recipe_DS_NetworkPlug.json | 1 - .../Buildables/Recipe_DS_NetworkPole.json | 1 - .../Recipe_DS_NetworkPowerAdapater.json | 1 - .../Buildables/Recipe_DS_ResourceAdapter.json | 1 - .../Buildables/Recipe_DS_ServerRack.json | 1 - .../Buildables/Recipe_DS_Server_1U.json | 1 - .../Buildables/Recipe_DS_Server_1UF.json | 1 - .../Buildables/Recipe_DS_Server_2U.json | 1 - .../Buildables/Recipe_DS_Server_2UF.json | 1 - .../Buildables/Recipe_DS_Server_2UG.json | 1 - .../Recipe_DS_StorageConnectionAdapter.json | 1 - .../Buildables/Recipe_DS_StorageTerminal.json | 1 - .../Recipe_DS_TrainCargoAdapter.json | 1 - .../Recipe_DS_UniversalAdapter.json | 1 - .../Buildables/Recipe_DS_UplinkSatellite.json | 1 - .../Recipe_DS_WirelessAccessPoint.json | 1 - .../Buildables/Recipe_DS_WirelessTower.json | 1 - .../Recipe_DS_Drive_10K_Fluid.json | Bin 2328 -> 2132 bytes .../Recipe_DS_Drive_120K_Fluid.json | Bin 2826 -> 2624 bytes .../Recipe_DS_Drive_120K_Gas.json | Bin 2802 -> 2612 bytes .../RecipePatches/Recipe_DS_Drive_16K.json | 3 +- .../RecipePatches/Recipe_DS_Drive_1K.json | 3 +- .../Recipe_DS_Drive_20K_Fluid.json | Bin 2370 -> 2174 bytes .../Recipe_DS_Drive_240K_Fluid.json | Bin 3052 -> 2850 bytes .../Recipe_DS_Drive_240K_Gas.json | Bin 3028 -> 2838 bytes .../RecipePatches/Recipe_DS_Drive_256.json | 3 +- .../RecipePatches/Recipe_DS_Drive_2K.json | 3 +- .../RecipePatches/Recipe_DS_Drive_32K.json | 3 +- .../Recipe_DS_Drive_40K_Fluid.json | Bin 2368 -> 2172 bytes .../Recipe_DS_Drive_40K_Gas.json | Bin 2348 -> 2164 bytes .../RecipePatches/Recipe_DS_Drive_4K.json | 3 +- .../RecipePatches/Recipe_DS_Drive_512.json | 3 +- .../Recipe_DS_Drive_60K_Fluid.json | Bin 2368 -> 2172 bytes .../Recipe_DS_Drive_60K_Gas.json | Bin 2344 -> 2160 bytes .../RecipePatches/Recipe_DS_Drive_64K.json | 3 +- .../RecipePatches/Recipe_DS_Drive_8K.json | 3 +- .../RecipePatches/Recipe_DS_Multitool.json | 3 +- .../Recipe_DS_NetworkCable_Item.json | 3 +- .../Recipe_DS_WirelessExtender.json | 3 +- .../Recipe_DS_WirelessTablet.json | 3 +- go.mod | 14 + go.sum | 17 ++ magefile.go | 256 ++++++++++++++++++ schema/CL_NameResolvedAsset.json | 9 + schema/CL_Recipe.json | 189 +++++++++++++ schema/Components/CL_ItemAmount.json | 23 ++ schema/Components/CL_NameResolvedAsset.json | 9 + 58 files changed, 530 insertions(+), 54 deletions(-) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 magefile.go create mode 100644 schema/CL_NameResolvedAsset.json create mode 100644 schema/CL_Recipe.json create mode 100644 schema/Components/CL_ItemAmount.json create mode 100644 schema/Components/CL_NameResolvedAsset.json diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_AtomicCrafter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_AtomicCrafter.json index d7a9a6b..3623131 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_AtomicCrafter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_AtomicCrafter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/AtomicCrafter/Recipe_DS_AtomicCrafter.Recipe_DS_AtomicCrafter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Atomic Crafter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_CentralStorageAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_CentralStorageAdapter.json index 56efdcc..6b678c5 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_CentralStorageAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_CentralStorageAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/CentralStorageAdapter/Recipe_DS_CentralStorageAdapter.Recipe_DS_CentralStorageAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Depot Uploader Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingAdapter.json index 01bddd7..6f980c4 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/CraftingAdapter/Recipe_DS_CraftingAdapter.Recipe_DS_CraftingAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Crafting Connection Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingServer.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingServer.json index 4c4fb7f..f4ea898 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingServer.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingServer.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/CraftingServer/Recipe_DS_CraftingServer.Recipe_DS_CraftingServer_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Crafting Server", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingTerminal.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingTerminal.json index c4b952a..83da95c 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingTerminal.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_CraftingTerminal.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Terminals/Crafting/Recipe_DS_CraftingTerminal.Recipe_DS_CraftingTerminal_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Crafting Terminal", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_DoubleNetworkPlug.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_DoubleNetworkPlug.json index 4c3db94..5712dc3 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_DoubleNetworkPlug.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_DoubleNetworkPlug.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/NetworkPlug/Recipe_DS_DoubleNetworkPlug.Recipe_DS_DoubleNetworkPlug_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Double Network Wall Outlet", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_DriveTerminal.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_DriveTerminal.json index f4b9f4b..fca31a5 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_DriveTerminal.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_DriveTerminal.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Terminals/Drive/Recipe_DS_DriveTerminal.Recipe_DS_DriveTerminal_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Drive Terminal", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_FactoryConnectionAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_FactoryConnectionAdapter.json index 53379cf..9d767ed 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_FactoryConnectionAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_FactoryConnectionAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/FactoryModule/Recipe_DS_FactoryConnectionAdapter.Recipe_DS_FactoryConnectionAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Factory Connection Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_FluidConnectionAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_FluidConnectionAdapter.json index 9851111..fc448df 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_FluidConnectionAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_FluidConnectionAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/ContainerModules/Normal/Recipe_DS_FluidConnectionAdapter.Recipe_DS_FluidConnectionAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Pipe Connection Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkCable.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkCable.json index abb1734..d790edd 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkCable.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkCable.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/NetworkCable/Recipe_DS_NetworkCable.Recipe_DS_NetworkCable_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Network Cable", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkDistributor.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkDistributor.json index e786d09..5ae9c53 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkDistributor.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkDistributor.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/NetworkDistributor/Recipe_DS_NetworkDistributor.Recipe_DS_NetworkDistributor_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Network Distributor", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPlug.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPlug.json index 0d52adf..3898934 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPlug.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPlug.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/NetworkPlug/Recipe_DS_NetworkPlug.Recipe_DS_NetworkPlug_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Network Wall Outlet", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPole.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPole.json index 8571870..2db330b 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPole.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPole.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/NetworkPole/Recipe_DS_NetworkPole.Recipe_DS_NetworkPole_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Network Pole", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPowerAdapater.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPowerAdapater.json index 999e0bc..a5bd514 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPowerAdapater.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_NetworkPowerAdapater.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/NetworkPowerAdapter/Recipe_DS_NetworkPowerAdapater.Recipe_DS_NetworkPowerAdapater_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Network Power Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_ResourceAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_ResourceAdapter.json index a0fbcf0..a3b610b 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_ResourceAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_ResourceAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/ResourceAdapter/Recipe_DS_ResourceAdapter.Recipe_DS_ResourceAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Resource Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_ServerRack.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_ServerRack.json index 08e51bb..de4a475 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_ServerRack.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_ServerRack.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/ServerRack/Recipe_DS_ServerRack.Recipe_DS_ServerRack_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Server Rack", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1U.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1U.json index 73963a0..1b1e7ac 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1U.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1U.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Server/1U/Recipe_DS_Server_1U.Recipe_DS_Server_1U_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Server 1U (Item)", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1UF.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1UF.json index 4b195c9..916cd40 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1UF.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_1UF.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Server/1UF/Recipe_DS_Server_1UF.Recipe_DS_Server_1UF_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Server 1U (Fluid)", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2U.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2U.json index 250dff0..5d27490 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2U.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2U.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Server/2U/Recipe_DS_Server_2U.Recipe_DS_Server_2U_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Server 2U (Item)", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UF.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UF.json index 3c5bd69..d6e07c4 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UF.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UF.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Server/2UF/Recipe_DS_Server_2UF.Recipe_DS_Server_2UF_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Server 2U (Fluid)", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UG.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UG.json index 4faf894..c89630c 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UG.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_Server_2UG.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Server/2UG/Recipe_DS_Server_2UG.Recipe_DS_Server_2UG_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Server 2U (Gas)", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageConnectionAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageConnectionAdapter.json index c16da9e..f4c993a 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageConnectionAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageConnectionAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/ContainerModules/Normal/Recipe_DS_StorageConnectionAdapter.Recipe_DS_StorageConnectionAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Storage Connection Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageTerminal.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageTerminal.json index 3ac70c4..083ec81 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageTerminal.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_StorageTerminal.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Terminals/Storage/Recipe_DS_StorageTerminal.Recipe_DS_StorageTerminal_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Storage Terminal", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_TrainCargoAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_TrainCargoAdapter.json index e17e86e..59e9331 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_TrainCargoAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_TrainCargoAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/TrainCargoAdapter/Recipe_DS_TrainCargoAdapter.Recipe_DS_TrainCargoAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Train Cargo Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_UniversalAdapter.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_UniversalAdapter.json index 311d1f9..40d7fb5 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_UniversalAdapter.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_UniversalAdapter.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/Adapters/UniversalAdapter/Recipe_DS_UniversalAdapter.Recipe_DS_UniversalAdapter_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Universal Adapter", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_UplinkSatellite.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_UplinkSatellite.json index bdef7e4..36d834d 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_UplinkSatellite.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_UplinkSatellite.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/UplinkSatellite/Recipe_DS_UplinkSatellite.Recipe_DS_UplinkSatellite_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Wireless Ground Antenna", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessAccessPoint.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessAccessPoint.json index 45ee68e..047eac7 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessAccessPoint.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessAccessPoint.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/WirelessAccessPoint/Recipe_DS_WirelessAccessPoint.Recipe_DS_WirelessAccessPoint_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Wireless Access Point", diff --git a/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessTower.json b/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessTower.json index 0b2a014..0e9146a 100644 --- a/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessTower.json +++ b/ContentLib/RecipePatches/Buildables/Recipe_DS_WirelessTower.json @@ -1,4 +1,3 @@ -//DigitalStorage/Buildables/WirelessTower/Recipe_DS_WirelessTower.Recipe_DS_WirelessTower_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Wireless Tower", diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_10K_Fluid.json b/ContentLib/RecipePatches/Recipe_DS_Drive_10K_Fluid.json index 68f1b6829880a9402dd70b487baad21fae13d1f4..6ca75d86cfb6fffc3e7dab792ceabba72190819f 100644 GIT binary patch delta 45 zcmbOsbVY#q|G(@l;;N2RSM*%FvK$$G8iy;Lvg(j}Ju|DQgCK7$KGCPO+9moOwU3oJFAUmBQ6(}17B#VI}r9iP{FdL+! z2&ldc%5wwiDh2XW7~&ZW8H^YV7`&nSl7XTH45^dfGm1_=#VW$92R02&ls%ronSqyq XYjPp0@J5jd9FyzVj5gok$Y2Bjv&|)B diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_120K_Gas.json b/ContentLib/RecipePatches/Recipe_DS_Drive_120K_Gas.json index 482a8d897b8a6f45172f1ecf8bdde438d381d9ad..1ca9f73d47bbf8d8ef1f1f8e5db168a9ea29c0fc 100644 GIT binary patch delta 45 zcmew)x*lWHJ;0=}d-HhN8)Z9EzK}I5QXlcpVOK delta 151 zcmdlY@<}xL|37^OeFhhXOontIE@4Py$YBTu()kQUKz2GqDo{2ENEQP{N`Yd@U^Ylc z5m0>@l;;jqTg(v8V8~#^V8GxF)sqZVQNWNoc`d6duO8SGBoX#_24@Cd2Cm74%)%Q* QS~w;bu^DYX!;!%V01+f1bN~PV diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_16K.json b/ContentLib/RecipePatches/Recipe_DS_Drive_16K.json index 1847539..53818ca 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_16K.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_16K.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/16K/Recipe_DS_Drive_16K.Recipe_DS_Drive_16K_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (16K)", @@ -35,7 +34,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_16K_C" ], - "ManualManufacturingDuration": 45.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_1K.json b/ContentLib/RecipePatches/Recipe_DS_Drive_1K.json index 6e0bfd3..9d17c03 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_1K.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_1K.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/1K/Recipe_DS_Drive_1K.Recipe_DS_Drive_1K_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (1K)", @@ -27,7 +26,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_1K_C" ], - "ManualManufacturingDuration": 45.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_20K_Fluid.json b/ContentLib/RecipePatches/Recipe_DS_Drive_20K_Fluid.json index 921aa725d863760c22a4b382788fc53b040b10b4..ab8c256e623f24ca1ee7986f7f1e6ae09f6f0716 100644 GIT binary patch delta 49 zcmX>k^iP2K|G((8HyN`7_1l+7z{QaWN%~y E0LF0-B>(^b delta 153 zcmew-a7ZZi|37^OeFhhXOontIE@4Py$YBTu()kQUKz2GqDo{2ENEQP{N`Yd@U^Ylc z5m0>@l;;N2RSM*%FvK$$F&Hp-Lv*lWHJ;0=}d-HhN8*YoQj)UxH1?4Xvz)# delta 163 zcmZ1^_C`GY|37^OeFhhXOontIE@4Py$YBTu()kQUKz2GqDo{2ENEQP{N`Yd@U^Ylc z5m0>@l;;N2RSM*%FvK$$F_*lWHJ;0=}d-Hh9U+f1}g@I&4FCai~xRL B4P^iT delta 181 zcmbOxc167Y|37^OeFhhXOontIE@4Py$YBTu()kQUKz2GqDo{2ENEQP{N`Yd@U^Ylc z5m0>@l;;jqTg(v8V8md;V8GxF)sqZVQ2b`^+W=KPc{8gj gXFP*511|#?L-pi^9KsvLQaC4vu^Vk($C<$h0K|+YQvd(} diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_256.json b/ContentLib/RecipePatches/Recipe_DS_Drive_256.json index 43f40e9..bac804d 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_256.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_256.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/256/Recipe_DS_Drive_256.Recipe_DS_Drive_256_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (256)", @@ -27,7 +26,7 @@ "UnlockedBy": [ "Schem_DS_T3_2_C" ], - "ManualManufacturingDuration": 45.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_2K.json b/ContentLib/RecipePatches/Recipe_DS_Drive_2K.json index a12cd4d..3bcd678 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_2K.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_2K.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/2K/Recipe_DS_Drive_2K.Recipe_DS_Drive_2K_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (2K)", @@ -27,7 +26,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_2K_C" ], - "ManualManufacturingDuration": 45.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_32K.json b/ContentLib/RecipePatches/Recipe_DS_Drive_32K.json index 68d56f6..fbcd043 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_32K.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_32K.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/32K/Recipe_DS_Drive_32K.Recipe_DS_Drive_32K_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (32K)", @@ -35,7 +34,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_32K_C" ], - "ManualManufacturingDuration": 60.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_40K_Fluid.json b/ContentLib/RecipePatches/Recipe_DS_Drive_40K_Fluid.json index bbd383493e6da2b4d091ab2c4218e5a871402a81..495561b00152242cac4ae22fd6d51ac5c25b76a2 100644 GIT binary patch delta 45 zcmX>g^hbdC|G(@l;;N2RSM*%FvK&MFc>g+Lv(8Hy&aWmDXIggt{10E}A? AZ2$lO delta 163 zcmew&utq5H|37^OeFhhXOontIE@4Py$YBTu()kQUKz2GqDo{2ENEQP{N`Yd@U^Ylc z5m0>@l;;jqTg(v8V8UR);0@K043sZmNS*wWQC1ituLm{>Nt_?1&zXUjfs3JfG9#Pt SMzKR|lXtNgZRTOmU<3fJi6g53 diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_4K.json b/ContentLib/RecipePatches/Recipe_DS_Drive_4K.json index 102f6ca..08a43ff 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_4K.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_4K.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/4K/Recipe_DS_Drive_4K.Recipe_DS_Drive_4K_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (4K)", @@ -27,7 +26,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_4K_C" ], - "ManualManufacturingDuration": 45.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_512.json b/ContentLib/RecipePatches/Recipe_DS_Drive_512.json index 9781709..991013a 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_512.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_512.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/512/Recipe_DS_Drive_512.Recipe_DS_Drive_512_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (512)", @@ -27,7 +26,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_512_C" ], - "ManualManufacturingDuration": 45.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_60K_Fluid.json b/ContentLib/RecipePatches/Recipe_DS_Drive_60K_Fluid.json index 8507a920ae8cca0731cffc975f2d7ce26bb85c47..b7f6ec2b8480f7aa002714856f96d86cadb2e355 100644 GIT binary patch delta 45 zcmX>g^hbdC|G(@l;;N2RSM*%FvK&MF&Hp-Lv^g)2>|G$lUF0l#wGL$mpFqAN4G86#mOomj3qRIc+12=zQw_pSSH^&YJ delta 151 zcmew$utF&D|37^OeFhhXOontIE@4Py$YBTu()kQUKz2GqDo{2ENEQP{N`Yd@U^Ylc z5m0>@l;;jqTg(v8V8&p;;0@K043sZmNS*wdS(#T4YzC4DXFP*511|#?L-pj1?7|zx Q_OVUg#$vRYgFS;004={FEC2ui diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_64K.json b/ContentLib/RecipePatches/Recipe_DS_Drive_64K.json index fa2af03..fc7fa12 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_64K.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_64K.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/64K/Recipe_DS_Drive_64K.Recipe_DS_Drive_64K_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (64K)", @@ -39,7 +38,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_64K_C" ], - "ManualManufacturingDuration": 60.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Drive_8K.json b/ContentLib/RecipePatches/Recipe_DS_Drive_8K.json index 1f675ba..9a98ff3 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Drive_8K.json +++ b/ContentLib/RecipePatches/Recipe_DS_Drive_8K.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/Drives/8K/Recipe_DS_Drive_8K.Recipe_DS_Drive_8K_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "DS Drive (8K)", @@ -31,7 +30,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Drives_8K_C" ], - "ManualManufacturingDuration": 45.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_Multitool.json b/ContentLib/RecipePatches/Recipe_DS_Multitool.json index f51a020..2f2ae28 100644 --- a/ContentLib/RecipePatches/Recipe_DS_Multitool.json +++ b/ContentLib/RecipePatches/Recipe_DS_Multitool.json @@ -1,4 +1,3 @@ -//DigitalStorage/Equipment/Multitool/Recipe_DS_Multitool.Recipe_DS_Multitool_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Multitool", @@ -31,7 +30,7 @@ "UnlockedBy": [ "Schematic_DS_Mam_Adapters_Universal_C" ], - "ManualManufacturingDuration": 1.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_NetworkCable_Item.json b/ContentLib/RecipePatches/Recipe_DS_NetworkCable_Item.json index 0480686..a9bbb7e 100644 --- a/ContentLib/RecipePatches/Recipe_DS_NetworkCable_Item.json +++ b/ContentLib/RecipePatches/Recipe_DS_NetworkCable_Item.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/NetworkCable/Recipe_DS_NetworkCable_Item.Recipe_DS_NetworkCable_Item_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Network Cable", @@ -27,7 +26,7 @@ "UnlockedBy": [ "Schem_DS_T3_1_C" ], - "ManualManufacturingDuration": 5.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_WirelessExtender.json b/ContentLib/RecipePatches/Recipe_DS_WirelessExtender.json index f030a65..7f09dd3 100644 --- a/ContentLib/RecipePatches/Recipe_DS_WirelessExtender.json +++ b/ContentLib/RecipePatches/Recipe_DS_WirelessExtender.json @@ -1,4 +1,3 @@ -//DigitalStorage/Resources/WifiExtender/Recipe_DS_WirelessExtender.Recipe_DS_WirelessExtender_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Wireless Range Extender", @@ -31,7 +30,7 @@ "UnlockedBy": [ "Schem_DS_T6_2_C" ], - "ManualManufacturingDuration": 1.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/ContentLib/RecipePatches/Recipe_DS_WirelessTablet.json b/ContentLib/RecipePatches/Recipe_DS_WirelessTablet.json index 0a64030..f2bbc92 100644 --- a/ContentLib/RecipePatches/Recipe_DS_WirelessTablet.json +++ b/ContentLib/RecipePatches/Recipe_DS_WirelessTablet.json @@ -1,4 +1,3 @@ -//DigitalStorage/Equipment/WirelessTablet/Recipe_DS_WirelessTablet.Recipe_DS_WirelessTablet_C { "$schema": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/refs/heads/main/JsonSchemas/CL_Recipe.json", "Name": "Wireless Tablet", @@ -31,7 +30,7 @@ "UnlockedBy": [ "Schem_DS_T6_2_C" ], - "ManualManufacturingDuration": 1.0, + "ManualManufacturingMultiplier": 0.0, "VariablePowerConsumptionConstant": 0.0, "VariablePowerConsumptionFactor": 1.0, "ClearIngredients": true, diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e771035 --- /dev/null +++ b/go.mod @@ -0,0 +1,14 @@ +module local + +go 1.24.3 + +require ( + github.com/magefile/mage v1.15.0 + github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 + github.com/xeipuuv/gojsonschema v1.2.0 +) + +require ( + github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..6fc5d5e --- /dev/null +++ b/go.sum @@ -0,0 +1,17 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= diff --git a/magefile.go b/magefile.go new file mode 100644 index 0000000..3992d38 --- /dev/null +++ b/magefile.go @@ -0,0 +1,256 @@ +//go:build mage +// +build mage + +package main + +import ( + "archive/zip" + "bytes" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "os" + "path/filepath" + "strings" + "unicode/utf8" + + "github.com/magefile/mage/mg" + "github.com/magefile/mage/sh" + "github.com/santhosh-tekuri/jsonschema/v5" +) + +const ( + zipName = "DigitalStorageTweaks.zip" + contentDir = "./ContentLib" + pluginFile = "./DigitalStorageTweaks.uplugin" + schemaBaseURL = "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/main/JsonSchemas/" + schemaDir = "./schema" +) + +var binaryExtensions = map[string]bool{ + ".png": true, ".jpg": true, ".jpeg": true, ".bmp": true, ".gif": true, + ".dds": true, ".tga": true, ".psd": true, ".fbx": true, ".uasset": true, + ".umap": true, +} + +var Default = Build + +func Build() { + mg.SerialDeps(Validate, Package) +} + +func Package() error { + fmt.Println("Packaging files...") + for _, dir := range []string{"Windows", "WindowsServer", "LinuxServer"} { + if err := os.MkdirAll(dir, 0755); err != nil { + return fmt.Errorf("creating %s: %w", dir, err) + } + if err := sh.Run("cp", "-r", contentDir, pluginFile, dir+"/"); err != nil { + return fmt.Errorf("copying to %s: %w", dir, err) + } + } + if err := createZip(zipName, "Windows", "WindowsServer", "LinuxServer"); err != nil { + return fmt.Errorf("creating zip: %w", err) + } + return Clean("Windows", "WindowsServer", "LinuxServer") +} + +func Validate() error { + fmt.Println("Validating files...") + compiler := jsonschema.NewCompiler() + compiler.LoadURL = func(url string) (io.ReadCloser, error) { + return nil, fmt.Errorf("remote schema loading disabled: %s", url) + } + + if err := filepath.Walk(schemaDir, func(path string, info os.FileInfo, err error) error { + if err != nil || info.IsDir() || filepath.Ext(path) != ".json" { + return err + } + relPath, err := filepath.Rel(schemaDir, path) + if err != nil { + return err + } + id := schemaBaseURL + filepath.ToSlash(relPath) + data, err := ioutil.ReadFile(path) + if err != nil { + return err + } + return compiler.AddResource(id, bytes.NewReader(data)) + }); err != nil { + return fmt.Errorf("failed to load schemas: %w", err) + } + + schema, err := compiler.Compile(schemaBaseURL + "CL_Recipe.json") + if err != nil { + return fmt.Errorf("invalid main schema: %w", err) + } + + var failed []string + paths := []string{pluginFile} + _ = filepath.Walk(contentDir, func(path string, info os.FileInfo, err error) error { + if err == nil && !info.IsDir() { + paths = append(paths, path) + } + return nil + }) + + for _, path := range paths { + if err := validateFile(path, schema); err != nil { + failed = append(failed, fmt.Sprintf("%s: %v", path, err)) + } + } + + if len(failed) > 0 { + fmt.Println("Validation errors:") + for _, msg := range failed { + fmt.Println(" -", msg) + } + return fmt.Errorf("%d file(s) failed validation", len(failed)) + } + + fmt.Println("All files validated successfully.") + return nil +} + +func validateFile(path string, schema *jsonschema.Schema) error { + if binaryExtensions[filepath.Ext(path)] { + return nil + } + if filepath.Ext(path) == ".json" { + return validateJSON(path, schema) + } + return validateEncoding(path) +} + +func validateJSON(path string, schema *jsonschema.Schema) error { + data, err := ioutil.ReadFile(path) + if err != nil { + return err + } + data = sanitizeJSONBytes(data) + + var lines [][]byte + for _, line := range bytes.Split(data, []byte("\n")) { + trim := bytes.TrimSpace(line) + if !bytes.HasPrefix(trim, []byte("//")) && len(trim) > 0 { + lines = append(lines, line) + } + } + clean := bytes.Join(lines, []byte("\n")) + + var v interface{} + if err := json.Unmarshal(clean, &v); err != nil { + return err + } + return schema.Validate(v) +} + +func sanitizeJSONBytes(data []byte) []byte { + data = bytes.TrimPrefix(data, []byte{0xEF, 0xBB, 0xBF}) + var out bytes.Buffer + for len(data) > 0 { + r, size := utf8.DecodeRune(data) + if r == utf8.RuneError && size == 1 || r == '\x00' { + data = data[1:] + continue + } + out.WriteRune(r) + data = data[size:] + } + return out.Bytes() +} + +func validateEncoding(path string) error { + data, err := ioutil.ReadFile(path) + if err != nil { + return err + } + for i := 0; i < len(data); { + if data[i] > 127 { + // DO NOT declare "size", it is unused and will cause a compiler error + r, _ := utf8.DecodeRune(data[i:]) + if r == utf8.RuneError { + return fmt.Errorf("invalid UTF-8 sequence at position %d", i) + } + return fmt.Errorf("non-ASCII character %U at position %d", r, i) + } + i++ + } + return nil +} + +func Clean(list ...string) error { + fmt.Println("Cleaning up...") + for _, f := range list { + if err := os.RemoveAll(f); err != nil { + return fmt.Errorf("failed to remove %s: %w", f, err) + } + } + return nil +} + +func createZip(zipPath string, dirs ...string) error { + zipFile, err := os.Create(zipPath) + if err != nil { + return fmt.Errorf("creating zip file: %w", err) + } + defer zipFile.Close() + zipWriter := zip.NewWriter(zipFile) + defer zipWriter.Close() + for _, dir := range dirs { + if err := addDirToZip(zipWriter, dir); err != nil { + return fmt.Errorf("adding %s to zip: %w", dir, err) + } + } + return nil +} + +func addDirToZip(zipWriter *zip.Writer, dirPath string) error { + return filepath.Walk(dirPath, func(filePath string, info os.FileInfo, err error) error { + if err != nil { + return err + } + relPath, err := filepath.Rel(dirPath, filePath) + if err != nil { + return err + } + zipPath := filepath.Join(filepath.Base(dirPath), relPath) + header, err := zip.FileInfoHeader(info) + if err != nil { + return err + } + header.Name = filepath.ToSlash(zipPath) + header.Method = zip.Deflate + if info.IsDir() { + header.Name += "/" + _, err := zipWriter.CreateHeader(header) + return err + } + file, err := os.Open(filePath) + if err != nil { + return err + } + defer file.Close() + writer, err := zipWriter.CreateHeader(header) + if err != nil { + return err + } + if binaryExtensions[strings.ToLower(filepath.Ext(filePath))] { + _, err = io.Copy(writer, file) + return err + } + content, err := ioutil.ReadAll(file) + if err != nil { + return err + } + content = convertToDOSLineEndings(content) + _, err = writer.Write(content) + return err + }) +} + +func convertToDOSLineEndings(content []byte) []byte { + normalized := bytes.ReplaceAll(content, []byte("\r\n"), []byte("\n")) + return bytes.ReplaceAll(normalized, []byte("\n"), []byte("\r\n")) +} diff --git a/schema/CL_NameResolvedAsset.json b/schema/CL_NameResolvedAsset.json new file mode 100644 index 0000000..06fbe42 --- /dev/null +++ b/schema/CL_NameResolvedAsset.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/main/JsonSchemas/CL_NameResolvedAsset.json", + "title": "ContentLib Name Resolved Asset", + "description": "An asset that can be specified either with a full path, or a shortened name for ContentLib to resolve. See more info here: https://docs-dev.ficsit.app/contentlib/latest/BackgroundInfo/AutomaticNameResolving.html", + "$comment": "This file does not represent ContentLib asset type! It's a resource used by other JSON Schemas. Please read https://docs-dev.ficsit.app/contentlib/latest/BackgroundInfo/AutomaticNameResolving.html", + "type": "string", + "minLength": 1 +} diff --git a/schema/CL_Recipe.json b/schema/CL_Recipe.json new file mode 100644 index 0000000..2c9656d --- /dev/null +++ b/schema/CL_Recipe.json @@ -0,0 +1,189 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/main/JsonSchemas/CL_Recipe.json", + "title": "ContentLib Recipe", + "description": "ContentLib Recipe struct definitions can be made from this JSON, and when converted to JSON, will follow this form.", + "$comment": "This is NOT a copy-paste template! Check the docs to see how to use this! https://docs.ficsit.app/contentlib/latest/index.html", + "type": "object", + "additionalProperties": false, + "properties": { + "Name": { + "type": "string", + "description": "Override for the recipe's name, which is displayed inside the manual crafting bench, build gun, or any machines you set it to be used in. By default, recipes take the name of their first product item." + }, + "Ingredients": { + "type": "array", + "description": "ItemAmounts which form the ingredients. Be sure to not exceed an item's stack size, and remember that 1000 fluid units displays as 1 Liter ingame. See 'ClearIngredients' to append instead of replace.", + "items": { + "$ref": "./Components/CL_ItemAmount.json" + }, + "examples": [ + [ + { + "Item": "Desc_CopperIngot", + "Amount": 1 + }, + { + "Item": "Desc_IronIngot", + "Amount": 1 + } + ] + ] + }, + "Products": { + "type": "array", + "description": "ItemAmounts which form the recipe outputs. Be sure to not exceed an item's stack size, and remember that 1000 fluid units displays as 1 Liter ingame. Manual recipes should only have 1 product. See 'ClearProducts' to append instead of replace.", + "items": { + "$ref": "./Components/CL_ItemAmount.json" + }, + "examples": [ + [ + { + "Item": "Desc_Biofuel", + "Amount": 10 + } + ] + ] + }, + "ProducedIn": { + "type": "array", + "description": "Automatic name resolved asset. Machines/builders which this recipe can be used in. The examples are not an exhaustive list. Use 'manual' for all manual workbenches; this is a workaround and will be fixed in the future. See 'ClearBuilders' to append instead of replace.", + "uniqueItems": true, + "items": { + "$ref": "./Components/CL_NameResolvedAsset.json", + "examples": [ + "manual", + "Build_SmelterMk1", + "Build_ConstructorMk1", + "Build_AssemblerMk1", + "Build_FoundryMk1", + "Build_ManufacturerMk1", + "Build_OilRefinery", + "Build_Packager", + "Build_Blender", + "Build_HadronCollider", + "Build_Converter", + "Build_QuantumEncoder", + "BP_BuildGun" + ], + "allOf": [ + { + "$comment": "The `manual` workaround should be used instead of these (see the docs https://docs.ficsit.app/contentlib/latest/Tutorials/CreateRecipe.html).", + "if": { + "anyOf": [ + { + "const": "FGWorkBench" + }, + { + "const": "Build_Workshop" + }, + { + "const": "Build_WorkBench" + }, + { + "const": "Build_WorkBenchIntegrated" + } + ] + }, + "then": { + "const": "manual" + } + } + ] + } + }, + "OverrideCategory": { + "type": "string", + "description": "By default, recipes take on the category of their first product item. Specifying something here causes it to be used as the category instead. Either a base-game category, or a string which ContentLib will automatically turn into a category for you.", + "examples": [ + "Cat_Other", + "MyCustomAutoCreatedCategory" + ] + }, + "ManufacturingDuration": { + "type": "number", + "description": "The time it takes for a machine to process this recipe in seconds. Recipe energy consumption is usually this times the machine's power usage." + }, + "ManualManufacturingMultiplier": { + "type": "number", + "description": "If you want to use the same recipe for machines and the craft bench, this defines how much longer the crafting of this recipe should take in the craft bench. With the multiplier set to the default of 0, the number of clicks to craft is the number of seconds it takes to craft divided by two.", + "examples": [ + 0.0 + ] + }, + "UnlockedBy": { + "type": "array", + "description": "Automatic name resolved asset. Schematics to add this recipe to. Alternative way of tying recipes to schematics; the standard way is to use the schematic's 'Recipes' field. This is useful if you don't want to also make a patch to add your recipe to a base-game schematic. Something must unlock the recipe, else it will never be accessible in-game. If you want it to be unlocked by default, use Schematic_StartingRecipes.", + "items": { + "$ref": "./Components/CL_NameResolvedAsset.json" + }, + "examples": [ + [ + "Schematic_StartingRecipes" + ], + [ + "Schematic_1-1" + ] + ] + }, + "VariablePowerConsumptionFactor": { + "type": "number", + "description": "Only works in variable consumption machines (the Particle Accelerator in base game). Added to the VariablePowerConsumptionFactor to get the 'maximum' power consumption the recipe can scale up to over its cycle." + }, + "VariablePowerConsumptionConstant": { + "type": "number", + "description": "Only works in variable consumption machines (the Particle Accelerator in base game). The 'minimum' power consumption the recipe can scale down to over its cycle." + }, + "ManufacturingMenuPriority": { + "type": "number", + "description": "Controls the order that recipes appear within their category. Lower values means earlier in the menu. Negatives and decimals allowed." + }, + "OverrideName": { + "type": "boolean", + "description": "For patches, should the Recipe this is used on have its 'use override name' flag enabled? Default is true when 'Name' exists, false when not. This can be used to ex. revert a recipe's displayed name to that of its first product, instead of the custom name that was specified for it." + }, + "ClearIngredients": { + "type": "boolean", + "description": "For patches, should the Recipe this is used on have its existing Ingredients array cleared before adding to it? Default is true when 'Ingredients' exists, false when not." + }, + "ClearProducts": { + "type": "boolean", + "description": "For patches, should the Recipe this is used on have its existing Products array cleared before adding to it? Default is true when 'Products' exists, false when not." + }, + "ClearBuilders": { + "type": "boolean", + "description": "For patches, should the Recipe this is used on have its existing ProducedIn array cleared before adding to it? Default is true when 'ProducedIn' exists, false when not." + } + }, + "allOf": [ + { + "$comment": "Manual recipes should only have one product", + "if": { + "properties": { + "ProducedIn": { + "contains": { + "const": "manual" + } + } + } + }, + "then": { + "properties": { + "Products": { + "maxItems": 1 + } + } + } + } + ], + "patternProperties": { + "schema": { + "$comment": "Allow the $schema line in files", + "type": "string" + }, + "comment": { + "$comment": "Allow the $comment line in files", + "type": "string" + } + } +} \ No newline at end of file diff --git a/schema/Components/CL_ItemAmount.json b/schema/Components/CL_ItemAmount.json new file mode 100644 index 0000000..ab69cb5 --- /dev/null +++ b/schema/Components/CL_ItemAmount.json @@ -0,0 +1,23 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/main/JsonSchemas/CL_ItemAmount.json", + "title": "Item Amount Structure", + "description": "Respresents a quantity of an item", + "$comment": "This file does not represent ContentLib asset type! It's a resource used by other JSON Schemas.", + "type": "object", + "additionalProperties": false, + "required": [ + "Item", + "Amount" + ], + "properties": { + "Item": { + "$ref": "./CL_NameResolvedAsset.json" + }, + "Amount": { + "type": "integer", + "minimum": 0, + "description": "Integer specifying the quantity of item(s). Remember that remember that 1000 fluid units displays as 1 Liter ingame." + } + } +} \ No newline at end of file diff --git a/schema/Components/CL_NameResolvedAsset.json b/schema/Components/CL_NameResolvedAsset.json new file mode 100644 index 0000000..06fbe42 --- /dev/null +++ b/schema/Components/CL_NameResolvedAsset.json @@ -0,0 +1,9 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://raw.githubusercontent.com/budak7273/ContentLib_Documentation/main/JsonSchemas/CL_NameResolvedAsset.json", + "title": "ContentLib Name Resolved Asset", + "description": "An asset that can be specified either with a full path, or a shortened name for ContentLib to resolve. See more info here: https://docs-dev.ficsit.app/contentlib/latest/BackgroundInfo/AutomaticNameResolving.html", + "$comment": "This file does not represent ContentLib asset type! It's a resource used by other JSON Schemas. Please read https://docs-dev.ficsit.app/contentlib/latest/BackgroundInfo/AutomaticNameResolving.html", + "type": "string", + "minLength": 1 +}