/***************************************************************************
 *  file: weather.c , Weather and time module              Part of DIKUMUD *
 *  Usage: Performing the clock and the weather                            *
 *  Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
 *                                                                         *
 *  Copyright (C) 1992, 1993 Michael Chastain, Michael Quan, Mitchell Tse  *
 *  Performance optimization and bug fixes by MERC Industries.             *
 *  You can use our stuff in any way you like whatsoever so long as this   *
 *  copyright notice remains intact.  If you like it please drop a line    *
 *  to mec@garnet.berkeley.edu.                                            *
 *                                                                         *
 *  This is free software and you are benefitting.  We hope that you       *
 *  share your changes too.  What goes around, comes around.               *
 ***************************************************************************/

#include <stdio.h>
#include <string.h>

#include "structs.h"
#include "mob.h"
#include "obj.h"
#include "utils.h"
#include "handler.h"
#include "interp.h"
#include "db.h"

/* uses */

extern struct time_info_data time_info;
extern struct weather_data weather_info;

/* In this part. */

void weather_and_time(int mode);
void another_hour(int mode);
void weather_change(void);

/* Here comes the code */

void weather_and_time(int mode)
{
    another_hour(mode);
    if(mode)
	weather_change();
}



void another_hour(int mode)
{
    time_info.hours++;

    if (mode) {
	switch (time_info.hours) {
	    case 5 :
	    {
		weather_info.sunlight = SUN_LIGHT;
		send_to_outdoor("The day has begun.\n\r");
		break;  
	    }
	    case 6 :
	    {
		weather_info.sunlight = SUN_RISE;
		send_to_outdoor("The sun rises in the east.\n\r");
		break;
	    }
	    case 21 :
	    {
		weather_info.sunlight = SUN_SET;
		send_to_outdoor(
		"The sun slowly disappears in the west.\n\r");
		break;
	    }
	    case 22 :
	    {
		weather_info.sunlight = SUN_DARK;
		send_to_outdoor("The night has begun.\n\r");
		break;
	    }
	    default : break;
	}
    }

    if (time_info.hours > 23)  /* Changed by HHS due to bug ???*/
    {
	time_info.hours -= 24;
	time_info.day++;

	if (time_info.day>34)
	{
	    time_info.day = 0;
	    time_info.month++;

	    if(time_info.month>16)
	    {
		time_info.month = 0;
		time_info.year++;
	    }
	}
    }
}

void weather_change(void)
{
    int diff, change;
    if((time_info.month>=9)&&(time_info.month<=16))
	diff=(weather_info.pressure>985 ? -2 : 2);
    else
	diff=(weather_info.pressure>1015? -2 : 2);

    weather_info.change += (dice(1,4)*diff+dice(2,6)-dice(2,6));

    weather_info.change = MIN(weather_info.change,12);
    weather_info.change = MAX(weather_info.change,-12);

    weather_info.pressure += weather_info.change;

    weather_info.pressure = MIN(weather_info.pressure,1040);
    weather_info.pressure = MAX(weather_info.pressure,960);

    change = 0;

    switch(weather_info.sky){
	case SKY_CLOUDLESS :
	{
	    if (weather_info.pressure<990)
		change = 1;
	    else if (weather_info.pressure<1010)
		if(dice(1,4)==1)
		    change = 1;
	    break;
	}
	case SKY_CLOUDY :
	{
	    if (weather_info.pressure<970)
		change = 2;
	    else if (weather_info.pressure<990)
		if(dice(1,4)==1)
		    change = 2;
		else
		    change = 0;
	    else if (weather_info.pressure>1030)
		if(dice(1,4)==1)
		    change = 3;

	    break;
	}
	case SKY_RAINING :
	{
	    if (weather_info.pressure<970)
		if(dice(1,4)==1)
		    change = 4;
		else
		    change = 0;
	    else if (weather_info.pressure>1030)
		    change = 5;
	    else if (weather_info.pressure>1010)
		if(dice(1,4)==1)
		    change = 5;

	    break;
	}
	case SKY_LIGHTNING :
	{
	    if (weather_info.pressure>1010)
		    change = 6;
	    else if (weather_info.pressure>990)
		if(dice(1,4)==1)
		    change = 6;

	    break;
	}
	default : 
	{
	    change = 0;
	    weather_info.sky=SKY_CLOUDLESS;
	    break;
	}
    }

    switch(change){
	case 0 : break;
	case 1 :
	{
	    send_to_outdoor(
	    "The sky is getting cloudy.\n\r");
	    weather_info.sky=SKY_CLOUDY;
	    break;
	}
	case 2 :
	{
	    send_to_outdoor(
	    "It starts to rain.\n\r");
	    weather_info.sky=SKY_RAINING;
	    break;
	}
	case 3 :
	{
	    send_to_outdoor(
	    "The clouds disappear.\n\r");
	    weather_info.sky=SKY_CLOUDLESS;
	    break;
	}
	case 4 :
	{
	    send_to_outdoor(
	    "Lightning starts to show in the sky.\n\r");
	    weather_info.sky=SKY_LIGHTNING;
	    break;
	}
	case 5 :
	{
	    send_to_outdoor(
	    "The rain stopped.\n\r");
	    weather_info.sky=SKY_CLOUDY;
	    break;
	}
	case 6 :
	{
	    send_to_outdoor(
	    "The lightning has stopped.\n\r");
	    weather_info.sky=SKY_RAINING;
	    break;
	}
	default : break;
    }
}