void do_affects(CHAR_DATA * ch, char *argument)
{
    char buf[MAX_STRING_LENGTH];
    AFFECT_DATA *paf;

    if (IS_NPC(ch))
        return;
    ch_printf(ch, "%s\n\r", generate_banner("#WUpkeep#n", 65, "^B#w"));
    sprintf(buf, "  [%s] Protection        [%s] Etherral          [%s] Flying\n\r",
            (IS_AFFECTED(ch, AFF_PROTECT)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_ETHEREAL)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_FLYING)) ? "o" : " ");
    stc(buf,ch);
    sprintf(buf, "  [%s] Passdoor          [%s] Invisibility      [%s] Sneak\n\r",
            (IS_AFFECTED(ch, AFF_PASS_DOOR)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_INVISIBLE)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_SNEAK)) ? "o" : " ");
    stc(buf,ch);
    sprintf(buf, "  [%s] Regeneration      [%s] Shadowplane       [%s] Infrared \n\r",
            (IS_ITEMAFF(ch, ITEMA_REGENERATE)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_SHADOWPLANE)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_INFRARED)) ? "o" : " ");
    stc(buf,ch);
    sprintf(buf, "  [%s] Detect Evil       [%s] Detect Invis      [%s] Detect Magic \n\r",
            (IS_AFFECTED(ch, AFF_DETECT_EVIL)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_DETECT_INVIS)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_DETECT_MAGIC)) ? "o" : " ");
    stc(buf,ch);
    sprintf(buf, "  [%s] Extra Speed       [%s] Sanctuary         [%s] Shadowsight \n\r",
            (IS_ITEMAFF(ch, ITEMA_SPEED)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_SANCTUARY)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_SHADOWSIGHT)) ? "o" : " ");

    stc(buf,ch);
    sprintf(buf, "  [%s] Stone Skin \n\r",
            (IS_AFFECTED2(ch, AFF2_STONE_SKIN)) ? "o" : " ");

    stc(buf,ch);


    ch_printf(ch, "%s\n\r", generate_banner("#GShield Affects#n", 65, "^B#w"));

    sprintf(buf, "  [%s] Shock Shield      [%s] Acid Shield       [%s] Chaos Shield \n\r",
            (IS_ITEMAFF (ch, ITEMA_SHOCKSHIELD)) ? "o" : " ",
            (IS_ITEMAFF (ch, ITEMA_ACIDSHIELD)) ? "o" : " ",
            (IS_ITEMAFF(ch, ITEMA_CHAOSSHIELD)) ? "o" : " ");
    stc(buf,ch);
    sprintf(buf, "  [%s] Fire Shield       [%s] Ice Shield \n\r",
            (IS_ITEMAFF (ch, ITEMA_FIRESHIELD)) ? "o" : " ",
            (IS_ITEMAFF (ch, ITEMA_ICESHIELD)) ? "o" : " ");
    stc(buf,ch);


    ch_printf(ch, "%s\n\r", generate_banner("#DNegative Affects#n", 65, "^B#w"));
    sprintf(buf, "  [%s] Faerie Fire       [%s] Webbed            [%s] Poison \n\r",
            (IS_AFFECTED(ch, AFF_FAERIE_FIRE)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_WEBBED)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_POISON)) ? "o" : " ");
    stc(buf,ch);
    sprintf(buf, "  [%s] On Fire           [%s] Cursed            [%s] Blind \n\r",
            (IS_AFFECTED(ch, AFF_FLAMING)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_CURSE)) ? "o" : " ",
            (IS_AFFECTED(ch, AFF_BLIND)) ? "o" : " ");
    stc(buf,ch);


    if (ch->affected != NULL)
    {

        ch_printf(ch, "%s\n\r", generate_banner("#WSpell List#n", 65, "^B#w"));
//        send_to_char("You are affected by:\n\r", ch);
        for (paf = ch->affected; paf != NULL; paf = paf->next)
        {
            sprintf(buf, "Spell: '%s'", skill_table[paf->type].name);
            send_to_char(buf, ch);
            if (ch->level >= 0)
            {
                sprintf(buf, " modifies %s by %d for %d hours with bits %s.\n\r", affect_loc_name(paf->location), paf->modifier, paf->duration, affect_bit_name(paf->bitvector));
                send_to_char(buf, ch);
            }

        }

    }
    ch_printf(ch, "%s\n\r", generate_banner("", 65, "{^B#w"));

    return;

}