alanthia/area/
alanthia/gods/
alanthia/player/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

/***************************************************************************
*	ROM 2.4 is copyright 1993-1996 Russ Taylor			   *
*	ROM has been brought to you by the ROM consortium		   *
*	    Russ Taylor (rtaylor@efn.org)				   *
*	    Gabrielle Taylor						   *
*	    Brian Moore (zump@rom.org)					   *
*	By using this code, you have agreed to follow the terms of the	   *
*	ROM license, in the file Rom24/doc/rom.license			   *
***************************************************************************/

/***************************************************************************
*       File utils.h:                                                      *
*       utility macro definitions for all files.                           *
*       Alanthia MUD, wdl, 4.8.98                                          *
***************************************************************************/

/*
 * Utility macros.
 */
#define IS_VALID(data)		((data) != NULL && (data)->valid)
#define VALIDATE(data)		((data)->valid = TRUE)
#define INVALIDATE(data)	((data)->valid = FALSE)
#define UMIN(a, b)		((a) < (b) ? (a) : (b))
#define UMAX(a, b)		((a) > (b) ? (a) : (b))
#define URANGE(a, b, c)		((b) < (a) ? (a) : ((b) > (c) ? (c) : (b)))
#define LOWER(c)		((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c))
#define UPPER(c)		((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c))
#define IS_SET(flag, bit)	((flag) & (bit))
#define SET_BIT(var, bit)	((var) |= (bit))
#define REMOVE_BIT(var, bit)	((var) &= ~(bit))


/*
 * Character macros.
 */
#define IS_NPC(ch)		(IS_SET((ch)->act, ACT_IS_NPC))
#define IS_LEADER(ch)		(IS_SET((ch)->act, PLR_LEADER))
#define IS_DEL(ch)              (IS_SET((ch)->act, PLR_DEL))
#define IS_IMMORTAL(ch)		(get_trust(ch) >= LEVEL_IMMORTAL)
#define IS_HERO(ch)		(get_trust(ch) >= LEVEL_HERO)
#define IS_TRUSTED(ch,level)	(get_trust((ch)) >= (level))
#define IS_AFFECTED(ch, sn)	(IS_SET((ch)->affected_by, (sn)))
#define IS_UNDEAD(victim)	(!IS_NPC(victim) && ( (victim)->race == race_lookup("vampire") || (victim)->race == race_lookup("wraith") || (victim)->race == race_lookup("demon") || (victim)->race == race_lookup("gargoyle")))
#define IS_VAMPIRE(ch)          (!IS_NPC(ch) && (ch)->race == race_lookup("vampire"))
#define IS_WRAITH(ch)	(!IS_NPC(ch) && (ch)->race == race_lookup("wraith"))
#define IS_DWARF(ch)	(!IS_NPC(ch) && (ch)->race == race_lookup("dwarf"))
									

#define DOESNT_USE_BLOOD(ch)	(!IS_DRAGON(ch)	\
							&&	!IS_VAMPIRE(ch)	\
                            &&  !IS_DWARF(ch))

/* Don't put any race definitions below here. */


#define GET_AGE(ch)		((int) (10 + ((ch)->played \
				    + current_time - (ch)->logon )/72000))
#define GET_LEVEL(ch)		(ch->level)

#define IS_GOOD(ch)		(ch->alignment >= 350)
#define IS_EVIL(ch)		(ch->alignment <= -350)
#define IS_NEUTRAL(ch)		(!IS_GOOD(ch) && !IS_EVIL(ch))

#define IS_AWAKE(ch)		(ch->position > POS_SLEEPING)
#define GET_AC(ch,type)		((ch)->armor[type]			    \
		        + ( IS_AWAKE(ch)			    \
			? dex_app[get_curr_stat(ch,STAT_DEX)].defensive : 0 ))
#define GET_HITROLL(ch)	\
		((ch)->hitroll+str_app[get_curr_stat(ch,STAT_STR)].tohit)
#define GET_DAMROLL(ch) \
		((ch)->damroll+str_app[get_curr_stat(ch,STAT_STR)].todam)

#define IS_OUTSIDE(ch)		(!IS_SET(				    \
				    (ch)->in_room->room_flags,		    \
				    ROOM_INDOORS))

#define get_carry_weight(ch)    ((ch)->carry_weight)
#define HAS_TRIGGER(ch, trig)   (IS_SET((ch)->pIndexData->mprog_flags,(trig)))



/*
 * Object macros.
 */
