/******************************************************
Desolation of the Dragon MUD II
(C) 1997-2003 Jesse DeFer
http://www.dotd.com dotd@dotd.com
******************************************************/
#include <stdio.h>
#include "mud.h"
extern int top_room;
extern int top_mob_index;
extern int top_obj_index;
static VTRACK_DATA *new_vtrack(int vnum)
{
VTRACK_DATA *vt;
CREATE(vt, VTRACK_DATA, 1);
vt->vnum = vnum;
vt->flags = 0;
vt->next = NULL;
return vt;
}
void free_vtracks(CHAR_DATA *ch)
{
VTRACK_DATA *vt, *vt_next;
if (IS_NPC(ch))
return;
vt = ch->pcdata->vtrack;
while (vt)
{
vt_next = vt->next;
DISPOSE(vt);
vt = vt_next;
}
ch->pcdata->vtrack = NULL;
}
static VTRACK_DATA *find_vtrack_vnum(CHAR_DATA *ch, int vnum)
{
VTRACK_DATA *vt;
vt = ch->pcdata->vtrack;
while (vt)
{
if (vt->vnum == vnum)
return vt;
vt = vt->next;
}
return NULL;
}
void vtrack_add(CHAR_DATA *ch, int vnum, int flags)
{
VTRACK_DATA *vt;
if (IS_NPC(ch) || vnum <= 0)
return;
if ((vt = find_vtrack_vnum(ch, vnum)))
{
SET_BIT(vt->flags, flags);
return;
}
vt = new_vtrack(vnum);
vt->flags = flags;
vt->next = ch->pcdata->vtrack;
ch->pcdata->vtrack = vt;
}
void fwrite_vtracks(CHAR_DATA *ch, FILE *fp)
{
VTRACK_DATA *vt;
if (!ch || IS_NPC(ch) || !ch->pcdata->vtrack)
return;
fprintf(fp, "#VTRACK\n");
for (vt = ch->pcdata->vtrack; vt; vt = vt->next)
fprintf(fp, "%d %d\n", vt->vnum, vt->flags);
fprintf(fp, "0\n\n");
}
void fread_vtracks(CHAR_DATA *ch, FILE *fp)
{
char *line;
int x1, x2;
while (!feof(fp))
{
line = fread_line( fp );
x1=x2=0;
sscanf( line, "%d %d",
&x1, &x2 );
if (x1 == 0)
break;
vtrack_add(ch, x1, x2);
}
}
int vtrack_count(CHAR_DATA *ch, int flag)
{
VTRACK_DATA *vt;
int count = 0;
if (IS_NPC(ch) || !ch->pcdata->vtrack)
return 0;
for (vt = ch->pcdata->vtrack; vt; vt = vt->next)
if (IS_SET(vt->flags, flag))
count++;
return count;
}
float vtrack_percent(CHAR_DATA *ch, int flag)
{
int total, count;
switch (flag)
{
case VTRACK_ROOM:
total = top_room;
break;
case VTRACK_OBJ:
total = top_obj_index;
break;
case VTRACK_MOB:
case VTRACK_MOBKILL:
total = top_mob_index;
break;
default:
bug("vtrack_percent: flag %d not handled by case", flag);
return 0;
break;
}
if (total == 0)
return 0;
count = vtrack_count(ch, flag);
return ((float)count*100.0/(float)total);
}