/
area/city/
area/crypts/
area/guilds/
area/psuedowild/
area/religion/
data/documents/MPDocs/
data/html/
data/mobprogs/
data/quest/
data/world/
data/world/_utilities/
data/world/images/
design/html/
notes/
player/
#include <sys/types.h>
#include <sys/time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include "magic.h"
#include "recycle.h"
#include "tables.h"
#include "lookup.h"
#include "religion.h"
#include "player.h"
#include "faction.h"

#define ptc printf_to_char

char * word_health      (CHAR_DATA * ch);
char * word_magic       (CHAR_DATA * ch);
char * alignment_lookup (CHAR_DATA * ch, bool short_align);
char * word_armorclass  (CHAR_DATA * ch, bool number);
void display_faction    (CHAR_DATA * ch);
char * score_stats      (int stat_value);

/*
 * do_score()
 *
 * Le Score Command
 */
void do_score(CHAR_DATA * ch, char *argument)
{

    if (ch->religion)
    ptc(ch, "You are %s %s%s, %s of %s\n\r", ch->name, ch->last_name, ch->pcdata->title, religionr_table[ch->rank].name, religion_table[ch->religion].name_of_church);
    else
    ptc(ch, "You are %s %s%s\n\r", ch->name, ch->last_name, ch->pcdata->title);
    
    ptc(ch, ".-----------------------------------------------------------------------------.\n\r");
    ptc(ch, "| Race:    {G%-10s{g     Class:     {G%-10s{g Level:      {G%-3d{g               |\n\r",  race_table[ch->race].name, class_table[ch->class].name, ch->level);
    ptc(ch, "| Sex:     {G%-10s{g     Alignment: {G%-10s{g Age:        {G%-3d{g               |\n\r",  ch->sex == 0 ? "sexless" : ch->sex == 1 ? "male" : "female", alignment_lookup(ch, TRUE), get_age (ch));
    ptc(ch, "| Voice:   {G%-10s{g     Eye Color: {G%-10s{g Hair Color: {G%-17s{g |\n\r",        voice_table[ch->voice].name, eye_table[ch->eye].name, hair_table[ch->hair].name); 
    ptc(ch, "| Height:  {G%-10s{g     Weight:    {G%-10s{g Birthsign:  {G%-17s{g |\n\r", height_table[ch->height].name, weight_table[ch->weight].name, return_birthsign(ch->birthsign));
    //ptc(ch, "| Concept: {G%-10s{g     Archtype:  {G%-10s{g Essence:    {G%-10s{g        |\n\r",        "Fix", "Fix", "Fix");
    
    if (IS_SET(ch->comm, COMM_FULLSCORE))
    {
        ptc(ch, "'-----------------------------------------------------------------------------.\n\r");
        do_stats(ch, "");
        return;
    }
    else
    {
        ptc(ch, "'-----------------------------------------------------------------------------'\n\r");
        ptc(ch, " %s (%d)\n\r", word_armorclass(ch, FALSE), ch->armor_class);
        ptc(ch, " %s\n\r", word_health(ch));
        ptc(ch, " %s\n\r", word_magic(ch));
        display_faction(ch);
        ptc(ch, "\n\n\t Other information availible via the '{Rstats{x' command.\n\r");
        return;
    }
}


/*
 * do_stats()
 *
 * The numbers
 */
