// room: chengdedian.c
// last modify by xiha@wmkj Mar 6,2002

inherit ROOM;
string* locations = ({
        "/d/baituo/restroom",
        "/d/baituo/room1",
        "/d/baituo/room2",
        "/d/baituo/room3",
        "/d/city/kedian3",
        "/d/taishan/zhengqi",
        "/d/taishan/fengchan",
        "/d/taishan/xiayi",
});
void create()
{
        set("short","成德殿");
        set("long",
        "这就是日月神教教主平日发号施令的地方, 殿中无窗, 殿口点着\n"
        "明晃晃的蜡烛, 大殿彼端高设一座, 坐着一个英俊的中年人, 自是\n"
        "名震江湖的东方不败的姘头杨莲亭了!\n" 
          );
        set("exits",([
        "south" : __DIR__"huoting",
        "westdown":__DIR__"up4",
        ]));
        set("objects",([
         "/d/heimuya/npc/dizi" : 2,
         "/d/heimuya/npc/yang" :1,
        ]));
        
        set("cost", 1);
        setup();
 
 	remove_call_out("determine_target");
        call_out("determine_target", 50);
}
int valid_leave(object me, string dir)
{
        mapping myfam;
        object ob=present("yang lianting", environment(me));
        if (ob && living(ob) ){
            myfam = (mapping)me->query("family");
            if ((!myfam || myfam["family_name"] != "日月神教") && dir == "south" ) {
                    say("杨莲亭对"+me->name()+"喝道：你不是本教教众，请留步。\n");
                    return notify_fail("杨莲亭喝道：后面是本教重地，这位" + RANK_D->query_respect(me) + "请止步。\n");
            }
        }
        return ::valid_leave(me, dir);
}

// modify by xiha@wmkj Mar 6,2002
void init()
{
	object ob, obj1, obj2, maskman, me = this_player();
	int level;

		if ( query("target_found") == 1 ) {
			delete("target_found");
		}

		if ( random(10) == 5 && !query("target_found") ) {
			call_out("determine_target", 1);
			set("target_found", 1);
                }
	}       

private int is_suitable(object target)
{
        if ( target->query("combat_exp") < 10000000  || wizardp(target) 
	|| target->is_ghost() || environment(target)->query("no_fight")
	|| environment(target)->query("short") == "监狱" 
	|| environment(target)->query("short") == "地牢" 
	|| environment(target)->query("short") == "牢房"
	|| environment(target)->query("short") == "铁牢"
	|| ( target->is_busy() && ( !target->query_temp("pending/excercise") 
	&& !target->query_temp("pending/respirate") ) )
	|| target->is_fighting() || !living(target) ) {
                return 0;
        }

        return 1;
}

