/* Run through and check player camp to see if they got robbed among other things. Samson 9-19-98 */ void break_camp( char_data * ch ) { int robbed = 0, robchance = number_range( 1, 100 ); if( robchance > 85 ) { list < obj_data * >::iterator iobj; if( robchance < 98 ) { log_printf_plus( LOG_COMM, LEVEL_IMMORTAL, "Thieves raided %s's camp!", ch->name ); ch->print( "&RYour camp was visited by thieves while you were away!\r\n" ); ch->print( "&RYour belongings have been rummaged through....\r\n" ); for( iobj = ch->carrying.begin( ); iobj != ch->carrying.end( ); ++iobj ) { obj_data *obj = *iobj; robbed = thief_raid( ch, obj, robbed ); } } else { log_printf_plus( LOG_COMM, LEVEL_IMMORTAL, "Bandits raided %s's camp!", ch->name ); ch->print( "&RYour camp was visited by bandits while you were away!\r\n" ); ch->print( "&RYour belongings have been rummaged through....\r\n" ); for( iobj = ch->carrying.begin( ); iobj != ch->carrying.end( ); ++iobj ) { obj_data *obj = *iobj; robbed = bandit_raid( ch, obj, robbed ); } } } log_printf_plus( LOG_COMM, LEVEL_IMMORTAL, "%s breaks camp and enters the game.", ch->name ); ch->pcdata->camp = 0; }
void scan_rares( char_data * ch ) { expire_items( ch ); if( !ch->is_immortal( ) ) { switch ( ch->pcdata->camp ) { default: break; case 0: log_printf_plus( LOG_COMM, LEVEL_IMMORTAL, "%s checks out of the inn.", ch->name ); break; case 2: log_printf_plus( LOG_COMM, LEVEL_IMMORTAL, "%s reconnecting after idling out.", ch->name ); break; case 3: log_printf_plus( LOG_COMM, LEVEL_IMMORTAL, "%s reconnecting after quitting.", ch->name ); break; } } else { log_printf_plus( LOG_COMM, ch->level, "%s returns from beyond the void.", ch->name ); show_stateflags( ch ); } }
bool check_expire( BAN_DATA * pban ) { if( pban->unban_date < 0 ) return FALSE; if( pban->unban_date <= current_time ) { log_printf_plus( LOG_WARN, sysdata.log_level, "%s ban has expired.", pban->name ); return TRUE; } return FALSE; }
/* Take all rare items away - Samson 9-19-98 */ int bandit_raid( char_data * ch, obj_data * obj, int robbed ) { if( obj->ego >= sysdata->minego ) { ch->printf( "&YThe bandits stole %s!\r\n", obj->short_descr ); log_printf_plus( LOG_COMM, LEVEL_IMMORTAL, "Bandits stole %s from %s!", obj->short_descr, ch->name ); obj->extract( ); robbed = 1; } list < obj_data * >::iterator iobj; for( iobj = obj->contents.begin( ); iobj != obj->contents.end( ); ++iobj ) { obj_data *tobj = *iobj; bandit_raid( ch, tobj, robbed ); } return robbed; }
/* * The main entry point for executing commands. * Can be recursively called from 'at', 'order', 'force'. */ void interpret( CHAR_DATA * ch, char *argument ) { char command[MAX_INPUT_LENGTH]; char logline[MAX_INPUT_LENGTH]; char logname[MAX_INPUT_LENGTH]; char log_buf[MAX_STRING_LENGTH]; char *origarg = argument; char *buf; TIMER *timer = NULL; CMDTYPE *cmd = NULL; int trust; int loglvl; bool found; struct timeval time_used; long tmptime; if( !ch ) { bug( "%s: null ch!", __FUNCTION__ ); return; } if( !ch->in_room ) { bug( "%s: null in_room!", __FUNCTION__ ); return; } found = FALSE; if( ch->substate == SUB_REPEATCMD ) { DO_FUN *fun; if( ( fun = ch->last_cmd ) == NULL ) { ch->substate = SUB_NONE; bug( "%s: SUB_REPEATCMD with NULL last_cmd", __FUNCTION__ ); return; } else { int x; /* * yes... we lose out on the hashing speediness here... * but the only REPEATCMDS are wizcommands (currently) */ for( x = 0; x < 126; x++ ) { for( cmd = command_hash[x]; cmd; cmd = cmd->next ) if( cmd->do_fun == fun ) { found = TRUE; break; } if( found ) break; } if( !found ) { cmd = NULL; bug( "%s: SUB_REPEATCMD: last_cmd invalid", __FUNCTION__ ); return; } snprintf( logline, MAX_INPUT_LENGTH, "(%s) %s", cmd->name, argument ); } } if( !cmd ) { /* * Changed the order of these ifchecks to prevent crashing. */ if( !argument || !strcmp( argument, "" ) ) { bug( "%s: null argument!", __FUNCTION__ ); return; } /* * Strip leading spaces. */ while( isspace( *argument ) ) argument++; if( argument[0] == '\0' ) return; /* * xREMOVE_BIT( ch->affected_by, AFF_HIDE ); */ /* * Implement freeze command. */ if( !IS_NPC( ch ) && xIS_SET( ch->act, PLR_FREEZE ) ) { send_to_char( "You're totally frozen!\r\n", ch ); return; } /* * Grab the command word. * Special parsing so ' can be a command, * also no spaces needed after punctuation. */ mudstrlcpy( logline, argument, MAX_INPUT_LENGTH ); if( !isalpha( argument[0] ) && !isdigit( argument[0] ) ) { command[0] = argument[0]; command[1] = '\0'; argument++; while( isspace( *argument ) ) argument++; } else argument = one_argument( argument, command ); /* * Look for command in command table. * Check for council powers and/or bestowments */ trust = get_trust( ch ); for( cmd = command_hash[LOWER( command[0] ) % 126]; cmd; cmd = cmd->next ) if( !str_prefix( command, cmd->name ) && ( cmd->level <= trust || ( !IS_NPC( ch ) && ch->pcdata->council && is_name( cmd->name, ch->pcdata->council->powers ) && cmd->level <= ( trust + MAX_CPD ) ) || ( !IS_NPC( ch ) && ch->pcdata->bestowments && ch->pcdata->bestowments[0] != '\0' && is_name( cmd->name, ch->pcdata->bestowments ) && cmd->level <= ( trust + sysdata.bestow_dif ) ) ) ) { found = TRUE; break; } /* * Turn off afk bit when any command performed. */ if( !IS_NPC( ch ) && xIS_SET( ch->act, PLR_AFK ) && ( str_cmp( command, "AFK" ) ) ) { xREMOVE_BIT( ch->act, PLR_AFK ); act( AT_GREY, "$n is no longer afk.", ch, NULL, NULL, TO_CANSEE ); } } /* * Log and snoop. */ snprintf( lastplayercmd, ( MAX_INPUT_LENGTH * 2 ), "%s used %s", ch->name, logline ); if( found && cmd->log == LOG_NEVER ) mudstrlcpy( logline, "XXXXXXXX XXXXXXXX XXXXXXXX", MAX_INPUT_LENGTH ); loglvl = found ? cmd->log : LOG_NORMAL; /* * Write input line to watch files if applicable */ if( !IS_NPC( ch ) && ch->desc && valid_watch( logline ) ) { if( found && IS_SET( cmd->flags, CMD_WATCH ) ) write_watch_files( ch, cmd, logline ); else if( IS_SET( ch->pcdata->flags, PCFLAG_WATCH ) ) write_watch_files( ch, NULL, logline ); } if( ( !IS_NPC( ch ) && xIS_SET( ch->act, PLR_LOG ) ) || fLogAll || loglvl == LOG_BUILD || loglvl == LOG_HIGH || loglvl == LOG_ALWAYS ) { /* * Added by Narn to show who is switched into a mob that executes * a logged command. Check for descriptor in case force is used. */ if( ch->desc && ch->desc->original ) snprintf( log_buf, MAX_STRING_LENGTH, "Log %s (%s): %s", ch->name, ch->desc->original->name, logline ); else snprintf( log_buf, MAX_STRING_LENGTH, "Log %s: %s", ch->name, logline ); /* * Make it so a 'log all' will send most output to the log * file only, and not spam the log channel to death -Thoric */ if( fLogAll && loglvl == LOG_NORMAL && ( IS_NPC( ch ) || !xIS_SET( ch->act, PLR_LOG ) ) ) loglvl = LOG_ALL; log_string_plus( log_buf, loglvl, get_trust( ch ) ); } if( ch->desc && ch->desc->snoop_by ) { snprintf( logname, MAX_INPUT_LENGTH, "%s", ch->name ); write_to_buffer( ch->desc->snoop_by, logname, 0 ); write_to_buffer( ch->desc->snoop_by, "% ", 2 ); write_to_buffer( ch->desc->snoop_by, logline, 0 ); write_to_buffer( ch->desc->snoop_by, "\r\n", 2 ); } /* * check for a timer delayed command (search, dig, detrap, etc) */ if( ( timer = get_timerptr( ch, TIMER_DO_FUN ) ) != NULL ) { int tempsub; tempsub = ch->substate; ch->substate = SUB_TIMER_DO_ABORT; ( timer->do_fun ) ( ch, "" ); if( char_died( ch ) ) return; if( ch->substate != SUB_TIMER_CANT_ABORT ) { ch->substate = tempsub; extract_timer( ch, timer ); } else { ch->substate = tempsub; return; } } /* * Look for command in skill and socials table. */ if( !found ) { if( !check_skill( ch, command, argument ) && !check_ability( ch, command, argument ) // Racial Abilities Support - Kayle 7-8-07 && !rprog_command_trigger( ch, origarg ) && !mprog_command_trigger( ch, origarg ) && !oprog_command_trigger( ch, origarg ) && !check_social( ch, command, argument ) && !news_cmd_hook( ch, command, argument ) #ifdef IMC && !imc_command_hook( ch, command, argument ) #endif ) { EXIT_DATA *pexit; /* * check for an auto-matic exit command */ if( ( pexit = find_door( ch, command, TRUE ) ) != NULL && IS_SET( pexit->exit_info, EX_xAUTO ) ) { if( IS_SET( pexit->exit_info, EX_CLOSED ) && ( !IS_AFFECTED( ch, AFF_PASS_DOOR ) || IS_SET( pexit->exit_info, EX_NOPASSDOOR ) ) ) { if( !IS_SET( pexit->exit_info, EX_SECRET ) ) act( AT_PLAIN, "The $d is closed.", ch, NULL, pexit->keyword, TO_CHAR ); else send_to_char( "You cannot do that here.\r\n", ch ); return; } if( check_pos( ch, POS_STANDING ) ) move_char( ch, pexit, 0 ); return; } send_to_char( "Huh?\r\n", ch ); } return; } /* * Character not in position for command? */ if( !check_pos( ch, cmd->position ) ) return; /* * Berserk check for flee.. maybe add drunk to this?.. but too much * hardcoding is annoying.. -- Altrag * This wasn't catching wimpy --- Blod * if ( !str_cmp(cmd->name, "flee") && * IS_AFFECTED(ch, AFF_BERSERK) ) * { * send_to_char( "You aren't thinking very clearly..\r\n", ch); * return; * } */ /* * So we can check commands for things like Posses and Polymorph * * But still keep the online editing ability. -- Shaddai * * Send back the message to print out, so we have the option * * this function might be usefull elsewhere. Also using the * * send_to_char_color so we can colorize the strings if need be. --Shaddai */ buf = check_cmd_flags( ch, cmd ); if( buf[0] != '\0' ) { send_to_char_color( buf, ch ); return; } /* * Nuisance stuff -- Shaddai */ if( !IS_NPC( ch ) && ch->pcdata->nuisance && ch->pcdata->nuisance->flags > 9 && number_percent( ) < ( ( ch->pcdata->nuisance->flags - 9 ) * 10 * ch->pcdata->nuisance->power ) ) { send_to_char( "You can't seem to do that just now.\r\n", ch ); return; } /* * Dispatch the command. */ ch->prev_cmd = ch->last_cmd; /* haus, for automapping */ ch->last_cmd = cmd->do_fun; start_timer( &time_used ); ( *cmd->do_fun ) ( ch, argument ); end_timer( &time_used ); /* * Update the record of how many times this command has been used (haus) */ update_userec( &time_used, &cmd->userec ); tmptime = UMIN( time_used.tv_sec, 19 ) * 1000000 + time_used.tv_usec; /* * laggy command notice: command took longer than 1.5 seconds */ if( tmptime > 1500000 ) { log_printf_plus( LOG_NORMAL, get_trust( ch ), "[*****] LAG: %s: %s %s (R:%d S:%ld.%06ld)", ch->name, cmd->name, ( cmd->log == LOG_NEVER ? "XXX" : argument ), ch->in_room ? ch->in_room->vnum : 0, time_used.tv_sec, time_used.tv_usec ); cmd->lag_count++; /* count the lag flags */ } tail_chain( ); }
void fread_fuss_mobile( FILE * fp, area_data * tarea ) { mob_index *pMobIndex = nullptr; bool oldmob = false; for( ;; ) { const char *word = ( feof( fp ) ? "#ENDMOBILE" : fread_word( fp ) ); if( word[0] == '\0' ) { log_printf( "%s: EOF encountered reading file!", __func__ ); word = "#ENDMOBILE"; } switch ( word[0] ) { default: log_printf( "%s: no match: %s", __func__, word ); fread_to_eol( fp ); break; case '#': // We can cheat here since the prog formats are identical :) if( !str_cmp( word, "#MUDPROG" ) ) { mud_prog_data *mprg = new mud_prog_data; fread_afk_mudprog( fp, mprg, pMobIndex ); pMobIndex->mudprogs.push_back( mprg ); ++top_prog; break; } if( !str_cmp( word, "#ENDMOBILE" ) ) { if( !oldmob ) { mob_index_table.insert( map < int, mob_index * >::value_type( pMobIndex->vnum, pMobIndex ) ); tarea->mobs.push_back( pMobIndex ); ++top_mob_index; } return; } break; case 'A': if( !str_cmp( word, "Actflags" ) ) { flag_set( fp, pMobIndex->actflags, fuss_act_flags ); break; } if( !str_cmp( word, "Affected" ) ) { flag_set( fp, pMobIndex->affected_by, aff_flags ); break; } if( !str_cmp( word, "Attacks" ) ) { flag_set( fp, pMobIndex->attacks, attack_flags ); break; } if( !str_cmp( word, "Attribs" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3, x4, x5, x6, x7; x1 = x2 = x3 = x4 = x5 = x6 = x7 = 0; sscanf( ln, "%d %d %d %d %d %d %d", &x1, &x2, &x3, &x4, &x5, &x6, &x7 ); pMobIndex->perm_str = x1; pMobIndex->perm_int = x2; pMobIndex->perm_wis = x3; pMobIndex->perm_dex = x4; pMobIndex->perm_con = x5; pMobIndex->perm_cha = x6; pMobIndex->perm_lck = x7; break; } break; case 'B': if( !str_cmp( word, "Bodyparts" ) ) { flag_set( fp, pMobIndex->body_parts, part_flags ); break; } break; case 'C': if( !str_cmp( word, "Class" ) ) { const char *class_word = fread_flagstring( fp ); short Class = get_fuss_npc_class( class_word ); if( Class < 0 || Class >= MAX_NPC_CLASS ) { bug( "%s: vnum %d: Mob has invalid class: %s. Defaulting to warrior.", __func__, pMobIndex->vnum, class_word ); Class = get_npc_class( "warrior" ); } pMobIndex->Class = Class; break; } break; case 'D': if( !str_cmp( word, "Defenses" ) ) { flag_set( fp, pMobIndex->defenses, defense_flags ); break; } if( !str_cmp( word, "DefPos" ) ) { short position = get_npc_position( fread_flagstring( fp ) ); if( position < 0 || position >= POS_MAX ) { bug( "%s: vnum %d: Mobile in invalid default position! Defaulting to standing.", __func__, pMobIndex->vnum ); position = POS_STANDING; } pMobIndex->defposition = position; break; } if( !str_cmp( word, "Desc" ) ) { const char *desc = fread_flagstring( fp ); if( desc && desc[0] != '\0' && str_cmp( desc, "(null)" ) ) pMobIndex->chardesc = STRALLOC( desc ); break; } break; case 'G': if( !str_cmp( word, "Gender" ) ) { short sex = get_npc_sex( fread_flagstring( fp ) ); if( sex < 0 || sex > SEX_FEMALE ) { bug( "%s: vnum %d: Mobile has invalid sex! Defaulting to neuter.", __func__, pMobIndex->vnum ); sex = SEX_NEUTRAL; } pMobIndex->sex = sex; break; } break; case 'I': if( !str_cmp( word, "Immune" ) ) { flag_set( fp, pMobIndex->immune, ris_flags ); break; } break; case 'K': KEY( "Keywords", pMobIndex->player_name, fread_string( fp ) ); break; case 'L': KEY( "Long", pMobIndex->long_descr, fread_string( fp ) ); break; case 'P': if( !str_cmp( word, "Position" ) ) { short position = get_npc_position( fread_flagstring( fp ) ); if( position < 0 || position >= POS_MAX ) { bug( "%s: vnum %d: Mobile in invalid position! Defaulting to standing.", __func__, pMobIndex->vnum ); position = POS_STANDING; } pMobIndex->position = position; break; } break; case 'R': if( !str_cmp( word, "Race" ) ) { const char *race_word = fread_flagstring( fp ); short race = get_fuss_npc_race( race_word ); if( race < 0 || race >= MAX_NPC_RACE ) { bug( "%s: vnum %d: Mob has invalid race: %s Defaulting to monster.", __func__, pMobIndex->vnum, race_word ); race = get_npc_race( "monster" ); } pMobIndex->race = race; break; } if( !str_cmp( word, "RepairData" ) ) { int iFix; repair_data *rShop = new repair_data; rShop->keeper = pMobIndex->vnum; for( iFix = 0; iFix < MAX_FIX; ++iFix ) rShop->fix_type[iFix] = fread_number( fp ); rShop->profit_fix = fread_number( fp ); rShop->shop_type = fread_number( fp ); rShop->open_hour = fread_number( fp ); rShop->close_hour = fread_number( fp ); pMobIndex->rShop = rShop; repairlist.push_back( rShop ); ++top_repair; break; } if( !str_cmp( word, "Resist" ) ) { flag_set( fp, pMobIndex->resistant, ris_flags ); break; } break; case 'S': // Unused - this is autocalced in mobindex.cpp if( !str_cmp( word, "Saves" ) ) { fread_line( fp ); break; } KEY( "Short", pMobIndex->short_descr, fread_string( fp ) ); if( !str_cmp( word, "ShopData" ) ) { int iTrade; shop_data *pShop = new shop_data; pShop->keeper = pMobIndex->vnum; for( iTrade = 0; iTrade < MAX_TRADE; ++iTrade ) pShop->buy_type[iTrade] = fread_number( fp ); pShop->profit_buy = fread_number( fp ); pShop->profit_sell = fread_number( fp ); pShop->profit_buy = URANGE( pShop->profit_sell + 5, pShop->profit_buy, 1000 ); pShop->profit_sell = URANGE( 0, pShop->profit_sell, pShop->profit_buy - 5 ); pShop->open_hour = fread_number( fp ); pShop->close_hour = fread_number( fp ); pMobIndex->pShop = pShop; shoplist.push_back( pShop ); ++top_shop; break; } if( !str_cmp( word, "Speaks" ) ) { flag_set( fp, pMobIndex->speaks, lang_names ); if( pMobIndex->speaks.none( ) ) pMobIndex->speaks.set( LANG_COMMON ); break; } if( !str_cmp( word, "Speaking" ) ) { string speaking, flag; int value; speaking = fread_flagstring( fp ); speaking = one_argument( speaking, flag ); value = get_langnum( flag ); if( value < 0 || value >= LANG_UNKNOWN ) bug( "Unknown speaking language: %s", flag.c_str() ); else pMobIndex->speaking = value; if( !pMobIndex->speaking ) pMobIndex->speaking = LANG_COMMON; break; } if( !str_cmp( word, "Specfun" ) ) { const char *temp = fread_flagstring( fp ); if( !pMobIndex ) { bug( "%s: Specfun: Invalid mob vnum!", __func__ ); break; } if( !( pMobIndex->spec_fun = m_spec_lookup( temp ) ) ) { bug( "%s: Specfun: vnum %d, no spec_fun called %s.", __func__, pMobIndex->vnum, temp ); pMobIndex->spec_funname.clear( ); } else pMobIndex->spec_funname = temp; break; } if( !str_cmp( word, "Stats1" ) ) { 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 ); pMobIndex->alignment = x1; pMobIndex->level = x2; pMobIndex->mobthac0 = x3; pMobIndex->ac = x4; pMobIndex->gold = x5; pMobIndex->exp = -1; // Converts to AFKMud auto-calc exp break; } if( !str_cmp( word, "Stats2" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3; x1 = x2 = x3 = 0; sscanf( ln, "%d %d %d", &x1, &x2, &x3 ); pMobIndex->hitnodice = pMobIndex->level; pMobIndex->hitsizedice = 8; pMobIndex->hitplus = x3; break; } if( !str_cmp( word, "Stats3" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3; x1 = x2 = x3 = 0; sscanf( ln, "%d %d %d", &x1, &x2, &x3 ); pMobIndex->damnodice = x1; pMobIndex->damsizedice = x2; pMobIndex->damplus = x3; break; } if( !str_cmp( word, "Stats4" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3, x4, x5; x1 = x2 = x3 = x4 = x5 = 0; sscanf( ln, "%d %d %d %d %d", &x1, &x2, &x3, &x4, &x5 ); pMobIndex->height = x1; pMobIndex->weight = x2; pMobIndex->numattacks = x3; pMobIndex->hitroll = x4; pMobIndex->damroll = x5; break; } if( !str_cmp( word, "Suscept" ) ) { flag_set( fp, pMobIndex->susceptible, ris_flags ); break; } break; case 'V': 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_mob_index( vnum ) ) { if( tmpBootDb ) { fBootDb = tmpBootDb; bug( "%s: vnum %d duplicated.", __func__, vnum ); // Try to recover, read to end of duplicated mobile and then bail out for( ;; ) { word = feof( fp ) ? "#ENDMOBILE" : fread_word( fp ); if( !str_cmp( word, "#ENDMOBILE" ) ) return; } } else { pMobIndex = get_mob_index( vnum ); log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning mobile: %d", vnum ); pMobIndex->clean_mob( ); oldmob = true; } } else { pMobIndex = new mob_index; pMobIndex->clean_mob( ); } pMobIndex->vnum = vnum; pMobIndex->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; } } }
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; } } }
void fread_fuss_room( FILE * fp, area_data * tarea ) { room_index *pRoomIndex = NULL; bool oldroom = false; for( ;; ) { const char *word = ( feof( fp ) ? "#ENDROOM" : fread_word( fp ) ); if( word[0] == '\0' ) { log_printf( "%s: EOF encountered reading file!", __func__ ); word = "#ENDROOM"; } switch ( word[0] ) { default: bug( "%s: no match: %s", __func__, word ); fread_to_eol( fp ); break; case '#': if( !str_cmp( word, "#ENDROOM" ) ) { if( !oldroom ) { room_index_table.insert( map < int, room_index * >::value_type( pRoomIndex->vnum, pRoomIndex ) ); tarea->rooms.push_back( pRoomIndex ); ++top_room; } return; } // Format of this section is identical to AFKMud. Let's cheat :) if( !str_cmp( word, "#EXIT" ) ) { fread_afk_exit( fp, pRoomIndex ); break; } // 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 ) pRoomIndex->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, pRoomIndex ); pRoomIndex->mudprogs.push_back( mprg ); ++top_prog; break; } break; case 'A': if( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) ) { affect_data *af = fread_fuss_affect( fp, word ); if( af ) pRoomIndex->permaffects.push_back( af ); break; } break; case 'D': KEY( "Desc", pRoomIndex->roomdesc, fread_string_nohash( fp ) ); break; case 'F': if( !str_cmp( word, "Flags" ) ) { flag_set( fp, pRoomIndex->flags, fuss_r_flags ); break; } break; case 'N': KEY( "Name", pRoomIndex->name, fread_string( fp ) ); break; // Format of this section is identical to AFKMud. Let's cheat :) case 'R': CLKEY( "Reset", pRoomIndex->load_reset( fp, false ) ); break; case 'S': if( !str_cmp( word, "Sector" ) ) { const char *sec_type = fread_flagstring( fp ); int sector = get_fuss_sectypes( sec_type ); if( sector < 0 || sector >= SECT_MAX ) { bug( "%s: Room #%d has bad sector type: %s", __func__, pRoomIndex->vnum, sec_type ); sector = 1; } pRoomIndex->sector_type = sector; pRoomIndex->winter_sector = -1; break; } if( !str_cmp( word, "Stats" ) ) { const char *ln = fread_line( fp ); int x1, x2, x3, x4; x1 = x2 = x3 = x4 = 0; sscanf( ln, "%d %d %d %d", &x1, &x2, &x3, &x4 ); pRoomIndex->tele_delay = x1; pRoomIndex->tele_vnum = x2; pRoomIndex->tunnel = x3; pRoomIndex->max_weight = x4; break; } break; case 'V': 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_room_index( vnum ) ) { if( tmpBootDb ) { fBootDb = tmpBootDb; bug( "%s: vnum %d duplicated.", __func__, vnum ); // Try to recover, read to end of duplicated room and then bail out for( ;; ) { word = feof( fp ) ? "#ENDROOM" : fread_word( fp ); if( !str_cmp( word, "#ENDROOM" ) ) return; } } else { pRoomIndex = get_room_index( vnum ); log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning room: %d", vnum ); pRoomIndex->clean_room( ); oldroom = true; } } else { pRoomIndex = new room_index; pRoomIndex->clean_room( ); } pRoomIndex->vnum = vnum; pRoomIndex->area = tarea; fBootDb = tmpBootDb; if( fBootDb ) { if( !tarea->low_vnum ) tarea->low_vnum = vnum; if( vnum > tarea->hi_vnum ) tarea->hi_vnum = vnum; } if( !pRoomIndex->resets.empty( ) ) { if( fBootDb ) { int count = 0; list < reset_data * >::iterator rst; bug( "%s: WARNING: resets already exist for this room.", __func__ ); for( rst = pRoomIndex->resets.begin( ); rst != pRoomIndex->resets.end( ); ++rst ) { reset_data *rtmp = *rst; ++count; if( !rtmp->resets.empty( ) ) count += rtmp->resets.size( ); } } else { /* * Clean out the old resets */ log_printf_plus( LOG_BUILD, sysdata->build_level, "Cleaning resets: %s", tarea->name ); pRoomIndex->clean_resets( ); } } break; } break; } } }
bool check_bans( CHAR_DATA * ch, int type ) { BAN_DATA *pban; char new_host[MAX_STRING_LENGTH]; int i; bool fMatch = FALSE; switch ( type ) { case BAN_RACE: pban = first_ban_race; break; case BAN_CLASS: pban = first_ban_class; break; case BAN_SITE: pban = first_ban; for( i = 0; i < ( int )( strlen( ch->desc->host ) ); i++ ) new_host[i] = LOWER( ch->desc->host[i] ); new_host[i] = '\0'; break; default: bug( "Ban type in check_bans: %d.", type ); return FALSE; } for( ; pban; pban = pban->next ) { if( type == BAN_CLASS && pban->flag == ch->Class ) { if( check_expire( pban ) ) { dispose_ban( pban, BAN_CLASS ); save_banlist( ); return FALSE; } if( ch->level > pban->level ) { if( pban->warn ) { log_printf_plus( LOG_WARN, sysdata.log_level, "%s class logging in from %s.", pban->name, ch->desc->host ); } return FALSE; } else return TRUE; } if( type == BAN_RACE && pban->flag == ch->race ) { if( check_expire( pban ) ) { dispose_ban( pban, BAN_RACE ); save_banlist( ); return FALSE; } if( ch->level > pban->level ) { if( pban->warn ) { log_printf_plus( LOG_WARN, sysdata.log_level, "%s race logging in from %s.", pban->name, ch->desc->host ); } return FALSE; } else return TRUE; } if( type == BAN_SITE ) { if( pban->prefix && pban->suffix && strstr( new_host, pban->name ) ) fMatch = TRUE; else if( pban->prefix && !str_suffix( pban->name, new_host ) ) fMatch = TRUE; else if( pban->suffix && !str_prefix( pban->name, new_host ) ) fMatch = TRUE; else if( !str_cmp( pban->name, new_host ) ) fMatch = TRUE; if( fMatch ) { if( check_expire( pban ) ) { dispose_ban( pban, BAN_SITE ); save_banlist( ); return FALSE; } if( ch->level > pban->level ) { if( pban->warn ) { log_printf_plus( LOG_WARN, sysdata.log_level, "%s logging in from site %s.", ch->name, ch->desc->host ); } return FALSE; } else return TRUE; } } } return FALSE; }