//Cracked by Roath
// bula and mon@xyj
// base file for inheritance.
//modify for 大唐西游2 by huarong 2003/12

inherit NPC;

#include <ansi.h>
#include "/d/dntg/yunlou/npc/yaoguai_reward.c";

string _invocation(object who, int level);
int exp_reward, pot_reward;
int other_kee=0, other_sen=0;
int announced=0;
//nosave int beat_time;
nosave int tick;

object offensive_target(object me)
{
        int sz;
        object *enemy;

        if( !me || !me->query_enemy() || !arrayp(me->query_enemy()) ) return 0;

        sz = sizeof(enemy);
        if( sz > 4 ) sz = 4;

        if( sz > 0 ) return enemy[random(sz)];
        else return 0;
}


string *death_msg= ({
"$N喝道：孽畜，与我回天上领罪去吧！\n$n眼见无奈，只好化成股青烟附到了$N的手中。\n",
"$n一看不是$N的对手，只得就地一滚，变回原形，打了几个转，老老实实地走开了。\n",
"$n大叫一声“我服了，我服了，我投降。。”乖乖地伏在$N脚下不动了。\n$N手一挥，$n如蒙大赦，驯服地走开了。\n",
"$N喝道：孽畜，与我回天上领罪去吧！\n$n无可奈何，化做一道青光，直冲云霄去了．．．\n",
});
string *dirs1 = ({
"/d/city",
//"/d/jjf",
"/d/westway",
"/d/kaifeng",
"/d/lingtai",
"/d/moon",
"/d/gao",
//"/d/dntg/hgs", 
"/d/sea", 
"/d/nanhai", 
"/d/eastway",
"/d/ourhome/honglou", 
});

string *dirs2 = ({
"/d/xueshan",
"/d/qujing/wuzhuang", 
"/d/qujing/baotou", 
"/d/qujing/baoxiang", 
"/d/qujing/bibotan",
"/d/qujing/biqiu",
"/d/qujing/chechi",
"/d/qujing/dudi",
"/d/qujing/fengxian",
"/d/qujing/firemount",
"/d/qujing/jilei",
"/d/qujing/jindou",
"/d/qujing/jingjiling",
"/d/qujing/jinping",
"/d/qujing/jisaiguo",
"/d/qujing/maoying",
"/d/qujing/nuerguo",
"/d/qujing/pingding",
"/d/qujing/pansi",
"/d/qujing/tongtian",
"/d/qujing/qilin",
"/d/qujing/qinfa",
"/d/qujing/qinglong",
"/d/qujing/tianzhu",
"/d/qujing/wudidong",
"/d/qujing/wuji",
"/d/qujing/xiaoxitian",
"/d/qujing/yinwu",
"/d/qujing/yuhua",
"/d/qujing/zhujie",
"/d/qujing/zhuzi",
// "/d/pantao",
});

string *dirs3 = ({
"/d/death",  
"/d/meishan",
"/d/qujing/lingshan",
});

string *names1 = ({
  "獭","ta",
  "鹿","lu",
  "獾","huan",
  "狗","gou",
  "猪","zhu",
  "猴","hou",
  "狒","fei",
  "蟒","mang",
});

string *names2 = ({
  "头","tou",
  "尾","wei",
  "脚","jiao",
  "爪","zhua",
  "嘴","zui",
  "牙","ya",
  "颈","jing",
  "眼","yan",
  "背","bei",
  "耳","er",
  "舌","she",
  "身","shen",
});

string *names3 =({
"兔","tu",		"狐","hu",
"龙","long",		"蛟","jiao",
"虎","hu",		"豹","bao",
"马","ma",		"鹿","lu",
"羊","yang",		"蛇","she",
"獐","zhang",	        "鸡","ji",
"狗","gou",		"狼","lang",
"猿","yuan",		"猴","hou",
"鼠","shu",		"牛","niu",
"猪","zhu",		"蝠","fu",
"豺","chai",		"獭","lai",
"狒","fei",		"蟒","mang",
"熊","xiong",	        "象","xiang",
"貂","diao",		"狸","li",
"獾","huan",		"罴","pi",
"燕","yan",		"蚓","yin",
"雉","zhi",		"狍","pao",
"猊","ni",		"獒","ao",
"羚","ling",		"麂","ji",
"猩","xing",
});

string *color = ({
"赤","chi",		"红","hong",
"黄","huang",	        "绿","lv",
"青","qing",		"蓝","lan",
"紫","zi",		"乌","wu",
"黑","hei",		"银","yin",
"白","bai",		"金","jin",
"灰","hui",		"木","mu",
"水","shui",		"火","huo",
"土","tu",		"胃","wei",
"鬼","gui",		"月","yue",
"朱","zhu",		"日","ri",
"斗","dou",		"觜","zui",
"奎","kui",		"参","shen",
});

string *names4 = ({
	"狐","hu",
	"熊","xiong",
	"蝎","xie",
	"蟾蜍","chanchu",
	"蜈蚣","wugong",
	"鳖","bie",
	"蝗","huang",
	"虫","chong",
	"蚤","zao",
	"虱","shizi",
	"虎","hu",
	"狮","shi",
	"兔","tu",
	"豹","bao",
	"羊","yang",
	"猴","hou",
	"狼","lang",
	"猪","zhu",
	"蜘蛛","zhizhu",
	"鹿","lu",
	"鸡","ji",
	"刺猬","ciwei",
	"猩猩","xingxing",
	"狒狒","feifei",
	"马","ma",
	"猫","mao",
	"驴","lv",
	"牛","niu",
	"鼠","shu",
	"蚂蚁","mayi",
	"蚁","yi",
	"蛇","she",
	"蟒","mang",
	"狸","li",
	"鳄","e",
	"驼","tuo",
	"鱼","yu",
	"蚊","wen",
	"蜂","feng",
	"鸟","niao",
	"鸦","ya",
	"蛙","wa",
	"蝶","die",
	"雀","que",
	"蝉","chan",
	"鹰","ying",
	"象","xiang",
	"鲵","ni",
	"貂","diao",
	"鹫","jiu",
	"鹅","e",
	"隼","sun",
	"虾","xia",
	"鹦鹉","yingwu",
	"鹊","que",
	"莺","ying",
	"獭","ta",
	"豚","tun",
	"螳螂","tanglang",
	"龟","gui",
	"蟹","xie",
	"鸠","jiu",
	"鲸","jing",
});

