Jump to content
Sign in to follow this  
tortuosit

Dynamic weather script and addon: tort_DynamicWeather

Recommended Posts

Sorry to hear that.

To be honest it sounds like you're suffering RAM problems.

Very annoying but easy to diagnose and fix.

Rip out your old RAM, stuff in a couple of new sticks and see if the BSODs continue.

Troubleshooting is simply a process of elimination.

The trick is knowing where to start.

Share this post


Link to post
Share on other sites

Another thing is that PSU is getting broken. It can start to do all kinds of things. My parents computer couldn't get out from the sleep mode and after a while PSU was broken because the whole computer didn't even start anymore. My PSU got also some issues starting. Random BSOD, freezing or restarts but pretty much only when playing a normal demanding game. I changed the PSU and everything is fine now but the PSU still works with lower power PC. 2 PSUs under 2 months in the same house got broken :D

Share this post


Link to post
Share on other sites

Too bad.

Must be that new nuclear reactor from France ;)

Share this post


Link to post
Share on other sites

PSU is also my first candidate - because sometimes the computer turned off... 3 seconds, then turned on again. Easy thing in theory. Will be a nightmare to replace it because my computer is full, cooling stuff etc. and everything is fixed and connected..., I will have to take all stuff out. I do not feel any pleasure in computer surgeons --- like I did in the past :)

Share this post


Link to post
Share on other sites

Check the Voltage Lanes in bios for your PSU, they should be there where other voltages are shown in bios. Important are following: +3,3V / +5V / +12V / +5V Standby

Check those lanes, they should be all a bit over the requested voltage. If you cant find it in bios you can use the tool Aida tzo make them readable, in Aida u find those Voltagres in the "Sensor" category. Wish you luck, hope you can work soon on this mod, i still using it at every hour playing Arma3

Share this post


Link to post
Share on other sites

Reworked wind part of the script today (I rework the whole thing), made the wind (strength 0-12.9 Beaufort / direction 0-360) more precise and modular. Via menu or script command line you can define ranges for both and it will move into those ranges and then move inside them. Speed of movement is via a turbulence factor [0..1] and as for the wind strength there is a weighting factor [-1..1] for the randomness of movement; with 0 = even distribution, 0.5 = 75% chance of more wind, -0.5 = 75% chance of less wind... you get the idea. Will use those args in all weather parts, i.e.: init values, range, turbulence, weighting.

So as an example for the wind you can tell the script/mod to create wind between 340 and 20 degrees and between 0 and 2 Bft and it will stay there. Will be useful for snipers I think.

Edited by tortuosit

Share this post


Link to post
Share on other sites

Nice, just written in your other thread :)

Did you have some fresh data for me? I am close to start up Arma3 with your optimized settings :)

Share this post


Link to post
Share on other sites

Haha, no it is too bleeding edge and inconsistent, but I will upload something end of the week... Also first computer freezes happened again, I really need to sort this out :(

Share this post


Link to post
Share on other sites

Sorry, delay due to massive computer problems, cannot play ArmA. Mid next week I get a new PFC and I HOPE to sort things out then.

Share this post


Link to post
Share on other sites

Usually after some play time I'm getting on screen and in the RPT such error log just before some your logs:

18:30:56 Warning Message: Script @tort_DynamicWeather\script\tort_rainthread.sqf not found

18:30:56 Warning Message: Script @tort_DynamicWeather\script\tort_windthread.sqf not found

18:30:56 "TORT_DYNAMICWEATHER[ARGS] [[-0.75,-0.1,-0.7,-1], freeCycle, [0.08,0.1], [0.1,0.35], [0,1,0,0.25,0,1,0,1], 0, 0]"

18:30:56 "TORT_DYNAMICWEATHER[sEED#998237][iNITWEATHER] OC:0.24 FOG:[0.06,0.05,75.82] WSTR:0.42 WDIR:118.392 POS:[4202.04,21031.5,0.00183105]"

Share this post


Link to post
Share on other sites
Usually after some play time I'm getting on screen and in the RPT such error log just before some your logs:

Getting scalar error in weather info on the line relating to WGU........:confused: After setting a preset or something it goes away! ;)

Share this post


Link to post
Share on other sites

