/*************************************************************************** * File: olc.c * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * * * * This code was freely distributed with the The Isles 1.1 source code, * * and has been used here for OLC - OLC would not be what it is without * * all the previous coders who released their source code. * * * ***************************************************************************/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "merc.h" #include "olc.h" /* * Local functions. */ void save_area args( ( AREA_DATA *pArea ) ); void forge_pay_cost args( ( CHAR_DATA *ch ) ); /* AREA_DATA *get_area_data args( ( int vnum ) ); */ MPROG_DATA *get_mprog_data args( ( MOB_INDEX_DATA *pMob, int vnum ) ); /* TRAP_DATA *get_trap_data args( ( void *vo, int vnum, int type ) ); */ /* Executed from comm.c. Minimizes compiling when changes are made. */ bool run_olc_editor( DESCRIPTOR_DATA *d ) { switch ( d->editor ) { case ED_AREA: aedit( d->character, d->incomm ); break; case ED_ROOM: redit( d->character, d->incomm ); break; case ED_OBJECT: oedit( d->character, d->incomm ); break; case ED_MOBILE: medit( d->character, d->incomm ); break; case ED_MPROG: mpedit( d->character, d->incomm ); break; case ED_CLAN: cedit( d->character, d->incomm ); break; case ED_HELP: hedit( d->character, d->incomm ); /* XOR */ break; case ED_OPROG: case ED_RPROG: case ED_EPROG: tedit( d->character, d->incomm ); break; case ED_SOCIAL: sedit( d->character, d->incomm ); break; case RENAME_OBJECT: rename_object( d->character, d->incomm ); break; case FORGE_OBJECT: forge_object( d->character, d->incomm ); break; case ED_MRESET: mreset( d->character, d->incomm ); break; case ED_NEWBIE: nedit( d->character, d->incomm ); break; case ED_SPEDIT: spedit( d->character, d->incomm ); break; case RACE_EDIT: race_edit( d->character, d->incomm ); break; default: return FALSE; } return TRUE; } char *olc_ed_name( CHAR_DATA *ch ) { static char buf[10]; buf[0] = '\0'; switch (ch->desc->editor) { case ED_AREA: sprintf( buf, "AEdit" ); break; case ED_ROOM: sprintf( buf, "REdit" ); break; case ED_OBJECT: sprintf( buf, "OEdit" ); break; case ED_MOBILE: sprintf( buf, "MEdit" ); break; case ED_MPROG: sprintf( buf, "MPEdit" ); break; case ED_CLAN: sprintf( buf, "CEdit" ); break; case ED_HELP: sprintf( buf, "HEdit" ); break; case ED_OPROG: sprintf( buf, "OPEdit" ); break; case ED_RPROG: sprintf( buf, "RPEdit" ); break; case ED_EPROG: sprintf( buf, "EPEdit" ); break; case ED_SOCIAL: sprintf( buf, "SEdit" ); break; case ED_MRESET: sprintf( buf, "MResetEdit" ); break; case RENAME_OBJECT: sprintf( buf, "Rename_Obj" ); break; case FORGE_OBJECT: sprintf( buf, "Forge_Obj" ); break; case ED_NEWBIE: sprintf( buf, "NEdit" ); break; case ED_SPEDIT: sprintf( buf, "SPEdit" ); break; case RACE_EDIT: sprintf( buf, "Race_Edit" ); break; default: sprintf( buf, " " ); break; } return buf; } char *olc_ed_vnum( CHAR_DATA *ch ) { AREA_DATA *pArea; ROOM_INDEX_DATA *pRoom; OBJ_INDEX_DATA *pObj; MOB_INDEX_DATA *pMob; CLAN_DATA *pClan; static char buf[10]; buf[0] = '\0'; switch ( ch->desc->editor ) { case ED_AREA: pArea = (AREA_DATA *)ch->desc->pEdit; sprintf( buf, "%d", pArea ? pArea->vnum : 0 ); break; case ED_ROOM: pRoom = ch->in_room; sprintf( buf, "%d", pRoom ? pRoom->vnum : 0 ); break; case ED_OBJECT: pObj = (OBJ_INDEX_DATA *)ch->desc->pEdit; sprintf( buf, "%d", pObj ? pObj->vnum : 0 ); break; case ED_MOBILE: pMob = (MOB_INDEX_DATA *)ch->desc->pEdit; sprintf( buf, "%d", pMob ? pMob->vnum : 0 ); break; case ED_MPROG: pMob = (MOB_INDEX_DATA *)ch->desc->inEdit; sprintf( buf, "%d", pMob ? pMob->vnum : 0 ); break; case ED_CLAN: pClan = (CLAN_DATA *)ch->desc->pEdit; sprintf( buf, "%d", pClan ? pClan->vnum : 0 ); break; case ED_OPROG: pObj = (OBJ_INDEX_DATA *)ch->desc->inEdit; sprintf( buf, "%d", pObj ? pObj->vnum : 0 ); break; case ED_RPROG: pRoom = ch->in_room; sprintf( buf, "%d", pRoom ? pRoom->vnum : 0 ); break; case ED_EPROG: { /* Woah.. this is a long way around nothing.. :) */ int dir; EXIT_DATA *pExit; pRoom = ch->in_room; for ( dir = 0; dir < 6; dir++ ) if ( (pExit = pRoom->exit[dir]) ) { TRAP_DATA *pTrap; for ( pTrap = pExit->traps; pTrap; pTrap = pTrap->next_here ) if ( pTrap == (TRAP_DATA *)ch->desc->pEdit) break; if ( pTrap ) break; } if ( dir < 6 ) sprintf( buf, capitalize( dir_name[dir] ) ); else sprintf( buf, "Unknown" ); break; } default: sprintf( buf, " " ); break; } return buf; } /***************************************************************************** Name: show_olc_cmds Purpose: Format up the commands from given table. Called by: show_commands(olc_act.c). ****************************************************************************/ void show_olc_cmds( CHAR_DATA *ch, const struct olc_cmd_type *olc_table ) { char buf [ MAX_STRING_LENGTH ]; char buf1 [ MAX_STRING_LENGTH ]; int cmd; int col; buf1[0] = '\0'; col = 0; for (cmd = 0; olc_table[cmd].name[0] != '\0'; cmd++) { sprintf( buf, "%-15.15s", olc_table[cmd].name ); strcat( buf1, buf ); if ( ++col % 5 == 0 ) strcat( buf1, "\n\r" ); } if ( col % 5 != 0 ) strcat( buf1, "\n\r" ); send_to_char(C_DEFAULT, buf1, ch ); return; } /***************************************************************************** Name: show_commands Purpose: Display all olc commands. Called by: olc interpreters. ****************************************************************************/ bool show_commands( CHAR_DATA *ch, char *argument ) { switch (ch->desc->editor) { case ED_AREA: show_olc_cmds( ch, aedit_table ); break; case ED_ROOM: show_olc_cmds( ch, redit_table ); break; case ED_OBJECT: show_olc_cmds( ch, oedit_table ); break; case ED_MOBILE: show_olc_cmds( ch, medit_table ); break; case ED_MPROG: show_olc_cmds( ch, mpedit_table ); break; case ED_CLAN: show_olc_cmds( ch, cedit_table ); break; case ED_HELP: show_olc_cmds( ch, hedit_table ); break; case ED_OPROG: case ED_RPROG: case ED_EPROG: show_olc_cmds( ch, tedit_table ); break; case ED_SOCIAL: show_olc_cmds( ch, sedit_table ); break; case RENAME_OBJECT: show_olc_cmds( ch, rename_obj_table ); break; case FORGE_OBJECT: show_olc_cmds( ch, forge_obj_table ); break; case ED_MRESET: show_olc_cmds( ch, mreset_table ); break; case ED_SPEDIT: show_olc_cmds( ch, spedit_table ); break; case ED_NEWBIE: show_olc_cmds( ch, nedit_table ); break; case RACE_EDIT: show_olc_cmds( ch, race_edit_table ); break; } return FALSE; } /***************************************************************************** * Interpreter Tables. * *****************************************************************************/ const struct olc_cmd_type aedit_table[] = { /* { command function }, */ { "age", aedit_age }, { "builders", aedit_builder }, { "commands", show_commands }, { "create", aedit_create }, { "filename", aedit_file }, { "name", aedit_name }, { "recall", aedit_recall }, { "reset", aedit_reset }, { "security", aedit_security }, { "show", aedit_show }, { "links", aedit_links }, { "vnum", aedit_vnum }, { "lvnum", aedit_lvnum }, { "uvnum", aedit_uvnum }, { "sounds", aedit_sounds }, { "prototype", aedit_prototype }, { "clan_hq", aedit_clan_hq }, { "?", show_help }, { "version", show_version }, { "llevel", aedit_llevel }, { "ulevel", aedit_ulevel }, { "noquest", aedit_noquest }, { "mudschool", aedit_mudschool }, { "color", aedit_color }, { "", 0, } }; const struct olc_cmd_type cedit_table[]= { /* { command function }, */ { "commands", show_commands }, { "create", cedit_create }, { "clist", cedit_clist }, { "deity", cedit_diety }, { "members", cedit_members }, { "mkills", cedit_mkills }, { "civil", cedit_civil }, { "pkill", cedit_pkill }, { "pkilled", cedit_pkilled }, { "pkills", cedit_pkills }, { "name", cedit_name }, { "object", cedit_object }, { "recall", cedit_recall }, { "description", cedit_desc }, { "power", cedit_power }, { "induct", cedit_induct }, { "", 0, } }; const struct olc_cmd_type redit_table[] = { /* { command function }, */ { "commands", show_commands }, { "create", redit_create }, { "delet", redit_delet }, { "delete", redit_delete }, { "desc", redit_desc }, { "ed", redit_ed }, { "format", redit_format }, { "name", redit_name }, { "show", redit_show }, { "north", redit_north }, { "south", redit_south }, { "east", redit_east }, { "west", redit_west }, { "up", redit_up }, { "down", redit_down }, { "walk", redit_move }, /* New reset commands. */ { "mreset", redit_mreset }, { "oreset", redit_oreset }, { "rreset", redit_rreset }, { "mlist", redit_mlist }, { "olist", redit_olist }, { "rlist", redit_rlist }, { "mshow", redit_mshow }, { "oshow", redit_oshow }, { "proglist", redit_proglist }, { "rdamage", redit_rdamage }, { "rpedit", redit_rpedit }, { "rplist", redit_rplist }, { "rpremove", redit_rpremove }, { "epedit", redit_epedit }, { "eplist", redit_eplist }, { "epremove", redit_epremove }, { "?", show_help }, { "version", show_version }, { "", 0, } }; const struct olc_cmd_type oedit_table[] = { /* { command function }, */ { "addaffect", oedit_addaffect }, { "commands", show_commands }, { "cost", oedit_cost }, { "level", oedit_level }, { "ac_type", set_ac_type }, { "ac_vnum", set_ac_vnum }, { "ac_v1", set_ac_v1 }, { "ac_v2", set_ac_v2 }, { "ac_setspell", set_ac_setspell }, { "create", oedit_create }, { "delaffect", oedit_delaffect }, { "delet", oedit_delet }, { "delete", oedit_delete }, { "ed", oedit_ed }, { "long", oedit_long }, { "name", oedit_name }, { "short", oedit_short }, { "show", oedit_show }, { "v0", oedit_value0 }, { "v1", oedit_value1 }, { "v2", oedit_value2 }, { "v3", oedit_value3 }, { "weight", oedit_weight }, { "ojoin", oedit_join }, { "osepone", oedit_sepone }, { "oseptwo", oedit_septwo }, { "opedit", oedit_opedit }, { "oplist", oedit_oplist }, { "opremove", oedit_opremove }, { "mlist", redit_mlist }, { "olist", redit_olist }, { "rlist", redit_rlist }, { "?", show_help }, { "version", show_version }, { "", 0, } }; const struct olc_cmd_type medit_table[] = { /* { command function }, */ { "alignment", medit_align }, { "commands", show_commands }, #ifdef NEW_MONEY { "copper", medit_copper }, #endif { "create", medit_create }, { "desc", medit_desc }, { "delet", medit_delet }, { "delete", medit_delete }, { "level", medit_level }, { "hp", medit_hitpoint }, { "gold", medit_gold }, { "long", medit_long }, { "name", medit_name }, { "shop", medit_shop }, { "class", medit_class }, { "short", medit_short }, { "show", medit_show }, #ifdef NEW_MONEY { "silver", medit_silver }, #endif { "spec", medit_spec }, { "immune", medit_immune }, /* XOR */ { "mpedit", medit_mpedit }, /* Altrag */ { "mplist", medit_mplist }, /* Altrag */ { "mpremove", medit_mpremove }, /* Altrag */ { "mlist", redit_mlist }, { "olist", redit_olist }, { "rlist", redit_rlist }, { "?", show_help }, { "version", show_version }, { "", 0, } }; const struct olc_cmd_type mpedit_table[] = { /* { command function }, */ { "arglist", mpedit_arglist, }, { "comlist", mpedit_comlist, }, { "?", show_help, }, { "version", show_version, }, { "commands", show_commands, }, { "", 0, } }; const struct olc_cmd_type tedit_table[] = { /* { command function }, */ { "arglist", tedit_arglist, }, { "comlist", tedit_comlist, }, /* { "disarmable", tedit_disarmable, },*/ { "?", show_help, }, { "version", show_version, }, { "commands", show_commands, }, { "", 0, } }; const struct olc_cmd_type hedit_table[] = { /* { command function }, */ { "commands", show_commands }, { "delet", edit_delet }, { "delete", hedit_delete }, { "keyword", hedit_name }, { "name", hedit_name }, { "level", hedit_level }, { "show", hedit_show }, { "desc", hedit_desc }, { "text", hedit_desc }, { "?", show_help }, { "version", show_version }, { "", 0, } }; const struct olc_cmd_type mreset_table[] = { /* { command function }, */ /* { "add", mreset_add }, { "delet", mreset_delet }, { "delete", mreset_delete }, { "max_in_room", mreset_max_in_room }, */ { "?", show_help }, { "commands", show_commands }, { "", 0, } }; const struct olc_cmd_type spedit_table[] = { /* { command function }, */ { "commands", show_commands }, { "1", spedit_damage_msg }, { "2", spedit_spell_ends }, { "3", spedit_spell_ends_room }, { "dispelable", spedit_dispelable }, { "min", spedit_min }, { "mana", spedit_mana }, { "name", spedit_name }, { "show", spedit_show }, { "wait", spedit_wait }, { "", 0, } }; const struct olc_cmd_type race_edit_table[] = { /* { command function }, */ { "commands", show_commands }, { "name", race_edit_name }, { "full", race_edit_full }, { "mstr", race_edit_mstr }, { "mint", race_edit_mint }, { "mwis", race_edit_mwis }, { "mdex", race_edit_mdex }, { "mcon", race_edit_mcon }, { "delet", edit_delet }, { "delete", race_edit_delete }, { "", 0, } }; const struct olc_cmd_type sedit_table[] = { /* { command function }, */ { "keyword", sedit_name }, { "char_no_arg", sedit_char_no_arg }, { "others_no_arg",sedit_others_no_arg }, { "char_found", sedit_char_found }, { "others_found", sedit_others_found }, { "vict_found", sedit_vict_found }, { "char_auto", sedit_char_auto }, { "others_auto", sedit_others_auto }, { "1", sedit_char_no_arg }, { "2", sedit_others_no_arg }, { "3", sedit_char_found }, { "4", sedit_others_found }, { "5", sedit_vict_found }, { "6", sedit_char_auto }, { "7", sedit_others_auto }, { "delet", edit_delet }, { "delete", sedit_delete }, { "?", show_help }, { "commands", show_commands }, { "", 0, } }; const struct olc_cmd_type nedit_table[] = { /* { command function }, */ { "keyword", nedit_keyword }, { "answer1", nedit_answer1 }, { "answer2", nedit_answer2 }, { "1", nedit_answer1 }, { "2", nedit_answer2 }, { "?", show_help }, { "commands", show_commands }, { "", 0, } }; const struct olc_cmd_type rename_obj_table[] = { /* { command function }, */ { "keyword", rename_keyword }, { "short", rename_short }, { "long", rename_long }, { "1", rename_keyword }, { "2", rename_short }, { "3", rename_long }, { "commands", show_commands }, { "", 0, } }; const struct olc_cmd_type forge_obj_table[] = { { "keyword", rename_keyword, }, { "short", rename_short, }, { "long", rename_long, }, { "type", forge_type }, { "1", forge_addaffect, }, { "2", forge_addaffect, }, { "3", forge_addaffect, }, { "4", forge_addaffect, }, { "5", forge_addaffect, }, { "6", forge_addaffect, }, { "7", forge_addaffect, }, { "8", forge_addaffect, }, { "9", forge_addaffect, }, { "commands", show_commands, }, { "", 0, } }; /***************************************************************************** * End Interpreter Tables. * *****************************************************************************/ /***************************************************************************** Name: get_area_data Purpose: Returns pointer to area with given vnum. Called by: do_aedit(olc.c). ****************************************************************************/ AREA_DATA *get_area_data( int vnum ) { AREA_DATA *pArea; for (pArea = area_first; pArea; pArea = pArea->next ) { if (pArea->vnum == vnum) return pArea; } return 0; } /* * Get data for a MobProg -- Altrag */ MPROG_DATA *get_mprog_data( MOB_INDEX_DATA *pMob, int vnum ) { int value = 0; MPROG_DATA *pMProg; for ( pMProg = pMob->mobprogs; pMProg; pMProg = pMProg->next, value++ ) { if ( value == vnum ) return pMProg; } return NULL; } TRAP_DATA *get_trap_data( void *vo, int vnum, int type ) { int value = 0; OBJ_INDEX_DATA *obj = (OBJ_INDEX_DATA *)vo; ROOM_INDEX_DATA *room = (ROOM_INDEX_DATA *)vo; EXIT_DATA *pExit = (EXIT_DATA *)vo; TRAP_DATA *pTrap; switch(type) { case ED_OPROG: for (pTrap = obj->traps; pTrap; pTrap = pTrap->next_here, value++) if ( value == vnum ) return pTrap; return NULL; case ED_RPROG: for (pTrap = room->traps; pTrap; pTrap = pTrap->next_here, value++) if ( value == vnum ) return pTrap; return NULL; case ED_EPROG: for (pTrap = pExit->traps; pTrap; pTrap = pTrap->next_here, value++) if ( value == vnum ) return pTrap; return NULL; default: bug( "Get_trap_index: Invalid type %d", type ); return NULL; } return NULL; } /***************************************************************************** Name: edit_done Purpose: Resets builder information on completion. Called by: aedit, redit, oedit, medit(olc.c), mpedit(Altrag) ****************************************************************************/ bool edit_done( CHAR_DATA *ch ) { /* * Well, since i have the inEdit for mpedit, why not make it usable for * all nested editors..? * -- Altrag */ if ( ch->desc->editin || ch->desc->inEdit ) { ch->desc->pEdit = ch->desc->inEdit; ch->desc->inEdit = NULL; ch->desc->editor = ch->desc->editin; ch->desc->editin = 0; return FALSE; } if ( ch->desc->editor == FORGE_OBJECT ) forge_pay_cost( ch ); ch->desc->pEdit = NULL; ch->desc->editor = 0; return FALSE; } /***************************************************************************** * Interpreters. * *****************************************************************************/ /* Area Interpreter, called by do_aedit. */ void aedit( CHAR_DATA *ch, char *argument ) { AREA_DATA *pArea; char command[MAX_INPUT_LENGTH]; char arg[MAX_INPUT_LENGTH]; int cmd; int value; EDIT_AREA(ch, pArea); smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) */ send_to_char(C_DEFAULT, "AEdit: Insufficient security to modify area.\n\r", ch ); /* else if ( IS_SWITCHED( ch ) ) send_to_char( C_DEFAULT, "AEdit: Cannot edit while switched.\n\r", ch ); */ if ( command[0] == '\0' ) { aedit_show( ch, argument ); return; } if ( !str_cmp(command, "done") ) { edit_done( ch ); return; } if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) || IS_SWITCHED( ch ) ) */ { interpret( ch, arg ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; *aedit_table[cmd].name; cmd++ ) { if ( !str_prefix( command, aedit_table[cmd].name ) ) { if ( (*aedit_table[cmd].olc_fun) ( ch, argument ) ) SET_BIT( pArea->area_flags, AREA_CHANGED ); return; } } /* Take care of flags. */ if ( ( value = flag_value( area_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pArea->area_flags, value); send_to_char(C_DEFAULT, "Flag toggled.\n\r", ch ); return; } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } /* Room Interpreter, called by do_redit. */ void redit( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *pRoom; AREA_DATA *pArea; char arg[MAX_STRING_LENGTH]; char command[MAX_INPUT_LENGTH]; int cmd; int value; EDIT_ROOM(ch, pRoom); pArea = pRoom->area; smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) */ { send_to_char(C_DEFAULT, "REdit: Insufficient security to modify room.\n\r", ch ); } /* else if ( IS_SWITCHED( ch ) ) send_to_char( C_DEFAULT, "REdit: Cannot edit while switched.\n\r", ch ); */ if ( command[0] == '\0' ) { redit_show( ch, argument ); return; } if ( !str_cmp(command, "done") ) { edit_done( ch ); return; } if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) || IS_SWITCHED( ch ) ) */ { interpret( ch, arg ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; *redit_table[cmd].name; cmd++ ) { if ( !str_prefix( command, redit_table[cmd].name ) ) { if ( (*redit_table[cmd].olc_fun) ( ch, argument ) ) SET_BIT( pArea->area_flags, AREA_CHANGED ); return; } } /* Take care of flags. */ if ( ( value = flag_value( room_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pRoom->room_flags, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Room flag toggled.\n\r", ch ); return; } if ( ( value = flag_value( sector_flags, arg ) ) != NO_FLAG ) { pRoom->sector_type = value; SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Sector type set.\n\r", ch ); return; } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } void cedit( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; char arg[MAX_STRING_LENGTH]; char command[MAX_INPUT_LENGTH]; int cmd; EDIT_CLAN(ch, pClan); smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); if ( !str_cmp( "done", command ) ) { edit_done( ch ); return; } if ( get_trust(ch) < L_CON ) { send_to_char(C_DEFAULT, "You may not edit clans.\n\r", ch ); return; } if ( command[0] == '\0' ) { cedit_show( ch, argument ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; *cedit_table[cmd].name; cmd++ ) { if ( !str_prefix( command, cedit_table[cmd].name ) ) { (*cedit_table[cmd].olc_fun) ( ch, argument ); return; } } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } /* Object Interpreter, called by do_oedit. */ void oedit( CHAR_DATA *ch, char *argument ) { AREA_DATA *pArea; OBJ_INDEX_DATA *pObj; char arg[MAX_STRING_LENGTH]; char command[MAX_INPUT_LENGTH]; int cmd; int value; smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); EDIT_OBJ(ch, pObj); pArea = pObj->area; if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) */ send_to_char(C_DEFAULT, "OEdit: Insufficient security to modify area.\n\r", ch ); /* else if ( IS_SWITCHED( ch ) ) send_to_char( C_DEFAULT, "OEdit: Cannot edit while switched.\n\r", ch ); */ if ( command[0] == '\0' ) { oedit_show( ch, argument ); return; } if ( !str_cmp(command, "done") ) { edit_done( ch ); return; } if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) || IS_SWITCHED( ch ) ) */ { interpret( ch, arg ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; *oedit_table[cmd].name; cmd++ ) { if ( !str_prefix( command, oedit_table[cmd].name ) ) { if ( (*oedit_table[cmd].olc_fun) ( ch, argument ) ) SET_BIT( pArea->area_flags, AREA_CHANGED ); return; } } /* Take care of flags. */ if ( ( value = flag_value( type_flags, arg ) ) != NO_FLAG ) { pObj->item_type = value; SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Type set.\n\r", ch); /* * Clear the values. */ pObj->value[0] = 0; pObj->value[1] = 0; pObj->value[2] = 0; pObj->value[3] = 0; return; } if ( ( value = flag_value( extra_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pObj->extra_flags, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Extra flag toggled.\n\r", ch); return; } if ( ( value = flag_value( wear_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pObj->wear_flags, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Wear flag toggled.\n\r", ch); return; } /* FOR NEW FLAGS */ if ( ( value = flag_value( anti_class_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pObj->anti_class_flags, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Anti class flag toggled.\n\r", ch); return; } if ( ( value = flag_value( anti_race_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pObj->anti_race_flags, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Anti race flag toggled.\n\r", ch); return; } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } /* Mobile Interpreter, called by do_medit. */ void medit( CHAR_DATA *ch, char *argument ) { AREA_DATA *pArea; MOB_INDEX_DATA *pMob; char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; int value; smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); EDIT_MOB(ch, pMob); pArea = pMob->area; if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) */ send_to_char(C_DEFAULT, "MEdit: Insufficient security to modify area.\n\r", ch ); /* else if ( IS_SWITCHED( ch ) ) send_to_char( C_DEFAULT, "MEdit: Cannot edit while switched.\n\r", ch ); */ if ( command[0] == '\0' ) { medit_show( ch, argument ); return; } if ( !str_cmp(command, "done") ) { edit_done( ch ); return; } if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) || IS_SWITCHED( ch ) ) */ { interpret( ch, arg ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; *medit_table[cmd].name; cmd++ ) { if ( !str_prefix( command, medit_table[cmd].name ) ) { if ( (*medit_table[cmd].olc_fun) ( ch, argument ) ) SET_BIT( pArea->area_flags, AREA_CHANGED ); return; } } /* Take care of flags. */ if ( ( value = flag_value( sex_flags, arg ) ) != NO_FLAG ) { pMob->sex = value; SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Sex set.\n\r", ch); return; } if ( ( value = flag_value( act_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pMob->act, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Act flag toggled.\n\r", ch); return; } if ( ( value = flag_value( affect_flags, arg ) ) != NO_FLAG ) { TOGGLE_BIT(pMob->affected_by, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Affect flag toggled.\n\r", ch); return; } if ( ( value = flag_value( affect2_flags, arg ) ) != NO_FLAG && value != AFF_GOLDEN ) { TOGGLE_BIT(pMob->affected_by2, value); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "Affect flag toggled.\n\r", ch); return; } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } /* * Editor for MobPrograms. * -- Altrag */ void mpedit( CHAR_DATA *ch, char *argument ) { AREA_DATA *pArea; MPROG_DATA *pMProg; char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; int value; smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); EDIT_MPROG(ch, pMProg); { MOB_INDEX_DATA *pMob; pMob = (MOB_INDEX_DATA *)ch->desc->inEdit; pArea = pMob->area; } if ( command[0] == '\0' ) { mpedit_show( ch, "" ); return; } if ( !str_cmp(command, "done") ) { edit_done( ch ); return; } if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) || IS_SWITCHED( ch ) ) */ { interpret( ch, arg ); return; } /* Search Table and Dispatch Command. */ for ( cmd = 0; *mpedit_table[cmd].name; cmd++ ) { if ( !str_prefix( command, mpedit_table[cmd].name ) ) { if ( (*mpedit_table[cmd].olc_fun) ( ch, argument ) ) SET_BIT( pArea->area_flags, AREA_CHANGED ); return; } } if ( ( value = flag_value( mprog_types, arg ) ) != NO_FLAG ) { MOB_INDEX_DATA *pMob; MPROG_DATA *prog; pMProg->type = value; pMob = (MOB_INDEX_DATA *)ch->desc->inEdit; /* * Full list search again in case theres more than one of the type * -- Altrag */ pMob->progtypes = 0; for ( prog = pMob->mobprogs; prog; prog = prog->next ) SET_BIT( pMob->progtypes, prog->type ); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "MobProg type set.\n\r", ch); return; } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } /* * Very klutzy global trap editor.. Main cause is that exits are handled * differently from the other items with traps. * -- Altrag */ void tedit( CHAR_DATA *ch, char *argument ) { AREA_DATA *pArea; TRAP_DATA *pTrap; EXIT_DATA *pExit = NULL; char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; int value; switch (ch->desc->editor) { case ED_OPROG: pArea = ((OBJ_INDEX_DATA *)ch->desc->inEdit)->area; break; case ED_RPROG: { TRAP_DATA *trap; for ( trap = ch->in_room->traps; trap; trap = trap->next_here ) if ( trap == (TRAP_DATA *)ch->desc->pEdit ) break; if ( !trap ) { send_to_char(C_DEFAULT, "Room changed. Returning to REditor.\n\r",ch); edit_done( ch ); /* redit( ch, arg );*/ return; } } pArea = ch->in_room->area; break; case ED_EPROG: { int dir; for ( dir = 0; dir < 6; dir++ ) if ( (pExit = ch->in_room->exit[dir]) ) { TRAP_DATA *trap = (TRAP_DATA *)ch->desc->pEdit; /* for ( trap = pExit->traps; trap; trap = trap->next_here ) if ( trap == (TRAP_DATA *)ch->desc->pEdit ) break; if ( trap ) break;*/ if ( trap->on_exit == pExit ) break; } if ( dir == 6 ) { send_to_char(C_DEFAULT, "Room changed. Returning to REditor.\n\r",ch); edit_done( ch ); /* redit(ch, arg);*/ return; } pArea = ch->in_room->area; break; } default: bug("Tedit: Invalid editor type %d", ch->desc->editor); return; } smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); EDIT_TRAP(ch, pTrap); if ( command[0] == '\0' ) { tedit_show( ch, "" ); return; } if ( !str_cmp(command, "done") ) { edit_done( ch ); return; } if ( !IS_BUILDER( ch, pArea ) ) /* && ch->level < L_CON ) || IS_SWITCHED( ch ) ) */ { interpret( ch, arg ); return; } /* Search table and dispatch command. */ for ( cmd = 0; *tedit_table[cmd].name; cmd++ ) { if ( !str_prefix( command, tedit_table[cmd].name ) ) { if ( (*tedit_table[cmd].olc_fun) ( ch, argument ) ) SET_BIT( pArea->area_flags, AREA_CHANGED ); return; } } switch (ch->desc->editor) { TRAP_DATA *trap; case ED_OPROG: if ( ( value = flag_value( oprog_types, arg ) ) != NO_FLAG ) { OBJ_INDEX_DATA *obj = (OBJ_INDEX_DATA *)ch->desc->inEdit; pTrap->type = value; obj->traptypes = 0; for ( trap = obj->traps; trap; trap = trap->next_here ) SET_BIT( obj->traptypes, trap->type ); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char(C_DEFAULT, "ObjProg type set.\n\r", ch ); return; } break; case ED_RPROG: if ( ( value = flag_value( rprog_types, arg ) ) != NO_FLAG ) { ROOM_INDEX_DATA *room = ch->in_room; pTrap->type = value; room->traptypes = 0; for ( trap = room->traps; trap; trap = trap->next_here ) SET_BIT( room->traptypes, trap->type ); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char( C_DEFAULT, "RoomProg type set.\n\r",ch); return; } break; case ED_EPROG: if ( !pExit ) { send_to_char(C_DEFAULT, "Exit not found. Returning to REditor.\n\r",ch); bug("Tedit: NULL pExit in %d", ch->in_room->vnum); edit_done( ch ); redit( ch, arg ); return; } if ( ( value = flag_value( eprog_types, arg ) ) != NO_FLAG ) { TRAP_DATA *trap; pTrap->type = value; pExit->traptypes = 0; for ( trap = pExit->traps; trap; trap = trap->next_here ) SET_BIT( pExit->traptypes, trap->type ); SET_BIT( pArea->area_flags, AREA_CHANGED ); send_to_char( C_DEFAULT, "ExitProg type set.\n\r",ch); return; } break; default: bug("Tedit: Invalid editor %d", ch->desc->editor); break; } /* Default to Standard Interpreter. */ interpret( ch, arg ); return; } void purge_area( AREA_DATA *pArea ) { ROOM_INDEX_DATA *pRoom; int vnum; CHAR_DATA *victim; CHAR_DATA *vnext; OBJ_DATA *obj_next; OBJ_DATA *obj; for ( vnum = pArea->lvnum; vnum <= pArea->uvnum; vnum++ ) { if ( ( pRoom = get_room_index(vnum) ) ) { for ( victim = pRoom->people; victim; victim = vnext ) { vnext = victim->next_in_room; if ( victim->deleted ) continue; if ( IS_NPC( victim ) ) extract_char( victim, TRUE ); } for (obj = pRoom->contents; obj; obj = obj_next ) { obj_next = obj->next_content; if ( obj->deleted ) continue; extract_obj( obj ); } } } return; } void do_aedit( CHAR_DATA *ch, char *argument ) { AREA_DATA *pArea; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); pArea = ch->in_room->area; if ( command[0] == 'r' && !str_prefix( command, "reset" ) ) { if ( ch->desc->editor == ED_AREA ) reset_area( (AREA_DATA *)ch->desc->pEdit ); else reset_area( pArea ); send_to_char(C_DEFAULT, "Area reset.\n\r", ch ); return; } if ( command[0] == 'p' && !str_prefix( command, "purge" ) ) { if ( ch->desc->editor == ED_AREA ) purge_area( (AREA_DATA *)ch->desc->pEdit ); else purge_area( pArea ); send_to_char(C_DEFAULT, "Area purged.\n\r", ch ); return; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { if ( aedit_create( ch, argument ) ) { ch->desc->editor = ED_AREA; pArea = (AREA_DATA *)ch->desc->pEdit; SET_BIT( pArea->area_flags, AREA_CHANGED ); aedit_show( ch, "" ); } return; } if ( is_number( command ) ) { if ( !( pArea = get_area_data( atoi(command) ) ) ) { send_to_char(C_DEFAULT, "No such area vnum exists.\n\r", ch ); return; } } /* * Builder defaults to editing current area. */ ch->desc->pEdit = (void *)pArea; ch->desc->editor = ED_AREA; aedit_show( ch, "" ); return; } /* Entry point for editing room_index_data. */ void do_redit( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *pRoom; char command[MAX_INPUT_LENGTH]; int players = 0; argument = one_argument( argument, command ); pRoom = ch->in_room; if ( command[0] == 'r' && !str_prefix( command, "reset" ) ) { players = pRoom->area->nplayer; pRoom->area->nplayer = 0; /* When doing redit reset, make amt of players in area 0 so objects reset on the ground --Angi */ reset_room( pRoom ); send_to_char(C_DEFAULT, "Room reset.\n\r", ch ); /* Set amt of players in area back to original number */ pRoom->area->nplayer = players; return; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { if ( redit_create( ch, argument ) ) { char_from_room( ch ); char_to_room( ch, ch->desc->pEdit ); SET_BIT( pRoom->area->area_flags, AREA_CHANGED ); } } /* * Builder defaults to editing current room. */ ch->desc->editor = ED_ROOM; redit_show( ch, "" ); return; } /* Entry point for editing obj_index_data. */ void do_oedit( CHAR_DATA *ch, char *argument ) { OBJ_INDEX_DATA *pObj; AREA_DATA *pArea; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); if ( is_number( command ) ) { if ( !( pObj = get_obj_index( atoi( command ) ) ) ) { send_to_char(C_DEFAULT, "OEdit: That vnum does not exist.\n\r", ch ); return; } ch->desc->pEdit = (void *)pObj; ch->desc->editor = ED_OBJECT; oedit_show( ch, "" ); return; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { if ( oedit_create( ch, argument ) ) { if ( argument[0] == '\0') pArea = ch->in_room->area; else pArea = get_vnum_area( atoi( argument ) ); SET_BIT( pArea->area_flags, AREA_CHANGED ); ch->desc->editor = ED_OBJECT; oedit_show( ch, "" ); } return; } send_to_char(C_DEFAULT, "OEdit: There is no default object to edit.\n\r", ch ); return; } /* Entry point for editing mob_index_data. */ void do_medit( CHAR_DATA *ch, char *argument ) { MOB_INDEX_DATA *pMob; AREA_DATA *pArea; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); if ( is_number( command ) ) { if ( !( pMob = get_mob_index( atoi( command ) ) )) { send_to_char(C_DEFAULT, "MEdit: That vnum does not exist.\n\r", ch ); return; } ch->desc->pEdit = (void *)pMob; ch->desc->editor = ED_MOBILE; medit_show( ch, "" ); return; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { if ( medit_create( ch, argument ) ) { if ( argument[0] == '\0') pArea = ch->in_room->area; else pArea = get_vnum_area( atoi( argument ) ); SET_BIT( pArea->area_flags, AREA_CHANGED ); ch->desc->editor = ED_MOBILE; medit_show( ch, "" ); } return; } send_to_char(C_DEFAULT, "MEdit: There is no default mobile to edit.\n\r", ch ); return; } void do_cedit( CHAR_DATA *ch, char *argument ) { CLAN_DATA *pClan; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); if ( is_number( command ) ) { if ( !( pClan = get_clan_index( atoi( command ) ) )) { send_to_char(C_DEFAULT, "CEdit: That clan does not exist.\n\r", ch ); return; } ch->desc->pEdit = (void *)pClan; ch->desc->editor = ED_CLAN; cedit_show( ch, "" ); return; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { if ( cedit_create( ch, argument ) ) { ch->desc->editor = ED_CLAN; cedit_show( ch, "" ); } return; } send_to_char(C_DEFAULT, "CEdit: There is no default clan to edit.\n\r", ch ); return; } /* * The last part needed in this file.. :) * -- Altrag */ bool medit_mpedit( CHAR_DATA *ch, char *argument ) { MPROG_DATA *pMProg; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); if ( is_number( command ) ) { if ( !( pMProg = get_mprog_data( (MOB_INDEX_DATA *)ch->desc->pEdit, atoi( command ) ) ) ) { send_to_char( C_DEFAULT, "MPEdit: Mobile has no such MobProg.\n\r", ch ); return FALSE; } ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_MPROG; ch->desc->inEdit = ch->desc->pEdit; ch->desc->pEdit = (void *)pMProg; mpedit_show( ch, "" ); return TRUE; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { if ( mpedit_create( ch, argument ) ) { ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_MPROG; mpedit_show( ch, "" ); return TRUE; } return FALSE; } send_to_char( C_DEFAULT, "MPEdit: There is no default MobProg to edit.\n\r", ch ); return FALSE; } bool oedit_opedit( CHAR_DATA *ch, char *argument ) { TRAP_DATA *pTrap; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); if ( is_number( command ) ) { if ( !( pTrap = get_trap_data( ch->desc->pEdit, atoi(command), ED_OPROG ) ) ) { send_to_char( C_DEFAULT, "OPEdit: Object has no such ObjProg.\n\r", ch ); return FALSE; } ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_OPROG; ch->desc->inEdit = ch->desc->pEdit; ch->desc->pEdit = (void *)pTrap; tedit_show( ch, "" ); return TRUE; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_OPROG; if ( tedit_create( ch, argument ) ) { tedit_show( ch, "" ); return TRUE; } ch->desc->editor = ch->desc->editin; ch->desc->editin = 0; return FALSE; } send_to_char( C_DEFAULT, "OPEdit: There is no default ObjProg to edit.\n\r", ch ); return FALSE; } bool redit_rpedit( CHAR_DATA *ch, char *argument ) { TRAP_DATA *pTrap; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); if ( is_number( command ) ) { if ( !( pTrap = get_trap_data( ch->in_room, atoi(command), ED_RPROG ) ) ) { send_to_char(C_DEFAULT, "RPEdit: Room has no such RoomProg.\n\r",ch); return FALSE; } ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_RPROG; ch->desc->pEdit = (void *)pTrap; tedit_show( ch, argument ); return TRUE; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_RPROG; if ( tedit_create( ch, argument ) ) { tedit_show( ch, argument ); return TRUE; } ch->desc->editor = ch->desc->editin; ch->desc->editin = 0; return FALSE; } send_to_char(C_DEFAULT, "RPEdit: There is no default RoomProg to edit.\n\r",ch); return FALSE; } bool redit_epedit( CHAR_DATA *ch, char *argument ) { TRAP_DATA *pTrap; char command[MAX_INPUT_LENGTH]; int dir; argument = one_argument( argument, command ); for ( dir = 0; dir < 6; dir++ ) if ( !str_prefix( command, dir_name[dir] ) && ch->in_room->exit[dir] ) break; if ( dir == 6 ) { send_to_char(C_DEFAULT, "EPEdit: Room has no such exit.\n\r", ch); return FALSE; } argument = one_argument( argument, command ); if ( is_number( command ) ) { if ( !( pTrap = get_trap_data( ch->in_room->exit[dir], atoi(command), ED_EPROG ) ) ) { send_to_char(C_DEFAULT, "EPEdit: Exit has no such ExitProg.\n\r", ch); return FALSE; } ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_EPROG; ch->desc->pEdit = pTrap; tedit_show( ch, "" ); return TRUE; } if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { char buf[MAX_INPUT_LENGTH]; ch->desc->editin = ch->desc->editor; ch->desc->editor = ED_EPROG; strcpy( buf, dir_name[dir] ); if ( tedit_create( ch, buf ) ) { tedit_show( ch, "" ); return TRUE; } ch->desc->editor = ch->desc->editin; ch->desc->editin = 0; return FALSE; } send_to_char(C_DEFAULT, "EPEdit: There is no default ExitProg to edit.\n\r",ch); return FALSE; } void display_resets( CHAR_DATA *ch ) { ROOM_INDEX_DATA *pRoom; RESET_DATA *pReset; MOB_INDEX_DATA *pMob = NULL; char buf [ MAX_STRING_LENGTH ]; char final [ MAX_STRING_LENGTH ]; int iReset = 0; EDIT_ROOM(ch, pRoom); final[0] = '\0'; send_to_char ( C_DEFAULT, " No. Loads Description Location Vnum Max Description" "\n\r" "==== ======== ============= =================== ======== ===== ===========" "\n\r", ch ); for ( pReset = pRoom->reset_first; pReset; pReset = pReset->next ) { OBJ_INDEX_DATA *pObj; MOB_INDEX_DATA *pMobIndex; OBJ_INDEX_DATA *pObjIndex; OBJ_INDEX_DATA *pObjToIndex; ROOM_INDEX_DATA *pRoomIndex; final[0] = '\0'; sprintf( final, "&R[&w%2d&R]&w ", ++iReset ); switch ( pReset->command ) { default: sprintf( buf, "Bad reset command: %c.", pReset->command ); strcat( final, buf ); break; case 'M': if ( !( pMobIndex = get_mob_index( pReset->arg1 ) ) ) { sprintf( buf, "Load Mobile - Bad Mob %d\n\r", pReset->arg1 ); strcat( final, buf ); continue; } if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) ) { sprintf( buf, "Load Mobile - Bad Room %d\n\r", pReset->arg3 ); strcat( final, buf ); continue; } pMob = pMobIndex; sprintf( buf, "&BM&R[&B%5d&R]&B %-13.13s in room R[%5d] [%3d] %-15.15s&w\n\r", pReset->arg1, pMob->short_descr, pReset->arg3, pReset->arg2, pRoomIndex->name ); strcat( final, buf ); /* * Check for pet shop. * ------------------- */ { ROOM_INDEX_DATA *pRoomIndexPrev; pRoomIndexPrev = get_room_index( pRoomIndex->vnum - 1 ); if ( pRoomIndexPrev && IS_SET( pRoomIndexPrev->room_flags, ROOM_PET_SHOP ) ) final[5] = 'P'; } break; case 'O': if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) ) { sprintf( buf, "Load Object - Bad Object %d\n\r", pReset->arg1 ); strcat( final, buf ); continue; } pObj = pObjIndex; if ( !( pRoomIndex = get_room_index( pReset->arg3 ) ) ) { sprintf( buf, "Load Object - Bad Room %d\n\r", pReset->arg3 ); strcat( final, buf ); continue; } sprintf( buf, "&WO&R[&W%5d&R]&W %-13.13s in room " "R[%5d] %-15.15s&w\n\r", pReset->arg1, pObj->short_descr, pReset->arg3, pRoomIndex->name ); strcat( final, buf ); break; case 'P': if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) ) { sprintf( buf, "Put Object - Bad Object %d\n\r", pReset->arg1 ); strcat( final, buf ); continue; } pObj = pObjIndex; if ( !( pObjToIndex = get_obj_index( pReset->arg3 ) ) ) { sprintf( buf, "Put Object - Bad To Object %d\n\r", pReset->arg3 ); strcat( final, buf ); continue; } sprintf( buf, "O[%5d] %-13.13s inside O[%5d] %-15.15s\n\r", pReset->arg1, pObj->short_descr, pReset->arg3, pObjToIndex->short_descr ); strcat( final, buf ); break; case 'G': case 'E': if ( !( pObjIndex = get_obj_index( pReset->arg1 ) ) ) { sprintf( buf, "Give/Equip Object - Bad Object %d\n\r", pReset->arg1 ); strcat( final, buf ); continue; } pObj = pObjIndex; if ( !pMob ) { sprintf( buf, "Give/Equip Object - No Previous Mobile\n\r" ); strcat( final, buf ); break; } /* if ( pMob->pShop ) */ if ( ( pMob->pShop ) && ( pReset->arg2 == WEAR_NONE ) ) /* Angi */ { sprintf( buf, "O[%5d] %-13.13s in the inventory of S[%5d] %-15.15s\n\r", pReset->arg1, pObj->short_descr, pMob->vnum, pMob->short_descr ); } else sprintf( buf, "O[%5d] %-13.13s %-19.19s M[%5d] %-15.15s\n\r", pReset->arg1, pObj->short_descr, (pReset->command == 'G') ? flag_string( wear_loc_strings, WEAR_NONE ) : flag_string( wear_loc_strings, pReset->arg3 ), pMob->vnum, pMob->short_descr ); strcat( final, buf ); break; /* * Doors are set in rs_flags don't need to be displayed. * If you want to display them then uncomment the new_reset * line in the case 'D' in load_resets in db.c and here. * case 'D': pRoomIndex = get_room_index( pReset->arg1 ); sprintf( buf, "R[%5d] %s door of %-19.19s reset to %s\n\r", pReset->arg1, capitalize( dir_name[ pReset->arg2 ] ), pRoomIndex->name, flag_string( door_resets, pReset->arg3 ) ); strcat( final, buf ); break; * * End Doors Comment. */ case 'R': if ( !( pRoomIndex = get_room_index( pReset->arg1 ) ) ) { sprintf( buf, "Randomize Exits - Bad Room %d\n\r", pReset->arg1 ); strcat( final, buf ); continue; } sprintf( buf, "R[%5d] Exits (0) to (%d) are randomized in %s\n\r", pReset->arg1, pReset->arg2, pRoomIndex->name ); strcat( final, buf ); break; } send_to_char(C_DEFAULT, final, ch ); } return; } /***************************************************************************** Name: add_reset Purpose: Inserts a new reset in the given index slot. Called by: do_resets(olc.c). ****************************************************************************/ void add_reset( ROOM_INDEX_DATA *room, RESET_DATA *pReset, int index ) { RESET_DATA *reset; int iReset = 0; if ( !room->reset_first ) { room->reset_first = pReset; room->reset_last = pReset; pReset->next = NULL; return; } index--; if ( index == 0 ) /* First slot (1) selected. */ { pReset->next = room->reset_first; room->reset_first = pReset; return; } /* * If negative slot( <= 0 selected) then this will find the last. */ for ( reset = room->reset_first; reset->next; reset = reset->next ) { if ( ++iReset == index ) break; } pReset->next = reset->next; reset->next = pReset; if ( !pReset->next ) room->reset_last = pReset; return; } void do_resets( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char arg4[MAX_INPUT_LENGTH]; char arg5[MAX_INPUT_LENGTH]; RESET_DATA *pReset = NULL; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); argument = one_argument( argument, arg3 ); argument = one_argument( argument, arg4 ); argument = one_argument( argument, arg5 ); /* * Display resets in current room. * ------------------------------- */ if ( arg1[0] == '\0' ) { if ( ch->in_room->reset_first ) { send_to_char(C_DEFAULT, "Resets: M = mobile, R = room, O = object, " "P = pet, S = shopkeeper\n\r", ch ); display_resets( ch ); } else send_to_char(C_DEFAULT, "No resets in this room.\n\r", ch ); return; } if ( !IS_BUILDER( ch, ch->in_room->area ) ) { send_to_char(C_DEFAULT, "Resets: Invalid security for editing this area.\n\r", ch ); return; } /* * Take index number and search for commands. * ------------------------------------------ */ if ( is_number( arg1 ) ) { ROOM_INDEX_DATA *pRoom = ch->in_room; /* * Delete a reset. * --------------- */ if ( !str_cmp( arg2, "delete" ) ) { int insert_loc = atoi( arg1 ); if ( !ch->in_room->reset_first ) { send_to_char(C_DEFAULT, "No resets in this room.\n\r", ch ); return; } if ( insert_loc-1 <= 0 ) { pReset = pRoom->reset_first; pRoom->reset_first = pRoom->reset_first->next; if ( !pRoom->reset_first ) pRoom->reset_last = NULL; } else { int iReset = 0; RESET_DATA *prev = NULL; for ( pReset = pRoom->reset_first; pReset; pReset = pReset->next ) { if ( ++iReset == insert_loc ) break; prev = pReset; } if ( !pReset ) { send_to_char(C_DEFAULT, "Reset not found.\n\r", ch ); return; } if ( prev ) prev->next = prev->next->next; else pRoom->reset_first = pRoom->reset_first->next; for ( pRoom->reset_last = pRoom->reset_first; pRoom->reset_last->next; pRoom->reset_last = pRoom->reset_last->next ); } free_reset_data( pReset ); send_to_char(C_DEFAULT, "Reset deleted.\n\r", ch ); } /* else if ( (!str_cmp( arg2, "mob" ) && is_number( arg3 )) || (!str_cmp( arg2, "obj" ) && is_number( arg3 )) || (!str_cmp( arg2, "ran" ) && is_number( arg3 )) ) */ /* * Add a reset. * ------------ */ /* { */ /* * Check for Mobile reset. * ----------------------- */ /* if ( !str_cmp( arg2, "mob" ) ) { pReset = new_reset_data(); pReset->command = 'M'; pReset->arg1 = atoi( arg3 ); pReset->arg2 = is_number( arg4 ) ? atoi( arg4 ) : 1 ;*/ /* Max # */ /* pReset->arg3 = ch->in_room->vnum; } else if ( !str_cmp( arg2, "obj" ) ) */ /* * Check for Object reset. * ----------------------- */ /* { pReset = new_reset_data(); pReset->arg1 = atoi( arg3 ); */ /* * Inside another object. * ---------------------- */ /* if ( !str_prefix( arg4, "inside" ) ) { pReset->command = 'P'; pReset->arg2 = 0; pReset->arg3 = is_number( arg5 ) ? atoi( arg5 ) : 1; } else if ( !str_cmp( arg4, "room" ) ) */ /* * Inside the room. * ---------------- */ /* { pReset = new_reset_data(); pReset->command = 'O'; pReset->arg2 = 0; pReset->arg3 = ch->in_room->vnum; } else */ /* * Into a Mobile's inventory. * -------------------------- */ /* { if ( flag_value( wear_loc_flags, arg4 ) == NO_FLAG ) { send_to_char(C_DEFAULT, "Resets: '? wear-loc'\n\r", ch ); return; } pReset = new_reset_data(); pReset->arg3 = flag_value( wear_loc_flags, arg4 ); if ( pReset->arg2 == WEAR_NONE ) pReset->command = 'G'; else pReset->command = 'E'; } } else if ( !str_cmp( arg2, "ran" ) ) */ /* * Random Exit Resets. * Added By Altrag. */ /* { pReset = new_reset_data(); pReset->command = 'R'; pReset->arg1 = atoi( arg3 ); pReset->arg2 = ch->in_room->vnum; } add_reset( ch->in_room, pReset, atoi( arg1 ) ); send_to_char(C_DEFAULT, "Reset added.\n\r", ch ); } */ else { /* send_to_char(C_DEFAULT, "Syntax: RESET <number> OBJ <vnum> <wear_loc>\n\r", ch ); send_to_char(C_DEFAULT, " RESET <number> OBJ <vnum> in <vnum>\n\r", ch ); send_to_char(C_DEFAULT, " RESET <number> OBJ <vnum> room\n\r", ch ); send_to_char(C_DEFAULT, " RESET <number> MOB <vnum> [<max #>]\n\r", ch ); send_to_char(C_DEFAULT, " RESET <number> RAN <last-door>\n\r", ch ); */ send_to_char(C_DEFAULT, "Syntax: &BRESET &W(displays resets in room)", ch ); send_to_char(C_DEFAULT, " &BRESET <number> DELETE\n\r", ch ); } } return; } /***************************************************************************** Name: do_alist Purpose: Normal command to list areas and display area information. Called by: interpreter(interp.c) ****************************************************************************/ void do_alist( CHAR_DATA *ch, char *argument ) { char buf [ MAX_STRING_LENGTH ]; char result [ MAX_STRING_LENGTH*2 ]; /* May need tweaking. */ AREA_DATA *pArea; char *prot = ""; /* sprintf( result, "[%3s] [%-28s] (%-5s-%5s) [%-10s] %3s [%-8s]\n\r",*/ sprintf( result, "&z[&W%3s&z] &z[&B%-28s&z] &z(&W%-5s-%5s&z) &z[&G%-10s&z] &z[&W%3s&z][&W%-8s&z]\n\r", "Num", "Area Name", "lvnum", "uvnum", "Filename", "Sec", "Builders" ); for ( pArea = area_first; pArea; pArea = pArea->next ) { if ( IS_SET( pArea->area_flags, AREA_PROTOTYPE ) ) prot = "*"; else prot = " "; /* sprintf( buf, "[%3d] %s%-29.29s (%-5d-%5d) %-12.12s [%3d] [%-8.8s]\n\r",*/ sprintf( buf, "&z[&W%3d&z] &R%s&B%-29.29s &z(&W%-5d-%5d&z) &G%-12.12s &z[&w%3d&z][&W%-8.8s&z]\n\r", pArea->vnum, prot, &pArea->name[8], pArea->lvnum, pArea->uvnum, pArea->filename, pArea->security, pArea->builders ); strcat( result, buf ); } send_to_char(C_DEFAULT, result, ch ); return; } /* XOR */ void hedit(CHAR_DATA *ch, char *argument) { char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); if(command[0] == '\0') { hedit_show(ch, argument); return; } if(!str_cmp(command, "done")) { /* HELP_DATA *pHelp; static int counter; counter++; if ( counter >= 5 ) { EDIT_HELP(ch, pHelp); save_area(pHelp->area); counter = 0; } */ save_helps(); edit_done( ch ); return; } for(cmd = 0;*hedit_table[cmd].name;cmd++) { if(!str_prefix(command, hedit_table[cmd].name)) { (*hedit_table[cmd].olc_fun) (ch, argument); return; } } /* Default to Standard Interpreter. */ interpret(ch, arg); return; } HELP_DATA *get_help(char *argument) { HELP_DATA *pHelp; for(pHelp = help_first;pHelp;pHelp = pHelp->next) { if(is_name(NULL, argument, pHelp->keyword)) { return pHelp; } } return NULL; } void do_hedit(CHAR_DATA *ch, char *argument) { HELP_DATA *pHelp; char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; strcpy( arg, argument ); argument = one_argument(argument, command); if(command[0] == 'c' && !str_prefix(command, "create")) { if(get_help(argument) != NULL) { send_to_char(C_DEFAULT, "Help entry already exist.\n\r", ch); return; } /* if(help_free) { pHelp = help_free; help_free = help_free->next; } else*/ pHelp = alloc_perm(sizeof(*pHelp)); if(!help_first) help_first = pHelp; if(help_last) help_last->next = pHelp; /* pHelp->area = help_last->area; */ help_last = pHelp; pHelp->next = NULL; top_help++; pHelp->level = L_SEN; if(pHelp->keyword) free_string(pHelp->keyword); pHelp->keyword = str_dup(argument); if(pHelp->text) free_string(pHelp->text); } else { if((pHelp = get_help(arg)) == NULL) { send_to_char(C_DEFAULT, "Help entry not found.\n\r", ch); return; } } ch->desc->pEdit = (void *) pHelp; ch->desc->editor = ED_HELP; ch->desc->inEdit = NULL; ch->desc->editin = 0; hedit_show(ch, ""); return; } /* END */ void mreset(CHAR_DATA *ch, char *argument) { char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); if(command[0] == '\0') { mreset_show(ch, argument); return; } if(!str_cmp(command, "done")) { edit_done( ch ); return; } /* Call editor function */ /* for(cmd = 0;*reset_table[cmd].name;cmd++) { if(!str_prefix(command, reset_table[cmd].name)) { (*reset_table[cmd].olc_fun) (ch, argument); return; } }*/ /* Default to Standard Interpreter. */ interpret(ch, arg); return; } void do_mreset(CHAR_DATA *ch, char *argument) { ch->desc->pEdit = NULL; ch->desc->editor = ED_MRESET; ch->desc->inEdit = NULL; ch->desc->editin = 0; mreset_show(ch, ""); return; } void sedit(CHAR_DATA *ch, char *argument) { char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); if(command[0] == '\0') { sedit_show(ch, argument); return; } if(!str_cmp(command, "credit")) { send_to_char( AT_YELLOW, "Made by Decklarean, 1996.\n\r", ch ); return; } if(!str_cmp(command, "done")) { save_social( ); edit_done( ch ); return; } /* Call editor function */ for(cmd = 0;*sedit_table[cmd].name;cmd++) { if(!str_prefix(command, sedit_table[cmd].name)) { (*sedit_table[cmd].olc_fun) (ch, argument); return; } } /* Default to Standard Interpreter. */ interpret(ch, arg); return; } /* get a social out of the social list */ SOCIAL_DATA *get_social(char *argument) { SOCIAL_DATA *pSocial; for(pSocial = social_first;pSocial;pSocial = pSocial->next) { if(is_name(NULL, argument, pSocial->name)) { return pSocial; } } return NULL; } void do_sedit(CHAR_DATA *ch, char *argument) { SOCIAL_DATA *pSocial; char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; strcpy( arg, argument ); argument = one_argument(argument, command); if(command[0] == 'c' && !str_prefix(command, "create")) { if(argument[0] == '\0') { send_to_char(C_DEFAULT, "SEdit: Syntax: sedit create <social name>\n\r", ch); return; } if(get_social(argument) != NULL) { send_to_char(C_DEFAULT, "SEdit: Social entry already exists.\n\r", ch); return; } pSocial = new_social_index( ); if(!social_first) social_first = pSocial; if(social_last) social_last->next = pSocial; social_last = pSocial; /* pSocial->next = NULL; top_social++; free_string( pSocial->name ); free_string( pSocial->char_no_arg ); free_string( pSocial->others_no_arg ); free_string( pSocial->char_found ); free_string( pSocial->others_found ); free_string( pSocial->vict_found ); free_string( pSocial->char_auto ); free_string( pSocial->others_auto ); */ pSocial->name = str_dup(argument); } else { if((pSocial = get_social(arg)) == NULL) { send_to_char(C_DEFAULT, "Social entry not found.\n\r", ch); return; } } ch->desc->pEdit = (void *) pSocial; ch->desc->editor = ED_SOCIAL; ch->desc->inEdit = NULL; ch->desc->editin = 0; sedit_show(ch, ""); return; } void rename_object(CHAR_DATA *ch, char *argument) { char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); if(command[0] == '\0') { rename_show(ch, argument); return; } if(!str_cmp(command, "credit")) { send_to_char( AT_YELLOW, "Made by Decklarean, 1996.\n\r", ch ); return; } if(!str_cmp(command, "done")) { edit_done( ch ); save_char_obj( ch, FALSE ); return; } /* Call editor function */ for(cmd = 0;*rename_obj_table[cmd].name;cmd++) { if(!str_prefix(command, rename_obj_table[cmd].name)) { (*rename_obj_table[cmd].olc_fun) (ch, argument); return; } } /* Default to Standard Interpreter. */ interpret(ch, arg); return; } void do_rename_obj( CHAR_DATA *ch, char *argument ) { OBJ_DATA *pObj; char command[MAX_INPUT_LENGTH]; argument = one_argument( argument, command ); if ( command[0] == '\0' ) { send_to_char(C_DEFAULT, "RENAME_OBJ: Syntax: rename <obj name>.\n\r", ch ); return; } if ( !( pObj = get_obj_carry( ch, command ) ) ) { send_to_char(C_DEFAULT, "RENAME_OBJ: You don't have that obj.\n\r", ch ); return; } else { ch->desc->pEdit = (void *)pObj; ch->desc->editor = RENAME_OBJECT; rename_show( ch, "" ); return; } } void forge_obj( CHAR_DATA *ch, OBJ_DATA *to_forge ) { ch->desc->pEdit = (void *)to_forge; ch->desc->editor = FORGE_OBJECT; forge_show( ch, "" ); return; } void forge_object(CHAR_DATA *ch, char *argument) { char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); if(command[0] == '\0') { forge_show(ch, argument); return; } if(!str_cmp(command, "done")) { edit_done( ch ); save_char_obj( ch, FALSE ); return; } /* Call editor function */ for(cmd = 0;*forge_obj_table[cmd].name;cmd++) { if(!str_prefix(command, forge_obj_table[cmd].name)) { if ( is_number( command ) && atoi( command ) > ch->level / 10 ) { send_to_char( AT_GREY, "You cannot forge so much at your level.\n\r", ch ); return; } (*forge_obj_table[cmd].olc_fun) (ch, argument); return; } } /* Default to Standard Interpreter. */ interpret(ch, arg); return; } void forge_pay_cost( CHAR_DATA *ch ) { OBJ_DATA *obj; FORGE_OBJ(ch, obj); #ifdef NEW_MONEY if ( ( (ch->money.gold*C_PER_G) + (ch->money.silver*S_PER_G) + (ch->money.copper) ) < ( (obj->cost.gold*C_PER_G) + (obj->cost.silver*S_PER_G) + (obj->cost.copper) ) ) { send_to_char( AT_GREY, "You cannot afford to forge this object.\n\r", ch ); extract_obj( obj ); return; } obj_to_char( obj, ch ); spend_money( &ch->money, &obj->cost ); #else if ( ch->gold < obj->cost ) { send_to_char( AT_GREY, "You cannot afford to forge this object.\n\r", ch ); extract_obj( obj ); return; } obj_to_char( obj, ch ); ch->gold -= obj->cost; #endif return; } void spedit(CHAR_DATA *ch, char *argument) { char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); if(command[0] == '\0') { spedit_show(ch, argument); return; } if(!str_cmp(command, "credit")) { send_to_char( AT_YELLOW, "Made by Decklarean, 1997.\n\r", ch ); return; } if(!str_cmp(command, "done")) { /*save_spellskill( );*/ edit_done( ch ); return; } /* Call editor function */ for(cmd = 0;*spedit_table[cmd].name;cmd++) { if(!str_prefix(command, spedit_table[cmd].name)) { (*spedit_table[cmd].olc_fun) (ch, argument); return; } } /* Default to Standard Interpreter. */ interpret(ch, arg); return; } void do_spedit(CHAR_DATA *ch, char *argument) { SKILL_TYPE *pSpell; char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int sn; strcpy( arg, argument ); argument = one_argument(argument, command); if(command[0] == 'c' && !str_prefix(command, "create")) { if(argument[0] == '\0') { send_to_char(C_DEFAULT, "SPedit: Syntax: spedit create <spell name>\n\r", ch); return; } if( skill_lookup(argument) < 0 ) { send_to_char(C_DEFAULT, "SPEdit: Spell/Skill entry already exist.\n\r", ch); return; } send_to_char(C_DEFAULT, "SPEdit: Spell/Skill online creation not avable.\n\r", ch); return; } else { if( (sn = skill_lookup(arg)) < 0) { send_to_char(C_DEFAULT, "Spell/skill entry not found.\n\r", ch); return; } pSpell = (SKILL_TYPE *)&skill_table[sn]; } ch->desc->pEdit = (void *) pSpell; ch->desc->editor = ED_SPEDIT; ch->desc->inEdit = NULL; ch->desc->editin = 0; spedit_show(ch, ""); return; } void nedit( CHAR_DATA *ch, char *argument ) { NEWBIE_DATA *pNewbie; char command [ MAX_INPUT_LENGTH ]; char arg [ MAX_INPUT_LENGTH ]; int cmd; EDIT_NEWBIE( ch, pNewbie ); smash_tilde( argument ); strcpy( arg, argument ); argument = one_argument( argument, command ); if( command[0] == '\0' ) { nedit_show( ch, argument ); return; } if( !str_cmp( command, "done" ) ) { save_newbie( ); edit_done( ch ); return; } for( cmd = 0; *nedit_table[cmd].name; cmd++ ) { if( !str_prefix( command, nedit_table[cmd].name ) ) { ( *nedit_table[cmd].olc_fun ) ( ch, argument ); return; } } interpret( ch, arg ); return; } NEWBIE_DATA *get_newbie_data( char *argument ) { NEWBIE_DATA *pNewbie; for( pNewbie = newbie_first; pNewbie; pNewbie = pNewbie->next ) { if( is_name( NULL, argument, pNewbie->keyword ) ) return pNewbie; } return NULL; } void do_nedit( CHAR_DATA *ch, char *argument ) { NEWBIE_DATA *pNewbie; char command [ MAX_INPUT_LENGTH ]; char arg [ MAX_STRING_LENGTH ]; strcpy( arg, argument ); argument = one_argument(argument, command); /* if( argument[0] == '\0' ) { send_to_char( C_DEFAULT, "Syntax: nedit <keyword>\n\rSyntax: nedit create <keyword>\n\r", ch ); return; } */ if ( command[0] == 'c' && !str_prefix( command, "create" ) ) { if( argument[0] == '\0' ) { send_to_char( C_DEFAULT, "Syntax: nedit create <keyword>\n\r", ch ); return; } if( get_newbie_data( argument ) != NULL ) { send_to_char( C_DEFAULT, "Keyword already exists.\n\r", ch ); return; } pNewbie = new_newbie_index( ); newbie_last->next = pNewbie; newbie_last = pNewbie; pNewbie->keyword = str_dup( argument ); } else { if ( !(pNewbie = get_newbie_data( arg ) ) ) { send_to_char( C_DEFAULT, "Keyword doesn't exist.\n\r", ch ); return; } } ch->desc->pEdit = (void *)pNewbie; ch->desc->editor = ED_NEWBIE; nedit_show( ch, "" ); return; } /* * Race editor by Decklarean */ void race_edit(CHAR_DATA *ch, char *argument) { char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int cmd; smash_tilde(argument); strcpy(arg, argument); argument = one_argument(argument, command); if(command[0] == '\0') { race_edit_show(ch, argument); return; } if(!str_cmp(command, "credit")) { send_to_char( AT_YELLOW, "Made by Decklarean, 1997.\n\r", ch ); return; } if(!str_cmp(command, "done")) { save_race( ); edit_done( ch ); return; } /* Call editor function */ for(cmd = 0;*race_edit_table[cmd].name;cmd++) { if(!str_prefix(command, race_edit_table[cmd].name)) { (*race_edit_table[cmd].olc_fun) (ch, argument); return; } } /* Default to Standard Interpreter. */ interpret(ch, arg); return; } /* get a race out of the race list */ RACE_DATA *get_race(char *argument) { RACE_DATA *pRace; for(pRace = first_race;pRace;pRace = pRace->next) { if(is_name(NULL, argument, pRace->race_name) || is_name(NULL, argument, pRace->race_full) ) { return pRace; } } return NULL; } void do_race_edit(CHAR_DATA *ch, char *argument) { RACE_DATA *pRace; char command[MAX_INPUT_LENGTH]; char arg[MAX_STRING_LENGTH]; int iRace; strcpy( arg, argument ); argument = one_argument(argument, command); if(command[0] == 'c' && !str_prefix(command, "create")) { if(argument[0] == '\0' || strlen( argument ) > 20) { send_to_char(C_DEFAULT, "Race_Edit: Syntax: race_edit create <race name>\n\r", ch); send_to_char(C_DEFAULT, " (Race name can't be longer than 20 characters.)\n\r", ch); return; } if(get_race(argument) != NULL) { send_to_char(C_DEFAULT, "Race_Edit: Race entry already exists.\n\r", ch); return; } pRace = new_race_data( ); /* set race full name */ pRace->race_full = str_dup(argument); /* set race vnum */ for ( iRace = 0; iRace < top_race; iRace++ ) if ( !(get_race_data(iRace))) { pRace->vnum = iRace; break; } /* add race to race list */ race_sort( pRace ); } else { if((pRace = get_race(arg)) == NULL) { send_to_char(C_DEFAULT, "Race entry not found.\n\r", ch); return; } } ch->desc->pEdit = (void *) pRace; ch->desc->editor = RACE_EDIT; ch->desc->inEdit = NULL; ch->desc->editin = 0; race_edit_show(ch, ""); return; }