int yaoguai_type=0;

int random_place(object me, string* dirs);
void _leave();
void leave();
void leave2();
void set_skills(int,int);

void setname1()
{
        int i,j,k;
	string name, *id;

	i=(random(sizeof(names1)/2))*2;
	j=(random(sizeof(names2)/2))*2;
	k=(random(sizeof(names3)/2))*2;

	name=names1[i]+names2[j]+names3[k];
	id=({names1[i+1]+names2[j+1]+" "+
	    names3[k+1], names3[k+1]});

	set_name(name,id);

	set("race", "野兽");
	if (random(2) > 0 ) {
	  set("gender", "雄性");
	} else {
	  set("gender", "雌性");
	}
	yaoguai_type=1;
}

void setname2()
{
    int i, j, k, n;
    string name, *id;
    i=(random(sizeof(names4)/2))*2;
    k=(random(sizeof(color)/2))*2;
    n=(random(sizeof(names2)/2))*2;
    j=random(2);
    
    name=color[k]+names2[n]+names4[i]+(j?"精":"怪");
    id=({color[k+1]+names2[n+1]+" "+names4[i+1]+" "+(j?"jing":"guai"),
	    (j?"jing":"guai")});

    set("race", "野兽");
    set("gender",(j?"雌性":"雄性"));
    set_name(name,id);
    yaoguai_type=2;
}

int cast_chance(int level) 
{
    return 5+level/2;
}

void create()
{
	set("quest_npc",1);
        if(random(2)==0)
	    setname1();
	else
	    setname2();

	set("chat_chance", 5);
	set("chat_msg", ({
	     (: random_move :)
	}) );

	set("chat_chance_combat", 5);

	set("age", 20+random(80));
	set("class", "yao");
	set("combat_exp", 3000);
       set("attitude", "heroism");
       set("lijingguai", 1);
	set_skill("unarmed", 10);
	set_skill("jinghun-zhang", 10);
	map_skill("unarmed", "jinghun-zhang");
	set_skill("dodge", 10);
	set_skill("ghost-steps", 10);
	map_skill("dodge", "ghost-steps");
	set_temp("apply/armor", 25);
	
	set("limbs", ({
	       "头部", "颈部", "胸口", "后心", "左肩", "右肩", "左臂",
	       "右臂", "左爪", "右爪", "腰间", "小腹", "前腿", "后腿",
	       "前爪", "后爪" }) );

        setup();
}

void copy_status(object me,object ob, int lv)
{
        int lvl,k,m,temp;
        mapping skill_status;
        string *sname;

        object qm=new("/d/changan/npc/qianmian.c");
	 int base=20;

	 lvl=lv+base-2;

        if(qm) {
            mapping skill=ob->query_skills();
            int i=sizeof(skill);
            int *level, max_level;
	     int max_sen, max_kee;

	    if(i>0) {
		level=values(skill);
		max_level=level[0];
		while(i--) { // find out victim's maximum level
		    if(level[i]>max_level)
			max_level=level[i];
		}
                max_level=max_level*(lvl+20)/(base+20);

	    } else max_level=1;

            qm->copy_status(this_object(), ob, lvl*5/6);
            destruct(qm);

	    k=(query("daoxing")+query("combat_exp"))/2;
	    for(m=1;m<300;m=m+10) {
		if(m*m*m/10>k) break;
	    }
	    m=m*lvl/base/3;
	    if(max_level<m) max_level=m;

	    // skill level will be set to the maximum level
	    // of the player.

            //huarong 2004/12
            if (mapp(skill_status = me->query_skills()))//判断自己是否有功夫，如有将用这个函数全部删除
               {
                  skill_status = me->query_skills();
                  sname = keys(skill_status);//传回所有自己的功夫阵列
                  temp = sizeof(skill_status);
                  for (i = 0; i < temp; i++)
                  me->set_skill(sname[i],max_level);
                }
	    set_skills(max_level, lv);
	    
	    max_sen=query("max_sen")/3;
	    max_kee=query("max_kee")/3;
	    add("eff_sen",max_sen);
	    add("eff_kee",max_kee);
	    add("sen",max_sen);
	    add("kee",max_kee);
	    add("max_sen",max_sen);
	    add("max_kee",max_kee);

	} else { // sth goes wrong.
	    leave();
	    return;
	}

	if((query("daoxing")+query("combat_exp"))/2
		>1000000)
	  add("force",query("force")); // double force.
	                               // because players have fabao.
	                               // mana is doubled when copying.
        set("force_factor", query_skill("force")/2);
        set("mana_factor", query("max_mana")/30+1);
	
	 set("daoxing",(query("daoxing")*2+query("combat_exp"))/3);
//}
              set_temp("apply/armor_vs_force", query_skill("force", 1)*3);
              set_temp("apply/armor_vs_spells", query_skill("spells")*3);
}
int random_place(object me, string* dirs)
{
        int  i, j, k;
        object  newob;
        mixed*  file, exit;

        if( !sizeof(dirs) )  return 1;

        i = random(sizeof(dirs));    // pick up one directory

        file = get_dir( dirs[i]+"/*.c", -1 );
        if( !sizeof(file) )             return 1;

	for(k=0;k<30;k++) { // try 20 times
           j = random(sizeof(file));
           if( file[j][1] > 0 ) {
             newob=load_object(dirs[i]+"/"+file[j][0]);
             if (newob) {  
               if(newob->query("no_fight") ||
		       newob->query("no_magic") ||
		       newob->query("no_mieyao") ||
		       !(exit=newob->query("exits")) ||
		       sizeof(exit)<1)
		   continue;

               if(me->move(newob)) {
		   message_vision("$N走了过来。\n",me);
		   return 1;
	       }
	     }
	   }
	}

        return 0;
}

