1stMud/CVS/
1stMud/area/CVS/
1stMud/backup/CVS/
1stMud/bin/
1stMud/bin/CVS/
1stMud/bin/extras/
1stMud/bin/extras/CVS/
1stMud/data/CVS/
1stMud/data/i3/CVS/
1stMud/doc/1stMud/
1stMud/doc/1stMud/CVS/
1stMud/doc/CVS/
1stMud/doc/Diku/
1stMud/doc/Diku/CVS/
1stMud/doc/MPDocs/CVS/
1stMud/doc/Merc/CVS/
1stMud/doc/Rom/
1stMud/doc/Rom/CVS/
1stMud/log/CVS/
1stMud/notes/
1stMud/notes/CVS/
1stMud/player/CVS/
1stMud/player/backup/CVS/
1stMud/player/deleted/CVS/
1stMud/src/CVS/
1stMud/src/config/CVS/
1stMud/src/h/CVS/
1stMud/src/o/CVS/
1stMud/win/CVS/
/**************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*                                                                         *
*  Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael         *
*  Chastain, Michael Quan, and Mitchell Tse.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefiting.  We hope that you share your changes too.  What goes       *
*  around, comes around.                                                  *
***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                        *
*       ROM has been brought to you by the ROM consortium                 *
*           Russ Taylor (rtaylor@hypercube.org)                           *
*           Gabrielle Taylor (gtaylor@hypercube.org)                      *
*           Brian Moore (zump@rom.org)                                    *
*       By using this code, you have agreed to follow the terms of the    *
*       ROM license, in the file Rom24/doc/rom.license                    *
***************************************************************************
*          1stMud ROM Derivative (c) 2001-2004 by Markanth                *
*            http://www.firstmud.com/  <markanth@firstmud.com>            *
*         By using this code you have agreed to follow the term of        *
*             the 1stMud license in ../doc/1stMud/LICENSE                 *
***************************************************************************/


#ifndef __OLC_CREATE_H_
#define __OLC_CREATE_H_ 1

Olc_Fun (aedit_create)
{
  AreaData *pArea;

  pArea = new_area ();
  add_area (pArea);
  edit_start (ch, pArea, ED_AREA);
  SetBit (pArea->area_flags, AREA_ADDED);
  chprintln (ch, "Area Created.");
  return false;
}


Olc_Fun (redit_create)
{
  AreaData *pArea;
  RoomIndex *pRoom;
  vnum_t value;
  int iHash;

  value = atov (argument);

  if (NullStr (argument) || value <= 0)
    {
      cmd_syntax (ch, NULL, n_fun, "<vnum > 0>", NULL);
      return false;
    }

  pArea = get_vnum_area (value);
  if (!pArea)
    {
      chprintln (ch, "That vnum is not assigned an area.");
      return false;
    }

  if (!IsBuilder (ch, pArea))
    {
      chprintln (ch, "Vnum in an area you cannot build in.");
      return false;
    }

  if (get_room_index (value))
    {
      chprintln (ch, "Room vnum already exists.");
      return false;
    }

  pRoom = new_room_index ();
  pRoom->area = pArea;
  pRoom->vnum = value;

  if (value > top_vnum_room)
    top_vnum_room = value;

  iHash = value % MAX_KEY_HASH;
  LinkSingle (pRoom, room_index_hash[iHash], next);
  edit_start (ch, pRoom, ED_ROOM);
  chprintln (ch, "Room created.");
  return true;
}


