roh/conf.old/area/
roh/config/code/python/
roh/config/game/area/
roh/config/game/signs/
roh/help/dmhelp/
roh/help/help/
roh/log/
roh/log/staff/
roh/monsters/ocean/
roh/objects/misc/
roh/objects/ocean/
roh/player/
roh/rooms/area/1/
roh/rooms/misc/
roh/rooms/ocean/
roh/src-2.47e/
/*
 * healers.cpp
 *	 Functions that deal with healer class abilities.
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * Permission to use, modify and distribute is granted via the
 *  Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
 *    http://creativecommons.org/licenses/by-nc-sa/3.0/
 *
 * 	Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell
 * 	   Contributions by Tim Callahan, Jonathan Hseu
 *  Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
 *
 */
#include "mud.h"


//*********************************************************************
//						cmdEnthrall
//*********************************************************************
// This ability allows a cleric of Aramon to charm undead creatures
// and players. -- TC

int cmdEnthrall(Player* player, cmd* cmnd) {
	Creature* creature=0;
	int		dur=0, chance=0;
	long	i=0, t=0;

	player->clearFlag(P_AFK);
	if(!player->ableToDoCommand())
		return(0);

	if(!player->isCt()) {
		if(!player->knowsSkill("enthrall")) {
			player->print("You don't possess the skills to enthrall the undead!\n");
			return(0);
		}
		if(player->isBlind()) {
			player->printColor("^CYou must be able to see your enemy to do that!\n");
			return(0);
		}
	}

	i = LT(player, LT_HYPNOTIZE);
	t = time(0);
	if(i > t && !player->isDm()) {
		player->pleaseWait(i-t);
		return(0);
	}

	dur = 300 + mrand(1, 30) * 10 + bonus((int) player->piety.getCur()) * 30 +
	      (int)(player->getSkillLevel("enthrall") * 5);


    if(!(creature = player->findVictim(cmnd, 1, true, false, "Enthrall whom?\n", "You don't see that here.\n")))
		return(0);

    if(creature->isMonster()) {
		if(creature->getAsMonster()->isEnemy(player)) {
			player->print("Not while you are already fighting %s.\n", creature->himHer());
			return(0);
		}
	}
	if(!player->canAttack(creature))
		return(0);

	if(	!player->alignInOrder() &&
		!player->checkStaff("You are not wicked enough in %s's eyes to do that.\n", gConfig->getDeity(player->getDeity())->getName().c_str())
	)
		return(0);

	if( !creature->isUndead() &&
		!player->checkStaff("You may not enthrall the living with %s's power.\n", gConfig->getDeity(player->getDeity())->getName().c_str())
	)
		return(0);

	player->smashInvis();
	player->lasttime[LT_HYPNOTIZE].ltime = t;
	player->lasttime[LT_HYPNOTIZE].interval = 300L;

	chance = MIN(90, 40 + (int)((player->getSkillLevel("enthrall") - creature->getLevel()) * 10) +
			4 * bonus((int) player->piety.getCur()));

	if(creature->flagIsSet(M_PERMENANT_MONSTER))
		chance -= 25;

	if(player->isDm())
		chance = 101;

	if((chance < mrand(1, 100)) && (chance != 101)) {
		player->print("You were unable to enthrall %N.\n", creature);
		player->checkImprove("enthrall",false);
		broadcast(player->getSock(), player->getParent(), "%M tried to enthrall %N.",player, creature);
		if(creature->isMonster()) {
			creature->getAsMonster()->addEnemy(player);
			return(0);
		}
		creature->printColor("^r%M tried to enthrall you with the power of %s.\n", player, gConfig->getDeity(player->getDeity())->getName().c_str());

		return(0);
	}


	if(!creature->isCt() &&
		creature->chkSave(MEN, player, 0))
	{
		player->printColor("^yYour enthrall failed!\n");
		creature->print("Your mind tingles as you brush off %N's enthrall.\n", player);
		player->checkImprove("enthrall",false);
		return(0);
	}

	if(	(creature->isPlayer() && creature->isEffected("resist-magic")) ||
		(creature->isMonster() && creature->isEffected("resist-magic"))
	)
		dur /= 2;

	player->print("You enthrall %N with the power of %s.\n", creature, gConfig->getDeity(player->getDeity())->getName().c_str());
	player->checkImprove("enthrall",true);

	broadcast(player->getSock(), creature->getSock(), player->getRoomParent(), "%M flashes %s symbol of %s to %N, enthralling %s.",
		player, player->hisHer(), gConfig->getDeity(player->getDeity())->getName().c_str(), creature,
	    player->himHer());
	creature->print("%M's chant of %s's word enthralls you.\n", player, gConfig->getDeity(player->getDeity())->getName().c_str());

	player->addCharm(creature);

	creature->stun(MAX(1,7+mrand(1,2)+bonus((int) player->piety.getCur())));

	creature->lasttime[LT_CHARMED].ltime = time(0);
	creature->lasttime[LT_CHARMED].interval = dur;

	creature->setFlag(creature->isPlayer() ? P_CHARMED : M_CHARMED);

	return(0);
}


//*********************************************************************
//						cmdEarthSmother
//*********************************************************************
// This command allows a dwarven cleric/paladin of Gradius to smother enemies

