#include "rooms.h"
// Level-based macros and defines
#define LVL_ELOHIM 75
#define LVL_MERLON 74
#define LVL_ULUTIU 73
#define LVL_SPIRIT 72
#define LVL_SHADE 71
#define Elohim(ch) (!IS_NPC(ch) && (Level(ch) >= LVL_ELOHIM))
#define Merlon(ch) (!IS_NPC(ch) && (Level(ch) >= LVL_MERLON))
#define Ulutiu(ch) (!IS_NPC(ch) && (Level(ch) >= LVL_ULUTIU))
#define Spirit(ch) (!IS_NPC(ch) && (Level(ch) >= LVL_SPIRIT))
#define Shade(ch) (!IS_NPC(ch) && (Level(ch) >= LVL_SHADE))
#define SendChar(mess, ch) send_to_char(mess, ch)
#define SendDesc(mess, d) write_to_output(mess, d)
// Macros for loops...
#define CharsInRoom(ch, tch) for((tch) = Adjacents(ch); (tch); \
(tch) = NextInRoom(tch))
#define Descriptors(d) for ((d) = descriptor_list; (d); (d) = (d)->next)
extern char *tprintf(char *format,...);
#define wordmatch(char, string) isname(char, string)
#define partword(char, string) isname_or_abbr(char, string)
#define Age(ch) (age(ch).year)
#define AFKString(ch) ((ch)->player.afk_str)
#define PName(ch) ((ch)->player.name)
#define SDesc(ch) ((ch)->player.short_descr)
#define Name(ch) (IS_NPC(ch) ? \
(ch)->player.short_descr : (ch)->player.name)
#define Title(ch) ((ch)->player.title)
#define Level(ch) ((ch)->player.level)
#define Password(ch) ((ch)->player.passwd)
#define Class(ch) ((ch)->player.class)
#define Race(ch) ((ch)->player.race)
#define Home(ch) ((ch)->player.hometown)
#define Height(ch) ((ch)->player.height)
#define Weight(ch) ((ch)->player.weight)
#define Sex(ch) ((ch)->player.sex)
#define Str(ch) ((ch)->aff_abils.str)
#define StrAdd(ch) ((ch)->aff_abils.str_add)
#define Dex(ch) ((ch)->aff_abils.dex)
#define Int(ch) ((ch)->aff_abils.intel)
#define Wis(ch) ((ch)->aff_abils.wis)
#define Con(ch) ((ch)->aff_abils.con)
#define Cha(ch) ((ch)->aff_abils.cha)
#define Experience(ch) ((ch)->points.exp)
#define AC(ch) ((ch)->points.armor)
#define Hits(ch) ((ch)->points.hit)
#define MaxHits(ch) ((ch)->points.max_hit)
#define Moves(ch) ((ch)->points.move)
#define MaxMoves(ch) ((ch)->points.max_move)
#define Mana(ch) ((ch)->points.mana)
#define MaxMana(ch) ((ch)->points.max_mana)
#define Gold(ch) ((ch)->points.gold)
#define BankGold(ch) ((ch)->points.bank_gold)
#define Hitroll(ch) ((ch)->points.hitroll)
#define Damroll(ch) ((ch)->points.damroll)
#define Position(ch) ((ch)->specials.position)
#define IDNum(ch) ((ch)->pc_specials->saved.idnum)
#define CarryingW(ch) ((ch)->specials.carry_weight)
#define CarryingN(ch) ((ch)->specials.carry_items)
#define Fighting(ch) ((ch)->specials.fighting)
#define Hunting(ch) ((ch)->specials.hunting)
#define SaveThr(ch, i) ((ch)->specials.saved.apply_saving_throw[i])
#define Alignment(ch) ((ch)->specials.saved.alignment)
#define Loadroom(ch) ((ch)->pc_specials->saved.load_room)
#define PageLength(ch) ((ch)->pc_specials->saved.page_length)
#define Practices(ch) ((ch)->pc_specials->saved.spells_to_learn)
#define InvisLevel(ch) ((ch)->pc_specials->saved.invis_level)
#define WimpLevel(ch) ((ch)->pc_specials->saved.wimp_level)
#define FreezeLevel(ch) ((ch)->pc_specials->saved.freeze_level)
#define BadPws(ch) ((ch)->pc_specials->saved.bad_pws)
#define Talks(ch, i) ((ch)->pc_specials->saved.talks[i])
#define Poofin(ch) ((ch)->pc_specials->saved.poofIn)
#define Poofout(ch) ((ch)->pc_specials->saved.poofOut)
#define Walkin(ch) ((ch)->pc_specials->walkin)
#define Walkout(ch) ((ch)->pc_specials->walkout)
#define LastOLCTarg(ch) ((ch)->pc_specials->last_olc_targ)
#define LastOLCMode(ch) ((ch)->pc_specials->last_olc_mode)
#define Aliases(ch) ((ch)->pc_specials->aliases)
#define LastTell(ch) ((ch)->pc_specials->last_tell)
#define Skill(ch, i) ((ch)->pc_specials->saved.skills[i])
#define Spell(ch, i) ((ch)->pc_specials->saved.spells[i])
#define WProf(ch, i) ((ch)->pc_specials->saved.wprofs[i])
#define SkillSet(ch, i, pct) { (ch)->pc_specials->saved.skills[i] = pct; }
#define TempSkill(ch, i) ((ch)->tskills[i])
#define TempSkillSet(ch, i, pct) { (ch)->tskills[i] = pct; }
#define Equip(ch, i) ((ch)->equipment[i])
#define MobSpec(ch) (IS_MOB(ch) ? (mob_index[(ch->nr)].func) : NULL)
#define MobRnum(mob) ((mob)->nr)
#define MobVnum(mob) (IS_MOB(mob) ? \
mob_index[MobRnum(mob)].virtual : -1)
#define MobWait(ch) ((ch)->mob_specials.wait_state)
#define DefaultPos(ch) ((ch)->mob_specials.default_pos)
#define Memory(ch) ((ch)->mob_specials.memory)
#define Good(ch) (Alignment(ch) >= 350)
#define Evil(ch) (Alignment(ch) <= -350)
#define Neutral(ch) (!IS_GOOD(ch) && !IS_EVIL(ch))
#define Master(ch) ((ch)->master)
#define Followers(ch) ((ch)->followers)
#define LogFlags(ch) ((ch)->pc_specials->saved.syslog_flags)
#define LogFlagged(ch, flag) (IS_SET(LogFlags(ch), (flag)))
#define IsMortallyW(ch) (Position(ch) == POS_MORTALLYW)
#define IsIncap(ch) (Position(ch) == POS_INCAP)
#define IsStunned(ch) (Position(ch) == POS_STUNNED)
#define IsSleeping(ch) (Position(ch) == POS_SLEEPING)
#define IsResting(ch) (Position(ch) == POS_RESTING)
#define IsSitting(ch) (Position(ch) == POS_SITTING)
#define IsStanding(ch) (Position(ch) == POS_STANDING)
#define IsFighting(ch) (Position(ch) == POS_FIGHTING)
#define IsFlying(ch) (Position(ch) == POS_FLYING)
/*****************************************************************************
* Configurable color prototypes.
*/
#define ColAuction(ch) ((ch)->pc_specials->saved.color.auction)
#define ColBlink(ch) ((ch)->pc_specials->saved.color.blink)
#define ColBold(ch) ((ch)->pc_specials->saved.color.bold)
#define ColCharacters(ch) ((ch)->pc_specials->saved.color.characters)
#define ColClan(ch) ((ch)->pc_specials->saved.color.clan)
#define ColCombat(ch) ((ch)->pc_specials->saved.color.combat)
#define ColDescription(ch) ((ch)->pc_specials->saved.color.description)
#define ColDanger(ch) ((ch)->pc_specials->saved.color.danger)
#define ColExamples(ch) ((ch)->pc_specials->saved.color.examples)
#define ColExits(ch) ((ch)->pc_specials->saved.color.exits)
#define ColGossip(ch) ((ch)->pc_specials->saved.color.gossip)
#define ColGroup(ch) ((ch)->pc_specials->saved.color.group)
#define ColHit(ch) ((ch)->pc_specials->saved.color.hit)
#define ColImmorts(ch) ((ch)->pc_specials->saved.color.immorts)
#define ColLog(ch) ((ch)->pc_specials->saved.color.log)
#define ColMobiles(ch) ((ch)->pc_specials->saved.color.mobiles)
#define ColNormal(ch) ((ch)->pc_specials->saved.color.normal)
#define ColObjects(ch) ((ch)->pc_specials->saved.color.objects)
#define ColReverse(ch) ((ch)->pc_specials->saved.color.reverse)
#define ColRoomName(ch) ((ch)->pc_specials->saved.color.rname)
#define ColSay(ch) ((ch)->pc_specials->saved.color.say)
#define ColShout(ch) ((ch)->pc_specials->saved.color.shout)
#define ColSocials(ch) ((ch)->pc_specials->saved.color.socials)
#define ColTell(ch) ((ch)->pc_specials->saved.color.tell)
#define ColWeather(ch) ((ch)->pc_specials->saved.color.weather)
#define ColWounded(ch) ((ch)->pc_specials->saved.color.wounded)
/*****************************************************************************
* Class-related prototypes.
*/
#define Assassin(ch) (Class(ch) == CLASS_ASSASSIN)
#define Bard(ch) (Class(ch) == CLASS_BARD)
#define Cleric(ch) (Class(ch) == CLASS_CLERIC)
#define Druid(ch) (Class(ch) == CLASS_DRUID)
#define Mage(ch) (Class(ch) == CLASS_MAGIC_USER)
#define Psionic(ch) (Class(ch) == CLASS_PSIONIC)
#define Ranger(ch) (Class(ch) == CLASS_RANGER)
#define Rogue(ch) (Class(ch) == CLASS_ROGUE)
#define Warrior(ch) (Class(ch) == CLASS_WARRIOR)
#define Creating(d) (STATE(d) == CON_OEDIT || STATE(d) == CON_REDIT || \
STATE(d) == CON_MEDIT || STATE(d) == CON_SEDIT || \
STATE(d) == CON_ZEDIT)
#define YesNo(d) ((d)->yn_mode)
#define Facing(ch) ((ch)->facing)
#define InRoom(ch) ((ch)->in_room)
#define NextInRoom(ch) ((ch)->next_in_room)
#define InZone(ch) (world[InRoom(ch)].zone)
#define Adjacents(ch) (world[InRoom(ch)].people)
#define InSameRoom(ch1, ch2) (InRoom(ch1) == InRoom(ch2))
#define InSameZone(ch1, ch2) (InZone(ch1) == InZone(ch2))
/*****************************************************************************
* AFF_XX flag prototypes.
*/
#define AffDetectAlign(ch) (AFF_FLAGGED(ch, AFF_DETECT_ALIGN))
#define AffDetectInvis(ch) (AFF_FLAGGED(ch, AFF_DETECT_INVIS))
#define AffDetectMagic(ch) (AFF_FLAGGED(ch, AFF_DETECT_MAGIC))
#define AffDustCloak(ch) (AFF_FLAGGED(ch, AFF_DUSTCLOAK))
#define AffEnergyControl(ch) (AFF_FLAGGED(ch, AFF_ENERGY_CONTROL))
#define AffFirewall(ch) (AFF_FLAGGED(ch, AFF_FIREWALL))
#define AffFreshSwim(ch) (AFF_FLAGGED(ch, AFF_FRESHSWIM))
#define AffInfravision(ch) (AFF_FLAGGED(ch, AFF_INFRAVISION))
#define AffMindShield(ch) (AFF_FLAGGED(ch, AFF_MIND_SHIELD))
#define AffNoTrack(ch) (AFF_FLAGGED(ch, AFF_NOTRACK))
#define AffSaltSwim(ch) (AFF_FLAGGED(ch, AFF_SALTSWIM))
#define AffSanctuary(ch) (AFF_FLAGGED(ch, AFF_SANCTUARY))
#define AffSenseLife(ch) (AFF_FLAGGED(ch, AFF_SENSE_LIFE))
#define AffSleep(ch) (AFF_FLAGGED(ch, AFF_SLEEP))
#define AffThornwall(ch) (AFF_FLAGGED(ch, AFF_THORNWALL))
#define AffWarcry(ch) (AFF_FLAGGED(ch, AFF_WARCRY))
#define AffWaterwalk(ch) (AFF_FLAGGED(ch, AFF_WATERWALK))
#define Blinded(ch) (AFF_FLAGGED(ch, AFF_BLIND))
#define Charmed(ch) (AFF_FLAGGED(ch, AFF_CHARM))
#define Cursed(ch) (AFF_FLAGGED(ch, AFF_CURSE))
#define Flying(ch) (AFF_FLAGGED(ch, AFF_FLYING))
#define Grouped(ch) (AFF_FLAGGED(ch, AFF_GROUP))
#define Hiding(ch) (AFF_FLAGGED(ch, AFF_HIDE))
#define Invisible(ch) (AFF_FLAGGED(ch, AFF_INVISIBLE))
#define Poisoned(ch) (AFF_FLAGGED(ch, AFF_POISON))
#define ProtFromEvil(ch) (AFF_FLAGGED(ch, AFF_PROTECT_EVIL))
#define ProtFromGood(ch) (AFF_FLAGGED(ch, AFF_PROTECT_GOOD))
#define Silenced(ch) (AFF_FLAGGED(ch, AFF_SILENCE))
#define Sneaking(ch) (AFF_FLAGGED(ch, AFF_SNEAK))
/*****************************************************************************
* PLR_XX flag prototypes.
*/
#define AFK(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_AFK))
#define ClanLeader(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_CLANLEADER))
#define Crash(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_CRASH))
#define CryoSaved(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_CRYO))
#define Deleted(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_DELETED))
#define Enforcer(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_ENFORCER))
#define Frozen(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_FROZEN))
#define InvisStart(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_INVSTART))
#define It(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_IT))
#define Java(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_JAVA))
#define Killer(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_KILLER))
#define LoadInRoom(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_LOADROOM))
#define Mailing(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_MAILING))
#define NoColor(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_NOCOLOR))
#define NoDelete(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_NODELETE))
#define NoShout(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_NOSHOUT))
#define NoTitle(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_NOTITLE))
#define NoWizlist(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_NOWIZLIST))
#define SiteOk(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_SITEOK))
#define Stone(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_STONE))
#define Thief(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_THIEF))
#define Writing(ch) (!IS_NPC(ch) && PLR_FLAGGED(ch, PLR_WRITING))
/*****************************************************************************
* PRF_XX flag prototypes.
*/
#define AutoAssist(ch) (PRF_FLAGGED(ch, PRF_AUTOASS))
#define AutoCond(ch) (PRF_FLAGGED(ch, PRF_AUTOCOND))
#define AutoExit(ch) (PRF_FLAGGED(ch, PRF_AUTOEXIT))
#define AutoShare(ch) (PRF_FLAGGED(ch, PRF_AUTOSHARE))
#define Brief(ch) (PRF_FLAGGED(ch, PRF_BRIEF))
#define Chatting(ch) (PRF_FLAGGED(ch, PRF_CHAT))
#define ClanChannel(ch) (PRF_FLAGGED(ch, PRF_CLAN_CH))
#define Color1(ch) (PRF_FLAGGED(ch, PRF_COLOR_1))
#define Color2(ch) (PRF_FLAGGED(ch, PRF_COLOR_2))
#define Compact(ch) (PRF_FLAGGED(ch, PRF_COMPACT))
#define Deaf(ch) (PRF_FLAGGED(ch, PRF_DEAF))
#define DispHits(ch) (PRF_FLAGGED(ch, PRF_DISPHP))
#define DispMana(ch) (PRF_FLAGGED(ch, PRF_DISPMANA))
#define DispMove(ch) (PRF_FLAGGED(ch, PRF_DISPMOVE))
#define Grumpy(ch) (PRF_FLAGGED(ch, PRF_GRUMPY))
#define Happy(ch) (PRF_FLAGGED(ch, PRF_HAPPY))
#define HolyLight(ch) (PRF_FLAGGED(ch, PRF_HOLYLIGHT))
#define Log1(ch) (PRF_FLAGGED(ch, PRF_LOG1))
#define Log2(ch) (PRF_FLAGGED(ch, PRF_LOG2))
#define NoArena(ch) (PRF_FLAGGED(ch, PRF_NOARENA))
#define NoAuction(ch) (PRF_FLAGGED(ch, PRF_NOAUCT))
#define NoCongrat(ch) (PRF_FLAGGED(ch, PRF_NOGRATZ))
#define NoPublic(ch) (PRF_FLAGGED(ch, PRF_NOPUBLIC))
#define NoHassle(ch) (PRF_FLAGGED(ch, PRF_NOHASSLE))
#define NoInterWiz(ch) (PRF_FLAGGED(ch, PRF_NOINTWIZ))
#define NoMenu(ch) (PRF_FLAGGED(ch, PRF_NOMENU))
#define NoMusic(ch) (PRF_FLAGGED(ch, PRF_NOMUSIC))
#define NoPrompt(ch) (PRF_FLAGGED(ch, PRF_NOPROMPT))
#define NoRepeat(ch) (PRF_FLAGGED(ch, PRF_NOREPEAT))
#define NoTell(ch) (PRF_FLAGGED(ch, PRF_NOTELL))
#define NoWiz(ch) (PRF_FLAGGED(ch, PRF_NOWIZ))
#define Questing(ch) (PRF_FLAGGED(ch, PRF_QUEST))
#define RoomFlags(ch) (PRF_FLAGGED(ch, PRF_ROOMFLAGS))
#define Summonable(ch) (PRF_FLAGGED(ch, PRF_SUMMONABLE))
/*****************************************************************************
* Immunity/Meta Immunity/Susceptibility prototypes.
*/
#define MetaImmune(ch, bit) (IS_SET(MetaImmuneFlags(ch), bit))
/*****************************************************************************
* MOB_XX flag prototypes.
*/
#define MobAggressive(ch) (MOB_FLAGGED(ch, MOB_AGGRESSIVE))
#define MobAggrEvil(ch) (MOB_FLAGGED(ch, MOB_AGGR_EVIL))
#define MobAggrGood(ch) (MOB_FLAGGED(ch, MOB_AGGR_GOOD))
#define MobAggrNeutral(ch) (MOB_FLAGGED(ch, MOB_AGGR_NEUTRAL))
#define MobAware(ch) (MOB_FLAGGED(ch, MOB_AWARE))
#define MobGreet(ch) (MOB_FLAGGED(ch, MOB_GREET))
#define MobHelper(ch) (MOB_FLAGGED(ch, MOB_HELPER))
#define MobMemory(ch) (MOB_FLAGGED(ch, MOB_MEMORY))
#define MobMountable(ch) (MOB_FLAGGED(ch, MOB_MOUNTABLE))
#define MobNoBash(ch) (MOB_FLAGGED(ch, MOB_NOBASH))
#define MobNoBlind(ch) (MOB_FLAGGED(ch, MOB_NOBLIND))
#define MobNoCharm(ch) (MOB_FLAGGED(ch, MOB_NOCHARM))
#define MobNoKill(ch) (MOB_FLAGGED(ch, MOB_NOKILL))
#define MobNoSleep(ch) (MOB_FLAGGED(ch, MOB_NOSLEEP))
#define MobNoSummon(ch) (MOB_FLAGGED(ch, MOB_NOSUMMON))
#define Polymorphed(ch) (MOB_FLAGGED(ch, MOB_POLYMORPHED))
#define MobScavenger(ch) (MOB_FLAGGED(ch, MOB_SCAVENGER))
#define MobSentinel(ch) (MOB_FLAGGED(ch, MOB_SENTINEL))
#define MobSpecial(ch) (MOB_FLAGGED(ch, MOB_SPEC))
#define MobStayZone(ch) (MOB_FLAGGED(ch, MOB_STAY_ZONE))
#define MobTame(ch) (MOB_FLAGGED(ch, MOB_TAME))
#define MobWimpy(ch) (MOB_FLAGGED(ch, MOB_WIMPY))
/*****************************************************************************
* PRG_XX flag prototypes.
*/
#define Programs(ch) ((ch)->char_specials.prog)
#define HasProgram(ch, prg) (IS_NPC(ch) && IS_SET(Programs(ch), (prg)))
#define Executes(ch, prg) ((prg) (ch, ch, 0, ""))
#define PrgCommand(prg, ch, vict, cmd, arg) ((prg) (ch, vict, cmd, arg))
#define JanitorPrg(ch) (HasProgram(ch, PRG_JANITOR))