Law and Rydy, I guess you use a dev version which I posted here in the thread. In the dev_builds, I re-decided about variables and their names every version :D... I'm in the process of completely rebuilding the mod, but as I wrote, almost no progress due to my computer problems and ArmA absence.

Please use the last stable version (the URLs in first post). 1.3.3 should be the last one. Especially if you use my mod with serious gaming (longer missions for instance).

Received my PSU today and I really hope it solves my problems. I've set up a heavy ArmA mission with tpw_skirmish and mcc... and let AI play on ~10 fps, I hope no crashes appear. If not, I can be safe after a few days of testing... I really feel the need to play a Pilgrimage mission again. And some easy MP things, Battle Royale or KOTH...

If it still crashes, I will stop gaming forever and go the gardening way of life... :D

---------- Post added at 14:27 ---------- Previous post was at 14:15 ----------

The concept of new weather script/mod will be (I know, there are advantages, but my decision):

- pbo as just loaders, all code is open

- all in one place, no use of userconfig folder

- every aspect (wind|rain|fog|clouds) is an independent script/pbo and can run alone

- a global script controls the independent scripts by altering global variables

- as much control via support menu as possible

- entries in support menu can be enabled/disabled via config file

Rydy, maybe do you know if sub-sub menus can be done for support menu? I once searched for it, but didn't find a way.

Edited by tortuosit

Share this post


Link to post
Share on other sites
Rydy, maybe do you know if sub-sub menus can be done for support menu?

From what I read in their docu - no. They was lazy and justified this saying like "no one should need more than 10 supports". :)

Nope, I was wrong. That was only for limited slots (why no pagination). Submenus are described under the link.

Edited by Rydygier

Share this post


Link to post
Share on other sites
Nope, I was wrong. That was only for limited slots (why no pagination). Submenus are described under the link.

I mean even one more layer deeper. But as it seems I can do nest them freely, will test.

Also I'd like to find a way to leave the menu open, depending on which entry you click. I know it is possible in 0-0 action menu, but in comms menu, not sure. BIS page does not tell about an argument here.

My computer is still running, hard stress test with Arma... I am full of hope :)

Share this post


Link to post
Share on other sites
If it still crashes, I will stop gaming forever and go the gardening way of life... :D

Lets hope it doesn't crash, for the gardening's sake! ;)

Share this post


Link to post
Share on other sites

No crash, my first ArmA MP playing since ages yesterday. Will really enjoy doing some coding again; only time is the limiting factor, plus, I admit, I am very busy in another game (Chaos Reborn). My gaming will probably end in 45% ArmA 45% Chaos 10% the rest.

Share this post


Link to post
Share on other sites

I think my computer is healed.

Complete rewrite today, will be tort_dynamicweather2. It's a new beginning. Want to keep it more simple. Stripped it down to most important things. Fancy stuff e.g. like seeded rng removed. Will take a while until it settles...

All threads have basically the same concept. Except wind, which has speed and direction in one thread. Rain has a threshold variable, i.e. you can decide to allow rain e.g. > 0.7 overcast only...

Easy to control via globals vars. No overall control script yet which does the fancy templates. Everything will be pretty easy to manually set via menu.

All scripts run standalone if needed.

Example thread (fog):

tort_fog = true;

/* tort_fog by Tortuosit
  Args: [initfog, minfog, maxfog, weighting, turbulence]
  call example: 0 = [0, 0, 0.1, -0.5, 0.1] execVM "tort_fog.sqf";
  Weighting (fractional values -1 to 1): probability for low fog. -1: go straight to lowest fog, +1 go straight to highest fog, 0=equal probability
*/

private ["_changefog", "_transitiontime", "_duration"];

// set variables
tort_fog_amount = _this select 0;
tort_fog_min = _this select 1;
tort_fog_max = _this select 2;
tort_fog_weighting = _this select 3;
tort_fog_turbulence = _this select 4;

0 setfog [tort_fog_amount, 0.001, 0];