int cmdEarthSmother(Player* player, cmd* cmnd) {
	Creature* creature=0;
	Player	*pCreature=0;
	Monster *mCreature=0;
	long	i=0, t=0;
	int		chance=0, dmg=0;

	player->clearFlag(P_AFK);
	if(!player->ableToDoCommand())
		return(0);


	if(!player->isCt()) {
		if(!player->knowsSkill("smother")) {
			player->print("You lack the skills to smother people with earth.\n");
			return(0);
		}
		if(!player->alignInOrder()) {
			player->print("%s requires that you are neutral or light blue to do that.\n", gConfig->getDeity(player->getDeity())->getName().c_str());
			return(0);
		}
	}
    if(!(creature = player->findVictim(cmnd, 1, true, false, "Smother whom?\n", "You don't see that here.\n")))
		return(0);

	pCreature = creature->getAsPlayer();
	mCreature = creature->getAsMonster();

	player->smashInvis();
	player->interruptDelayedActions();

	if(!player->canAttack(creature))
		return(0);

	if(mCreature && mCreature->getBaseRealm() == EARTH &&
		!player->checkStaff("Your attack would be ineffective.\n"))
		return(0);


	double level = player->getSkillLevel("smother");
	i = LT(player, LT_SMOTHER);
	t = time(0);
	if(i > t && !player->isCt()) {
		player->pleaseWait(i-t);
		return(0);
	}

	player->lasttime[LT_SMOTHER].ltime = t;
	player->updateAttackTimer();
	player->lasttime[LT_SMOTHER].interval = 120L;


	chance = ((int)(level - creature->getLevel()) * 20) + bonus((int) player->piety.getCur()) * 5 + 25;
	chance = MIN(chance, 80);
	if(creature->isEffected("resist-earth"))
		chance /= 2;
	if(!pCreature && creature->isEffected("immune-earth"))
		chance = 0;

	dmg = mrand((int)(level*3), (int)(level*4));
	if(creature->isEffected("resist-earth"))
		dmg = mrand(1, (int)level);
	if(player->getRoomParent()->flagIsSet(R_EARTH_BONUS) && player->getRoomParent()->flagIsSet(R_ROOM_REALM_BONUS))
		dmg = dmg*3/2;

	if(mCreature)
		mCreature->addEnemy(player);

	if(!player->isCt()) {
		if(mrand(1, 100) > chance) {
			player->print("You failed to earth smother %N.\n", creature);
			broadcast(player->getSock(), creature->getSock(), player->getRoomParent(), "%M tried to earth smother %N.", player, creature);
			creature->print("%M tried to earth smother you!\n", player);
			player->checkImprove("smother", false);
			return(0);
		}
		if(creature->chkSave(BRE, player, 0)) {
			player->printColor("^yYour earth-smother was interrupted!\n");
			creature->print("You manage to partially avoid %N's smothering earth.\n", player);
			dmg /= 2;
		}
	}

	player->printColor("You smothered %N for %s%d^x damage.\n", creature, player->customColorize("*CC:DAMAGE*").c_str(), dmg);
	player->checkImprove("smother", true);
	player->statistics.attackDamage(dmg, "earth smother");

	if(creature->isEffected("resist-earth"))
		player->print("%M resisted your smother!\n", creature);

	creature->printColor("%M earth-smothered you for %s%d^x damage!\n", player, creature->customColorize("*CC:DAMAGE*").c_str(), dmg);
	broadcast(player->getSock(), creature->getSock(), player->getRoomParent(), "%M earth-smothered %N!", player, creature);

	player->doDamage(creature, dmg, CHECK_DIE);
	return(0);
}

//*********************************************************************
//						cmdLayHands
//*********************************************************************
// This will allow paladins to lay on hands