/*
.-----------------------------------------------------------------------------.
| Hit points:   {G%-4d{g/{G%-4d{x     Health:     ++++%       Items Carried:  {G%-3d{g/{G%-3d{g |
| Mana Points:  {G%-4d{g/{G%-4d{x     Focus:      ++++%       Weight Carried: {G%-3d{g/{G%-3d{g |
| Move Poions:  {G%-4d{g/{G%-4d{x     Endurance:  ++++%       Practices:      {G%-3d{g     |
|-----------------------------------------------------------------------------|
| Strength:     {G%-2d{g({G%-2d{g)        Force:      {G%-2d{g          Armor Class:    {G%-3d{g     |
| Intelligence: {G%-2d{g({G%-2d{g)        Intuition:  {G%-2d{g          Base Atk Bonus: {G%-3d{g     |
| Wisdom:       {G%-2d{g({G%-2d{g)        Luck:       {G%-2d{g          Base Hit Bonus: {G%-3d{g     |
| Dexterity:    {G%-2d{g({G%-2d{g)        Speed:      {G%-2d{g          Wimpy:          {G%-4d{g    |
| Constitution: {G%-2d{g({G%-2d{g)        Resilience: {G%-2d{g          Base Saves:     {G%-3d{g     |
| Charisma:     {G%-2d{g({G%-2d{g)        Command:    {G%-2d{g          Size:           {G%-7s{g |
|-----------------------------------------------------------------------------|
| Total Exp:    {G%-12d{g  Exp TNL:    {G%-11s{g                         |
| Quest Points: {G%-12d{g  Bounty Pnts:%-11d{g                         |
| Banked Gold:  {G%-12d{g  Gold:       {G%-11s{g Silver:         {G%-7s{g |
'-----------------------------------------------------------------------------'
*/
void do_stats(CHAR_DATA * ch, char *argument)
{
    if (!IS_SET(ch->comm, COMM_FULLSCORE))
    {
        if (ch->religion)
        ptc(ch, "You are %s%s, %s of %s\n\r", ch->name, ch->pcdata->title, religionr_table[ch->rank].name, religion_table[ch->religion].name_of_church);
        else
        ptc(ch, "You are %s%s\n\r", ch->name, ch->pcdata->title);
        ptc(ch, ".-----------------------------------------------------------------------------.\n\r");
    }
    ptc(ch, "| Hit points:   {G%-4d{g/{G%-4d{x     Health:     {G%-3d{g%s        Items Carried:  {G%-3d{g/{G%-3d{g |\n\r", ch->hit, ch->max_hit, ch->regen[0], "%", ch->carry_number, can_carry_n (ch));
    ptc(ch, "| Mana Points:  {G%-4d{g/{G%-4d{x     Focus:      {G%-3d{g%s        Weight Carried: {G%-3d{g/{G%-3d{g |\n\r", ch->mana, ch->max_mana, ch->regen[1], "%", get_carry_weight (ch) / 10, can_carry_w (ch) / 10);
    ptc(ch, "| Move Poions:  {G%-4d{g/{G%-4d{x     Endurance:  {G%-3d{g%s        Practices:      {G%-3d{g     |\n\r", ch->move, ch->max_move, ch->regen[2], "%", ch->practice);
    ptc(ch, "|-----------------------------------------------------------------------------|\n\r");
    ptc(ch, "| Strength:     %-13s{g Force:      %-11s{g Armor Class:    {G%-6d{g  |\n\r",  score_stats(get_curr_stat (ch, STAT_STR)), score_stats(ch->multis[0]), ch->armor_class);
    ptc(ch, "| Intelligence: %-13s{g Intuition:  %-11s{g Base Atk Bonus: {G%-6d{g  |\n\r",  score_stats(get_curr_stat (ch, STAT_INT)), score_stats(ch->multis[1]), GET_DAMROLL(ch));
    ptc(ch, "| Wisdom:       %-13s{g Luck:       %-11s{g Base Hit Bonus: {G%-6d{g  |\n\r",  score_stats(get_curr_stat (ch, STAT_WIS)), score_stats(ch->multis[2]), GET_HITROLL(ch));
    ptc(ch, "| Dexterity:    %-13s{g Speed:      %-11s{g Wimpy:          {G%-6d{g  |\n\r",   score_stats(get_curr_stat (ch, STAT_DEX)), score_stats(ch->multis[3]), ch->wimpy);
    ptc(ch, "| Constitution: %-13s{g Resilience: %-11s{g Base Saves:     {G%-6d{g  |\n\r",  score_stats(get_curr_stat (ch, STAT_CON)), score_stats(ch->multis[4]), ch->saving_throw);
    ptc(ch, "| Charisma:     %-13s{g Command:    %-11s{g Size:           {G%-7s{g |\n\r",      score_stats(get_curr_stat (ch, STAT_CHA)), score_stats(ch->multis[5]), size_table[ch->size].name);
    ptc(ch, "|-----------------------------------------------------------------------------|\n\r");
    ptc(ch, "| Total Exp:    {G%-12d{g  Exp TNL:    {G%-11d{g Base Attack:    {G%-4d{g    |\n\r", ch->exp, exp_needed_to_level(ch), ch->base_attack);
    ptc(ch, "| Quest Points: {G%-12d{g  Bounty:     {G%-11d{g                         |\n\r", ch->quest_curr, ch->bountypnts);
    ptc(ch, "| Banked Gold:  {G%-12d{g  Gold:       {G%-11d{g Silver:         {G%-7d{g |\n\r", ch->bank, ch->gold, ch->silver);
    ptc(ch, "'-----------------------------------------------------------------------------'\n\r");
    
    if (IS_SET(ch->comm, COMM_FULLSCORE))
    {
        ptc(ch, " %s (%d)\n\r", word_armorclass(ch, FALSE), ch->armor_class);
        ptc(ch, " %s\n\r", word_health(ch));
        ptc(ch, " %s\n\r", word_magic(ch));
        display_faction(ch);
        return;
    }
    return;
    
}

/*
 * word_health()
 *
 * Returns health num to some words, used for score
 */
