void do_repairset( CHAR_DATA *ch, char *argument ) { REPAIR_DATA *repair; MOB_INDEX_DATA *mob, *mob2; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int vnum; int value; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' || arg2[0] == '\0' ) { send_to_char( "Usage: repairset <mob vnum> <field> value\n\r", ch ); send_to_char( "\n\rField being one of:\n\r", ch ); send_to_char( " fix0 fix1 fix2 profit type open close keeper\n\r", ch ); return; } vnum = atoi( arg1 ); if ( (mob = get_mob_index(vnum)) == NULL ) { send_to_char( "Mobile not found.\n\r", ch ); return; } if ( !can_medit(ch, mob) ) return; if ( !mob->rShop ) { send_to_char( "This mobile doesn't keep a repair shop.\n\r", ch ); return; } repair = mob->rShop; value = atoi( argument ); if ( !str_cmp( arg2, "fix0" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } repair->fix_type[0] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "fix1" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } repair->fix_type[1] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "fix2" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } repair->fix_type[2] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "profit" ) ) { if ( value < 1 || value > 1000 ) { send_to_char( "Out of range.\n\r", ch ); return; } repair->profit_fix = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "type" ) ) { if ( value < 1 || value > 2 ) { send_to_char( "Out of range.\n\r", ch ); return; } repair->shop_type = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "open" ) ) { if ( value < 0 || value > 23 ) { send_to_char( "Out of range.\n\r", ch ); return; } repair->open_hour = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "close" ) ) { if ( value < 0 || value > 23 ) { send_to_char( "Out of range.\n\r", ch ); return; } repair->close_hour = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "keeper" ) ) { if ( (mob2 = get_mob_index(vnum)) == NULL ) { send_to_char( "Mobile not found.\n\r", ch ); return; } if ( !can_medit(ch, mob) ) return; if ( mob2->rShop ) { send_to_char( "That mobile already has a repair shop.\n\r", ch ); return; } mob->rShop = NULL; mob2->rShop = repair; repair->keeper = value; send_to_char( "Done.\n\r", ch ); return; } do_repairset( ch, "" ); return; }
void do_mposet( CHAR_DATA * ch, const char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; char outbuf[MAX_STRING_LENGTH]; int value, tmp; /* * A desc means switched.. too many loopholes if we allow that.. */ if ( !IS_NPC( ch ) || IS_AFFECTED( ch, AFF_CHARM ) || ch->desc ) { send_to_char( "Huh?\r\n", ch ); return; } smash_tilde( argument ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); mudstrlcpy( arg3, argument, MAX_INPUT_LENGTH ); if ( !*arg1 ) { progbug( "MpOset: no args", ch ); return; } if ( ( obj = get_obj_here( ch, arg1 ) ) == NULL ) { progbug( "MpOset: no object", ch ); return; } if ( IS_OBJ_STAT( obj, ITEM_PROTOTYPE ) ) { progbug( "MpOset: can't set prototype items", ch ); return; } separate_obj( obj ); value = atoi( arg3 ); if ( !str_cmp( arg2, "value0" ) || !str_cmp( arg2, "v0" ) ) { obj->value[0] = value; return; } if ( !str_cmp( arg2, "value1" ) || !str_cmp( arg2, "v1" ) ) { obj->value[1] = value; return; } if ( !str_cmp( arg2, "value2" ) || !str_cmp( arg2, "v2" ) ) { obj->value[2] = value; return; } if ( !str_cmp( arg2, "value3" ) || !str_cmp( arg2, "v3" ) ) { obj->value[3] = value; return; } if ( !str_cmp( arg2, "value4" ) || !str_cmp( arg2, "v4" ) ) { obj->value[4] = value; return; } if ( !str_cmp( arg2, "value5" ) || !str_cmp( arg2, "v5" ) ) { obj->value[5] = value; return; } if ( !str_cmp( arg2, "type" ) ) { if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no type", ch ); return; } value = get_otype( argument ); if ( value < 1 ) { progbug( "MpOset: Invalid type", ch ); return; } obj->item_type = ( short ) value; return; } if ( !str_cmp( arg2, "flags" ) ) { if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no flags", ch ); return; } while ( argument[0] != '\0' ) { argument = one_argument( argument, arg3 ); value = get_oflag( arg3 ); if ( value < 0 || value >= MAX_BITS ) progbug( "MpOset: Invalid flag", ch ); else { if ( value == ITEM_PROTOTYPE ) progbug( "MpOset: can't set prototype flag", ch ); else xTOGGLE_BIT( obj->extra_flags, value ); } } return; } if ( !str_cmp( arg2, "wear" ) ) { if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no wear", ch ); return; } while ( argument[0] != '\0' ) { argument = one_argument( argument, arg3 ); value = get_wflag( arg3 ); if ( value < 0 || value > 31 ) progbug( "MpOset: Invalid wear", ch ); else TOGGLE_BIT( obj->wear_flags, 1 << value ); } return; } if ( !str_cmp( arg2, "level" ) ) { obj->level = value; return; } if ( !str_cmp( arg2, "weight" ) ) { obj->weight = value; return; } if ( !str_cmp( arg2, "cost" ) ) { obj->cost = value; return; } if ( !str_cmp( arg2, "timer" ) ) { obj->timer = value; return; } if ( !str_cmp( arg2, "name" ) ) { STRFREE( obj->name ); obj->name = STRALLOC( arg3 ); return; } if ( !str_cmp( arg2, "short" ) ) { STRFREE( obj->short_descr ); obj->short_descr = STRALLOC( arg3 ); if ( obj == supermob_obj ) { STRFREE( supermob->short_descr ); supermob->short_descr = QUICKLINK( obj->short_descr ); } /* * Feature added by Narn, Apr/96 * * If the item is not proto, add the word 'rename' to the keywords * * if it is not already there. */ if ( str_infix( "mprename", obj->name ) ) { snprintf( buf, MAX_STRING_LENGTH, "%s %s", obj->name, "mprename" ); STRFREE( obj->name ); obj->name = STRALLOC( buf ); } return; } if ( !str_cmp( arg2, "long" ) ) { STRFREE( obj->description ); mudstrlcpy( buf, arg3, MAX_STRING_LENGTH ); obj->description = STRALLOC( buf ); return; } if ( !str_cmp( arg2, "actiondesc" ) ) { if ( strstr( arg3, "%n" ) || strstr( arg3, "%d" ) || strstr( arg3, "%l" ) ) { progbug( "MpOset: Illegal actiondesc", ch ); return; } STRFREE( obj->action_desc ); obj->action_desc = STRALLOC( arg3 ); return; } if ( !str_cmp( arg2, "affect" ) ) { AFFECT_DATA *paf; short loc; int bitv; argument = one_argument( argument, arg2 ); if ( arg2[0] == '\0' || !argument || argument[0] == 0 ) { progbug( "MpOset: Bad affect syntax", ch ); send_to_char( "Usage: oset <object> affect <field> <value>\r\n", ch ); return; } loc = get_atype( arg2 ); if ( loc < 1 ) { progbug( "MpOset: Invalid affect field", ch ); return; } if ( loc >= APPLY_AFFECT && loc < APPLY_WEAPONSPELL ) { bitv = 0; while ( argument[0] != '\0' ) { argument = one_argument( argument, arg3 ); if ( loc == APPLY_AFFECT ) value = get_aflag( arg3 ); else value = get_risflag( arg3 ); if ( value < 0 || value > 31 ) progbug( "MpOset: bad affect flag", ch ); else SET_BIT( bitv, 1 << value ); } if ( !bitv ) return; value = bitv; } else { argument = one_argument( argument, arg3 ); value = atoi( arg3 ); } CREATE( paf, AFFECT_DATA, 1 ); paf->type = -1; paf->duration = -1; paf->location = loc; paf->modifier = value; xCLEAR_BITS( paf->bitvector ); paf->next = NULL; LINK( paf, obj->first_affect, obj->last_affect, next, prev ); ++top_affect; return; } if ( !str_cmp( arg2, "rmaffect" ) ) { AFFECT_DATA *paf; short loc, count; if ( !argument || argument[0] == '\0' ) { progbug( "MpOset: no rmaffect", ch ); return; } loc = atoi( argument ); if ( loc < 1 ) { progbug( "MpOset: Invalid rmaffect", ch ); return; } count = 0; for ( paf = obj->first_affect; paf; paf = paf->next ) { if ( ++count == loc ) { UNLINK( paf, obj->first_affect, obj->last_affect, next, prev ); DISPOSE( paf ); send_to_char( "Removed.\r\n", ch ); --top_affect; return; } } progbug( "MpOset: rmaffect not found", ch ); return; } /* * save some finger-leather */ if ( !str_cmp( arg2, "ris" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "r" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "i" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "s" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "ri" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "rs" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect resistant %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } if ( !str_cmp( arg2, "is" ) ) { snprintf( outbuf, MAX_STRING_LENGTH, "%s affect immune %s", arg1, arg3 ); do_mposet( ch, outbuf ); snprintf( outbuf, MAX_STRING_LENGTH, "%s affect susceptible %s", arg1, arg3 ); do_mposet( ch, outbuf ); return; } /* * Make it easier to set special object values by name than number * -Thoric */ tmp = -1; switch ( obj->item_type ) { case ITEM_WEAPON: if ( !str_cmp( arg2, "weapontype" ) ) { unsigned int x; value = -1; for ( x = 0; x < sizeof( attack_table ) / sizeof( attack_table[0] ); x++ ) if ( !str_cmp( arg3, attack_table[x] ) ) value = x; if ( value < 0 ) { progbug( "MpOset: Invalid weapon type", ch ); return; } tmp = 3; break; } if ( !str_cmp( arg2, "condition" ) ) tmp = 0; break; case ITEM_ARMOR: if ( !str_cmp( arg2, "condition" ) ) tmp = 3; if ( !str_cmp( arg2, "ac" ) ) tmp = 1; break; case ITEM_SALVE: if ( !str_cmp( arg2, "slevel" ) ) tmp = 0; if ( !str_cmp( arg2, "maxdoses" ) ) tmp = 1; if ( !str_cmp( arg2, "doses" ) ) tmp = 2; if ( !str_cmp( arg2, "delay" ) ) tmp = 3; if ( !str_cmp( arg2, "spell1" ) ) tmp = 4; if ( !str_cmp( arg2, "spell2" ) ) tmp = 5; if ( tmp >= 4 && tmp <= 5 ) value = skill_lookup( arg3 ); break; case ITEM_SCROLL: case ITEM_POTION: case ITEM_PILL: if ( !str_cmp( arg2, "slevel" ) ) tmp = 0; if ( !str_cmp( arg2, "spell1" ) ) tmp = 1; if ( !str_cmp( arg2, "spell2" ) ) tmp = 2; if ( !str_cmp( arg2, "spell3" ) ) tmp = 3; if ( tmp >= 1 && tmp <= 3 ) value = skill_lookup( arg3 ); break; case ITEM_STAFF: case ITEM_WAND: if ( !str_cmp( arg2, "slevel" ) ) tmp = 0; if ( !str_cmp( arg2, "spell" ) ) { tmp = 3; value = skill_lookup( arg3 ); } if ( !str_cmp( arg2, "maxcharges" ) ) tmp = 1; if ( !str_cmp( arg2, "charges" ) ) tmp = 2; break; case ITEM_CONTAINER: if ( !str_cmp( arg2, "capacity" ) ) tmp = 0; if ( !str_cmp( arg2, "cflags" ) ) tmp = 1; if ( !str_cmp( arg2, "key" ) ) tmp = 2; break; case ITEM_SWITCH: case ITEM_LEVER: case ITEM_PULLCHAIN: case ITEM_BUTTON: if ( !str_cmp( arg2, "tflags" ) ) { tmp = 0; value = get_trigflag( arg3 ); } break; } if ( tmp >= 0 && tmp <= 3 ) { obj->value[tmp] = value; return; } progbug( "MpOset: Invalid field", ch ); return; }
void do_shopset( CHAR_DATA *ch, char *argument ) { SHOP_DATA *shop; MOB_INDEX_DATA *mob, *mob2; char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; int vnum; int value; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' || arg2[0] == '\0' ) { send_to_char( "Usage: shopset <mob vnum> <field> value\n\r", ch ); send_to_char( "\n\rField being one of:\n\r", ch ); send_to_char( " buy0 buy1 buy2 buy3 buy4 buy sell open close keeper\n\r", ch ); return; } vnum = atoi( arg1 ); if ( (mob = get_mob_index(vnum)) == NULL ) { send_to_char( "Mobile not found.\n\r", ch ); return; } if ( !can_medit(ch, mob) ) return; if ( !mob->pShop ) { send_to_char( "This mobile doesn't keep a shop.\n\r", ch ); return; } shop = mob->pShop; value = atoi( argument ); if ( !str_cmp( arg2, "buy0" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } shop->buy_type[0] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "buy1" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } shop->buy_type[1] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "buy2" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } shop->buy_type[2] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "buy3" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } shop->buy_type[3] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "buy4" ) ) { if ( !is_number(argument) ) value = get_otype(argument); if ( value < 0 || value > MAX_ITEM_TYPE ) { send_to_char( "Invalid item type!\n\r", ch ); return; } shop->buy_type[4] = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "buy" ) ) { if ( value <= (shop->profit_sell+5) || value > 1000 ) { send_to_char( "Out of range.\n\r", ch ); return; } shop->profit_buy = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "sell" ) ) { if ( value < 0 || value >= (shop->profit_buy-5) ) { send_to_char( "Out of range.\n\r", ch ); return; } shop->profit_sell = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "open" ) ) { if ( value < 0 || value > 23 ) { send_to_char( "Out of range.\n\r", ch ); return; } shop->open_hour = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "close" ) ) { if ( value < 0 || value > 23 ) { send_to_char( "Out of range.\n\r", ch ); return; } shop->close_hour = value; send_to_char( "Done.\n\r", ch ); return; } if ( !str_cmp( arg2, "keeper" ) ) { if ( (mob2 = get_mob_index(vnum)) == NULL ) { send_to_char( "Mobile not found.\n\r", ch ); return; } if ( !can_medit(ch, mob) ) return; if ( mob2->pShop ) { send_to_char( "That mobile already has a shop.\n\r", ch ); return; } mob->pShop = NULL; mob2->pShop = shop; shop->keeper = value; send_to_char( "Done.\n\r", ch ); return; } do_shopset( ch, "" ); return; }
void fread_fuss_object( FILE * fp, area_data * tarea ) { obj_index *pObjIndex = nullptr; bool oldobj = false; for( ;; ) { const char *word = ( feof( fp ) ? "#ENDOBJECT" : fread_word( fp ) ); if( word[0] == '\0' ) { log_printf( "%s: EOF encountered reading file!", __func__ ); word = "#ENDOBJECT"; } switch ( word[0] ) { default: bug( "%s: no match: %s", __func__, word ); fread_to_eol( fp ); break; case '#': if( !str_cmp( word, "#ENDOBJECT" ) ) { if( !oldobj ) { obj_index_table.insert( map < int, obj_index * >::value_type( pObjIndex->vnum, pObjIndex ) ); tarea->objects.push_back( pObjIndex ); ++top_obj_index; } return; } // Format of this section is identical to AFKMud. Let's cheat :) if( !str_cmp( word, "#EXDESC" ) ) { extra_descr_data *ed = fread_afk_exdesc( fp ); if( ed ) pObjIndex->extradesc.push_back( ed ); break; } // Format of this section is identical to AFKMud. Let's cheat :) if( !str_cmp( word, "#MUDPROG" ) ) { mud_prog_data *mprg = new mud_prog_data; fread_afk_mudprog( fp, mprg, pObjIndex ); pObjIndex->mudprogs.push_back( mprg ); ++top_prog; break; } break; case 'A': if( !str_cmp( word, "Action" ) ) { const char *desc = fread_flagstring( fp ); if( desc && desc[0] != '\0' && str_cmp( desc, "(null)" ) ) pObjIndex->action_desc = STRALLOC( desc ); break; } if( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) ) { affect_data *af = fread_fuss_affect( fp, word ); if( af ) pObjIndex->affects.push_back( af ); break; } break; case 'F': if( !str_cmp( word, "Flags" ) ) { flag_set( fp, pObjIndex->extra_flags, fuss_o_flags ); break; } break; case 'K': KEY( "Keywords", pObjIndex->name, fread_string( fp ) ); break; case 'L': if( !str_cmp( word, "Long" ) ) { const char *desc = fread_flagstring( fp ); if( desc && desc[0] != '\0' && str_cmp( desc, "(null)" ) ) pObjIndex->objdesc = STRALLOC( desc ); break; } break; case 'S': KEY( "Short", pObjIndex->short_descr, fread_string( fp ) ); if( !str_cmp( word, "Spells" ) ) { switch ( pObjIndex->item_type ) { default: break; case ITEM_PILL: case ITEM_POTION: case ITEM_SCROLL: pObjIndex->value[1] = skill_lookup( fread_word( fp ) ); pObjIndex->value[2] = skill_lookup( fread_word( fp ) ); pObjIndex->value[3] = skill_lookup( fread_word( fp ) ); break; case ITEM_STAFF: case ITEM_WAND: pObjIndex->value[3] = skill_lookup( fread_word( fp ) ); break; case ITEM_SALVE: pObjIndex->value[4] = skill_lookup( fread_word( fp ) ); pObjIndex->value[5] = skill_lookup( fread_word( fp ) ); break; } break; } if( !str_cmp( word, "Stats" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3, x4, x5; x1 = x2 = x3 = x5 = 0; x4 = 9999; sscanf( ln, "%d %d %d %d %d", &x1, &x2, &x3, &x4, &x5 ); pObjIndex->weight = x1; pObjIndex->weight = UMAX( 1, pObjIndex->weight ); pObjIndex->cost = x2; pObjIndex->ego = x3; pObjIndex->level = x4; pObjIndex->layers = x5; pObjIndex->socket[0] = STRALLOC( "None" ); pObjIndex->socket[1] = STRALLOC( "None" ); pObjIndex->socket[2] = STRALLOC( "None" ); if( pObjIndex->ego >= sysdata->minego ) { log_printf( "Item %d gaining new rare item limit of 1", pObjIndex->vnum ); pObjIndex->limit = 1; /* Sets new limit since stock zones won't have one */ } else pObjIndex->limit = 9999; /* Default value, this should more than insure that the shit loads */ pObjIndex->ego = -2; break; } break; case 'T': if( !str_cmp( word, "Type" ) ) { int value = get_otype( fread_flagstring( fp ) ); if( value < 0 ) { bug( "%s: vnum %d: Object has invalid type! Defaulting to trash.", __func__, pObjIndex->vnum ); value = get_otype( "trash" ); } pObjIndex->item_type = value; break; } break; case 'V': if( !str_cmp( word, "Values" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3, x4, x5, x6; x1 = x2 = x3 = x4 = x5 = x6 = 0; sscanf( ln, "%d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6 ); pObjIndex->value[0] = x1; pObjIndex->value[1] = x2; pObjIndex->value[2] = x3; pObjIndex->value[3] = x4; pObjIndex->value[4] = x5; pObjIndex->value[5] = x6; break; } if( !str_cmp( word, "Vnum" ) ) { bool tmpBootDb = fBootDb; fBootDb = false; int vnum = fread_number( fp ); list < area_data * >::iterator iarea; for( iarea = arealist.begin( ); iarea != arealist.end( ); ++iarea ) { area_data *area = *iarea; if( !str_cmp( area->filename, tarea->filename ) ) continue; bool area_conflict = check_area_conflict( area, vnum, vnum ); if( area_conflict ) { log_printf( "ERROR: %s has vnum conflict with %s!", tarea->filename, ( area->filename ? area->filename : "(invalid)" ) ); log_printf( "%s occupies vnums : %-6d - %-6d", ( area->filename ? area->filename : "(invalid)" ), area->low_vnum, area->hi_vnum ); log_printf( "%s wants to use vnum: %-6d", tarea->filename, vnum ); log_string( "This is a fatal error. Program terminated." ); exit( 1 ); } } if( get_obj_index( vnum ) ) { if( tmpBootDb ) { fBootDb = tmpBootDb; bug( "%s: vnum %d duplicated.", __func__, vnum ); // Try to recover, read to end of duplicated object and then bail out for( ;; ) { word = feof( fp ) ? "#ENDOBJECT" : fread_word( fp ); if( !str_cmp( word, "#ENDOBJECT" ) ) return; } } else { pObjIndex = get_obj_index( vnum ); log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning object: %d", vnum ); pObjIndex->clean_obj( ); oldobj = true; } } else { pObjIndex = new obj_index; pObjIndex->clean_obj( ); } pObjIndex->vnum = vnum; pObjIndex->area = tarea; fBootDb = tmpBootDb; if( fBootDb ) { if( !tarea->low_vnum ) tarea->low_vnum = vnum; if( vnum > tarea->hi_vnum ) tarea->hi_vnum = vnum; } break; } break; case 'W': if( !str_cmp( word, "WFlags" ) ) { flag_set( fp, pObjIndex->wear_flags, w_flags ); break; } break; } } }