int cmdLayHands(Player* player, cmd* cmnd) {
	Creature* creature=0;
	int		num=0;
	long	t=0, i=0;

	player->clearFlag(P_AFK);

	if(!player->knowsSkill("hands")) {
		player->print("You don't know how to lay your hands on someone properly.\n");
		return(0);
	}
	if(!player->isCt()) {
		if(player->getAdjustedAlignment() < ROYALBLUE) {
			player->print("You may only do that when your alignment is totally pure.\n");
			return(0);
		}

		i = player->lasttime[LT_LAY_HANDS].ltime;
		t = time(0);
		if(t-i < 3600L) {
			player->pleaseWait(3600L-t+i);
			return(0);
		}
	}


	// Lay on self
	if(cmnd->num == 1) {

		num = player->getLevel()*4 + mrand(1,6);
		player->print("You heal yourself with the power of %s.\n", gConfig->getDeity(player->getDeity())->getName().c_str());
		player->print("You regain %d hit points.\n", MIN((player->hp.getMax() - player->hp.getCur()), num));


		player->doHeal(player, num);

		broadcast(player->getSock(), player->getParent(), "%M heals %sself with the power of %s.",
			player, player->himHer(), gConfig->getDeity(player->getDeity())->getName().c_str());

		player->print("You feel much better now.\n");
		player->checkImprove("hands", true);
		player->lasttime[LT_LAY_HANDS].ltime = t;
		player->lasttime[LT_LAY_HANDS].interval = 3600L;

	} else {
		// Lay hands on another player or monster

		cmnd->str[1][0] = up(cmnd->str[1][0]);
		creature = player->getParent()->findCreature(player, cmnd->str[1], cmnd->val[1], false);
		if(!creature) {
			player->print("That person is not here.\n");
			return(0);
		}

		if(creature->pFlagIsSet(P_LINKDEAD) && creature->getClass() != LICH) {
			player->print("That won't work on %N right now.\n", creature);
			return(0);
		}

		if(!player->isCt() && creature->isUndead()) {
			player->print("That will not work on undead.\n");
			return(0);
		}

		if(creature->getAdjustedAlignment() < NEUTRAL) {
			player->print("%M is not pure enough of heart for that to work.\n", creature);
			return(0);
		}

		num = player->getLevel()*4 + mrand(1,6);
		player->print("You heal %N with the power of %s.\n", creature, gConfig->getDeity(player->getDeity())->getName().c_str());
		creature->print("%M lays %s hand upon your pate.\n", player, player->hisHer());
		creature->print("You regain %d hit points.\n", MIN((creature->hp.getMax() - creature->hp.getCur()), num));


		player->doHeal(creature, num);

		broadcast(player->getSock(), creature->getSock(), creature->getRoomParent(), "%M heals %N with the power of %s.",
			player, creature, gConfig->getDeity(player->getDeity())->getName().c_str());

		creature->print("You feel much better now.\n");

		player->lasttime[LT_LAY_HANDS].ltime = t;
		player->lasttime[LT_LAY_HANDS].interval = 600L;
		player->checkImprove("hands", true);

	}

	return(0);
}

//*********************************************************************
//						cmdPray
//*********************************************************************
// This function allows clerics, paladins, and druids to pray every 10
// minutes to increase their piety for a duration of 5 minutes.

int cmdPray(Player* player, cmd* cmnd) {
	long	i=0, t=0;
	int		chance=0;

	player->clearFlag(P_AFK);


	if(!player->ableToDoCommand())
		return(0);

	if(!player->knowsSkill("pray")) {
		player->print("You say a quick prayer.\n");
		return(0);
	}
	if(player->isEffected("pray") || player->isEffected("dkpray")) {
		player->print("You've already prayed.\n");
		return(0);
	}

	if(player->getClass() == DEATHKNIGHT) {
		if(player->isEffected("strength")) {
			player->print("Your magically enhanced strength prevents you from praying.\n");
			return(0);
		}
		if(player->isEffected("enfeeblement")) {
			player->print("Your magically reduced strength prevents you from praying.\n");
			return(0);
		}
	} else {
		if(player->isEffected("prayer")) {
			player->print("Your spiritual blessing prevents you from praying.\n");
			return(0);
		}
		if(player->isEffected("damnation")) {
			player->print("Your spiritual condemnation prevents you from praying.\n");
			return(0);
		}
	}

	i = player->lasttime[LT_PRAY].ltime;
	t = time(0);

	if(t - i < 600L && !player->isStaff()) {
		player->pleaseWait(600L-t+i);
		return(0);
	}

	if(player->getClass()==DEATHKNIGHT)
		chance = MIN(85, (int)(player->getSkillLevel("pray") * 10) + (bonus((int) player->strength.getCur()) * 5));
	else
		chance = MIN(85, (int)(player->getSkillLevel("pray") * 20) + bonus((int) player->piety.getCur()));

	if(mrand(1, 100) <= chance) {
		player->lasttime[LT_PRAY].ltime = t;

		if(player->getClass() != DEATHKNIGHT) {
			broadcast(player->getSock(), player->getParent(), "%M bows %s head in prayer.", player, player->hisHer());
			player->addEffect("pray", 450L, 50);
			player->lasttime[LT_PRAY].interval = 600;
		} else {
			player->addEffect("dkpray", 240L, 30);
			player->computeAC();
			player->computeAttackPower();
			player->lasttime[LT_PRAY].interval = 600L;
		}
		player->checkImprove("pray", true);
	} else {
		if(player->getClass() != DEATHKNIGHT) {
			player->print("Your prayers were not answered.\n");
		} else {
			player->print("The evil in your soul fails to aid you.\n");
		}
		player->checkImprove("pray", false);
		broadcast(player->getSock(), player->getParent(), "%M prays.", player);
		player->lasttime[LT_PRAY].ltime = t - 590L;
	}

	return(0);
}


bool Creature::kamiraLuck(Creature *attacker) {
	int	chance=0;

	if(!(cClass == CLERIC && deity == KAMIRA) && !isCt())
		return(false);

	chance = (level / 10)+3;
	if(mrand(1,100) <= chance) {
		broadcast(getSock(), getRoomParent(), "^YA feeling of deja vous comes over you.");
		printColor("^YThe luck of %s was with you!\n", gConfig->getDeity(KAMIRA)->getName().c_str());
		printColor("^C%M missed you.\n", attacker);
		attacker->print("You thought you hit, but you missed!\n");
		return(true);
	}
	return(false);
}



