//******************************************************************************************
//	weather.h - This file contains the weather class header
//
//	MechCommander 2
//
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
//===========================================================================//

#ifndef WEATHER_H
#define WEATHER_H
//----------------------------------------------------------------------------------
// Include Files
#ifndef MCLIB_H
#include"mclib.h"
#endif

//----------------------------------------------------------------------------------
// Macro Definitions
#define			BASE_RAIN_UPDATE_TIME			30.0f
#define			BASE_RAIN_HEIGHT				500.0f
#define			BASE_RAIN_LENGTH				10.0f
#define			BASE_RAIN_VEL					300.0f
#define			BASE_RAIN_TILT					10.0f
#define			BASE_RAIN_LIGHT_RATE			0.01f
#define			BASE_RAIN_RANDOM_POS_FACTOR		500.0f
#define			BASE_RAIN_RANDOM_HGT_FACTOR		250.0f
#define			BASE_RAIN_RANDOM_VEL_FACTOR		10.0f
#define			BASE_RAIN_RANDOM_LEN_FACTOR		10.0f

#define			BASE_LIGHTENING_CHANCE			0.03f
#define			BASE_LIGHTENING_FALLOFF			400.0f
#define 		BASE_LIGHTENING_FLASH_AGAIN		2.0f
#define			BASE_LIGHTENING_FLASH_CHECK		1.0f
#define			BASE_THUNDER_RANDOM_START		5.0f
//----------------------------------------------------------------------------------
// Struct Definitions
typedef struct _RainDrops
{
	Stuff::Point3D		position;
	float				length;
	
	void init (void)
	{
		position.Zero();
		length = 0.0f;
	}
	
} RainDrops;

//----------------------------------------------------------------------------------
// Class Definitions
class Weather
{
	protected:
		bool			weatherActive;				//Should we even bother calling update or render?
	
		float			rainLevel;					// How bad is it raining
													// This determines probability of thunder/lightening
													// how many drops we are drawing and how dark it is.
													// Levels are:
													//		0.0f				Not raining.
													//		>0.0f - <1.0f		Threatening.  Getting darker.  Some ambient wind noise.  Distant thunder.
													//		>=1.0f - <1.2f		Drizzle.  ambient wind.  No thunder.
													//		>=1.2f - <2.0f		Raining.  Steady downpour.  Not much thunder.  Dark enough for lights.
													//		>=2.0f - <3.0f		Raining Hard.  Some lightening/thunder.  Full night conditions.
													//		>=3.0f				Storm.  Lots of thunder/lightening.  Full Night Conditions.
													
		float			lighteningLevel;			// Brightness of lightening this frame.  Effects Ambient/sun lighting.
		float			thunderTime;				// Time until crack of thunder is heard.
		DWORD			thunderSFX;					// Sound Effect of thunder to play
		float			lighteningCheck;			// Interval between checks of lightening.
		float			baseLighteningChance;		// Base chance lightening will flash at each check.
		
		DWORD			totalRainDrops;				// Total number of drops I can draw.
		DWORD			currentRainDrops;			// Current number of drops in use.
		
		RainDrops*		rainDrops;					// Pointer to data for the drops.
		
		float			rainTrend;					// Either plus 1.0f or minus 1.0f.  Based on raining more or less then it was.
		float			rainFactor;					// Increase/decrease in rainLevel per second based on rainTrend.
		float			rainLightLevel;				// Matches the rainLevel but moves slowly per frame slow light fades out.
		float			rainUpdateTime;				// Time until next RainTrend check in seconds.
		long			baseRainChance;				// Chance of it raining on any given rainUpdateTime.
		
		float			oldFog;						// Original FOGFull Height value.
		
	public:
	
		Weather (void)
		{
			init();
		}
		
		void init (void)
		{
			rainLevel = lighteningLevel = rainLightLevel = 0.0f;
			lighteningCheck = 1.0f;
			totalRainDrops = currentRainDrops = 0;
			
			rainTrend = 1.0f;
			rainFactor = 0.0f;
			rainUpdateTime = BASE_RAIN_UPDATE_TIME;
			
			baseRainChance = 0;
			
			rainDrops = NULL;
			
			thunderSFX = 0xffffffff;
			thunderTime = 0.0f;
			
			oldFog = 0.0f;
			
			weatherActive = false;
		}
		
		void destroy (void);
		
		~Weather (void)
		{
			destroy();
		}
		
		void init (DWORD maxDrops, float startingRain, float baseRainChance, float baseLighteningChance = BASE_LIGHTENING_CHANCE);
		
		void init (FitIniFilePtr missionFile);
		
		void update (void);
		
		void render (void);

		void save (FitIniFile *file);
		void load (FitIniFile *file);
};

//----------------------------------------------------------------------------------
extern Weather *weather;
//----------------------------------------------------------------------------------
#endif