void _leave()
{
    object me=this_object();
    
    // if in fighting, then don't disappear.
    if(me->is_fighting() || me->is_busy())
	return;
    leave();
}

void leave()
{
      if(this_object()) { 
        if(environment())
          message("vision",HIB + name() + 
		  "身子一晃，变成一股青烟散去了。\n" NOR,environment());
	this_object()->move("/obj/empty");
	call_out("leave2",1);
      }
      return;
}

void leave2()
{
    if(this_object()) {
	destruct(this_object());
    }
}

string invocation(object who, int level)
{
        object me=this_object();

       if(level<9)
         copy_status(me,who, level-2);
       else
        copy_status(me,who, level);	
	return _invocation(who, level); 
}

string _invocation(object who, int level)
{       object me=this_object(), env;
        string *dirs; 
        int exp, i, lvl;
	 string where, long;
	
	dirs=dirs1;

        set("owner", who->query("id"));
        set("owner_ob", who);

	if(yaoguai_type==1) {
        long="一头"+name()+"，修练了有"+
	  chinese_number((query("daoxing")/1000/10)*10)+
	  "多年道行。它";
        if(random(2)==0) {
	  set("long",long+"通体透出一丝仙气。\n");
        } else {
	  set("long",long+"混身上下妖气逼人。\n");
        }
	} else if(yaoguai_type==2) {
	    int dx=query("daoxing");
	    long="一只"+query("name")[0..<3]+
		"，在"+({"深山中","密林中","野外",
			"草原上","野林中","高山中",
			"莽林中","莽原上","深谷中",
			})[random(9)]+
	        "汲取"+({"日月","天地","万物"})[random(3)]+
		    "精华，颇有了些道行。\n";
            set("long",long);
	    
	    if(dx>=10000000)
		long="万年";
	    else if(dx>=1000000)
		long="千年";
	    else if(dx>=100000)
		long="百年";
	    else if(dx>10000)
		long="十年";
	    else
		long="小小";
	    
        set("title",long);
//  if (!random(3)) set("title","米国鬼子")
	}

	lvl=level;
	
	// choose npc type.
	i=random(1000);
	if(i<10) {
	    set("type","aggressive");
	} else if(i<20) {
	    set("type","blocker");
	} else if(i<220) {
	    set("type","aggressive_on_owner");
	} else if(i<320) {
	    set("type","aggressive_on_owner1");
	} else 
	    set("type","normal");
	
	if(random(10)==0) {
	    set("env/wimpy",40);
	    if(lvl<11) lvl=lvl+1; // as more difficult to kill.
	} else {
	    set("env/wimpy",1);
	}

// as more difficult to kill  ,grin. huarong 2003/12 
	if(random(100)>97) set("bian",1);

	// determine reward
	exp=(who->query("combat_exp")+who->query("daoxing"))/2;
	        
  if(exp<1000000) {
      exp_reward=200+(exp/2000);
	    pot_reward=100+(exp/20000);
	}
// nanf 2011-1-10降低了lijing奖励的上限
//else if(exp<12500000) {
  else if(exp<9000000) {
      exp_reward=200+((to_int(sqrt(to_float(exp))))/2);
	    pot_reward=50+((to_int(sqrt(to_float(exp))))/10);
	} 
	else {
	    exp_reward=1700;
	    pot_reward=350;
	 // exp_reward=2000;
	 // pot_reward=400;
	}

  if(exp<1000000) {
	    dirs=dirs;
	}
  else if(exp<3000000) {
	    dirs=dirs+dirs2;
	}
  else {
	    dirs=dirs+dirs2+dirs3;
	}	
	pot_reward=pot_reward*(lvl+1)/10;
	exp_reward=exp_reward*(lvl+1)/10;
	
	// 降低lijing奖励，整体上相当于原来的50%
	// dammy 2010-12-28
	exp_reward=exp_reward/3+random(exp_reward/3+1);
	pot_reward=pot_reward/3+random(pot_reward/3+1);
//	exp_reward=exp_reward/2;
//	pot_reward=pot_reward/2;

	me->set("stay_time", time()+1800);

	if(!random_place(me, dirs)) {
	    leave();
	    return 0;
	}
	
	env=environment(me);
	where=me->query("name")+"("+
	    capitalize(me->query("id"))+")";
	if(env)
	  where+="在"+MISC_D->find_place(env);
	return where;
}

int accept_object (object who, object ob)
{
  object me;
  me = this_object();

  if ((! ob) ||
       ob->value() < 100000)
  {
    message_vision ("$N一瞪眼：就这点东西？不想活了？？？\n", me);
    return 1;
  }
  who->set_temp("mieyao/allow_to_go", 1);
  message_vision ("$N嘿嘿嘿几声怪笑：算你走运，快滚！"
	  +"可别让我再看见你！\n",me);
  return 1;
}

void check_room()
{
    object me=this_object();
    object env=environment(me);
    if(!living(me)) return;
    if(env && (env->query("no_fight") ||
           env->query("no_magic"))) {
        random_move();
    }
    
}

