00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
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
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
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
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
00117
00118
00119
00120 {NULL, NULL, NULL}
00121 };
00122
00123
00124
00125
00126
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
00158
00159
00160
00161
00162
00163
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
00202
00203
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
00232
00233
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
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
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
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
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
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
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
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
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
00819
00820
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
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
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
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
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;
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);
01007
01008 if (argument[0] == '\0')
01009 {
01010 send_to_char ("Syntax: filename [$file]\n\r", ch);
01011 return FALSE;
01012 }
01013
01014
01015
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
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
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
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
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;
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
01366
01367
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,
01552 pexit->key);
01553 strcat (buf1, buf);
01554
01555
01556
01557
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
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
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
01627
01628
01629 if ((value = flag_value (exit_flags, argument)) != NO_FLAG)
01630 {
01631 ROOM_INDEX_DATA *pToRoom;
01632 sh_int rev;
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
01642
01643 TOGGLE_BIT (pRoom->exit[door]->rs_flags, value);
01644
01645 pRoom->exit[door]->exit_info = pRoom->exit[door]->rs_flags;
01646
01647
01648
01649
01650 pToRoom = pRoom->exit[door]->u1.to_room;
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
01665
01666 argument = one_argument (argument, command);
01667 one_argument (argument, arg);
01668
01669 if (command[0] == '\0' && argument[0] == '\0')
01670 {
01671 move_char (ch, door, TRUE);
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;
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
01694
01695 rev = rev_dir[door];
01696 pToRoom = pRoom->exit[door]->u1.to_room;
01697
01698 if (pToRoom->exit[rev])
01699 {
01700 free_exit (pToRoom->