combatd.old

来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· OLD 代码 · 共 792 行 · 第 1/3 页

OLD
792
字号
// combatd.c
#include <ansi.h>
#include <skill.h>
#include <weapon.h>
#include <combat.h>
inherit F_DBASE;
int userno;object *player;
string *guard_msg = ({
	CYN "$N注视著$n的行动,企图寻找机会出手。\n" NOR,
	CYN "$N正盯著$n的一举一动,随时准备发动攻势。\n" NOR,
	CYN "$N缓缓地移动脚步,想要找出$n的破绽。\n" NOR,
	CYN "$N目不转睛地盯著$n的动作,寻找进攻的最佳时机。\n" NOR,
	CYN "$N慢慢地移动著脚步,伺机出手。\n" NOR,
});
string *catch_hunt_msg = ({
	HIW "$N和$n仇人相见分外眼红,立刻打了起来!\n" NOR,
	HIW "$N对著$n大喝:「可恶,又是你!」\n" NOR,
	HIW "$N和$n一碰面,二话不说就打了起来!\n" NOR,
	HIW "$N一眼瞥见$n,「哼」的一声冲了过来!\n" NOR,
	HIW "$N一见到$n,愣了一愣,大叫:「我宰了你!」\n" NOR,
	HIW "$N喝道:「$n,我们的帐还没算完,看招!」\n" NOR,
	HIW "$N喝道:「$n,看招!」\n" NOR,});
string *winner_msg = ({
	CYN "\n$N哈哈大笑,说道:承让了!\n\n" NOR,
	CYN "\n$N双手一拱,笑著说道:承让!\n\n" NOR,
	CYN "\n$N胜了这招,向后跃开三尺,笑道:承让!\n\n" NOR,
	CYN "\n$N双手一拱,笑著说道:知道我的利害了吧!\n\n" NOR,
	CYN "\n$n向后退了几步,说道:这场比试算我输了,下回看我怎么收拾你!\n\n" NOR,
	CYN "\n$n向后一纵,恨恨地说道:君子报仇,十年不晚!\n\n" NOR,
	CYN "\n$n脸色一寒,说道:算了算了,就当是我让你吧!\n\n" NOR,
	CYN "\n$n纵声而笑,叫道:“你运气好!你运气好!”一面身子向后跳开。\n\n" NOR,
	CYN "\n$n脸色微变,说道:佩服,佩服!\n\n" NOR,
	CYN "\n$n向后退了几步,说道:这场比试算我输了,佩服,佩服!\n\n" NOR,
	CYN "\n$n向后一纵,躬身做揖说道:阁下武艺不凡,果然高明!\n\n" NOR,});
