219 lines
8.0 KiB
Lua
219 lines
8.0 KiB
Lua
-- /c game.print (' dusk:'..game.player.surface.dusk ..' evening'..game.player.surface.evening ..' morning'..game.player.surface.morning .. ' dawn '..game.player.surface.dawn )
|
||
-- 0.25 0.45 0.55 0.75
|
||
|
||
function get_season (digit_season)
|
||
if digit_season < 0.125 then return 'summer' end
|
||
if digit_season >= 0.125 and digit_season < (0.125+0.25) then return 'fall' end
|
||
if digit_season >= (0.125+0.25) and digit_season < (0.125+0.5) then return 'winter' end
|
||
if digit_season >= (0.125+0.5) and digit_season < (0.125+0.75) then return 'spring' end
|
||
if digit_season >= (0.125+0.75) then return 'summer' end
|
||
end
|
||
|
||
function change_day_parameters (surface, new_dp)
|
||
if global.debug then
|
||
if not (new_dp.dusk < surface.evening) then game.print ('dusk broken') end
|
||
if not ((surface.dusk < new_dp.evening)and(new_dp.evening < surface.morning)) then game.print ('evening broken') end
|
||
if not ((surface.evening < new_dp.morning)and(new_dp.morning < surface.dawn)) then game.print ('morning broken') end
|
||
if not (surface.morning < new_dp.dawn) then game.print ('dawn broken') end
|
||
end
|
||
surface.dusk = 0.00001
|
||
surface.evening = 0.00002
|
||
surface.morning = 0.00003
|
||
surface.dawn = 0.00004
|
||
surface.dawn = new_dp.dawn
|
||
surface.morning = new_dp.morning
|
||
surface.evening = new_dp.evening
|
||
surface.dusk = new_dp.dusk
|
||
end
|
||
|
||
function on_nth_tick()
|
||
|
||
if global.mod_disabled then
|
||
return
|
||
end
|
||
|
||
|
||
local surface = game.surfaces['nauvis']
|
||
local daytime = surface.daytime
|
||
|
||
local last_daytime = global.last_daytime or 0
|
||
if daytime < last_daytime then
|
||
|
||
-- new day, the middle of the day
|
||
local day = global.day or 1
|
||
local period = global.period or 16
|
||
local year_day = (day%period)
|
||
local digit_season = (year_day/period)
|
||
local season = get_season (digit_season)
|
||
local last_season = global.season or '1'
|
||
if not (season == last_season) and (period > 31) then
|
||
if season == 'summer' then game.print ('Наступило ЛЕТО') --drd
|
||
elseif season == 'fall' then game.print ('Наступила ОСЕНЬ') --drd
|
||
elseif season == 'winter' then game.print ('Наступила ЗИМА') --drd
|
||
elseif season == 'spring' then game.print ('Наступила ВЕСНА') --drd
|
||
end --drd
|
||
end
|
||
global.season = season
|
||
|
||
local phase = math.cos ((day/period)*(2*math.pi))
|
||
local min_brightness = global.middle_value + global.spread_value * phase
|
||
|
||
local day_parameters = global.day_parameters or {dusk = 1/6, evening = 2/6, morning = 4/6, dawn = 5/6, tilt = (1/6-0.01)}
|
||
local tilt = day_parameters.tilt * phase
|
||
local dusk = day_parameters.dusk + tilt
|
||
local evening = day_parameters.evening + tilt
|
||
local morning = day_parameters.morning - tilt
|
||
local dawn = day_parameters.dawn - tilt
|
||
local new_day_parameters = {dusk=dusk, evening=evening, morning=morning, dawn=dawn}
|
||
|
||
local solar_power_multiplier_spread = global.solar_power_multiplier_spread or 0.25
|
||
local max_solar_power_multiplier = 1
|
||
solar_power_multiplier = (max_solar_power_multiplier - solar_power_multiplier_spread) + solar_power_multiplier_spread * phase
|
||
|
||
if global.debug then
|
||
game.print ('day: '.. day .. ' year_day: '.. year_day .. ' digit_season: ' .. digit_season .. ' season: ' .. season)
|
||
game.print ('min_brightness: '..min_brightness..' dusk: '..dusk ..' evening: '..evening ..' morning: '..morning .. ' dawn: '..dawn..' solar_power_multiplier: '..solar_power_multiplier)
|
||
end
|
||
surface.min_brightness = min_brightness
|
||
|
||
-- surface.dusk = dusk
|
||
-- surface.evening = evening
|
||
-- surface.morning = morning
|
||
-- surface.dawn = dawn
|
||
change_day_parameters (surface, new_day_parameters)
|
||
|
||
-- it must be in the night, just set up global, making no changing
|
||
global.solar_power_multiplier = solar_power_multiplier
|
||
|
||
global.day = day + 1
|
||
elseif daytime > 0.5 and last_daytime < 0.5 then
|
||
-- half day, it's midnight in Factorio
|
||
local solar_power_multiplier = global.solar_power_multiplier or 1
|
||
if global.debug then
|
||
-- game.print ('daytime: ' ..daytime.. ' last_daytime: '..last_daytime)
|
||
game.print ('solar_power_multiplier: '.. solar_power_multiplier)
|
||
end
|
||
surface.solar_power_multiplier = solar_power_multiplier or 1
|
||
end
|
||
global.last_daytime = daytime
|
||
end
|
||
|
||
|
||
|
||
function update_day_parameters (data)
|
||
local data = data or {} -- not nil
|
||
local surface = data.surface or game.surfaces['nauvis']
|
||
surface.dusk = 0.0000001
|
||
surface.evening = 0.0000002
|
||
surface.morning = 0.0000003
|
||
surface.dawn = 0.0000004
|
||
-- default: {dusk = 0.2, evening = 0.3, morning = 0.7, dawn = 0.8}
|
||
surface.dawn = data.dawn or 0.8
|
||
surface.morning = data.morning or 0.7
|
||
surface.evening = data.evening or 0.3
|
||
surface.dusk = data.dusk or 0.2
|
||
surface.min_brightness = data.min_brightness or 0.15
|
||
surface.solar_power_multiplier = 1
|
||
end
|
||
|
||
|
||
|
||
|
||
script.on_nth_tick(1200, on_nth_tick)
|
||
|
||
function update_settings ()
|
||
-- global.threshold = settings.global[mod_name.."autodeconstruct-health-threshold"].value
|
||
--min_brightness = 0
|
||
--max_brightness = 0.15 -- 0.15 is vanilla in Factorio 0.17.9
|
||
local mod_disabled = settings.global['nb_disabled'].value
|
||
|
||
if mod_disabled and not global.mod_disabled then
|
||
game.print ('Night Brigtness disabled, restored vanilla settings')
|
||
global.mod_disabled = true
|
||
update_day_parameters (data)
|
||
return
|
||
elseif not mod_disabled and global.mod_disabled then
|
||
game.print ('Night Brigtness enabled')
|
||
global.mod_disabled = false
|
||
else
|
||
-- true true or false false
|
||
-- do nothing
|
||
end
|
||
|
||
|
||
local max_brightness = settings.global['max_night_brightness_percent'].value / 100
|
||
local min_brightness = settings.global['min_night_brightness_percent'].value / 100
|
||
local period = settings.global['night_brightness_period_days'].value
|
||
global.debug = settings.global['nb_debug'].value
|
||
|
||
-- local day_parameters = {dusk = 1/6, evening = 2/6, morning = 4/6, dawn = 5/6, tilt = (1/6-0.01)} -- no days in winter, no nights in sommer
|
||
local day_parameters = {dusk = 0.2, evening = 0.3, morning = 0.7, dawn = 0.8, tilt = 0.15}
|
||
global.day_parameters = day_parameters
|
||
|
||
global.solar_power_multiplier_spread = 0.25
|
||
|
||
global.middle_value = (max_brightness + min_brightness)/2
|
||
global.spread_value = (max_brightness - min_brightness)/2
|
||
global.period = period -- days
|
||
|
||
local reset = settings.global['nb_reset'].value
|
||
if reset then
|
||
global.day = 0 -- start from 0 for new game, it's maximum value
|
||
-- settings.global['nb_reset'].value = false -- not available
|
||
end
|
||
end
|
||
|
||
script.on_event(defines.events.on_runtime_mod_setting_changed, function(event)
|
||
update_settings ()
|
||
end)
|
||
|
||
script.on_configuration_changed(function(data)
|
||
update_settings ()
|
||
end)
|
||
|
||
script.on_init(function(data)
|
||
update_settings ()
|
||
end)
|
||
|
||
-- on_nth_tick(tick, f)
|
||
-- Register a handler to run on nth tick(s).
|
||
|
||
-- Parameters
|
||
-- tick :: uint or array of uint: The nth-tick(s) to invoke the handler on. Passing nil will unregister all nth-tick handlers.
|
||
-- f :: function(NthTickEvent): The handler to run. Passing nil will unregister the handler for the provided ticks.
|
||
|
||
-- script.on_init(try_init)
|
||
-- script.on_configuration_changed(try_init)
|
||
|
||
|
||
-- script.on_event(defines.events.on_built_entity, on_built_entity)
|
||
-- script.on_event(defines.events.on_robot_built_entity, on_built_entity)
|
||
|
||
-- script.on_event(defines.events.on_tick, on_tick)
|
||
|
||
|
||
-- script.on_event(defines.events.on_player_rotated_entity, on_player_rotated_entity)
|
||
|
||
-- script.on_event(defines.events.on_player_mined_entity, on_player_mined_entity)
|
||
-- script.on_event(defines.events.on_robot_mined_entity, on_robot_mined_entity)
|
||
|
||
-- script.on_event(defines.events.on_entity_died, on_entity_died)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
-- script.on_event(defines.events.on_tick, on_tick)
|
||
-- script.on_event(defines.events.on_player_driving_changed_state, on_player_driving_changed_state)
|
||
|
||
-- script.on_load(on_load)
|
||
|
||
-- script.on_event(defines.events.on_gui_click, on_Gui_Click)
|
||
|
||
-- script.on_event(defines.events.on_pre_player_mined_item, on_pre_player_mined_item)
|
||
|
||
|
||
-- script.on_event(defines.events.on_player_created, on_player_created)
|
||
|