// weapond.c

#include <ansi.h>
#include <combat.h>

mapping weapon_actions = ([
	"slash": ([
		"damage_type":	"澄端",
		"action":		"$N揣笆$w辟$n$l",
		"parry":		20,
		]),
	"slice": ([
		"damage_type":	"辶端",
		"action":		"$Nノ$w┕$n$l",
		"dodge":		20,
		]),
	"chop": ([
		"damage_type":	"辶端",
		"action":		"$N$w绰帝$n$l糀盢筁",
		"parry":		-20,
		]),
	"hack": ([
		"action":		"$N揣籖$w癸非$n$l皚睹",
		"damage_type":	"辶端",
		"damage":		30,
		"dodge":		30,
		]),
	"thrust": ([
		"damage_type":	"端",
		"action":		"$Nノ$w┕$n$l",
		"dodge":		15,
		"parry":		-15,
		]),
	"pierce": ([
		"action":		"$N$w┕$n$l讯",
		"damage_type":	"端",
		"dodge":		-30,
		"parry":		-30,
		]),
	"whip": ([
		"action":		"$N盢$w喘┕$n$l┾",
		"damage_type":	"聾端",
		"dodge":		-20,
		"parry":		30,
		]),
	"impale": ([
		"action":		"$Nノ$w┕$n$l耊筁",
		"damage_type":	"端",
		"dodge":		-10,
		"parry":		-10,
		]),
	"bash": ([
		"action":		"$N揣籖$w┕$n$lノ埋",
		"damage_type":	"端",
		"post_action":	(: call_other, __FILE__, "bash_weapon" :),
		]),
	"crush": ([
		"action":		"$N蔼蔼羭癬$w┕$n$l讽繷瘂",
		"damage_type":	"端",
		"post_action":	(: call_other, __FILE__, "bash_weapon" :),
		]),
	"slam": ([
		"action":		"$Nも搐$w泊臩瞨癸非$n$l揣筁",
		"damage_type":	"端",
		"post_action":	(: call_other, __FILE__, "bash_weapon" :),
		]),
	"throw": ([
		"action":		"$N盢$w癸非$n$l甮筁",
		"damage_type":	"端",
		"post_action":	(: call_other, __FILE__, "throw_weapon" :),
		]),
]);

varargs mapping query_action()
{
	string verb, *verbs;

	verbs = previous_object()->query("verbs");

	if( !pointerp(verbs) ) return weapon_actions["hit"];
	else {
		verb = verbs[random(sizeof(verbs))];
		if( !undefinedp(weapon_actions[verb]) ) return weapon_actions[verb];
		else return weapon_actions["hit"];
	}	
}

void throw_weapon(object me, object victim, object weapon, int damage)
{
	if( objectp(weapon) ) {
		if( (int)weapon->query_amount()==1 ) {
			weapon->unequip();
			tell_object(me, "\n" + weapon->query("name") + "ノЧ\n\n");
		}
		weapon->add_amount(-1);
	}
}

void bash_weapon(object me, object victim, object weapon, int damage)
{
	object ob;
	int wap, wdp;

	if( objectp(weapon)
	&&	damage==RESULT_PARRY
	&&	ob = victim->query_temp("weapon") ) {
		wap = (int)weapon->weight() / 500
			+ (int)weapon->query("rigidity")
			+ (int)me->query("str");
		wdp = (int)ob->weight() / 500
			+ (int)ob->query("rigidity")
			+ (int)victim->query("str");
		wap = random(wap);
		if( wap > 2 * wdp ) {
			message_vision(HIW "$N谋眔もい" + ob->name() + "рぃ﹚叉も\n" NOR,
				victim);
			ob->unequip();
			ob->move(environment(victim));
			victim->reset_action();
		} else if( wap > wdp ) {
			message_vision("$N谋眔もい" + ob->name() + "綺繧ㄇ叉も\n",
				victim);
		} else if( wap > wdp / 2 ) {
			message_vision(HIW "钮ǎ霸羘$Nもい" + ob->name()
				+ "竒耞ㄢ篒\n" NOR, victim );
			ob->unequip();
			ob->move(environment(victim));
			ob->set("name", "耞奔" + ob->query("name"));
			ob->set("value", (int)ob->query("value") / 10);
			ob->set("weapon_prop", 0);
			victim->reset_action();
		} else {
			message_vision("$N" + weapon->name() + "㎝$n" + ob->name()
				+ "阑玙翴翴琍\n", me, victim);
		}
	}
}
