EmlenMud2005-2006LOC/
EmlenMud2005-2006LOC/world/
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "emlen.h"


void
do_anon (CHAR_DATA * ch, char *argy)
{
  DEFINE_COMMAND ("anonymous", do_anon, POSITION_DEAD, 0, LOG_NORMAL, "This command toggles whether or not your level shows up on the who list.")

    if (ch->pcdata->show_lev)
    {
      send_to_char ("Your level will not be shown in the who list from now on.\n\r", ch);
      ch->pcdata->show_lev = FALSE;
      return;
    }
  send_to_char ("Your level will now be shown in the who list for others to see.\n\r", ch);
  ch->pcdata->show_lev = TRUE;
  return;
}

void
do_levels (CHAR_DATA * ch, char *argy)
{
  int i, a, b;
  char buffr[256];
  char arg1[SML_LENGTH];
  DEFINE_COMMAND ("levels", do_levels, POSITION_DEAD, 0, LOG_NORMAL, "This command shows exp needed for the level range specified.")

    buffr[0] = '\0';
  argy = one_argy (argy, arg1);
  if (!is_number (argy) || !is_number (arg1))
    {
      send_to_char ("Syntax is \"level <min> <max>\"\n\r", ch);
      return;
    }
  a = atoi (arg1);
  b = atoi (argy);
  if (a >= b || a < 1 || a > 90 || b < 2 || b > 90)
    {
      send_to_char ("Invalid range.\n\r", ch);
      return;
    }
  for (i = a; i < b; i++)
    {
      sprintf (buffr, "Level %d Exp: %ld\n\r", i + 1, FIND_EXP (i, ch->race));
      send_to_char (buffr, ch);
    }
  return;
}


void
do_reload_help (CHAR_DATA * ch, char *argy)
{
  FILE *fp;
  char word[500];
  HELP_DATA *hnx;
  HELP_DATA *hc;
  DEFINE_COMMAND ("rld_help", do_reload_help, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "This command reloads the helpfiles from disk.")

    if ((fp = fopen ("help.are", "r")) == NULL)
    {
      send_to_char ("Unable to open the helpfile...", ch);
      return;
    }
  for (hc = help_first; hc != NULL; hc = hnx)
    {
      hnx = hc->next;
      free_string (hc->keyword);
      free_string (hc->text);
    }
  help_last = NULL;
  help_first = NULL;
  top_help = 0;
  word[0] = '\0';
  while (str_cmp ("#HELPS", word))
    strcpy (word, fread_word (fp));
  load_helps (fp);
  send_to_char ("Successfully reloaded.\n\r", ch);
  fclose (fp);
  return;
}

