#undef cquest
#define cquest (quest[QUEST_NARSIL])

bool_ quest_narsil_move_hook(char *fmt)
{
	s32b y, x;
	cave_type *c_ptr;
	int i;
	object_type *o_ptr;

	y = get_next_arg(fmt);
	x = get_next_arg(fmt);
	c_ptr = &cave[y][x];

	if (cquest.status != QUEST_STATUS_TAKEN) return FALSE;

	/* The castle of Aragorn */
	if ((c_ptr->feat != FEAT_SHOP) || (c_ptr->special != 14)) return FALSE;

	/* Look out for Narsil */
	for (i = 0; i < INVEN_TOTAL; i++)
	{
		o_ptr = &p_ptr->inventory[i];

		if (!o_ptr->k_idx) continue;

		if (o_ptr->name1 == ART_NARSIL) break;
	}

	if (i == INVEN_TOTAL) return FALSE;

	cmsg_print(TERM_YELLOW, "I heard that the broken sword had been found!");
	cmsg_print(TERM_YELLOW, "I thought it was only a rumor... until now.");
	cmsg_print(TERM_YELLOW, "What you have is really the sword that was broken.");
	cmsg_print(TERM_YELLOW, "I will get it reforged...");
	cmsg_print(TERM_L_BLUE, "Aragorn leaves for a few hours then comes back...");
	cmsg_print(TERM_YELLOW, "Here it is, Anduril, the sword that was forged and is");
	cmsg_print(TERM_YELLOW, "reforged again. Take it; you will surely need it for your quest.");

	object_prep(o_ptr, lookup_kind(TV_SWORD, SV_LONG_SWORD));
	o_ptr->name1 = ART_ANDURIL;
	apply_magic(o_ptr, -1, TRUE, TRUE, TRUE);
	object_aware(o_ptr);
	object_known(o_ptr);
	inven_item_describe(i);
	inven_item_optimize(i);

	/* Window stuff */
	p_ptr->window |= (PW_EQUIP | PW_PLAYER | PW_INVEN);

	/* Continue the plot */
	cquest.status = QUEST_STATUS_FINISHED;

	del_hook(HOOK_MOVE, quest_narsil_move_hook);
	process_hooks_restart = TRUE;

	return TRUE;
}
bool_ quest_narsil_dump_hook(char *fmt)
{
	if (cquest.status >= QUEST_STATUS_COMPLETED)
	{
		fprintf(hook_file, "\n The sword that was broken is now reforged.");
	}
	return (FALSE);
}
bool_ quest_narsil_identify_hook(char *fmt)
{
	if (cquest.status == QUEST_STATUS_UNTAKEN)
	{
		int i;
		object_type *o_ptr;
		s32b item;

		item = get_next_arg(fmt);

		/* Inventory */
		if (item >= 0)
		{
			o_ptr = &p_ptr->inventory[item];
		}

		/* Floor */
		else
		{
			o_ptr = &o_list[0 - item];
		}

		if (o_ptr->name1 == ART_NARSIL)
		{
			cquest.status = QUEST_STATUS_TAKEN;

			for (i = 0; i < 5; i++)
			{
				if (quest[QUEST_NARSIL].desc[i][0] != '\0')
				{
					cmsg_print(TERM_YELLOW, quest[QUEST_NARSIL].desc[i]);
				}
			}

			add_hook(HOOK_MOVE, quest_narsil_move_hook, "narsil_move");
			del_hook(HOOK_IDENTIFY, quest_narsil_identify_hook);
			process_hooks_restart = TRUE;
		}
	}

	return (FALSE);
}
bool_ quest_narsil_init_hook(int q_idx)
{
	if ((cquest.status >= QUEST_STATUS_TAKEN) && (cquest.status < QUEST_STATUS_FINISHED))
	{
		add_hook(HOOK_MOVE, quest_narsil_move_hook, "narsil_move");
	}
	if (cquest.status == QUEST_STATUS_UNTAKEN) add_hook(HOOK_IDENTIFY, quest_narsil_identify_hook, "narsil_id");
	add_hook(HOOK_CHAR_DUMP, quest_narsil_dump_hook, "narsil_dump");
	return (FALSE);
}
