/
dirt31/
dirt31/bin/
#include "kernel.h"
#include "sendsys.h"
#include "weather.h"
#include "pflags.h"
#include "sflags.h"
#include "levels.h"
#include "lflags.h"
#include "locations.h"
#include "bprintf.h"

/*
 * Weather Routines.
 *
 * Current weather is defined by the value of the_world->w_weather.
 * States are:
 *	0 Sunny   1 Rain   2 Stormy   3 Snowing   4 Blizzard   5 Hailing
 */


/* If it's cold, make it snow/blizzard instead of rain/storm.
 */
static int modifwthr(int loc, int n)
{
    return (ltstflg(loc, LFL_COLD)) ? (n == 1 || n == 2 ? n + 2 : n)
                                    : (n == 3 || n == 4 ? n - 2 : n);
}


/* Determine if a player is supposed to receive a weather-message,
 * and if so, return the proper message.
 */
static char *test_func(int plr, int arg, char *msg)
{
  /* We neither use arg nor msg here but they are required by send_g_msg */

    if (!ltstflg(ploc(plr), LFL_OUTDOORS) || ststflg(plr, SFL_QUIET)) {
        return NULL;
    }

    switch (modifwthr(ploc(plr), the_world->w_weather)) {
    case sunny:    return "The sun comes out of the clouds.\n";
    case rainy:    return "It has started to rain.\n";
    case stormy:   return "Dark clouds boil across the sky "
                          "as a heavy storm breaks.\n";
    case snowing:  return "It has started to snow.\n";
    case blizzard: return "You are half blinded by drifting snow, "
                          "as a white, icy blizzard sweeps across\n"
                          "the land.\n";
    case hailing:
      if (plev(plr) >= LVL_WIZARD) {
 	           return "You watch mortals run for cover as "
	                  "golf-ball sized hailstones begin to fall.\n";
      } else {
	           return "You run for cover as golf-ball sized "
	                  "hailstones begin to fall.\n";
      }
    }
}


/* Change the world's weather-setting.
 */
static void adjust_weather(weather_type new_setting)
{
    if (the_world->w_weather != new_setting) {

        the_world->w_weather = new_setting;

        send_g_msg(DEST_ALL, test_func, 0, NULL);
    }
}



/* The sun/rain/etc... commands.
 */
void set_weather(weather_type new_setting)
{
    if (!ptstflg(mynum,PFL_WEATHER)) {
        erreval();
        return;
    }
    adjust_weather(new_setting);
}



/* Change the weather-setting regularly to a random value.
 */
void longwthr()
{
  int a;

  if (randperc() < 85 || randperc() < 95)
    return;

  a = randperc();
  if (a < 10)
      adjust_weather(hailing);
  else if (a < 50)
    adjust_weather(rainy);
  else if (a > 90)
    adjust_weather(stormy);
  else
    adjust_weather(sunny);
  return;
}


/* Return the adress of a static buffer containing "rainy" etc, for
 * a weather type.
 */ 
char *wthr_type(weather_type type)
{
  switch(type) {
  case sunny:    return "Sunny";
  case rainy:    return "Rainy";
  case stormy:   return "Stormy";
  case snowing:  return "Snowing";
  case blizzard: return "Blizzard";
  case hailing:  return "Hailing";
  default:       return "Unknown";
  }
}



/* Give a description of the weather when walking into a room.
 */
void show_weather()
{
    if (!ltstflg(ploc(mynum), LFL_OUTDOORS)) {
        return;
    }

    switch (modifwthr(ploc(mynum), the_world->w_weather)) {
    case rainy:
      if (ploc(mynum) >= LOC_BLIZZARD_STREAM &&
	  ploc(mynum) < LOC_BLIZZARD_S_PASS) {
	  bprintf("It is raining, a gentle mist of rain, which sticks to "
		  "everything around\nyou making it glisten and shine.  "
		  "High in the skies above you is a rainbow.\n");
      } else
          bprintf("It is raining.\n");
      break;
    case stormy:    bprintf("The skies are dark and stormy.\n");  break;
    case snowing:   bprintf("It is snowing.\n");  break;
    case blizzard:  bprintf("A blizzard is howling around you.\n");  break;
    case hailing:   bprintf("It is hailing.\n");
  }
}