/* Accounting Routines by Thrace
* (countrooms(), countmobiles(), countobjects(), acctcom(), dopc())
*/
/* Spiffed up and more information added by Illusion
* Acct <zone> added by Illusion
*/
/* objectscom()
* 1995 by Illusion
*/
/* mstatcom()
* 1995 by Illusion
*/
#include <stdlib.h>
#include <strings.h>
#include "kernel.h"
#include "mudmacros.h"
#include "locations.h"
#include "objects.h"
#include "mobiles.h"
#include "pflags.h"
#include "oflags.h"
#include "lflags.h"
#include "cflags.h"
#include "sflags.h"
#include "bprintf.h"
#include "parse.h"
#include "acct.h"
#include "zones.h"
#include "mobile.h"
#include "objsys.h"
#include "rooms.h"
#include "timing.h"
#include "uaf.h"
#include "flags.h"
#include "rooms.h"
#include "objsys.h"
#include "zones.h"
#define Line1 "============================================================="
#define Line2 "-------------------------------------------------------------"
extern char *WizLevels[];
void
acctcom (void)
{
char text[80];
int zone = -1;
int i;
if (plev (mynum) < LVL_WIZARD) {
bprintf ("You can't do that now.\n");
return;
}
if (brkword () != -1) {
if ((zone = get_zone_by_name (wordbuf)) == -1) {
bprintf ("No Such Zone: %s\n", wordbuf);
return;
}
}
if (zone == -1)
sprintf (text, "Current System Accounting");
else
sprintf (text, "Current System Accounting (Zone: %s)", zname (zone));
for (i = 0; i < (60 - strlen (text)) / 2; ++i)
bprintf (" ");
bprintf ("&+W%s\n", text);
bprintf ("&+C%s\n", Line1);
countrooms (zone);
bprintf ("\n");
countmobiles (zone);
bprintf ("\n");
countobjects (zone);
}
/* Show percentage: max is maximum, exist is how many of max are left */
int
dopc (int max, int exist)
{
int proc;
int t;
if (exist > max) { /* Someone passed them backwards */
t = max; /* so we fix that here. */
max = exist;
exist = t;
}
if (!(max))
proc = 0;
else
proc = (exist * 100) / max;
return (proc);
}
void
countmobiles (int zone)
{
int bas, j = 0, i;
int a;
int NoHassle, Possessed, DeadMobs;
int proc;
NoHassle = Possessed = DeadMobs = 0;
a = max_players;
if (zone == -1) {
bas = numchars;
} else {
a = 0;
bas = znumchars (zone);
}
for (; a < bas; a++) {
i = (zone == -1) ? a : zmob_nr (a, zone);
if (EMPTY (pname (i)))
continue;
if (ptstflg (i, PFL_NOHASSLE))
NoHassle++;
if (ptstflg (i, SFL_OCCUPIED))
Possessed++;
if (alive (i) != -1)
j++;
if (zone == -1)
DeadMobs = ((numchars - max_players) - j);
else
DeadMobs = (znumchars (zone) - j);
}
if (zone == -1)
proc = dopc (numchars - max_players, j);
else
proc = dopc (znumchars (zone), j);
if (zone == -1)
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Total Mobiles", numchars - max_players, "Living Mobiles", j);
else
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Total Mobiles", znumchars (zone), "Living Mobiles", j);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n",
"Dead Mobiles", DeadMobs, "Percent Living", proc);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n",
"Possessed", Possessed, "NoHassle", NoHassle);
}
void
countobjects (int zone)
{
int proc;
long totalval = 0;
int aa, oc = 0;
int destroyed, weapons, armor, food;
int lightable, container, key, noget;
int destweap, destarm, destfood, destlight, destcont, destkey;
int objnum;
destroyed = weapons = armor = food = lightable
= container = key = noget = destweap = destarm = destfood =
destlight = destcont = destkey = 0;
if (zone == -1) {
objnum = numobs;
} else {
aa = zfirst_obj (zone);
objnum = znumobs (zone);
}
for (aa = 0; aa < objnum; aa++) {
if (zone != -1)
oc = zobj_nr (aa, zone);
if (!otstbit (oc, OFL_NOGET) && !otstbit (oc, OFL_DESTROYED))
totalval += ovalue (oc);
if (otstbit (oc, OFL_NOGET))
noget++;
if (otstbit (oc, OFL_DESTROYED))
destroyed++;
if (otstbit (oc, OFL_WEAPON)) {
weapons++;
if (otstbit (oc, OFL_DESTROYED))
destweap++;
}
if (otstbit (oc, OFL_ARMOR)) {
armor++;
if (otstbit (oc, OFL_DESTROYED))
destarm++;
}
if (otstbit (oc, OFL_FOOD)) {
food++;
if (otstbit (oc, OFL_DESTROYED))
destfood++;
}
if (otstbit (oc, OFL_CONTAINER) &&
!otstbit (oc, OFL_NOGET)) {
container++;
if (otstbit (oc, OFL_DESTROYED))
destcont++;
}
if (otstbit (oc, OFL_KEY)) {
key++;
if (otstbit (oc, OFL_DESTROYED))
destkey++;
}
if (otstbit (oc, OFL_LIGHTABLE)) {
lightable++;
if (otstbit (oc, OFL_DESTROYED))
destlight++;
}
if (zone == -1)
oc++;
}
if (zone == -1)
proc = dopc (oc - destroyed, oc);
else
proc = dopc (znumobs (zone) - destroyed, znumobs (zone));
if (zone == -1)
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Total Objects", oc, "Remaining", oc - destroyed);
else
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Total Objects", znumobs (zone), "Remaining", znumobs (zone) - destroyed);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Destroyed", destroyed, "Percent Left", proc);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n\n", "NoGet", noget, "Value of Objects", totalval);
bprintf ("&+W Detail List of Objects Available to Mortals\n");
bprintf ("&+C%s\n", Line2);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Weapons", weapons, "Destroyed", destweap);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Armor", armor, "Destroyed", destarm);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Food", food, "Destroyed", destfood);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Containers", container, "Destroyed", destcont);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Lightable", lightable, "Destroyed", destlight);
bprintf ("&+w%-18s: %8d\t%-18s: %8d\n", "Keys", key, "Destroyed", destkey);
bprintf ("&+C%s\n", Line1);
}
void
countrooms (int zone)
{
int roomct;
if (zone == -1)
roomct = num_const_locs;
else
roomct = znumloc (zone);
bprintf ("&+w%-18s: %8d\n", "Total Rooms", roomct);
}
/* objectscom()
* 1995 by Illusion
*/
void
objectscom (void)
{
int zone = -1;
int i, c, oc = 0;
char b[60], d[60];
if (plev (mynum) < LVL_WIZARD) {
bprintf ("You can't do that now.\n");
return;
}
if (brkword () != -1) {
if ((zone = get_zone_by_name (wordbuf)) == -1) {
bprintf ("No Such Zone: %s\n", wordbuf);
return;
}
}
if (zone == -1) {
for (i = 0; i < numobs; ++i) {
oc++;
c = findzone (oloc (i), b);
sprintf (d, "%s%d", b, c);
if (ocarrf (i) >= CARRIED_BY)
strcpy (d, "Carried");
else if (ocarrf (i) == IN_CONTAINER)
strcpy (d, "In Container");
bprintf ("&+w%-12s&+W%-13s", oname (i), d);
if (oc % 3 == 0)
bprintf ("\n");
}
if (oc % 3 != 0)
bprintf ("\n");
bprintf ("\n&+wTotal of &+W%d &+wobjects.\n", oc);
return;
}
bprintf ("&+wObject List For Zone: &+W%s\n", zname (zone));
for (i = zfirst_obj (zone); i != SET_END; i = znext_obj (zone)) {
oc++;
c = findzone (oloc (i), b);
sprintf (d, "%s%d", b, c);
if (ocarrf (i) >= CARRIED_BY)
strcpy (d, "Carried");
else if (ocarrf (i) == IN_CONTAINER)
strcpy (d, "In Container");
bprintf ("&+w%-12s&+W%-14s", oname (i), d);
if (oc % 3 == 0)
bprintf ("\n");
}
if (oc % 3 != 0)
bprintf ("\n");
bprintf ("\n&+wTotal of &+W%d &+wobjects.\n", oc);
}
/* mstatcom()
* Status for mortals
* 1995 by Illusion
*/
void
mstatcom ()
{
int i, j = 0;
char cond[50];
char buff[100];
if (plev (mynum) < LVL_WIZARD) {
erreval ();
return;
}
bprintf ("&+CLvl Name Score Str/Max Mag/Max DP AC Cnd Who/Where\n");
bprintf ("&+b--------------------------------------------------------------------------------\n");
for (i = 0; i < max_players; ++i) {
if (is_in_game (i) && plev (i) < LVL_WIZARD) {
++j;
if (pfighting (i) >= 0)
sprintf (cond, "&+RFgt &+w%s: %d (%s)", pname (pfighting (i)), pstr (pfighting (i)), xshowname (buff, ploc (i)));
else if (phelping (i) >= 0)
sprintf (cond, "&+BHlp &+w%s (%s)", pname (phelping (i)), xshowname (buff, ploc (i)));
else if (psitting (i))
sprintf (cond, "&+CSit &+w(%s)", xshowname (buff, ploc (i)));
else
sprintf (cond, "&+wStd &+w(%s)", xshowname (buff, ploc (i)));
bprintf ("&+w%3d &+W%-13.13s &+c%-6d %s%3d&+C/&+W%-3d %s%3d&+C/&+W%-3d &+B%2d %2d &+w%-32.32s\n",
plev (i), pname (i), pscore (i),
str_color (i), pstr (i), maxstrength (i),
mag_color (i), pmagic (i), maxmagic (i), player_damage (i),
player_armor (i), cond);
}
}
if (!j)
bprintf ("&+W No Mortals On-Line\n");
bprintf ("&+b--------------------------------------------------------------------------------\n");
}
/* The USERS command. Show names and locations of users. Possibly also
* their local host if PFL_SHUSERS is set.
*/
void
usercom (void)
{
char locnam[256], wiznam[128], src[256], buff[128], idlebuff[64];
char header[100], levnam[40];
char occ[3];
int i;
int a[256], a_len = 0;
int me = real_mynum;
for (i = 0; i < max_players; i++)
if (!check_nooracle (i) && is_in_game (i) &&
(pvis (i) <= plev (me) || i == me))
a[a_len++] = i;
qsort (a, a_len, sizeof (int), cmp_player);
sprintf (header, "%-*s %-15s%s %10.10s %s",
PNAME_LEN,
"User",
plev (me) >= LVL_WIZARD ? "Level Vis" : "Level",
"Sex",
"Idle",
plev (me) >= LVL_WIZARD ? "Location" : " ");
bprintf ("&+C%s\n", header);
bprintf ("&+b------------------------------------------");
if (plev (me) >= LVL_WIZARD)
bprintf ("&+b-------------------------------------\n");
else
bprintf ("\n");
for (i = 0; i < a_len; ++i) {
if (ptstflg (mynum, PFL_SEEIDLE)) {
strcpy (idlebuff, sec_to_hhmmss (global_clock - prlast_cmd (a[i])));
} else {
strcpy (idlebuff, sec_to_hhmmss (global_clock - plast_cmd (a[i])));
}
if (plev (a[i]) <= LVL_WIZARD)
sprintf (levnam, "%s",
psex (a[i]) ? FLevels[plev (a[i])] : MLevels[plev (a[i])]);
else
sprintf (levnam, "%s", WizLevels[wlevel (plev (a[i]))]);
if (!exists (ploc (a[i]))) {
sprintf (locnam, "Not In Universe &+w(%d)&*", ploc (a[i]));
sprintf (wiznam, "[Unknown]");
} else {
sprintf (wiznam, "%s", xshowname (buff, ploc (a[i])));
strip_color (buff, sdesc (ploc (a[i])));
sprintf (locnam, "%s", buff);
}
if (ststflg (a[i], SFL_OCCUPIED))
strcpy (occ, "*");
else
strcpy (occ, " ");
sprintf (src, "%-6d %6d", plev (a[i]), pvis (a[i]));
bprintf ("&+w%-*s %-15s &+w%c %10.10s %s%s %c%-.*s%c\n",
PNAME_LEN,
pname (a[i]),
plev (me) >= LVL_WIZARD ? src : levnam,
psex (a[i]) ? 'F' : 'M',
idlebuff,
plev (me) >= LVL_WIZARD ? occ : " ",
plev (me) >= LVL_WIZARD ? wiznam : "",
plev (me) >= LVL_WIZARD ? '(' : ' ',
plev (me) >= LVL_WIZARD ? 79 - (PNAME_LEN + 35 + strlen (wiznam)) : 0,
plev (me) >= LVL_WIZARD ? locnam : "",
plev (me) >= LVL_WIZARD ? ')' : ' ');
}
bprintf ("&+b------------------------------------------");
if (plev (me) >= LVL_WIZARD)
bprintf ("&+b-------------------------------------\n");
else
bprintf ("\n");
}
/* Checks to see if we need to do a newline on the title line.
*/
int
do_who_newline (int total, char *message)
{
char buffer[400];
int len;
strip_color (buffer, message);
len = strlen (buffer);
total += len;
if (total >= 59) {
total = 0;
bprintf ("&>");
}
bprintf ("%s", message);
return total;
}
/* Displays and formats messages for WHO/WHON
*/
void
do_who_messages (int cur_len, int plr)
{
char awaymsg[100];
int len = cur_len;
if (ststflg (plr, SFL_NOGOSSIP))
len = do_who_newline (len, "&+B[&*NoGossip&+B] ");
if (ststflg (plr, SFL_NOANON))
len = do_who_newline (len, "&+B[&*NoAnon&+B] ");
if (ststflg (plr, SFL_BUSY))
len = do_who_newline (len, "&+B[&*Busy&+B] ");
if (ststflg (plr, SFL_CODING))
len = do_who_newline (len, "&+B[&*Coding&+B] ");
if (players[plr].newplr)
len = do_who_newline (len, "&+C[&+WNew Player&+C] ");
if (plev (mynum) >= LVL_WIZARD) {
if (ststflg (plr, SFL_QUIET))
len = do_who_newline (len, "&+B[&*Quiet&+B] ");
if (ststflg (plr, SFL_NOWIZ))
len = do_who_newline (len, "&+B[&*NoWiz&+B] ");
if (ststflg (plr, SFL_NOWISH))
len = do_who_newline (len, "&+B[&*NoWish&+B] ");
}
if (plev (mynum) > LVL_PROPHET) {
if (ststflg (plr, SFL_NOPROPHET))
len = do_who_newline (len, "&+B[&*NoProphet&+B] ");
}
if (plev (mynum) > LVL_ARCHWIZARD) {
if (ststflg (plr, SFL_NOAWIZ))
len = do_who_newline (len, "&+B[&*NoAWiz&+B] ");
}
if (plev (mynum) > LVL_ADVISOR) {
if (ststflg (plr, SFL_NOADV))
len = do_who_newline (len, "&+B[&*NoAdv&+B] ");
}
if (plev (mynum) > LVL_AVATAR) {
if (ststflg (plr, SFL_NOGOD))
len = do_who_newline (len, "&+B[&*NoGod&+B] ");
}
if (plev (mynum) > LVL_GOD) {
if (ststflg (plr, SFL_NOUPPER))
len = do_who_newline (len, "&+B[&*NoUpper&+B] ");
}
if (ststflg (plr, SFL_AWAY)) {
sprintf (awaymsg, "&+B[&*Away&+B] [&+CReason: &*%s&+B] ",
players[plr].awaymsg);
len = do_who_newline (len, awaymsg);
}
}
/* The WHO/WHON command
*/
void
whocom (Boolean do_name)
{
char buffer[400];
int i, cur_len;
int a[256], a_len = 0;
for (i = 0; i < max_players; i++)
if (is_in_game (i) && (pvis (i) <= plev (mynum) || i == mynum)) {
a[a_len++] = i;
}
qsort (a, a_len, sizeof (int), cmp_player);
bprintf ("&+C%-16.16s Title\n", do_name ? "Name" : "Level");
bprintf ("&+b---------------- --------------------------------------------------------------\n");
for (i = 0; i < a_len; ++i) {
if (do_name) {
bprintf ("&+B[&+W%12s&+B]", pname (a[i]));
} else {
if (ststflg (a[i], SFL_FREAQ))
bprintf ("&+B[&+G%12s&+B]", "FreaQ");
else if (plev (a[i]) <= LVL_WIZARD)
bprintf ("&+B[&+w%12s&+B]", psex (a[i]) ?
FLevels[plev (a[i])] : MLevels[plev (a[i])]);
else
bprintf ("&+B[&+W%12s&+B]", WizLevels[wlevel (plev (a[i]))]);
}
bprintf ("%s", pvis (a[i]) > 0 ? "&+R*" : " ");
if (plev (mynum) < LVL_WIZARD)
bprintf (" ");
else
bprintf ("%s ", is_aliased (a[i]) ? "&+C*" : " ");
if (ststflg (a[i], SFL_FREAQ)) {
cur_len = strlen (pname (a[i]) + 33);
bprintf ("&+w%s, tHe ToTAL aNd AbSoLuTE Frea&+GQ&*! ", pname (a[i]));
} else {
strip_color (buffer, make_title (ptitle (a[i]), pname (a[i])));
cur_len = strlen (buffer) + 1;
bprintf ("&+w%s ", make_title (ptitle (a[i]), pname (a[i])));
}
if (!ststflg (mynum, SFL_NOFLAG)) {
do_who_messages (cur_len, a[i]);
}
bprintf ("\n");
}
bprintf ("&+b---------------- --------------------------------------------------------------\n");
bprintf ("&+wThere %s &+C%d &+wvisible player%s currently on the game.\n",
(a_len > 1 ? "are" : "is"), a_len, (a_len > 1 ? "s" : ""));
}
/* The MWHO command
*/
#define COLUMNS (72/MNAME_LEN)
void
mwhocom (void)
{
char buff[64];
int i, ct, zone, nr;
Boolean list_all = True;
int first = max_players;
int last = numchars;
i = ct = zone = nr = 0;
if (plev (mynum) < LVL_WIZARD) {
erreval ();
return;
}
if (brkword () != -1) {
list_all = False;
if ((zone = get_zone_by_name (wordbuf)) == -1) {
bprintf ("No such zone: %s\n", wordbuf);
return;
}
first = 0;
last = znumchars (zone);
}
bprintf ("Live Mobiles\n------------\n\n");
for (ct = first, nr = 0; ct < last; ++ct) {
i = list_all ? ct : zmob_nr (ct, zone);
if (!EMPTY (pname (i)) && pstr (i) >= 0 &&
(pvis (i) <= 0 || pvis (i) <= plev (mynum))) {
++nr;
if (pvis (i) > 0)
sprintf (buff, "(%s)", pname (i));
else
strcpy (buff, pname (i));
bprintf ("%-*s%c",
PNAME_LEN + 3, buff, (nr % COLUMNS) ? ' ' : '\n');
}
}
bprintf ("\n\nThere are %d mobiles left (from %d)\n",
nr, last - first);
}
/* The STATS command WITHOUT arguments.
*/
static void
ustats (void)
{
static char *WizLevs[] =
{
NULL, "Appr", "Dorq", "Emrt", "Wiz", "Prpt",
"AWiz", "Advr", "Avtr", "God", "MUsr"};
int i, j;
int a[256], a_len = 0;
char buff[256], loginbuff[64], idlebuff[64];
if (plev (mynum) < LVL_WIZARD) {
erreval ();
return;
}
for (i = 0; i < max_players; i++)
if (is_in_game (i) && (pvis (i) <= plev (mynum) || i == mynum))
a[a_len++] = i;
qsort (a, a_len, sizeof (int), cmp_player);
bprintf ("&+CLevel Name Str/Max Mag/Max DP AC Vis Idle On For Location\n");
bprintf ("&+b-------------------------------------------------------------------------------\n");
for (j = 0; i = a[j], j < a_len; ++j) {
if (ststflg (i, SFL_FREAQ))
bprintf ("&+w&+B[&+G%4.4s&+B]", "FreQ");
else if (plev (i) <= LVL_WIZARD)
bprintf ("&+w&+B[&+w%4d&+B]", plev (i));
else
bprintf ("&+w&+B[&+W%4.4s&+B]", WizLevs[wlevel (plev (i))]);
bprintf (" &+w%-*s", PNAME_LEN, pname (i));
if (plev (i) < LVL_WIZARD)
bprintf (" %s%3d&+C/&+W%-3d %s%3d&+C/&+W%-3d &+B%2d %2d ",
str_color (i), pstr (i), maxstrength (i),
mag_color (i), pmagic (i), maxmagic (i),
player_damage (i),
player_armor (i) > MAXARMOR ?
MAXARMOR : player_armor (i));
else
bprintf (" &+w---&+C/&+w--- ---&+C/&+w--- -- -- ");
if (pvis (i) < 999)
bprintf ("&+w%3d", pvis (i));
else
bprintf ("&+WInv&+w");
if (ptstflg (mynum, PFL_SEEIDLE)) {
strcpy (idlebuff, sec_to_hhmmss (global_clock - prlast_cmd (i)));
} else {
strcpy (idlebuff, sec_to_hhmmss (global_clock - plast_cmd (i)));
}
bprintf (" %8.8s", idlebuff);
strcpy (loginbuff, sec_to_hhmmss (global_clock - plogged_on (i)));
bprintf (" %8.8s", loginbuff);
bprintf (" %-15.15s\n", xshowname (buff, ploc (i)));
}
bprintf ("&+b-------------------------------------------------------------------------------\n");
}
/* The STATS command
*/
void
showplayer (void)
{
extern char *Mflags[];
char buff[256];
PERSONA d;
int b;
int max_str, max_mag;
int armor;
long w;
char *title, *name;
Boolean in_file, is_mobile;
Boolean is_female;
if (!ptstflg (mynum, PFL_STATS)) {
erreval ();
return;
}
if (brkword () == -1) {
ustats ();
return;
}
if ((b = fpbns (wordbuf)) != -1 && seeplayer (b)) {
in_file = False;
is_mobile = b >= max_players;
player2pers (&d, NULL, b);
name = pname (b);
title = is_mobile ? NULL : ptitle (b);
d.p_home = find_loc_by_id (is_mobile ? ploc_reset (b) : phome (b));
max_str = is_mobile ? pstr_reset (b) : maxstrength (b);
max_mag = is_mobile ? 0 : maxmagic (b);
is_female = ststflg (b, SFL_FEMALE);
} else if (getuaf (wordbuf, &d)) {
in_file = True;
is_mobile = False;
title = d.p_title;
name = d.p_name;
max_str = pmaxstrength (d.p_level);
max_mag = pmaxmagic (d.p_level);
is_female = xtstbit (d.p_sflags.l, SFL_FEMALE);
} else {
bprintf ("Who's that?\n");
return;
}
bprintf ("&+WName &+C: &+w%s", name);
if (!is_mobile) {
bprintf ("\n&+WTitle &+C: &+w%s", make_title (title, "<name>"));
bprintf ("\n&+WScore &+C: &+w%d", d.p_score);
bprintf ("\n&+WLevel &+C: &+w%d &+B(&*%s&+B)", d.p_level,
( d.p_level < 0 ) ? "Mobile\0" :
d.p_level < LVL_WIZARD ? is_female ? FLevels[d.p_level]
: MLevels[d.p_level] : WizLevels[wlevel (d.p_level)]);
}
bprintf ("\n&+WStrength &+C: &+w%d / %d", d.p_strength, max_str);
if (!is_mobile)
bprintf ("\n&+WMagic &+C: &+w%d / %d", d.p_magic, max_mag);
if (!in_file && (w = pwpn (b)) != -1 && iscarrby (w, b) && iswielded (w)) {
int w_damage = is_mobile ? odamage (w) / 2 : odamage (w);
w_damage += d.p_damage;
bprintf ("\n&+WDamage &+C: &+w%d &+B(&+CWielding: &*%s&+B)",
w_damage, oname (w));
} else {
bprintf ("\n&+WDamage &+C: &+w%d", d.p_damage);
}
if (!in_file) {
if (player_armor (b) > d.p_armor)
bprintf ("\n&+WArmor &+C: &+w%d / %d &+B(&+CWorn AC: &*%d&+B)",
player_armor (b), MAXARMOR, player_armor (b) - d.p_armor);
else
bprintf ("\n&+WArmor &+C: &+w%d / %d", armor = d.p_armor, MAXARMOR);
} else {
bprintf ("\n&+WArmor &+C: &+w%d / %d", armor = d.p_armor, MAXARMOR);
}
if (!is_mobile)
bprintf ("\n&+WKill/Death &+C: &+w%d / %d &+B(&+CRatio: &*%d%%&+B)",
d.p_killed, d.p_died, make_kd_ratio (d.p_killed, d.p_died));
bprintf ("\n&+WVisibility &+C: &+w%d", d.p_vlevel);
if (is_mobile) {
bprintf ("\n&+WAggression &+C: &+w%d %%", pagg (b));
bprintf ("\n&+WSpeed &+C: &+w%d", pspeed (b));
bprintf ("\n&+W%s &+C: &+w%s",
zpermanent (pzone (b)) ? "Zone " : "Owner", zname (pzone (b)));
}
bprintf ("\n&+WWimpy &+C: &+w%d", d.p_wimpy);
if (!in_file)
bprintf ("\n&+WLanguage &+C: &+w%s", Nflags[plang (b)]);
if (exists (d.p_home))
bprintf ("\n&+WStart &+C: &+w%s &+B(&*%s&+B)",
sdesc (d.p_home), xshowname (buff, d.p_home));
if (!in_file) {
bprintf ("\n&+WLocation &+C: &+w%s &+B(&*%s&+B)",
sdesc (ploc (b)), xshowname (buff, ploc (b)));
bprintf ("\n&+WCondition &+C:&+w");
if (pfighting (b) >= 0)
bprintf (" Fighting %s", pname (pfighting (b)));
else if (phelping (b) >= 0)
bprintf (" Helping %s", pname (phelping (b)));
else if (psitting (b))
bprintf (" Sitting");
else
bprintf (" Standing");
if (is_mobile) {
bprintf ("\n&+WBehavior &+C: &+w");
show_bits ((int *) &mflags (b), sizeof (MFLAGS) / sizeof (int), Mflags);
} else if (ptstflg (mynum, PFL_SHUSER)) {
bprintf ("\n&+WFrom Host &+C: &+w%s",
!ptstflg (mynum, PFL_SEEUSER) ? players[b].hostname :
players[b].usrname);
}
} else {
bprintf ("\n&+WLast on &+C: &+w%s", time2ascii (d.p_last_on));
if (ptstflg (mynum, PFL_SHUSER))
bprintf ("\n&+WFrom Host &+C: &+w%s",
!ptstflg (mynum, PFL_SEEUSER) ? d.p_last_host : d.p_usrname);
}
if ((d.p_sflags.l != 0) || (d.p_sflags.h != 0)) {
if (!is_mobile)
bprintf ("\n");
bprintf ("&+WVarious &+C: &+w");
if (plev (mynum) <= d.p_level && b != mynum)
bprintf ("Unknown\n");
else {
bprintf ("\n");
show_bits ((int *) &(d.p_sflags), sizeof (SFLAGS) / sizeof (int), Sflags);
}
}
bprintf ("\n");
}
/* The MOBILE command
*/
void
mobilecom (void)
{
int i, ct, zone, live, dead;
Boolean list_all = True;
int first = max_players;
int last = numchars;
i = ct = zone = live = dead = 0;
if (plev (mynum) < LVL_WIZARD) {
erreval ();
return;
}
if (brkword () != -1) {
list_all = False;
if ((zone = get_zone_by_name (wordbuf)) == -1) {
bprintf ("No such zone: %s\n", wordbuf);
return;
}
first = 0;
last = znumchars (zone);
}
bprintf ("Mobiles");
if (the_world->w_mob_stop)
bprintf (" [Currently STOPped]");
bprintf ("\n\n");
for (ct = first; ct < last; ++ct) {
i = list_all ? ct : zmob_nr (ct, zone);
bprintf ("[%d] %-*s %c", i + GLOBAL_MAX_OBJS, MNAME_LEN,
EMPTY (pname (i)) ? pname_reset (i) : pname (i),
ststflg (i, SFL_OCCUPIED) ? '*' : ' ');
if (EMPTY (pname (i))) {
bprintf ("<QUIT or KICKED OFF>\n");
++dead;
} else {
desrm (ploc (i), IN_ROOM);
if (pstr (i) < 0)
++dead;
else
++live;
}
}
bprintf ("\nA total of %d live mobile(s) + %d dead = %d.\n",
live, dead, live + dead);
}