132 lines
4.1 KiB
Lua

local enum = require("mpp.enums")
local compatibility = {}
--[[----------------------------------------------------------------------------
Space Exploration
----------------------------------------------------------------------------]]--
local space_exploration_active = nil
---@return boolean
compatibility.is_space_exploration_active = function()
if space_exploration_active == nil then
space_exploration_active = game.active_mods["space-exploration"] and true or false
end
return space_exploration_active
end
--- @class SERemoteViewToggledEventData: EventData
--- @field player_index uint
-- Thanks Raiguard
compatibility.get_se_events = function()
local se, events = remote.interfaces["space-exploration"], {}
if not se then return events end
if se.get_on_remote_view_started_event then
events["get_on_remote_view_started_event"] = remote.call("space-exploration", "get_on_remote_view_started_event")
end
if se.get_on_remote_view_stopped_event then
events["get_on_remote_view_stopped_event"] = remote.call("space-exploration", "get_on_remote_view_stopped_event")
end
return events
end
local memoize_space_surfaces = {}
--- Wrapper for Space Exploration get_zone_is_space remote interface calls
---@param surface_identification SurfaceIdentification
---@return boolean
compatibility.is_space = function(surface_identification)
local surface_index = surface_identification
if type(surface_identification) == "string" then
surface_identification = game.get_surface(surface_identification).index
elseif type(surface_identification) == "userdata" then
---@cast surface_identification LuaSurface
surface_identification = surface_identification.index
end
local memoized = memoize_space_surfaces[surface_index]
if memoized ~= nil then return memoized end
if game.active_mods["space-exploration"] then
local zone = remote.call("space-exploration", "get_zone_from_surface_index", {surface_index = surface_index} --[[@as table]]) --[[@as LuaSurface?]]
if not zone then
memoize_space_surfaces[surface_index] = false
return false
end
local result = remote.call("space-exploration", "get_zone_is_space", {zone_index = zone.index} --[[@as table]]) --[[@as boolean]]
memoize_space_surfaces[surface_index] = result
return result
end
memoize_space_surfaces[surface_index] = false
return false
end
---@type string
local space_collision_mask_name = nil
---@type table<string, boolean>
local memoize_space_buildable = {}
function compatibility.is_buildable_in_space(name)
local buildable_status = memoize_space_buildable[name]
if buildable_status ~= nil then
return buildable_status
end
-- if something goes wrong, give up, allow to build
if space_collision_mask_name == nil then
local scaffold_tile = game.tile_prototypes["se-space-platform-scaffold"]
if not scaffold_tile then
memoize_space_buildable[name] = true
return true
end
space_collision_mask_name = next(scaffold_tile.collision_mask)
if space_collision_mask_name == nil then
memoize_space_buildable[name] = true
return true
end
end
local entity_proto = game.entity_prototypes[name]
local allowed = not entity_proto.collision_mask[space_collision_mask_name]
memoize_space_buildable[name] = allowed
return allowed
end
--- Return true to skip non space item
---@param is_space boolean
---@param protype LuaEntityPrototype
---@return boolean
compatibility.guess_space_item = function(is_space, protype)
if not is_space then return false end
return string.match(protype.name, "^se%-")
end
--[[----------------------------------------------------------------------------
Pyanodons
----------------------------------------------------------------------------]]--
local pyanodons_active = nil
---@return boolean
compatibility.is_pyanodons_active = function()
if pyanodons_active == nil then
local active_mods = game.active_mods
-- pyanodons_active = game.active_mods["space-exploration"] and true or false
for k, v in ipairs{"pyrawores", "pycoalprocessing", "pyalienlife"} do
if active_mods[v] then
pyanodons_active = true
break
end
end
pyanodons_active = false
end
return pyanodons_active
end
return compatibility