1
0
mirror of https://github.com/ComfyFactory/ComfyFactorio.git synced 2025-01-10 00:43:27 +02:00
ComfyFactorio/maps/mountain_fortress_v3/ic/minimap.lua
2024-05-31 22:47:33 +02:00

312 lines
8.8 KiB
Lua

local Public = {}
local ICT = require 'maps.mountain_fortress_v3.ic.table'
local Functions = require 'maps.mountain_fortress_v3.ic.functions'
local Gui = require 'maps.mountain_fortress_v3.ic.gui'
local CoreGui = require 'utils.gui'
local function get_top_frame_custom(player, name)
if CoreGui.get_mod_gui_top_frame() then
return CoreGui.get_button_flow(player)[name]
else
return player.gui.top[name]
end
end
local function validate_player(player)
if not player then
return false
end
if not player.valid then
return false
end
if not player.character then
return false
end
if not player.connected then
return false
end
if not game.players[player.name] then
return false
end
return true
end
local function get_top_frame(player)
if CoreGui.get_mod_gui_top_frame() then
return CoreGui.get_button_flow(player)['minimap_button']
else
return player.gui.top['minimap_button']
end
end
local function create_button(player)
if CoreGui.get_mod_gui_top_frame() then
local b =
CoreGui.add_mod_button(
player,
{
type = 'sprite-button',
name = 'minimap_button',
sprite = 'utility/map',
tooltip = 'Open or close minimap.',
style = Gui.button_style
}
)
if b then
b.style.font_color = {165, 165, 165}
b.style.font = 'heading-3'
b.style.minimal_height = 36
b.style.maximal_height = 36
b.style.minimal_width = 40
b.style.padding = -2
end
else
local button =
player.gui.top['minimap_button'] or
player.gui.top.add(
{
type = 'sprite-button',
name = 'minimap_button',
sprite = 'utility/map',
tooltip = 'Open or close minimap.',
style = CoreGui.button_style
}
)
button.style.minimal_height = 38
button.style.maximal_height = 38
end
end
function Public.toggle_button(player)
if not get_top_frame(player) then
create_button(player)
end
local button = get_top_frame(player)
if Functions.get_player_surface(player) then
create_button(player)
else
if button and button.valid then
button.destroy()
end
end
end
local function get_player_data(player)
local minimap = ICT.get('minimap')
local player_data = minimap[player.index]
if minimap[player.index] then
return player_data
end
minimap[player.index] = {
zoom = 0.30,
map_size = 360,
auto = true,
state = 'left'
}
return minimap[player.index]
end
function Public.toggle_auto(player)
local player_data = get_player_data(player)
local switch = player.gui.left.minimap_toggle_frame['ic_auto_switch']
if switch.switch_state == 'left' then
player_data.auto = true
player_data.state = 'left'
elseif switch.switch_state == 'right' then
player_data.auto = false
player_data.state = 'right'
end
end
local function kill_minimap(player)
local frame = player.gui.left.minimap_toggle_frame
if not frame or not frame.valid then
return
end
if frame.visible then
frame.destroy()
end
end
local function kill_frame(player)
if player.gui.left.minimap_toggle_frame then
local element = player.gui.left.minimap_toggle_frame.minimap_frame
if not element or not element.valid then
return
end
element.destroy()
end
end
local function draw_minimap(player, surface, position)
local allowed_surface = ICT.get('allowed_surface')
surface = surface or game.surfaces[allowed_surface]
if not surface or not surface.valid then
return
end
local cars = ICT.get('cars')
local entity = Functions.get_entity_from_player_surface(cars, player)
if not position then
if not entity or not entity.valid then
kill_minimap(player)
kill_frame(player)
return
end
end
position = position or entity.position
local player_data = get_player_data(player)
local frame = player.gui.left.minimap_toggle_frame
if not frame then
frame = player.gui.left.add({type = 'frame', direction = 'vertical', name = 'minimap_toggle_frame', caption = 'Minimap'})
end
frame.visible = true
if not frame.ic_auto_switch then
frame.add(
{
type = 'switch',
name = 'ic_auto_switch',
switch_state = player_data.state,
allow_none_state = false,
left_label_caption = {'gui.map_on'},
right_label_caption = {'gui.map_off'}
}
)
end
local element = frame['minimap_frame']
if not element then
element =
player.gui.left.minimap_toggle_frame.add(
{
type = 'camera',
name = 'minimap_frame',
position = position,
surface_index = surface.index,
zoom = player_data.zoom,
tooltip = 'LMB: Increase zoom level.\nRMB: Decrease zoom level.\nMMB: Toggle camera size.'
}
)
element.style.margin = 1
element.style.minimal_height = player_data.map_size
element.style.minimal_width = player_data.map_size
return
end
element.position = position
end
function Public.minimap(player, surface, position)
local frame = player.gui.left['minimap_toggle_frame']
if frame and frame.visible then
kill_minimap(player)
else
if Functions.get_player_surface(player) and not surface and not position then
draw_minimap(player)
else
draw_minimap(player, surface, position)
end
end
end
function Public.update_minimap()
for _, player in pairs(game.connected_players) do
local player_data = get_player_data(player)
if Functions.get_player_surface(player) and player.gui.left.minimap_toggle_frame and player_data.auto then
kill_frame(player)
draw_minimap(player)
else
kill_minimap(player)
end
end
end
function Public.toggle_minimap(event)
local element = event.element
if not element then
return
end
if not element.valid then
return
end
if element.name ~= 'minimap_frame' then
return
end
local player = game.players[event.player_index]
local player_data = get_player_data(player)
if event.button == defines.mouse_button_type.right then
player_data.zoom = player_data.zoom - 0.07
if player_data.zoom < 0.07 then
player_data.zoom = 0.07
end
element.zoom = player_data.zoom
return
end
if event.button == defines.mouse_button_type.left then
player_data.zoom = player_data.zoom + 0.07
if player_data.zoom > 2 then
player_data.zoom = 2
end
element.zoom = player_data.zoom
return
end
if event.button == defines.mouse_button_type.middle then
player_data.map_size = player_data.map_size + 50
if player_data.map_size > 650 then
player_data.map_size = 250
end
element.style.minimal_height = player_data.map_size
element.style.minimal_width = player_data.map_size
element.style.maximal_height = player_data.map_size
element.style.maximal_width = player_data.map_size
return
end
end
function Public.changed_surface(event)
local player = game.players[event.player_index]
if not validate_player(player) then
return
end
local allowed_surface = ICT.get('allowed_surface')
local surface = game.surfaces[allowed_surface]
if not surface or not surface.valid then
return
end
local wd = get_top_frame_custom(player, 'wave_defense')
local diff = get_top_frame_custom(player, 'difficulty_gui')
local player_data = get_player_data(player)
if Functions.get_player_surface(player) then
Public.toggle_button(player)
if player_data.auto then
Public.minimap(player, surface)
end
if wd and wd.visible then
wd.visible = false
end
if diff and diff.visible then
diff.visible = false
end
elseif player.surface.index == surface.index then
Gui.remove_toolbar(player)
Public.toggle_button(player)
kill_minimap(player)
if wd and not wd.visible then
wd.visible = true
end
if diff and not diff.visible then
diff.visible = true
end
end
end
Public.kill_minimap = kill_minimap
return Public