void create()
{
	seteuid(getuid());
	set("name", "战斗精灵");
	set("id", "combatd");
}
string damage_msg(int damage, string type)
{
	string str;
	if( damage == 0 ) return "结果没有造成任何伤害。\n";
	switch( type ) {
	case "擦伤":
	case "割伤":
		if( damage < 10 ) return "结果只是轻轻地划破$p的皮肉。\n";
		else if( damage < 20 ) return "结果在$p$l划出一道细长的血痕。\n";
		else if( damage < 40 ) return "结果「嗤」地一声划出一道伤口!\n";
		else if( damage < 80 ) return "结果「嗤」地一声划出一道血淋淋的伤口!\n";
		else if( damage < 160 ) return "结果「嗤」地一声划出一道又长又深的伤口,溅得$N满脸鲜血!\n";
		else return "结果只听见$n一声惨嚎,$w已在$p$l划出一道深及见骨的可怕伤口!!\n";
		break;
	case "刺伤":
		if( damage < 10 ) return "结果只是轻轻地刺破$p的皮肉。\n";
		else if( damage < 20 ) return "结果在$p$l刺出一个创口。\n";
		else if( damage < 40 ) return "结果「噗」地一声刺入了$n$l寸许!\n";
		else if( damage < 80 ) return "结果「噗」地一声刺进$n的$l,使$p不由自主地退了几步!\n";
		else if( damage < 160 ) return "结果「噗嗤」地一声,$w已在$p$l刺出一个血肉□糊的血窟窿!\n";
		else return "结果只听见$n一声惨嚎,$w已在$p的$l对穿而出,鲜血溅得满地!!\n";
		break;
	case "瘀伤":
		if( damage < 10 ) return "结果只是轻轻地碰到,比拍苍蝇稍微重了点。\n";
		else if( damage < 20 ) return "结果在$p的$l造成一处瘀青。\n";
		else if( damage < 40 ) return "结果一击命中,$n的$l登时肿了一块老高!\n";
		else if( damage < 80 ) return "结果一击命中,$n闷哼了一声显然吃了不小的亏!\n";
		else if( damage < 120 ) return "结果「砰」地一声,$n退了两步!\n";
		else if( damage < 160 ) return "结果这一下「砰」地一声打得$n连退了好几步,差一点摔倒!\n";
		else if( damage < 240 ) return "结果重重地击中,$n「哇」地一声吐出一口鲜血!\n";
		else return "结果只听见「砰」地一声巨响,$n像一捆稻草般飞了出去!!\n";
		break;
	case "内伤":
		if( damage < 10 ) return "结果只是把$n打得退了半步,毫发无损。\n";
		else if( damage < 20 ) return "结果$n痛哼一声,在$p的$l造成一处瘀伤。\n";
		else if( damage < 40 ) return "结果一击命中,把$n打得痛得弯下腰去!\n";
		else if( damage < 80 ) return "结果$n闷哼了一声,脸上一阵青一阵白,显然受了点内伤!\n";
		else if( damage < 120 ) return "结果$n脸色一下变得惨白,昏昏沉沉接连退了好几步!\n";
		else if( damage < 160 ) return "结果重重地击中,$n「哇」地一声吐出一口鲜血!\n";
		else if( damage < 240 ) return "结果「轰」地一声,$n全身气血倒流,口中鲜血狂喷而出!\n";
		else return "结果只听见几声喀喀轻响,$n一声惨叫,像滩软泥般塌了下去!!\n";
		break;
	default:
		if( !type ) type = "伤害";
		if( damage < 10 ) str =  "结果只是勉强造成一处轻微";
		else if( damage < 20 ) str = "结果造成轻微的";
		else if( damage < 30 ) str = "结果造成一处";
		else if( damage < 50 ) str = "结果造成一处严重";
		else if( damage < 80 ) str = "结果造成颇为严重的";
		else if( damage < 120 ) str = "结果造成相当严重的";
		else if( damage < 170 ) str = "结果造成十分严重的";
		else if( damage < 230 ) str = "结果造成极其严重的";
		else str =  "结果造成非常可怕的严重";
		return str + type + "!\n";
	}
}
string eff_status_msg(int ratio)
{
	if( ratio==100 ) return HIG "看起来气血充盈,并没有受伤。" NOR;
	if( ratio > 95 ) return HIG "似乎受了点轻伤,不过光从外表看不大出来。" NOR;
	if( ratio > 90 ) return HIY "看起来可能受了点轻伤。" NOR;
	if( ratio > 80 ) return HIY "受了几处伤,不过似乎并不碍事。" NOR;
	if( ratio > 60 ) return HIY "受伤不轻,看起来状况并不太好。" NOR;
	if( ratio > 40 ) return HIR "气息粗重,动作开始散乱,看来所受的伤著实不轻。" NOR;
	if( ratio > 30 ) return HIR "已经伤痕累累,正在勉力支撑著不倒下去。" NOR;
	if( ratio > 20 ) return HIR "受了相当重的伤,只怕会有生命危险。" NOR;
	if( ratio > 10 ) return RED "伤重之下已经难以支撑,眼看就要倒在地上。" NOR;
	if( ratio > 5  ) return RED "受伤过重,已经奄奄一息,命在旦夕了。" NOR;
	return RED "受伤过重,已经有如风中残烛,随时都可能断气。" NOR;
}
string status_msg(int ratio)
{
	if( ratio==100 ) return HIG "看起来充满活力,一点也不累。" NOR;
	if( ratio > 95 ) return HIG "似乎有些疲惫,但是仍然十分有活力。" NOR;
	if( ratio > 90 ) return HIY "看起来可能有些累了。" NOR;
	if( ratio > 80 ) return HIY "动作似乎开始有点不太灵光,但是仍然有条不紊。" NOR;
	if( ratio > 60 ) return HIY "气喘嘘嘘,看起来状况并不太好。" NOR;
	if( ratio > 40 ) return HIR "似乎十分疲惫,看来需要好好休息了。" NOR;
	if( ratio > 30 ) return HIR "已经一副头重脚轻的模样,正在勉力支撑著不倒下去。" NOR;
	if( ratio > 20 ) return HIR "看起来已经力不从心了。" NOR;
	if( ratio > 10 ) return RED "摇头晃脑、歪歪斜斜地站都站不稳,眼看就要倒在地上。" NOR;
	return RED "已经陷入半昏迷状态,随时都可能摔倒晕去。" NOR;
}
int bounce = 0;
int absorb_vic;
varargs void report_status(object ob, int effective)
{
	        if( effective ) 
                message_vision( "( $N" + eff_status_msg(
                        (int)ob->query("eff_qi") * 100 / 
(int)ob->query("max_qi") ) 
                        + " )\n", ob);
        else
                message_vision( "( $N" + status_msg(
                        (int)ob->query("qi") * 100 / 
(int)ob->query("max_qi") ) 
                        + " )\n", ob);
}