void
do_help (CHAR_DATA * ch, char *argy)
{
  char argall[SML_LENGTH];
  char argone[SML_LENGTH];
  HELP_DATA *pHelp;
  DEFINE_COMMAND ("help", do_help, POSITION_DEAD, 0, LOG_NORMAL, "This is the basic help command.  Syntax is 'help' or 'help <topic>'.")

    if (argy[0] == '\0')
      {
       send_to_char("Type help <word> for specific help. Typing commands will give you a list of all the commands available to you.\n\r", ch);
       return;
      }
    

/*
   * Tricky argy handling so 'help a b' doesn't match a.
 */
  argall[0] = '\0';
  while (argy[0] != '\0')
    {
      argy = one_argy (argy, argone);
      if (argall[0] != '\0')
        strcat (argall, " ");
      strcat (argall, argone);
    }
  for (pHelp = help_first; pHelp && pHelp != NULL; pHelp = pHelp->next)
    {
      if (pHelp->level > LEVEL (ch))
        continue;
      if (is_name (argall, pHelp->keyword))
        {
	  int i;
	  char hugebuf_o[30000] = "\0";
	  char buff[500] = "\0";
	  int offset = (38- (strlen(pHelp->keyword))/2);
	  if (offset > 35) offset = 35;
	  if (offset < 0) offset = 0;
          if (pHelp->level >= 0 && str_cmp (argall, "imotd"))
            {
              send_to_char ("\n\r", ch);
            }
          /*
             * Strip leading '.' to allow initial blanks.
	     */
	  strcat(hugebuf_o, "\n\r");
	  strcat(hugebuf_o, decompress("{C}[{c}+{C}]{c}---------------------------------------------------------------------{C}[{c}+{C}]{C}\n\r"));
	  for (i=0; i <offset; i++)
	    strcat(hugebuf_o, " ");

	  
	  sprintf(buff, "%s\n\r", pHelp->keyword);
	  strcat(hugebuf_o, buff);
	  strcat(hugebuf_o, decompress("{C}[{c}+{C}]{c}---------------------------------------------------------------------{C}[{c}+{C}]{C}\n\r{w}"));
	  if (pHelp->text[0] == '.')
	    strcat(hugebuf_o, (decompress (pHelp->text)));
	  else
	    strcat(hugebuf_o, (decompress (pHelp->text)));
	  page_to_char(hugebuf_o, ch);
          return;
	}
    }
  send_to_char ("No help on that word.\n\r", ch);
  return;
}
void
do_help_two (CHAR_DATA * ch, char *argy)
{
  char argall[SML_LENGTH];
  char argone[SML_LENGTH];
  char j[50];
  HELP_DATA *pHelp;

    if (argy[0] == '\0')
      {
	sprintf(j,"%c",28);
	write_to_buffer(ch->desc,j,0);
      }
    

/*
   * Tricky argy handling so 'help a b' doesn't match a.
 */
  argall[0] = '\0';
  while (argy[0] != '\0')
    {
      argy = one_argy (argy, argone);
      if (argall[0] != '\0')
        strcat (argall, " ");
      strcat (argall, argone);
    }
  for (pHelp = help_first; pHelp && pHelp != NULL; pHelp = pHelp->next)
    {
      if (pHelp->level > LEVEL (ch))
        continue;
      if (is_name (argall, pHelp->keyword))
        {
	  char hugebuf_o[30000] = "\0";
         
          /*
             * Strip leading '.' to allow initial blanks.
	     */
	  if (pHelp->text[0] == '.')
	    strcat(hugebuf_o, (decompress (pHelp->text)));
	  else
	    strcat(hugebuf_o, (decompress (pHelp->text)));
	  page_to_char(hugebuf_o, ch);
          return;
	}
    }
  send_to_char ("There is no help file for that skill or spell.\n\r", ch);
  return;
}