private int copyvictim(object me, object victim)
{
	mapping skill_status;
	string *sname;
	int i, max = 0, max1, j, power;

	if ( mapp(skill_status = victim->query_skills()) ) {
		skill_status = victim->query_skills();
		sname = keys(skill_status);

		for(i=0; i<sizeof(skill_status); i++) {
			if ( skill_status[sname[i]] > max ) max = skill_status[sname[i]];
		}
		
		max1 = (int)max*4/5 + 1;
		max = (int)max*4/5 + 1 + random((int)max/2);
		
		me->set_skill("dodge", max1);
		me->set_skill("parry", max1 );
		me->set_skill("force", max1);
		switch( random(4) )
		{
			case 0:
				me->set_skill("sword", max1);
				me->set_skill("luohua-jian", max1);
				me->map_skill("sword", "luohua-jian");
				me->prepare_skill("sword", "luohua-jian");
				me->set_skill("unarmed", max1);
				me->set_skill("yizhi-chan", max1);
				me->map_skill("unarmed", "yizhi-chan");
				me->prepare_skill("unarmed", "yizhi-chan");
				me->set_skill("longxiang", max1);
				me->map_skill("force", "taiji-shengong");
				me->set_skill("youran-bu", max1);
				me->map_skill("dodge", "youran-bu");
				switch( random(2) ) {
				   case 0:
					me->set_skill("sword", max);
					me->set_skill("pixie-jian", max);
					me->map_skill("sword", "pixie-jian");
					me->map_skill("parry", "huoyan-dao");
					me->carry_object("/clone/weapon/changjian")->wield();
					break;
				   case 1:
					me->set_skill("sword", max);
					me->set_skill("taiji-jian", max);
					me->map_skill("sword", "taiji-jian");
					me->map_skill("parry", "taiji-jian");
					me->carry_object("/clone/weapon/changjian")->wield();
					break;
				}
				break;
			case 1:
				me->set_skill("unarmed", max1);
				me->set_skill("yizhi-chan", max1);
				me->map_skill("unarmed", "yizhi-chan");
				me->prepare_skill("unarmed", "yizhi-chan");
				me->set_skill("claw", max1);
				me->set_skill("jiuyin-baiguzhao", max1);
				me->map_skill("claw", "jiuyin-baiguzhao");
				me->prepare_skill("claw", "jiuyin-baiguzhao");
				me->set_skill("huagong-dafa", max1);
				me->map_skill("force", "huagong-dafa");
				me->set_skill("sword", max);
				me->set_skill("pixie-jian", max);
				me->map_skill("sword", "pixie-jian");
				me->set_skill("wudu-yanluobu", max1);
				me->map_skill("dodge", "wudu-yanluobu");
				me->map_skill("parry", "jiuyin-baiguzhao");
				me->carry_object("/clone/weapon/changjian")->wield();
				break;
			case 2:
				me->set_skill("unarmed", max1);
				me->set_skill("wudu-yanluobu", max1);
				me->map_skill("dodge", "wudu-yanluobu");
				me->set_skill("jiuyang-shengong", max1);
				me->map_skill("unarmed", "jiuyang-shengong");
				me->prepare_skill("unarmed", "jiuyang-shengong");
				me->set_skill("blade", max1);
				me->set_skill("tiandao-blade", max1);
				me->map_skill("blade", "tiandao-blade");
				me->prepare_skill("blade", "tiandao-blade");
				me->set_skill("taixuan-gong", max1);
				me->map_skill("force", "taixuan-gong");
				me->set_skill("parry", max);
				me->map_skill("parry", "wuhu-duanmendao");
				me->set_skill("wuhu-duanmendao", max);
				me->carry_object("/clone/weapon/blade")->wield();
				break;
			case 3: 
				me->set_skill("unarmed", max1);
				me->set_skill("yizhi-chan", max1);
				me->set_skill("parry", max1);
				me->set_skill("huoyan-dao", max1);
				me->map_skill("unarmed", "yizhi-chan");
				if ( max > 100 ) {
					me->map_skill("unarmed", "yizhi-chan");
					me->prepare_skill("unarmed", "yizhi-chan");
				}
				else {
					me->prepare_skill("parry", "huoyan-dao");
				}
				me->map_skill("force", "longxiang");
				me->set_skill("sword", max);
				me->set_skill("luohua-jian", max);
				me->map_skill("sword", "luohua-jian");
				me->map_skill("parry", "luohua-jian");
				me->set_skill("wudu-yanluobu", max1);
				me->map_skill("dodge", "wudu-yanluobu");
				me->carry_object("/clone/weapon/changjian")->wield();
				break;
		}

		me->set("combat_exp", victim->query("combat_exp")+random(victim->query("combat_exp")/10));
		me->set("max_qi", victim->query("max_qi"));
		me->set("eff_qi", victim->query("max_qi"));
		me->set("max_jing", victim->query("max_jing"));
		me->set("eff_jing", victim->query("max_jing"));
		me->set("qi", me->query("max_qi"));
		me->set("jing", me->query("max_jing"));
		me->set("jiali", victim->query("jiali")*3/4);

		if ( victim->query("max_neili") > 0 ) {
			me->set("max_neili", victim->query("max_neili"));
		}
		else me->set("max_neili", 500);

		if ( victim->query("max_jingli") > 0 ) {
			me->set("max_jingli", victim->query("max_jingli"));
		}
		else me->set("max_jingli", 500);

		power = me->query("combat_exp")/10000;
		if ( power < 100 ) power = 100;
		if ( power > 1000 ) power = 1000;

		me->add_temp("apply/attack", power);
		me->add_temp("apply/dodge", power);
		me->add_temp("apply/armor", power);
                me->add_temp("apply/defense", power);

		me->set("neili", me->query("max_neili"));
		me->set("jingli", me->query("max_jingli"));
		
		me->set_leader(victim);
		me->set("no_sing", 1);
	}

	return 1;
}
void determine_target()
{
        object victim, maskman, room, *all, *all1;
        int i, j, k, num, attempt1, attempt2;

	attempt1 = 0;
	attempt2 = 0;
	k = sizeof(locations) / 10;
	if ( k > 20 ) {
	   k = 20;
	}
	else if ( k < 15 ) {
	   k = 15;
	}

	while( query("target_found") < 2 && attempt2 < 10 ) {
	   while ( attempt1 < k ) {
		if ( !room = find_object(locations[random(sizeof(locations))]) )
			room = load_object(locations[random(sizeof(locations))]);

		if ( objectp(room) && file_name(room) != query("last_room") ) {
		   all = all_inventory(room);
		   all1 = allocate(sizeof(all));

		   for ( i=0; i<sizeof(all); i++ ) {
                      if ( all[i]->is_character() && userp(all[i]) ) {
				all1[num] = all[i];
				num++;
		      }	
        	   }

		   if ( num > 0 ) {	
        	      j = random(num);
		      victim = all1[j];

		      if ( objectp(victim) && query("last_target") != victim->query("id") ) {
			   if ( is_suitable(victim) ) {
			   	set("target_found", 2);
				set("last_room", file_name(room));
				set("last_target", victim->query("id"));
				attempt1 = k;
				victim->start_busy(2);
			   	maskman = new("/u/xiha/npc/maskman");
        		   	maskman->set_temp("target", victim->query("id"));
				copyvictim( maskman, victim );
        		   	maskman->move(environment(victim));
			   }
		      }
		   }
		}
		
		attempt1++;
	   }

	   if ( query("target_found") < 2 && attempt1 >= k ) {
		all = users();
	
		j = random(sizeof(all));
                victim = all[j];

                if ( objectp(victim) && is_suitable(victim) ) {
                        set("target_found", 2);
				victim->start_busy(2);
                        maskman = new("/u/xiha/npc/maskman");
                        maskman->set_temp("target", victim->query("id"));
				copyvictim(maskman, victim);
                        maskman->move(environment(victim));
                }
		else attempt2++;
	   }
	}

	set("target_found", 2);
	remove_call_out("resume_targeting");
	call_out("resume_targeting", 900);
	remove_call_out("determine_target");
        call_out("determine_target", 1200);
}

void resume_targeting()
{
	delete("target_found");
}

