mud++0.35/etc/
mud++0.35/etc/guilds/
mud++0.35/help/propert/
mud++0.35/mudC/
mud++0.35/player/
mud++0.35/src/interface/
mud++0.35/src/os/cygwin32/
mud++0.35/src/os/win32/
mud++0.35/src/os/win32/bcppbuilder/
mud++0.35/src/osaddon/
mud++0.35/src/util/
/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@hom.net 
MUD++ development mailing list    mudpp@van.ml.org
------------------------------------------------------------------------------
env.h
*/

#ifndef _ENV_H
#define _ENV_H
#include "random.h"
#include "string.h"

// This is the environment and class which controls
// stuff like weather, time, moon status, and
// temperature.

// Currently, there is only one Environment object
// existing in the game, and it is updated every
// tick (which represents one hour in MUD time).
// A possible enhancment to this could be giving
// each continent its own weather conditions.
// (Raining in one continent, but not another)

// Stuff for time
#define HOURS_PER_DAY	23
#define DAYS_PER_MONTH  28
#define MONTHS_PER_YEAR 14

// Moon periods
#define LUNOS_PERIOD	28
#define CRONOS_PERIOD	16

// 4 seasons
#define SEASON_FALL	0
#define SEASON_WINTER	1
#define SEASON_SPRING	2
#define SEASON_SUMMER	3

// Climate types
#define SEASONAL	0	// Temp is determined by current season
#define COLD_ALL_YEAR	1	// Cold all year round, regardless of season
#define WARM_ALL_YEAR	2	// Warm all year round, regardless of season
#define HOT_ALL_YEAR	3	// Hot all year round, regardless of season

// Temperature types
#define TEMP_COOL	0
#define TEMP_COLD	1
#define TEMP_WARM	2
#define TEMP_HOT	3

// Precipitation types
#define CALM		0
#define BREEZY		1
#define WINDY		2
#define CLOUDY		3
#define RAINING		4
#define LIGHTNING	5	// This define means that there is lightning
				//  AND rain (not just lightning)
				//  For getting struck by lightning!

// Humidity types
#define HUMIDITY_LOW	0	// Very dry -- Desert
#define HUMIDITY_MEDIUM	1	// Normal
#define HUMIDITY_HIGH	2	// Very Wet -- Tropical rainfall

class Weather
{
	private:
		static Random ran;
		static const char *temps[];
		static const char *precips[];
		static const char *precips_cold[];
		int humidity_level;	// Current humidity level (0-2)
					//  (Basically, this is the chance
					//  of rain)
		int climate_type;	// The type of climate
		int current_temp;	// The current temp (0-3)
		int precipitation;	// Is it raining (or snowing)? (0-4)
		int fog;
		void updateFog();
		void sendInfo( int old_precip );
		void sendThunder();

	public:
		Weather()
		:	humidity_level(HUMIDITY_MEDIUM),
			climate_type(SEASONAL), current_temp(TEMP_WARM),
			precipitation(CALM), fog(0)
		{
		}

		void update( int );
		const String & getWeather();
		void setHumidity( int );
		void setClimate( int );
		int getPrecip();

		bool isFoggy()
		{
			return (bool)( fog );
		}

		bool isClear()
		{
			if( precipitation < CLOUDY && !isFoggy() )
				return true;

			return false;
		}
};

class Environment
{
	protected:
		static const char *seasons[];
		static const char *phases[];
		static const char *moon_status[];
		static const char *time_of_day_normal[];
		static const char *time_of_day_cloudy[];
		static Random ran;
		int hour;
		int day;
		int month;
		int year;
		int season;
		int moon1_path;
		int moon2_path;
		void updateSeason();
		void updateMoons();
		void sendInfo();

	public:
		Weather weather;		//Temporary

		Environment()
		:	hour(0), day(1), month(1), year(150),
			season(0), moon1_path(1), moon2_path(1)
		{
		}

		void update( void );
		const String & getTime( void );
		const String & getWeather( void ) { return weather.getWeather(); }
};

#endif