void init()
{
    object me=this_object();
    object who=this_player();
    string type;
    object *bianobj;
    string npcid;
    int t;
    object env=environment(me);

if (me->query("bian")==1 )
  {
    if(time()-me->query("bian_end")<10)
    	 return;
    if (env) bianobj=all_inventory(env);
    if(!bianobj||sizeof(bianobj)<2) random_move();
    for(t==0;t<sizeof(bianobj);t++)
    {
    	npcid=bianobj[t]->query("id");
    	if(npcid==me->parse_command_id_list())
            continue;
    	if(npcid==me->query("bian"))
            continue;
        if(!living(bianobj[t]))
            continue;
        if("/cmds/std/bian"->main(me,npcid))
          {
            me->add("mana",500);
            me->set("bian",npcid);
            me->set("bian_end",time());
            break;
          }
    }
  }

    ::init();
    t=query("stay_time");
    
    // if overtime too long, then destroy. mon 7/14/99
    if(t && time()>(t+1200)) {
	remove_call_out("leave");
	call_out("leave",1);
	return;
    }

    if(t && time()>t) {
	remove_call_out("_leave");
	call_out("_leave",300);
    }
    
    if(!userp(this_player())) return;
    if(!living(this_object())) return;
    type=query("type");
    switch (type) {
	case "aggressive": {
	    object leader=query_leader();
	    int exp, myexp;
	    if(leader && present(leader, environment(me))) {
		if(!is_fighting()) kill_ob(leader);
		break;
	    }
	    exp=(who->query("combat_exp")+
		    who->query("daoxing"))/2;
	    myexp=(query("combat_exp")+
		    query("daoxing"))/2;
	    if(exp>myexp*3 || exp<myexp)
		break;

	    set_leader(who);
	    message_vision("$N盯着$n，馋得直流口水：嘿嘿．．．\n",
		    this_object(), who);
	    kill_ob(who);
	    break;
	}
	case "aggressive_on_owner1":
	    if(query("owner")==this_player()->
		    query("id")) {
		if(!announced) {
		  message_vision("$N看见$n，大叫一声：哈哈，送上门来的肉！\n",
			this_object(), who);
		  announced=1;
		}
		kill_ob(this_player());
		if(random(4)>0)
		    set_leader(who);
		else
		    set_leader(0);
		this_player()->kill_ob(this_object());
	    }
	    break;
	case "aggressive_on_owner":
	    if(query("owner")==this_player()->
		    query("id")) {
		if(!announced) {
		  message_vision("$N看见$n，大叫一声：哈哈，送上门来的肉！\n",
			this_object(), who);
		  announced=1;
		}
		kill_ob(this_player());
		this_player()->kill_ob(this_object());
	    }
	    break;
	case "blocker": {
	    add_action("do_block","",1);
	    break;
	}
    }
    remove_call_out("check_room");
    call_out("check_room",2);
}

int do_block(string arg)
{	
    object me=this_object();
    object who=this_player();
    string verb=query_verb();
    int t;
    
    if(wizardp(who) && !visible(who)) return 0;
    if(me->is_fighting()) return 0;

    if(verb!="go" &&
	    verb!="fly" &&
	    !(environment() && environment()->query("exits/" + verb)))
	return 0;

    if(who->query_temp("mieyao/allow_to_go")) {
	who->delete_temp("mieyao/allow_to_go");
	who->delete_temp("mieyao/leave_time");
	return 0;
    }
    t=who->query_temp("mieyao/leave_time");
    if(t>0 && time()>t) {
	who->delete_temp("mieyao/leave_time");
	message_vision("$n乘$N一个不注意，急忙溜了过去。\n",me,who);
	return 0;
    }
    if(t==0) {
        t=time()+30+random(90);
        who->set_temp("mieyao/leave_time",t);
	message_vision("$N猛地跳过来拦在$n面前，高声叫道：\n"+
		"          此山是我开，此树是我栽！\n"+
		"          要打此路过，留下买路财！\n\n",me,who);
    } 
    
    tell_object(who,me->name()+"一把抓住了你！\n");
    return 1;
}

void unconcious()
{
  if (query("kee")<0 || query("sen")<0) die();
   else ::unconcious();
}

