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 + -
显示快捷键?