2025-10-19 18:52:58 +02:00

323 lines
9.8 KiB
Lua

-- ====================================================================================
-- TUM.WEATHER - HANDLES THE MISSION'S WEATHER SETTINGS
-- ====================================================================================
-- ====================================================================================
TUM.weather = {}
do
local cloudPresets = {
-- "Light Scattered 1",
Preset1 = {
readableName = "Few scattered clouds (METAR: FEW/SCT 7/8)",
readableNameShort = "Light scattered",
xpBonus = 0,
},
-- "Light Scattered 2",
Preset2 = {
readableName = "Two layers few and scattered (METAR: FEW/SCT 8/10 SCT 23/24)",
readableNameShort = "Light scattered",
xpBonus = 0,
},
-- "High Scattered 1",
Preset3 = {
readableName = "Two layers scattered (METAR: SCT 8/9 FEW 21)",
readableNameShort = "High Scattered",
xpBonus = 0,
},
-- "High Scattered 2",
Preset4 = {
readableName = "Two layers scattered (METAR: SCT 8/10 FEW/SCT 24/26)",
readableNameShort = "High Scattered",
xpBonus = 0,
},
-- "Scattered 1",
Preset5 = {
readableName = "Three layers high altitude scattered (METAR: SCT 14/17 FEW 27/29 BKN 40)",
readableNameShort = "Scattered",
xpBonus = 0,
},
-- "Scattered 2",
Preset6 = {
readableName = "One layer scattered/broken (METAR: SCT/BKN 8/10 FEW 40)",
readableNameShort = "Scattered",
xpBonus = 0,
},
-- "Scattered 3",
Preset7 = {
readableName = "Two layers scattered/broken (METAR: BKN 7.5/12 SCT/BKN 21/23 SCT 40)",
readableNameShort = "Scattered",
xpBonus = 0,
},
-- "High Scattered 3",
Preset8 = {
readableName = "Two layers scattered/broken high altitude (METAR: SCT/BKN 18/20 FEW 36/38 FEW 40)",
readableNameShort = "High Scattered",
xpBonus = 0,
},
-- "Scattered 4",
Preset9 = {
readableName = "Two layers broken/scattered (METAR: BKN 7.5/10 SCT 20/22 FEW41)",
readableNameShort = "Scattered",
xpBonus = 0,
},
-- "Scattered 5",
Preset10 = {
readableName = "Two layers scattered large thick clouds (METAR: SCT/BKN 18/20 FEW36/38 FEW 40)",
readableNameShort = "Scattered",
xpBonus = 0,
},
-- "Scattered 6",
Preset11 = {
readableName = "Two layers scattered large clouds high ceiling (METAR: BKN 18/20 BKN 32/33 FEW 41)",
readableNameShort = "Scattered",
xpBonus = 0,
},
-- "Scattered 7",
Preset12 = {
readableName = "Two layers scattered large clouds high ceiling (METAR: BKN 12/14 SCT 22/23 FEW 41)",
readableNameShort = "Scattered",
xpBonus = 0,
},
-- "Broken 1",
Preset13 = {
readableName = "Two layers broken clouds (METAR: BKN 12/14 BKN 26/28 FEW 41)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Broken 2",
Preset14 = {
readableName = "Broken thick low layer with few high layers\nMETAR: BKN LYR 7/16 FEW 41)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Broken 3",
Preset15 = {
readableName = "Two layers broken large clouds (METAR: SCT/BKN 14/18 BKN 24/27 FEW 40)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Broken 4",
Preset16 = {
readableName = "Two layers broken large clouds (METAR: BKN 14/18 BKN 28/30 FEW 40)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Broken 5",
Preset17 = {
readableName = "Three layers broken/overcast (METAR: BKN/OVC LYR 7/13 20/22 32/34)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Broken 6",
Preset18 = {
readableName = "Three layers broken/overcast (METAR: BKN/OVC LYR 13/15 25/29 38/41)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Broken 7",
Preset19 = {
readableName = "Three layers overcast at low level (METAR: OVC 9/16 BKN/OVC LYR 23/24 31/33)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Broken 8",
Preset20 = {
readableName = "Three layers overcast low level (METAR: BKN/OVC 13/18 BKN 28/30 SCT FEW 38)",
readableNameShort = "Broken",
xpBonus = 0.05,
},
-- "Overcast 1",
Preset21 = {
readableName = "Overcast low level (METAR: BKN/OVC LYR 7/8 17/19)",
readableNameShort = "Overcast",
xpBonus = 0.10,
},
-- "Overcast 2",
Preset22 = {
readableName = "Overcast low level (METAR: BKN LYR 7/10 17/20)",
readableNameShort = "Overcast",
xpBonus = 0.10,
},
-- "Overcast 3",
Preset23 = {
readableName = "Three layers broken low level scattered high (METAR: BKN LYR 11/14 18/25 SCT 32/35)",
readableNameShort = "Overcast",
xpBonus = 0.10,
},
-- "Overcast 4",
Preset24 = {
readableName = "Three layers overcast (METAR: BKN/OVC 3/7 17/22 BKN 34)",
readableNameShort = "Overcast",
xpBonus = 0.10,
},
-- "Overcast 5",
Preset25 = {
readableName = "Three layers overcast (METAR: OVC LYR 12/14 22/25 40/42)",
readableNameShort = "Overcast",
xpBonus = 0.10,
},
-- "Overcast 6",
Preset26 = {
readableName = "Three layers overcast (METAR: OVC 9/15 BKN 23/25 SCT 32)",
readableNameShort = "Overcast",
xpBonus = 0.10,
},
-- "Overcast 7",
Preset27 = {
readableName = "Three layer overcast (METAR: OVC 8/15 SCT/BKN 25/26 34/36)",
readableNameShort = "Overcast",
xpBonus = 0.10,
},
-- "Overcast And Rain 1",
RainyPreset1 = {
readableName = "Overcast with rain (METAR: VIS 3-5KM RA OVC 3/15 28/30 FEW 40)",
readableNameShort = "Overcast and rain",
xpBonus = 0.25,
},
-- "Overcast And Rain 2",
RainyPreset2 = {
readableName = "Overcast with rain (METAR: VIS 1-5KM RA BKN/OVC 3/11 SCT 18/29 FEW 40)",
readableNameShort = "Overcast and rain",
xpBonus = 0.25,
},
-- "Overcast And Rain 3",
RainyPreset3 = {
readableName = "Overcast with rain (METAR: VIS 3-5KM RA OVC LYR 6/18 19/21 SCT 34)",
readableNameShort = "Overcast and rain",
xpBonus = 0.25,
},
-- "Light Rain 1",
RainyPreset4 = {
readableName = "Two layers scattered large thick clouds (METAR: SCT/BKN 18/20 FEW36/38 FEW 40)",
readableNameShort = "Light rain",
xpBonus = 0.15,
},
-- "Light Rain 2",
RainyPreset5 = {
readableName = "Three layers broken/overcast (METAR: BKN/OVC LYR 7/13 20/22 32/34)",
readableNameShort = "Light rain",
xpBonus = 0.15,
},
-- "Light Rain 3",
RainyPreset6 = {
readableName = "Three layers overcast at low level (METAR: OVC 9/16 BKN/OVC LYR 23/24 31/33)",
readableNameShort = "Light rain",
xpBonus = 0.15,
},
-- "Light Rain 4",
NEWRAINPRESET4 = {
readableName = "Two layers overcast at low level (METAR: OVC 9/16 BKN/OVC LYR 23/24 31/33)",
readableNameShort = "Light rain",
xpBonus = 0.15,
},
}
local function getWindBeaufortScale(speedInMS)
local speedInKMH = DCSEx.converter.mpsToKmph(speedInMS or Library.environment.getWindAverage())
if speedInKMH < 1 then return 0
elseif speedInKMH <= 5 then return 1
elseif speedInKMH <= 11 then return 2
elseif speedInKMH <= 19 then return 3
elseif speedInKMH <= 28 then return 4
elseif speedInKMH <= 38 then return 5
elseif speedInKMH <= 49 then return 6
elseif speedInKMH <= 61 then return 7
elseif speedInKMH <= 74 then return 8
elseif speedInKMH <= 88 then return 9
elseif speedInKMH <= 102 then return 10
elseif speedInKMH <= 117 then return 11
else return 12
end
end
function TUM.weather.getWeatherName(presetID, longForm)
presetID = presetID or env.mission.weather.clouds.preset
longForm = longForm or false
if cloudPresets[presetID] == nil then return "Unknown" end
if longForm then return cloudPresets[presetID].readableName end
return cloudPresets[presetID].readableNameShort
end
function TUM.weather.getWeatherXPModifier(presetID)
presetID = presetID or env.mission.weather.clouds.preset
if cloudPresets[presetID] == nil then return 0 end
return cloudPresets[presetID].xpBonus
end
function TUM.weather.getWindName(speedInMS)
local windBeaufort = getWindBeaufortScale(speedInMS)
if windBeaufort == 0 then return "calm"
elseif windBeaufort == 1 then return "light air"
elseif windBeaufort == 2 then return "light breeze"
elseif windBeaufort == 3 then return "gentle breeze"
elseif windBeaufort == 4 then return "moderate breeze"
elseif windBeaufort == 5 then return "fresh breeze"
elseif windBeaufort == 6 then return "strong breeze"
elseif windBeaufort == 7 then return "moderate gale"
elseif windBeaufort == 8 then return "fresh gale"
elseif windBeaufort == 9 then return "strong gale"
elseif windBeaufort == 10 then return "storm"
elseif windBeaufort == 11 then return "violent storm"
elseif windBeaufort == 12 then return "hurricane"
end
end
function TUM.weather.getWindXPModifier(speedInMS)
local windBeaufort = getWindBeaufortScale(speedInMS)
if windBeaufort == 0 then return 0.00
elseif windBeaufort == 1 then return 0.02
elseif windBeaufort == 2 then return 0.04
elseif windBeaufort == 3 then return 0.08
elseif windBeaufort == 4 then return 0.10
elseif windBeaufort == 5 then return 0.12
elseif windBeaufort == 6 then return 0.15
elseif windBeaufort == 7 then return 0.18
elseif windBeaufort == 8 then return 0.21
elseif windBeaufort == 9 then return 0.24
elseif windBeaufort == 10 then return 0.27
elseif windBeaufort == 11 then return 0.30
elseif windBeaufort == 12 then return 0.33
end
end
end