132 lines
4.7 KiB
Lua

Camera = {}
local mod_gui = require 'mod-gui'
local get_factory_by_entity = remote_api.get_factory_by_entity
local find_surrounding_factory = remote_api.find_surrounding_factory
local function get_camera_toggle_button(player)
local buttonflow = mod_gui.get_button_flow(player)
local button = buttonflow.factory_camera_toggle_button or buttonflow.add{type='sprite-button', name='factory_camera_toggle_button', sprite='technology/factory-architecture-t1'}
button.visible = player.force.technologies['factory-preview'].researched
return button
end
Camera.get_camera_toggle_button = get_camera_toggle_button
local function get_camera_frame(player)
local frameflow = mod_gui.get_frame_flow(player)
local camera_frame = frameflow.factory_camera_frame
if not camera_frame then
camera_frame = frameflow.add{type = 'frame', name = 'factory_camera_frame', style = 'captionless_frame'}
camera_frame.visible = false
end
return camera_frame
end
local function prepare_gui(player)
get_camera_toggle_button(player)
get_camera_frame(player)
end
local function init()
for _, player in pairs(game.players) do
prepare_gui(player)
end
end
Camera.init = init
local function set_camera(player, factory, inside)
if not player.force.technologies['factory-preview'].researched or factory.inactive then return end
local ps = settings.get_player_settings(player)
local ps_preview_size = ps['Factorissimo2-preview-size']
local preview_size = ps_preview_size and ps_preview_size.value or 300
local ps_preview_zoom = ps['Factorissimo2-preview-zoom']
local preview_zoom = ps_preview_zoom and ps_preview_zoom.value or 1
local position, surface_index, zoom
if not inside then
position = {x = factory.outside_x, y = factory.outside_y}
surface_index = factory.outside_surface.index
zoom = (preview_size/(32/preview_zoom))/(8+factory.layout.outside_size)
else
position = {x = factory.inside_x, y = factory.inside_y}
surface_index = factory.inside_surface.index
zoom = (preview_size/(32/preview_zoom))/(5+factory.layout.inside_size)
end
local camera_frame = get_camera_frame(player)
local camera = camera_frame.factory_camera
if camera then
camera.position = position
camera.surface_index = surface_index
camera.zoom = zoom
camera.style.minimal_width = preview_size
camera.style.minimal_height = preview_size
camera.ignored_by_interaction = true
else
local camera = camera_frame.add{type = 'camera', name = 'factory_camera', position = position, surface_index = surface_index, zoom = zoom}
camera.style.minimal_width = preview_size
camera.style.minimal_height = preview_size
camera.ignored_by_interaction = true
end
camera_frame.ignored_by_interaction = true
camera_frame.visible = true
end
local function unset_camera(player)
get_camera_frame(player).visible = false
end
local function update_camera(player)
if not global.player_preview_active[player.index] then return end
if not player.force.technologies['factory-preview'].researched then return end
local cursor_stack = player.cursor_stack
if cursor_stack and
cursor_stack.valid_for_read and
cursor_stack.type == 'item-with-tags' and
cursor_stack.tags and
global.saved_factories[cursor_stack.tags.id] then
local factory = global.saved_factories[cursor_stack.tags.id]
if not factory.inactive then set_camera(player, factory, true) return end
end
local selected = player.selected
if selected then
local factory
if selected.type == 'item-entity' and selected.stack.type == 'item-with-tags' and Layout.has_layout(selected.stack.name) then
factory = global.saved_factories[selected.stack.tags.id]
else
factory = get_factory_by_entity(player.selected)
end
if factory and not factory.inactive then
set_camera(player, factory, true)
return
elseif selected.name == 'factory-power-pole' then
local factory = find_surrounding_factory(selected.surface, selected.position)
if factory then
Overlay.update_overlay(factory)
set_camera(player, factory, false)
return
end
end
end
unset_camera(player)
end
Camera.update_camera = update_camera
script.on_event(defines.events.on_player_created, function(event)
prepare_gui(game.players[event.player_index])
end)
script.on_event(defines.events.on_gui_click, function(event)
local player = game.players[event.player_index]
if event.element.valid and event.element.name == 'factory_camera_toggle_button' then
if global.player_preview_active[player.index] then
get_camera_toggle_button(player).sprite = 'technology/factory-architecture-t1'
global.player_preview_active[player.index] = false
unset_camera(player)
else
get_camera_toggle_button(player).sprite = 'technology/factory-preview'
global.player_preview_active[player.index] = true
update_camera(player)
end
end
end)