/*
rank.c for FredMUD
by Slug
November 1996
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <malloc.h>
#include <stdlib.h>
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "spells.h"
#include "limits.h"
/* extern vars */
extern struct room_data *world;
extern struct char_data *character_list;
extern struct descriptor_data *descriptor_list;
extern struct index_data *obj_index;
extern struct index_data *mob_index;
extern int bytetotal[];
extern int reboottime;
extern struct player_index_element *player_table;
/* extern functions */
struct time_info_data age(struct char_data *ch);
#ifdef NEEDS_STRDUP
char *strdup(char *source);
#endif
#define GET_PKILLS(ch) ((ch)->points.pkills)
#define GET_PDEATHS(ch) ((ch)->points.pdeaths)
#define MAX_RANKED 128
#define GET_KILLS(ch) ((ch)->points.kills)
#define GET_DEATHS(ch) ((ch)->points.deaths)
#define GET_KEY(cc,tk) ((*((tk)->function))(cc))
typedef char *ranktype;
struct key_data {
char *keystring;
char *outstring;
ranktype (*function)(struct char_data *ch);
int usage;
struct key_data *next;
};
struct rank_data {
struct char_data *ch;
char key[80];
};
ranktype rank_gut(struct char_data *ch);
ranktype rank_food(struct char_data *ch);
ranktype rank_drink(struct char_data *ch);
ranktype rank_drunk(struct char_data *ch);
ranktype rank_hp(struct char_data *ch);
ranktype rank_mana(struct char_data *ch);
ranktype rank_moves(struct char_data *ch);
ranktype rank_hpr(struct char_data *ch);
ranktype rank_manar(struct char_data *ch);
ranktype rank_movesr(struct char_data *ch);
ranktype rank_str(struct char_data *ch);
ranktype rank_int(struct char_data *ch);
ranktype rank_wis(struct char_data *ch);
ranktype rank_dex(struct char_data *ch);
ranktype rank_con(struct char_data *ch);
ranktype rank_fitness(struct char_data *ch);
ranktype rank_hitroll(struct char_data *ch);
ranktype rank_damroll(struct char_data *ch);
ranktype rank_armor(struct char_data *ch);
ranktype rank_mr(struct char_data *ch);
ranktype rank_meta(struct char_data *ch);
ranktype rank_mb(struct char_data *ch);
ranktype rank_xp(struct char_data *ch);
ranktype rank_height(struct char_data *ch);
ranktype rank_weight(struct char_data *ch);
ranktype rank_fatness(struct char_data *ch);
ranktype rank_coolness(struct char_data *ch);
ranktype rank_input(struct char_data *ch);
ranktype rank_output(struct char_data *ch);
ranktype rank_ipm(struct char_data *ch);
ranktype rank_opm(struct char_data *ch);
ranktype rank_motion(struct char_data *ch);
ranktype rank_speed(struct char_data *ch);
ranktype rank_gold(struct char_data *ch);
ranktype rank_bank(struct char_data *ch);
ranktype rank_age(struct char_data *ch);
ranktype rank_days(struct char_data *ch);
ranktype rank_kills(struct char_data *ch);
ranktype rank_deaths(struct char_data *ch);
ranktype rank_kd(struct char_data *ch);
ranktype rank_kh(struct char_data *ch);
ranktype rank_practices(struct char_data *ch);
ranktype rank_boner(struct char_data *ch);
ranktype rank_pow(struct char_data *ch);
ranktype rank_pkills(struct char_data *ch);
ranktype rank_pdeaths(struct char_data *ch);
ranktype rank_pkd(struct char_data *ch);
ranktype rank_xpt(struct char_data *ch);
ranktype rank_xptm(struct char_data *ch);
ranktype rank_bonk(struct char_data *ch);
ranktype rank_argle(struct char_data *ch);
ranktype rank_time(struct char_data *ch);
ranktype rank_sickness(struct char_data *ch);
ranktype rank_commands(struct char_data *ch);
ranktype rank_cph(struct char_data *ch);
int rank_compare_top(const void *n1, const void *n2);
int rank_compare_bot(const void *n1, const void *n2);
int char_compare(const void *n1, const void *n2);
void eat_spaces(char **source);
void init_keys(void);
void add_key(char *key,char *out,ranktype (*f)(struct char_data *ch));
struct key_data *search_key(char *key);
struct key_data *key_list = NULL;
struct key_data *key_list_tail = NULL;
struct key_data *the_key = NULL;
int maxkeylength = 5; /* used for formatting in rankhelp */
int maxoutlength = 5;
int keys_inited = FALSE;
int KEY_PRINTING = FALSE; /* used by rank functions sometimes */
int KEY_SPAMMING = FALSE;
char kbuf[80]; /* used by rank functions */
char xbuf[50]; /* used for to_long_long output */
char *kbp;
int mud_birth;
struct rank_data tt[MAX_RANKED];
void do_slug_rank(struct char_data *ch, char *arg, int cmd)
{
int i,j,k;
int rk;
int toprank;
char buffer[MAX_STRING_LENGTH];
char keybuf[MAX_STRING_LENGTH], nbuf[MAX_STRING_LENGTH];
char nbufnp[MAX_STRING_LENGTH];
struct char_data *c, *tc;
struct descriptor_data *d;
char *nbufp;
struct key_data *tk;
struct char_file_u tmp_store;
int load_char(char *name, struct char_file_u *char_element);
if (!keys_inited) {
init_keys();
keys_inited = TRUE;
/*
i= load_char(player_table->name,&tmp_store);
mud_birth = tmp_store.birth;
*/
}
if (IS_NPC(ch))
return;
while (arg[0] == ' ')
arg++;
half_chop(arg, keybuf, nbuf);
nbufp = nbuf;
if(!strlen(keybuf)) strcpy(keybuf,"help");
the_key = search_key(keybuf);
if (the_key == NULL) {
send_to_char("Please specify a valid key. Type \"rank help\" for instructions.\n\r",ch);
return;
}
the_key->usage++;
if (!strcmp(the_key->keystring,"frequency")) {
send_to_char("Unimplemented Rank Key\n\r",ch);
}
else
if (!strcmp(the_key->keystring,"usage")) {
buffer[0] = '\0';
j = 80 / (maxkeylength+9);
i=0;
send_to_char("Key Usage Statistics.\n\r", ch);
for(tk=key_list;tk;tk=tk->next) {
sprintf(kbuf,"%*s: %6d ",maxkeylength,tk->keystring,tk->usage);
strcat(buffer,kbuf);
if (++i % j == 0) strcat(buffer,"\n\r");
}
strcat(buffer,"\n\r");
send_to_char(buffer, ch);
}
else
if (!strcmp(the_key->keystring,"debug")) {
strcpy(buffer,"Experience data for each tick.\n\r");
for(i=0;i<MAX_META_SAMPLES;i++) {
to_long_long(xbuf,(long long)ch->specials.metadata[i]);
sprintf(kbuf,"%3d: %20s",i,xbuf);
/*
sprintf(kbuf,"%3d: %20d",i,ch->specials.metadata[i]);
*/
strcat(buffer,kbuf);
if (i%3 == 2) strcat(buffer,"\n\r");
}
strcat(buffer,"\n\r");
send_to_char(buffer,ch);
to_long_long(xbuf,(long long)ch->specials.metadata[MAX_META_SAMPLES]);
sprintf(buffer,"Currently on tick #%s\n\r",xbuf);
send_to_char(buffer,ch);
} /* end debug */
else
if (!strcmp(the_key->keystring,"spam")) {
send_to_char("Valid keys and your values.\n\r", ch);
KEY_SPAMMING = KEY_PRINTING = TRUE;
k=FALSE; /* found first hidden key yet? */
for(tk=key_list;(tk && !k);tk=tk->next) {
if(!strcmp(tk->keystring,"boner")) k=1;
else
if (tk->function != NULL) {
strcpy(kbuf,GET_KEY(ch,tk));
for(kbp=kbuf;*kbp == ' ';kbp++);
sprintf(buffer, "%*s = %*s = %*s\n\r",maxkeylength,tk->keystring, maxoutlength,tk->outstring,
18,kbp);
send_to_char(buffer, ch);
}
}
KEY_SPAMMING = KEY_PRINTING = FALSE;
}
else
if (!strcmp(the_key->keystring,"help")) {
send_to_char("Valid keys:\n\r", ch);
j = 80 / (maxkeylength+1);
i = 0;
buffer[0] = '\0';
k=FALSE; /* reached first hidden key */
for(tk=key_list;(tk && !k);tk=tk->next) {
if(!strcmp(tk->keystring,"boner")) k=1;
else {
sprintf(kbuf,"%*s ",maxkeylength,tk->keystring);
strcat(buffer,kbuf);
if (++i % j == 0) strcat(buffer,"\n\r");
}
}
strcat(buffer,"\n\r");
strcat(buffer,"Usage: rank <key> [+-][max]\n\r");
send_to_char(buffer,ch);
}
else
{
k = 0;
for (d = descriptor_list; d; d = d->next) {
if (!d->connected) {
c = d->original ? d->original : d->character;
if (CAN_SEE(ch, c)) {
if (k) {
if (k < MAX_RANKED) {
tt[k].ch = c;
k++;
} else { /*list is full */
tt[k].ch = c;
}
} else { /* first player in list */
tt[k].ch = c;
k++;
}
}
}
}
toprank = TRUE;
if (!strcmp(the_key->keystring,"deaths"))
toprank = FALSE;
if (*nbufp == '-') {
toprank = FALSE;
nbufp++;
} else if (*nbufp == '+') {
toprank = TRUE;
nbufp++;
}
rk = atoi(nbufp);
if (rk == 0)
rk = 20;
if (k < rk)
rk = k;
for(i=0;i<k;i++)
strcpy(tt[i].key,GET_KEY(tt[i].ch,the_key));
/* sort */
if (toprank)
qsort(tt, k, sizeof(struct rank_data), rank_compare_top);
else
qsort(tt, k, sizeof(struct rank_data), rank_compare_bot);
/*print out */
KEY_PRINTING = TRUE;
sprintf(buffer, "%s %d players ranked by %s.\n\r", toprank ? "Top" : "Bottom", rk, the_key->outstring);
send_to_char(buffer, ch);
for (i = 0; i < rk; i++) {
strcpy(kbuf,GET_KEY(tt[i].ch,the_key));
for(kbp=kbuf;*kbp == ' ';kbp++);
sprintf(buffer, "#%2d: %15s %*s\n\r", i + 1, GET_NAME(tt[i].ch),18, kbp);
send_to_char(buffer, ch);
}
send_to_char("OK.\n\r", ch);
}
}
void init_keys(void) {
/* put the add_keys in the order you want them displayed in help */
add_key("hp","hit points",rank_hp);
add_key("mana","mana points",rank_mana);
add_key("moves","move points",rank_moves);
add_key("powerpoints","powerpoints",rank_pow);
add_key("hpr","hit point regen rate",rank_hpr);
add_key("manar","mana regen rate",rank_manar);
add_key("movesr","move point regen rate",rank_movesr);
add_key("strength", "strength",rank_str);
add_key("intel","intelligence",rank_int);
add_key("wisdom", "wisdom",rank_wis);
add_key("dexterity","dexterity",rank_dex);
add_key("const","constitution",rank_con);
add_key("fitness", "sum of stats",rank_fitness);
add_key("hitroll","hit bonus",rank_hitroll);
add_key("damroll", "damage bonus",rank_damroll);
add_key("armor","armor",rank_armor);
add_key("mr", "magic resistance",rank_mr);
add_key("meta","meta points",rank_meta);
add_key("mbonus","meta bonus",rank_mb);
add_key("xp","experience points",rank_xp);
add_key("xpt","average xp/tick last 100 ticks",rank_xpt);
add_key("xptmax","max xp/tick last 100 ticks",rank_xptm);
add_key("height","height",rank_height);
add_key("weight","weight",rank_weight);
add_key("fatness","fatness",rank_fatness);
add_key("coolness","coolness",rank_coolness);
add_key("input","bytes sent by player",rank_input);
add_key("output","bytes sent to player",rank_output);
add_key("ipm","input bytes per minute",rank_ipm);
add_key("opm","output bytes per minute",rank_opm);
add_key("motion","rooms passed through",rank_motion);
add_key("speed","rooms per minute",rank_speed);
add_key("bonk","walls impacted",rank_bonk);
add_key("argle","typos",rank_argle);
add_key("commands","successful commands",rank_commands);
add_key("cph","commands per hour",rank_cph);
add_key("gold","gold carried",rank_gold);
add_key("bank","bank balance",rank_bank);
add_key("age","age",rank_age);
add_key("days","days played",rank_days);
add_key("time","connect time this boot",rank_time);
add_key("sickness","addiction factor",rank_sickness);
add_key("kills","kills",rank_kills);
add_key("deaths","deaths",rank_deaths);
add_key("kd","kills to deaths ratio",rank_kd);
add_key("kph","kills per hour",rank_kh);
add_key("practices","practices",rank_practices);
add_key("gut","stomach capacity",rank_gut);
add_key("food","units of food in gut",rank_food);
add_key("drink","units of liquid in gut",rank_drink);
add_key("drunk","alcohol content",rank_drunk);
/* NOT IN UNTIL PFILE CAN BE REVISED
add_key("pkills","player kills",rank_pkills);
add_key("pdeaths","player deaths",rank_pdeaths);
add_key("pkd","player kd ratio",rank_pkd);
*/
add_key("help","help",NULL);
add_key("spam","spam",NULL);
/* any keys including and after "boner" will not show up in help or spam */
add_key("boner","length in millimeters",rank_boner);
add_key("debug","debug",NULL);
add_key("usage","usage",NULL);
add_key("frequency","frequency",NULL);
} /* end init_keys */
struct key_data *search_key(char *key) {
struct key_data *tk;
if (strlen(key))
for(tk=key_list;tk;tk=tk->next)
if (!strncmp(tk->keystring,key,strlen(key))) return tk;
return NULL;
} /* end search_key */
void add_key(char *key,char *out,ranktype (*f)(struct char_data *ch)) {
struct key_data *tmp_key;
CREATE(tmp_key,struct key_data,1);
tmp_key->keystring = strdup(key);
tmp_key->outstring = strdup(out);
tmp_key->function = f;
tmp_key->usage = 0;
tmp_key->next = NULL;
maxkeylength = MAX(maxkeylength,strlen(key));
maxoutlength = MAX(maxoutlength,strlen(out));
/* append to list */
if (!key_list) key_list = key_list_tail = tmp_key;
else {
key_list_tail->next = tmp_key;
key_list_tail = tmp_key;
}
} /* end add_key */
void eat_spaces(char **source) {
while (**source == ' ') (*source)++;
} /* end eat_spaces */
char k1[80];
char k2[80];
int rank_compare_top(const void *n1, const void *n2)
{
strcpy(k1,(*((struct rank_data *) n1)).key);
strcpy(k2,(*((struct rank_data *) n2)).key);
return(strcmp(k2,k1));
}
int char_compare(const void *n1, const void *n2)
{
return ((*((char *) n1)) - (*((char *) n2)));
}
int rank_compare_bot(const void *n1, const void *n2)
{
strcpy(k1,(*((struct rank_data *) n1)).key);
strcpy(k2,(*((struct rank_data *) n2)).key);
return(strcmp(k1,k2));
}
/* RANK FUNCTIONS */
ranktype rank_commands(struct char_data *ch) {
sprintf(kbuf,"%20d",(ch)->specials.commands);
return(kbuf);
} /* end rank_commands */
ranktype rank_cph(struct char_data *ch) {
long secs;
float per;
secs = time(0) - ch->specials.connect_time;
per = 3600*ch->specials.commands;
per /= secs;
sprintf(kbuf,"%20.2f",per);
return(kbuf);
} /* end rank_cph */
ranktype rank_time(struct char_data *ch) {
long secs;
float per;
secs = time(0) - ch->specials.connect_time;
if (KEY_SPAMMING) {
sprintf(kbuf,"%3d:%02d:%02d",secs / 3600,
(secs %3600) / 60, (secs % 3600) % 60);
} else
if (KEY_PRINTING) {
per = secs;
per = per/(time(0) - reboottime);
sprintf(kbuf,"%3d:%02d:%02d = %4.2f %% of Running Time",secs / 3600,
(secs %3600) / 60, (secs % 3600) % 60, per*100);
}
else
sprintf(kbuf,"%d",secs);
return(kbuf);
} /* end rank_time */
ranktype rank_sickness(struct char_data *ch) {
long secs;
float per;
secs = ch->player.time.played + time(0) - ch->player.time.logon;
per = secs;
per = per/(time(0) - ch->player.time.birth); /*percent real time */
per *= per*secs/3600; /* times hours played */
per *=100;
sprintf(kbuf,"%20.2f",per);
return(kbuf);
} /* end rank_sickness */
ranktype rank_bonk(struct char_data *ch) {
sprintf(kbuf,"%20d",(ch)->specials.bonks);
return(kbuf);
} /* end rank_bonk */
ranktype rank_argle(struct char_data *ch) {
sprintf(kbuf,"%20d",(ch)->specials.argles);
return(kbuf);
} /* end rank_argle */
ranktype rank_xpt(struct char_data *ch) {
long long sum=0;
int i;
for(i=0;i<MAX_META_SAMPLES;i++) {
sum += (long long)(ch->specials.metadata[i]);
}
sum /= MIN(MAX_META_SAMPLES,1 + ch->specials.connect_tics);
to_long_long(xbuf,sum);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_xpt */
ranktype rank_xptm(struct char_data *ch) {
long long max;
int i;
max = 0;
for(i=0;i<MAX_META_SAMPLES;i++) {
if( (ch->specials.metadata[i]) > max)
max = (ch->specials.metadata[i]);
}
to_long_long(xbuf,max);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_xptm */
ranktype rank_mb(struct char_data *ch) {
sprintf(kbuf,"%20d",(ch)->specials.metabonus);
return(kbuf);
} /* end rank_mb */
ranktype rank_pow(struct char_data *ch){
long long sum;
sum = (long long)GET_MAX_HIT(ch) +
(long long)GET_MAX_MANA(ch) +
(long long)GET_MAX_MOVE(ch);
to_long_long(xbuf,sum);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_pow */
/*
ranktype rank_pkills(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_PKILLS(ch));
return(kbuf);
}
ranktype rank_pdeaths(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_PDEATHS(ch));
return(kbuf);
}
ranktype rank_pkd(struct char_data *ch) {
float rf;
rf = GET_PKILLS(ch);
sprintf(kbuf,"%20.2f",GET_PDEATHS(ch) ? rf / GET_PDEATHS(ch) :
rf);
return(kbuf);
}
*/
ranktype rank_hp(struct char_data *ch) {
long long sum;
sum = (long long)GET_MAX_HIT(ch);
to_long_long(xbuf,sum);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_hp */
ranktype rank_mana(struct char_data *ch) {
long long sum;
sum = (long long)GET_MAX_MANA(ch);
to_long_long(xbuf,sum);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_mana */
ranktype rank_moves(struct char_data *ch) {
long long sum;
sum = (long long)GET_MAX_MOVE(ch);
to_long_long(xbuf,sum);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_move */
ranktype rank_hpr(struct char_data *ch) {
sprintf(kbuf,"%20d",hit_gain(ch));
return(kbuf);
} /* end rank_hpr */
ranktype rank_manar(struct char_data *ch) {
sprintf(kbuf,"%20d",mana_gain(ch));
return(kbuf);
} /* end rank_manar */
ranktype rank_movesr(struct char_data *ch) {
sprintf(kbuf,"%20d",move_gain(ch));
return(kbuf);
} /* end rank_movesr */
ranktype rank_str(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_STR(ch));
return(kbuf);
} /* end rank_str */
ranktype rank_int(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_INT(ch));
return(kbuf);
} /* end rank_int */
ranktype rank_wis(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_WIS(ch));
return(kbuf);
} /* end rank_wis */
ranktype rank_dex(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_DEX(ch));
return(kbuf);
} /* end rank_dex */
ranktype rank_con(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_CON(ch));
return(kbuf);
} /* end rank_con */
ranktype rank_fitness(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_STR(ch) + GET_INT(ch) + GET_WIS(ch) + GET_DEX(ch) +
GET_CON(ch));
return(kbuf);
} /* end rank_fitness */
ranktype rank_hitroll(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_HITROLL(ch));
return(kbuf);
} /* end rank_hitroll */
ranktype rank_damroll(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_DAMROLL(ch));
return(kbuf);
} /* end rank_damroll */
ranktype rank_armor(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_AC(ch));
return(kbuf);
} /* end rank_armor */
ranktype rank_mr(struct char_data *ch) {
sprintf(kbuf,"%20d",(ch)->specials.magres);
return(kbuf);
} /* end rank_mr */
ranktype rank_meta(struct char_data *ch) {
long long sum;
sum = (long long)GET_META(ch);
to_long_long(xbuf,sum);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_meta */
ranktype rank_xp(struct char_data *ch) {
long long sum;
sum = (long long)GET_EXP(ch);
to_long_long(xbuf,sum);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_xp */
ranktype rank_height(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_HEIGHT(ch));
return(kbuf);
} /* end rank_height */
ranktype rank_weight(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_WEIGHT(ch));
return(kbuf);
} /* end rank_weight */
ranktype rank_fatness(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_WEIGHT(ch) * 100 / GET_HEIGHT(ch));
return(kbuf);
} /* end rank_fatness */
ranktype rank_coolness(struct char_data *ch) {
sprintf(kbuf,"%20d",(GET_LEVEL(ch)==9999) ? 100 :
((GET_GOLD(ch)+GET_EXP(ch))%100));
return(kbuf);
} /* end rank_coolness */
ranktype rank_input(struct char_data *ch) {
to_long_long(xbuf,(long long)(ch->specials.inbytes));
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_input */
ranktype rank_output(struct char_data *ch) {
to_long_long(xbuf,(long long)((ch)->specials.outbytes));
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_output */
ranktype rank_ipm(struct char_data *ch) {
long secs;
float ipm;
secs = (long)(time(0)-ch->specials.connect_time);
ipm = ch->specials.inbytes;
ipm *= 60;
ipm /= (secs);
sprintf(kbuf,"%20.2f",ipm);
return(kbuf);
} /* end rank_ipm */
ranktype rank_opm(struct char_data *ch) {
long secs;
float ipm;
secs = (long)(time(0)-ch->specials.connect_time);
ipm = ch->specials.outbytes;
ipm *= 60;
ipm /= (secs);
sprintf(kbuf,"%20.2f",ipm);
return(kbuf);
} /* end rank_opm */
ranktype rank_motion(struct char_data *ch) {
to_long_long(xbuf,(long long)ch->specials.rooms);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_motion */
ranktype rank_speed(struct char_data *ch) {
long secs;
float rpm;
secs = (long)(time(0)-ch->specials.connect_time);
rpm = ch->specials.rooms;
rpm *= 60;
rpm /= (secs);
sprintf(kbuf,"%20.2f",rpm);
return(kbuf);
} /* end rank_speed */
ranktype rank_gold(struct char_data *ch) {
to_long_long(xbuf,(long long)GET_GOLD(ch));
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_gold */
ranktype rank_bank(struct char_data *ch) {
to_long_long(xbuf,ch->points.bank);
sprintf(kbuf,"%27s",xbuf);
return(kbuf);
} /* end rank_bank */
ranktype rank_age(struct char_data *ch) {
if (KEY_PRINTING)
sprintf(kbuf,"%3d",(age(ch).year));
else
sprintf(kbuf,"%12d",-(ch)->player.time.birth);
return(kbuf);
} /* end rank_age */
ranktype rank_days(struct char_data *ch) {
int secs;
secs = ch->player.time.played + time(0) - ch->player.time.logon;
if (KEY_PRINTING)
sprintf(kbuf,"%3d days, %2d hours",secs / 3600 / 24,
(secs / 3600) % 24);
else
sprintf(kbuf,"%d",secs);
return(kbuf);
} /* end rank_days */
ranktype rank_kills(struct char_data *ch) {
sprintf(kbuf,"%20d",(ch)->points.kills);
return(kbuf);
} /* end rank_kills */
ranktype rank_deaths(struct char_data *ch) {
sprintf(kbuf,"%20d",(ch)->points.deaths);
return(kbuf);
} /* end rank_deaths */
ranktype rank_kd(struct char_data *ch) {
float rf;
rf = GET_KILLS(ch);
sprintf(kbuf,"%20.2f",GET_DEATHS(ch) ? rf / GET_DEATHS(ch) : rf);
return(kbuf);
} /* end rank_kd */
ranktype rank_kh(struct char_data *ch) {
int secs;
float rf;
secs = ch->player.time.played +time(0) - ch->player.time.logon;
rf = GET_KILLS(ch);
rf *= 3600;
rf /= secs;
sprintf(kbuf,"%20.2f",rf);
return(kbuf);
} /* end rank_kh */
ranktype rank_practices(struct char_data *ch) {
sprintf(kbuf,"%20d",ch->specials.spells_to_learn);
return(kbuf);
} /* end rank_practices */
/* Four stomach ranks */
ranktype rank_gut(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_GUT(ch));
return(kbuf);
}
ranktype rank_food(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_COND(ch,FULL));
return(kbuf);
}
ranktype rank_drink(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_COND(ch,THIRST));
return(kbuf);
}
ranktype rank_drunk(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_COND(ch,DRUNK));
return(kbuf);
}
ranktype rank_boner(struct char_data *ch) {
sprintf(kbuf,"%20d",GET_STR(ch) * 100 / (GET_INT(ch) ? GET_INT(ch) : 1));
return(kbuf);
} /* end rank_boner */