// This function calculates the combined skill/combat_exp power of a certain
// skill. This value is used for A/(A+B) probability use.
varargs int skill_power(object ob, string skill, int usage)
{
       int status, level, power;
	if( !living(ob) ) return 0;
	level = ob->query_skill(skill);
	switch(usage) {
		case SKILL_USAGE_ATTACK:
			level += ob->query_temp("apply/attack");
			break;
		case SKILL_USAGE_DEFENSE:
			level += ob->query_temp("apply/defense");
			if (ob->is_fighting())
				level = level * (100 + ob->query_temp("fight/dodge")) / 100;
			break;
	}
	if( !level ) return (int)ob->query("combat_exp") / 2;
	power = (level / 3)*level*level;
	if (usage == SKILL_USAGE_ATTACK)
		return (power + ob->query("combat_exp")) / 30 * (ob->query_str() + ob->query_temp("str"));
	else
		return (power + ob->query("combat_exp")) / 30 * (ob->query_dex() + ob->query_temp("str"));
}
void fight_reward(object winner, object loser)
{
        object owner;

        if(owner=winner->query("possessed"))  winner = owner;
        winner->win_enemy(loser);
}
void fight_penalty(object winner, object loser)
{
        object owner;

        if(owner=loser->query("possessed"))  loser = owner;
        loser->lose_enemy(winner);
}
/*// do_protect()
// a function that checks to see if there is anything/anyone protects our victim

int do_protect(object me, object weapon,int ap, object victim)
{
	object *pros;
	string output;
	int pp;
	string parry_skill;
	int i;
	pros = victim->query_temp("protectors");
	i = random(sizeof(pros));
	if(!pros[i]) { 
	pros -= ({ pros[i] });
	if(!sizeof(pros)) victim->delete_temp("protectors");
	return 0;     }
	
	if(environment(pros[i]) != environment(victim)) return 0;
	if(pros[i]->is_character())
	{
                //      Check if the pros[i] can parry this attack for the victim.
                if( pros[i]->query_temp("weapon") ) {
                        pp = skill_power(pros[i], "parry", 
SKILL_USAGE_DEFENSE);
                        if( !weapon ) pp *= 2;
                } else {
                        if( weapon ) pp = skill_power(pros[i], "unarmed",SKILL_USAGE_DEFENSE)/2;
                        else pp = skill_power(pros[i], "unarmed", 
SKILL_USAGE_DEFENSE);
                }
                if( pros[i]->is_busy() ) pp /= 3;
                if( pp < 1 ) pp = 1;
                if( random(ap + pp)< pp ) {
        	if(pros[i]->query_temp("weapon")){
                parry_skill = pros[i]->query_skill_mapped("parry");
                if( !parry_skill)  parry_skill = "parry";
        	}
        	else
        	{
                parry_skill = pros[i]->query_skill_mapped("unarmed");
                if(!parry_skill) parry_skill = "unarmed";
        	}
		output = SKILL_D(parry_skill)->query_parry_msg(weapon);
        	if( pros[i]->query_temp("weapon"))
        	output = replace_string( output, "$v", (pros[i]->query_temp("weapon"))->name());
		output = replace_string( output, "$n", pros[i]->name()); 
		output = replace_string( output, "$p", pros[i]->name()); 
		victim->set_temp("protectors_msg", output);
		return 1;
		}
		else
			return 0;
	}
	else {
	victim->set_temp("protectors_msg",pros[i]->protection_msg());
	return pros[i]->protection();
	}

}*/

// do_attack()
//
// Perform an attack action. This function is called by fight() or as an
// interface for some special utilize in quests.
//
varargs int do_attack(object me, object victim, object weapon, int 
attack_type, string attack_msg, string damtype)
{
	mapping my, your, prepare, action;
	string limb, *limbs, result;
	string attack_skill, force_skill, martial_skill, dodge_skill,absorb_skill,parry_skill;
	mixed foo;
	int ap, dp, pp;
	int damage, damage_bonus, defense_factor;
	int cost;
	int wounded = 0;
 //      player=users();

 // (0.5) First see if we are capable of attack
	if(me->query_temp("is_unconcious")) return 1;
	my = me->query_entire_dbase();
	your = victim->query_entire_dbase();
 	// (0) Choose skills.
	//
	prepare = me->query_skill_prepare();
	if (!prepare) prepare = ([]);
	if( objectp(weapon) )	attack_skill = weapon->query("skill_type");

⌨️ 快捷键说明

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