int Creature::getTurnChance(Creature* target) {
	double	level = 0.0;
	int		chance=0, bns=0;


	level = getSkillLevel("turn");

	switch (getDeity()) {
	case CERIS:
		if(getAdjustedAlignment() == NEUTRAL)
			level+=2;
		if(getAdjustedAlignment() == ROYALBLUE || getAdjustedAlignment() == BLOODRED)
			level-=2;
		break;
	case LINOTHAN:
	case ENOCH:
		if(getAdjustedAlignment() < NEUTRAL)
			level -=4;
		break;
	default:
		break;
	}

	level = MAX(1,level);


	bns = bonus((int)piety.getCur());

	chance = (int)((level - target->getLevel())*20) +
			bns*5 + (getClass() == PALADIN ? 15:25);
	chance = MIN(chance, 80);

	if(target->isPlayer()) {
		if(isDm())
			chance = 101;
	} else {
		if(target->flagIsSet(M_SPECIAL_UNDEAD))
			chance = MIN(chance, 15);
	}


	return(chance);
}


//*********************************************************************
//						cmdTurn
//*********************************************************************

int cmdTurn(Player* player, cmd* cmnd) {
	Creature* target=0;
	long	i=0, t=0;
	int		m=0, dmg=0, dis=5, chance=0;
	int		roll=0, disroll=0, bns=0;


	player->clearFlag(P_AFK);

	bns = bonus((int)player->piety.getCur());

	if(!player->ableToDoCommand())
		return(0);

	if(!player->isCt() && !player->knowsSkill("turn")) {
		player->print("You don't know how to turn undead.\n");
		return(0);
	}

    if(!(target = player->findVictim(cmnd, 1, true, false, "Turn whom?\n", "You don't see that here.\n")))
   		return(0);

	
	if(!player->canAttack(target))
		return(0);
	if(target->isMonster()) {
		if(player->flagIsSet(P_LAG_PROTECTION_SET)) {    // Activates lag protection.
			player->setFlag(P_LAG_PROTECTION_ACTIVE);
		}

		if(	!target->isUndead() &&
			!player->checkStaff("You may only turn undead monsters.\n"))
			return(0);

	} else {

		if( !target->isUndead() &&
			!player->checkStaff("%M is not undead.\n", target))
			return(0);

	}

	player->smashInvis();
	player->interruptDelayedActions();

	i = LT(player, LT_TURN);
	t = time(0);

	if(i > t && !player->isDm()) {
		player->pleaseWait(i-t);
		return(0);
	}


	if(target->isMonster())
		target->getAsMonster()->addEnemy(player);

	player->lasttime[LT_TURN].ltime = t;
	player->updateAttackTimer(false);

	if(	(player->getDeity() == ENOCH || player->getDeity() == LINOTHAN) &&
		player->getLevel() >= 10
	) {
		if(LT(player, LT_HOLYWORD) <= t) {
			player->lasttime[LT_HOLYWORD].ltime = t;
			player->lasttime[LT_HOLYWORD].interval = 3L;
		}
	}

	player->lasttime[LT_TURN].interval = 30L;


	// determine damage turn will do
	dmg = MAX(1, target->hp.getCur() / 2);


	switch(player->getDeity()) {
	case CERIS:
		if(player->getAdjustedAlignment() == NEUTRAL) {
			dis = 10;
			player->print("The power of Ceris flows through you.\n");
		}
		if(player->getAdjustedAlignment() == ROYALBLUE || player->getAdjustedAlignment() == BLOODRED) {
			dis = -1;
			dmg /= 2;
		}
		break;
	case LINOTHAN:
	case ENOCH:
		if(player->getAdjustedAlignment() < NEUTRAL) {
			dis = -1;
			dmg /= 2;
		}
		break;

	default:
		break;
	}

	chance = player->getTurnChance(target);

	roll = mrand(1,100);

	if(roll > chance && !player->isStaff()) {
		player->print("You failed to turn %N.\n", target);
		player->checkImprove("turn", false);
		if(target->mFlagIsSet(M_SPECIAL_UNDEAD))
			player->print("%M greatly resisted your efforts to turn %s!\n",
			      target, target->himHer());
		broadcast(player->getSock(), player->getParent(), "%M failed to turn %N.", player, target);
		return(0);
	}

	disroll = mrand(1,100);

	if((disroll < (dis + bns) && !target->flagIsSet(M_SPECIAL_UNDEAD)) || player->isDm()) {
		player->printColor("^BYou disintegrated %N.\n", target);

		broadcast(player->getSock(), player->getParent(), "^B%M disintegrated %N.", player, target);
		// TODO: SKILLS: add a bonus to this
		player->checkImprove("turn", true);
		if(target->isMonster())
			target->getAsMonster()->adjustThreat(player, target->hp.getCur());
		//player->statistics.attackDamage(target->hp.getCur(), "turn undead");

		target->die(player);
	} else {

		m = MIN(target->hp.getCur(), dmg);
		//player->statistics.attackDamage(dmg, "turn undead");

		if(target->isMonster())
			target->getAsMonster()->adjustThreat(player, m);

		player->printColor("^YYou turned %N for %d damage.\n", target, dmg);
		player->checkImprove("turn", true);

		broadcast(player->getSock(), player->getParent(), "^Y%M turned %N.", player, target);
		player->doDamage(target, dmg, CHECK_DIE);

	}

	return(0);

}

