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

olc_act.c

Go to the documentation of this file.
00001 /***************************************************************************
00002  *  File: olc_act.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 "recycle.h"
00030 #include "lookup.h"
00031 
00032 char *mprog_type_to_name (int type);
00033 
00034 #define ALT_FLAGVALUE_SET( _blargh, _table, _arg )        \
00035     {                            \
00036         int blah = flag_value( _table, _arg );        \
00037         _blargh = (blah == NO_FLAG) ? 0 : blah;        \
00038     }
00039 
00040 #define ALT_FLAGVALUE_TOGGLE( _blargh, _table, _arg )        \
00041     {                            \
00042         int blah = flag_value( _table, _arg );        \
00043         _blargh ^= (blah == NO_FLAG) ? 0 : blah;    \
00044     }
00045 
00046 /* Return TRUE if area changed, FALSE if not. */
00047 #define REDIT( fun )        bool fun( CHAR_DATA *ch, char *argument )
00048 #define OEDIT( fun )        bool fun( CHAR_DATA *ch, char *argument )
00049 #define MEDIT( fun )        bool fun( CHAR_DATA *ch, char *argument )
00050 #define AEDIT( fun )        bool fun( CHAR_DATA *ch, char *argument )
00051 #define SEDIT( fun )        bool fun( CHAR_DATA *ch, char *argument )
00052 #define HEDIT( fun )        bool fun( CHAR_DATA *ch, char *argument )
00053 //#define CEDIT( fun )      bool fun( CHAR_DATA *ch, char *argument )
00054 
00055 struct olc_help_type {
00056     char *command;
00057     const void *structure;
00058     char *desc;
00059 };
00060 
00061 bool show_version (CHAR_DATA * ch, char *argument)
00062 {
00063     send_to_char (VERSION, ch);
00064     send_to_char ("\n\r", ch);
00065     send_to_char (AUTHOR, ch);
00066     send_to_char ("\n\r", ch);
00067     send_to_char (DATE, ch);
00068     send_to_char ("\n\r", ch);
00069     send_to_char (CREDITS, ch);
00070     send_to_char ("\n\r", ch);
00071 
00072     return FALSE;
00073 }
00074 
00075 /*
00076  * This table contains help commands and a brief description of each.
00077  * ------------------------------------------------------------------
00078  */
00079 const struct olc_help_type help_table[] = {
00080     {"area", area_flags, "Area attributes."},
00081     {"room", room_flags, "Room attributes."},
00082     {"sector", sector_flags, "Sector types, terrain."},
00083     {"exit", exit_flags, "Exit types."},
00084     {"type", type_flags, "Types of objects."},
00085     {"extra", extra_flags, "Object attributes."},
00086     {"wear", wear_flags, "Where to wear object."},
00087     {"spec", spec_table, "Available special programs."},
00088     {"sex", sex_flags, "Sexes."},
00089     {"act", act_flags, "Mobile attributes."},
00090     {"affect", affect_flags, "Mobile affects."},
00091     {"wear-loc", wear_loc_flags, "Where mobile wears object."},
00092     {"spells", skill_table, "Names of current spells."},
00093     {"container", container_flags, "Container status."},
00094     {"extended", room_flags_extra, "Extended room Attributes -- tribul"},
00095 
00096 /* ROM specific bits: */
00097 
00098     {"armor", ac_type, "Ac for different attacks."},
00099     {"apply", apply_flags, "Apply flags"},
00100     {"form", form_flags, "Mobile body form."},
00101     {"part", part_flags, "Mobile body parts."},
00102     {"imm", imm_flags, "Mobile immunity."},
00103     {"res", res_flags, "Mobile resistance."},
00104     {"vuln", vuln_flags, "Mobile vulnerability."},
00105     {"off", off_flags, "Mobile offensive behaviour."},
00106     {"size", size_flags, "Mobile size."},
00107     {"position", position_flags, "Mobile positions."},
00108     {"wclass", weapon_class, "Weapon class."},
00109     {"wtype", weapon_type2, "Special weapon type."},
00110     {"portal", portal_flags, "Portal types."},
00111     {"furniture", furniture_flags, "Furniture types."},
00112     {"liquid", liq_table, "Liquid types."},
00113     {"apptype", apply_types, "Apply types."},
00114     {"weapon", attack_table, "Weapon types."},
00115     {"mprog", mprog_flags, "MobProgram flags."},
00116     /*{"wname", cedit_wname, "Three letter who name"},
00117     {"thac0", cedit_thac_0, "To hit armor class level zero"},
00118     {"thac32", cedit_thac_32, "To hit armor class level 32"},
00119     {"skill", cedit_skill, "How high the class can practice a skill to"},*/
00120     {NULL, NULL, NULL}
00121 };
00122 
00123 /*****************************************************************************
00124  Name:        show_flag_cmds
00125  Purpose:    Displays settable flags and stats.
00126  Called by:    show_help(olc_act.c).
00127  ****************************************************************************/
00128 void show_flag_cmds (CHAR_DATA * ch, const struct flag_type *flag_table)
00129 {
00130     char buf[MAX_STRING_LENGTH];
00131     char buf1[MAX_STRING_LENGTH];
00132     int flag;
00133     int col;
00134 
00135     buf1[0] = '\0';
00136     col = 0;
00137     for (flag = 0; flag_table[flag].name != NULL; flag++)
00138     {
00139         if (flag_table[flag].settable)
00140         {
00141             sprintf (buf, "%-19.18s", flag_table[flag].name);
00142             strcat (buf1, buf);
00143             if (++col % 4 == 0)
00144                 strcat (buf1, "\n\r");
00145         }
00146     }
00147 
00148     if (col % 4 != 0)
00149         strcat (buf1, "\n\r");
00150 
00151     send_to_char (buf1, ch);
00152     return;
00153 }
00154 
00155 
00156 /*****************************************************************************
00157  Name:        show_skill_cmds
00158  Purpose:    Displays all skill functions.
00159          Does remove those damn immortal commands from the list.
00160          Could be improved by:
00161          (1) Adding a check for a particular class.
00162          (2) Adding a check for a level range.
00163  Called by:    show_help(olc_act.c).
00164  ****************************************************************************/
00165 void show_skill_cmds (CHAR_DATA * ch, int tar)
00166 {
00167     char buf[MAX_STRING_LENGTH];
00168     char buf1[MAX_STRING_LENGTH * 2];
00169     int sn;
00170     int col;
00171 
00172     buf1[0] = '\0';
00173     col = 0;
00174     for (sn = 0; sn < MAX_SKILL; sn++)
00175     {
00176         if (!skill_table[sn].name)
00177             break;
00178 
00179         if (!str_cmp (skill_table[sn].name, "reserved")
00180             || skill_table[sn].spell_fun == spell_null)
00181             continue;
00182 
00183         if (tar == -1 || skill_table[sn].target == tar)
00184         {
00185             sprintf (buf, "%-19.18s", skill_table[sn].name);
00186             strcat (buf1, buf);
00187             if (++col % 4 == 0)
00188                 strcat (buf1, "\n\r");
00189         }
00190     }
00191 
00192     if (col % 4 != 0)
00193         strcat (buf1, "\n\r");
00194 
00195     send_to_char (buf1, ch);
00196     return;
00197 }
00198 
00199 
00200 /*****************************************************************************
00201  Name:        show_spec_cmds
00202  Purpose:    Displays settable special functions.
00203  Called by:    show_help(olc_act.c).
00204  ****************************************************************************/
00205 void show_spec_cmds (CHAR_DATA * ch)
00206 {
00207     char buf[MAX_STRING_LENGTH];
00208     char buf1[MAX_STRING_LENGTH];
00209     int spec;
00210     int col;
00211 
00212     buf1[0] = '\0';
00213     col = 0;
00214     send_to_char ("Preceed special functions with 'spec_'\n\r\n\r", ch);
00215     for (spec = 0; spec_table[spec].function != NULL; spec++)
00216     {
00217         sprintf (buf, "%-19.18s", &spec_table[spec].name[5]);
00218         strcat (buf1, buf);
00219         if (++col % 4 == 0)
00220             strcat (buf1, "\n\r");
00221     }
00222 
00223     if (col % 4 != 0)
00224         strcat (buf1, "\n\r");
00225 
00226     send_to_char (buf1, ch);
00227     return;
00228 }
00229 
00230 /*****************************************************************************
00231  Name:        show_help
00232  Purpose:    Displays help for many tables used in OLC.
00233  Called by:    olc interpreters.
00234  ****************************************************************************/
00235 bool show_help (CHAR_DATA * ch, char *argument)
00236 {
00237     char buf[MAX_STRING_LENGTH];
00238     char arg[MAX_INPUT_LENGTH];
00239     char spell[MAX_INPUT_LENGTH];
00240     int cnt;
00241 
00242     argument = one_argument (argument, arg);
00243     one_argument (argument, spell);
00244 
00245     /*
00246      * Display syntax.
00247      */
00248     if (arg[0] == '\0')
00249     {
00250         send_to_char ("Syntax:  ? [command]\n\r\n\r", ch);
00251         send_to_char ("[command]  [description]\n\r", ch);
00252         for (cnt = 0; help_table[cnt].command != NULL; cnt++)
00253         {
00254             sprintf (buf, "%-10.10s -%s\n\r",
00255                      capitalize (help_table[cnt].command),
00256                      help_table[cnt].desc);
00257             send_to_char (buf, ch);
00258         }
00259         return FALSE;
00260     }
00261 
00262     /*
00263      * Find the command, show changeable data.
00264      * ---------------------------------------
00265      */
00266     for (cnt = 0; help_table[cnt].command != NULL; cnt++)
00267     {
00268         if (arg[0] == help_table[cnt].command[0]
00269             && !str_prefix (arg, help_table[cnt].command))
00270         {
00271             if (help_table[cnt].structure == spec_table)
00272             {
00273                 show_spec_cmds (ch);
00274                 return FALSE;
00275             }
00276             else if (help_table[cnt].structure == liq_table)
00277             {
00278                 show_liqlist (ch);
00279                 return FALSE;
00280             }
00281             else if (help_table[cnt].structure == attack_table)
00282             {
00283                 show_damlist (ch);
00284                 return FALSE;
00285             }
00286             else if (help_table[cnt].structure == skill_table)
00287             {
00288 
00289                 if (spell[0] == '\0')
00290                 {
00291                     send_to_char ("Syntax:  ? spells "
00292                                   "[ignore/attack/defend/self/object/all]\n\r",
00293                                   ch);
00294                     return FALSE;
00295                 }
00296 
00297                 if (!str_prefix (spell, "all"))
00298                     show_skill_cmds (ch, -1);
00299                 else if (!str_prefix (spell, "ignore"))
00300                     show_skill_cmds (ch, TAR_IGNORE);
00301                 else if (!str_prefix (spell, "attack"))
00302                     show_skill_cmds (ch, TAR_CHAR_OFFENSIVE);
00303                 else if (!str_prefix (spell, "defend"))
00304                     show_skill_cmds (ch, TAR_CHAR_DEFENSIVE);
00305                 else if (!str_prefix (spell, "self"))
00306                     show_skill_cmds (ch, TAR_CHAR_SELF);
00307                 else if (!str_prefix (spell, "object"))
00308                     show_skill_cmds (ch, TAR_OBJ_INV);
00309                 else
00310                     send_to_char ("Syntax:  ? spell "
00311                                   "[ignore/attack/defend/self/object/all]\n\r",
00312                                   ch);
00313 
00314                 return FALSE;
00315             }
00316             else
00317             {
00318                 show_flag_cmds (ch, help_table[cnt].structure);
00319                 return FALSE;
00320             }
00321         }
00322     }
00323 
00324     show_help (ch, "");
00325     return FALSE;
00326 }
00327 /*
00328 void do_flagall(CHAR_DATA *ch, char *argument)
00329 {
00330     char arg[MSL];
00331     char buf[MSL];
00332     ROOM_INDEX_DATA *pRoom;
00333     AREA_DATA *pArea;
00334     int count,vnum,value=0;
00335     bool found;
00336     
00337 
00338     argument = one_argument(argument, arg);
00339 
00340     if (ch->level < 59)
00341     {
00342         send_to_char("Huh?\n\r",ch);
00343         return;
00344     }
00345     
00346     if (arg[0] == '\0' || argument[0] == '\0')
00347     {
00348         send_to_char("Syntax: Flagall [name|sector|room|extended] <flags>\n\r",ch);
00349         return;
00350     }
00351 
00352     if (!str_prefix(arg, "name") || !str_prefix(arg, "sector") || !str_prefix(arg, "room") 
00353             || !str_prefix(arg, "extended"))
00354     {
00355         pArea = ch->in_room->area;
00356         for (vnum=pArea->min_vnum;vnum <=pArea->max_vnum;vnum++)
00357         {
00358             
00359             if ((pRoom = get_room_index(vnum)))
00360             {
00361                 found = TRUE;
00362                 if (!str_prefix(arg, "name"))
00363                 {
00364                     free_string (pRoom->name);
00365                     pRoom->name = str_dup (argument);
00366                     count++;
00367                     continue;
00368                 }
00369                 else if (!str_prefix(arg, "sector"))
00370                 {
00371                     if ((value = flag_value (sector_flags, argument)) == NO_FLAG)
00372                     {
00373                         send_to_char ("Invalid flag. Not setting rooms.\n\r", ch);
00374                         return;
00375                     }
00376                     pRoom->sector_type = value;
00377                     count++;
00378                     continue;
00379                 }
00380                 else if (!str_prefix(arg, "room"))
00381                 {
00382                     if ((value = flag_value(room_flags, argument)) == NO_FLAG)
00383                     {
00384                         send_to_char("Invalid flag. Not setting rooms.\n\r",ch);
00385                         return;
00386                     }
00387                     pRoom->room_flags = value;
00388                     count++;
00389                     continue;
00390                 }
00391                 else if (!str_prefix(arg, "extended"))
00392                 {
00393                     send_to_char("No extendeds allowed right now.\n\r",ch);
00394                     return;
00395                 }
00396                 else
00397                 {
00398                     send_to_char("Invalid type.\n\r",ch);
00399                     return;
00400                 }
00401             }
00402         }
00403         
00404         if (found)
00405         {
00406             sprintf(buf, "%d rooms set.\n\r",count);
00407             send_to_char(buf,ch);
00408             SET_BIT (ch->in_room->area->area_flags, AREA_CHANGED);
00409                     
00410             return;
00411         }
00412         else
00413         {
00414             send_to_char("No rooms in area.\n\r",ch);
00415             return;
00416         }
00417     }
00418 }
00419                 
00420                 
00421 */
00422                 
00423 SEDIT (sedit_create)
00424 {
00425         SOCIAL_LIST *slist;
00426     slist = new_social();
00427     add_social(slist);
00428     ch->desc->pEdit = (void*)slist;
00429     
00430     send_to_char("Social Created.\n\r", ch);
00431     //strcpy(slist->name, argument) ;
00432     slist->name = str_dup(argument);
00433     return;
00434 }
00435 
00436 SEDIT (sedit_show)
00437 {
00438     SOCIAL_LIST *slist;
00439     EDIT_SOCIAL(ch, slist);
00440     
00441         printf_to_char(ch, "Name          : %s\n", slist->name);
00442     printf_to_char(ch, "Char, no arg  : %s\n", slist->char_no_arg);
00443     printf_to_char(ch, "Others, no arg: %s\n", slist->others_no_arg);
00444     printf_to_char(ch, "Char Found    : %s\n", slist->char_found);
00445     printf_to_char(ch, "Others Found  : %s\n", slist->others_found);
00446     printf_to_char(ch, "Vict found    : %s\n", slist->vict_found);
00447     printf_to_char(ch, "Char not found: %s\n", slist->char_not_found);
00448     printf_to_char(ch, "Char auto     : %s\n", slist->char_auto);
00449     printf_to_char(ch, "Others auto   : %s\n", slist->others_auto);
00450     return;
00451 }
00452 
00453 SEDIT (sedit_char_no_arg)
00454 {
00455     SOCIAL_LIST *slist;
00456     if (argument[0] == '\0')
00457     {
00458         send_to_char("Please enter a value.\n",ch);
00459         return;
00460     }
00461 
00462     EDIT_SOCIAL(ch, slist);
00463     slist->char_no_arg = str_dup(argument);
00464     printf_to_char(ch, "Char_no_arg set to %s.\n", slist->char_no_arg);
00465     return;
00466 }
00467 
00468 SEDIT (sedit_others_no_arg)
00469 {
00470     SOCIAL_LIST *slist;
00471     if (argument[0] == '\0')
00472     {
00473         send_to_char("Please enter a value.\n",ch);
00474         return;
00475     }
00476     
00477     EDIT_SOCIAL(ch, slist);
00478     slist->others_no_arg = str_dup(argument);
00479     printf_to_char(ch, "Others_no_arg set to %s.\n", slist->others_no_arg);
00480     
00481         return;
00482 }
00483 
00484 SEDIT (sedit_char_found)
00485 {
00486     SOCIAL_LIST *slist;
00487     if (argument[0] == '\0')
00488     {
00489         send_to_char("Please enter a value.\n",ch);
00490         return;
00491     }
00492 
00493     EDIT_SOCIAL(ch, slist);
00494     slist->char_found = str_dup(argument);
00495     printf_to_char(ch, "Char_found set to %s.\n", slist->char_found);
00496         return;
00497 }
00498 
00499 SEDIT (sedit_vict_found)
00500 {
00501     SOCIAL_LIST *slist;
00502     if (argument[0] == '\0')
00503     {
00504         send_to_char("Please enter a value.\n",ch);
00505         return;
00506     }
00507 
00508     EDIT_SOCIAL(ch,slist);
00509     slist->vict_found = str_dup(argument);
00510     printf_to_char(ch, "Vict_found set to %s.\n", slist->vict_found);
00511     return;
00512 }
00513 
00514 SEDIT (sedit_others_found)
00515 {
00516     SOCIAL_LIST *slist;
00517     if (argument[0] == '\0')
00518     {
00519         send_to_char("Please enter a value.\n",ch);
00520         return;
00521     }
00522     EDIT_SOCIAL(ch,slist);
00523     slist->others_found = str_dup(argument);
00524     printf_to_char(ch, "Others_found set to %s.\n", slist->others_found);
00525         return;
00526 }
00527 
00528 SEDIT (sedit_char_auto)
00529 {
00530     SOCIAL_LIST *slist;
00531     if (argument[0] == '\0')
00532     {
00533         send_to_char("Please enter a value.\n\r",ch);
00534         return;
00535     }
00536     EDIT_SOCIAL(ch, slist);
00537     slist->char_auto = str_dup(argument);
00538     printf_to_char(ch, "Char_auto set to %s.\n\r", slist->char_auto);
00539     return;
00540 }
00541 
00542 SEDIT (sedit_others_auto)
00543 {
00544     SOCIAL_LIST *slist;
00545     if (argument[0] == '\0')
00546     {
00547         send_to_char("Please enter a value.\n\r",ch);
00548         return;
00549     }
00550 
00551     EDIT_SOCIAL (ch, slist);
00552     slist->others_auto = str_dup(argument);
00553     printf_to_char(ch, "Others_auto set to %s\n\r",slist->others_auto);
00554         return;
00555 }
00556 
00557 SEDIT (sedit_char_not_found)
00558 {
00559     SOCIAL_LIST *slist;
00560     if (argument[0] == '\0')
00561     {
00562         send_to_char("Please enter a value.\n\r",ch);
00563         return;
00564     }
00565 
00566     EDIT_SOCIAL(ch,slist);
00567     slist->char_not_found = str_dup(argument);
00568     printf_to_char(ch, "Char_not_found set to %s.\n\r",slist->char_not_found);
00569     return;
00570 }
00571 
00572 SEDIT (sedit_delete)
00573 {
00574     SOCIAL_LIST *slist;
00575     EDIT_SOCIAL(ch,slist);
00576 
00577     slist->name = NULL;
00578     slist->char_no_arg = NULL;
00579 
00580     send_to_char("Social Marked for deletion.\n\r",ch);
00581     
00582         return;
00583 }
00584 
00585 REDIT (redit_rlist)
00586 {
00587     ROOM_INDEX_DATA *pRoomIndex;
00588     AREA_DATA *pArea;
00589     char buf[MAX_STRING_LENGTH];
00590     BUFFER *buf1;
00591     char arg[MAX_INPUT_LENGTH];
00592     bool found;
00593     int vnum;
00594     int col = 0;
00595     int roomcount=0;
00596 
00597     one_argument (argument, arg);
00598 
00599     pArea = ch->in_room->area;
00600     buf1 = new_buf ();
00601 /*    buf1[0] = '\0'; */
00602     found = FALSE;
00603 
00604     for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++)
00605     {
00606         if ((pRoomIndex = get_room_index (vnum)))
00607         {
00608             found = TRUE;
00609             sprintf (buf, "{x[{c%9d{x] {W%-17.16s{x",
00610                      vnum, capitalize (pRoomIndex->name));
00611             add_buf (buf1, buf);
00612         roomcount++;
00613             if (++col % 3 == 0)
00614                 add_buf (buf1, "\n\r");
00615         }
00616     }
00617 
00618     if (!found)
00619     {
00620         send_to_char ("Room(s) not found in this area.\n\r", ch);
00621         return FALSE;
00622     }
00623 
00624     if (col % 3 != 0)
00625         add_buf (buf1, "\n\r");
00626         sprintf(buf, "\n\r\n\rRooms total: {R%d{x\n\r", roomcount);
00627     add_buf (buf1, buf);
00628 
00629     page_to_char (buf_string (buf1), ch);
00630     free_buf (buf1);
00631     return FALSE;
00632 }
00633 
00634 
00635 REDIT (redit_mlist)
00636 {
00637     MOB_INDEX_DATA *pMobIndex;
00638     AREA_DATA *pArea;
00639     char buf[MAX_STRING_LENGTH];
00640     BUFFER *buf1;
00641     char arg[MAX_INPUT_LENGTH];
00642     bool fAll, found;
00643     int vnum;
00644     int col = 0;
00645     int numcount=0;
00646 
00647     one_argument (argument, arg);
00648     if (arg[0] == '\0')
00649     {
00650         send_to_char ("Syntax:  mlist <all/name>\n\r", ch);
00651         return FALSE;
00652     }
00653 
00654     buf1 = new_buf ();
00655     pArea = ch->in_room->area;
00656 /*    buf1[0] = '\0'; */
00657     fAll = !str_cmp (arg, "all");
00658     found = FALSE;
00659 
00660     for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++)
00661     {
00662         if ((pMobIndex = get_mob_index (vnum)) != NULL)
00663         {
00664             if (fAll || is_name (arg, pMobIndex->player_name))
00665             {
00666                 found = TRUE;
00667                 sprintf (buf, "[%5d] %-17.16s",
00668                          pMobIndex->vnum,
00669                          capitalize (pMobIndex->short_descr));
00670                 add_buf (buf1, buf);
00671         numcount++;
00672                 if (++col % 3 == 0)
00673                     add_buf (buf1, "\n\r");
00674             }
00675         }
00676     }
00677 
00678     if (!found)
00679     {
00680         send_to_char ("Mobile(s) not found in this area.\n\r", ch);
00681         return FALSE;
00682     }
00683 
00684     if (col % 3 != 0)
00685         add_buf (buf1, "\n\r");
00686     sprintf(buf, "\n\r\n\rMobiles found: %d\n\r", numcount);
00687     add_buf(buf1,buf);
00688 
00689     page_to_char (buf_string (buf1), ch);
00690     free_buf (buf1);
00691     return FALSE;
00692 }
00693 
00694 REDIT (redit_olist)
00695 {
00696     OBJ_INDEX_DATA *pObjIndex;
00697     AREA_DATA *pArea;
00698     char buf[MAX_STRING_LENGTH*2];
00699     BUFFER *buf1;
00700     char arg[MAX_INPUT_LENGTH];
00701     bool fAll, found;
00702     int vnum;
00703     int col = 0;
00704 
00705     one_argument (argument, arg);
00706     if (arg[0] == '\0')
00707     {
00708         send_to_char ("Syntax:  olist <all/name/item_type>\n\r", ch);
00709         return FALSE;
00710     }
00711 
00712     pArea = ch->in_room->area;
00713     buf1 = new_buf ();
00714 /*    buf1[0] = '\0'; */
00715     fAll = !str_cmp (arg, "all");
00716     found = FALSE;
00717 
00718     for (vnum = pArea->min_vnum; vnum <= pArea->max_vnum; vnum++)
00719     {
00720         if ((pObjIndex = get_obj_index (vnum)))
00721         {
00722             if (fAll || is_name (arg, pObjIndex->name)
00723                 || flag_value (type_flags, arg) == pObjIndex->item_type)
00724             {
00725                 found = TRUE;
00726                 sprintf (buf, "{x[{c%-7d{x] {W%-40.39s{x ", pObjIndex->vnum, 
00727                 str_dup(pObjIndex->short_descr));
00728                 add_buf (buf1, buf);
00729                 if (++col % 1 == 0)
00730                     add_buf (buf1, "\n\r");
00731             }
00732         }
00733     }
00734 
00735     if (!found)
00736     {
00737         send_to_char ("Object(s) not found in this area.\n\r", ch);
00738         return FALSE;
00739     }
00740 
00741     if (col % 3 != 0)
00742         add_buf (buf1, "\n\r");
00743 
00744     page_to_char (buf_string (buf1), ch);
00745     free_buf (buf1);
00746     return FALSE;
00747 }
00748 
00749 REDIT (redit_mshow)
00750 {
00751     MOB_INDEX_DATA *pMob;
00752     int value;
00753 
00754     if (argument[0] == '\0')
00755     {
00756         send_to_char ("Syntax:  mshow <vnum>\n\r", ch);
00757         return FALSE;
00758     }
00759 
00760     if (!is_number (argument))
00761     {
00762         send_to_char ("REdit: Must be a number.\n\r", ch);
00763         return FALSE;
00764     }
00765 
00766     if (is_number (argument))
00767     {
00768         value = atoi (argument);
00769         if (!(pMob = get_mob_index (value)))
00770         {
00771             send_to_char ("REdit:  That mobile does not exist.\n\r", ch);
00772             return FALSE;
00773         }
00774 
00775         ch->desc->pEdit = (void *) pMob;
00776     }
00777 
00778     medit_show (ch, argument);
00779     ch->desc->pEdit = (void *) ch->in_room;
00780     return FALSE;
00781 }
00782 
00783 REDIT (redit_oshow)
00784 {
00785     OBJ_INDEX_DATA *pObj;
00786     int value;
00787 
00788     if (argument[0] == '\0')
00789     {
00790         send_to_char ("Syntax:  oshow <vnum>\n\r", ch);
00791         return FALSE;
00792     }
00793 
00794     if (!is_number (argument))
00795     {
00796         send_to_char ("REdit: Must be a number.\n\r", ch);
00797         return FALSE;
00798     }
00799 
00800     if (is_number (argument))
00801     {
00802         value = atoi (argument);
00803         if (!(pObj = get_obj_index (value)))
00804         {
00805             send_to_char ("REdit:  That object does not exist.\n\r", ch);
00806             return FALSE;
00807         }
00808 
00809         ch->desc->pEdit = (void *) pObj;
00810     }
00811 
00812     oedit_show (ch, argument);
00813     ch->desc->pEdit = (void *) ch->in_room;
00814     return FALSE;
00815 }
00816 
00817 /*****************************************************************************
00818  Name:        check_range( lower vnum, upper vnum )
00819  Purpose:    Ensures the range spans only one area.
00820  Called by:    aedit_vnum(olc_act.c).
00821  ****************************************************************************/
00822 bool check_range (int lower, int upper)
00823 {
00824     AREA_DATA *pArea;
00825     int cnt = 0;
00826 
00827     for (pArea = area_first; pArea; pArea = pArea->next)
00828     {
00829         /*
00830          * lower < area < upper
00831          */
00832         if ((lower <= pArea->min_vnum && pArea->min_vnum <= upper)
00833             || (lower <= pArea->max_vnum && pArea->max_vnum <= upper))
00834             ++cnt;
00835 
00836         if (cnt > 1)
00837             return FALSE;
00838     }
00839     return TRUE;
00840 }
00841 
00842 AREA_DATA *get_vnum_area (int vnum)
00843 {
00844     AREA_DATA *pArea;
00845 
00846     for (pArea = area_first; pArea; pArea = pArea->next)
00847     {
00848         if (vnum >= pArea->min_vnum && vnum <= pArea->max_vnum)
00849             return pArea;
00850     }
00851 
00852     return 0;
00853 }
00854 
00855 /*
00856  * Area Editor Functions.
00857  */
00858 AEDIT (aedit_show)
00859 {
00860     AREA_DATA *pArea;
00861     char buf[MAX_STRING_LENGTH];
00862 
00863     EDIT_AREA (ch, pArea);
00864 
00865     sprintf (buf, "Name:     [{c%5d{x] {c%s{x\n\r", pArea->vnum, pArea->name);
00866     send_to_char (buf, ch);
00867 
00868 #if 0                            /* ROM OLC */
00869     sprintf (buf, "Recall:   [%5d] %s\n\r", pArea->recall,
00870              get_room_index (pArea->recall)
00871              ? get_room_index (pArea->recall)->name : "none");
00872     send_to_char (buf, ch);
00873 #endif /* ROM */
00874 
00875     sprintf (buf, "File:     {c%s{x\n\r", pArea->file_name);
00876     send_to_char (buf, ch);
00877 
00878     sprintf (buf, "Vnums:    [{c%d{w-{c%d{x]\n\r", pArea->min_vnum, pArea->max_vnum);
00879     send_to_char (buf, ch);
00880 
00881     sprintf (buf, "Age:      [{c%d{x]\n\r", pArea->age);
00882     send_to_char (buf, ch);
00883 
00884     sprintf (buf, "Players:  [{c%d{x]\n\r", pArea->nplayer);
00885     send_to_char (buf, ch);
00886 
00887     sprintf (buf, "Security: [{c%d{x]\n\r", pArea->security);
00888     send_to_char (buf, ch);
00889 
00890     sprintf (buf, "Builders: [{c%s{x]\n\r", pArea->builders);
00891     send_to_char (buf, ch);
00892 
00893     sprintf (buf, "Credits : [{c%s{x]\n\r", pArea->credits);
00894     send_to_char (buf, ch);
00895 
00896     sprintf (buf, "Flags:    [{c%s{x]\n\r",
00897              flag_string (area_flags, pArea->area_flags));
00898     send_to_char (buf, ch);
00899 
00900     sprintf(buf, "Cont:     [{c%s{x]\n\r", pArea->cont);
00901     send_to_char(buf,ch);
00902 
00903     return FALSE;
00904 }
00905 
00906 AEDIT (aedit_reset)
00907 {
00908     AREA_DATA *pArea;
00909 
00910     EDIT_AREA (ch, pArea);
00911 
00912     reset_area (pArea);
00913     send_to_char ("Area reset.\n\r", ch);
00914 
00915     return FALSE;
00916 }
00917 
00918 AEDIT (aedit_create)
00919 {
00920     AREA_DATA *pArea;
00921 
00922     pArea = new_area ();
00923     area_last->next = pArea;
00924     area_last = pArea;            /* Thanks, Walker. */
00925     ch->desc->pEdit = (void *) pArea;
00926 
00927     SET_BIT (pArea->area_flags, AREA_ADDED);
00928     send_to_char ("Area Created.\n\r", ch);
00929     return FALSE;
00930 }
00931 
00932 
00933 
00934 AEDIT (aedit_name)
00935 {
00936     AREA_DATA *pArea;
00937 
00938     EDIT_AREA (ch, pArea);
00939 
00940     if (argument[0] == '\0')
00941     {
00942         send_to_char ("Syntax:   name [$name]\n\r", ch);
00943         return FALSE;
00944     }
00945 
00946     free_string (pArea->name);
00947     pArea->name = str_dup (argument);
00948 
00949     send_to_char ("Name set.\n\r", ch);
00950     return TRUE;
00951 }
00952 AEDIT (aedit_cont)
00953 {
00954     AREA_DATA *pArea;
00955     EDIT_AREA(ch,pArea);
00956 
00957     if (argument[0] == '\0')
00958     {
00959         send_to_char("Syntax: cont <contname> -- do 'cshow' for a list of continents.\n\r",ch);
00960         return FALSE;
00961     }
00962 
00963     free_string (pArea->cont);
00964     if (cont_lookup(argument) != 0)
00965     {
00966         pArea->cont = str_dup(conts_table[cont_lookup(argument)].name);
00967         send_to_char("Continent set.\n\r",ch);
00968         return TRUE;
00969     }
00970     else
00971     {
00972         send_to_char ("Invalid Continent. Use 'cshow' to view current continents.\n\r",ch);
00973         return FALSE;
00974     }
00975     return TRUE;
00976 }
00977 
00978 AEDIT (aedit_credits)
00979 {
00980     AREA_DATA *pArea;
00981 
00982     EDIT_AREA (ch, pArea);
00983 
00984     if (argument[0] == '\0')
00985     {
00986         send_to_char ("Syntax:   credits [$credits]\n\r", ch);
00987         return FALSE;
00988     }
00989 
00990     free_string (pArea->credits);
00991     pArea->credits = str_dup (argument);
00992 
00993     send_to_char ("Credits set.\n\r", ch);
00994     return TRUE;
00995 }
00996 
00997 
00998 AEDIT (aedit_file)
00999 {
01000     AREA_DATA *pArea;
01001     char file[MAX_STRING_LENGTH];
01002     int i, length;
01003 
01004     EDIT_AREA (ch, pArea);
01005 
01006     one_argument (argument, file);    /* Forces Lowercase */
01007 
01008     if (argument[0] == '\0')
01009     {
01010         send_to_char ("Syntax:  filename [$file]\n\r", ch);
01011         return FALSE;
01012     }
01013 
01014     /*
01015      * Simple Syntax Check.
01016      */
01017     length = strlen (argument);
01018     if (length > 8)
01019     {
01020         send_to_char ("No more than eight characters allowed.\n\r", ch);
01021         return FALSE;
01022     }
01023 
01024     /*
01025      * Allow only letters and numbers.
01026      */
01027     for (i = 0; i < length; i++)
01028     {
01029         if (!isalnum (file[i]))
01030         {
01031             send_to_char ("Only letters and numbers are valid.\n\r", ch);
01032             return FALSE;
01033         }
01034     }
01035 
01036     free_string (pArea->file_name);
01037     strcat (file, ".are");
01038     pArea->file_name = str_dup (file);
01039 
01040     send_to_char ("Filename set.\n\r", ch);
01041     return TRUE;
01042 }
01043 
01044 
01045 
01046 AEDIT (aedit_age)
01047 {
01048     AREA_DATA *pArea;
01049     char age[MAX_STRING_LENGTH];
01050 
01051     EDIT_AREA (ch, pArea);
01052 
01053     one_argument (argument, age);
01054 
01055     if (!is_number (age) || age[0] == '\0')
01056     {
01057         send_to_char ("Syntax:  age [#xage]\n\r", ch);
01058         return FALSE;
01059     }
01060 
01061     pArea->age = atoi (age);
01062 
01063     send_to_char ("Age set.\n\r", ch);
01064     return TRUE;
01065 }
01066 
01067 
01068 #if 0                            /* ROM OLC */
01069 AEDIT (aedit_recall)
01070 {
01071     AREA_DATA *pArea;
01072     char room[MAX_STRING_LENGTH];
01073     int value;
01074 
01075     EDIT_AREA (ch, pArea);
01076 
01077     one_argument (argument, room);
01078 
01079     if (!is_number (argument) || argument[0] == '\0')
01080     {
01081         send_to_char ("Syntax:  recall [#xrvnum]\n\r", ch);
01082         return FALSE;
01083     }
01084 
01085     value = atoi (room);
01086 
01087     if (!get_room_index (value))
01088     {
01089         send_to_char ("AEdit:  Room vnum does not exist.\n\r", ch);
01090         return FALSE;
01091     }
01092 
01093     pArea->recall = value;
01094 
01095     send_to_char ("Recall set.\n\r", ch);
01096     return TRUE;
01097 }
01098 #endif /* ROM OLC */
01099 
01100 
01101 AEDIT (aedit_security)
01102 {
01103     AREA_DATA *pArea;
01104     char sec[MAX_STRING_LENGTH];
01105     char buf[MAX_STRING_LENGTH];
01106     int value;
01107 
01108     EDIT_AREA (ch, pArea);
01109 
01110     one_argument (argument, sec);
01111 
01112     if (!is_number (sec) || sec[0] == '\0')
01113     {
01114         send_to_char ("Syntax:  security [#xlevel]\n\r", ch);
01115         return FALSE;
01116     }
01117 
01118     value = atoi (sec);
01119 
01120     if (value > ch->pcdata->security || value < 0)
01121     {
01122         if (ch->pcdata->security != 0)
01123         {
01124             sprintf (buf, "Security is 0-%d.\n\r", ch->pcdata->security);
01125             send_to_char (buf, ch);
01126         }
01127         else
01128             send_to_char ("Security is 0 only.\n\r", ch);
01129         return FALSE;
01130     }
01131 
01132     pArea->security = value;
01133 
01134     send_to_char ("Security set.\n\r", ch);
01135     return TRUE;
01136 }
01137 
01138 
01139 
01140 AEDIT (aedit_builder)
01141 {
01142     AREA_DATA *pArea;
01143     char name[MAX_STRING_LENGTH];
01144     char buf[MAX_STRING_LENGTH];
01145 
01146     EDIT_AREA (ch, pArea);
01147 
01148     one_argument (argument, name);
01149 
01150     if (name[0] == '\0')
01151     {
01152         send_to_char ("Syntax:  builder [$name]  -toggles builder\n\r", ch);
01153         send_to_char ("Syntax:  builder All      -allows everyone\n\r", ch);
01154         return FALSE;
01155     }
01156 
01157     name[0] = UPPER (name[0]);
01158 
01159     if (strstr (pArea->builders, name) != '\0')
01160     {
01161         pArea->builders = string_replace (pArea->builders, name, "\0");
01162         pArea->builders = string_unpad (pArea->builders);
01163 
01164         if (pArea->builders[0] == '\0')
01165         {
01166             free_string (pArea->builders);
01167             pArea->builders = str_dup ("None");
01168         }
01169         send_to_char ("Builder removed.\n\r", ch);
01170         return TRUE;
01171     }
01172     else
01173     {
01174         buf[0] = '\0';
01175         if (strstr (pArea->builders, "None") != '\0')
01176         {
01177             pArea->builders = string_replace (pArea->builders, "None", "\0");
01178             pArea->builders = string_unpad (pArea->builders);
01179         }
01180 
01181         if (pArea->builders[0] != '\0')
01182         {
01183             strcat (buf, pArea->builders);
01184             strcat (buf, " ");
01185         }
01186         strcat (buf, name);
01187         free_string (pArea->builders);
01188         pArea->builders = string_proper (str_dup (buf));
01189 
01190         send_to_char ("Builder added.\n\r", ch);
01191         send_to_char (pArea->builders, ch);
01192         return TRUE;
01193     }
01194 
01195     return FALSE;
01196 }
01197 
01198 /* Tribul - Delete an area..Maybe? */
01199 
01200 AEDIT (aedit_delete)
01201 {
01202     AREA_DATA *pArea;
01203 
01204     EDIT_AREA(ch, pArea);
01205 
01206     if (ch->level < 60)
01207     {
01208         send_to_char("You do not have access in deleteing areas.\n\r",ch);
01209         return FALSE;
01210     }
01211 
01212     if (pArea->adelete)
01213     {
01214         send_to_char("Area's delete status removed.\n\r",ch);
01215         pArea->adelete = FALSE;
01216         return TRUE;
01217     }
01218     send_to_char("Area's delete status set.\n\r",ch);
01219     pArea->adelete = TRUE;
01220     return TRUE;
01221 }
01222 
01223 AEDIT (aedit_vnum)
01224 {
01225     AREA_DATA *pArea;
01226     char lower[MAX_STRING_LENGTH];
01227     char upper[MAX_STRING_LENGTH];
01228     int ilower;
01229     int iupper;
01230 
01231     EDIT_AREA (ch, pArea);
01232 
01233     argument = one_argument (argument, lower);
01234     one_argument (argument, upper);
01235 
01236     if (!is_number (lower) || lower[0] == '\0'
01237         || !is_number (upper) || upper[0] == '\0')
01238     {
01239         send_to_char ("Syntax:  vnum [#xlower] [#xupper]\n\r", ch);
01240         return FALSE;
01241     }
01242 
01243     if ((ilower = atoi (lower)) > (iupper = atoi (upper)))
01244     {
01245         send_to_char ("AEdit:  Upper must be larger then lower.\n\r", ch);
01246         return FALSE;
01247     }
01248 
01249     if (!check_range (atoi (lower), atoi (upper)))
01250     {
01251         send_to_char ("AEdit:  Range must include only this area.\n\r", ch);
01252         return FALSE;
01253     }
01254 
01255     if (get_vnum_area (ilower) && get_vnum_area (ilower) != pArea)
01256     {
01257         send_to_char ("AEdit:  Lower vnum already assigned.\n\r", ch);
01258         return FALSE;
01259     }
01260 
01261     pArea->min_vnum = ilower;
01262     send_to_char ("Lower vnum set.\n\r", ch);
01263 
01264     if (get_vnum_area (iupper) && get_vnum_area (iupper) != pArea)
01265     {
01266         send_to_char ("AEdit:  Upper vnum already assigned.\n\r", ch);
01267         return TRUE;            /* The lower value has been set. */
01268     }
01269 
01270     pArea->max_vnum = iupper;
01271     send_to_char ("Upper vnum set.\n\r", ch);
01272 
01273     return TRUE;
01274 }
01275 
01276 
01277 
01278 AEDIT (aedit_lvnum)
01279 {
01280     AREA_DATA *pArea;
01281     char lower[MAX_STRING_LENGTH];
01282     int ilower;
01283     int iupper;
01284 
01285     EDIT_AREA (ch, pArea);
01286 
01287     one_argument (argument, lower);
01288 
01289     if (!is_number (lower) || lower[0] == '\0')
01290     {
01291         send_to_char ("Syntax:  min_vnum [#xlower]\n\r", ch);
01292         return FALSE;
01293     }
01294 
01295     if ((ilower = atoi (lower)) > (iupper = pArea->max_vnum))
01296     {
01297         send_to_char ("AEdit:  Value must be less than the max_vnum.\n\r",
01298                       ch);
01299         return FALSE;
01300     }
01301 
01302     if (!check_range (ilower, iupper))
01303     {
01304         send_to_char ("AEdit:  Range must include only this area.\n\r", ch);
01305         return FALSE;
01306     }
01307 
01308     if (get_vnum_area (ilower) && get_vnum_area (ilower) != pArea)
01309     {
01310         send_to_char ("AEdit:  Lower vnum already assigned.\n\r", ch);
01311         return FALSE;
01312     }
01313 
01314     pArea->min_vnum = ilower;
01315     send_to_char ("Lower vnum set.\n\r", ch);
01316     return TRUE;
01317 }
01318 
01319 
01320 
01321 AEDIT (aedit_uvnum)
01322 {
01323     AREA_DATA *pArea;
01324     char upper[MAX_STRING_LENGTH];
01325     int ilower;
01326     int iupper;
01327 
01328     EDIT_AREA (ch, pArea);
01329 
01330     one_argument (argument, upper);
01331 
01332     if (!is_number (upper) || upper[0] == '\0')
01333     {
01334         send_to_char ("Syntax:  max_vnum [#xupper]\n\r", ch);
01335         return FALSE;
01336     }
01337 
01338     if ((ilower = pArea->min_vnum) > (iupper = atoi (upper)))
01339     {
01340         send_to_char ("AEdit:  Upper must be larger then lower.\n\r", ch);
01341         return FALSE;
01342     }
01343 
01344     if (!check_range (ilower, iupper))
01345     {
01346         send_to_char ("AEdit:  Range must include only this area.\n\r", ch);
01347         return FALSE;
01348     }
01349 
01350     if (get_vnum_area (iupper) && get_vnum_area (iupper) != pArea)
01351     {
01352         send_to_char ("AEdit:  Upper vnum already assigned.\n\r", ch);
01353         return FALSE;
01354     }
01355 
01356     pArea->max_vnum = iupper;
01357     send_to_char ("Upper vnum set.\n\r", ch);
01358 
01359     return TRUE;
01360 }
01361 
01362 
01363 
01364 /*
01365  * Room Editor Functions.
01366  */
01367 // New functions for redit.
01368 REDIT (redit_troute)
01369 {
01370     ROOM_INDEX_DATA *room;
01371     EDIT_ROOM(ch,room);
01372 
01373     if (room->travel_route == TRUE)
01374     {
01375         send_to_char("This room is no longer part of a travel route.\n\r",ch);
01376         room->travel_route = FALSE;
01377         return;
01378     }
01379     send_to_char("This room is now part of a travel route.\n\r",ch);
01380     room->travel_route = TRUE;
01381     return;
01382 }
01383 REDIT (redit_tstate)
01384 {
01385     ROOM_INDEX_DATA *room;
01386     EDIT_ROOM(ch,room);
01387 
01388     if (argument[0] == '\0' || !is_number(argument))
01389     {
01390         send_to_char("REdit: Argument must be numerical.\n\r",ch);
01391         return;
01392     }
01393     if (atoi(argument) < 0)
01394     {
01395         send_to_char("REdit: Argument must be above zero.\n\r",ch);
01396         return;
01397     }
01398     room->travel_route = TRUE;
01399     room->travel_state = atoi(argument);
01400     send_to_char("Room's travel state set.\n\r",ch);
01401     return;
01402 }
01403 
01404 REDIT (redit_ttype)
01405 {
01406     ROOM_INDEX_DATA *room;
01407     EDIT_ROOM(ch, room);
01408 
01409     if (argument[0] == '\0' || !is_number(argument))
01410     {
01411         send_to_char("REdit: Argument must be numerical.\n\r",ch);
01412         return;
01413     }
01414     if (atoi(argument) < 0)
01415     {
01416         send_to_char("REdit: Argument must be above zero.\n\r",ch);
01417         return;
01418     }
01419     room->travel_route = TRUE;
01420     room->travel_type = atoi(argument);
01421     send_to_char("Room's travel route type is set.\n\r",ch);
01422     return;
01423 }
01424 
01425 
01426 REDIT (redit_show)
01427 {
01428     ROOM_INDEX_DATA *pRoom;
01429     int vv;
01430     char buf[MAX_STRING_LENGTH];
01431     char buf1[2 * MAX_STRING_LENGTH];
01432     OBJ_DATA *obj;
01433     CHAR_DATA *rch;
01434     int door;
01435     bool fcnt;
01436 
01437     EDIT_ROOM (ch, pRoom);
01438     vv= pRoom->vnum;
01439 
01440     buf1[0] = '\0';
01441 
01442     sprintf (buf, "Description:\n\r%s\n\r", pRoom->description);
01443     strcat (buf1, buf);
01444 
01445     sprintf (buf, "\n\r{DNight{x Description:\n\r%s\n\r", pRoom->night_description);
01446     strcat (buf1,buf);
01447 
01448     sprintf (buf, "Name:       [%s]\n\rArea:       [%5d] %s\n\r",
01449              pRoom->name, pRoom->area->vnum, pRoom->area->name);
01450     strcat (buf1, buf);
01451 
01452     sprintf (buf, "Vnum:       [%5d]\n\rSector:     [%s]\n\r",
01453              pRoom->vnum, flag_string (sector_flags, pRoom->sector_type));
01454     strcat (buf1, buf);
01455 
01456     sprintf (buf, "Room flags: [%s]\n\r",
01457              flag_string (room_flags, pRoom->room_flags));
01458     strcat (buf1, buf);
01459     sprintf (buf, "Extended room flags: [%s]\n\r",
01460             flag_string (room_flags_extra, pRoom->room_flags_extra));
01461     strcat (buf1, buf);
01462     if (pRoom->heal_rate != 100 || pRoom->mana_rate != 100)
01463     {
01464         sprintf (buf, "Health rec: [%d]\n\rMana rec  : [%d]\n\r",
01465                  pRoom->heal_rate, pRoom->mana_rate);
01466         strcat (buf1, buf);
01467     }
01468 
01469     if (pRoom->clan > 0)
01470     {
01471         sprintf (buf, "Clan      : [%d] %s\n\r",
01472                  pRoom->clan, clan_table[pRoom->clan].name);
01473         strcat (buf1, buf);
01474     }
01475 
01476     if (!IS_NULLSTR (pRoom->owner))
01477     {
01478         sprintf (buf, "Owner     : [%s]\n\r", pRoom->owner);
01479         strcat (buf1, buf);
01480     }
01481 
01482     if (pRoom->extra_descr)
01483     {
01484         EXTRA_DESCR_DATA *ed;
01485 
01486         strcat (buf1, "Desc Kwds:  [");
01487         for (ed = pRoom->extra_descr; ed; ed = ed->next)
01488         {
01489             strcat (buf1, ed->keyword);
01490             if (ed->next)
01491                 strcat (buf1, " ");
01492         }
01493         strcat (buf1, "]\n\r");
01494     }
01495 
01496     strcat (buf1, "Characters: [");
01497     fcnt = FALSE;
01498     for (rch = pRoom->people; rch; rch = rch->next_in_room)
01499     {
01500         one_argument (rch->name, buf);
01501         strcat (buf1, buf);
01502         strcat (buf1, " ");
01503         fcnt = TRUE;
01504     }
01505 
01506     if (fcnt)
01507     {
01508         int end;
01509 
01510         end = strlen (buf1) - 1;
01511         buf1[end] = ']';
01512         strcat (buf1, "\n\r");
01513     }
01514     else
01515         strcat (buf1, "none]\n\r");
01516 
01517     strcat (buf1, "Objects:    [");
01518     fcnt = FALSE;
01519     for (obj = pRoom->contents; obj; obj = obj->next_content)
01520     {
01521         one_argument (obj->name, buf);
01522         strcat (buf1, buf);
01523         strcat (buf1, " ");
01524         fcnt = TRUE;
01525     }
01526 
01527     if (fcnt)
01528     {
01529         int end;
01530 
01531         end = strlen (buf1) - 1;
01532         buf1[end] = ']';
01533         strcat (buf1, "\n\r");
01534     }
01535     else
01536         strcat (buf1, "none]\n\r");
01537 
01538     for (door = 0; door < MAX_DIR; door++)
01539     {
01540         EXIT_DATA *pexit;
01541 
01542         if ((pexit = pRoom->exit[door]))
01543         {
01544             char word[MAX_INPUT_LENGTH];
01545             char reset_state[MAX_STRING_LENGTH];
01546             char *state;
01547             int i, length;
01548 
01549             sprintf (buf, "-%-5s to [%5d] Key: [%5d] ",
01550                      capitalize (dir_name[door]),
01551                      pexit->u1.to_room ? pexit->u1.to_room->vnum : 0,    /* ROM OLC */
01552                      pexit->key);
01553             strcat (buf1, buf);
01554 
01555             /*
01556              * Format up the exit info.
01557              * Capitalize all flags that are not part of the reset info.
01558              */
01559             strcpy (reset_state,(char*)flag_string (exit_flags, pexit->rs_flags));
01560             state =(char*)flag_string (exit_flags, pexit->exit_info);
01561             strcat (buf1, " Exit flags: [");
01562             for (;;)
01563             {
01564                 state = one_argument (state, word);
01565 
01566                 if (word[0] == '\0')
01567                 {
01568                     int end;
01569 
01570                     end = strlen (buf1) - 1;
01571                     buf1[end] = ']';
01572                     strcat (buf1, "\n\r");
01573                     break;
01574                 }
01575 
01576                 if (str_infix (word, reset_state))
01577                 {
01578                     length = strlen (word);
01579                     for (i = 0; i < length; i++)
01580                         word[i] = UPPER (word[i]);
01581                 }
01582                 strcat (buf1, word);
01583                 strcat (buf1, " ");
01584             }
01585 
01586             if (pexit->keyword && pexit->keyword[0] != '\0')
01587             {
01588                 sprintf (buf, "Kwds: [%s]\n\r", pexit->keyword);
01589                 strcat (buf1, buf);
01590             }
01591             if (pexit->description && pexit->description[0] != '\0')
01592             {
01593                 sprintf (buf, "%s", pexit->description);
01594                 strcat (buf1, buf);
01595             }
01596         }
01597     }
01598     send_to_char(buf1,ch);
01599     printf_to_char(ch, "Travel Route:  [%s]\n\r", pRoom->travel_route ? "Yes" : "No");
01600     if (pRoom->travel_route == TRUE)
01601     {
01602         printf_to_char(ch, "Travel Type:   [%d]\n\r", pRoom->travel_type);
01603         printf_to_char(ch, "Travel State:  [%d]\n\r", pRoom->travel_state);
01604     }
01605 
01606 //    send_to_char (buf1, ch);
01607     
01608     printf_to_char(ch,"\n\r\n\r {R%d {cvehicles are pointed here.{x\n\r", vehicle_here(vv));
01609     return FALSE;
01610 }
01611 
01612 
01613 
01614 
01615 /* Local function. */
01616 bool change_exit (CHAR_DATA * ch, char *argument, int door)
01617 {
01618     ROOM_INDEX_DATA *pRoom;
01619     char command[MAX_INPUT_LENGTH];
01620     char arg[MAX_INPUT_LENGTH];
01621     int value;
01622 
01623     EDIT_ROOM (ch, pRoom);
01624 
01625     /*
01626      * Set the exit flags, needs full argument.
01627      * ----------------------------------------
01628      */
01629     if ((value = flag_value (exit_flags, argument)) != NO_FLAG)
01630     {
01631         ROOM_INDEX_DATA *pToRoom;
01632         sh_int rev;                /* ROM OLC */
01633 
01634         if (!pRoom->exit[door])
01635         {
01636             send_to_char ("Exit doesn't exist.\n\r", ch);
01637             return FALSE;
01638         }
01639 
01640         /*
01641          * This room.
01642          */
01643         TOGGLE_BIT (pRoom->exit[door]->rs_flags, value);
01644         /* Don't toggle exit_info because it can be changed by players. */
01645         pRoom->exit[door]->exit_info = pRoom->exit[door]->rs_flags;
01646 
01647         /*
01648          * Connected room.
01649          */
01650         pToRoom = pRoom->exit[door]->u1.to_room;    /* ROM OLC */
01651         rev = rev_dir[door];
01652 
01653         if (pToRoom->exit[rev] != NULL)
01654         {
01655             pToRoom->exit[rev]->rs_flags = pRoom->exit[door]->rs_flags;
01656             pToRoom->exit[rev]->exit_info = pRoom->exit[door]->exit_info;
01657         }
01658 
01659         send_to_char ("Exit flag toggled.\n\r", ch);
01660         return TRUE;
01661     }
01662 
01663     /*
01664      * Now parse the arguments.
01665      */
01666     argument = one_argument (argument, command);
01667     one_argument (argument, arg);
01668 
01669     if (command[0] == '\0' && argument[0] == '\0')
01670     {                            /* Move command. */
01671         move_char (ch, door, TRUE);    /* ROM OLC */
01672         return FALSE;
01673     }
01674 
01675     if (command[0] == '?')
01676     {
01677         do_help (ch, "EXIT");
01678         return FALSE;
01679     }
01680 
01681     if (!str_cmp (command, "delete"))
01682     {
01683         ROOM_INDEX_DATA *pToRoom;
01684         sh_int rev;                /* ROM OLC */
01685 
01686         if (!pRoom->exit[door])
01687         {
01688             send_to_char ("REdit:  Cannot delete a null exit.\n\r", ch);
01689             return FALSE;
01690         }
01691 
01692         /*
01693          * Remove ToRoom Exit.
01694          */
01695         rev = rev_dir[door];
01696         pToRoom = pRoom->exit[door]->u1.to_room;    /* ROM OLC */
01697 
01698         if (pToRoom->exit[rev])
01699         {
01700             free_exit (pToRoom->