From ba63c5b9cdc0831534d735f089d86604761912dd Mon Sep 17 00:00:00 2001 From: Ambroise Garel <47314805+akaAgar@users.noreply.github.com> Date: Mon, 28 Jul 2025 23:09:28 +0200 Subject: [PATCH] Added Library.environment table --- Script/Library/Environment.lua | 277 +++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 Script/Library/Environment.lua diff --git a/Script/Library/Environment.lua b/Script/Library/Environment.lua new file mode 100644 index 0000000..30b2506 --- /dev/null +++ b/Script/Library/Environment.lua @@ -0,0 +1,277 @@ +Library.environment = {} + +Library.environment.windAmount = { + CALM = 1, + LIGHT_BREEZE = 2, + MODERATE_BREEZE = 3, + STRONG_BREEZE = 4, + GALE = 5, + STORM = 6 +} + +do + local DAYTIME_TABLE = { + ["Afghanistan"] = { + { 05 * 60 + 31, 18 * 60 + 33 }, + { 05 * 60 + 14, 19 * 60 + 00 }, + { 04 * 60 + 40, 19 * 60 + 24 }, + { 03 * 60 + 53, 19 * 60 + 54 }, + { 03 * 60 + 12, 20 * 60 + 27 }, + { 02 * 60 + 54, 20 * 60 + 53 }, + { 03 * 60 + 09, 20 * 60 + 48 }, + { 03 * 60 + 42, 20 * 60 + 12 }, + { 04 * 60 + 11, 19 * 60 + 24 }, + { 04 * 60 + 35, 18 * 60 + 42 }, + { 04 * 60 + 59, 18 * 60 + 15 }, + { 05 * 60 + 22, 18 * 60 + 14 }, + }, + ["Caucasus"] = { + { 08 * 60 + 26, 17 * 60 + 57 }, + { 07 * 60 + 49, 18 * 60 + 30 }, + { 07 * 60 + 14, 19 * 60 + 01 }, + { 07 * 60 + 30, 19 * 60 + 34 }, + { 06 * 60 + 35, 20 * 60 + 06 }, + { 05 * 60 + 33, 20 * 60 + 40 }, + { 06 * 60 + 06, 20 * 60 + 18 }, + { 06 * 60 + 39, 19 * 60 + 45 }, + { 07 * 60 + 11, 19 * 60 + 13 }, + { 08 * 60 + 02, 18 * 60 + 40 }, + { 08 * 60 + 17, 18 * 60 + 07 }, + { 08 * 60 + 39, 17 * 60 + 45 }, + }, + ["Falklands"] = { + { 04 * 60 + 42, 20 * 60 + 48 }, + { 05 * 60 + 32, 19 * 60 + 54 }, + { 06 * 60 + 24, 18 * 60 + 43 }, + { 07 * 60 + 18, 17 * 60 + 40 }, + { 08 * 60 + 08, 16 * 60 + 57 }, + { 08 * 60 + 51, 16 * 60 + 56 }, + { 09 * 60 + 04, 17 * 60 + 31 }, + { 08 * 60 + 33, 18 * 60 + 19 }, + { 07 * 60 + 33, 19 * 60 + 07 }, + { 06 * 60 + 24, 20 * 60 + 01 }, + { 05 * 60 + 17, 20 * 60 + 53 }, + { 04 * 60 + 36, 21 * 60 + 17 }, + }, + ["GermanyCW"] = { + { 08 * 60 + 09, 16 * 60 + 25 }, + { 07 * 60 + 22, 17 * 60 + 19 }, + { 06 * 60 + 20, 18 * 60 + 11 }, + { 06 * 60 + 08, 20 * 60 + 05 }, + { 05 * 60 + 10, 20 * 60 + 56 }, + { 04 * 60 + 42, 21 * 60 + 31 }, + { 05 * 60 + 02, 21 * 60 + 22 }, + { 05 * 60 + 49, 20 * 60 + 31 }, + { 06 * 60 + 40, 19 * 60 + 21 }, + { 07 * 60 + 32, 18 * 60 + 11 }, + { 07 * 60 + 28, 16 * 60 + 13 }, + { 08 * 60 + 11, 15 * 60 + 52 }, + }, + ["Iraq"] = { + { 07 * 60 + 06, 17 * 60 + 33 }, + { 06 * 60 + 58, 17 * 60 + 58 }, + { 06 * 60 + 30, 18 * 60 + 21 }, + { 05 * 60 + 50, 18 * 60 + 44 }, + { 05 * 60 + 14, 19 * 60 + 06 }, + { 04 * 60 + 53, 19 * 60 + 15 }, + { 04 * 60 + 56, 19 * 60 + 03 }, + { 05 * 60 + 15, 18 * 60 + 28 }, + { 05 * 60 + 36, 17 * 60 + 48 }, + { 05 * 60 + 56, 17 * 60 + 11 }, + { 06 * 60 + 20, 16 * 60 + 54 }, + { 06 * 60 + 47, 17 * 60 + 04 }, + }, + ["Kola"] = { + { 11 * 60 + 52, 14 * 60 + 02 }, + { 09 * 60 + 15, 16 * 60 + 50 }, + { 07 * 60 + 07, 18 * 60 + 47 }, + { 04 * 60 + 49, 20 * 60 + 48 }, + { 02 * 60 + 10, 23 * 60 + 24 }, + { 00 * 60 + 00, 23 * 60 + 59 }, + { 00 * 60 + 00, 23 * 60 + 59 }, + { 03 * 60 + 59, 21 * 60 + 41 }, + { 06 * 60 + 03, 19 * 60 + 19 }, + { 07 * 60 + 56, 17 * 60 + 08 }, + { 10 * 60 + 16, 14 * 60 + 47 }, + { 12 * 60 + 00, 13 * 60 + 01 }, + }, + ["MarianaIslands"] = { + { 07 * 60 + 10, 16 * 60 + 15 }, + { 06 * 60 + 50, 16 * 60 + 45 }, + { 06 * 60 + 13, 17 * 60 + 11 }, + { 05 * 60 + 31, 19 * 60 + 35 }, + { 05 * 60 + 00, 19 * 60 + 59 }, + { 04 * 60 + 49, 20 * 60 + 18 }, + { 05 * 60 + 31, 20 * 60 + 17 }, + { 05 * 60 + 24, 19 * 60 + 51 }, + { 05 * 60 + 46, 19 * 60 + 10 }, + { 06 * 60 + 09, 18 * 60 + 28 }, + { 06 * 60 + 37, 15 * 60 + 58 }, + { 07 * 60 + 03, 15 * 60 + 54 }, + }, + ["MarianaIslandsWWII"] = { + { 07 * 60 + 10, 16 * 60 + 15 }, + { 06 * 60 + 50, 16 * 60 + 45 }, + { 06 * 60 + 13, 17 * 60 + 11 }, + { 05 * 60 + 31, 19 * 60 + 35 }, + { 05 * 60 + 00, 19 * 60 + 59 }, + { 04 * 60 + 49, 20 * 60 + 18 }, + { 05 * 60 + 31, 20 * 60 + 17 }, + { 05 * 60 + 24, 19 * 60 + 51 }, + { 05 * 60 + 46, 19 * 60 + 10 }, + { 06 * 60 + 09, 18 * 60 + 28 }, + { 06 * 60 + 37, 15 * 60 + 58 }, + { 07 * 60 + 03, 15 * 60 + 54 }, + }, + ["Nevada"] = { + { 07 * 60 + 21, 16 * 60 + 19 }, + { 06 * 60 + 58, 16 * 60 + 51 }, + { 06 * 60 + 21, 17 * 60 + 18 }, + { 06 * 60 + 37, 18 * 60 + 44 }, + { 06 * 60 + 04, 19 * 60 + 10 }, + { 05 * 60 + 53, 19 * 60 + 29 }, + { 06 * 60 + 05, 19 * 60 + 27 }, + { 06 * 60 + 29, 19 * 60 + 00 }, + { 06 * 60 + 53, 18 * 60 + 17 }, + { 07 * 60 + 28, 17 * 60 + 34 }, + { 06 * 60 + 47, 16 * 60 + 02 }, + { 07 * 60 + 14, 15 * 60 + 58 }, + }, + ["Normandy"] = { + { 09 * 60 + 23, 17 * 60 + 01 }, + { 08 * 60 + 43, 17 * 60 + 52 }, + { 07 * 60 + 48, 18 * 60 + 37 }, + { 06 * 60 + 43, 19 * 60 + 24 }, + { 05 * 60 + 50, 20 * 60 + 09 }, + { 05 * 60 + 26, 20 * 60 + 40 }, + { 05 * 60 + 42, 20 * 60 + 34 }, + { 06 * 60 + 23, 19 * 60 + 51 }, + { 07 * 60 + 08, 18 * 60 + 48 }, + { 07 * 60 + 53, 17 * 60 + 44 }, + { 08 * 60 + 42, 16 * 60 + 52 }, + { 09 * 60 + 21, 16 * 60 + 34 }, + }, + ["PersianGulf"] = { + { 07 * 60 + 34, 17 * 60 + 17 }, + { 07 * 60 + 22, 17 * 60 + 39 }, + { 06 * 60 + 55, 17 * 60 + 55 }, + { 06 * 60 + 23, 18 * 60 + 09 }, + { 06 * 60 + 01, 18 * 60 + 25 }, + { 05 * 60 + 55, 18 * 60 + 39 }, + { 06 * 60 + 05, 18 * 60 + 40 }, + { 06 * 60 + 20, 18 * 60 + 21 }, + { 06 * 60 + 32, 17 * 60 + 50 }, + { 06 * 60 + 45, 17 * 60 + 19 }, + { 07 * 60 + 04, 16 * 60 + 58 }, + { 07 * 60 + 25, 16 * 60 + 58 }, + }, + ["SinaiMap"] = { + { 07 * 60 + 10, 16 * 60 + 15 }, + { 06 * 60 + 50, 16 * 60 + 45 }, + { 06 * 60 + 13, 17 * 60 + 11 }, + { 05 * 60 + 31, 19 * 60 + 35 }, + { 05 * 60 + 00, 19 * 60 + 59 }, + { 04 * 60 + 49, 20 * 60 + 18 }, + { 05 * 60 + 31, 20 * 60 + 17 }, + { 05 * 60 + 24, 19 * 60 + 51 }, + { 05 * 60 + 46, 19 * 60 + 10 }, + { 06 * 60 + 09, 18 * 60 + 28 }, + { 06 * 60 + 37, 15 * 60 + 58 }, + { 07 * 60 + 03, 15 * 60 + 54 }, + }, + ["Syria"] = { + { 07 * 60 + 10, 16 * 60 + 15 }, + { 06 * 60 + 50, 16 * 60 + 45 }, + { 06 * 60 + 13, 17 * 60 + 11 }, + { 05 * 60 + 31, 19 * 60 + 35 }, + { 05 * 60 + 00, 19 * 60 + 59 }, + { 04 * 60 + 49, 20 * 60 + 18 }, + { 05 * 60 + 31, 20 * 60 + 17 }, + { 05 * 60 + 24, 19 * 60 + 51 }, + { 05 * 60 + 46, 19 * 60 + 10 }, + { 06 * 60 + 09, 18 * 60 + 28 }, + { 06 * 60 + 37, 15 * 60 + 58 }, + { 07 * 60 + 03, 15 * 60 + 54 }, + }, + ["TheChannel"] = { + { 09 * 60 + 23, 17 * 60 + 01 }, + { 08 * 60 + 43, 17 * 60 + 52 }, + { 07 * 60 + 48, 18 * 60 + 37 }, + { 06 * 60 + 43, 19 * 60 + 24 }, + { 05 * 60 + 50, 20 * 60 + 09 }, + { 05 * 60 + 26, 20 * 60 + 40 }, + { 05 * 60 + 42, 20 * 60 + 34 }, + { 06 * 60 + 23, 19 * 60 + 51 }, + { 07 * 60 + 08, 18 * 60 + 48 }, + { 07 * 60 + 53, 17 * 60 + 44 }, + { 08 * 60 + 42, 16 * 60 + 52 }, + { 09 * 60 + 21, 16 * 60 + 34 }, + } + } + + function Library.environment.getDayTime(monthIndex, sunset) + monthIndex = DCSEx.math.clamp(monthIndex or env.mission.date.Month, 1, 12) + sunset = sunset or false + + if not env or not env.mission or not env.mission.theatre then return 0 end + if not DAYTIME_TABLE[env.mission.theatre] then return 0 end + + local sunIndex = 1 + if sunset then sunIndex = 2 end + + return DAYTIME_TABLE[env.mission.theatre][monthIndex][sunIndex] * 60 + end + + function Library.environment.isItNightTime(timeOfDayInSeconds) + if not env or not env.mission or not env.mission.theatre then return false end + if not DAYTIME_TABLE[env.mission.theatre] then return false end + + timeOfDayInSeconds = math.max(0, timeOfDayInSeconds or timer.getAbsTime()) + + if timeOfDayInSeconds > 86400 then + while timeOfDayInSeconds > 86400 do + timeOfDayInSeconds = timeOfDayInSeconds - 86400 + end + end + + local sunriseTime = Library.environment.getDayTime(nil, false) + local sunsetTime = Library.environment.getDayTime(nil, true) + + return timeOfDayInSeconds < sunriseTime or timeOfDayInSeconds > sunsetTime + end + + function Library.environment.getWindLevel() + local windSpeed = 0 + local windSpeedValuesCount = 0 + + if not env or not env.mission or not env.mission.weather or not env.mission.weather.wind then + return Library.environment.windAmount.CALM + end + + for _,v in ipairs({"at8000", "atGround", "at2000"}) do + if env.mission.weather.wind[v] and env.mission.weather.wind[v].speed then + windSpeed = windSpeed + env.mission.weather.wind[v].speed + windSpeedValuesCount = windSpeedValuesCount + 1 + end + end + + if windSpeedValuesCount == 0 then + return Library.environment.windAmount.CALM + end + + windSpeed = windSpeed / windSpeedValuesCount + if windSpeed < 1 then + return Library.environment.windAmount.CALM + elseif windSpeed < 4 then + return Library.environment.windAmount.LIGHT_BREEZE + elseif windSpeed < 8 then + return Library.environment.windAmount.MODERATE_BREEZE + elseif windSpeed < 14 then + return Library.environment.windAmount.STRONG_BREEZE + elseif windSpeed < 21 then + return Library.environment.windAmount.GALE + else + return Library.environment.windAmount.STORM + end + end +end \ No newline at end of file