From 3a57b477de9b36c9ae76080fbde5f7d4c1068474 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Wed, 21 Jan 2015 02:12:57 -0300 Subject: [PATCH] weather: replace agm's seasonal by cse's monthly temperatures --- addons/weather/CfgWorlds.hpp | 18 +++-- addons/weather/XEH_postInit.sqf | 28 +++++-- addons/weather/XEH_preInit.sqf | 18 +---- addons/weather/functions/fnc_getMapData.sqf | 88 +++++++++++++++++++++ 4 files changed, 124 insertions(+), 28 deletions(-) create mode 100644 addons/weather/functions/fnc_getMapData.sqf diff --git a/addons/weather/CfgWorlds.hpp b/addons/weather/CfgWorlds.hpp index 3474ccde6c..985acc59e9 100644 --- a/addons/weather/CfgWorlds.hpp +++ b/addons/weather/CfgWorlds.hpp @@ -2,16 +2,18 @@ class CfgWorlds { class CAWorld; class Stratis: CAWorld { - AGM_TempMeanJan = 7.4; - AGM_TempMeanJul = 25.9; - AGM_TempAmplitudeJan = 6.4; - AGM_TempAmplitudeJul = 9.2; + // Source: http://www.iten-online.ch/klima/europa/griechenland/limnos.htm + ACE_TempDay = {10, 10, 12, 16, 21, 26, 29, 28, 25, 20, 15, 11}; + ACE_TempNight = {4, 4, 6, 8, 13, 17, 20, 20, 16, 12, 8, 6}; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Limnos,Greece + ACE_Humidity = {78, 77, 78, 74, 71, 60, 59, 61, 65, 72, 79, 80}; }; class Altis: CAWorld { - AGM_TempMeanJan = 7.4; - AGM_TempMeanJul = 25.9; - AGM_TempAmplitudeJan = 6.4; - AGM_TempAmplitudeJul = 9.2; + // Source: http://www.iten-online.ch/klima/europa/griechenland/limnos.htm + ACE_TempDay = {10, 10, 12, 16, 21, 26, 29, 28, 25, 20, 15, 11}; + ACE_TempNight = {4, 4, 6, 8, 13, 17, 20, 20, 16, 12, 8, 6}; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Limnos,Greece + ACE_Humidity = {78, 77, 78, 74, 71, 60, 59, 61, 65, 72, 79, 80}; }; }; diff --git a/addons/weather/XEH_postInit.sqf b/addons/weather/XEH_postInit.sqf index 2abc1e1477..b2302d34b9 100644 --- a/addons/weather/XEH_postInit.sqf +++ b/addons/weather/XEH_postInit.sqf @@ -46,13 +46,31 @@ _fnc_updateRain = { // Update Temperature _fnc_updateTemperature = { - _annualCoef = 0.5 - 0.5 * cos(360 * dateToNumber date); - _dailyTempMean = GVAR(TempMeanJan) * (1 - _annualCoef) + GVAR(TempMeanJul) * _annualCoef; - _dailyTempAmplitude = GVAR(TempAmplitudeJan) * (1 - _annualCoef) + GVAR(TempAmplitudeJul) * _annualCoef; + _time = daytime; + _month = date select 1; + // Temperature _hourlyCoef = -0.5 * sin(360 * ((3 + (date select 3))/24 + (date select 4)/1440)); - GVAR(currentTemperature) = _dailyTempMean + _hourlyCoef * _dailyTempAmplitude - 2 * humidity - 4 * overcast; + GVAR(currentTemperature) = (GVAR(TempDay) select (_month - 1)) * (1 - _hourlyCoef) + (GVAR(TempNight) select (_month - 1)) * _hourlyCoef; + GVAR(currentTemperature) = GVAR(currentTemperature) + GVAR(currentTemperature) - 2 * humidity - 4 * overcast; + GVAR(currentTemperature) = round(GVAR(currentTemperature) * 10) / 10; + + // Humidity + GVAR(currentHumidity) = (GVAR(Humidity) select _month) / 100; + GVAR(currentHumidity) = GVAR(currentHumidity) + + if (rain > 0 && overcast > 0.7) then { + GVAR(currentHumidity) = 1; + } else { + _avgTemperature = ((GVAR(TempDay) select (_month - 1)) + (GVAR(TempNight) select (_month - 1))) / 2; + _pS1 = 6.112 * exp((17.62 * _avgTemperature) / (243.12 + _avgTemperature)); + _PS2 = 6.112 * exp((17.62 * GVAR(currentTemperature)) / (243.12 + GVAR(currentTemperature))); + GVAR(currentHumidity) = GVAR(currentHumidity) * _PS1 / _PS2; + }; + GVAR(currentHumidity) = 0 max GVAR(currentHumidity) min 1; + + // @todo: take altitude and humidity into account GVAR(currentRelativeDensity) = (273.15 + 20) / (273.15 + GVAR(currentTemperature)); }; -[_fnc_updateTemperature, 20, []] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +[_fnc_updateTemperature, 20, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/weather/XEH_preInit.sqf b/addons/weather/XEH_preInit.sqf index 59edf3f367..f542c522f3 100644 --- a/addons/weather/XEH_preInit.sqf +++ b/addons/weather/XEH_preInit.sqf @@ -5,6 +5,7 @@ ADDON = false; LOG(MSG_INIT); PREP(serverController); +PREP(getMapData); PREP(getWind); @@ -38,20 +39,7 @@ GVAR(wind_major_period_count) = 0; GVAR(wind_total_time) = 0; GVAR(wind_period_start_time) = time; -// Temperature variables -if (isNumber (configFile >> "CfgWorlds" >> worldName >> "AGM_TempMeanJan")) then { - GVAR(TempMeanJan) = getNumber (configFile >> "CfgWorlds" >> worldName >> "ACE_TempMeanJan"); - GVAR(TempMeanJul) = getNumber (configFile >> "CfgWorlds" >> worldName >> "ACE_TempMeanJul"); - GVAR(TempAmplitudeJan) = getNumber (configFile >> "CfgWorlds" >> worldName >> "ACE_TempAmplitudeJan"); - GVAR(TempAmplitudeJul) = getNumber (configFile >> "CfgWorlds" >> worldName >> "ACE_TempAmplitudeJul"); -} else { - _lat = - getNumber (configFile >> "CfgWorlds" >> worldName >> "latitude"); - if (_lat == 0) then {_lat = 0.1;}; - _yearlyTempMean = 28 min (28 - (abs(_lat) - 23.5) * (3.14159/180) * 6371 / 145); - GVAR(TempMeanJan) = _yearlyTempMean - _lat / abs(_lat) * ((abs(_lat) max 25) - 25) * 30 / 65; - GVAR(TempMeanJul) = _yearlyTempMean + _lat / abs(_lat) * ((abs(_lat) max 25) - 25) * 30 / 65; - GVAR(TempAmplitudeJan) = 10; - GVAR(TempAmplitudeJul) = 10; -}; +// Init weather variables, in case they are needed before postInit +call FUNC(getMapData); ADDON = true; diff --git a/addons/weather/functions/fnc_getMapData.sqf b/addons/weather/functions/fnc_getMapData.sqf new file mode 100644 index 0000000000..c610b07f59 --- /dev/null +++ b/addons/weather/functions/fnc_getMapData.sqf @@ -0,0 +1,88 @@ +/* + * Author: Ruthberg, CAA-Picard + * + * Get the weather data for the current map + * + * Argument: + * None + * + * Return value: + * None + */ +#include "script_component.hpp" + +// Check if the weather data is defined in the map config +if (isArray (configFile >> "CfgWorlds" >> worldName >> "ACE_TempDay")) exitWith { + GVAR(TempDay) = getArray (configFile >> "CfgWorlds" >> worldName >> "ACE_TempDay"); + GVAR(TempNight) = getArray (configFile >> "CfgWorlds" >> worldName >> "ACE_TempNight"); + GVAR(Humidity) = getArray (configFile >> "CfgWorlds" >> worldName >> "ACE_Humidity"); +}; + +// Check if the map is among the most popular +if (toLower worldName in ["chernarus", "bootcamp_acr", "woodland_acr", "utes"]) then { + // Source: http://www.iten-online.ch/klima/europa/tschechien/prag.htm + GVAR(TempDay) = [1, 3, 9, 14, 19, 23, 25, 24, 21, 13, 7, 2]; + GVAR(TempNight) = [-4, -3, 0, 4, 9, 12, 14, 14, 10, 6, 2, -2]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Prague,Czech-Republic + GVAR(Humidity) = [82, 80, 78, 70, 71, 72, 70, 73, 78, 80, 83, 82]; +}; + +if (toLower worldName in ["takistan", "zargabad", "mountains_acr", "shapur_baf", "provinggrounds_pmc"]) exitWith { + // Source: http://www.iten-online.ch/klima/asien/afghanistan/kabul.htm + GVAR(TempDay) = [4.5, 5.5, 12.5, 19.2, 24.4, 30.2, 32.1, 32, 28.5, 22.4, 15, 8.3]; + GVAR(TempNight) = [-7.1, -5.7, 0.7, 6, 8.8, 12.4, 15.3, 14.3, 9.4, 3.9, -1.2, -4.7]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Kabul,Afghanistan + GVAR(Humidity) = [68, 69, 62, 60, 49, 37, 38, 39, 40, 41, 56, 61]; +}; + +if (toLower worldName in ["fallujah"]) exitWith { + // Source: http://www.iten-online.ch/klima/asien/irak/bagdad.htm + GVAR(TempDay) = [16, 19, 23, 29, 36, 41, 43, 43, 40, 33, 24, 17]; + GVAR(TempNight) = [4, 6, 10, 15, 20, 23, 25, 25, 21, 16, 10, 5]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Bagdad,Iraq + GVAR(Humidity) = [69, 60, 55, 50, 36, 23, 21, 22, 29, 38, 58, 68]; +}; + +if (toLower worldName in ["fata", "Abbottabad"]) exitWith { + // Source: http://www.iten-online.ch/klima/asien/pakistan/zhob.htm + GVAR(TempDay) = [12.4, 15.8, 20.8, 26.9, 32.8, 37, 36.8, 35.9, 33.8, 28.2, 22.2, 16.2]; + GVAR(TempNight) = [-0.6, 2.4, 7.4, 13.1, 18.2, 22.8, 23.8, 22.9, 19.2, 12, 5.6, 1.2]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Zhob,Pakistan + GVAR(Humidity) = [50, 40, 42, 40, 30, 30, 50, 49, 40, 32, 38, 41]; +}; + +if (worldName in ["sfp_wamako"]) exitWith { + // Source: http://www.iten-online.ch/klima/afrika/niger/tahoua.htm + GVAR(TempDay) = [33.4, 35, 38.4, 41.5, 41.4, 40, 35.6, 32.9, 35.8, 38.2, 36.4, 33.1]; + GVAR(TempNight) = [14.9, 16.3, 20.4, 23.7, 25.8, 24.8, 23.1, 22, 22.6, 21.6, 18.6, 15.3]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Tahoua,Niger + GVAR(Humidity) = [68, 60, 57, 50, 32, 22, 20, 21, 25, 38, 58, 69]; +}; + +if (worldName in ["sfp_sturko"]) exitWith { + // Source: http://www.iten-online.ch/klima/afrika/niger/tahoua.htm + GVAR(TempDay) = [2.2, 2.4, 5.1, 10.2, 16.1, 20.1, 21.1, 20.9, 17.2, 12.7, 7.4, 3.9]; + GVAR(TempNight) = [-2, -2.3, -0.7, 2.6, 7.1, 11.4, 13.1, 12.7, 10, 6.9, 3.1, -0.1]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,karlskrona,Sweden + GVAR(Humidity) = [86, 85, 80, 72, 68, 69, 74, 77, 79, 81, 86, 88]; +}; + +if (worldName in ["Bornholm"]) exitWith { + // Source: http://www.iten-online.ch/klima/afrika/niger/tahoua.htm + GVAR(TempDay) = [1.9, 1.7, 3.8, 8.1, 14, 18.1, 19.6, 19.8, 16.2, 11.9, 7.3, 3.9]; + GVAR(TempNight) = [-1.6, -2.1, -0.7, 1.7, 6.2, 10.7, 13, 13.1, 10.6, 7.2, 3.5, 0.1]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,allinge,Denmark + GVAR(Humidity) = [85, 84, 80, 76, 69, 69, 76, 77, 79, 81, 86, 86]; +}; +if (worldName in ["Imrali"]) exitWith { + // Source: http://www.iten-online.ch/klima/europa/tuerkei/bursa.htm + GVAR(TempDay) = [9.3, 10.7, 13.6, 18.8, 23.5, 28.2, 30.3, 30.2, 27, 21.4, 16.5, 11.8]; + GVAR(TempNight) = [1.4, 2.4, 3.7, 7.1, 10.9, 14.3, 16.5, 16.3, 13, 9.5, 6, 3.8]; + // Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Bursa,Turkey + GVAR(Humidity) = [78, 75, 70, 70, 71, 61, 58, 59, 63, 69, 77, 76]; +}; + +// Assume default values +GVAR(TempDay) = [1, 3, 9, 14, 19, 23, 25, 24, 21, 13, 7, 2]; +GVAR(TempNight) = [-4, -3, 0, 4, 9, 12, 14, 14, 10, 6, 2, -2]; +GVAR(Humidity) = [82, 80, 78, 70, 71, 72, 70, 73, 78, 80, 83, 82];