jiao.c

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

C
177
字号
// teach.c

#include <skill.h>
#include <ansi.h>

inherit F_CLEAN_UP;

void create() { seteuid(getuid()); }

int main(object me, string arg)
{
	string skill, student, skill_name;
	object ob;
	int student_skill, my_skill, gin_cost, grade, student_combat_exp;

	if (me->is_busy())
		return notify_fail("你现在正忙着呢。\n");

	if(!arg || (sscanf(arg, "%s %s", student, skill)!=2 ))
		return notify_fail("指令格式:teach <某人> <技能>\n");

	if( me->is_fighting() )
		return notify_fail("临阵磨枪?来不及啦。\n");

      if(!me->query("couple/have_couple")) 
		return notify_fail("你还没有伴侣呢!\n");

	if( !(ob = present(student, environment(me))) || !ob->is_character())
		return notify_fail("你要教谁?\n");
	if ( skill == "jiuyin-zhengong" ||
	     skill == "jiuyin-shenzhua" ||
	     skill == "jiuyin-shenzhang" ||
	     skill == "dafumo-quan" ||
	     skill == "jiuyin-shenfa" ||
	     skill == "xuanyin-jian" ||
	     skill == "yinlong-bian" ||
	     skill == "taixuan-gong" ||
	     skill == "shenzhao-jing" ||
	     skill == "daode-jing" )
		return notify_fail("这样武功教不会的。\n");
	if ( skill == "magic-fire" ||
	     skill == "magic-ice" ||
	     skill == "magic-water" ||
	     skill == "magic-earth" ||
	     skill == "magic-light" ||
	     skill == "magic-dark" ||
	     skill == "spells" )
		return notify_fail("魔法教不会的。\n");
	if( student != me->query("couple/couple_id") ) {
            if ((string)me->query("gender") == "女性") 
                return notify_fail("他不是你的丈夫。\n");
             else return notify_fail("她不是你的妻子。\n"); }

	if( !living(ob) )
		return notify_fail("嗯....你得先把" + ob->name() + "弄醒再说。\n");

	if (ob->is_busy())
		return notify_fail(ob->name() + "现在正忙着呢。\n");

	if( ob->is_fighting() )
		return notify_fail("临阵磨枪?来不及啦。\n");

	if( !my_skill = me->query_skill(skill, 1) )
		return notify_fail("这项技能你还不会呢!\n");
	if ( skill == "jiuyin-zhengong" ||
	     skill == "jiuyin-shenzhua" ||
	     skill == "jiuyin-shenzhang" ||
	     skill == "dafumo-quan" ||
	     skill == "jiuyin-shenfa" ||
	     skill == "xuanyin-jian" ||
	     skill == "yinlong-bian" ||
	     skill == "shenzhao-jing" ||
	     skill == "daode-jing" )
		return notify_fail("这样武功教不会的。\n");

	if( ob->prevent_learn(me, skill) )
		return 0;

      student_skill = ob->query_skill(skill, 1);

	if( my_skill <= student_skill )
		return notify_fail("这项技能" + ob->name() + "的程度已经不输于你了。\n");

	if( !SKILL_D(skill)->valid_learn(ob) ) 
	   return notify_fail("依" + ob->name() + "目前的能力,没有办法学习这种技能。\n");

	gin_cost = 300 / ((int)me->query("int") + (int)ob->query("int"));

	if( !student_skill ) {
		gin_cost *= 2;
		ob->set_skill(skill,0);
	}

	if( (int)me->query("learned_points") >= (int)me->query("potential") )
		return notify_fail("你的潜能已经发挥到极限了,没有办法再教了。\n");

	if( (int)ob->query("learned_points") >= (int)ob->query("potential") )
		return notify_fail(ob->name() + "的潜能已经发挥到极限了,没有办法再成长了。\n");

	printf("你向%s解释有关「%s」的疑问。\n", ob->name(),
		to_chinese(skill));

	if( ob->query("env/no_learn") )
		return notify_fail("但是" + ob->name() + "现在并不准备听你解释问题。\n");

	tell_object(ob, sprintf("%s向你解释有关「%s」的问题。\n",
		me->name(), to_chinese(skill)));

	if( (int)me->query("jing") > gin_cost ) {
		if( userp(me) ) me->receive_damage("jing", gin_cost );
	} else {
		write("但是你太累了,没有办法再教" + ob->name() + "。\n");
		tell_object(ob, "但是" + me->name() + "显然太累了,没有办法教你什麽。\n");
		return 1;
	}
		
	student_combat_exp = (int)ob->query("combat_exp");

	if(student_combat_exp < 10000)
		grade = 1;
	else if(student_combat_exp < 80000)
		grade = 3;
	else if(student_combat_exp < 500000)
		grade = 8;
	else
		grade = 14;

	if((int)ob->query("jing") > gin_cost )
	{
	  if( (string)SKILL_D(skill)->type()=="martial"
	   && student_skill * student_skill * student_skill / 10 > student_combat_exp) {
		tell_object(ob, "也许是缺乏实战经验,你对" + me->name() + "的解释总是无法领会。\n");
		}
		else
		{ if(skill_name = SKILL_D(skill)->query_skill_name(student_skill))
 tell_object(ob, "你听了" + me->name() + "的指导,对" + skill_name + "这一招似乎有些心得。\n");
		  else
		tell_object(ob, "你听了" + me->name() + "的指导,似乎有些心得。\n");
             
   			me->add("learned_points", 1);
			ob->add("learned_points", 1);

//			grade = (int)(student_skill / 20);
			if ( grade < 1 )
				grade = 1;
			ob->improve_skill(skill, grade*(10+random(me->query("int")-9)));
		}
	}
	else
	{
		gin_cost = ob->query("jing");
		tell_object(ob, "你今天太累了,结果什么也没有学到。\n");
	}

	ob->receive_damage("jing", gin_cost );

	return 1;
}

int help(object me)
{
        write(@HELP
指令格式 : teach <某人> <技能>
 
这个指令可以让你向你的伴侣解释有关某一种技能的疑难问题,当然,你的伴侣在这
项技能上的造诣必须比你低,而你的伴侣经由这种方式学习得来的技能也不可能高於
你,然而因为这种传授方式相当於一种「经验的传承」,因此这可以说是熟悉一种新
技能较快的方法。

此外学习也需要消耗一些精力,而消耗的精力跟你自己、与你的伴侣的悟性有关。

其他相关指令 : apprentice, practice, skills, study, learn
HELP
        );
        return 1;
}

⌨️ 快捷键说明

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