void
do_who (CHAR_DATA * ch, char *argy)
{
  CHAR_DATA *wch;
  int pass;
  DESCRIPTOR_DATA *d;
  int vis;
  int ii;
  int nMatch;
  bool tempbool;
  int gMatch;
  int align;
  bool namey;
  char doe[STD_LENGTH];
  bool clanny;
  bool battle;
  bool hc;
  bool alignshard;
  DEFINE_COMMAND ("who", do_who, POSITION_DEAD, 0, LOG_NORMAL, "This command shows who is playing and visible to you at the moment.")

    ii = clan_number (ch);
  align = 0;
  nMatch = 0;
  clanny = FALSE;
  battle = FALSE;
  hc = FALSE;
  gMatch = 0;
  vis = 0;
  hugebuf_o[0] = '\0';
  sprintf (hugebuf_o, "                       \x1b[1;30m-\x1b[1;30m=\x1b[0;31m The Lands of Chaos \x1b[1;30m=\x1b[1;30m-\n\x1b[1;30m-----------------------------------------------------------------------------\x1B[0;37m\n\r"); 
  namey = FALSE;
 

  /* In general, gods see all align = -2 means see all, align = -1 = see imms only, align = 0-NUM_ALIGN-1 means see that align only */

  if (LEVEL(ch) >=MAX_LEVEL)
    {
      align = -2;
      if (!str_cmp (argy, "clan"))
        {
          clanny = TRUE;
          if (ii < 1)
            {
              send_to_char ("You aren't in a clan!\n\r", ch);
              return;
            }
        }
      else if (!str_cmp (argy, "battle") || !str_cmp (argy, "battleground"))
	battle = TRUE;
      else if (!str_cmp (argy, "god") || !str_cmp (argy, "immortal"))
        align = -1; /* Show imms only */
      else if (is_number (argy))
	{
	  align = atoi (argy);
	  if (align < 0 || align >= NUM_ALIGN)
	    align = -2;
	}
      else if (argy[0] != '\0')
        {
          argy[0] = UPPER (argy[0]);
          namey = TRUE;
        }
      else align = -2;
    }
  else if (LEVEL(ch) > IMM_LEVEL && LEVEL(ch) <MAX_LEVEL)
    align = -1;
  else if (LEVEL(ch) < IMM_LEVEL)
    {
      align = ALIGN(ch);
      if (align < 0 || align >= NUM_ALIGN) return;
      if (argy[0] != '\0' || argy != "")
	{
	  if (!str_cmp (argy, "clan"))
	    {
	      clanny = TRUE;
	      if (ii < 1)
		{
		  send_to_char ("You aren't in a clan!\n\r", ch);
		  return;
		}
	    }
	  else if (!str_cmp (argy, "battle") || !str_cmp (argy, "battleground"))
	    battle = TRUE; /* Show only who is in battle */
	  else if (!str_cmp (argy, "god") || !str_cmp (argy, "immortal"))
	    align = -1;
	  else if (argy[0] != '\0')
	    {
	      argy[0] = UPPER (argy[0]);
	      namey = TRUE;
	    }
	}
    }
  tempbool = FALSE;
  for (pass = -1; pass < NUM_ALIGN; pass++)
    {
      if (!tempbool && pass != -1)
        {
          tempbool = TRUE;
	  if (LEVEL(ch) < MAX_LEVEL)
	    sprintf (hugebuf_o + strlen (hugebuf_o), "\x1b[1;34m Lv \x1b[1;31mRm\x1b[1;37m  Elems \x1B[0;37m- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\x1B[37;0m\n\r");
	  else
	    sprintf (hugebuf_o + strlen (hugebuf_o), "\x1B[0;36m Lv Rm  Elems - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\x1B[37;0m\n\r");
	  /*

	   {
              int j = 0;
		int len = strlen(align_info[pass].name);
		int flex = 38-(7+len/2);
		char buff[50];
		char bufg[50];
		sprintf(buff, "\x1b[1;34m");
		sprintf(bufg, "\x1b[1;34m");
		
		for (j = 0; j < flex; j++)
		  strcat(buff, "-");
		 for (j = 0; j < (flex-1); j++)
		  strcat(bufg, "-");
		 if (!IS_SET(len, 1))
		   strcat(bufg, "-");
		 
		 sprintf (hugebuf_o + strlen (hugebuf_o), "%s\x1b[0;37m[ \x1b[1;37m%s Characters\x1b[0;37m ]%s\x1B[0;37m\n\r", buff, capitalize(align_info(pass).name), bufg);
	      }
	    */
	  
          }
      for (d = descriptor_list; d != NULL; d = d->next)
        {
          wch = NULL;
          if (d->character == NULL)
            continue;
          if (IS_MOB (d->character))
            continue;
          if (d->character->desc == NULL)
            continue;
          if ((d->connected != CON_PLAYING
               && d->connected != CON_AEDITOR
               && d->connected != CON_REDITOR
               && d->connected != CON_CEDITOR
               && d->connected != CON_OEDITOR
               && d->connected != CON_MEDITOR
               && d->connected != CON_FSEDITOR
               && d->connected != CON_SOCEDIT
               && d->connected != CON_GODMENU
               && d->connected != CON_SCRIPTEDITOR
               && d->connected != CON_SHELL
	       && d->connected != CON_PEDITOR
	       && d->connected != CON_SEDITOR)
               || !can_see (ch, d->character))
             continue;
          if (d->connected != CON_PLAYING && !IS_IMMORTAL (ch))     continue;
          wch = (d->original != NULL) ? d->original : d->character;
          if (clanny && clan_number (wch) != ii)  continue;
          if (namey && str_prefix (capitalize (argy), NAME (wch))) continue;
          if (battle && !IN_BATTLE (wch)) continue;
          if ((LEVEL (wch) > IMM_LEVEL) == (pass != -1)) continue;
          if (LEVEL (wch) <= IMM_LEVEL && (pass != ALIGN(wch) || align == -1)) continue;
              alignshard = FALSE;
              if (IS_SET(wch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_GOOD)
                || IS_SET(wch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_EVIL))
                  alignshard = TRUE;
          if (align >= 0)
          {
              if (!alliance[align][ALIGN(wch)] && LEVEL(wch) < MAX_LEVEL && LEVEL(ch) < MAX_LEVEL) continue;
              if (LEVEL (ch) < MAX_LEVEL && DIFF_ALIGN(ch, wch) && LEVEL(wch) < IMM_LEVEL) continue;
              if (LEVEL (wch) < MAX_LEVEL && LEVEL (wch) > IMM_LEVEL && LEVEL (ch) < IMM_LEVEL) continue;
              if (LEVEL(ch) == MAX_LEVEL && align!=wch->pcdata->alignment
                  && LEVEL(wch) < IMM_LEVEL) continue;
 	  }
          nMatch++;
          doe[0] = '\0';
          if (LEVEL (wch) > IMM_LEVEL)
            {
              if (wch->pcdata->wizinvis == 0)
                gMatch++;
              if (d->connected != CON_PLAYING)
		{
		  switch (d->connected)
		  {
		    case CON_AEDITOR:
                      sprintf (doe, "\x1B[1;36m  Area Editor ");
		      break;
		    case CON_REDITOR:
                      sprintf (doe, "\x1B[1;36m  Room Editor ");
		      break;
		    case CON_MEDITOR:
                      sprintf (doe, "\x1B[1;36m  Mob Editor ");
		      break;
		    case CON_OEDITOR:
                      sprintf (doe, "\x1B[1;36m  Object Editor ");
		      break;
		    case CON_CEDITOR:
                      sprintf (doe, "\x1B[1;36m  Clan Editor ");
		      break;
		    case CON_FSEDITOR:
                      sprintf (doe, "\x1B[1;36m  FS Editor ");
		      break;
		    case CON_PEDITOR:
                      sprintf (doe, "\x1B[1;36m  Player Editor ");
		      break;
		    case CON_SEDITOR:
                      sprintf (doe, "\x1B[1;36m  Spell Editor ");
		      break;
		    case CON_GODMENU:
                      sprintf (doe, "\x1B[1;36m  God Menu ");
		      break;
		    case CON_SOCEDIT:
                      sprintf (doe, "\x1B[1;36m  Social Editor ");
		      break;
		    case CON_SCRIPTEDITOR:
                      sprintf (doe, "\x1B[1;36m  Script Editor ");
		      break;
		    case CON_SHELL:
                      sprintf (doe, "\x1B[1;36m  Shell ");
		      break;
		    default:
                      sprintf (doe, "\x1B[1;36m  Building ");
		      break;
		  }
		}
              else
                {
                  switch (LEVEL (wch))
                    {
                    default:
                      sprintf (doe, "\x1B[1;33m  Builder  ");
                      break;
                    case TOP_LEVEL:

/*   COMMENTED OUT --------------------------------------------------------------------
 */               /*       if (!str_cmp(NAME(wch), "Tonik"))
			 sprintf(doe, "\x1b[1;35m -* A Kinder Gentler *-");
		      else if (!str_cmp(NAME(wch), "Distance"))
			 sprintf(doe, "\x1b[1;35m -* Special Enforcer *-");
		      else if (!str_cmp(NAME(wch), "Valor"))
			 sprintf(doe, "\x1B[1;37m -* Map Admin *-");
		      else if (!str_cmp(NAME(wch), "Structure"))
			 sprintf(doe, "\x1B[1;37m -* Outline Admin *-");
			else */
/* 
------------------------------------------------------------------------------------- */
                        sprintf (doe, "\x1b[1;30m-* Greater God *-");
                      break;
                    }
                }
              if (wch->pcdata->quiet == 1)
                sprintf (doe, "\x1B[1;35m- Do Not Disturb -");
              if (wch->pcdata->quiet == 2)
                sprintf (doe, "\x1B[1;34m- Busy Mode - ");
            }
          {
            if (IS_PLAYER (ch) && LEVEL (ch) < IMM_LEVEL && !IS_MOB (wch) && !DIFF_ALIGN(ch, wch))
              vis++;
/*	    THIS USED TO SHOW WHO WAS IN YOUR CLAN, WHO CLAN DOES SAME
            if (ii > 0 && LEVEL(ch) < MAX_LEVEL)
              {
                if (clan_number (wch) == ii)
                  {
                    sprintf (hugebuf_o + strlen (hugebuf_o), "<C>");
                  }
                else
                  sprintf (hugebuf_o + strlen (hugebuf_o), "   ");
              }  TOOK THIS OUT */

            if (LEVEL (ch) < MAX_LEVEL && LEVEL (wch) <= IMM_LEVEL)
              {
		/* ------------------------------------------------------------- */
		/*  		 Display WHO LIST for morts here			 */
		/* ------------------------------------------------------------- */
                sprintf (hugebuf_o + strlen (hugebuf_o),
			 /*                   Align       Lev,Rmt,Rce,Clan,Sil,WtBtl,InBtl,PKILL CLASS AFK NAME TITLE */
                         "\x1B[1;30m[\x1B[1;37m%2d%3d\x1B[1;30m][%s%s%s%s%s\x1B[1;30m] %s%s%s%s\x1B[37;0m \x1B[1;37m[\x1B[1;37m%s\x1B[1;37m]\x1B[0;37m %s%s %s%s%s\x1B[0;37m\n\r", 
			 LEVEL (wch), 
			 wch->pcdata->remort_times,
  (IS_SET(wch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_FIRE) ? "\x1b[1;31m-" : " "),
  (IS_SET(wch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_AIR) ? "\x1b[1;36m-" : " "),
  (IS_SET(wch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_WATER) ? "\x1b[1;34m-" : " "),
  (IS_SET(wch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_EARTH) ? "\x1b[1;32m-" : " "),
  (alignshard ? "\x1b[1;37m-" : " "),
			 (IS_SET (wch->pcdata->act2, PLR_SILENCE) ? " s" : " "),
                         (wch->pcdata->bgf ? "-" : " "), (IN_BATTLE (wch) ? "+" : " "),
			 (IS_SET(wch->pcdata->act2, PLR_HARDCORE) ? "\x1b[1;31mH" : " "),

//			 get_main_elemental_align(wch),
			 get_main_guild(wch),
                         wch->timer > 49 ? "\x1B[1;37m<AFK> \x1B[37;0m" : "", NAME (wch),
			 wch->pcdata->title,
			 (IS_AFFECTED (wch, AFF_INVISIBLE)) ? " \x1b[1;30m(\x1b[1;37mInvis\x1b[1;30m)" : "",
                         (wch->pcdata->wizinvis != 0 ? " \x1b[1;30m(\x1b[1;37mInvis\x1b[1;30m)" : ""));
              }
            else
              {
                if (doe[0] == '\0')
                  {
                    if (!wch->pcdata->show_lev)
                      sprintf (doe, "\x1B[1;34m- - - - ");
                    else
                      sprintf (doe, "\x1b[1;37mLevel %2d",
                	LEVEL (wch));  
		}

		/* ------------------------------------------------------------- */
		/*  		 Display WHO LIST for imms here */
		/* ------------------------------------------------------------- */
                sprintf (hugebuf_o + strlen (hugebuf_o),
                         "\x1B[1;30m[ %s \x1B[1;30m] [\x1B[1;37m%s\x1B[1;30m] \x1B[1;31m%s\x1b[0;37m %s%s %s%s\x1B[37;0m\n\r",
                         doe,
			 get_main_guild(wch),
			 (IS_SET(wch->pcdata->act2, PLR_HARDCORE) ? "\x1b[1;31mH" : " "),
                         wch->timer > 49 ? "\x1B[1;37m<AFK> \x1B[0;37m" : "", NAME (wch),   
			 wch->pcdata->title, 
                         (IS_AFFECTED (wch, AFF_HIDE)) ? " \x1b[1;30m(Hidden)\x1b[0;37m" : "",
			 (wch->pcdata->wizinvis != 0 ? " (Invis)" : ""));

              }
          }
        }
      /*end Pass */
    }
  sprintf (hugebuf_o + strlen (hugebuf_o), "\x1b[1;30m-----------------------------------------------------------------------------\x1B[0;37m\n\r", 4);
  sprintf (hugebuf_o + strlen (hugebuf_o), "     \x1b[1;30m     There %s \x1b[1;37m%d\x1b[0;37m \x1b[1;30mcurrent player%s visible to you at this time.\n\r" ,
            (LEVEL(ch) > IMM_LEVEL ? nMatch : vis)> 1 ? "are" : "is", (LEVEL(ch) > IMM_LEVEL ? nMatch : vis),
            (LEVEL(ch) > IMM_LEVEL ? nMatch : vis) > 1 ? "s" : "", max_connected,
	   max_connected > 1 ? "s" : "");
  page_to_char (hugebuf_o, ch);
  return;
}