while {tort_fog} do {
  _duration = 60 + (random 60) + 60 * (1-tort_fog_turbulence) + random (60 * (1 - tort_fog_turbulence));
  _transitiontime = (0.5 * _duration) max (random _duration);
  if ((random 1) > 0.2) then {tort_fog_amount = tort_fog_min} else {
     if ((random 1) < 0.1) then {_changefog = 0.05 + random (0.05 + 0.05 * tort_fog_turbulence)} else {_changefog = 0};
     if ((tort_fog_amount > tort_fog_min) && (tort_fog_amount < tort_fog_max)) then {
        if ((random 2) > (tort_fog_weighting + 1)) then {_changefog = 0 - _changefog};
        tort_fog_amount = tort_fog_amount + _changefog;
        if (tort_fog_amount < tort_fog_min) then {tort_fog_amount = tort_fog_min} else {if (tort_fog_amount > tort_fog_max) then {tort_fog_amount = tort_fog_max};};
     }
     else {
        if (tort_fog_amount <= tort_fog_min) then {
           _changefog = _changefog min (tort_fog_max - tort_fog_amount);
           tort_fog_amount = tort_fog_amount + _changefog;
        };
        if (tort_fog_amount >= tort_fog_max) then {
           _changefog = _changefog min (tort_fog_amount - tort_fog_min);
           tort_fog_amount = tort_fog_amount - _changefog;
        };
     };
  };
  _transitiontime setfog [tort_fog_amount, 0.001, 0];
  sleep _transitiontime;
  (_duration - _transitiontime) setfog [tort_fog_amount, 0.001, 0];
  sleep (_duration - _transitiontime);
};

tort_fog = false;

Example: Wind

tort_wind = true;

/* tort_wind by Tortuosit
  Args: [initWindStrength, initDirection ,minWindStrength, maxWindStrength, DirBetweenA, DirBetweenB, weighting, turbulence]
  call example: tort_windthread = [5, 280, 0, 8, 270, 60, 0, 0.2] execVM "\@tort_dynamicweather2\script\tort_wind.sqf";
  Wind strengths in Beaufort (0.0 - 12.9)
  Weighting (fractional values -1 to 1): probability for wind. -1: go straight to min wind, +1 go straight to max wind, 0=equal distribution
  Turbulence [0..1] for smoother or more rapid changes
  http://en.wikipedia.org/wiki/Beaufort_scale
*/

private ["_changeSpeed", "_windDir0", "_changeDir", "_duration", "_range", "_goCW", "_returnvalue"];

bft2ms = {
  switch (floor(_this select 0)) do {
     case 0:  {((_this select 0) - floor(_this select 0)) * 0.3};
     case 1:  {0.3 + ((_this select 0) - floor(_this select 0)) * 1.3};
     case 2:  {1.6 + ((_this select 0) - floor(_this select 0)) * 1.8};
     case 3:  {3.4 + ((_this select 0) - floor(_this select 0)) * 2.1};
     case 4:  {5.5 + ((_this select 0) - floor(_this select 0)) * 2.5};
     case 5:  {8.0 + ((_this select 0) - floor(_this select 0)) * 2.8};
     case 6:  {10.8 + ((_this select 0) - floor(_this select 0)) * 3.1};
     case 7:  {13.9 + ((_this select 0) - floor(_this select 0)) * 3.3};
     case 8:  {17.2 + ((_this select 0) - floor(_this select 0)) * 3.6};
     case 9:  {20.8 + ((_this select 0) - floor(_this select 0)) * 3.7};
     case 10: {24.5 + ((_this select 0) - floor(_this select 0)) * 4};
     case 11: {28.5 + ((_this select 0) - floor(_this select 0)) * 4.2};
     case 12: {32.7 + ((_this select 0) - floor(_this select 0)) * 4.4};
     default  {0};
  };
};

azinrange = {
  if ((_this select 1) > (_this select 2)) then {
     // a outside borders b..c
     if (((_this select 0) < (_this select 1)) && ((_this select 0) > (_this select 2))) then {false} else {true};
  } else {
     // a outside borders b..c
     if (((_this select 0) < (_this select 1)) || ((_this select 0) > (_this select 2))) then {false} else {true};
  };
};