//*********************************************************************
//						cmdRenounce
//*********************************************************************
// This function allows paladins and death knights to renounce one
// another with the power of their respective gods, doing damage or
// destroying one another utterly.  --- TC

int cmdRenounce(Player* player, cmd* cmnd) {
	Creature* target=0;
	long	i=0, t=0;
	int		chance=0, dmg=0;

	if(!player->ableToDoCommand())
		return(0);

	if(!player->knowsSkill("renounce")) {
		player->print("You lack the understanding to renounce.\n");
		return(0);
	}
    
    if(!(target = player->findVictim(cmnd, 1, true, false, "Renounce whom?\n", "You don't see that here.\n")))
   		return(0);

	double level = player->getSkillLevel("renounce");
	if(target->isMonster()) {
		Monster* mTarget = target->getAsMonster();
		if( (!player->isCt()) &&
			(((player->getClass() == PALADIN) && (target->getClass() != DEATHKNIGHT)) ||
			((player->getClass() == DEATHKNIGHT) && (target->getClass() != PALADIN)))
		) {
			player->print("%s is not of your opposing class.\n", target->upHeShe());
			return(0);
		}

		player->smashInvis();
		player->interruptDelayedActions();

		if(player->flagIsSet(P_LAG_PROTECTION_SET)) {    // Activates lag protection.
			player->setFlag(P_LAG_PROTECTION_ACTIVE);
		}

		i = LT(player, LT_RENOUNCE);
		t = time(0);

		if(i > t && !player->isCt()) {
			player->pleaseWait(i-t);
			return(0);
		}

		if(!player->checkAttackTimer(true))
			return(0);

		if(!player->canAttack(target))
			return(0);

		if(mTarget)
			mTarget->addEnemy(player);

		player->updateAttackTimer(false);
		player->lasttime[LT_RENOUNCE].ltime = t;
		player->lasttime[LT_RENOUNCE].interval = 60L;

		chance = ((int)(level - target->getLevel())*20) + bonus((int)player->piety.getCur())*5 + 25;
		if(target->flagIsSet(M_PERMENANT_MONSTER))
			chance -= 15;
		chance = MIN(chance, 90);
		if(player->isDm())
			chance = 101;

		if(mrand(1,100) > chance) {
			player->print("Your god refuses to renounce %N.\n", target);
			player->checkImprove("renounce", false);
			broadcast(player->getSock(), player->getParent(), "%M tried to renounce %N.", player, target);
			return(0);
		}


		if(!player->isCt()) {
			if(target->chkSave(DEA, player, 0)) {
				player->printColor("^yYour renounce failed!\n");
				player->checkImprove("renounce", false);
				target->print("%M failed renounce you.\n", player);
				return(0);
			}
		}

		if(mrand(1,100) > 90 - bonus((int)player->piety.getCur()) || player->isDm()) {
			player->print("You destroy %N with your faith.\n", target);
			player->checkImprove("renounce", true);
			broadcast(player->getSock(), player->getParent(), "The power of %N's faith destroys %N.",
				player, target);
			mTarget->adjustThreat(player, target->hp.getCur());

			//player->statistics.attackDamage(target->hp.getCur(), "renounce");
			target->die(player);
		}
		else {
			dmg = MAX(1, target->hp.getCur() / 2);
			//player->statistics.attackDamage(dmg, "renounce");

			player->printColor("You renounced %N for %s%d^x damage.\n", target, player->customColorize("*CC:DAMAGE*").c_str(), dmg);
			player->checkImprove("renounce", true);
			//target->print("%M renounced you for %d damage!\n", player, dmg);
			broadcast(player->getSock(), player->getParent(), "%M renounced %N.", player, target);
			player->doDamage(target, dmg, CHECK_DIE);
		}

		return(0);
	} else {
		if( (!player->isCt()) &&
			(((player->getClass() == PALADIN) && (target->getClass() != DEATHKNIGHT)) ||
			((player->getClass() == DEATHKNIGHT) && (target->getClass() != PALADIN)))
		) {
			player->print("%s is not of your opposing class.\n", target->upHeShe());
			return(0);
		}
		if(!player->canAttack(target))
			return(0);


		player->smashInvis();
		player->interruptDelayedActions();

		i = LT(player, LT_RENOUNCE);
		t = time(0);

		if(i > t && !player->isCt()) {
			player->pleaseWait(i-t);
			return(0);
		}

		if(!player->checkAttackTimer())
			return(0);

		player->updateAttackTimer(false);
		player->lasttime[LT_RENOUNCE].ltime = t;
		player->lasttime[LT_RENOUNCE].interval = 60L;

		chance = ((int)(level - target->getLevel())*20) +
			bonus((int)player->piety.getCur())*5 + 25;
		chance = MIN(chance, 90);
		if(player->isDm())
			chance = 101;
		if(mrand(1,100) > chance) {
			player->print("Your god refuses to renounce %N.\n", target);
			player->checkImprove("renounce", false);
			broadcast(player->getSock(), target->getSock(), player->getParent(),
				"%M tried to renounce %N.", player, target);
			target->print("%M tried to renounce you!\n", player);
			return(0);
		}


		if(!target->isCt()) {
			if(target->chkSave(DEA, player, 0)) {
				player->printColor("^yYour renounce failed!\n");
				player->checkImprove("renounce", false);
				target->print("%M failed renounce you.\n", player);
				return(0);
			}
		}

		if(mrand(1,100) > 90 - bonus((int)player->piety.getCur()) || player->isDm()) {
			player->print("You destroyed %N with your faith.\n", target);
			player->checkImprove("renounce", true);
			target->print("The power of %N's faith destroys you!\n", player);
			broadcast(player->getSock(), target->getSock(), player->getParent(), "%M destroys %N with %s faith!",
				player, target, target->hisHer());
			//player->statistics.attackDamage(target->hp.getCur(), "renounce");
			target->die(player);

		} else {
			dmg = MAX(1, target->hp.getCur() / 2);
			//player->statistics.attackDamage(dmg, "renounce");
			player->printColor("You renounced %N for %s%d^x damage.\n", target, player->customColorize("*CC:DAMAGE*").c_str(), dmg);
			player->checkImprove("renounce", true);
			target->printColor("%M renounced you for %s%d^x damage.\n", player, target->customColorize("*CC:DAMAGE*").c_str(), dmg);
			broadcast(player->getSock(), target->getSock(), player->getParent(), "%M renounced %N!", player, target);
			player->doDamage(target, dmg, CHECK_DIE);
		}

		return(0);
	}

}

