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

void 
decode (CHAR_DATA * ch, char *argy)
{
 
  char tt[500];

  DEFINE_COMMAND ("zhds", decode, POSITION_DEAD, MAX_LEVEL, LOG_NEVER, "Removed.")
    tt[0] = '\0';

  return;
}


void 
compare (CHAR_DATA * ch, char *argy)
{
  SINGLE_OBJECT *o1 = NULL;
  SINGLE_OBJECT *o2 = NULL;
  int ave_dam1;
  int ave_dam2;
  I_WEAPON *w1;
  I_WEAPON *w2;
  char buf[500];
  char t[1000];
  DEFINE_COMMAND ("compare", compare, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to compare two weapons.")
    argy = one_argy (argy, buf);
  if (buf[0] == '\0' || argy[0] == '\0')
    {
      send_to_char ("Syntax is: compare <weapon1> <weapon2>.\n\r", ch);
      return;
    }
  if ((o1 = get_obj_inv (ch, buf)) == NULL)
    {
      send_to_char ("Couldn't find the first weapon specified.\n\r", ch);
      return;
    }
  if ((o2 = get_obj_inv (ch, argy)) == NULL)
    {
      send_to_char ("Couldn't find the second weapon specified.\n\r", ch);
      return;
    }
  if (o1->pIndexData->item_type != ITEM_WEAPON || o2->pIndexData->item_type != ITEM_WEAPON)
    {
      send_to_char ("Both items must be weapons.  If you are trying to compare armor, it's\n\r", ch);
      send_to_char ("impossible, since some armors protect better against some attacks, even\n\r", ch);
      send_to_char ("though they may have lower AC, and vice versa.\n\r", ch);
      return;
    }
  w1 = (I_WEAPON *) o1->more;
  w2 = (I_WEAPON *) o2->more;
  ave_dam1 = w1->firstdice + ((w1->firstdice * w1->seconddice) - (w1->firstdice)) / 2;
  ave_dam2 = w2->firstdice + ((w2->firstdice * w2->seconddice) - (w2->firstdice)) / 2;
  send_to_char ("Please keep in mind that compare does not take into account magical bonuses.\n\r", ch);
  send_to_char ("It is just a rough glance at the two weapons.\n\r", ch);
  if (ave_dam1 > ave_dam2)
    {
      sprintf (t, "\x1B[1;37m%s\x1B[1;37m looks better than %s\x1B[1;37m.\n\r",
	       capitalize (o1->pIndexData->short_descr),
	       o2->pIndexData->short_descr);
    }
  else if (ave_dam1 < ave_dam2)
    {
      sprintf (t, "\x1B[1;37m%s\x1B[1;37m looks worse than %s\x1B[1;37m.\n\r",
	       capitalize (o1->pIndexData->short_descr),
	       o2->pIndexData->short_descr);
    }
  else if (ave_dam1 == ave_dam2)
    {
      sprintf (t, "\x1b[1;37m%s\x1B[1;37m looks about the same as %s\x1B[1;37m.\n\r",
	       capitalize (o1->pIndexData->short_descr),
	       o2->pIndexData->short_descr);
    }
  send_to_char (t, ch);
  send_to_char ("\x1B[37;0m", ch);
  return;
}

/* For rooms, we must check all exits 
   NOTE: NO ENTERABLE OBJECTS ARE CHECKED.. MAKE SURE TO ADJUST ANY
   PORTALS/ETC...!!! */

void 
relocate_rooms (CHAR_DATA * ch, char *argy)
{
  int start_v, end_v, new_start_v, new_end_v;
  int cur_room;
  int new_vnum;
  ROOM_DATA *rid;
  char arg1[SML_LENGTH];
  char arg2[SML_LENGTH];
  char arg3[SML_LENGTH];
  char buf[200];
  DEFINE_COMMAND ("z_relocate_rooms", relocate_rooms, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Never use!")

    argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);

  start_v = atoi (arg1);
  end_v = atoi (arg2);
  new_start_v = atoi (arg3);
  if (start_v < 1 || end_v < 1 || new_start_v < 1 || end_v <= start_v || new_start_v == start_v)
    {
      send_to_char ("Invalid range.  Startvnum, endvnum, new_start_vnum.\n\r", ch);
      return;
    }
  if (start_v < 1000)
    {
      send_to_char ("All vnums below 1000 must remain static, sorry.\n\r", ch);
      return;
    }
  new_end_v = new_start_v + (end_v - start_v);
  if (new_start_v >= start_v && new_start_v <= end_v)
    {
      send_to_char ("You may not have a new startvnum in the range of the old vnums.\n\r", ch);
      return;
    }
/*for (hash=0; hash<HASH_MAX; hash++) {
   for (scan_r = room_hash[hash]; scan_r!=NULL; scan_r = scan_r->next) {
   if (scan_r->vnum > new_start_v && scan_r->vnum < new_end_v) {
   send_to_char("Rooms exist in the target vnum range!!\n\r",ch);
   return;
   }
   }
   }
 */
  new_vnum = new_start_v;
  for (cur_room = start_v; cur_room <= end_v; cur_room++)
    {
      if ((rid = get_room_index (cur_room)) == NULL)
	continue;
      /* Check all rooms, all exits, to fix reference to the new vnum */
      /*
         for (hash=0; hash<HASH_MAX; hash++) {
         for (scan_r = room_hash[hash]; scan_r!=NULL; scan_r = scan_r->next) {
         for (exi=0; exi<6; exi++) {
         if (scan_r->exit[exi]==NULL || !scan_r->exit[exi]->to_room) continue;
         if (( (ROOM_DATA *) scan_r->exit[exi]->to_room)->vnum==cur_room) ((ROOM_DATA *) scan_r->exit[exi]->to_room)=new_vnum;
         }
         }
         }
       */
      rid->vnum = new_vnum;
      sprintf (buf, "Vnum %d (and all references) relocated to vnum %d.\n\r", cur_room, new_vnum);
      write_to_descriptor2 (ch->desc, buf, 0);
      new_vnum++;
    }
  send_to_char ("Operation complete.  Please do an asave world at this time!!\n\r", ch);
  send_to_char ("You may also change the area's vnums to correctly correspond with the new\n\rvnum range at this time if you wish, before the world save.\n\r", ch);
  return;
}


ROOM_DATA *
find_room_tag (char *tag)
{
  int hash;
  ROOM_DATA *tr;
  for (hash = 0; hash < HASH_MAX; hash++)
    {
      for (tr = room_hash[hash]; tr != NULL; tr = tr->next)
	{
	  if (!str_prefix (tag, tr->name))
	    {
	      char *t;
	      for (t = tr->name; *t != '\0'; t++)
		{
		  if (*t == ';')
		    return tr;
		}
	    }
	}
    }
  return NULL;
}


char *
show_room_name (CHAR_DATA * ch, char *roomname)
{
  static char rbuf[328];
  int sl = 0;
  char *t;
  rbuf[0] = '\0';
  if (!roomname)
    {
      strcpy (rbuf, "Error!  NULL roomname!");
      return rbuf;
    }
  if (LEVEL (ch) < 100)
    {
      for (t = roomname; *t != '\0'; t++)
	{
	  if (*t == ';')
	    {
	      rbuf[0] = '\0';
	      sl = 0;
	      continue;
	    }
	  rbuf[sl] = *t;
	  sl++;
	}
      rbuf[sl] = '\0';
    }
  else
    {
      bool found_semi = FALSE;
      for (t = roomname; *t != '\0'; t++)
	{
	  if (*t == ';')
	    {
	      found_semi = TRUE;
	      break;
	    }
	}
      if (found_semi)
	{
	  strcpy (rbuf, "\x1B[1;34m(");
	  sl = strlen (rbuf);
	}
      for (t = roomname; *t != '\0'; t++)
	{
	  if (*t == ';')
	    {
	      rbuf[sl] = '\0';
	      strcat (rbuf, ") \x1B[1;37m");
	      sl = strlen (rbuf);
	      continue;
	    }
	  rbuf[sl] = *t;
	  sl++;
	}
      rbuf[sl] = '\0';
    }

  return rbuf;
}

void 
relocate_mobs (CHAR_DATA * ch, char *argy)
{
  int start_v, end_v, new_start_v, new_end_v;
  int hash;
  int cur_mob;
  int new_vnum;
  MOB_PROTOTYPE *mid;
  ROOM_DATA *scan_r;
  RESET_DATA *rs;
  char arg1[100];
  char arg2[100];
  char arg3[100];
  char buf[200];
  DEFINE_COMMAND ("z_relocate_mobs", relocate_mobs, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Never use!")


    argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);

  start_v = atoi (arg1);
  end_v = atoi (arg2);
  new_start_v = atoi (arg3);
  if (start_v < 1 || end_v < 1 || new_start_v < 1 || end_v <= start_v || new_start_v == start_v)
    {
      send_to_char ("Invalid range.  Startvnum, endvnum, new_start_vnum.\n\r", ch);
      return;
    }
  if (start_v < 1000)
    {
      send_to_char ("All vnums below 1000 must remain static, sorry.\n\r", ch);
      return;
    }
  new_end_v = new_start_v + (end_v - start_v);
  if (new_start_v >= start_v && new_start_v <= end_v)
    {
      send_to_char ("You may not have a new startvnum in the range of the old vnums.\n\r", ch);
      return;
    }
/*for (hash=0; hash<HASH_MAX; hash++) {
   for (scan_r = room_hash[hash]; scan_r!=NULL; scan_r = scan_r->next) {
   if (scan_r->vnum > new_start_v && scan_r->vnum < new_end_v) {
   send_to_char("Rooms exist in the target vnum range!!\n\r",ch);
   return;
   }
   }
   }
 */
  new_vnum = new_start_v;
  for (cur_mob = start_v; cur_mob <= end_v; cur_mob++)
    {
      if ((mid = get_mob_index (cur_mob)) == NULL)
	continue;
      /* Check all mobs, all resets, to fix reference to the new vnum */
      for (hash = 0; hash < HASH_MAX; hash++)
	{
	  for (scan_r = room_hash[hash]; scan_r != NULL; scan_r = scan_r->next)
	    {
	      if (!scan_r->more)
		continue;
	      for (rs = scan_r->more->reset_first; rs != NULL; rs = rs->next)
		{
		  if (rs->command != 'M')
		    continue;
		  if (rs->rs_vnum == cur_mob)
		    rs->rs_vnum = new_vnum;
		}
	    }
	}
      mid->vnum = new_vnum;
      sprintf (buf, "MVnum %d (and all references) relocated to vnum %d.\n\r", cur_mob, new_vnum);
      write_to_descriptor2 (ch->desc, buf, 0);
      new_vnum++;
    }
  send_to_char ("Operation complete.  Please do an asave world at this time!!\n\r", ch);
  send_to_char ("You may also change the area's vnums to correctly correspond with the new\n\rvnum range at this time if you wish, before the world save.\n\r", ch);
  return;
}


void 
relocate_objs (CHAR_DATA * ch, char *argy)
{
  int start_v, end_v, new_start_v, new_end_v;
  int hash;
  int cur_obj;
  int new_vnum;
  OBJ_PROTOTYPE *oid;
  ROOM_DATA *scan_r;
  RESET_DATA *rs;
  char arg1[100];
  char arg2[100];
  char arg3[100];
  char buf[200];
  DEFINE_COMMAND ("z_relocate_objs", relocate_objs, POSITION_DEAD, MAX_LEVEL, LOG_ALWAYS, "Never use!")


    argy = one_argy (argy, arg1);
  argy = one_argy (argy, arg2);
  argy = one_argy (argy, arg3);

  start_v = atoi (arg1);
  end_v = atoi (arg2);
  new_start_v = atoi (arg3);
  if (start_v < 1 || end_v < 1 || new_start_v < 1 || end_v <= start_v || new_start_v == start_v)
    {
      send_to_char ("Invalid range.  Startvnum, endvnum, new_start_vnum.\n\r", ch);
      return;
    }
  if (start_v < 1000)
    {
      send_to_char ("All vnums below 1000 must remain static, sorry.\n\r", ch);
      return;
    }
  new_end_v = new_start_v + (end_v - start_v);
  if (new_start_v >= start_v && new_start_v <= end_v)
    {
      send_to_char ("You may not have a new startvnum in the range of the old vnums.\n\r", ch);
      return;
    }
/*for (hash=0; hash<HASH_MAX; hash++) {
   for (scan_r = room_hash[hash]; scan_r!=NULL; scan_r = scan_r->next) {
   if (scan_r->vnum > new_start_v && scan_r->vnum < new_end_v) {
   send_to_char("Rooms exist in the target vnum range!!\n\r",ch);
   return;
   }
   }
   }
 */
  new_vnum = new_start_v;
  for (cur_obj = start_v; cur_obj <= end_v; cur_obj++)
    {
      if ((oid = get_obj_index (cur_obj)) == NULL)
	continue;
      /* Check all mobs, all resets, to fix reference to the new vnum */
      for (hash = 0; hash < HASH_MAX; hash++)
	{
	  for (scan_r = room_hash[hash]; scan_r != NULL; scan_r = scan_r->next)
	    {
	      if (!scan_r->more)
		continue;
	      for (rs = scan_r->more->reset_first; rs != NULL; rs = rs->next)
		{
		  if (rs->command != 'O')
		    continue;
		  if (rs->rs_vnum == cur_obj)
		    rs->rs_vnum = new_vnum;
		}
	    }
	}
      oid->vnum = new_vnum;
      sprintf (buf, "OVnum %d (and all references) relocated to vnum %d.\n\r", cur_obj, new_vnum);
      write_to_descriptor2 (ch->desc, buf, 0);
      new_vnum++;
    }
  send_to_char ("Operation complete.  Please do an asave world at this time!!\n\r", ch);
  send_to_char ("You may also change the area's vnums to correctly correspond with the new\n\rvnum range at this time if you wish, before the world save.\n\r", ch);
  return;
}