#define CAN_WEAR(obj, part)	(IS_SET((obj)->wear_flags,  (part)))
#define IS_OBJ_STAT(obj, stat)	(IS_SET((obj)->extra_flags, (stat)))
#define IS_WEAPON_STAT(obj,stat)(IS_SET((obj)->value[4],(stat)))
#define WEIGHT_MULT(obj)	((obj)->item_type == ITEM_CONTAINER ? \
	(obj)->value[4] : 100)



/*
 * Description macros.
 */
#define PERS(ch, looker) ( can_see( looker, (ch) ) ?		\
				( IS_NPC(ch) ? (ch)->short_descr	\
				: (ch)->name ) : "someone" )

#define OBJS(ch, obj)	( can_see_obj( ch, (obj) ) ?		\
				(obj)->short_descr	\
				: "something" )

/*
 * OLC
 * Use these macros to load any new area formats that you choose to
 * support on your MUD.  See the new_load_area format below for
 * a short example.
 */
#if defined(KEY)
#undef KEY
#endif

#define KEY( literal, field, value )                \
                if ( !str_cmp( word, literal ) )    \
                {                                   \
                    field  = value;                 \
                    fMatch = TRUE;                  \
                    break;                          \
                                }

#define SKEY( string, field )                       \
                if ( !str_cmp( word, string ) )     \
                {                                   \
                    free_string( field );           \
                    field = fread_string( fp );     \
                    fMatch = TRUE;                  \
                    break;                          \
                                }

#define KEYS( literal, field, value )                   \
                if ( !str_cmp( word, literal ) )    \
                {                   \
                    free_string(field);         \
                    field  = value;         \
                    fMatch = TRUE;          \
                    break;              \
                }




#define IS_PKILL(ch) (IS_SET(ch->act, PLR_PKILL) || (ch->tmp_pkill))
#define HAS_IMMUNITY(ch) (ch->imm_flags != 0)
#define DAYTIME ((time_info.hour >= 6) && (time_info.hour < 19))

#define GET_HUNGER(ch) (IS_NPC(ch) ? -1 : (ch->pcdata->condition[COND_HUNGER]))
#define GET_THIRST(ch) (IS_NPC(ch) ? -1 : (ch->pcdata->condition[COND_THIRST]))
#define GET_DRUNK(ch)  (IS_NPC(ch) ? -1 : (ch->pcdata->condition[COND_DRUNK]))

#define IS_FIGHTING(ch)	(ch->position == POS_FIGHTING)

#define GET_CWAIT(ch)   (ch->cwait)
#define GET_TIME_COST(attack)   (attack_table[attack].ctimer)
#define COMBAT_WAIT_LENGTH 100
#define GET_CURRENT_ATTACK(ch)  (ch->attack_stack[ch->current_attack])
#define GET_NEXT_ATTACK(ch) (ch->attack_stack[ch->current_attack +1])

#define IS_VALID(data)		((data) != NULL && (data)->valid)
#define VALIDATE(data)		((data)->valid = TRUE)
#define INVALIDATE(data)	((data)->valid = FALSE)
#define UMIN(a, b)		((a) < (b) ? (a) : (b))
#define UMAX(a, b)		((a) > (b) ? (a) : (b))
#define URANGE(a, b, c)		((b) < (a) ? (a) : ((b) > (c) ? (c) : (b)))
#define LOWER(c)		((c) >= 'A' && (c) <= 'Z' ? (c)+'a'-'A' : (c))
#define UPPER(c)		((c) >= 'a' && (c) <= 'z' ? (c)+'A'-'a' : (c))
#define IS_SET(flag, bit)	((flag) & (bit))
#define SET_BIT(var, bit)	((var) |= (bit))
#define REMOVE_BIT(var, bit)	((var) &= ~(bit))


/*
 * Character macros.
 */
