/
roa/
roa/lib/boards/
roa/lib/config/
roa/lib/edits/
roa/lib/help/
roa/lib/misc/
roa/lib/plrobjs/
roa/lib/quests/
roa/lib/socials/
roa/lib/www/
roa/lib/www/LEDSign/
roa/lib/www/LEDSign/fonts/
roa/lib/www/LEDSign/scripts/
roa/src/s_inc/
roa/src/sclient/
roa/src/sclient/binary/
roa/src/sclient/text/
roa/src/util/
#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))