#include <ctype.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <syslog.h>
#include "define.h"
#include "struct.h"
#include "unistd.h"
/*
* BUG ROUTINES
*/
inline void mob_bugs( char_data* ch, species_data* species, bool& found,
bool make )
{
mprog_data* mprog;
int i = 1;
if( make && species->attack->binary == NULL )
compile( species->attack );
if( species->attack->corrupt ) {
found = TRUE;
page( ch, " Mob #%-4d (%s) has no attack program.\n\r",
species->vnum, species->descr->name );
}
for( mprog = species->mprog; mprog != NULL; i++, mprog = mprog->next ) {
if( make && mprog->binary == NULL )
compile( mprog );
if( mprog->corrupt ) {
found = TRUE;
page( ch, " Mprog #%d on mob #%d (%s) is not compiling.\n\r",
i, species->vnum, species->descr->name );
}
}
return;
}
inline void obj_bugs( char_data* ch, obj_clss_data* obj, bool& found,
bool )
{
bool either = FALSE;
bool after = FALSE;
bool before = FALSE;
const char* keyword;
for( int i = 0; i < obj->extra_descr; i++ ) {
keyword = obj->extra_descr[i]->keyword;
either |= !strcasecmp( keyword, "either" );
after |= !strcasecmp( keyword, "after" );
before |= !strcasecmp( keyword, "before" );
}
if( !either && ( !after || ( !before && obj->fakes == obj->vnum ) ) ) {
page( ch, " Object #%-4d (%s) missing description oextra.\n\r",
obj->vnum, obj->Name( ) );
found = TRUE;
}
if( is_set( obj->extra_flags, OFLAG_NOSHOW )
&& is_set( &obj->wear_flags, ITEM_TAKE ) ) {
page( ch, " Object #%-4d (%s) takable and 'no.show'.\n\r",
obj->vnum, obj->Name( ) );
found = TRUE;
}
return;
}
inline void room_bugs( char_data* ch, room_data* room, bool& found,
bool make )
{
action_data* action;
int i, j;
for( i = 1, action = room->action; action != NULL;
i++, action = action->next ) {
if( make && action->binary == NULL )
compile( action );
if( action->corrupt ) {
found = TRUE;
page( ch, " Acode #%d in room %d is not compiling.\n\r",
i, room->vnum );
continue;
}
if( action->trigger == TRIGGER_ENTERING
|| action->trigger == TRIGGER_LEAVING ) {
for( j = 0; j < MAX_DOOR; j++ )
if( is_set( &action->flags, j ) )
break;
if( j == MAX_DOOR ) {
found = TRUE;
page( ch,
" Acode #%d in room %d has no direction flag checked.\n\r",
i, room->vnum );
}
}
}
return;
}
void do_bugs( char_data* ch, char* argument )
{
area_data* area;
reset_data* reset;
room_data* room;
species_data* species;
trainer_data* trainer;
obj_clss_data* obj;
bool found = FALSE;
bool compile;
int i;
int flags;
if( !get_flags( ch, argument, &flags, "omtrc", "Bugs" ) )
return;
if( ( flags & 0xf ) == 0 )
flags = 0xf;
compile = is_set( &flags, 4 );
page( ch, "Bugs Found:\n\r" );
/*-- OBJECTS --*/
if( is_set( &flags, 0 ) )
for( i = 0; i < MAX_OBJ_INDEX; i++ )
if( ( obj = obj_index_list[i] ) != NULL )
obj_bugs( ch, obj, found, compile );
/*-- TRAINERS --*/
if( is_set( &flags, 2 ) ) {
for( trainer = trainer_list; trainer != NULL; trainer = trainer->next ) {
if( trainer->room == NULL ) {
page( ch, " Trainer nowhere??\n\r" );
found = TRUE;
continue;
}
if( ( species = get_species( trainer->trainer ) ) == NULL ) {
page( ch, " Trainer in room #%d with non-existent species.\n\r",
trainer->room->vnum );
found = TRUE;
continue;
}
for( reset = trainer->room->reset; reset != NULL; reset = reset->next )
if( reset->vnum == trainer->trainer
&& is_set( &reset->flags, RSFLAG_MOB ) )
break;
if( reset == NULL ) {
page( ch,
" Trainer entry in room %d for mob %d with no reset.\n\r",
trainer->room->vnum, trainer->trainer );
found = TRUE;
}
}
}
/*-- MOBILE BUGS --*/
if( is_set( &flags, 1 ) )
for( i = 0; i < MAX_SPECIES; i++ )
if( ( species = species_list[i] ) != NULL )
mob_bugs( ch, species, found, compile );
/*-- AREAS --*/
if( is_set( &flags, 3 ) )
for( area = area_list; area != NULL; area = area->next )
if( area->status == AREA_OPEN )
for( room = area->room_first; room != NULL; room = room->next )
room_bugs( ch, room, found, compile );
if( !found )
send( " none\n\r", ch );
}