emud/area_current/
emud/area_current/castle/
emud/area_current/newareas/
emud/area_current/nwcentral/
emud/area_current/scontinent/
emud/clans/
emud/player/
emud/player/d/e/bak/
emud/player/e/m/
emud/player/e/m/bak/
/***************************************************************************
 * Emud  2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem.   *
 *                                                                         *
 * MrMud 1.4 by David Bills and Dug Michael.                               *
 *                                                                         *
 * Merc  2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael      *
 * Chastain, Michael Quan, and Mitchell Tse.                               *
 *                                                                         *
 * Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe.     *
 ***************************************************************************/
 
#include "emud.h"

bool is_mounting( CHAR_DATA *ch )
{
	bool mounting;

	push_call("is_mounting(%p)", ch);

	mounting = (ch->mounting && ch->mounting->in_room == ch->in_room);

	pop_call();
	return mounting;
}

bool is_mounted( CHAR_DATA *ch )
{
	bool mounted;

	push_call("is_mounted(%p)", ch);

	mounted = (ch->master && ch->master->mounting == ch && ch->master->in_room == ch->in_room);

	pop_call();
	return mounted;
}

void do_mount( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;

	push_call("do_mount(%p,%p)",ch,argument);

	if (learned(ch, gsn_mount) == 0)
	{
		send_to_char("You are not skilled enough to mount anything.\n\r", ch);
		pop_call();
		return;
	}

	if (is_mounting(ch))
	{
		send_to_char("You are already mounted.\n\r", ch);
		pop_call();
		return;
	}

	if (*argument == 0)
	{
		send_to_char("Mount whom?\n\r", ch);
		pop_call();
		return;
	}

	if ((victim = get_char_room(ch, argument)) == NULL)
	{
		send_to_char("They aren't here.\n\r", ch);
		pop_call();
		return;
	}

	if (is_mounted(victim))
	{
		send_to_char("They are already mounted.\n\r", ch);
		pop_call();
		return;
	}

	if (!IS_NPC(victim) || victim->master != ch)
	{
		send_to_char("You can only mount pets.\n\r", ch);
		pop_call();
		return;
	}

	if (!IS_SET(victim->act, ACT_MOUNT))
	{
		send_to_char("They cannot be mounted.\n\r", ch);
		pop_call();
		return;
	}

	if (victim->fighting)
	{
		send_to_char("Your mount is moving too fast to be mounted.\n\r", ch);
		pop_call();
		return;
	}

	if (victim->position != POS_STANDING)
	{
		send_to_char("Your mount must be standing to be mounted.\n\r", ch);
		pop_call();
		return;
	}

	wait_state(ch, skill_table[gsn_mount].beats);

	if (number_percent() > learned(ch, gsn_mount) || (CAN_FLY(victim) && which_god(ch) != GOD_MANWE && number_range(50, 100) > learned(ch, gsn_mount)))
	{
		act("You lose your balance and fall to the ground as you try to mount $N.",	ch, NULL, victim, TO_CHAR);
		act("$n loses $s balance and falls to the ground as $e tries to mount you.",	ch, NULL, victim, TO_VICT);
		act("$n loses $s balance and falls to the ground as $e tries to mount $N.",	ch, NULL, victim, TO_NOTVICT);

		pop_call();
		return;
	}
	act("$N lowers $S head and kneels as you take your mount.",  ch, NULL, victim, TO_CHAR);
	act("You lower your head and kneel as $n mounts you.", ch, NULL, victim, TO_VICT);
	act("$N lowers $S head and kneels as $n mounts $M.",  ch, NULL, victim, TO_NOTVICT);

	ch->mounting  = victim;
	ch->furniture = NULL;

	check_improve(ch, gsn_mount);

	pop_call();
	return;
}

void do_dismount( CHAR_DATA *ch, char *argument )
{
	push_call("do_dismount(%p,%p)",ch,argument);

	if (!is_mounting(ch))
	{
		send_to_char("You are not mounted.\n\r", ch);
		pop_call();
		return;
	}

	act("You tug on the reins and dismount $N.",  ch, NULL, ch->mounting, TO_CHAR);
	act("$n yanks back on your reins and you halt quickly.", ch, NULL, ch->mounting, TO_VICT);
	act("$n pulls on $N's reins and jumps off.",  ch, NULL, ch->mounting, TO_NOTVICT);

	ch->mounting = NULL;

	pop_call();
	return;
}

void do_tame( CHAR_DATA *ch, char *argument )
{
	CHAR_DATA *victim;

	push_call("do_mount(%p,%p)",ch,argument);

	if ((victim = get_char_room(ch, argument)) == NULL)
	{
		send_to_char("They aren't here.\n\r", ch);
		pop_call();
		return;
	}

	if (learned(ch, gsn_tame) == 0)
	{
		send_to_char("You are not skilled enough to tame anything.\n\r", ch);
		pop_call();
		return;
	}

	if (!IS_NPC(victim) || !IS_SET(victim->act, ACT_MOUNT))
	{
		send_to_char("They cannot be tamed.\n\r", ch);
		pop_call();
		return;
	}

	if (victim->master)
	{
		act("$N has already been tamed.", ch, NULL, victim, TO_CHAR);
		pop_call();
		return;
	}

	if (IS_UNDEAD(ch) && !IS_UNDEAD(victim))
	{
		act("$N backs away in fear as you try to tame $M",	ch, NULL, victim, TO_CHAR);
		act("You back away in fear as $n tries to tame you.",	ch, NULL, victim, TO_VICT);
		act("$N backs away in fear as $n tries to tame $M",	ch, NULL, victim, TO_NOTVICT);

		pop_call();
		return;
	}

	if (!IS_UNDEAD(ch) && IS_UNDEAD(victim) && !rspec_req(ch, RSPEC_INTIMIDATE))
	{
		act("Black smoke billows from $N's nostrils as $E rears up to you as you try to tame $M.",	ch, NULL, victim, TO_CHAR);
		act("Black smoke billows from your nostrils as you rear up to $n as $e tries to tame you.",	ch, NULL, victim, TO_VICT);
		act("Black smoke billows from $N's nostrils as $E rears up to $n who is trying to tame $M.",	ch, NULL, victim, TO_NOTVICT);

		pop_call();
		return;
	}

	if (!IS_NPC(ch) && IS_SET(ch->act, PLR_KILLER) && !IS_EVIL(victim) && !IS_UNDEAD(victim))
	{
		act("$N cowers away in fear as you struggle to tame $M.",	ch, NULL, victim, TO_CHAR);
		act("You cower away in fear as $N struggles to tame you.",	ch, NULL, victim, TO_VICT);
		act("$N cowers away in fear as $N struggles to tame $M.",	ch, NULL, victim, TO_NOTVICT);

		pop_call();
		return;
	}

	if (victim->level > ch->level / 2 || number_percent() > learned(ch, gsn_tame))
	{
		send_to_char("You failed.\n\r", ch);
		pop_call();
		return;
	}

	if (get_pets(ch) >= 1)
	{
		send_to_char("You have too many pets.\n\r", ch);
		pop_call();
		return;
	}

	act("You tame $N.",  ch, NULL, victim, TO_CHAR);
	act("$n tames you.", ch, NULL, victim, TO_VICT);
	act("$n tames $N.",  ch, NULL, victim, TO_NOTVICT);

	add_follower(victim, ch);
	SET_BIT(victim->affected_by, AFF_CHARM);

	pop_call();
	return;
}