/* ************************************************************************
*  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. *
************************************************************************* */

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

#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "handler.h"
#include "interpreter.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_RISE;
        send_to_outdoor("The sun rises in the west.\n\r");
        break;
      }
      case 6 :
      {
        weather_info.sunlight = SUN_LIGHT;
        send_to_outdoor("The day has begun.\n\r");
        break;  
      }
      case 21 :
      {
        weather_info.sunlight = SUN_SET;
        send_to_outdoor(
        "The sun slowly disappears in the east.\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, snow;

  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 :
    {
      switch(number(1,3)){
        case 1:
          send_to_outdoor( "It starts to snow.\n\r");
          break;
        case 2:
          send_to_outdoor( "It starts to rain.\n\r");
          break;
        case 3:
          send_to_outdoor( "It starts to hail.\n\r");
          break;
      }
      weather_info.sky=SKY_RAINING;
      break;
    }
    case 3 :
    {
      send_to_outdoor( "The clouds disappear.\n\r");
      weather_info.sky=SKY_CLOUDLESS;
      break;
    }
    case 4 :
    {
      switch(number(1,3)){
        case 1:
          send_to_outdoor( "Lightning starts to show in the sky.\n\r");
          break;
        case 2:
          send_to_outdoor("Dark snow clouds roll in from the north.\n\r");
          break;
        case 3:
          send_to_outdoor("Huge, dark cumulonimbus clouds cover the sky.\n\r");
          break;
      }
      weather_info.sky=SKY_LIGHTNING;
      break;
    }
    case 5 :
    {
      send_to_outdoor( "The snow has stopped.\n\r");
      weather_info.sky=SKY_CLOUDY;
      break;
    }
    case 6 :
    {
      switch(number(1,3)){
        case 1:
          send_to_outdoor( "The lightning has stopped.\n\r");
          break;
        case 2:
          send_to_outdoor( "The snow has almost stopped.\n\r");
          break;
        case 3:
          send_to_outdoor("Light, alto-stratus clouds cover the sky.\n\r");
          break;
      }
      weather_info.sky=SKY_RAINING;
      break;
    }
    default : break;
  }
}