void die()
{
        string owner;
        string skill;
        object owner_ob,newitem,silver,gold,stone;
        object me=this_object();
	 string str,err;
	 string msg;
	 int max_kee, max_sen, ratio, exp_r, pot_r;
   int dx_r,i ,myexp,level;
   object killer = me->query_temp("last_damage_from");
   int ztstone_chance,life_chance;
	
	if(time()>(1296662400-808+7*3600*24))
   {
   	ztstone_chance = 200;
   	life_chance = 1000;
   }
   else
   {
   	ztstone_chance = 50;
   	life_chance = 300;
   }
   
       if(objectp(killer)&&killer->query("is_guard") == 1) killer = killer->query("possessed");
        owner = me->query("owner");

   if( stringp(owner) && objectp(killer) && objectp(owner_ob = find_player(owner)) ) 
     {
	    if( killer == owner_ob
              && !present("feng lingzhu", owner_ob)
	       && !present("lei lingzhu", owner_ob)
	       && !present("shui lingzhu", owner_ob)
	       && !present("sheng lingzhu", owner_ob)
              && !present("huo lingzhu", owner_ob)
              && !present("tu lingzhu", owner_ob))
            {
//         message_vision(death_msg[random(sizeof(death_msg))],owner_ob,this_object());

		    max_kee=query("max_kee");
		    max_sen=query("max_sen");
		    ratio=100*(max_kee-other_kee)/max_kee;
		    if(ratio<0) ratio=0;
		    ratio=ratio*(max_sen-other_sen)/max_sen;
		    if(ratio<0) ratio=0;
                   
                    exp_r=(exp_reward*ratio/60);
                    pot_r=(pot_reward*ratio/60);
                     dx_r=(exp_reward*ratio/90);

	    } else {
		message_vision("$N死了。\n",this_object());
		exp_r=0;
		pot_r=0;
               dx_r=0;
		ratio=0;
	    }
	    
//随机掉钱 huarong 2004/3
        myexp=(this_object()->query("combat_exp",1)+this_object()->query("daoxing",1))/2;
        if(myexp <  500000) i=0;
        else i=(to_int(sqrt(to_float(myexp/100000-1))))-1;
        if (i>10) i=10;
        silver=new("/obj/money/silver");
        level=owner_ob->query_temp("mieyao/level",1);
        if (i<1)
        {
          silver->set_amount(random(10+myexp/500000)+30);
        }
        else if (i<2)
        {
          silver->set_amount(random(myexp/5000)+50);
        }
        else
        {
          silver->set_amount(random(i*10)+50+(level-5)*10);       	
          gold=new("/obj/money/gold");
          gold->set_amount(random(random(random(i+1)))+1);
          if ( gold->move(environment(owner_ob)) )
          message_vision("$N丢下了一"+gold->query("unit")+gold->query("name")+"。\n",me);
        }
        if ( silver->move(environment(owner_ob)) )
        message_vision("$N丢下了一"+silver->query("unit")+silver->query("name")+"。\n",me);

        
         message_vision(death_msg[random(sizeof(death_msg))],owner_ob,this_object());
		    
		    str=" got "+exp_r+"/"+exp_reward+" exp "+
			pot_r+"/"+pot_reward+" pot "+" dx "+dx_r+
			" in level "+ owner_ob->query_temp("mieyao/level")+
			".\n";
                    if (owner_ob->query_temp("mieyao/level")==9 && ratio>50) {
                       skill=give_reward(owner_ob);
                       str+= "and rewarded 1 lvl of "+skill+".\n";
                 if(skill != "none"){
			msg="听说"+HIB+ owner_ob->query("name")+HIM+ "的"+HIY+ to_chinese(skill)+HIM+"又有所进境了！\n"NOR;
     			CHANNEL_D->do_channel(me,"rumor",msg);
    			}
                    }
//杀一轮妖增加一点善值，wsw 2004/2
		if (owner_ob->query_temp("mieyao/level") >= 9 && random(5)==1) 
    {
  		// stone = new("/d/npc/vr_room/obj/baoshi.c");
			// if(stone) stone->move(owner_ob);
  		owner_ob->add("baoshi/bs_ys",1);
 			tell_object(owner_ob, RED"你得到了一颗原石。\n"NOR);
    }
    if (owner_ob->query_temp("mieyao/level") >= 9 && random(100)==1) 
    {
  		owner_ob->add("baoshi/bs_g1",1);
 			tell_object(owner_ob, RED"你得到了一颗绿宝石。\n"NOR);
    }
    if (owner_ob->query_temp("mieyao/level") >= 9 && random(100)==1) 
    {
  		owner_ob->add("baoshi/bs_y1",1);
 			tell_object(owner_ob, RED"你得到了一颗黄宝石。\n"NOR);
    }
    if (owner_ob->query_temp("mieyao/level") >= 9 && random(150)==1) 
    {
  		owner_ob->add("baoshi/bs_b1",1);
 			tell_object(owner_ob, RED"你得到了一颗天晶石。\n"NOR);
    }
 // if (owner_ob->query_temp("mieyao/level") >= 9 && random(200)==1)
 // nanf: 新年礼物
    if (owner_ob->query_temp("mieyao/level") >= 9 && random(ztstone_chance)==1) 
    {
  		// stone = new("/d/npc/vr_room/obj/ztstone.c");
  		//if(stone) {
  		//	stone->move(owner_ob);
 		//		tell_object(owner_ob, RED"你得到了一颗紫藤宝石。\n"NOR);
 		//	}
 		owner_ob->add("baoshi/ztstone",1);
 		tell_object(owner_ob, MAG"你得到了一颗紫藤宝石。\n"NOR);
    } 
 // if (owner_ob->query_temp("mieyao/level") >= 9 && random(1000)==1)
 // nanf: 新年礼物
    if (owner_ob->query_temp("mieyao/level") >= 9 && random(life_chance)==1) 
    {
  		owner_ob->add("baoshi/stone",1);
 			tell_object(owner_ob, RED"你得到了一颗生命宝石。\n"NOR);
    }
     
    
//                    MONITOR_D->report_system_object_msg(owner_ob, str);
             if (owner_ob->query_temp("mieyao/level")==9 ) 
                owner_ob->add("PKSS",-1);

		    owner_ob->add("combat_exp",exp_r);
		    owner_ob->add("potential",pot_r);
                    owner_ob->add("daoxing",dx_r);			
//                  owner_ob->add("balance",10000);
		    tell_object(owner_ob, "你得到了"+chinese_number(exp_r)
			    +"点武学经验和"+chinese_number(pot_r)+
			    "点潜能、"+COMBAT_D->chinese_daoxing(dx_r)+"道行!\n");
	            owner_ob->set("mieyao/done",1);
					// nanf：新年礼物
	       	GIFT_D->gift(owner_ob, owner_ob->query_temp("mieyao/level")*5+50);
//                    tell_object(owner_ob, "你协助天庭灭妖有功,玉帝赐你黄金一两。\n");

	//产生装备
	if (owner_ob->query_temp("mieyao/level")>6)
	 {
	     if (killer) err=catch(newitem=NEWITEMS_OB->get_item(me,killer));
	     if (!err&&newitem) 
	     {
		message_vision("$N丢下了一"+newitem->query("unit")+newitem->query("name")+"。\n",me);
		newitem->move(environment(me));
	     }
	 }	    
    }
  else
   {
   	message_vision("$N死了。\n",this_object());
   }

	destruct(this_object());

}