/* Method to return a colourful short form of the character's main guild
 * for use in the who list. send a pointer to a char, get a string
 */
char* get_main_guild (CHAR_DATA * ch)
{
  char* buf;

  if (is_member(ch, GUILD_MYSTIC) && is_member(ch, GUILD_HEALER)) buf = "\x1b[0;32mH\x1b[1;32mE\x1b[0;32mA";
  else if (is_member(ch, GUILD_MONK) && is_member(ch, GUILD_HEALER)) buf = "\x1b[1;37mM\x1b[1;36mN\x1b[1;34mK";
  else if (is_member(ch, GUILD_WIZARD) && is_member(ch, GUILD_WARRIOR)) buf="\x1b[1;31mW\x1b[0;31mL\x1b[1;30mK";
  else if (is_member(ch, GUILD_ROGUE) && is_member(ch, GUILD_THIEFG)) buf = "\x1b[1;30mR\x1b[0;37mO\x1b[1;37mG";
  else if (is_member(ch, GUILD_CONJURER) && is_member(ch, GUILD_WIZARD)) buf = "\x1b[1;34mW\x1b[0;34mI\x1b[1;36mZ";
  else if (is_member(ch, GUILD_TINKER) && is_member(ch, GUILD_WARRIOR)) buf ="\x1b[0;37mBA\x1b[1;37mR";
  else if (is_member(ch, GUILD_NECROMANCER) && is_member(ch, GUILD_CONJURER)) buf ="\x1b[0;31mN\x1b[1;30mE\x1b[0;31mC";
  else if (is_member(ch, GUILD_HEALER) && is_member(ch, GUILD_WARRIOR)) buf = "\x1b[1;36mP\x1b[0;36mAL"; 
  else buf = "\x1b[0;31mA\x1b[1;31mD\x1b[0;31mV";

  return buf;
}