char * word_health(CHAR_DATA * ch)
{
    int percent = 0;
    static char wound[MSL];

    wound[0] = '\0';

    if (ch->max_hit > 0)
        percent = ch->hit * 100 / ch->max_hit;
    else
        percent = -1;

    if (percent >= 100)
        strcat (wound, "You are perfectly healthy.");
    else if (percent >= 90)
        strcat (wound, "You have few scratchs.");
    else if (percent >= 75)
        strcat (wound, "You have a few wounds and bruises.");
    else if (percent >= 50)
        strcat (wound, "You are pretty badly bruised.");
    else if (percent >= 30)
        strcat (wound, "You have some heavy wounds.");
    else if (percent >= 15)
        strcat (wound, "You are extremely hurt.");
    else if (percent >= 0)
        strcat (wound, "You are nearly dead.");
    else
        strcat (wound, "You are bleeding to death.");
    
    if (IS_AFFECTED(ch,  AFF_BLIND))
        strcat(wound, " You are blind.");
    
    if (IS_AFFECTED(ch, AFF_POISON))
        strcat(wound, " You are poisoned.");
    
    if (IS_AFFECTED(ch, AFF_CURSE))
        strcat(wound, " You are cursed.");
    
    if (IS_AFFECTED(ch, AFF_PLAGUE))
        strcat(wound, " You have contracted the plague");
    
    if (IS_SET(ch->affected2_by, AFF2_DIEASE))
        strcat(wound, " You have contracted a diease");
    
    if (IS_SET(ch->affected2_by, AFF2_LEPROSY))
        strcat(wound, " You have contracted Leprosy");
    
    return wound;
}

/*
 * word_magic()
 *
 * Returns health num to some words, used for score
 */
char * word_magic(CHAR_DATA * ch)
{
    int percent = 0;
    static char wound[MSL];

    wound[0] = '\0';

    if (ch->max_hit > 0)
        percent = ch->mana * 100 / ch->max_mana;
    else
        percent = -1;

    if (percent >= 100)
        strcat (wound, "Your magic reserves are overflowing.");
    else if (percent >= 90)
        strcat (wound, "Your magical powers are only slightly phased.");
    else if (percent >= 75)
        strcat (wound, "Your magical reserves are weakening.");
    else if (percent >= 50)
        strcat (wound, "Your magical reserves feel drained.");
    else if (percent >= 30)
        strcat (wound, "Your magical powers are heavily drained.");
    else if (percent >= 15)
        strcat (wound, "You feel almost out of touch with your magical reserves.");
    else if (percent >= 0)
        strcat (wound, "You are almost completely drained of magical energies.");
    else
        strcat (wound, "You are totaly drained of magical powers.");

    return wound;
}

char * word_armorclass (CHAR_DATA * ch, bool number)
{
    static char buf[MSL];
    
    buf[0] = '\0';
    
    if (number)
    {
        sprintf(buf, "%d", ch->armor_class);
        return buf;
    }
    
    if (ch->armor_class >= 10)
        strcat(buf, "You are completely unarmored.");
    else if (ch->armor_class >= 8)
        strcat(buf, "You are barely protected.");
    else if (ch->armor_class >= 6)
        strcat(buf, "You are slightly armored.");
    else if (ch->armor_class >= 4)
        strcat(buf, "You are somewhat armored.");
    else if (ch->armor_class >= 2)
        strcat(buf, "You are protected.");
    else if (ch->armor_class >= 0)
        strcat(buf, "You are well-armored.");
    else if (ch->armor_class >= -2)
        strcat(buf, "You are very well armored.");
    else if (ch->armor_class >= -4)
        strcat(buf, "You are heavily armored.");
    else if (ch->armor_class >= -6)
        strcat(buf, "You are superbly armored.");
    else if (ch->armor_class >= -8)
        strcat(buf, "You are nearly invulnerable.");
    else if (ch->armor_class >= -10)
        strcat(buf, "You are divinely armored.");
    else
        strcat(buf, "You are nearly completely protected.");
    
    return buf;
}


char * score_stats(int stat_value)
{
    if (stat_value <= 0)
        return "{rpitiful{x      ";
    else if (stat_value <= 10)
        return "{rpathetic{x     ";
    else if (stat_value <= 20)
        return "{Rvery weak{x    ";
    else if (stat_value <= 30)
        return "{Rweak{x         ";
    else if (stat_value <= 40)
        return "{ybelow average{x";
    else if (stat_value <= 50)
        return "{yaverage{x      ";
    else if (stat_value <= 60)
        return "{Yabove average{x";
    else if (stat_value <= 70)
        return "{Ygood{x         ";
    else if (stat_value <= 80)
        return "{gvery good{x    ";
    else if (stat_value <= 90)
        return "{gsuperb{x       ";
    else if (stat_value <= 100)
        return "{Gexcellent{x    ";
    else
        return "{Gexcellent{x    ";
}