varargs int receive_wound(string type, int damage, object who)
{
    string owner=query("owner");
    object inv;
    if(!query_temp("qiankun"))
    {
    if(who && who->query("id")!=owner)
    {
       if(userp(who) || ((inv=who->query_temp("invoker")) && inv->query("id")!=owner))
       {
	   // can't use other's NPC to help kill.
	 if(damage>0) 
           {
	     switch(type)
              {
		  case "kee": other_kee+=damage; break;
		  case "sen": other_sen+=damage; break;
	        }
	     }
       }
    }
}
    return ::receive_wound(type, damage, who);
  
}

varargs int receive_damage(string type, int damage, object who)
{
    string owner=query("owner");
    object inv;
    if(!query_temp("qiankun"))
    {
    if(who && who->query("id")!=owner) 
    {
       if(userp(who) || ((inv=who->query_temp("invoker")) && inv->query("id")!=owner))
       {
	   // can't use other's NPC to help kill.
	 if(damage>0) 
          {
	    switch(type) 
             {
		case "kee": other_kee+=damage; break;
		case "sen": other_sen+=damage; break;
	       }
	    }
       }
    }
  }
    return ::receive_damage(type, damage, who);
   
}

// This is called in heart_beat() to perform attack action.
int attack()
{
	object opponent;

	clean_up_enemy();

	opponent = select_opponent();
	if( objectp(opponent) ) {
	        string owner=query("owner");
		
		// if the owner faints, then will not attack
		// and leave. -- mon 3/8/99
		if(opponent->query("id")==owner 
			&& userp(opponent)
                        && !living(opponent) ) {
//huarong 2004/7
//                        && environment()==environment(opponent)) {
                    remove_all_killer();
                    call_out("leave",0);
		    return 0;
		}

		set_temp("last_opponent", opponent);
		COMBAT_D->fight(this_object(), opponent);
		return 1;
	} else
		return 0;
}