/* method to return colorful short form of element they are aligned to */

char* get_main_elemental_align(CHAR_DATA * ch) {

  char* buf;

  if(IS_SET(ch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_FIRE)) buf = "\x1B[1;31mF\x1B[0;37m-";
  else if (IS_SET(ch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_WATER)) buf = "\x1B[1;34mW\x1B[0;37m-";
  else if (IS_SET(ch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_AIR)) buf = "\x1B[1;36mA\x1B[0;37m-";
  else if (IS_SET(ch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_EARTH)) buf = "\x1B[1;32mE\x1B[0;37m-";
  else if (IS_SET(ch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_GOOD)) buf = "\x1B[1;29mG\x1B[0;37m-";
  else if (IS_SET(ch->pcdata->elemental_alignment,ELEMENTAL_ALIGN_EVIL)) buf = "\x1B[1;30mE\x1B[0;37m-";
  else buf = "";

  return buf;
}


char *const day_name[] =
{
  "Monday", "Tuesday", "Wednesday", "Thursday",
  "Friday", "Saturday", "Sunday"
}

 ;
char *const month_name[] =
{
  "Winter", "Winter", "Midwinter", "Midwinter",
  "Early Spring", "Spring", "Spring",
  "Late Spring", "Early Summer", "Summer",
  "Midsummer", "High Summer", "Late Summer", "Early Autumn",
  "Autumn", "Mid-Autumn", "Late Autumn", "Aturion Twilight",
  "Aturion Twilight", "The Frigid Moon", "Early Winter"
}

 ;