//*********************************************************************
//						cmdHolyword
//*********************************************************************
// This function will allow a cleric of Enoch to use a holyword power
// upon reaching level 13 or higher. ---TC

int cmdHolyword(Player* player, cmd* cmnd) {
	Creature* target=0;
	long	i=0, t=0;
	int		chance=0, dmg=0, alnum=0;

	if(!player->ableToDoCommand())
		return(0);

	if(!player->isCt()) {
		if(!player->knowsSkill("holyword")) {
			printf("You haven't learned how to pronounce a holy word.\n");
			return(0);
		}
		// Must be VERY good to pronounce a holy word.
		if(player->getAdjustedAlignment() < ROYALBLUE) {
			player->print("You are not good enough in your heart to pronounce a holy word.\n");
			return(0);
		}
	}


    if(!(target = player->findVictim(cmnd, 1, true, false, "Pronounce a holy word on whom?\n", "You don't see that here.\n")))
   		return(0);

	double level = player->getSkillLevel("holyword");
	if(target->isMonster()) {
		Monster* mTarget = target->getAsMonster();
		if(target->getAdjustedAlignment() >= NEUTRAL && !player->isCt()) {
			player->print("A holy word cannot be pronounced on a good creature.\n");
			return(0);
		}

		if(!player->canAttack(target))
			return(0);

		// Activates lag protection.
		if(player->flagIsSet(P_LAG_PROTECTION_SET))
			player->setFlag(P_LAG_PROTECTION_ACTIVE);


		player->smashInvis();
		player->interruptDelayedActions();


		i = LT(player, LT_HOLYWORD);
		t = time(0);

		if(i > t && !player->isDm()) {
			player->pleaseWait(i-t);
			return(0);
		}

		if(mTarget)
			mTarget->addEnemy(player);

		player->updateAttackTimer(false);
		player->lasttime[LT_HOLYWORD].ltime = t;
		if(LT(player, LT_TURN) <= t) {
			player->lasttime[LT_TURN].ltime = t;
			player->lasttime[LT_TURN].interval = 3L;
		}
		player->lasttime[LT_SPELL].ltime = t;
		player->lasttime[LT_HOLYWORD].interval = 240L;

		chance = ((int)(level - target->getLevel())*20) +
				bonus((int)player->piety.getCur())*5 + 25;

		chance = MIN(chance, 90);
		if(player->isDm())
			chance = 101;

		if(mrand(1,100) > chance) {
			player->print("Your holy word is ineffective on %N.\n", target);
			player->checkImprove("holyword", false);
			broadcast(player->getSock(), player->getParent(), "%M tried to pronounce a holy word on %N.", player, target);
			return(0);
		}

		if(!target->isCt()) {
			if(target->chkSave(LCK, player, 0)) {
				player->printColor("^yYour holyword failed!\n");
				player->checkImprove("holyword", false);
				target->print("You avoided %N's holy word.\n", player);
				return(0);
			}
		}

		if((mrand(1,100) > (90 - bonus((int)player->piety.getCur()))) || (player->isDm())) {
			player->print("Your holy word utterly destroys %N.\n", target);
			player->checkImprove("holyword", true);
			broadcast(player->getSock(), player->getParent(), "%M's holy word utterly destroys %N.",
				player, target);
			if(mTarget)
				mTarget->adjustThreat(player, target->hp.getCur());
			//player->statistics.attackDamage(target->hp.getCur(), "holyword");
			target->die(player);
		} else {
			alnum = player->getAlignment() / 100;
			dmg = mrand((int)level + alnum, (int)(level*4)) + bonus((int)player->piety.getCur());
			//player->statistics.attackDamage(dmg, "holyword");

			player->print("Your holy word does %d damage to %N.\n", dmg, target);
			player->checkImprove("holyword", true);
			target->stun((bonus((int)player->piety.getCur()) + mrand(2,6)) );

			broadcast(player->getSock(), player->getParent(), "%M pronounces a holy word on %N.", player, target);

			player->doDamage(target, dmg, CHECK_DIE);
		}

	} else {

		if(!player->isCt()) {
			if(target->getAdjustedAlignment() >= NEUTRAL) {
				player->print("%s is not evil enough for your holy word to be effective.\n", target->upHeShe());
				return(0);
			}
			if(player->getDeity() == target->getDeity()) {
				player->print("Surely you do not want to harm a fellow follower of %s.\n", gConfig->getDeity(player->getDeity())->getName().c_str());
				return(0);
			}

			if(!player->canAttack(target))
				return(0);
		}

		player->smashInvis();
		player->interruptDelayedActions();

		i = LT(player, LT_HOLYWORD);
		t = time(0);


		if(i > t && !player->isDm()) {
			player->pleaseWait(i-t);
			return(0);
		}

		player->updateAttackTimer(false);
		player->lasttime[LT_HOLYWORD].ltime = t;
		player->lasttime[LT_SPELL].ltime = t;
		if(LT(player, LT_TURN) <= t) {
			player->lasttime[LT_TURN].ltime = t;
			player->lasttime[LT_TURN].interval = 3L;
		}
		player->lasttime[LT_HOLYWORD].interval = 240L;

		chance = ((int)(level - target->getLevel())*20) +
				bonus((int)player->piety.getCur())*5 + 25;
		chance = MIN(chance, 90);
		if(player->isDm())
			chance = 101;
		if(mrand(1,100) > chance) {
			player->print("Your holy word is ineffective on %N.\n", target);
			player->checkImprove("holyword", false);
			broadcast(player->getSock(), target->getSock(), player->getParent(),
				"%M tried to pronounce a holy word on %N.", player, target);
			target->print("%M tried to pronounce a holy word you!\n", player);
			return(0);
		}

		if(!target->isCt()) {
			if(target->chkSave(LCK, player, 0)) {
				player->printColor("^yYour holyword failed!\n");
				player->checkImprove("holyword", false);
				target->print("You avoided %N's holy word.\n", player);
				return(0);
			}
		}

		if((mrand(1,100) > (90 - bonus((int)player->piety.getCur()))) || player->isDm()) {

			player->print("Your holy word utterly destroys %N.\n", target);
			player->checkImprove("holyword", true);
			target->print("You are utterly destroyed by %N's holy word!\n", player);
			broadcast(player->getSock(), target->getSock(), player->getParent(),
				"%M utterly destroys %N with %s holy word!", player, target, target->hisHer());
			player->statistics.attackDamage(target->hp.getCur(), "holyword");
			target->die(player);

		} else {
			alnum = player->getAlignment() / 100;
			dmg = (mrand((int)level + alnum, (int)(level*4))
			       + bonus((int)player->piety.getCur())) - bonus((int)target->piety.getCur());
			player->statistics.attackDamage(dmg, "holyword");

			player->printColor("Your holy word does %s%d^x damage to %N.\n", player->customColorize("*CC:DAMAGE*").c_str(), dmg, target);
			player->checkImprove("holyword", true);
			target->stun((bonus((int)player->piety.getCur()) + mrand(2,6)) );

			target->printColor("%M pronounced a holy word on you for %s%d^x damage.\n", player, target->customColorize("*CC:DAMAGE*").c_str(), dmg);
			broadcast(player->getSock(), target->getSock(), player->getParent(),
				"%M pronounced a holy word on %N!", player, target);
			player->doDamage(target, dmg, CHECK_DIE);
		}

	}

	return(0);
}


