mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
161 lines
4.6 KiB
Lua
161 lines
4.6 KiB
Lua
--[[
|
|
Adds various functions used to ensure compatibly between version including some polyfills
|
|
]]
|
|
|
|
--- @diagnostic disable: deprecated
|
|
|
|
--- @class LibCompat
|
|
local compat = {}
|
|
|
|
--- @alias VersionTable { [1]: number, [2]: number, [3]: number }
|
|
|
|
--- Concert a version string into a version table
|
|
--- @param version string
|
|
--- @return VersionTable
|
|
local function version_to_table(version)
|
|
local index = 0
|
|
local rtn = { 0, 0, 0 }
|
|
for part in version:gmatch("%d+") do
|
|
index = index + 1
|
|
rtn[index] = tonumber(part)
|
|
end
|
|
return rtn
|
|
end
|
|
|
|
--- The current version of factorio, the earliest supported is 0.17.69
|
|
local current_version_str = "0.17.69"
|
|
local current_version = version_to_table(current_version_str)
|
|
do
|
|
local success, base_version = pcall(function()
|
|
return script.active_mods.base
|
|
end)
|
|
if success then
|
|
current_version_str = base_version
|
|
current_version = version_to_table(current_version_str)
|
|
end
|
|
end
|
|
|
|
--- Raise an error because the current version is unsupported
|
|
--- @return any
|
|
local function unsupported_version()
|
|
error("Unsupported version: " .. current_version_str, 3)
|
|
end
|
|
|
|
--- Returns true if the current version is equal to the provided version
|
|
--- @param version string Version to compare against
|
|
--- @return boolean # True if versions are equal
|
|
function compat.version_eq(version)
|
|
local version_tbl = version_to_table(version)
|
|
for i = 1, 3 do
|
|
if version_tbl[i] ~= current_version[i] then
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
--- Returns true if the current version is greater than or equal to the the provided version
|
|
--- @param version string Version to compare against
|
|
--- @return boolean # True if the version is greater or equal to provided
|
|
function compat.version_ge(version)
|
|
local version_tbl = version_to_table(version)
|
|
for i = 1, 3 do
|
|
if version_tbl[i] > current_version[i] then
|
|
return false
|
|
elseif version_tbl[i] < current_version[i] then
|
|
return true
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
--- Returns true if the current version is less than or equal to the the provided version
|
|
--- @param version string Version to compare against
|
|
--- @return boolean # True if the version is less or equal to provided
|
|
function compat.version_le(version)
|
|
local version_tbl = version_to_table(version)
|
|
for i = 1, 3 do
|
|
if version_tbl[i] < current_version[i] then
|
|
return false
|
|
elseif version_tbl[i] > current_version[i] then
|
|
return true
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
--- The major versions of factorio we support
|
|
local major_v2 = compat.version_ge("2.0.0")
|
|
local major_v1_1 = not major_v2 and compat.version_ge("1.1.0")
|
|
-- local major_v1 = not major_v1_1 and compat.version_ge("1.0.0")
|
|
|
|
--- Returns the table reference used to store script data
|
|
--- @return table script_data
|
|
function compat.script_data()
|
|
if major_v1_1 then
|
|
--- @diagnostic disable-next-line
|
|
return global
|
|
elseif major_v2 then
|
|
return storage
|
|
end
|
|
return unsupported_version()
|
|
end
|
|
|
|
--- Returns the table reference used to store prototypes
|
|
--- @param category string Category of prototype to access, eg "item", "fluid", "recipe"
|
|
--- @return table # Table of prototype data
|
|
function compat.prototype_data(category)
|
|
if major_v1_1 then
|
|
return game[category .. "_prototypes"]
|
|
elseif major_v2 then
|
|
return prototypes[category]
|
|
end
|
|
return unsupported_version()
|
|
end
|
|
|
|
--- Returns the table reference used to list active mods
|
|
--- @return table # Table of active mods
|
|
function compat.active_mods()
|
|
if major_v1_1 or major_v2 then
|
|
return script.active_mods
|
|
end
|
|
return unsupported_version()
|
|
end
|
|
|
|
--- @param tbl table
|
|
--- @return string
|
|
function compat.table_to_json(tbl)
|
|
return unsupported_version()
|
|
end
|
|
|
|
--- @param json string
|
|
--- @return table
|
|
function compat.json_to_table(json)
|
|
return unsupported_version()
|
|
end
|
|
|
|
--- @param filename string
|
|
--- @param data LocalisedString
|
|
--- @param append boolean?
|
|
--- @param for_player uint?
|
|
function compat.write_file(filename, data, append, for_player)
|
|
unsupported_version()
|
|
end
|
|
|
|
--- Select the appropriate polyfill implementation
|
|
if major_v1_1 then
|
|
-- Game is not always available so it needs to be called within another function
|
|
-- Can not use ... here because of luals type suggestion breaking when it is used
|
|
-- TODO maybe include a version that does not require game?
|
|
|
|
compat.table_to_json = function(tbl) return game.table_to_json(tbl) end
|
|
compat.json_to_table = function(json) return game.json_to_table(json) end
|
|
compat.write_file = function(filename, data, append, for_player) return game.write_file(filename, data, append, for_player) end
|
|
elseif major_v2 then
|
|
compat.table_to_json = helpers.table_to_json
|
|
compat.json_to_table = helpers.json_to_table
|
|
compat.write_file = helpers.write_file
|
|
end
|
|
|
|
return compat
|