// global vars, any changes from outside change script behaviour
tort_wind_speed = [_this select 0] call bft2ms;
tort_wind_dir = _this select 1;
tort_wind_speed_min = [_this select 2] call bft2ms;
tort_wind_speed_max = [_this select 3] call bft2ms;
tort_wind_dir_A = _this select 4;
tort_wind_dir_B = _this select 5;
tort_wind_weighting = _this select 6;
tort_wind_turbulence = _this select 7;

if ((random 2)<1) then {_goCw = false} else {_goCw = true};

// hint format ["min:%1 max:%2 tgt:%3 - min:%4 max:%5 curr:%6 tgt:%7 - dur:%8", tort_wind_speed_min, tort_wind_speed_max, round(tort_wind_speed*100)/100, tort_wind_dir_A, tort_wind_dir_B, round(winddir*100)/100, round(tort_wind_dir*100)/100, _duration];
setwind [(sin tort_wind_dir) * tort_wind_speed * -1, (cos tort_wind_dir) * tort_wind_speed * -1, true];

while {tort_wind} do {
  _duration = 15 - 7 * tort_wind_turbulence + random (7 * (2.1 - overcast - tort_wind_turbulence));

  // Check speed and change values
  _changeSpeed = random (1 + overcast + tort_wind_turbulence);
  if ((tort_wind_speed <= tort_wind_speed_max) && (tort_wind_speed >= tort_wind_speed_min)) then {
     if ((random 2) > (tort_wind_weighting + 1)) then {
        tort_wind_speed = tort_wind_speed - (_changeSpeed min (random(tort_wind_speed - tort_wind_speed_min)));
     } else {
        tort_wind_speed = tort_wind_speed + (_changeSpeed min (random(tort_wind_speed_max - tort_wind_speed)));
     };
  } else {
     _duration = random 4;
     if (tort_wind_speed > tort_wind_speed_max) then {
        tort_wind_speed = tort_wind_speed - (_changeSpeed min (random(tort_wind_speed - tort_wind_speed_min)));
     } else {
        tort_wind_speed = tort_wind_speed + (_changeSpeed min (random(tort_wind_speed_max - tort_wind_speed)));
     };
  };

  // Check direction and change values
  _windDir0 = (tort_wind_dir_A + 0.5 * ((tort_wind_dir_B - tort_wind_dir_A + 360) mod 360) + 360) mod 360;
  if ([tort_wind_dir, tort_wind_dir_A, tort_wind_dir_B] call azinrange) then {
     if ((random 2)<1) then {_goCw = false} else {_goCw = true};
     //if (((tort_wind_dir_B - tort_wind_dir_A) mod 360) == 0) then {_range = 360} else {_range = (tort_wind_dir_B - tort_wind_dir_A + 360) mod 360};
     _changeDir = random(3 + 15 * (overcast + tort_wind_turbulence));
     // wind is already in the desired range
     if ((random 2) > 1) then {
        tort_wind_dir = (tort_wind_dir - (_changeDir min (random((tort_wind_dir - tort_wind_dir_A + 360) mod 360))) + 360) mod 360;
     } else {
        tort_wind_dir = (tort_wind_dir + (_changeDir min (random((tort_wind_dir_B - tort_wind_dir + 360) mod 360))) + 360) mod 360;
     };
  } else {
     /* wind is outside the desired range
     _duration = 1 + random 2;
     if (_goCW) then {
        tort_wind_dir = (tort_wind_dir + random ((_windDir0 - tort_wind_dir + 360) mod 360) + 360) mod 360;
     } else {
        tort_wind_dir = (tort_wind_dir - random ((tort_wind_dir - _windDir0 + 360) mod 360) + 360) mod 360;
     };
  };

  sleep _duration;
  setwind [(sin (tort_wind_dir)) * tort_wind_speed * -1, (cos (tort_wind_dir)) * tort_wind_speed * -1, true];
};

tort_wind = false;

Edited by tortuosit

Share this post


Link to post
Share on other sites

My computer problems are back. Computer turned of while running windows, turned on automatically, turned off at BIOS level, turned on again, now I write... Will have to communicate with where I bought it. Can't see a result on the horizon, it sucks.

Share this post


Link to post
Share on other sites
My computer problems are back. Computer turned of while running windows, turned on automatically, turned off at BIOS level, turned on again, now I write... Will have to communicate with where I bought it. Can't see a result on the horizon, it sucks.

Any meaningful BSOD message?

If power issue, try changing in windows your PC power settings from performance 100% to like 80%.

Share this post


Link to post
Share on other sites

The problem is, it sometimes reboots on non windows level. Seems like it does not matter what is running. I wrote the company where I bought it, it's a case of warranty, they need to help me to replace stuff one by one.

Share this post


Link to post
Share on other sites

This sounds strange, a reboot in 3D mode can have more reasons. If you wish i could help you, i think a possible reason could be your RAM. I believe i heard a while ago that the default voltage (set over Bios) for Ram isnt enough to have a stable Gameplay. Drop me a PM if you need help, then we could check where the problems are. I do this since over 10 years, i build Computers for Companys with special requirements in this sector.

Share this post


Link to post
Share on other sites

I worked on tort_dynamicWeather2 and tell you about the state.

Basically, the following modules are called at start and run independently:

- overcast

- fog

- wind (combined speed/direction)

- rain

Modus of operation still is, weather cycles between min and max values. Global variables control the script behaviour and are exposed via menu (which I will have to "unmess" :)). You can alter them in debug window or whatever way and they will affect the script. If you create a variable with _now, this part of weather will instantly applied and variable will be destroyed afterwards.

I think the variable syntax is self-explanatory and streamlined:

GLOBAL VARIABLE NAMES:

tort_
  overcast_
  fog_
  wind_speed_
  wind_dir_
  rain_
     amount - current target value
     min - minimum amount
     max - maximimum amount
     weighting - tendency of movement direction
     turbulence - rapidness/amount of changes
     now - if you create this variable, this aspect of weather will be applied instantly (in less than 5 seconds)
tort_rain_threshold - it can only start to rain if overcast is >= threshold.

VARIABLE RANGES:

overcast|fog|rain: [0..1] (ArmA range)
wind_speed: [0..13] (Beaufort scale)
wind_dir: [0..360] (Azimuth in degrees)

weighting: [-1..1]
turbulence: [0..1]
rain_threshold [0..1]

Example:

- "tort_overcast_now = 0.85" - 0.85 overcast will be applied instantly.

- "tort_overcast_min = 0; tort_overcast_max = 0.5;" - weather will start to move slowly into that range and then stay inside it.

- "tort_winddir_min = 340; tort_winddir_max = 20;" - wind will always come from north.

- "tort_rain_weighting = -0.5" - at every next forecast, there's a 75% chance that rain will decrease (25% chance of increase)

So there are already a lot possibilities to control weather. Currently, there is no module on top to define a more global situation, like script version 1 did with templates. Such a module would basically have to change min/max values over a bigger time frame, which should not be too difficult. Also ideas like "rain followed by sun = fog" would have to be handled there...

Still keep in mind, overcast changes operate very slowly (full change from 0 to 1 in maybe at least 1h, and they are not linear), except if instant application of overcast is done, but that is not a smooth thing and will make client lag for a moment. So I do not force overcast during normal operation.

I think I will release a prototype soon.

Also I have simplified the island presets. I.e. in a configuration file you can define weather values per island, which are read at mod initialization. I think it is very self explanatory as well.

So now I am waiting for marksmen dlc in order to profit from wind control (yes I know there's Ruthbergs script). Also I am quite happy to have rain under control, because ArmA vanilla just lets it rain too often.

---------- Post added at 15:21 ---------- Previous post was at 14:16 ----------

BTW guys, I was wondering... how is your understanding about wind direction?

In my understanding (and that is what my script uses), "Wind direction 180°" means, it is COMING FROM south and BLOWING TO north. Have seen it vice versa at some point...

I.e. "direction of where wind is coming from". But people also seem to translate it to "direction where wind is going to".

Edited by tortuosit

Share this post


Link to post
Share on other sites
In my understanding (and that is what my script uses), "Wind direction 180°" means, it is COMING FROM south and BLOWING TO north.

Pointed wind direction means "from" to me/in Polish. So "North wind" is blowing from the north. Although direction in degrees may be, I guess, misleading to some, as in other cases eg compass arrow/movement direction 180 would mean rather compass arrow pointing/movement to south, unless explained otherwise. IMO that's the cause of doubts here.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
Sign in to follow this  

×