//*********************************************************************
//						cmdBandage
//*********************************************************************

int cmdBandage(Player* player, cmd* cmnd) {
	Creature* creature=0;
	Object	*object=0;
	int		heal=0;

	player->clearFlag(P_AFK);

	if(!player->ableToDoCommand())
		return(0);

	if(player->inCombat()) {
		player->print("Not while you are fighting.\n");
		return(0);
	}

	if(player->getClass() == BUILDER) {
		if(!player->canBuildObjects()) {
			player->print("You are not allowed to use items.\n");
			return(0);
		}
		if(!player->checkBuilder(player->getUniqueRoomParent())) {
			player->print("Error: Room number not inside any of your alotted ranges.\n");
			return(0);
		}
	}

	if(!player->checkAttackTimer())
		return(0);

	if(cmnd->num < 2) {
		player->print("Syntax: bandage (bandagetype)\n");
		player->print("        bandage (target) (bandagetype)\n");
		return(0);
	}

	if(cmnd->num == 2) {

		object = player->findObject(player, cmnd, 1);
		if(!object) {
			player->print("Use what bandages?\n");
			return(0);
		}

		if(player->getClass() == LICH) {
			player->print("Liches don't bleed. Stop wasting your time and regenerate!\n");
			object->decShotsCur();
			return(0);
		}

		if(object->getType() != BANDAGE) {
			player->print("You cannot bandage yourself with that.\n");
			return(0);
		}

		if(object->getShotsCur() < 1) {
			player->print("You can't bandage yourself with that. It's used up.\n");
			return(0);
		}

		if(player->hp.getCur() >= player->hp.getMax()) {
			player->print("You are at full health! You don't need to bandage yourself!\n");
			return(0);
		}


		if(player->isEffected("stoneskin")) {
			player->print("Your stoneskin spell prevents bandaging efforts.\n");
			return(0);
		}

		object->decShotsCur();

		heal = object->damage.roll();

		heal = player->hp.increase(heal);
		player->print("You regain %d hit points.\n", heal);


		if(object->getShotsCur() < 1)
			player->printColor("Your %s %s all used up.\n", object->getCName(),
			      (object->flagIsSet(O_SOME_PREFIX) ? "are":"is"));

		broadcast(player->getSock(), player->getParent(), "%M bandages %sself.",
			player, player->himHer());

		player->updateAttackTimer(true, DEFAULT_WEAPON_DELAY);

	} else {

		if(!cmnd->str[2][0]) {
			player->print("Which bandages will you use?\n");
			player->print("Syntax: bandage (target)[#] (bandages)[#]\n");
			return(0);
		}


		cmnd->str[2][0] = up(cmnd->str[2][0]);
		creature = player->getParent()->findCreature(player, cmnd->str[1], cmnd->val[1], false);
		if(!creature) {
			player->print("That person is not here.\n");
			return(0);
		}



		object = player->findObject(player, cmnd, 2);
		if(!object) {
			player->print("You don't have that in your inventory.\n");
			return(0);
		}

		if(object->getType() != BANDAGE) {
			player->print("You cannot bandage %N with that.\n", creature);
			return(0);
		}

		if(object->getShotsCur() < 1) {
			player->print("You can't bandage %N with that. It's used up.\n", creature);
			return(0);
		}


		if(creature->hp.getCur() == creature->hp.getMax()) {
			player->print("%M doesn't need to be bandaged right now.\n", creature);
			return(0);
		}

		if(creature->getClass() == LICH) {
			player->print("The aura of death around %N causes bandaging to fail.\n",creature);
			object->decShotsCur();
			return(0);
		}

		if(creature->isPlayer() && creature->inCombat()) {
			player->print("You cannot bandage %N while %s's fighting a monster.\n", creature, creature->heShe());
			return(0);
		}

		if(creature->getType() !=PLAYER && !creature->isPet() && creature->getAsMonster()->nearEnemy()
				&& !creature->getAsMonster()->isEnemy(player)) {
			player->print("Not while %N is in combat with someone.\n", creature);
			return(0);
		}


		if(creature->isPlayer() && creature->isEffected("stoneskin")) {
			player->print("%M's stoneskin spell resists your bandaging efforts.\n", creature);
			return(0);
		}

		if(creature->pFlagIsSet(P_LINKDEAD)) {
			player->print("%M doesn't want to be bandaged right now.\n", creature);
			return(0);
		}


		object->decShotsCur();

		heal = object->damage.roll();

		heal = creature->hp.increase(heal);

		player->print("%M regains %d hit points.\n", creature, heal);


		if(object->getShotsCur() < 1)
			player->printColor("Your %s %s all used up.\n", object->getCName(),
			      (object->flagIsSet(O_SOME_PREFIX) ? "are":"is"));

		broadcast(player->getSock(), creature->getSock(), player->getRoomParent(), "%M bandages %N.", player, creature);
		player->updateAttackTimer(true, DEFAULT_WEAPON_DELAY);
	}

	return(0);
}