void heart_beat()
{
        object ob=this_object(),newnew;
        object me=ob->query("owner_ob");
        int i,k,myexp;
        int j=0;

        ::heart_beat();
        if( ! me )
            me=offensive_target(ob);
        if( ! me ) return;
               if(!is_fighting()) return;

        myexp=((int)me->query("combat_exp",1)+(int)me->query("daoxing",1))/2;
        if(myexp <  500000) i=0;
        else i=(to_int(sqrt(to_float(myexp/100000-1))))-1;
        if (i<1) return;
        if (i>8) i=8;
	if ( tick--  ) return;
	else
	 {  
	   if (i<5) tick = 5;
	   else tick=5-(i-4);
	 }

        k=random(i+j);
	if (wizardp(me) && me->query("env/combat")=="verbose")
           tell_object(me, sprintf(HIM+BLINK+"i: %d  k: %d\n" NOR, i,k));
/*
exp(万)  lvl
  50      0
 100      1
 170      2
 260      3
 370      4
 500      5
 650      6
 820      7
1010      8
*/         

        if( i>=5 && random(4)==1) command("exert recover");//玩家500万exp以后，怪开始随机吸气 
                   
if(query("family/family_name") == "方寸山三星洞")
   {                              
      //if(!ob->query_temp("jldl") && me->query_skill("force",1)>249 && random(10)>8 ) command("exert jldl");
        if (k>6) k=6;
        switch(k)
      	{
          case 0: 
		command("cast thunder on "+me->query("id"));
		command("cast thunder");break;
	  case 1:
		command("cast light on "+me->query("id"));
		command("cast light");break;
          case 2:                     
		command("perform pili on "+me->query("id"));
		command("perform pili");break;
	  case 3:
                command("perform qiankun on "+me->query("id"));
                command("perform qiankun");break;
          case 4:                     
                command("perform wu on "+me->query("id"));
                command("perform wu");break;
          case 5:
                command("perform qizhi on "+me->query("id"));
                command("perform qizhi");break;
          case 6:  
                command("cast fenshen");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "阎罗地府")
   {                              
      if(!ob->query_temp("ldlh")&& me->query_skill("force")>249) command("perform ldlh");
        if (k>7) k=7;
        switch(k)
      	{
          case 0: 
		command("cast inferno on "+me->query("id"));
		command("cast inferno");break;
          case 1:
                command("perform cmwl on "+me->query("id"));
                command("perform cmwl");break;
          case 2:
		command("cast townportal");break;
	  case 3:
                command("perform lianyu on "+me->query("id"));
                command("perform lianyu");break;
	  case 4:
                command("cast gouhun on "+me->query("id"));
                command("cast gouhun");break;
          case 5:                     
                command("perform three on "+me->query("id"));
                command("perform three");break;
          case 6:                     
                command("perform xingyun on "+me->query("id"));
                command("perform xingyun");break;
          case 7: 
                command("perform yanluo on "+me->query("id"));
                command("perform yanluo");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "火云洞")
   {                              
      if(!ob->query_temp("pfm_shenli")&& me->query_skill("force")>149) command("perform shenli");
        if (k>7) k=7;
        switch(k)
      	{
          case 0:                     
                command("cast sanmei on "+me->query("id"));
                command("cast sanmei");break;
          case 1: 
		command("cast niushi");break;
	  case 2:
		command("perform zhangxinlei on "+me->query("id"));
		command("perform zhangxinlei");break;
          case 3:                     
		command("perform baiyun on "+me->query("id"));
		command("perform baiyun");break;
	  case 4:
	        map_skill("spear", "huoyun-qiang");
                command("perform lihuo on "+me->query("id"));
                command("perform lihuo");break;
	  
          case 5:                     
	        map_skill("spear", "wuyue-spear");
                command("perform fengchan on "+me->query("id"));
                command("perform fengchan");break;
          case 6:
	        map_skill("spear", "wuyue-spear");
                command("perform buhui on "+me->query("id"));
                command("perform buhui");break;

          default: return 0;
	}

}

if(query("family/family_name") == "将军府")
   {                              
      if(!ob->query_temp("powerup")&& me->query_skill("force")>149) command("exert jingxin");
        if (k>7) k=7;
        switch(k)
      	{
          
          case 0:
                newnew=new("/d/jjf/obj/thunder_seal.c");
                newnew->move(ob);
                command("ji thunder seal on "+me->query("id"));
                command("ji thunder seal");break;
          case 1:
                newnew=new("/d/jjf/obj/light_seal.c");
                newnew->move(ob);
                command("ji light seal on "+me->query("id"));
                command("ji light seal");break;
	  case 2: 
		command("perform huima on "+me->query("id"));
		command("perform huima");break;
	  case 3:
	        map_skill("mace", "wusi-mace");
		command("perform andu on "+me->query("id"));
		command("perform andu");break;
          case 4:                     
                command("perform sanban on "+me->query("id"));
                command("perform sanban");break;
          case 5:
                command("perform zhuiming on "+me->query("id"));
                command("perform zhuiming");break;
          case 6: 
                map_skill("mace", "wusi-mace");
                command("perform jueming on "+me->query("id"));
                command("perform jueming");break;
         case 7: 
		command("perform meihua on "+me->query("id"));
		command("perform meihua");break;

          default: return 0;
	}

   }
if(query("family/family_name") == "昆仑山玉虚洞")
   {                              
      if(!ob->query_temp("powerup")&& me->query_skill("force")>149) command("exert hengha");
      if(!ob->query_temp("pfmxue")&& me->query_skill("force")>199)
              {
	        map_skill("sword", "huntian-jian");
                command("perform xue");   
               } 
        if (k>7) k=7;
        switch(k)
      	{
          case 0:                     
                command("cast light on "+me->query("id"));
                command("cast light");break;
          case 1:                     
                command("cast huodun");break;
          case 2:                     
		command("perform dipo on "+me->query("id"));
		command("perform dipo");break;
          case 3: 
	        map_skill("sword", "wugou-jian");
		command("perform feixian on "+me->query("id"));
		command("perform feixian");break;
          case 4:                     
	        map_skill("sword", "huntian-jian");
		command("perform lin on "+me->query("id"));
		command("perform lin");break;
          case 5:                     
		command("perform tianpo on "+me->query("id"));
		command("perform tianpo");break;
	  case 6:
	        map_skill("sword", "wugou-jian");
                command("perform fengshen on "+me->query("id"));
                command("perform fengshen");break;
          case 7:                     
                command("cast fantian on "+me->query("id"));
                command("cast fantian");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "东海龙宫")
   {                              
      if(!ob->query_temp("powerup")&& me->query_skill("force")>149) command("exert shield");
        if (k>6) k=6;
        switch(k)
      	{
          case 0:                     
                command("cast water on "+me->query("id"));
                command("cast water");break;
          case 1:                     
                command("cast shuidun");break;
          case 2: 
		command("perform sheshen on "+me->query("id"));
		command("perform sheshen");break;
	  case 3:
		command("perform break on "+me->query("id"));
		command("perform break");break;
          case 4:                     
		command("perform long on "+me->query("id"));
		command("perform long");break;
	  case 5:
                command("perform leidong on "+me->query("id"));
                command("perform leidong");break;
          case 6:                     
                command("perform shenglong on "+me->query("id"));
                command("perform shenglong");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "月宫")
   {                              
      if(!ob->query_temp("powerup")&& me->query_skill("force")>149) command("perform huanwu");
        if (k>7) k=7;
        switch(k)
      	{
          case 0:                     
                command("cast arrow on "+me->query("id"));
                command("cast arrow");break;
          case 1:                     
                command("cast mihun on "+me->query("id"));
                command("cast mihun");break;
          case 2:                     
                command("cast shiyue on "+me->query("id"));
                command("cast shiyue");break;          
          case 3:
                command("perform tian on "+me->query("id"));
                command("perform tian");break;
          case 4:
                command("perform xiaoyao on "+me->query("id"));
                command("perform xiaoyao");break;
          case 5:
                command("perform flower on "+me->query("id"));
                command("perform flower");break;
          case 6:
                command("perform sanshou on "+me->query("id"));
                command("perform sanshou");break;
          case 7:                     
                command("perform xuanhu on "+me->query("id"));
                command("perform xuanhu");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "盘丝洞")
   {                              
      if(!ob->query_temp("BAIFA_perform")&& me->query_skill("force")>149)
        {
	        map_skill("sword", "chixin-jian");
        	command("perform lestat");
        }
        if (k>5) k=5;
        switch(k)
      	{
          case 0:                     
                command("cast wuzhishan on "+me->query("id"));
                command("cast wuzhishan");break;
          case 1:                     
                command("cast ziqi on "+me->query("id"));
                command("cast ziqi");break;          
	  case 2:
	        map_skill("sword", "chixin-jian");
		command("perform hongyan on "+me->query("id"));
		command("perform hongyan");break;
	  case 3:
		command("perform lanhua on "+me->query("id"));
		command("perform lanhua");break;
	  case 4:
	        map_skill("sword", "qingxia-jian");
		command("perform mantian on "+me->query("id"));
		command("perform mantian");break;
          case 5:                     
	        map_skill("sword", "qingxia-jian");
                command("perform tongxin on "+me->query("id"));
                command("perform tongxin");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "南海普陀山")
   {                              
        if (k>6) k=6;
        switch(k)
      	{
          case 0:                     
                command("cast lianhua");break;
          case 1:                     
                command("cast bighammer on "+me->query("id"));
                command("cast bighammer");break;
          case 2:                     
                command("perform dashi on "+me->query("id"));
                command("perform dashi");break;
          case 3: 
		command("perform pudu on "+me->query("id"));
		command("perform pudu");break;
          case 4:                     
		command("perform chaodu on "+me->query("id"));
		command("perform chaodu");break;
          case 5: 
		command("perform fuhu on "+me->query("id"));
		command("perform fuhu");break;
          case 6: 
		command("perform wuji on "+me->query("id"));
		command("perform wuji");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "三界散仙")
   {                              
        if (k>5) k=5;
        switch(k)
      	{
          case 0:                     
                command("cast gold on "+me->query("id"));
                command("cast gold");break;
          case 1:                     
                command("cast shengsi on "+me->query("id"));
                command("cast shengsi");break;
          case 2: 
		command("perform dunnoname on "+me->query("id"));
		command("perform dunnoname");break;
          case 3:  
                command("perform qiansi on "+me->query("id"));
                command("perform qiansi");break;
          case 4:         
		command("perform bishou on "+me->query("id"));
		command("perform bishou");break;
          case 5:       
                command("perform dunnotruth on "+me->query("id"));
                command("perform dunnotruth");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "蜀山派")
   {                              
      if(!ob->query_temp("powerup")&& me->query_skill("force")>149) command("exert huti");
      if(!ob->query_temp("zhanqi")&& me->query_skill("force")>149) command("exert zhanqi");
        if (k>6) k=6;
        switch(k)
      	{
          case 0: 
		command("cast fu on "+me->query("id"));
		command("cast fu");break;
          case 1: 
		command("cast tuoqiao");break;
          case 2: 
		command("cast jianshen on "+me->query("id"));
		command("cast jianshen");break;
          case 3:                     
	        map_skill("sword", "mindsword");
		command("perform taohua on "+me->query("id"));
		command("perform taohua");break;
	  case 4:
	        map_skill("sword", "yujianshu");
                command("perform wanjian on "+me->query("id"));
                command("perform wanjian");break;
          case 5:                     
	        map_skill("sword", "canxin-jian");
                command("perform xiangsi on "+me->query("id"));
                command("perform xiangsi");break;
          case 6: 
	        map_skill("sword", "mindsword");
		command("perform yujian on "+me->query("id"));
		command("perform yujian");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "陷空山无底洞")
   {                              
      if(!ob->query_temp("wdd_powerup")&& me->query_skill("force")>149 ) command("cast bianfu");
        if (k>8) k=8;
        switch(k)
      	{
          case 0:                     
                command("cast huanying on "+me->query("id"));
                command("cast huanying");break;
          case 1:                     
                command("cast tudun");break;
          case 2:                     
                command("cast bite on "+me->query("id"));
                command("cast bite");break;
          case 3:                     
                command("cast suliao on "+me->query("id"));
                command("cast suliao");break;
          case 4: 
		command("perform zxzx");break;
	  case 5:
		command("perform xiao on "+me->query("id"));
		command("perform xiao");break;
          case 6:                     
		command("perform yaowu on "+me->query("id"));
		command("perform yaowu");break;
          case 7: 
		command("perform yinfeng on "+me->query("id"));
		command("perform yinfeng");break;
          case 8: 
		command("perform diyu on "+me->query("id"));
		command("perform diyu");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "五庄观")
   {                              
     if(!ob->query_temp("jianmang") && me->query_skill("force",1)>149 ) command("perform jianmang");
        if (k>6) k=6;
        switch(k)
      	{
          case 0:                     
                command("cast baxian on "+me->query("id"));
                command("cast baxian");break;
          case 1:                     
                command("cast zhenhuo on "+me->query("id"));
                command("cast zhenhuo");break;
	  case 2:
	        map_skill("sword", "sanqing-jian");
		command("perform sanqing on "+me->query("id"));
		command("perform sanqing");break;
          case 3: 
		command("perform huaqian on "+me->query("id"));
		command("perform huaqian");break;
          case 4:                     
		command("perform damoyange on "+me->query("id"));
		command("perform damoyange");break;
	  case 5:
	        map_skill("sword", "sanqing-jian");
                command("perform jianzhang on "+me->query("id"));
                command("perform jianzhang");break;
          case 6:                     
	        map_skill("sword", "xiaofeng-sword");
                command("perform huichang on "+me->query("id"));
                command("perform huichang");break;
          default: return 0;
	}

   }
if(query("family/family_name") == "大雪山")
   {                              
        if (k>7) k=7;
        switch(k)
      	{
          case 0:                     
                command("cast tuntian on "+me->query("id"));
                command("cast tuntian");break;      		
          case 1:                     
                command("cast escape");break;
          case 2: 
		command("perform feijian on "+me->query("id"));
		command("perform feijian");break;
	  case 3:
		command("perform chaofeng on "+me->query("id"));
		command("perform chaofeng");break;
          case 4:                     
		command("perform ningxie");
		command("perform baoxue on "+me->query("id"));
		command("perform baoxue");break;
	  case 5:
                command("perform cuixin on "+me->query("id"));
                command("perform cuixin");break;
	  case 6:
                command("perform fenghuang on "+me->query("id"));
                command("perform fenghuang");break;
          case 7: 
		command("cast juanbi on "+me->query("id"));
		command("cast juanbi");break;
          default: return 0;
	}

   }

}