Olc_Fun (oedit_create)
{
  ObjIndex *pObj;
  AreaData *pArea;
  vnum_t value;
  int iHash;

  value = atov (argument);
  if (NullStr (argument) || value == 0)
    {
      cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  pArea = get_vnum_area (value);
  if (!pArea)
    {
      chprintln (ch, "That vnum is not assigned an area.");
      return false;
    }

  if (!IsBuilder (ch, pArea))
    {
      chprintln (ch, "Vnum in an area you cannot build in.");
      return false;
    }

  if (get_obj_index (value))
    {
      chprintln (ch, "Object vnum already exists.");
      return false;
    }

  pObj = new_obj_index ();
  pObj->vnum = value;
  pObj->area = pArea;

  if (value > top_vnum_obj)
    top_vnum_obj = value;

  iHash = value % MAX_KEY_HASH;
  LinkSingle (pObj, obj_index_hash[iHash], next);
  edit_start (ch, pObj, ED_OBJECT);
  chprintln (ch, "Object Created.");
  return true;
}


Olc_Fun (medit_create)
{
  CharIndex *pMob;
  AreaData *pArea;
  vnum_t value;
  int iHash;

  value = atov (argument);
  if (NullStr (argument) || value == 0)
    {
      cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  pArea = get_vnum_area (value);

  if (!pArea)
    {
      chprintln (ch, "That vnum is not assigned an area.");
      return false;
    }

  if (!IsBuilder (ch, pArea))
    {
      chprintln (ch, "Vnum in an area you cannot build in.");
      return false;
    }

  if (get_char_index (value))
    {
      chprintln (ch, "Mobile vnum already exists.");
      return false;
    }

  pMob = new_char_index ();
  pMob->vnum = value;
  pMob->area = pArea;

  if (value > top_vnum_mob)
    top_vnum_mob = value;

  pMob->act = ACT_IS_NPC;
  iHash = value % MAX_KEY_HASH;
  LinkSingle (pMob, char_index_hash[iHash], next);
  edit_start (ch, pMob, ED_MOBILE);
  chprintln (ch, "Mobile Created.");
  return true;
}


Olc_Fun (cedit_create)
{
  ClanData *pClan;
  char buf[MIL];

  if (!NullStr (argument) && clan_lookup (argument) == NULL)
    sprintf (buf, argument);
  else
    sprintf (buf, "New_Clan%d", top_clan + 1);

  pClan = new_clan ();
  replace_str (&pClan->name, buf);
  replace_str (&pClan->who_name, buf);
  Link (pClan, clan, next, prev);

  edit_start (ch, pClan, ED_CLAN);
  chprintln (ch, "Clan created.");
  return true;
}


Olc_Fun (cledit_create)
{
  int j, i = top_class;
  int x = 0;
  ClassData *pClass;
  struct class_type *new_table;
  RaceData *race;
  char buf[MIL];

  if (!NullStr (argument) && class_lookup (argument) == -1)
    sprintf (buf, argument);
  else
    sprintf (buf, "New_Class%d", top_class + 1);

  top_class++;

  alloc_mem (new_table, struct class_type, top_class);

  if (!new_table)
    {
      chprintln (ch, "Memory Allocation Failed!!! Unable to create class.");
      return false;
    }

  for (j = 0; j < i; j++)
    new_table[j] = class_table[j];

  for (x = 0; x < top_skill; x++)
    {
      realloc_mem (skill_table[x].rating, int, top_class);

      skill_table[x].rating[i] = 0;
      realloc_mem (skill_table[x].skill_level, int, top_class);

      skill_table[x].skill_level[i] = ANGEL;
    }

  for (race = race_first; race; race = race->next)
    {
      realloc_mem (race->class_mult, int, top_class);

      race->class_mult[i] = 100;
    }

  for (x = 0; x < top_group; x++)
    {
      realloc_mem (group_table[x].rating, int, top_class);

      group_table[x].rating[i] = 0;
    }

  free_mem (class_table);
  class_table = new_table;

  class_table[i].name[0] = str_dup (buf);
  for (x = 1; x < MAX_REMORT; x++)
    class_table[i].name[x] = &str_empty[0];
  class_table[i].description = &str_empty[0];
  class_table[i].index = &class_null;
  pClass = &class_table[i];
  edit_start (ch, pClass, ED_CLASS);
  chprintln (ch, "Class created.");
  return true;
}


Olc_Fun (cmdedit_create)
{
  CmdData *pCmd;
  char buf[MIL];

  if (!NullStr (argument) && cmd_lookup (argument) == NULL)
    sprintf (buf, argument);
  else
    sprintf (buf, "NewCommand%d", top_cmd + 1);

  pCmd = new_cmd ();
  replace_str (&pCmd->name, buf);
  add_command (pCmd);

  edit_start (ch, pCmd, ED_CMD);
  chprintln (ch, "Command created.");
  return true;
}


Olc_Fun (dedit_create)
{
  DeityData *pDeity;
  char buf[MIL];

  if (!NullStr (argument) && deity_lookup (argument) == NULL)
    sprintf (buf, argument);
  else
    sprintf (buf, "New_Deity%d", top_deity + 1);

  pDeity = new_deity ();
  replace_str (&pDeity->name, buf);
  Link (pDeity, deity, next, prev);
  edit_start (ch, pDeity, ED_DEITY);
  chprintln (ch, "Deity created.");
  return true;
}


Olc_Fun (gredit_create)
{
  int j, i = top_group;
  int x = 0;
  GroupData *pGroup;
  struct group_type *new_table;
  char buf[MIL];
  CharData *pch;

  if (!NullStr (argument) && group_lookup (argument) == -1)
    sprintf (buf, argument);
  else
    sprintf (buf, "New_Group%d", top_group + 1);

  top_group++;

  alloc_mem (new_table, struct group_type, top_group);

  if (!new_table)
    {
      chprintln (ch, "Memory Allocation Failed!!! Unable to create group.");
      return false;
    }

  for (j = 0; j < i; j++)
    new_table[j] = group_table[j];

  free_mem (group_table);
  group_table = new_table;

  group_table[i].name = str_dup (buf);

  for (x = 0; x < MAX_IN_GROUP; x++)
    group_table[i].spells[x] = NULL;

  alloc_mem (group_table[i].rating, int, top_class);

  for (pch = player_first; pch; pch = pch->next_player)
    {
      realloc_mem (pch->pcdata->group_known, bool, top_group);
      if (pch->gen_data != NULL)
	realloc_mem (pch->gen_data->group_chosen, bool, top_group);
    }
  pGroup = &group_table[i];
  chprintln (ch, "Group created.");
  edit_start (ch, pGroup, ED_GROUP);
  return true;
}


Olc_Fun (mpedit_create)
{
  ProgCode *pMcode;
  vnum_t value = atov (argument);
  AreaData *ad;

  if (NullStr (argument) || value < 1)
    {
      cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  ad = get_vnum_area (value);

  if (ad == NULL)
    {
      chprintln (ch, "Vnum is not assigned an area.");
      return false;
    }

  if (!IsBuilder (ch, ad))
    {
      chprintln (ch, "Insufficient security to create MobProgs.");
      return false;
    }

  if (get_prog_index (value, PRG_MPROG))
    {
      chprintln (ch, "Code vnum already exists.");
      return false;
    }

  pMcode = new_rprog ();
  pMcode->vnum = value;
  pMcode->area = ad;
  Link (pMcode, mprog, next, prev);
  edit_start (ch, pMcode, ED_MPCODE);
  chprintln (ch, "MobProgram Code Created.");

  return true;
}

Olc_Fun (opedit_create)
{
  ProgCode *pOcode;
  vnum_t value = atov (argument);
  AreaData *ad;

  if (NullStr (argument) || value < 1)
    {
      cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  ad = get_vnum_area (value);

  if (ad == NULL)
    {
      chprintln (ch, "Vnum is not assigned an area.");
      return false;
    }

  if (!IsBuilder (ch, ad))
    {
      chprintln (ch, "Insufficient security to create ObjProgs.");
      return false;
    }

  if (get_prog_index (value, PRG_OPROG))
    {
      chprintln (ch, "Code vnum already exists.");
      return false;
    }

  pOcode = new_rprog ();
  pOcode->vnum = value;
  pOcode->area = ad;
  Link (pOcode, oprog, next, prev);
  edit_start (ch, pOcode, ED_OPCODE);
  chprintln (ch, "ObjProgram Code Created.");

  return true;
}

Olc_Fun (rpedit_create)
{
  ProgCode *pRcode;
  vnum_t value = atov (argument);
  AreaData *ad;

  if (NullStr (argument) || value < 1)
    {
      cmd_syntax (ch, NULL, n_fun, "<vnum>", NULL);
      return false;
    }

  ad = get_vnum_area (value);

  if (ad == NULL)
    {
      chprintln (ch, "Vnum is not assigned an area.");
      return false;
    }

  if (!IsBuilder (ch, ad))
    {
      chprintln (ch, "Insufficient security to create RoomProgs.");
      return false;
    }

  if (get_prog_index (value, PRG_RPROG))
    {
      chprintln (ch, "Code vnum already exists.");
      return false;
    }

  pRcode = new_rprog ();
  pRcode->vnum = value;
  pRcode->area = ad;
  Link (pRcode, rprog, next, prev);
  edit_start (ch, pRcode, ED_RPCODE);
  chprintln (ch, "RoomProgram Code Created.");

  return true;
}


Olc_Fun (raedit_create)
{
  RaceData *pRace;
  char buf[MIL];

  if (!NullStr (argument) && race_lookup (argument) == NULL)
    sprintf (buf, argument);
  else
    sprintf (buf, "New_Race%d", top_race + 1);

  pRace = new_race ();
  replace_str (&pRace->name, buf);
  Link (pRace, race, next, prev);
  edit_start (ch, pRace, ED_RACE);
  chprintln (ch, "Race created.");
  return true;
}


Olc_Fun (skedit_create)
{
  int j, i = top_skill;
  SkillData *pSkill;
  struct skill_type *new_table;
  char buf[MIL];
  CharData *pch;

  if (!NullStr (argument) && skill_lookup (argument) == -1)
    sprintf (buf, argument);
  else
    sprintf (buf, "New_Skill%d", top_skill + 1);

  top_skill++;

  alloc_mem (new_table, struct skill_type, top_skill);

  if (!new_table)
    {
      chprintln (ch, "Memory Allocation Failed!!! Unable to create skill.");
      return false;
    }

  for (j = 0; j < i; j++)
    new_table[j] = skill_table[j];

  free_mem (skill_table);
  skill_table = new_table;

  skill_table[i].name = str_dup (buf);

  skill_table[i].spell_fun = spell_null;
  skill_table[i].pgsn = &gsn_null;
  skill_table[i].min_mana = 0;
  skill_table[i].target = TAR_IGNORE;
  skill_table[i].minimum_position = POS_STANDING;
  skill_table[i].beats = 0;
  skill_table[i].noun_damage = str_empty;
  skill_table[i].msg_off = str_empty;
  skill_table[i].msg_obj = str_empty;
  alloc_mem (skill_table[i].skill_level, int, top_class);
  alloc_mem (skill_table[i].rating, int, top_class);

  for (pch = player_first; pch; pch = pch->next_player)
    {
      realloc_mem (pch->pcdata->learned, int, top_skill);

      if (pch->gen_data != NULL)
	realloc_mem (pch->gen_data->skill_chosen, bool, top_skill);
    }
  pSkill = &skill_table[i];
  edit_start (ch, pSkill, ED_SKILL);
  chprintln (ch, "Skill created.");
  return true;
}


Olc_Fun (songedit_create)
{
  int j, i = top_song;
  SongData *pSong;
  struct song_data *new_table;
  char buf[MIL];

  if (!NullStr (argument) && song_lookup (argument) == -1)
    sprintf (buf, argument);
  else
    sprintf (buf, "New Song%d", top_song + 1);

  top_song++;

  alloc_mem (new_table, struct song_data, top_song);

  if (!new_table)
    {
      chprintln (ch, "Memory Allocation Failed!!! Unable to create song.");
      return false;
    }

  for (j = 0; j < i; j++)
    new_table[j] = song_table[j];

  free_mem (song_table);
  song_table = new_table;

  song_table[i].name = str_dup (buf);
  song_table[i].group = &str_empty[0];
  for (j = 0; j < MAX_LINES; j++)
    song_table[i].lyrics[j] = NULL;

  pSong = &song_table[i];
  song_table[top_song].name = NULL;
  edit_start (ch, pSong, ED_SONG);
  chprintln (ch, "Song created.");
  return true;
}


Olc_Fun (sedit_create)
{
  SocialData *pSocial;
  char arg[MAX_INPUT_LENGTH];

  argument = one_argument (argument, arg);

  if (NullStr (arg))
    {
      cmd_syntax (ch, NULL, n_fun, "<name>", NULL);
      return false;
    }
  if (social_lookup (arg) != NULL)
    {
      chprintln (ch, "A social with that name already exists.");
      return false;
    }
  pSocial = new_social ();
  replace_str (&pSocial->name, arg);
  add_social (pSocial);
  edit_start (ch, pSocial, ED_SOCIAL);
  chprintln (ch, "Social created.");
  return true;
}


Olc_Fun (hedit_create)
{
  HelpData *help;

  if (NullStr (argument))
    {
      cmd_syntax (ch, NULL, n_fun, "<keywords>", NULL);
      return false;
    }

  if (help_lookup (argument))
    {
      chprintln (ch, "Help already exists.");
      return false;
    }

  help = new_help ();
  help->level = 0;
  help->keyword = str_dup (strupper (argument));
  help->text = str_dup ("");

  add_help (help);

  edit_start (ch, help, ED_HELP);
  chprintln (ch, "Ok.");
  return false;
}

#endif