/***************************************************************************
 * This code may be used freely within any non-commercial MUD, all I ask   *
 * is that these comments remain in tact and that you give me any feedback *
 * or bug reports you come up with.                                        *
 *                                  -- Midboss (eclipsing.souls@gmail.com) *
 ***************************************************************************/

/***************************************************************************
 * Add the line - #include "util.h" - to the file, or put these in merc.h. *
 ***************************************************************************/

/*
 * Returns what percentage X is of Y.
 * Example: pain_pct = percent_of (dam, ch->max_hit);
 */
#define percent_of(x,y) (((x) * 100) / (y))

/*
 * Returns X percent of Y.
 * Example: heal = times_pcnt (35, victim->max_hit);
 */
#define times_pcnt(x,y) (((y) * (x)) / 100)

/*
 * Sends the error message str to ch and returns.
 * I use this so I have less to type with multiple possible command failures.
 */
#define cmd_error(ch,str)           \
{                                   \
    send_to_char ((str), (ch));     \
    return;                         \
}

/*
 * I've written code on several different MUDs, all at the same time,
 * so I often forget which MUDs are setting which strings to NULL or
 * '\0', as I'm not the only one coding on most of them.  Anyway,
 * this will check for either type of effectively blank string.
 */
#define IS_NULL(str) ((str)[0] == '\0' || (str) == NULL)

/*
 * These are macros relating to stock ROM's daze/wait system.  If you're
 * a newbie, and haven't prodded your code much, wait is the lag time used
 * by skills and spells.  DAZED returns true if ch is dazed by a skill or
 * spell, such as bash, WAITING returns true if ch is recoiling from a skill
 * or spell, and clear_lag wipes both.  I would use clear_lag for special
 * abilities relating to wait time...  A Final Fantasy Tactics-like 'Quick'
 * spell, for instance.
 */
#define DAZED(ch)   ((ch)->daze > 0)
#define WAITING(ch) ((ch)->wait > 0)
#define clear_lag(ch)   \
{                       \
    (ch)->wait = 0;     \
    (ch)->daze = 0;     \
}

/*
 * This returns the bar section of a gauge, but leaves the caps and colors to
 * the surrounding code.  Best called within sprintf/printf_to_char.  Works
 * well with the percentage macros above.
 */
#define gauge(pct) ((pct) < 9 ?  "          " : \
                    (pct) < 19 ? "-         " : \
                    (pct) < 29 ? "--        " : \
                    (pct) < 39 ? "---       " : \
                    (pct) < 49 ? "----      " : \
                    (pct) < 59 ? "-----     " : \
                    (pct) < 69 ? "------    " : \
                    (pct) < 79 ? "-------   " : \
                    (pct) < 89 ? "--------  " : \
                    (pct) < 99 ? "--------- " : \
                                 "----------")

/*
 * This macro saves some time getting numerical args.  ch, of course, is the
 * character executing the command, arg is the argument to pass, argname is
 * the name of what the argument is to represent, var is the local variable
 * to store the integer in, err is the error message to send if the argument
 * isn't a number or doesn't exist, hi is the high range, low is the low
 * range.  Nothing too impressive, but it does save me some repetitive work.
 */
#define get_num_arg(ch, arg, argname, var, err, low, hi)        \
{                                                               \
    if (!is_number ((arg)) || (arg)[0] == '\0')                 \
    {                                                           \
        send_to_char ((err), (ch));                             \
        return;                                                 \
    }                                                           \
    (var) = atoi ((arg));                                       \
    if ((var) > (hi) || (var) < (low))                          \
    {                                                           \
        printf_to_char ((ch), "%s must be between %d and %d.",  \
                        (argname), (hi), (low));                \
        return;                                                 \
    }                                                           \
}