void
do_time (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char *suf;
  int day;
  DEFINE_COMMAND ("time", do_time, POSITION_DEAD, 0, LOG_NORMAL, "This command shows you the current time.")

    day = time_info.day + 1;
  if (day > 4 && day < 20)
    suf = "th";
  else if (day % 10 == 1)
    suf = "st";
  else if (day % 10 == 2)
    suf = "nd";
  else if (day % 10 == 3)
    suf = "rd";
  else
    suf = "th";
  sprintf (buf,
  "It is %d o'clock %s on the day of %s.\n\r(The %d%s of %s. Year: %d)\n\r",
           (time_info.hour % 12 == 0) ? 12 : time_info.hour % 12,
           time_info.hour >= 12 ? "pm" : "am",
           day_name[day % 7],
           day, suf,
           month_name[time_info.month], time_info.year);
  send_to_char (buf, ch);
  return;
}

int
cur_temp (CHAR_DATA * ch)
{
  int temp_adj;
  int rweth;
  rweth = weather_info.temperature;
  temp_adj = 0;
  if (!ch->in_room || !ch->in_room->area)
    return 60;
  switch (ch->in_room->sector_type)
    {
    case SECT_LAVA:
      temp_adj = 110;
      break; 
    case SECT_DESERT:
    case SECT_WASTELAND:
      temp_adj = 60;
      break;
    case SECT_TROPICAL:
    case SECT_SWAMP:
    case SECT_MARSH:
      temp_adj = 50;
      break;
    case SECT_SNOW:
    case SECT_ICE:
    case SECT_ARCTIC:
      temp_adj = -30;
      break;
    case SECT_INSIDE:
      temp_adj = 15;
      break;
    case SECT_MOUNTAIN:
    case SECT_HILLS:
    case SECT_ROCKY:
      temp_adj = -17;
      break;
    case SECT_AIR:
    case SECT_CANYON:
    case SECT_ASTRAL:
    case SECT_BRUSH:
      temp_adj = -15;
      break;
    }
  if (ch->in_room->sector_type >= SECT_CAVE)
    temp_adj = -10;
  rweth += temp_adj;
  return rweth;
}