/*
 * alignment_lookup()
 *
 * -5 to 5
 * Returns short or long version of alignment
 */
char * alignment_lookup(CHAR_DATA * ch, bool short_align)
{
    static char align[MSL];
    align[0] = '\0';
    
    if (ch->align_lc == 1 && ch->align_ge == 1)
    {
        if (short_align)
            strcat(align, "TN");
        else
            strcat(align, "True Neutral");
        
        return align;
    }
    
    /* Lawful/Chaotic */
    switch(ch->align_lc)
    {   default:
        case 1:
            if (short_align)
                strcat(align, "N");
            else
                strcat(align, "Neutral");
            break;
        case 0:
            if (short_align)
                strcat(align, "C");
            else
                strcat(align, "Chaotic");
            break;
        case 2:
            if (short_align)
                strcat(align, "L");
            else
                strcat(align, "Lawful");
            break;
    }
    
    /* Evil/Good */
    switch(ch->align_ge)
    {   default:
        case 1:
            if (short_align)
                strcat(align, "N");
            else
                strcat(align, "neutral");
            break;
        case 0:
            if (short_align)
                strcat(align, "E");
            else
                strcat(align, " evil");
            break;
        case 2:
            if (short_align)
                strcat(align, "G");
            else
                strcat(align, " good");
            break;
    }
    
    return align;
}


void display_faction(CHAR_DATA * ch)
{
    int x;
    
    for (x = 0; faction_table[x].name != NULL; x++)
    {
        if (ch->faction[x] == 0)
            continue;
        
        ptc(ch, " You are a %s of %s\n\r",
            faction_table[x].ranks[ch->faction[x]],
            faction_table[x].display_name);
    }
    return;
}

/*
 ============================================================================
  Thri Kantifaski  is new to KoTL                                            
 ----------------------------------------------------------------------------
  You are single                                                         
 ============================================================================
| [Character Information]                        | [Attributes]              |
| EXP TNL     - 1016     Role Play XP - 0        |        Transform: No      |
| Level       - 11       Hours Played - 0        | Str: Decent  Agi: Average |
| Life Points - 220      Gender       - Male     | Int: Decent  Cha: Average |
| Race        - Wild elf Class        - Mage     | Wis: Decent  Luk: Average |
| Curr Stance - None     Stance Skill - 0        | Dex: Average Led: Average |
| Gold        - 54       Silver       - 5520     | Con: Decent  Pec: Decent  |
| Bank Gold   - 0        Bank Silver  - 0         --------------------------- 
| Wimpy       - 0        Carry (  24/102 )  Spec (  2/36 ) Wgt (  785/1715 ) |
 ----------------------------------------------------------------------------
| [Kingdom & Religion]                                                       |
|  Group       Rank            KTime  TNL:  Exp   Time  RPExp Ban Plgd       |
|  Murkwood    Peasant             0       3535     10      0  No   0        |
|  None        none                0          0     10    500  No   0        |
|  Align: Neutral  Order: Neutral  Faithpray: 0                              |
 ----------------------------------------------------------------------------
| [Armor Class]                                                              |
| Slash Defense: [*---------]          Pierce Defense: [*---------]          |
| Magic Defense: [*---------]            Bash Defense: [*---------]          |
 ----------------------------------------------------------------------------
| [Offensive Ability]                                                        |
| Attack Power:  [**=-------]         Attack Accuracy: [**=-------]          |
 ----------------------------------------------------------------------------
| [Combat Statistics]                                                        |
|               Mobs       Players         Spars         Duels    Bloodsworn |
| Wins  :         60             0             0             0             0 |
| Losses:          0             0             0             0             0 |
 ----------------------------------------------------------------------------
| [Mana Pools]                                                               |
|  Black:   78/78          Grey:  104/104        White:   85/85              |
|   Wind:    0/0          Water:    0/0           Fire:    0/0               |
| Spirit:    0/0          Earth:    0/0      Colorless:  139/139             |
 ----------------------------------------------------------------------------
| [Quest Tokens]                                             | [BloodQuest]  |
|      Onyx:      0   Emerald:     40   Sapphire:      0     |  Pts:       0 |
|      Ruby:      0   Crystal:      0      Topaz:      0     |               |
| Turquoise:      0   Diamond:      0   Amethyst:      0     |               | 
 ----------------------------------------------------------------------------
| News: 43 | Note: 21 | Idea: 46 | RP: 12 | Story: 46 | Brtr:  8 | Fun : 11  |
 ----------------------------------------------------------------------------
*/