#define IS_NPC(ch)		(IS_SET((ch)->act, ACT_IS_NPC))
#define IS_LEADER(ch)		(IS_SET((ch)->act, PLR_LEADER))
#define IS_DEL(ch)              (IS_SET((ch)->act, PLR_DEL))
#define IS_IMMORTAL(ch)		(get_trust(ch) >= LEVEL_IMMORTAL)
#define IS_HERO(ch)		(get_trust(ch) >= LEVEL_HERO)
#define IS_TRUSTED(ch,level)	(get_trust((ch)) >= (level))
#define IS_AFFECTED(ch, sn)	(IS_SET((ch)->affected_by, (sn)))
#define IS_VAMPIRE(ch)          (!IS_NPC(ch) && (ch)->race == race_lookup("vampire"))
#define IS_WRAITH(ch)	(!IS_NPC(ch) && (ch)->race == race_lookup("wraith"))
#define IS_DWARF(ch)	(!IS_NPC(ch) && (ch)->race == race_lookup("dwarf"))
#define IS_DRAGON(ch)	(!IS_NPC(ch) && ( (ch)->race == race_lookup("whtdrg") \
									|| (ch)->race == race_lookup("blkdrg") \
									|| (ch)->race == race_lookup("bludrg") \
									|| (ch)->race == race_lookup("grndrg") \
									|| (ch)->race == race_lookup("reddrg")))

#define GET_LEVEL(ch)		(ch->level)

#define IS_GOOD(ch)		(ch->alignment >= 350)
#define IS_EVIL(ch)		(ch->alignment <= -350)
#define IS_NEUTRAL(ch)		(!IS_GOOD(ch) && !IS_EVIL(ch))

#define IS_AWAKE(ch)		(ch->position > POS_SLEEPING)
#define GET_AC(ch,type)		((ch)->armor[type]			    \
		        + ( IS_AWAKE(ch)			    \
			? dex_app[get_curr_stat(ch,STAT_DEX)].defensive : 0 ))
#define GET_HITROLL(ch)	\
		((ch)->hitroll+str_app[get_curr_stat(ch,STAT_STR)].tohit)
#define GET_DAMROLL(ch) \
		((ch)->damroll+str_app[get_curr_stat(ch,STAT_STR)].todam)

#define IS_OUTSIDE(ch)		(!IS_SET(				    \
				    (ch)->in_room->room_flags,		    \
				    ROOM_INDOORS))

#define WAIT_STATE(ch, npulse)	((ch)->wait = UMAX((ch)->wait, \
				(npulse * 10)))

#define DAZE_STATE(ch, npulse)  ((ch)->daze = UMAX((ch)->daze, \
				(npulse * 10)))

#define get_carry_weight(ch)    ((ch)->carry_weight)
#define HAS_TRIGGER(ch, trig)   (IS_SET((ch)->pIndexData->mprog_flags,(trig)))



/*
 * Object macros.
 */
#define CAN_WEAR(obj, part)	(IS_SET((obj)->wear_flags,  (part)))
#define IS_OBJ_STAT(obj, stat)	(IS_SET((obj)->extra_flags, (stat)))
#define IS_WEAPON_STAT(obj,stat)(IS_SET((obj)->value[4],(stat)))
#define WEIGHT_MULT(obj)	((obj)->item_type == ITEM_CONTAINER ? \
	(obj)->value[4] : 100)



/*
 * Description macros.
 */
#define PERS(ch, looker)	( can_see( looker, (ch) ) ?		\
				( IS_NPC(ch) ? (ch)->short_descr	\
				: (ch)->name ) : "someone" )

#define HAS_IMMUNITY(ch) (ch->imm_flags != 0)
#define DAYTIME ((time_info.hour >= 6) && (time_info.hour < 19))
#define IS_FIGHTING(ch)	(ch->position == POS_FIGHTING)
#define GET_CWAIT(ch)	(ch->cwait)

/*
 * character macros to trap pc / npc
 */

#define NAME(ch) (IS_NPC(ch) ? ch->short_descr : ch->name)
#define SEX_NAME(ch) (ch->sex == 0 ? "sexless" : ch->sex == 1 ? "male" : "female")
#define RACE_NAME(ch)  (ch->race->name)
#define DEVOTION_NAME(ch) (IS_NPC(ch) ? "nonparticipant" : devotion_name[ch->devotion])
#define GOD_NAME(ch) (IS_NPC(ch) ? "no god" : god_name[ch->diety])
#define ALIGN_FAME(ch) (IS_NPC(ch) ? "unknown" : \
(ch->alignment < 3 ? lawful_fame_name[ch->fame] \
: chaotic_fame_name[ch->fame]))
#define ALIGN_NAME(ch) (alignment_name[ch->alignment])

#define IS_VOWEL(c)	\
	((c) == 'a' || (c) == 'A'	\
	|| (c) == 'e' || (c) == 'E'	\
	|| (c) == 'i' || (c) == 'I'	\
	|| (c) == 'o' || (c) == 'O'	\
	|| (c) == 'u' || (c) == 'U')