-debug_mod_name = "Zoom"
-require("utils")
-local zoom_factor = 1.5
-local zoom_wide_max = 0.01
-local zoom_wide_hotkey = 1 / (zoom_factor^7)
-local zoom_close_max = 16.00
-local player_mem = {}
-
---------------------------------------------------------------------------------------
-local function init_player(player)
- if player_mem == nil then return end
-
- -- initialize or update per player globals of the mod, and reset the gui
- debug_print( "init_player ", player.name, " connected=", player.connected )
-
- player_mem[player.index] = player_mem[player.index] or {}
-
- local player_mem = player_mem[player.index]
- player_mem.player = player_mem.player or player
- player_mem.zoom = player_mem.zoom or 1
-
- if player.connected then
- build_bar(player)
- end
-end
-
---------------------------------------------------------------------------------------
-local function init_players()
- for _, player in pairs(game.players) do
- init_player(player)
- end
-end
-
---------------------------------------------------------------------------------------
-local function on_init()
- -- called once, the first time the mod is loaded on a game (new or existing game)
- debug_print( "on_init" )
- init_players()
-end
-
-script.on_init(on_init)
+function build_gui(player)
+ -- here only build gui, but not try to update it with player data that is not always already available (in init_player for example)
+ local guif = player.gui.top.flw_zoom
---------------------------------------------------------------------------------------
-local function on_configuration_changed(data)
- -- detect any mod or game version change
- if data.mod_changes ~= nil then
- local changes = data.mod_changes[debug_mod_name]
- if changes ~= nil then
- debug_print( "update mod: ", debug_mod_name, " ", tostring(changes.old_version), " to ", tostring(changes.new_version) )
- init_players()
- end
+ if guif == nil then
+ guif = player.gui.top.add({type = "flow", name = "flw_zoom", direction = "horizontal", style = "zoom_flow_style"})
+ guif.add({type = "sprite-button", name = "but_zoom_zout", sprite = "sprite_zout", style = "zoom_sprite_style"})
+ guif.add({type = "sprite-button", name = "but_zoom_zin", sprite = "sprite_zin", style = "zoom_sprite_style"})
end
end
-script.on_configuration_changed(on_configuration_changed)
---------------------------------------------------------------------------------------
-local function on_player_created(event)
- -- called at player creation
- local player = game.players[event.player_index]
- debug_print( "player created ", player.name )
-
- init_player(player)
-end
-script.on_event(defines.events.on_player_created, on_player_created )
-
---------------------------------------------------------------------------------------
-local function on_player_joined_game(event)
- -- called in SP(once) and MP(at every connect), eventually after on_player_created
- local player = game.players[event.player_index]
- debug_print( "player joined ", player.name )
-
- init_player(player)
-end
-
-script.on_event(defines.events.on_player_joined_game, on_player_joined_game )
-
---------------------------------------------------------------------------------------
local function on_gui_click(event)
local player = game.players[event.player_index]
- local event_name = event.element.name
- local prefix = string.sub(event_name,1,14)
- local suffix = string.sub(event_name,15)
- debug_print( "on_gui_click ", player.name, " ", event_name )
+ if event.element.name == "but_zoom_zin" then
+ player.zoom = player.zoom*player.mod_settings["some-zoom-zoomchangefactor"].value
- if event_name == "but_zoom_zin" then
- local player_mem = player_mem[player.index]
- if player_mem.zoom < zoom_close_max then
- player_mem.zoom = player_mem.zoom * zoom_factor
- player.zoom = player_mem.zoom
- end
+ elseif event.element.name == "but_zoom_zout" then
+ player.zoom = player.zoom/player.mod_settings["some-zoom-zoomchangefactor"].value
- elseif event_name == "but_zoom_zout" then
- local player_mem = player_mem[player.index]
- if player_mem.zoom > zoom_wide_max then
- player_mem.zoom = player_mem.zoom / zoom_factor
- player.zoom = player_mem.zoom
- end
end
end
-script.on_event(defines.events.on_gui_click, on_gui_click)
-
---------------------------------------------------------------------------------------
-local function on_zoom_hotkey(event)
- local player = game.players[event.player_index]
- local player_mem = player_mem[player.index]
- player_mem.zoom = zoom_wide_hotkey
- player.zoom = player_mem.zoom
-end
-
-script.on_event("zoom_hotkey", on_zoom_hotkey)
---------------------------------------------------------------------------------------
-function build_bar( player )
- -- here only build gui, but not try to update it with player data that is not always already available (in init_player for example)
- local guif = player.gui.top.flw_zoom
- if guif == nil then
- debug_print("create gui player" .. player.name)
- guif = player.gui.top.add({type = "flow", name = "flw_zoom", direction = "horizontal", style = "zoom_flow_style"})
- guif.add({type = "sprite-button", name = "but_zoom_zout", sprite = "sprite_zout", style = "zoom_sprite_style"})
- guif.add({type = "sprite-button", name = "but_zoom_zin", sprite = "sprite_zin", style = "zoom_sprite_style"})
+local function on_runtime_mod_setting_changed(event)
+ local player = game.players[event.player_index]
+ if player.connected then
+ player.zoom_limits = {}
+ local defzoomlimit = player.zoom_limits
+ local zoomlimitfactor = 1
+
+ player.zoom_limits = {
+ furthest = { distance = defzoomlimit.furthest.distance*player.mod_settings["some-zoom-zoomlimitfactor"].value, max_distance = defzoomlimit.furthest.max_distance*player.mod_settings["some-zoom-zoomlimitfactor"].value},
+ furthest_game_view = { distance = defzoomlimit.furthest.distance*player.mod_settings["some-zoom-zoomlimitfactor"].value, max_distance = defzoomlimit.furthest.max_distance*player.mod_settings["some-zoom-zoomlimitfactor"].value}
+ }
end
end
---------------------------------------------------------------------------------------
-local interface = {}
-function interface.reset()
- debug_print( "reset" )
+local function on_init()
for _, player in pairs(game.players) do
- if player.gui.top.flw_zoom then player.gui.top.flw_zoom.destroy() end
- init_player(player)
+ if player.connected then
+ player.zoom_limits = {}
+ local defzoomlimit = player.zoom_limits
+ local zoomlimitfactor = 1
+
+ player.zoom_limits = {
+ furthest = { distance = defzoomlimit.furthest.distance*player.mod_settings["some-zoom-zoomlimitfactor"].value, max_distance = defzoomlimit.furthest.max_distance*player.mod_settings["some-zoom-zoomlimitfactor"].value},
+ furthest_game_view = { distance = defzoomlimit.furthest.distance*player.mod_settings["some-zoom-zoomlimitfactor"].value, max_distance = defzoomlimit.furthest.max_distance*player.mod_settings["some-zoom-zoomlimitfactor"].value}
+ }
+ build_gui(player)
+ end
end
end
-remote.add_interface( "zoom", interface )
-
--- /c remote.call( "zoom", "reset" )
+script.on_event(defines.events.on_runtime_mod_setting_changed, on_runtime_mod_setting_changed)
+script.on_event(defines.events.on_gui_click, on_gui_click)
+script.on_init(on_init)
+++ /dev/null
--- utils.lua by binbinhfr, v1.0.16
-
--- define debug_status to 1 or nil in the control.lua, before statement require("utils")
--- define also debug_file and debug_mod_name
-
-colors = {
- white = {r = 1, g = 1, b = 1},
- black = {r = 0, g = 0, b = 0},
- darkgrey = {r = 0.25, g = 0.25, b = 0.25},
- grey = {r = 0.5, g = 0.5, b = 0.5},
- lightgrey = {r = 0.75, g = 0.75, b = 0.75},
-
- red = {r = 1, g = 0, b = 0},
- darkred = {r = 0.5, g = 0, b = 0},
- lightred = {r = 1, g = 0.5, b = 0.5},
- green = {r = 0, g = 1, b = 0},
- darkgreen = {r = 0, g = 0.5, b = 0},
- lightgreen = {r = 0.5, g = 1, b = 0.5},
- blue = {r = 0, g = 0, b = 1},
- darkblue = {r = 0, g = 0, b = 0.5},
- lightblue = {r = 0.5, g = 0.5, b = 1},
-
- orange = {r = 1, g = 0.55, b = 0.1},
- yellow = {r = 1, g = 1, b = 0},
- pink = {r = 1, g = 0, b = 1},
- purple = {r = 0.6, g = 0.1, b = 0.6},
- brown = {r = 0.6, g = 0.4, b = 0.1},
-}
-
-anticolors = {
- white = colors.black,
- black = colors.white,
- darkgrey = colors.white,
- grey = colors.black,
- lightgrey = colors.black,
-
- red = colors.white,
- darkred = colors.white,
- lightred = colors.black,
- green = colors.black,
- darkgreen = colors.white,
- lightgreen = colors.black,
- blue = colors.white,
- darkblue = colors.white,
- lightblue = colors.black,
-
- orange = colors.black,
- yellow = colors.black,
- pink = colors.white,
- purple = colors.white,
- brown = colors.white,
-}
-
-lightcolors = {
- white = colors.lightgrey,
- grey = colors.darkgrey,
- lightgrey = colors.grey,
-
- red = colors.lightred,
- green = colors.lightgreen,
- blue = colors.lightblue,
- yellow = colors.orange,
- pink = colors.purple,
-}
-
-local author_name1 = "BinbinHfr"
-local author_name2 = "binbin"
-
---------------------------------------------------------------------------------------
-function read_version(v)
- local v1, v2, v3 = string.match(v, "(%d+).(%d+).(%d+)")
- debug_print( "version cut = ", v1,v2,v3)
-end
-
---------------------------------------------------------------------------------------
-function compare_versions(v1,v2)
- local v1a, v1b, v1c = string.match(v1, "(%d+).(%d+).(%d+)")
- local v2a, v2b, v2c = string.match(v2, "(%d+).(%d+).(%d+)")
-
- v1a = tonumber(v1a)
- v1b = tonumber(v1b)
- v1c = tonumber(v1c)
- v2a = tonumber(v2a)
- v2b = tonumber(v2b)
- v2c = tonumber(v2c)
-
- if v1a > v2a then
- return 1
- elseif v1a < v2a then
- return -1
- elseif v1b > v2b then
- return 1
- elseif v1b < v2b then
- return -1
- elseif v1c > v2c then
- return 1
- elseif v1c < v2c then
- return -1
- else
- return 0
- end
-end
-
---------------------------------------------------------------------------------------
-function older_version(v1,v2)
- local v1a, v1b, v1c = string.match(v1, "(%d+).(%d+).(%d+)")
- local v2a, v2b, v2c = string.match(v2, "(%d+).(%d+).(%d+)")
- local ret
-
- v1a = tonumber(v1a)
- v1b = tonumber(v1b)
- v1c = tonumber(v1c)
- v2a = tonumber(v2a)
- v2b = tonumber(v2b)
- v2c = tonumber(v2c)
-
- if v1a > v2a then
- ret = false
- elseif v1a < v2a then
- ret = true
- elseif v1b > v2b then
- ret = false
- elseif v1b < v2b then
- ret = true
- elseif v1c < v2c then
- ret = true
- else
- ret = false
- end
-
- debug_print( "older_version ", v1, "<", v2, "=", ret )
-
- return(ret)
-end
-
---------------------------------------------------------------------------------------
-function debug_active(...)
- -- can be called everywhere, except in on_load where game is not existing
- local s = ""
-
- for i, v in ipairs({...}) do
- s = s .. tostring(v)
- end
-
- if s == "RAZ" or debug_do_raz == true then
- game.remove_path(debug_file)
- debug_do_raz = false
- elseif s == "CLEAR" then
- for _, player in pairs(game.players) do
- if player.connected then player.clear_console() end
- end
- end
-
- s = debug_mod_name .. "(" .. game.tick .. "): " .. s
- game.write_file( debug_file, s .. "\n", true )
-
- for _, player in pairs(game.players) do
- if player.connected then player.print(s) end
- end
-end
-
-if debug_status == 1 then debug_print = debug_active else debug_print = function() end end
-
---------------------------------------------------------------------------------------
-function message_all(s)
- for _, player in pairs(game.players) do
- if player.connected then
- player.print(s)
- end
- end
-end
-
---------------------------------------------------------------------------------------
-function message_force(force, s)
- for _, player in pairs(force.players) do
- if player.connected then
- player.print(s)
- end
- end
-end
-
---------------------------------------------------------------------------------------
-function square_area( origin, radius )
- return {
- {x=origin.x - radius, y=origin.y - radius},
- {x=origin.x + radius, y=origin.y + radius}
- }
-end
-
---------------------------------------------------------------------------------------
-function distance( pos1, pos2 )
- local dx = pos2.x - pos1.x
- local dy = pos2.y - pos1.y
- return( math.sqrt(dx*dx+dy*dy) )
-end
-
---------------------------------------------------------------------------------------
-function distance_square( pos1, pos2 )
- return( math.max(math.abs(pos2.x - pos1.x),math.abs(pos2.y - pos1.y)) )
-end
-
---------------------------------------------------------------------------------------
-function pos_offset( pos, offset )
- return { x=pos.x + offset.x, y=pos.y + offset.y }
-end
-
---------------------------------------------------------------------------------------
-function surface_area(surf)
- local x1, y1, x2, y2 = 0,0,0,0
-
- for chunk in surf.get_chunks() do
- if chunk.x < x1 then
- x1 = chunk.x
- elseif chunk.x > x2 then
- x2 = chunk.x
- end
- if chunk.y < y1 then
- y1 = chunk.y
- elseif chunk.y > y2 then
- y2 = chunk.y
- end
- end
-
- return( {{x1*32-8,y1*32-8},{x2*32+40,y2*32+40}} )
-end
-
---------------------------------------------------------------------------------------
-function iif( cond, val1, val2 )
- if cond then
- return val1
- else
- return val2
- end
-end
-
---------------------------------------------------------------------------------------
-function add_list(list, obj)
- -- to avoid duplicates...
- for i, obj2 in pairs(list) do
- if obj2 == obj then
- return(false)
- end
- end
- table.insert(list,obj)
- return(true)
-end
-
---------------------------------------------------------------------------------------
-function del_list(list, obj)
- for i, obj2 in pairs(list) do
- if obj2 == obj then
- table.remove( list, i )
- return(true)
- end
- end
- return(false)
-end
-
---------------------------------------------------------------------------------------
-function in_list(list, obj)
- for k, obj2 in pairs(list) do
- if obj2 == obj then
- return(k)
- end
- end
- return(nil)
-end
-
---------------------------------------------------------------------------------------
-function size_list(list)
- local n = 0
- for i in pairs(list) do
- n = n + 1
- end
- return(n)
-end
-
---------------------------------------------------------------------------------------
-function concat_lists(list1, list2)
- -- add list2 into list1 , do not avoid duplicates...
- for i, obj in pairs(list2) do
- table.insert(list1,obj)
- end
-end
-
-------------------------------------------------------------------------------------
-function is_dev(player)
- return( player.name == author_name1 or player.name == author_name2 )
-end
-
---------------------------------------------------------------------------------------
-function dupli_proto( type, name1, name2 )
- if data.raw[type][name1] then
- local proto = table.deepcopy(data.raw[type][name1])
- proto.name = name2
- if proto.minable and proto.minable.result then proto.minable.result = name2 end
- if proto.place_result then proto.place_result = name2 end
- if proto.take_result then proto.take_result = name2 end
- if proto.result then proto.result = name2 end
- return(proto)
- else
- error("prototype unknown " .. name1 )
- return(nil)
- end
-end
-
---------------------------------------------------------------------------------------
-function debug_guis( guip, indent )
- if guip == nil then return end
- debug_print( indent .. string.rep("....",indent) .. " " .. guip.name )
- indent = indent+1
- for k, gui in pairs(guip.children_names) do
- debug_guis( guip[gui], indent )
- end
-end
-
---------------------------------------------------------------------------------------
-function extract_monolith(filename, x, y, w, h)
- return {
- type = "monolith",
-
- top_monolith_border = 0,
- right_monolith_border = 0,
- bottom_monolith_border = 0,
- left_monolith_border = 0,
-
- monolith_image = {
- filename = filename,
- priority = "extra-high-no-scale",
- width = w,
- height = h,
- x = x,
- y = y,
- },
- }
-end
-