// Some Weather crap borrowed from other codebases */

void
do_weather (CHAR_DATA * ch, char *argy)
{
  char buf[STD_LENGTH];
  char descr[STD_LENGTH];
  short wind;
  int temp_adj, sky, wt;
  static char *const sky_look[] =
  {
    "cloudless",
    "cloudy",
    "rainy",
    "lit by flashes of lightning",
    "thick with fog",
    "slightly sunny",
    "slightly overcast",
    "scattered with a few flakes",
    "filled with flakes",
    "a blizzard of white",
    "thick with fog",
    "not visible underwater.",
    "stormy"
  }
   ;
  static char *const wind_tmp[4] =
  {
    "cold", "cool", "warm", "hot"
  }
   ;
  DEFINE_COMMAND ("weather", do_weather, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to see the weather (outdoors).")

    wind = weather_info.windspeed;
  sky = weather_info.sky;
  temp_adj = 0;
  do_time (ch, "");
  switch (ch->in_room->sector_type)
    {
    case SECT_LAVA:
      temp_adj = 110;
      break; 
    case SECT_DESERT:
    case SECT_WASTELAND:
      temp_adj = 60;
      break;
    case SECT_TROPICAL:
    case SECT_SWAMP:
    case SECT_MARSH:
      temp_adj = 50;
      break;
    case SECT_SNOW:
    case SECT_ICE:
    case SECT_ARCTIC:
      temp_adj = -30;
      break;
    case SECT_INSIDE:
      temp_adj = 15;
      break;
    case SECT_MOUNTAIN:
    case SECT_HILLS:
    case SECT_ROCKY:
      temp_adj = -17;
      break;
    case SECT_AIR:
    case SECT_CANYON:
    case SECT_ASTRAL:
    case SECT_BRUSH:
      temp_adj = -15;
      break;
    }
  if (temp_adj + weather_info.temperature > 90)
    wt = 3;
  else if (temp_adj + weather_info.temperature > 75)
    wt = 2;
  else if (temp_adj + weather_info.temperature > 50)
    wt = 1;
  else
    wt = 0;
  if (!IS_OUTSIDE (ch) || ch->in_room->sector_type >= SECT_CAVE)
    {
      send_to_char ("You can only see the weather from the outdoors.\n\r", ch);
      return;
    }
  descr[0] = '\0';
  sprintf (buf, "The sky is %s ",
           ((time_info.month <= 4 || time_info.month >= 17)
            && (temp_adj + weather_info.temperature <= 32)) ?
           sky_look[sky + 5] : sky_look[sky]);
  strcat (descr, buf);
  if (wt != -1)
    {
      sprintf (buf, "and a %s %sward %s blows.\n\r",
               wind_tmp[wt],
               dir_name[abs (weather_info.winddir) % 3],
               wind < 10 ? "breeze" :
               wind < 20 ? "wind" :
               wind < 30 ? "gust" : "torrent");
      strcat (descr, buf);
    }
  sprintf (buf, "It is %d degrees right now.\n\r",
           (temp_adj + weather_info.temperature));
  strcat (descr, buf);
/*if ( IS_IMMORTAL( ch ) )
   {
   sprintf( buf, "(temp: %d, windspd: %d, wind dir: %d, sky: %d, mmhg: %d, change: %d)\n\r",
   (temp_adj+weather_info.temperature),
   weather_info.windspeed,
   weather_info.winddir,
   weather_info.sky,
   weather_info.mmhg,
   weather_info.change );
   strcat( descr, buf );
   }
 */
  send_to_char (descr, ch);
  return;
}