Commit 3812d9dc authored by Rob Nelson's avatar Rob Nelson
Browse files

Updates for 0.15.13

parent 21031b6b
day_length_multiplier = 3
-- Controls how the day length will be increased.
-- Must be an integer !
-- Set to 1 for default vanilla length (7 minutes full day/night cycle).
-- With 4, it gives a 28 mins cycle.
adapted_accumulators = true -- if true then buffer size of accumulators is multiplied by day_length_multiplier to support longer nights.
-- debug_status = 1
debug_mod_name = "DayNightExtender"
debug_file = debug_mod_name .. "-debug.txt"
require("utils")
require("config")
--------------------------------------------------------------------------------------
local function init_globals()
-- initialize or update general globals of the mod
debug_print( "init_globals" )
global.counter = global.counter or 0
global.multiplier = global.multiplier or math.floor(day_length_multiplier)
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_globals()
end
script.on_init(on_init)
--------------------------------------------------------------------------------------
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_globals()
end
end
end
script.on_configuration_changed(on_configuration_changed)
--------------------------------------------------------------------------------------
local function on_tick(event)
if game.tick % 14 == 0 then
for _, surf in pairs(game.surfaces) do
if not surf.always_day then
if global.counter == 0 then
surf.freeze_daytime(false)
elseif global.counter == 1 then
surf.freeze_daytime(true)
end
end
end
global.counter = global.counter + 1
if global.counter >= global.multiplier then
global.counter = 0
end
end
end
script.on_event(defines.events.on_tick, on_tick)
--------------------------------------------------------------------------------------
local interface = {}
function interface.on( )
debug_print( "on" )
message_all( "DayNightExtender : ON" )
script.on_event(defines.events.on_tick, on_tick)
end
function interface.off( )
debug_print( "off" )
message_all( "DayNightExtender : OFF" )
script.on_event(defines.events.on_tick, nil)
for _, surf in pairs(game.surfaces) do
surf.freeze_daytime(false)
end
end
function interface.multi( m )
debug_print( "multi" )
m = tonumber(m)
if m ~= nil then
m = math.max(1,math.floor(m))
message_all( "DayNightExtender : multiplier = " .. m )
global.multiplier = m
if global.multiplier == 1 then
interface.off()
else
interface.on()
end
end
end
remote.add_interface( "daynight", interface )
-- /c remote.call( "daynight", "on" )
-- /c remote.call( "daynight", "off" )
-- /c remote.call( "daynight", "multi", 4 )
require( "config" )
local function multiply_buffer(capa)
local n, unit = string.match(capa, "([%d%.]+)(%a+)")
if n == nil then return( "0MJ" ) end
return( n * day_length_multiplier .. unit )
end
if adapted_accumulators then
-- data.raw.accumulator.accumulator.energy_source.buffer_capacity = 5 * day_length_multiplier .. "MJ"
for _, accu in pairs(data.raw.accumulator) do
if accu.energy_source and accu.energy_source.buffer_capacity then
accu.energy_source.buffer_capacity = multiply_buffer(accu.energy_source.buffer_capacity)
end
end
end
{
"name": "DayNightExtender",
"version": "1.1.11",
"title": "Day Night Extender (longer days and nights)",
"author": "Original: Dark - Updated: vizzy, mikenlott, binbinhfr",
"homepage": "https://forums.factorio.com/viewtopic.php?f=92&t=28822",
"contact": "https://forums.factorio.com/memberlist.php?mode=viewprofile&u=14267",
"description": "Increase the length of day and night cycle. Vanilla length is around 7 mins. The extender multiplies this by x4 to 28 mins. This multiplier is customizable in config.lua.",
"factorio_version":"0.15",
"dependencies": ["base >= 0.14.0"]
}
##VERSIONS:
1.0.11 - factorio 0.15 compatible
1.0.10 - better reading of accu buffer capacity (when floating point number...)
1.0.9 - increase accumulators buffer size to support longer nights (multiply by day_length_multiplier)
1.0.8 - add an interface to enable/disable mod :
/c remote.call( "daynight", "on" )
/c remote.call( "daynight", "off" )
- add an interface to change multiplier :
/c remote.call( "daynight", "multi", 4 )
1.0.7 - factorio 0.14 compatible
1.1.6 - check all surfaces, and then unify day and night multipliers to simplify calculations and differences between surfaces. INtroduce config.lua. Default with x4 - 28 mins cycle.
1.1.4 - relaxes frequency, adds always_day checking
1.1.3 - update by Binbinhfr for factorio 0.13.x, published on portal
1.1.2 - update by Mikenlott
1.1.0 - update by Vizzy
1.0.0 - original release by Dark
\ No newline at end of file
[b][size=150]Infos[/size][/b]
[list]
[*]Type: Mod
[*]Name: DayNightExtender
[*]Description: Increase the length of day and night cycle. Vanilla length is around 7 mins. The extender multiplies this by x4 to 28 mins. This multiplier is customizable in config.lua.
[*]Tested-With-Factorio-Version: 0.13.0
[*]Multiplayer compatible: not tested
[*]Locale: none
[*]Tags: Time, clock, day length, slowtime.
[*]License: MIT.
[*]Authors : Dark, Vizzy, Mikenlott, BinbinHfr
[*]Portal download : https://mods.factorio.com/mods/binbinhfr/DayNightExtender[/list]
[spoiler=To Use]The default, modded day/night length is 4x the vanilla length.
Vanilla: 7 minutes for full day and night cycle
Modded: 28 minutes for full day and night cycle
With the mod, the game-minutes are ticking close to real seconds.
If you wish to change the modded values, you just have to change the value of day_length_multiplier in the config.lua file.[/spoiler]
[spoiler=Limitations]- Can only increase day/night length in blocks of 7 minutes. Unfortunately decreasing the length or finer granularity is not possible.
- If you are using a mod that display the clocl (like [url=https://forums.factorio.com/viewtopic.php?f=92&t=22822]TimeTools[/url], you will see that the clock is ticking slower and sometimes not very regularly. That's not a bug : DayNightExtender is constantly playing with the clock, freezing/unfreezing it, in order to give a fake slowtime effect.[/spoiler]
\ No newline at end of file
-- 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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment