drm/player/
#include <stdio.h>
#include <stdlib.h>
#include "merc.h"

int bitcount ( char ch )
{
    int bit, count = 0;

    for ( bit = 1 << 7; bit > 0; bit >>= 1 )
    {
        if ( ch & bit )
            count++;
    }

    return count;
}

int roomcount ( CHAR_DATA * ch )
{
    int index = 0, count = 0;

    if ( IS_NPC ( ch ) )
        return 0;

    for ( index = 0; index < MAX_EXPLORE; index++ )
    {
        count += bitcount ( ch->pcdata->explored[index] );
    }

    return count;
}

int areacount ( CHAR_DATA * ch )
{
    long index = 0;
    int count = 0;

    if ( IS_NPC ( ch ) )
        return 0;

    if ( ( ch->in_room == NULL ) || ( ch->in_room->area == NULL ) )
        return 0;

    for ( index = ch->in_room->area->min_vnum;
          index <= ch->in_room->area->max_vnum; index++ )
    {
        count += getbit ( ch->pcdata->explored, index );
    }

    return count;
}

int arearooms ( CHAR_DATA * ch )
{
    int count = 0;
    int index = 0;

    if ( IS_NPC ( ch ) )
        return 0;

    if ( ( ch->in_room == NULL ) || ( ch->in_room->area == NULL ) )
        return 0;

    for ( index = ch->in_room->area->min_vnum;
          index <= ch->in_room->area->max_vnum; index++ )
    {
        if ( get_room_index ( index ) != NULL )
            count++;
    }

    return count;
}

void setbit ( char *explored, int index )
{
    explored[index / 8] |= 1 << ( index % 8 );
    return;
}

int getbit ( char *explored, int index )
{
    return ( IS_SET ( explored[index / 8], 1 << ( index % 8 ) ) != 0 );
}

void fwrite_rle ( char *explored, FILE * fp )
{
    int index;
    int bit = 0;
    int count = 0;

    fprintf ( fp, "RoomRLE      %d", bit );

    for ( index = 0; index < ( MAX_EXPLORE * 8 ) - 1; index++ )
    {
        if ( getbit ( explored, index ) == bit )
            count++;
        else
        {
            fprintf ( fp, " %d", count );
            count = 1;
            bit = getbit ( explored, index );
        }
    }
    fprintf ( fp, " %d -1\n", count );
    return;
}

void fread_rle ( char *explored, FILE * fp )
{
    int index;
    int bit = 0;
    int count = 0;
    int pos = 0;

    index = 0;

    bit = fread_number ( fp );

    for ( ;; )
    {
        count = fread_number ( fp );

        if ( count < 0 )
            break;
        if ( count == 0 )
            continue;

        do
        {
            if ( bit == 1 )
                explored[index / 8] |= 1 << ( index % 8 );
            index++;
        }
        while ( index < pos + count );
        pos = index;
        bit = ( bit == 1 ) ? 0 : 1;
    }
    return;
}

CH_CMD ( do_explored )
{
    if ( IS_NPC ( ch ) )
        return;

    if ( argument[0] == '\0' )
    {
        send_to_char ( "{wUsage:\n\r"
                       "{Yexplored world - {WShow total amount of the explored\n\r"
                       "{Yexplored area  - {WShow total amount of the current area explored.{x\n\r",
                       ch );

        return;
    }

    if ( !str_cmp ( argument, "world" ) )
    {
        int rcnt = roomcount ( ch );
        double rooms = top_room, percent = ( double ) rcnt / ( rooms / 100 );

        printf_to_char ( ch,
                         "You have explored {W%d {Wof {W%d rooms "
                         "({W%.2f%% of the mud)\n\r{x", rcnt, top_room,
                         percent );

        return;
    }

    else if ( !str_cmp ( argument, "area" ) )
    {
        int rcnt = areacount ( ch );
        double rooms = ( double ) ( arearooms ( ch ) );
        double percent = ( double ) rcnt / ( rooms / 100 );

        printf_to_char ( ch,
                         "You have explored {W%d of {W%d {wrooms in "
                         "this area. ({W%.2f%%)\n\r{x", rcnt,
                         arearooms ( ch ), percent );

        return;
    }
    else
    {
        do_explored ( ch, "" );
        return;
    }
}