Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals

olc.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  *  File: olc.c                                                            *
00003  *                                                                         *
00004  *  Much time and thought has gone into this software and you are          *
00005  *  benefitting.  We hope that you share your changes too.  What goes      *
00006  *  around, comes around.                                                  *
00007  *                                                                         *
00008  *  This code was freely distributed with the The Isles 1.1 source code,   *
00009  *  and has been used here for OLC - OLC would not be what it is without   *
00010  *  all the previous coders who released their source code.                *
00011  *                                                                         *
00012  ***************************************************************************/
00013 
00014 
00015 
00016 #if defined(macintosh)
00017 #include <types.h>
00018 #else
00019 #include <sys/types.h>
00020 #endif
00021 #include <ctype.h>
00022 #include <stdio.h>
00023 #include <stdlib.h>
00024 #include <string.h>
00025 #include <time.h>
00026 #include "merc.h"
00027 #include "tables.h"
00028 #include "olc.h"
00029 #include "vehicles.h"
00030 //include "olc_class.c"
00031 /*
00032  * Local functions.
00033  */
00034 AREA_DATA *get_area_data args ((int vnum));
00035 
00036 
00037 /* Executed from comm.c.  Minimizes compiling when changes are made. */
00038 bool run_olc_editor (DESCRIPTOR_DATA * d)
00039 {
00040     switch (d->editor)
00041     {
00042         case ED_AREA:
00043             aedit (d->character, d->incomm);
00044             break;
00045         case ED_ROOM:
00046             redit (d->character, d->incomm);
00047             break;
00048         case ED_OBJECT:
00049             oedit (d->character, d->incomm);
00050             break;
00051         case ED_MOBILE:
00052             medit (d->character, d->incomm);
00053             break;
00054         case ED_MPCODE:
00055             mpedit (d->character, d->incomm);
00056             break;
00057         case ED_HELP:
00058             hedit (d->character, d->incomm);
00059             break;
00060         case ED_SOCIAL:
00061              sedit (d->character, d->incomm);
00062              break;
00063     case ED_CLASS:
00064          cedit (d->character, d->incomm);
00065          break;
00066     case ED_VEHICLE:
00067          vedit (d->character, d->incomm);
00068          break;
00069     default:
00070             return FALSE;
00071     }
00072     return TRUE;
00073 }
00074 
00075 
00076 
00077 char *olc_ed_name (CHAR_DATA * ch)
00078 {
00079     static char buf[10];
00080 
00081     buf[0] = '\0';
00082     switch (ch->desc->editor)
00083     {
00084         case ED_AREA:
00085             sprintf (buf, "AEdit");
00086             break;
00087         case ED_ROOM:
00088             sprintf (buf, "REdit");
00089             break;
00090         case ED_OBJECT:
00091             sprintf (buf, "OEdit");
00092             break;
00093         case ED_MOBILE:
00094             sprintf (buf, "MEdit");
00095             break;
00096         case ED_MPCODE:
00097             sprintf (buf, "MPEdit");
00098             break;
00099         case ED_SOCIAL:
00100             sprintf (buf, "SEdit");
00101             break;
00102         case ED_HELP:
00103             sprintf (buf, "HEdit");
00104             break;
00105     case ED_CLASS:
00106          sprintf(buf, "CEdit");
00107          break;
00108     case ED_VEHICLE:
00109          sprintf(buf, "VEdit");
00110         default:
00111             sprintf (buf, " ");
00112             break;
00113     }
00114     return buf;
00115 }
00116 
00117 
00118 
00119 char *olc_ed_vnum (CHAR_DATA * ch)
00120 {
00121     AREA_DATA *pArea;
00122     ROOM_INDEX_DATA *pRoom;
00123     OBJ_INDEX_DATA *pObj;
00124     MOB_INDEX_DATA *pMob;
00125     MPROG_CODE *pMprog;
00126     HELP_DATA *pHelp;
00127     SOCIAL_LIST *pSocial;
00128     OCLASS_DATA *pClass;
00129     VDATA *pVehicle;
00130     static char buf[MIL];
00131 
00132     buf[0] = '\0';
00133     switch (ch->desc->editor)
00134     {
00135         case ED_AREA:
00136             pArea = (AREA_DATA *) ch->desc->pEdit;
00137             sprintf (buf, "%d", pArea ? pArea->vnum : 0);
00138             break;
00139         case ED_ROOM:
00140             pRoom = ch->in_room;
00141             sprintf (buf, "%d", pRoom ? pRoom->vnum : 0);
00142             break;
00143         case ED_OBJECT:
00144             pObj = (OBJ_INDEX_DATA *) ch->desc->pEdit;
00145             sprintf (buf, "%d", pObj ? pObj->vnum : 0);
00146             break;
00147         case ED_MOBILE:
00148             pMob = (MOB_INDEX_DATA *) ch->desc->pEdit;
00149             sprintf (buf, "%d", pMob ? pMob->vnum : 0);
00150             break;
00151         case ED_MPCODE:
00152             pMprog = (MPROG_CODE *) ch->desc->pEdit;
00153             sprintf (buf, "%d", pMprog ? pMprog->vnum : 0);
00154             break;
00155         case ED_SOCIAL:
00156             pSocial = (SOCIAL_LIST *) ch->desc->pEdit;
00157             sprintf (buf, "%d", pSocial ? pSocial->name : 0);
00158             break;
00159     case ED_VEHICLE:
00160         pVehicle = (VDATA*)ch->desc->pEdit;
00161         sprintf(buf, "%d", pVehicle ? pVehicle->name : 0);
00162         break;
00163         case ED_HELP:
00164             pHelp = (HELP_DATA *) ch->desc->pEdit;
00165             sprintf (buf, "%s", pHelp ? pHelp->keyword : "");
00166             break;
00167     case ED_CLASS:
00168         pClass = (OCLASS_DATA *) ch->desc->pEdit;
00169         sprintf (buf, "%s", pClass ? pClass->name : 0);
00170         break;
00171         
00172         default:
00173             sprintf (buf, " ");
00174             break;
00175     }
00176 
00177     return buf;
00178 }
00179 
00180 
00181 
00182 /*****************************************************************************
00183  Name:        show_olc_cmds
00184  Purpose:    Format up the commands from given table.
00185  Called by:    show_commands(olc_act.c).
00186  ****************************************************************************/
00187 void show_olc_cmds (CHAR_DATA * ch, const struct olc_cmd_type *olc_table)
00188 {
00189     char buf[MAX_STRING_LENGTH];
00190     char buf1[MAX_STRING_LENGTH];
00191     int cmd;
00192     int col;
00193 
00194     buf1[0] = '\0';
00195     col = 0;
00196     for (cmd = 0; olc_table[cmd].name != NULL; cmd++)
00197     {
00198         sprintf (buf, "%-15.15s", olc_table[cmd].name);
00199         strcat (buf1, buf);
00200         if (++col % 5 == 0)
00201             strcat (buf1, "\n\r");
00202     }
00203 
00204     if (col % 5 != 0)
00205         strcat (buf1, "\n\r");
00206 
00207     send_to_char (buf1, ch);
00208     return;
00209 }
00210 
00211 
00212 
00213 /*****************************************************************************
00214  Name:        show_commands
00215  Purpose:    Display all olc commands.
00216  Called by:    olc interpreters.
00217  ****************************************************************************/
00218 bool show_commands (CHAR_DATA * ch, char *argument)
00219 {
00220     switch (ch->desc->editor)
00221     {
00222         case ED_AREA:
00223             show_olc_cmds (ch, aedit_table);
00224             break;
00225         case ED_ROOM:
00226             show_olc_cmds (ch, redit_table);
00227             break;
00228         case ED_OBJECT:
00229             show_olc_cmds (ch, oedit_table);
00230             break;
00231         case ED_MOBILE:
00232             show_olc_cmds (ch, medit_table);
00233             break;
00234         case ED_MPCODE:
00235             show_olc_cmds (ch, mpedit_table);
00236             break;
00237         case ED_SOCIAL:
00238             show_olc_cmds (ch, sedit_table);
00239             break;
00240         case ED_HELP:
00241             show_olc_cmds (ch, hedit_table);
00242             break;
00243     case ED_CLASS:
00244         show_olc_cmds (ch, cedit_table);
00245         break;
00246     case ED_VEHICLE:
00247         show_olc_cmds(ch, vedit_table);
00248         break;
00249     }
00250 
00251     return FALSE;
00252 }
00253 
00254 
00255 
00256 /*****************************************************************************
00257  *                           Interpreter Tables.                             *
00258  *****************************************************************************/
00259 const struct olc_cmd_type aedit_table[] = {
00260 /*  {   command        function    }, */
00261 
00262     {"age", aedit_age},
00263     {"builder", aedit_builder},    /* s removed -- Hugin */
00264     {"commands", show_commands},
00265     {"create", aedit_create},
00266     {"filename", aedit_file},
00267     {"name", aedit_name},
00268 /*  {   "recall",    aedit_recall    },   ROM OLC */
00269     {"reset", aedit_reset},
00270     {"security", aedit_security},
00271     {"show", aedit_show},
00272     {"vnum", aedit_vnum},
00273     {"lvnum", aedit_lvnum},
00274     {"uvnum", aedit_uvnum},
00275     {"credits", aedit_credits},
00276     {"cont", aedit_cont},
00277     {"delete", aedit_delete},
00278 
00279     {"?", show_help},
00280     {"version", show_version},
00281 
00282     {NULL, 0,}
00283 };
00284 
00285 const struct olc_cmd_type vedit_table[] =
00286 {
00287     {"commands", show_commands},
00288     {"vnum",     vedit_vnum},
00289     {"svnum",    vedit_svnum},
00290     {"armor",    vedit_armor},
00291     {"maxriders",vedit_max_riders},
00292     {"path",     vedit_path},
00293     {"terrain",  vedit_terrain},
00294     {"speed",    vedit_speed},
00295     {"type",     vedit_type},
00296     {"name",     vedit_name},
00297     {"show",     vedit_show},
00298     {"delete",   vedit_delete},
00299     {"?",        show_help},
00300     {NULL,0,}
00301 };
00302     
00303 
00304 const struct olc_cmd_type hedit_table[] =
00305 {
00306 /*  {   command     function    }, */
00307         { "commands", show_commands  },
00308             { "desc",     hedit_desc     },
00309         { "keywords", hedit_keywords },
00310         { "level",    hedit_level    },
00311         { "make",     hedit_make     },
00312         { "show",     hedit_show     },
00313         { "delete",   hedit_delete   },
00314         {   "?",      show_help      },
00315         {   NULL, 0, }
00316 
00317 };
00318 
00319 const struct olc_cmd_type sedit_table[] = 
00320 {
00321 /*  {   command        function    }, */
00322     { "commands", show_commands         },
00323     { "create",   sedit_create          },
00324     { "show",     sedit_show            },
00325     { "cnoarg",   sedit_char_no_arg     },
00326     { "onoarg",   sedit_others_no_arg   },
00327     { "cfound",   sedit_char_found      },
00328     { "vfound",   sedit_vict_found      },
00329     { "ofound",   sedit_others_found    },
00330     { "cself",    sedit_char_auto       },
00331     { "oself",    sedit_others_auto     },
00332     { "cnone",    sedit_char_not_found  },
00333     { "delete",   sedit_delete     },
00334     { "?",        show_help        },
00335     { NULL, 0, }
00336 
00337 };
00338 
00339 const struct olc_cmd_type redit_table[] = {
00340 /*  {   command        function    }, */
00341 
00342     {"commands", show_commands},
00343     {"create", redit_create},
00344     {"desc", redit_desc},
00345     {"night", redit_night_desc},
00346     {"dfix", redit_dfix},
00347     {"ed", redit_ed},
00348     {"format", redit_format},
00349     {"name", redit_name},
00350     {"show", redit_show},
00351     {"heal", redit_heal},
00352     {"mana", redit_mana},
00353     {"clan", redit_clan},
00354 
00355     {"north", redit_north},
00356     {"south", redit_south},
00357     {"east", redit_east},
00358     {"west", redit_west},
00359     {"up", redit_up},
00360     {"down", redit_down},
00361     {"northeast", redit_northeast},
00362     {"northwest", redit_northwest},
00363     {"southeast", redit_southeast},
00364     {"southwest", redit_southwest},
00365     /* New reset commands. */
00366     {"mreset", redit_mreset},
00367     {"oreset", redit_oreset},
00368     {"mlist", redit_mlist},
00369     {"rlist", redit_rlist},
00370     {"olist", redit_olist},
00371     {"mshow", redit_mshow},
00372     {"oshow", redit_oshow},
00373     {"owner", redit_owner},
00374     {"room", redit_room},
00375     {"extended", redit_extra},
00376     {"sector", redit_sector},
00377     {"delete", redit_delete},
00378     {"copy", redit_copy},
00379     {"troute", redit_troute},
00380     {"tstate", redit_tstate},
00381     {"ttype", redit_ttype},
00382 
00383 
00384     {"?", show_help},
00385     {"version", show_version},
00386 
00387     {NULL, 0,}
00388 };
00389 
00390 
00391 
00392 const struct olc_cmd_type oedit_table[] = {
00393 /*  {   command        function    }, */
00394 
00395     {"addaffect", oedit_addaffect},
00396     {"addapply", oedit_addapply},
00397     {"commands", show_commands},
00398     {"cost", oedit_cost},
00399     {"create", oedit_create},
00400     {"delaffect", oedit_delaffect},
00401     {"ed", oedit_ed},
00402     {"long", oedit_long},
00403     {"name", oedit_name},
00404     {"short", oedit_short},
00405     {"show", oedit_show},
00406     {"v0", oedit_value0},
00407     {"v1", oedit_value1},
00408     {"v2", oedit_value2},
00409     {"v3", oedit_value3},
00410     {"v4", oedit_value4},        /* ROM */
00411     {"weight", oedit_weight},
00412 
00413     {"extra", oedit_extra},        /* ROM */
00414     {"wear", oedit_wear},        /* ROM */
00415     {"type", oedit_type},        /* ROM */
00416     {"material", oedit_material},    /* ROM */
00417     {"level", oedit_level},        /* ROM */
00418     {"condition", oedit_condition},    /* ROM */
00419 
00420     {"?", show_help},
00421     {"version", show_version},
00422 
00423     {NULL, 0,}
00424 };
00425 /*
00426 const struct olc_cmd_type cedit_table[] = {
00427     {"name", cedit_name},
00428     {"wname", cedit_wname},
00429     {"thac_0", cedit_thac_0},
00430     {"thac_32", cedit_thac_32},
00431     {"primary", cedit_primary},
00432     {"weapon", cedit_weapon},
00433     {"guild1", cedit_guild_1},
00434     {"guild2", cedit_guild_2},
00435     {"skill", cedit_skill},
00436     {"minhp", cedit_min_hp},
00437     {"maxhp", cedit_max_hp},
00438     {"base" , cedit_base},
00439     {"default", cedit_default},
00440     {"commands", show_commands},
00441     {"?", show_help},
00442     {NULL,0}
00443 };*/
00444 
00445 const struct olc_cmd_type medit_table[] = {
00446 /*  {   command        function    }, */
00447 
00448     {"alignment", medit_align},
00449     {"commands", show_commands},
00450     {"create", medit_create},
00451     {"desc", medit_desc},
00452     {"level", medit_level},
00453     {"long", medit_long},
00454     {"name", medit_name},
00455     {"shop", medit_shop},
00456     {"short", medit_short},
00457     {"show", medit_show},
00458     {"spec", medit_spec},
00459 
00460     {"sex", medit_sex},            /* ROM */
00461     {"act", medit_act},            /* ROM */
00462     {"affect", medit_affect},    /* ROM */
00463     {"armor", medit_ac},        /* ROM */
00464     {"form", medit_form},        /* ROM */
00465     {"part", medit_part},        /* ROM */
00466     {"imm", medit_imm},            /* ROM */
00467     {"res", medit_res},            /* ROM */
00468     {"vuln", medit_vuln},        /* ROM */
00469     {"material", medit_material},    /* ROM */
00470     {"off", medit_off},            /* ROM */
00471     {"size", medit_size},        /* ROM */
00472     {"hitdice", medit_hitdice},    /* ROM */
00473     {"manadice", medit_manadice},    /* ROM */
00474     {"damdice", medit_damdice},    /* ROM */
00475     {"race", medit_race},        /* ROM */
00476     {"position", medit_position},    /* ROM */
00477     {"wealth", medit_gold},        /* ROM */
00478     {"hitroll", medit_hitroll},    /* ROM */
00479     {"damtype", medit_damtype},    /* ROM */
00480     {"group", medit_group},        /* ROM */
00481     {"addmprog", medit_addmprog},    /* ROM */
00482     {"delmprog", medit_delmprog},    /* ROM */
00483 
00484     {"?", show_help},
00485     {"version", show_version},
00486 
00487     {NULL, 0,}
00488 };
00489 
00490 /*****************************************************************************
00491  *                          End Interpreter Tables.                          *
00492  *****************************************************************************/
00493 
00494 
00495 
00496 /*****************************************************************************
00497  Name:        get_area_data
00498  Purpose:    Returns pointer to area with given vnum.
00499  Called by:    do_aedit(olc.c).
00500  ****************************************************************************/
00501 AREA_DATA *get_area_data (int vnum)
00502 {
00503     AREA_DATA *pArea;
00504 
00505     for (pArea = area_first; pArea; pArea = pArea->next)
00506     {
00507         if (pArea->vnum == vnum)
00508             return pArea;
00509     }
00510 
00511     return 0;
00512 }
00513 
00514 
00515 
00516 /*****************************************************************************
00517  Name:        edit_done
00518  Purpose:    Resets builder information on completion.
00519  Called by:    aedit, redit, oedit, medit(olc.c)
00520  ****************************************************************************/
00521 bool edit_done (CHAR_DATA * ch)
00522 {
00523     ch->desc->pEdit = NULL;
00524     ch->desc->editor = 0;
00525     return FALSE;
00526 }
00527 
00528 
00529 
00530 /*****************************************************************************
00531  *                              Interpreters.                                *
00532  *****************************************************************************/
00533 
00534 
00535 /* Area Interpreter, called by do_aedit. */
00536 void aedit (CHAR_DATA * ch, char *argument)
00537 {
00538     AREA_DATA *pArea;
00539     char command[MAX_INPUT_LENGTH];
00540     char arg[MAX_INPUT_LENGTH];
00541     int cmd;
00542     int value;
00543 
00544     EDIT_AREA (ch, pArea);
00545     smash_tilde (argument);
00546     strcpy (arg, argument);
00547     argument = one_argument (argument, command);
00548 
00549     if (ch->level < 59)
00550     {
00551         send_to_char ("AEdit:  You are not high enough in level to do this.\n\r",
00552                       ch);
00553         edit_done (ch);
00554         return;
00555     }
00556 
00557     if (!str_cmp (command, "done"))
00558     {
00559         edit_done (ch);
00560         return;
00561     }
00562 
00563     if (command[0] == '\0')
00564     {
00565         aedit_show (ch, argument);
00566         return;
00567     }
00568 
00569     if ((value = flag_value (area_flags, command)) != NO_FLAG)
00570     {
00571         TOGGLE_BIT (pArea->area_flags, value);
00572 
00573         send_to_char ("Flag toggled.\n\r", ch);
00574         return;
00575     }
00576 
00577     /* Search Table and Dispatch Command. */
00578     for (cmd = 0; aedit_table[cmd].name != NULL; cmd++)
00579     {
00580         if (!str_prefix (command, aedit_table[cmd].name))
00581         {
00582             if ((*aedit_table[cmd].olc_fun) (ch, argument))
00583             {
00584                 SET_BIT (pArea->area_flags, AREA_CHANGED);
00585                 return;
00586             }
00587             else
00588                 return;
00589         }
00590     }
00591 
00592     /* Default to Standard Interpreter. */
00593     interpret (ch, arg);
00594     return;
00595 }
00596 
00597 
00598 
00599 /* Room Interpreter, called by do_redit. */
00600 void redit (CHAR_DATA * ch, char *argument)
00601 {
00602     AREA_DATA *pArea;
00603     ROOM_INDEX_DATA *pRoom;
00604     char arg[MAX_STRING_LENGTH];
00605     char command[MAX_INPUT_LENGTH];
00606     int cmd;
00607 
00608     EDIT_ROOM (ch, pRoom);
00609     pArea = pRoom->area;
00610 
00611     smash_tilde (argument);
00612     strcpy (arg, argument);
00613     argument = one_argument (argument, command);
00614 
00615     if (ch->level < 55)
00616     {
00617         send_to_char ("REdit:  You're level is not high enough to do this.\n\r",
00618                       ch);
00619         edit_done (ch);
00620         return;
00621     }
00622 
00623     if (!str_cmp (command, "done"))
00624     {
00625         edit_done (ch);
00626         return;
00627     }
00628 
00629     if (command[0] == '\0')
00630     {
00631         redit_show (ch, argument);
00632         return;
00633     }
00634 
00635     /* Search Table and Dispatch Command. */
00636     for (cmd = 0; redit_table[cmd].name != NULL; cmd++)
00637     {
00638         if (!str_prefix (command, redit_table[cmd].name))
00639         {
00640             if ((*redit_table[cmd].olc_fun) (ch, argument))
00641             {
00642                 SET_BIT (pArea->area_flags, AREA_CHANGED);
00643                 return;
00644             }
00645             else
00646                 return;
00647         }
00648     }
00649 
00650     /* Default to Standard Interpreter. */
00651     interpret (ch, arg);
00652     return;
00653 }
00654 
00655 
00656 
00657 /* Object Interpreter, called by do_oedit. */
00658 void oedit (CHAR_DATA * ch, char *argument)
00659 {
00660     AREA_DATA *pArea;
00661     OBJ_INDEX_DATA *pObj;
00662     char arg[MAX_STRING_LENGTH];
00663     char command[MAX_INPUT_LENGTH];
00664     int cmd;
00665 
00666     smash_tilde (argument);
00667     strcpy (arg, argument);
00668     argument = one_argument (argument, command);
00669 
00670     EDIT_OBJ (ch, pObj);
00671     pArea = pObj->area;
00672 
00673     if (!IS_BUILDER (ch, pArea))
00674     {
00675         send_to_char ("OEdit: Insufficient security to modify area.\n\r", ch);
00676         edit_done (ch);
00677         return;
00678     }
00679 
00680     if (!str_cmp (command, "done"))
00681     {
00682         edit_done (ch);
00683         return;
00684     }
00685 
00686     if (command[0] == '\0')
00687     {
00688         oedit_show (ch, argument);
00689         return;
00690     }
00691 
00692     /* Search Table and Dispatch Command. */
00693     for (cmd = 0; oedit_table[cmd].name != NULL; cmd++)
00694     {
00695         if (!str_prefix (command, oedit_table[cmd].name))
00696         {
00697             if ((*oedit_table[cmd].olc_fun) (ch, argument))
00698             {
00699                 SET_BIT (pArea->area_flags, AREA_CHANGED);
00700                 return;
00701             }
00702             else
00703                 return;
00704         }
00705     }
00706 
00707     /* Default to Standard Interpreter. */
00708     interpret (ch, arg);
00709     return;
00710 }
00711 
00712 
00713 
00714 /* Mobile Interpreter, called by do_medit. */
00715 void medit (CHAR_DATA * ch, char *argument)
00716 {
00717     AREA_DATA *pArea;
00718     MOB_INDEX_DATA *pMob;
00719     char command[MAX_INPUT_LENGTH];
00720     char arg[MAX_STRING_LENGTH];
00721     int cmd;
00722 
00723     smash_tilde (argument);
00724     strcpy (arg, argument);
00725     argument = one_argument (argument, command);
00726 
00727     EDIT_MOB (ch, pMob);
00728     pArea = pMob->area;
00729 
00730     if (ch->level < 55)
00731     {
00732         send_to_char ("MEdit: You're not high enough level to do this.\n\r", ch);
00733         edit_done (ch);
00734         return;
00735     }
00736 
00737     if (!str_cmp (command, "done"))
00738     {
00739         edit_done (ch);
00740         return;
00741     }
00742 
00743     if (command[0] == '\0')
00744     {
00745         medit_show (ch, argument);
00746         return;
00747     }
00748 
00749     /* Search Table and Dispatch Command. */
00750     for (cmd = 0; medit_table[cmd].name != NULL; cmd++)
00751     {
00752         if (!str_prefix (command, medit_table[cmd].name))
00753         {
00754             if ((*medit_table[cmd].olc_fun) (ch, argument))
00755             {
00756                 SET_BIT (pArea->area_flags, AREA_CHANGED);
00757                 return;
00758             }
00759             else
00760                 return;
00761         }
00762     }
00763 
00764     /* Default to Standard Interpreter. */
00765     interpret (ch, arg);
00766     return;
00767 }
00768 /*
00769 void cedit (CHAR_DATA *ch, char *argument)
00770 {
00771     char arg[MAX_INPUT_LENGTH];
00772     char command[MAX_INPUT_LENGTH];
00773     char argall[MAX_INPUT_LENGTH];
00774     char argone[MAX_INPUT_LENGTH];
00775     bool found = FALSE;
00776 
00777     smash_tilde (argument);
00778     strcpy(arg, argument);
00779     argument = one_argument(argument, command);
00780     
00781     if (ch->level < 55)
00782     {
00783         send_to_char ("CEdit: You're not high enough level to do this.\n\r",ch);
00784         edit_done(ch);
00785         return;
00786     }
00787     
00788     if (!str_cmp(command, "done"))
00789     {
00790         edit_done (ch);
00791         return;
00792     }
00793 
00794     if (command[0] == '\0')
00795     {
00796         return;
00797     }
00798     int cmd;
00799     for (cmd = 0; cedit_table[cmd].name != NULL; cmd++)
00800     {
00801         if (!str_prefix(command, cedit_table[cmd].name))
00802         {
00803             if ((*cedit_table[cmd].olc_fun) (ch, argument))
00804             {
00805                 return;
00806             }
00807             else
00808                 return;
00809         }
00810     }
00811     interpret (ch, arg);
00812     return;
00813 }*/
00814 
00815 const struct editor_cmd_type editor_table[] = {
00816 /*  {   command        function    }, */
00817 
00818     {"area", do_aedit},
00819     {"room", do_redit},
00820     {"object", do_oedit},
00821     {"mobile", do_medit},
00822     {"mpcode", do_mpedit},
00823     {"hedit", do_hedit},
00824     {"cedit", do_cedit},
00825 
00826     {NULL, 0,}
00827 };
00828 
00829 /* Entry point for all editors. */
00830 void do_olc (CHAR_DATA * ch, char *argument)
00831 {
00832     char command[MAX_INPUT_LENGTH];
00833     int cmd;
00834 
00835     if (IS_NPC (ch))
00836         return;
00837 
00838     argument = one_argument (argument, command);
00839 
00840     if (command[0] == '\0')
00841     {
00842         do_help (ch, "olc");
00843         return;
00844     }
00845 
00846     /* Search Table and Dispatch Command. */
00847     for (cmd = 0; editor_table[cmd].name != NULL; cmd++)
00848     {
00849         if (!str_prefix (command, editor_table[cmd].name))
00850         {
00851             (*editor_table[cmd].do_fun) (ch, argument);
00852             return;
00853         }
00854     }
00855 
00856     /* Invalid command, send help. */
00857     do_help (ch, "olc");
00858     return;
00859 }
00860 /*
00861 void do_cedit(CHAR_DATA *ch, char *argument)
00862 {
00863     char arg[MAX_STRING_LENGTH];
00864 
00865     if (IS_NPC(ch))
00866         return;
00867     argument = one_argument(argument, arg);
00868     if (is_number(arg))
00869     {
00870         send_to_char("Syntax - cedit [create] class\n\r",ch);
00871         return;
00872     }
00873     else if (!str_cmp(arg, "create"))
00874     {
00875         if (ch->pcdata->security < 9)
00876         {
00877             send_to_char("CEdit: Not enough security.\n\r",ch);
00878             return;
00879         }
00880         cedit_create (ch, "");
00881         ch->desc->editor = ED_CLASS;
00882         return;
00883     }
00884     ch->desc->pEdit (void *) pClass;
00885     ch->desc->editor = ED_CLASS;
00886     return;
00887 }
00888 */
00889 
00890 /* Vehicle editor - Mike - 01-2005 */
00891 void vedit (CHAR_DATA *ch, char *argument)
00892 {
00893     char arg[MAX_INPUT_LENGTH];
00894     char command[MAX_INPUT_LENGTH];
00895     int cmd;
00896 
00897     smash_tilde (argument);
00898     strcpy(arg,argument);
00899     argument = one_argument(argument,command);
00900 
00901     if (ch->pcdata->security < 5)
00902     {
00903         send_to_char("VEdit: Insufficient security to modify vehicles.\n\r",ch);
00904         edit_done(ch);
00905         return;
00906     }
00907     if (!str_cmp(command,"done"))
00908     {
00909         edit_done(ch);
00910         send_to_char("Vehicles Saved.\n\r",ch);
00911         save_vehicles();
00912         return;
00913     }
00914     if (command[0] == '\0')
00915     {
00916         vedit_show(ch,argument);
00917         return;
00918     }
00919     for (cmd=0;vedit_table[cmd].name != NULL;cmd++)
00920     {
00921         if (!str_prefix(command, vedit_table[cmd].name))
00922         {
00923             (*vedit_table[cmd].olc_fun) (ch,argument);
00924             return;
00925         }
00926     }
00927     interpret(ch,arg);
00928     return;
00929 }
00930 
00931 void do_vedit (CHAR_DATA *ch, char *argument)
00932 {
00933     VDATA *vehicle;
00934     char arg1[MIL];
00935     char argall[MIL];
00936     char argone[MIL];
00937     char pbuf[MSL];
00938 
00939     strcpy(arg1,argument);
00940 
00941     if (argument[0] == '\0')
00942     {
00943         argall[0] = '\0';
00944     }
00945 
00946     argument = one_argument(argument, arg1);
00947     if (!str_cmp(arg1, "create"))
00948     {
00949         if (argument[0] == '\0')
00950         {
00951             send_to_char("VEdit: Syntax: vedit [create <vehicle] vehicle\n\r",ch);
00952             return;
00953         }
00954         if (vedit_create(ch,argument))
00955             ch->desc->editor = ED_VEHICLE;
00956         return;
00957     }
00958     else
00959     {
00960         for (vehicle=v_list;vehicle;vehicle = vehicle->next)
00961         {
00962             if (vehicle->name == NULL)
00963                 continue;
00964             colourconv2(pbuf,vehicle->name);
00965             if (!str_prefix(arg1,pbuf))
00966             {
00967                 ch->desc->pEdit = (void*)vehicle;
00968                 ch->desc->editor = ED_VEHICLE;
00969                 return;
00970             }
00971         }
00972         send_to_char("VEdit: Vehicle Not Found.\n\r",ch);
00973     }
00974     return;
00975 }
00976 
00977 
00978     
00979         
00980 
00981     
00982     
00983 /* Social Editor - mis - 01.2005 */
00984 void sedit( CHAR_DATA *ch, char *argument)
00985 {
00986     /* Variable declarations. */
00987     char arg[MAX_INPUT_LENGTH];
00988     char command[MAX_INPUT_LENGTH];
00989     int cmd;
00990 
00991     smash_tilde (argument);
00992     strcpy (arg, argument);
00993     argument = one_argument (argument, command);
00994 
00995     /* Verify character security level. */
00996     if (ch->pcdata->security < 5)
00997     {
00998         send_to_char("SEdit: Insufficient security to modify code\n\r", ch);
00999         edit_done(ch);
01000     }
01001 
01002     /* What is the purpose of this? */
01003     if (!str_cmp(command, "done"))
01004     {
01005         edit_done(ch);
01006         send_to_char("Socials saved.\n\r",ch);
01007     save_socials();
01008     return;
01009     }
01010 
01011     /* What is the purpose of this? */
01012     if (command[0] == '\0')
01013     {
01014         sedit_show(ch, argument);
01015         return;
01016     }
01017 
01018     /* Parse through sedit table commands */
01019     for (cmd = 0; sedit_table[cmd].name != NULL; cmd++)
01020     {
01021         /* Stuff needs to go in here to actually do anything. */
01022         if (!str_prefix (command, sedit_table[cmd].name))
01023         {
01024             (*sedit_table[cmd].olc_fun) (ch, argument);
01025             return;
01026         }
01027     }
01028 
01029     /* Deafult to standard interpreter. */
01030     interpret (ch, arg);
01031     return;
01032 }
01033 
01034 /* Social editor - mis - 01.2005 */
01035 void do_sedit( CHAR_DATA *ch, char *argument)
01036 {
01037     /* Variable declarations */
01038     SOCIAL_LIST *pSocial;
01039     char arg1[MAX_INPUT_LENGTH];
01040     char argall[MAX_INPUT_LENGTH];
01041     char argone[MAX_INPUT_LENGTH];
01042     bool found = FALSE;
01043 
01044     strcpy(arg1, argument);
01045 
01046     if (argument[0] != '\0')
01047     {
01048         argall[0] = '\0';
01049 
01050         
01051     }
01052 
01053     if (!found)
01054     {
01055         argument = one_argument(arg1, arg1);
01056 
01057         /* Verify whether correct format of command. */
01058         if (!str_cmp(arg1, "create"))
01059         {
01060             if (argument[0] == '\0')
01061             {
01062                 send_to_char("Syntax: blah blah blah dumb social [topic]\n\r", ch);
01063                 return;
01064             }
01065 
01066             if (sedit_create(ch, argument))
01067             {    ch->desc->editor = ED_SOCIAL;    }
01068            
01069             return;
01070         }
01071     else
01072     {
01073         for (pSocial = sociallist;pSocial;pSocial = pSocial->next)
01074         {
01075             if (!str_prefix(pSocial->name, arg1))
01076             {
01077                 ch->desc->pEdit = (void*)pSocial;
01078                 ch->desc->editor = ED_SOCIAL;
01079                 return;
01080             }
01081         }
01082     }
01083     }
01084 
01085     send_to_char("SEdit: There is no social to edit.\n\r", ch);
01086     return;
01087 }
01088 
01089 /* Help Editor - kermit 1/98 */
01090 void hedit( CHAR_DATA *ch, char *argument)
01091 {
01092     char command[MIL];
01093     char arg[MIL];
01094     int cmd;
01095     
01096     smash_tilde(argument);
01097     strcpy(arg, argument);
01098     argument = one_argument( argument, command);
01099 
01100     if (ch->pcdata->security < 5)
01101     {
01102         send_to_char("HEdit: Insufficient security to modify code\n\r",ch);
01103        edit_done(ch);
01104     }
01105 
01106     if ( !str_cmp(command, "done") )
01107     {
01108     edit_done( ch );
01109     return;
01110     }
01111 
01112     if ( command[0] == '\0' )
01113     {
01114         hedit_show( ch, argument );
01115     return;
01116     }
01117 
01118     for ( cmd = 0; hedit_table[cmd].name != NULL; cmd++ )
01119     {
01120     if ( !str_prefix( command, hedit_table[cmd].name ) )
01121     {
01122             (*hedit_table[cmd].olc_fun) ( ch, argument );
01123             return;
01124     }
01125     }
01126 
01127     interpret( ch, arg );
01128     return;    
01129 }
01130         
01131 /* Help Editor - kermit 1/98 */
01132 void do_hedit( CHAR_DATA *ch, char *argument )
01133 {
01134     HELP_DATA *pHelp;
01135     char arg1[MIL];
01136     char argall[MAX_INPUT_LENGTH],argone[MAX_INPUT_LENGTH];
01137     bool found = FALSE;
01138 
01139     strcpy(arg1,argument);
01140     
01141     if(argument[0] != '\0')
01142     {
01143         /* Taken from do_help */
01144         argall[0] = '\0';
01145         while (argument[0] != '\0' )
01146         {
01147             argument = one_argument(argument,argone);
01148             if (argall[0] != '\0')
01149                 strcat(argall," ");
01150             strcat(argall,argone);
01151         }
01152 
01153         for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next )
01154         {
01155             if ( is_name( argall, pHelp->keyword ) )
01156             {
01157                 ch->desc->pEdit=(void *)pHelp;
01158                 ch->desc->editor= ED_HELP;
01159                 found = TRUE;
01160                 return;
01161             }
01162         }
01163     }
01164 
01165     if(!found)
01166     {
01167         argument = one_argument(arg1, arg1);
01168         
01169         if(!str_cmp(arg1,"make"))
01170         {
01171             if (argument[0] == '\0')
01172             {
01173                 send_to_char("Syntax: edit help new [topic]\n\r",ch);
01174                 return;
01175             }
01176             if (hedit_make(ch, argument) )
01177                 ch->desc->editor = ED_HELP;
01178             return;
01179         }
01180     }
01181 
01182     send_to_char( "HEdit:  There is no default help to edit.\n\r", ch );
01183     return;
01184 }
01185 
01186 /* Entry point for editing area_data. */
01187 void do_aedit (CHAR_DATA * ch, char *argument)
01188 {
01189     AREA_DATA *pArea;
01190     int value;
01191     char arg[MAX_STRING_LENGTH];
01192 
01193     if (IS_NPC (ch))
01194         return;
01195 
01196     pArea = ch->in_room->area;
01197 
01198     argument = one_argument (argument, arg);
01199 
01200     if (is_number (arg))
01201     {
01202         value = atoi (arg);
01203         if (!(pArea = get_area_data (value)))
01204         {
01205             send_to_char ("That area vnum does not exist.\n\r", ch);
01206             return;
01207         }
01208     }
01209     else if (!str_cmp (arg, "create"))
01210     {
01211         if (ch->pcdata->security < 9)
01212         {
01213             send_to_char ("AEdit : Insufficient security to create area.\n\r",
01214                           ch);
01215             return;
01216         }
01217 
01218         aedit_create (ch, "");
01219         ch->desc->editor = ED_AREA;
01220         return;
01221     }
01222 
01223     if (!IS_BUILDER (ch, pArea))
01224     {
01225         send_to_char ("Insufficient security to edit areas.\n\r", ch);
01226         return;
01227     }
01228 
01229     ch->desc->pEdit = (void *) pArea;
01230     ch->desc->editor = ED_AREA;
01231     return;
01232 }
01233 
01234 
01235 
01236 /* Entry point for editing room_index_data. */
01237 void do_redit (CHAR_DATA * ch, char *argument)
01238 {
01239     ROOM_INDEX_DATA *pRoom;
01240     char arg1[MAX_STRING_LENGTH];
01241 
01242     if (IS_NPC (ch))
01243         return;
01244 
01245     argument = one_argument (argument, arg1);
01246 
01247     pRoom = ch->in_room;
01248 
01249     if (!str_cmp (arg1, "reset"))
01250     {                            /* redit reset */
01251         if (!IS_BUILDER (ch, pRoom->area))
01252         {
01253             send_to_char ("Insufficient security to modify room.\n\r", ch);
01254             return;
01255         }
01256 
01257         reset_room (pRoom);
01258         send_to_char ("Room reset.\n\r", ch);
01259 
01260         return;
01261     }
01262     else if (!str_cmp (arg1, "create"))
01263     {                            /* redit create <vnum> */
01264         if (argument[0] == '\0' || atoi (argument) == 0)
01265         {
01266             send_to_char ("Syntax:  edit room create [vnum]\n\r", ch);
01267             return;
01268         }
01269 
01270         if (redit_create (ch, argument))
01271         {                        /* pEdit == nuevo cuarto */
01272             ch->desc->editor = ED_ROOM;
01273             char_from_room (ch);
01274             char_to_room (ch, ch->desc->pEdit);
01275             SET_BIT (((ROOM_INDEX_DATA *) ch->desc->pEdit)->area->area_flags,
01276                      AREA_CHANGED);
01277         }
01278 
01279         return;
01280     }
01281     else if (!IS_NULLSTR (arg1))
01282     {                            /* redit <vnum> */
01283         pRoom = get_room_index (atoi (arg1));
01284 
01285         if (!pRoom)
01286         {
01287             send_to_char ("REdit : Nonexistant room.\n\r", ch);
01288             return;
01289         }
01290 
01291         if (!IS_BUILDER (ch, pRoom->area))
01292         {
01293             send_to_char ("REdit : Insufficient security to modify room.\n\r",
01294                           ch);
01295             return;
01296         }
01297 
01298         char_from_room (ch);
01299         char_to_room (ch, pRoom);
01300     }
01301 
01302     if (!IS_BUILDER (ch, pRoom->area))
01303     {
01304         send_to_char ("REdit : Insufficient security to modify room.\n\r",
01305                       ch);
01306         return;
01307     }
01308 
01309     ch->desc->pEdit = (void *) pRoom;
01310     ch->desc->editor = ED_ROOM;
01311 
01312     return;
01313 }
01314 
01315 
01316 
01317 /* Entry point for editing obj_index_data. */
01318 void do_oedit (CHAR_DATA * ch, char *argument)
01319 {
01320     OBJ_INDEX_DATA *pObj;
01321     AREA_DATA *pArea;
01322     char arg1[MAX_STRING_LENGTH];
01323     int value;
01324 
01325  if (ch->level < 55) 
01326 {
01327 send_to_char("OEdit: You're not high enough level to do this.\n\r",ch);
01328 return;
01329 }   
01330  if (IS_NPC (ch))
01331         return;
01332 
01333     argument = one_argument (argument, arg1);
01334 
01335     if (is_number (arg1))
01336     {
01337         value = atoi (arg1);
01338         if (!(pObj = get_obj_index (value)))
01339         {
01340             send_to_char ("OEdit:  That vnum does not exist.\n\r", ch);
01341             return;
01342         }
01343 
01344         if (!IS_BUILDER (ch, pObj->area))
01345         {
01346             send_to_char ("Insufficient security to modify objects.\n\r", ch);
01347             return;
01348         }
01349 
01350         ch->desc->pEdit = (void *) pObj;
01351         ch->desc->editor = ED_OBJECT;
01352         return;
01353     }
01354     else
01355     {
01356         if (!str_cmp (arg1, "create"))
01357         {
01358             value = atoi (argument);
01359             if (argument[0] == '\0' || value == 0)
01360             {
01361                 send_to_char ("Syntax:  edit object create [vnum]\n\r", ch);
01362                 return;
01363             }
01364 
01365             pArea = get_vnum_area (value);
01366 
01367             if (!pArea)
01368             {
01369                 send_to_char
01370                     ("OEdit:  That vnum is not assigned an area.\n\r", ch);
01371                 return;
01372             }
01373 
01374             if (!IS_BUILDER (ch, pArea))
01375             {
01376                 send_to_char ("Insufficient security to modify objects.\n\r",
01377                               ch);
01378                 return;
01379             }
01380 
01381             if (oedit_create (ch, argument))
01382             {
01383                 SET_BIT (pArea->area_flags, AREA_CHANGED);
01384                 ch->desc->editor = ED_OBJECT;
01385             }
01386             return;
01387         }
01388     }
01389 
01390     send_to_char ("OEdit:  There is no default object to edit.\n\r", ch);
01391     return;
01392 }
01393 
01394 
01395 
01396 /* Entry point for editing mob_index_data. */
01397 void do_medit (CHAR_DATA * ch, char *argument)
01398 {
01399     MOB_INDEX_DATA *pMob;
01400     AREA_DATA *pArea;
01401     int value;
01402     char arg1[MAX_STRING_LENGTH];
01403 
01404     argument = one_argument (argument, arg1);
01405 
01406     if (IS_NPC (ch))
01407         return;
01408 
01409     if (is_number (arg1))
01410     {
01411         value = atoi (arg1);
01412         if (!(pMob = get_mob_index (value)))
01413         {
01414             send_to_char ("MEdit:  That vnum does not exist.\n\r", ch);
01415             return;
01416         }
01417 
01418         if (!IS_BUILDER (ch, pMob->area))
01419         {
01420             send_to_char ("Insufficient security to modify mobs.\n\r", ch);
01421             return;
01422         }
01423 
01424         ch->desc->pEdit = (void *) pMob;
01425         ch->desc->editor = ED_MOBILE;
01426         return;
01427     }
01428     else
01429     {
01430         if (!str_cmp (arg1, "create"))
01431         {
01432             value = atoi (argument);
01433             if (arg1[0] == '\0' || value == 0)
01434             {
01435                 send_to_char ("Syntax:  edit mobile create [vnum]\n\r", ch);
01436                 return;
01437             }
01438 
01439             pArea = get_vnum_area (value);
01440 
01441             if (!pArea)
01442             {
01443                 send_to_char
01444                     ("OEdit:  That vnum is not assigned an area.\n\r", ch);
01445                 return;
01446             }
01447 
01448             if (!IS_BUILDER (ch, pArea))
01449             {
01450                 send_to_char ("Insufficient security to modify mobs.\n\r",
01451                               ch);
01452                 return;
01453             }
01454 
01455             if (medit_create (ch, argument))
01456             {
01457                 SET_BIT (pArea->area_flags, AREA_CHANGED);
01458                 ch->desc->editor = ED_MOBILE;
01459             }
01460             return;
01461         }
01462     }
01463 
01464     send_to_char ("MEdit:  There is no default mobile to edit.\n\r", ch);
01465     return;
01466 }
01467 
01468 
01469 
01470 void display_resets (CHAR_DATA * ch)
01471 {
01472     ROOM_INDEX_DATA *pRoom;
01473     RESET_DATA *pReset;
01474     MOB_INDEX_DATA *pMob = NULL;
01475     char buf[MAX_STRING_LENGTH];
01476     char final[MAX_STRING_LENGTH];
01477     int iReset = 0;
01478 
01479     EDIT_ROOM (ch, pRoom);
01480     final[0] = '\0';
01481 
01482     send_to_char
01483         (" No.  Loads    Description       Location         Vnum   Mx Mn Description"
01484          "\n\r"
01485          "==== ======== ============= =================== ======== ===== ==========="
01486          "\n\r", ch);
01487 
01488     for (pReset = pRoom->reset_first; pReset; pReset = pReset->next)
01489     {
01490         OBJ_INDEX_DATA *pObj;
01491         MOB_INDEX_DATA *pMobIndex;
01492         OBJ_INDEX_DATA *pObjIndex;
01493         OBJ_INDEX_DATA *pObjToIndex;
01494         ROOM_INDEX_DATA *pRoomIndex;
01495 
01496         final[0] = '\0';
01497         sprintf (final, "[%2d] ", ++iReset);
01498 
01499         switch (pReset->command)
01500         {
01501             default:
01502                 sprintf (buf, "Bad reset command: %c.", pReset->command);
01503                 strcat (final, buf);
01504                 break;
01505 
01506             case 'M':
01507                 if (!(pMobIndex = get_mob_index (pReset->arg1)))
01508                 {
01509                     sprintf (buf, "Load Mobile - Bad Mob %d\n\r",
01510                              pReset->arg1);
01511                     strcat (final, buf);
01512                     continue;
01513                 }
01514 
01515                 if (!(pRoomIndex = get_room_index (pReset->arg3)))
01516                 {
01517                     sprintf (buf, "Load Mobile - Bad Room %d\n\r",
01518                              pReset->arg3);
01519                     strcat (final, buf);
01520                     continue;
01521                 }
01522 
01523                 pMob = pMobIndex;
01524                 sprintf (buf,
01525                          "M[%5d] %-13.13s in room             R[%5d] %2d-%2d %-15.15s\n\r",
01526                          pReset->arg1, pMob->short_descr, pReset->arg3,
01527                          pReset->arg2, pReset->arg4, pRoomIndex->name);
01528                 strcat (final, buf);
01529 
01530                 /*
01531                  * Check for pet shop.
01532                  * -------------------
01533                  */
01534                 {
01535                     ROOM_INDEX_DATA *pRoomIndexPrev;
01536 
01537                     pRoomIndexPrev = get_room_index (pRoomIndex->vnum - 1);
01538                     if (pRoomIndexPrev
01539                         && IS_SET (pRoomIndexPrev->room_flags, ROOM_PET_SHOP))
01540                         final[5] = 'P';
01541                 }
01542 
01543                 break;
01544 
01545             case 'O':
01546                 if (!(pObjIndex = get_obj_index (pReset->arg1)))
01547                 {
01548                     sprintf (buf, "Load Object - Bad Object %d\n\r",
01549                              pReset->arg1);
01550                     strcat (final, buf);
01551                     continue;
01552                 }
01553 
01554                 pObj = pObjIndex;
01555 
01556                 if (!(pRoomIndex = get_room_index (pReset->arg3)))
01557                 {
01558                     sprintf (buf, "Load Object - Bad Room %d\n\r",
01559                              pReset->arg3);
01560                     strcat (final, buf);
01561                     continue;
01562                 }
01563 
01564                 sprintf (buf, "O[%5d] %-13.13s in room             "
01565                          "R[%5d]       %-15.15s\n\r",
01566                          pReset->arg1, pObj->short_descr,
01567                          pReset->arg3, pRoomIndex->name);
01568                 strcat (final, buf);
01569 
01570                 break;
01571 
01572             case 'P':
01573                 if (!(pObjIndex = get_obj_index (pReset->arg1)))
01574                 {
01575                     sprintf (buf, "Put Object - Bad Object %d\n\r",
01576                              pReset->arg1);
01577                     strcat (final, buf);
01578                     continue;
01579                 }
01580 
01581                 pObj = pObjIndex;
01582 
01583                 if (!(pObjToIndex = get_obj_index (pReset->arg3)))
01584                 {
01585                     sprintf (buf, "Put Object - Bad To Object %d\n\r",
01586                              pReset->arg3);
01587                     strcat (final, buf);
01588                     continue;
01589                 }
01590 
01591                 sprintf (buf,
01592                          "O[%5d] %-13.13s inside              O[%5d] %2d-%2d %-15.15s\n\r",
01593                          pReset->arg1,
01594                          pObj->short_descr,
01595                          pReset->arg3,
01596                          pReset->arg2, pReset->arg4,
01597                          pObjToIndex->short_descr);
01598                 strcat (final, buf);
01599 
01600                 break;
01601 
01602             case 'G':
01603             case 'E':
01604                 if (!(pObjIndex = get_obj_index (pReset->arg1)))
01605                 {
01606                     sprintf (buf, "Give/Equip Object - Bad Object %d\n\r",
01607                              pReset->arg1);
01608                     strcat (final, buf);
01609                     continue;
01610                 }
01611 
01612                 pObj = pObjIndex;
01613 
01614                 if (!pMob)
01615                 {
01616                     sprintf (buf,
01617                              "Give/Equip Object - No Previous Mobile\n\r");
01618                     strcat (final, buf);
01619                     break;
01620                 }
01621 
01622                 if (pMob->pShop)
01623                 {
01624                     sprintf (buf,
01625                              "O[%5d] %-13.13s in the inventory of S[%5d]       %-15.15s\n\r",
01626                              pReset->arg1,
01627                              pObj->short_descr, pMob->vnum,
01628                              pMob->short_descr);
01629                 }
01630                 else
01631                     sprintf (buf,
01632                              "O[%5d] %-13.13s %-19.19s M[%5d]       %-15.15s\n\r",
01633                              pReset->arg1,
01634                              pObj->short_descr,
01635                              (pReset->command == 'G') ?
01636                              flag_string (wear_loc_strings, WEAR_NONE)
01637                              : flag_string (wear_loc_strings, pReset->arg3),
01638                              pMob->vnum, pMob->short_descr);
01639                 strcat (final, buf);
01640 
01641                 break;
01642 
01643                 /*
01644                  * Doors are set in rs_flags don't need to be displayed.
01645                  * If you want to display them then uncomment the new_reset
01646                  * line in the case 'D' in load_resets in db.c and here.
01647                  */
01648             case 'D':
01649                 pRoomIndex = get_room_index (pReset->arg1);
01650                 sprintf (buf, "R[%5d] %s door of %-19.19s reset to %s\n\r",
01651                          pReset->arg1,
01652                          capitalize (dir_name[pReset->arg2]),
01653                          pRoomIndex->name,
01654                          flag_string (door_resets, pReset->arg3));
01655                 strcat (final, buf);
01656 
01657                 break;
01658                 /*
01659                  * End Doors Comment.
01660                  */
01661             case 'R':
01662                 if (!(pRoomIndex = get_room_index (pReset->arg1)))
01663                 {
01664                     sprintf (buf, "Randomize Exits - Bad Room %d\n\r",
01665                              pReset->arg1);
01666                     strcat (final, buf);
01667                     continue;
01668                 }
01669 
01670                 sprintf (buf, "R[%5d] Exits are randomized in %s\n\r",
01671                          pReset->arg1, pRoomIndex->name);
01672                 strcat (final, buf);
01673 
01674                 break;
01675         }
01676         send_to_char (final, ch);
01677     }
01678 
01679     return;
01680 }
01681 
01682 
01683 
01684 /*****************************************************************************
01685  Name:        add_reset
01686  Purpose:    Inserts a new reset in the given index slot.
01687  Called by:    do_resets(olc.c).
01688  ****************************************************************************/
01689 void add_reset (ROOM_INDEX_DATA * room, RESET_DATA * pReset, int index)
01690 {
01691     RESET_DATA *reset;
01692     int iReset = 0;
01693 
01694     if (!room->reset_first)
01695     {
01696         room->reset_first = pReset;
01697         room->reset_last = pReset;
01698         pReset->next = NULL;
01699         return;
01700     }
01701 
01702     index--;
01703 
01704     if (index == 0)
01705     {                            /* First slot (1) selected. */
01706         pReset->next = room->reset_first;
01707         room->reset_first = pReset;
01708         return;
01709     }
01710 
01711     /*
01712      * If negative slot( <= 0 selected) then this will find the last.
01713      */
01714     for (reset = room->reset_first; reset->next; reset = reset->next)
01715     {
01716         if (++iReset == index)
01717             break;
01718     }
01719 
01720     pReset->next = reset->next;
01721     reset->next = pReset;
01722     if (!pReset->next)
01723         room->reset_last = pReset;
01724     return;
01725 }
01726 
01727 
01728 
01729 void do_resets (CHAR_DATA * ch, char *argument)
01730 {
01731     char arg1[MAX_INPUT_LENGTH];
01732     char arg2[MAX_INPUT_LENGTH];
01733     char arg3[MAX_INPUT_LENGTH];
01734     char arg4[MAX_INPUT_LENGTH];
01735     char arg5[MAX_INPUT_LENGTH];
01736     char arg6[MAX_INPUT_LENGTH];
01737     char arg7[MAX_INPUT_LENGTH];
01738     RESET_DATA *pReset = NULL;
01739 
01740     argument = one_argument (argument, arg1);
01741     argument = one_argument (argument, arg2);
01742     argument = one_argument (argument, arg3);
01743     argument = one_argument (argument, arg4);
01744     argument = one_argument (argument, arg5);
01745     argument = one_argument (argument, arg6);
01746     argument = one_argument (argument, arg7);
01747 
01748     if (!IS_BUILDER (ch, ch->in_room->area))
01749     {
01750         send_to_char ("Resets: Invalid security for editing this area.\n\r",
01751                       ch);
01752         return;
01753     }
01754 
01755     /*
01756      * Display resets in current room.
01757      * -------------------------------
01758      */
01759     if (arg1[0] == '\0')
01760     {
01761         if (ch->in_room->reset_first)
01762         {
01763             send_to_char ("Resets: M = mobile, R = room, O = object, "
01764                           "P = pet, S = shopkeeper\n\r", ch);
01765             display_resets (ch);
01766         }
01767         else
01768             send_to_char ("No resets in this room.\n\r", ch);
01769     }
01770 
01771 
01772     /*
01773      * Take index number and search for commands.
01774      * ------------------------------------------
01775      */
01776     if (is_number (arg1))
01777     {
01778         ROOM_INDEX_DATA *pRoom = ch->in_room;
01779 
01780         /*
01781          * Delete a reset.
01782          * ---------------
01783          */
01784         if (!str_cmp (arg2, "delete"))
01785         {
01786             int insert_loc = atoi (arg1);
01787 
01788             if (!ch->in_room->reset_first)
01789             {
01790                 send_to_char ("No resets in this area.\n\r", ch);
01791                 return;
01792             }
01793 
01794             if (insert_loc - 1 <= 0)
01795             {
01796                 pReset = pRoom->reset_first;
01797                 pRoom->reset_first = pRoom->reset_first->next;
01798                 if (!pRoom->reset_first)
01799                     pRoom->reset_last = NULL;
01800             }
01801             else
01802             {
01803                 int iReset = 0;
01804                 RESET_DATA *prev = NULL;
01805 
01806                 for (pReset = pRoom->reset_first;
01807                      pReset; pReset = pReset->next)
01808                 {
01809                     if (++iReset == insert_loc)
01810                         break;
01811                     prev = pReset;
01812                 }
01813 
01814                 if (!pReset)
01815                 {
01816                     send_to_char ("Reset not found.\n\r", ch);
01817                     return;
01818                 }
01819 
01820                 if (prev)
01821                     prev->next = prev->next->next;
01822                 else
01823                     pRoom->reset_first = pRoom->reset_first->next;
01824 
01825                 for (pRoom->reset_last = pRoom->reset_first;
01826                      pRoom->reset_last->next;
01827                      pRoom->reset_last = pRoom->reset_last->next);
01828             }
01829 
01830             free_reset_data (pReset);
01831             send_to_char ("Reset deleted.\n\r", ch);
01832         }
01833         else
01834             /*
01835              * Add a reset.
01836              * ------------
01837              */
01838             if ((!str_cmp (arg2, "mob") && is_number (arg3))
01839                 || (!str_cmp (arg2, "obj") && is_number (arg3)))
01840         {
01841             /*
01842              * Check for Mobile reset.
01843              * -----------------------
01844              */
01845             if (!str_cmp (arg2, "mob"))
01846             {
01847                 if (get_mob_index (is_number (arg3) ? atoi (arg3) : 1) ==
01848                     NULL)
01849                 {
01850                     send_to_char ("Mob doesn't exist.\n\r", ch);
01851                     return;
01852                 }
01853                 pReset = new_reset_data ();
01854                 pReset->command = 'M';
01855                 pReset->arg1 = atoi (arg3);
01856                 pReset->