void do_who( CHAR_DATA *ch, char *argument )
{
char buf[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char rank[3];
BUFFER *output;
DESCRIPTOR_DATA *d;
int iClass;
int iRace;
int iClan;
int iLevelLower;
int iLevelUpper;
int nNumber;
int nMatch;
bool rgfClass[MAX_CLASS];
bool rgfRace[MAX_PC_RACE];
bool rgfClan[MAX_CLAN];
bool fClassRestrict = FALSE;
bool fClanRestrict = FALSE;
bool fClan = FALSE;
bool fRaceRestrict = FALSE;
bool fImmortalOnly = FALSE;
/*
* Set default arguments.
*/
iLevelLower = 0;
iLevelUpper = MAX_LEVEL;
for ( iClass = 0; iClass < MAX_CLASS; iClass++ )
rgfClass[iClass] = FALSE;
for ( iRace = 0; iRace < MAX_PC_RACE; iRace++ )
rgfRace[iRace] = FALSE;
for (iClan = 0; iClan < MAX_CLAN; iClan++)
rgfClan[iClan] = FALSE;
/*
* Parse arguments.
*/
nNumber = 0;
for ( ;; )
{
char arg[MAX_STRING_LENGTH];
argument = one_argument( argument, arg );
if ( arg[0] == '\0' )
break;
if ( is_number( arg ) )
{
switch ( ++nNumber )
{
case 1: iLevelLower = atoi( arg ); break;
case 2: iLevelUpper = atoi( arg ); break;
default:
send_to_char( "Only two level numbers allowed.\n\r", ch );
return;
}
}
else
{
/*
* Look for classes to turn on.
*/
if (!str_prefix(arg,"immortals"))
{
fImmortalOnly = TRUE;
}
else
{
iClass = class_lookup(arg);
if (iClass == -1)
{
iRace = race_lookup(arg);
if (iRace == 0 || iRace >= MAX_PC_RACE)
{
if (!str_prefix(arg,"clan"))
fClan = TRUE;
else
{
iClan = clan_lookup(arg);
if (iClan)
{
fClanRestrict = TRUE;
rgfClan[iClan] = TRUE;
}
else
{
send_to_char(
"That's not a valid race, class, or clan.\n\r",
ch);
return;
}
}
}
else
{
fRaceRestrict = TRUE;
rgfRace[iRace] = TRUE;
}
}
else
{
fClassRestrict = TRUE;
rgfClass[iClass] = TRUE;
}
}
}
}
/*
* Now show matching chars.
*/
nMatch = 0;
buf[0] = '\0';
output = new_buf();
for ( d = descriptor_list; d != NULL; d = d->next )
{
CHAR_DATA *wch;
char const *class;
/*
* Check for match against restrictions.
* Don't use trust as that exposes trusted mortals.
*/
if ( d->connected != CON_PLAYING || !can_see( ch, d->character ) )
continue;
wch = ( d->original != NULL ) ? d->original : d->character;
if (!can_see(ch,wch))
continue;
if ( wch->level < iLevelLower
|| wch->level > iLevelUpper
|| ( fImmortalOnly && wch->level < LEVEL_IMMORTAL )
|| ( fClassRestrict && !rgfClass[wch->class] )
|| ( fRaceRestrict && !rgfRace[wch->race])
|| ( fClan && !is_clan(wch))
|| ( fClanRestrict && !rgfClan[wch->clan]))
continue;
nMatch++;
/*
* Figure out what to print for level.
*/
switch (wch->level) {
case MAX_LEVEL - 0 : rank = "IMP"; break;
case MAX_LEVEL - 1 : rank = "CRE"; break;
case MAX_LEVEL - 2 : rank = "SUP"; break;
case MAX_LEVEL - 3 : rank = "DEI"; break;
case MAX_LEVEL - 4 : rank = "GOD"; break;
case MAX_LEVEL - 5 : rank = "IMM"; break;
case MAX_LEVEL - 6 : rank = "DEM"; break;
case MAX_LEVEL - 7 : rank = "ANG"; break;
case MAX_LEVEL - 8 : rank = "AVA"; break;
case MAX_LEVEL - 9 : rank = "BLD"; break;
default: rank = strdup(wch->level); break;
}
class = class_table[wch->class].who_name;
/*
* Format it up.
*/
sprintf( buf, "[%2d %6s %s] %s%s%s%s%s%s%s%s\n\r",
rank,
wch->race < MAX_PC_RACE ? pc_race_table[wch->race].who_name
: " ",
class,
wch->incog_level >= LEVEL_HERO ? "(Incog) " : "",
wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "",
clan_table[wch->clan].who_name,
IS_SET(wch->comm, COMM_AFK) ? "[AFK] " : "",
IS_SET(wch->act, PLR_KILLER) ? "(KILLER) " : "",
IS_SET(wch->act, PLR_THIEF) ? "(THIEF) " : "",
wch->name,
IS_NPC(wch) ? "" : wch->pcdata->title );
add_buf(output,buf);
}
sprintf( buf2, "\n\rPlayers found: %d\n\r", nMatch );
add_buf(output,buf2);
page_to_char( buf_string(output), ch );
free_buf(output);
return;
}
case MAX_LEVEL - 0:
/*
* Figure out what to print for level.
*/
switch (wch->level)
{
case MAX_LEVEL - 0 : rank = "IMP"; break;
case MAX_LEVEL - 1 : rank = "CRE"; break;
case MAX_LEVEL - 2 : rank = "SUP"; break;
case MAX_LEVEL - 3 : rank = "DEI"; break;
case MAX_LEVEL - 4 : rank = "GOD"; break;
case MAX_LEVEL - 5 : rank = "IMM"; break;
case MAX_LEVEL - 6 : rank = "DEM"; break;
case MAX_LEVEL - 7 : rank = "ANG"; break;
case MAX_LEVEL - 8 : rank = "AVA"; break;
case MAX_LEVEL - 9 : rank = "BLD"; break;
default: rank = strdup(wch->level); break;
}
rank = strdup(wch->level);
sprintf( buf, "[%3d %6s %s] %s%s%s%s%s%s%s%s\n\r",
rank,
wch->race < MAX_PC_RACE ? pc_race_table[wch->race].who_name
: " ",
class,
wch->incog_level >= LEVEL_HERO ? "(Incog) " : "",
wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "",
clan_table[wch->clan].who_name,
IS_SET(wch->comm, COMM_AFK) ? "[AFK] " : "",
IS_SET(wch->act, PLR_KILLER) ? "(KILLER) " : "",
IS_SET(wch->act, PLR_THIEF) ? "(THIEF) " : "",
wch->name,
IS_NPC(wch) ? "" : wch->pcdata->title );
sprintf( buf, "[%-3d %6s %s] %s%s%s%s%s%s%s%s\n\r",
wch->level,
wch->race < MAX_PC_RACE ? pc_race_table[wch->race].who_name
: " ",
class,
wch->incog_level >= LEVEL_HERO ? "(Incog) " : "",
wch->invis_level >= LEVEL_HERO ? "(Wizi) " : "",
clan_table[wch->clan].who_name,
IS_SET(wch->comm, COMM_AFK) ? "[AFK] " : "",
IS_SET(wch->act, PLR_KILLER) ? "(KILLER) " : "",
IS_SET(wch->act, PLR_THIEF) ? "(THIEF) " : "",
wch->name,
IS_NPC(wch) ? "" : wch->pcdata->title );
class = class_table[wch->class].who_name;
sprintf (class, "%32s", class_table[wch->class].who_name != NULL
class_table[wch->class].who_name : "Unknown");
// the second part is simply a safety
sprintf (class, "%32s", class_table[wch->class].who_name); // that works also
switch ( wch->level )
{
default: break;
case MAX_LEVEL - 0 : class = "IMP"; break;
case MAX_LEVEL - 1 : class = "CRE"; break;
case MAX_LEVEL - 2 : class = "SUP"; break;
case MAX_LEVEL - 3 : class = "DEI"; break;
case MAX_LEVEL - 4 : class = "GOD"; break;
case MAX_LEVEL - 5 : class = "IMM"; break;
case MAX_LEVEL - 6 : class = "DEM"; break;
case MAX_LEVEL - 7 : class = "ANG"; break;
case MAX_LEVEL - 8 : class = "AVA"; break;
case MAX_LEVEL - 9 : class = "BLD"; break;
}
}
The error I receive says I'm trying to put a CHAR into an INT. I attempted atoi? Am I on the right track, any suggestions?
Please help!
Thanks!