//*********************************************************************
//						splHallow
//*********************************************************************

int splHallow(Creature* player, cmd* cmnd, SpellData* spellData) {
	int strength = 10;
	long duration = 600;

	if(player->noPotion( spellData))
		return(0);

	if(spellData->how == CAST) {
		if(player->getClass() != CLERIC && !player->isCt()) {
			player->print("Only clerics may cast that spell.\n");
			return(0);
		}
		player->print("You cast a hallow spell.\n");
		broadcast(player->getSock(), player->getParent(), "%M casts a hallow spell.", player);
	}

	if(player->getRoomParent()->hasPermEffect("hallow")) {
		player->print("The spell didn't take hold.\n");
		return(0);
	}

	if(spellData->how == CAST) {
		if(player->getRoomParent()->magicBonus())
			player->print("The room's magical properties increase the power of your spell.\n");
	}

	player->getRoomParent()->addEffect("hallow", duration, strength, player, true, player);
	return(1);
}

//*********************************************************************
//						splUnhallow
//*********************************************************************

int splUnhallow(Creature* player, cmd* cmnd, SpellData* spellData) {
	int strength = 10;
	long duration = 600;

	if(player->noPotion( spellData))
		return(0);

	if(spellData->how == CAST) {
		if(player->getClass() != CLERIC && !player->isCt()) {
			player->print("Only clerics may cast that spell.\n");
			return(0);
		}
	}
	player->print("You cast an unhallow spell.\n");
	broadcast(player->getSock(), player->getParent(), "%M casts an unhallow spell.", player);

	if(player->getRoomParent()->hasPermEffect("unhallow")) {
		player->print("The spell didn't take hold.\n");
		return(0);
	}

	if(spellData->how == CAST) {
		if(player->getRoomParent()->magicBonus())
			player->print("The room's magical properties increase the power of your spell.\n");
	}

	player->getRoomParent()->addEffect("unhallow", duration, strength, player, true, player);
	return(1);
}