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