weapond.c

来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 145 行

C
145
字号
// 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,
		]),
	"strike":  ([
		"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("value", 0);
			ob->set("weapon_prop", 0);
			victim->reset_action();
		} else {
			message_vision("$N的" + weapon->name() + "和$n的" + ob->name()
				+ "相击,冒出点点的火星。\n", me, victim);
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?