From 11f14e8bbb6c2fc74d5b0aa603feebe468b51323 Mon Sep 17 00:00:00 2001 From: Someone Date: Fri, 28 Nov 2025 21:54:46 +0100 Subject: [PATCH] RELEASE 2.0.4 - Rewritten. Works again. Now by increasing the players zoom limits. --- License.txt | 2 +- changelog.txt | 9 +- control.lua | 155 ++++++---------------- data.lua | 11 -- info.json | 10 +- locale/en/en.cfg | 9 +- settings.lua | 18 +++ sound/empty.ogg | Bin 35371 -> 0 bytes utils.lua | 337 ----------------------------------------------- 9 files changed, 77 insertions(+), 474 deletions(-) create mode 100644 settings.lua delete mode 100644 sound/empty.ogg delete mode 100644 utils.lua diff --git a/License.txt b/License.txt index a164962..9e7ed3a 100644 --- a/License.txt +++ b/License.txt @@ -1,5 +1,5 @@ Copyright (c) 2016-2019 BinbinHfr -Copyright (c) 2020-2024 Someone +Copyright (c) 2020-2025 Someone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/changelog.txt b/changelog.txt index 1ee4d58..eb2bf3d 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,9 +1,16 @@ +--------------------------------------------------------------------------------------------------- +Version: 2.0.4 +Date: 2025-11-28 + + Changed: + - Rewritten. Works again. Now by increasing the players zoom limits. + --------------------------------------------------------------------------------------------------- Version: 2.0.0 Date: 2024-10-21 Changed: - - Initial compatibility with Factorio 2.0 + - Initial compatibility with Factorio 2.0 (fixed abandoned mod) --------------------------------------------------------------------------------------------------- Version: 1.1.2 diff --git a/control.lua b/control.lua index bc933ff..40d2fd9 100644 --- a/control.lua +++ b/control.lua @@ -1,145 +1,64 @@ -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) diff --git a/data.lua b/data.lua index 6a0e6c6..5b51c0a 100644 --- a/data.lua +++ b/data.lua @@ -1,12 +1 @@ -require("utils") require("prototypes/styles") - -data:extend( - { - { - type = "custom-input", - name = "zoom_hotkey", - key_sequence = "ALT + Z", - }, - } -) diff --git a/info.json b/info.json index 8acec37..35d4554 100644 --- a/info.json +++ b/info.json @@ -1,10 +1,12 @@ { "name": "some-zoom", - "version": "2.0.0", - "title": "Zoom (fixed+re-published abandoned mod)", + "version": "2.0.4", + "title": "Zoom (works again)", "author": "Someone (originally BinbinHfr)", "homepage": "https://git.somenet.org/factorio/some-zoom.git", - "description": "Just 2 buttons to zoom extra wide or close, further than actual gui limits! And a ALT-Y hotkey to direct zoom out.", + "description": "Increases the game's zoom limits by the zoomlimitfactor player-setting. By default by factor 4. The buttons remain for now for legacy reasons.", "factorio_version": "2.0", - "dependencies": ["base>=2.0.0"] + "dependencies": [ + "base>=2.0.0" + ] } diff --git a/locale/en/en.cfg b/locale/en/en.cfg index ca8f259..42e0601 100644 --- a/locale/en/en.cfg +++ b/locale/en/en.cfg @@ -1,3 +1,8 @@ -[controls] -zoom_hotkey=Zoom +[mod-setting-name] +some-zoom-zoomchangefactor=Zoomchange factor +some-zoom-zoomlimitfactor=Zoomlimit factor + +[mod-setting-description] +some-zoom-zoomchangefactor=By how much we change the zoom per button click. +some-zoom-zoomlimitfactor=By how much we expand the usual game limits. Dont set it too high to prevent accidental zoom out-lag. diff --git a/settings.lua b/settings.lua new file mode 100644 index 0000000..b751dcd --- /dev/null +++ b/settings.lua @@ -0,0 +1,18 @@ +data:extend({ + { + type = "double-setting", + name = "some-zoom-zoomchangefactor", + setting_type = "runtime-per-user", + default_value = 0.75, + minimum_value = 0.1, + maximum_value = 0.9, + }, + { + type = "int-setting", + name = "some-zoom-zoomlimitfactor", + setting_type = "runtime-per-user", + default_value = 4, + minimum_value = 1, + maximum_value = 100, + } +}) diff --git a/sound/empty.ogg b/sound/empty.ogg deleted file mode 100644 index 5be4b0ccdf76c3e0feafd6406ca98a4d4a209ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35371 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 diff --git a/utils.lua b/utils.lua deleted file mode 100644 index b865f26..0000000 --- a/utils.lua +++ /dev/null @@ -1,337 +0,0 @@ --- 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 - -- 2.47.3