// look.c
#pragma save_binary

#include <room.h>

inherit F_CLEAN_UP;

#define RETURN_RESULT   1
string clean_color(string arg);

static string *all_exits = ({
    "east",
    "south",
    "west",
    "north",
    "eastup",
    "southup",
    "westup",
    "northup",
    "eastdown",
    "southdown",
    "westdown",
    "northdown",
    "northeast",
    "northwest",
    "southeast",
    "southwest",
    "up",
    "down",
    "enter",
    "out",
});

string *look_level_boy = ({
 BLU "眉歪眼斜，瘌头癣脚，不象人样" NOR,
 BLU "呲牙咧嘴，黑如锅底，奇丑无比" NOR,
 BLU "面如桔皮，头肿如猪，让人不想再看第二眼" NOR,
 HIB "贼眉鼠眼，身高三尺，宛若猴状" NOR,
 HIB "肥头大耳，腹圆如鼓，手脚短粗，令人发笑" NOR,
 NOR "面颊凹陷，瘦骨伶仃，可怜可叹" NOR,
 NOR "傻头傻脑，痴痴憨憨，看来倒也老实" NOR,
 NOR "相貌平平，不会给人留下什么印象" NOR,
 YEL "膀大腰圆，满脸横肉，恶形恶相" NOR,
 YEL "腰圆背厚，面阔口方，骨格不凡" NOR,
 RED "眉目清秀，端正大方，一表人才" NOR,
 RED "双眼光华莹润，透出摄人心魄的光芒" NOR,
 HIY "举动如行云游水，独蕴风情，吸引所有异性目光" NOR,
 HIY "双目如星，眉梢传情，所见者无不为之心动" NOR,
 HIR "粉面朱唇，身姿俊俏，举止风流无限" NOR,
 HIR "丰神如玉，目似朗星，令人过目难忘" NOR,
 MAG "面如美玉，粉妆玉琢，俊美不凡" NOR,
 MAG "飘逸出尘，潇洒绝伦" NOR,
 MAG "丰神俊朗，长身玉立，宛如玉树临风" NOR,
 HIM "神清气爽，骨格清奇，宛若仙人" NOR,
 HIM "一派神人气度，仙风道骨，举止出尘" NOR,
});

string *look_level_girl = ({
  BLU "丑如无盐，状如夜叉" NOR,
  BLU "歪鼻斜眼，脸色灰败，直如鬼怪一般" NOR,
  BLU "八字眉，三角眼，鸡皮黄发，让人一见就想吐" NOR,
  HIB "眼小如豆，眉毛稀疏，手如猴爪，不成人样" NOR,
  HIB "一嘴大暴牙，让人一看就没好感" NOR,
  NOR "满脸疙瘩，皮色粗黑，丑陋不堪" NOR,
  NOR "干黄枯瘦，脸色腊黄，毫无女人味" NOR,
  YEL "身材瘦小，肌肤无光，两眼无神" NOR,
  YEL "虽不标致，倒也白净，有些动人之处" NOR,
  RED "肌肤微丰，雅淡温宛，清新可人" NOR,
  RED "鲜艳妍媚，肌肤莹透，引人遐思" NOR,
  HIR "娇小玲珑，宛如飞燕再世，楚楚动人" NOR,
  HIR "腮凝新荔，肌肤胜雪，目若秋水" NOR,
  HIW "粉嫩白至，如芍药笼烟，雾里看花" NOR,
  HIW "丰胸细腰，妖娆多姿，让人一看就心跳不已" NOR,
  MAG "娇若春花，媚如秋月，真的能沉鱼落雁" NOR,
  MAG "眉目如画，肌肤胜雪，真可谓闭月羞花" NOR,
  MAG "气质美如兰，才华馥比山，令人见之忘俗" NOR,
  HIM "灿若明霞，宝润如玉，恍如神妃仙子" NOR,
  HIM "美若天仙，不沾一丝烟尘" NOR,
  HIM "宛如"+HIW+"玉雕冰塑"+HIM+"，似梦似幻，已不再是凡间人物" NOR,
});
int look_room(object me, object env,int brief);
int look_item(object me, object obj);
int look_living(object me, object obj);
int look_room_item(object me, string arg);
string desc_of_objects(object *obs);
string look_all_inventory_of_room(object me, object env, int ret_str);

mapping df_bkpic=([
"foshan":"xiaozheng",
"village":"xiaozheng",
"hangzhou":"hangzhou",
"heimuya":"heimuya",
"huashan":"huashan",
"guanwai":"guanwai",
"lingjiu":"lingjiu",
"motianya":"motianya",
"register":"yanluodian",
"shenlong":"shenlong",
"taohua":"taohua",
"wudang":"wudang",
"wanjiegu":"wanjiegu",
"xiakedao":"xiakedao",
"quanzhen":"quanzhen",
"beijing":"beijing",
"changan":"changan",
"city":"city",
"city3":"city3",
"dali":"dali",
"emei":"emei",]);

mapping rf_bkpic=([
"_d_beijing_dangpu":"dangpu",
"_d_changan_dangpu":"dangpu",
"_d_city_dangpu":"dangpu",
"_d_foshan_dangpu":"dangpu",
"_d_xiangyang_dangpu":"dangpu",
"_d_suzhou_dangpu":"dangpu",
"_d_city_shuyuan":"shuyuan",
"_d_city_shuyuan2":"shuyuan",
"_d_suzhou_shuyuan":"shuyuan",
"_d_songshan_shuyuan":"shuyuan",
"_d_hangzhou_shuyuan":"shuyuan",
"_d_changan_zahuopu":"zahuopu",
"_d_fuzhou_zahuopu":"zahuopu",
"_d_beijing_huichuntang":"yaopu",
"_d_changan_yaopu":"yaopu",
"_d_xiangyang_yaopu":"yaopu",
"_d_suzhou_yaopu":"yaopu",
"_d_dali_yaoshop":"yaopu",
"_d_city_zuixianlou":"jiulou",
"_d_city_shuyuan":"shuyuan",
"_d_city_shuyuan2":"shuyuan",
"_d_suzhou_shuyuan":"shuyuan",
"_d_songshan_shuyuan":"shuyuan",
"_d_hangzhou_shuyuan":"shuyuan",
"_d_changan_zahuopu":"zahuopu",
"_d_fuzhou_zahuopu":"zahuopu",
"_d_beijing_huichuntang":"yaopu",
"_d_changan_yaopu":"yaopu",
"_d_xiangyang_yaopu":"yaopu",
"_d_suzhou_yaopu":"yaopu",
"_d_dali_yaoshop":"yaopu",
"_d_city_zuixianlou":"jiulou",
"_d_dali_huanggs":"huanggs",
"_d_emei_jinding":"jingding",
"_d_death_gate":"guimenguan",
"_d_changan_bank":"qiangzhuang",
"_d_beijing_qianzhuang":"qianzhuang",
"_d_city_qianzhuang":"qianzhuang",
"_d_changan_bank":"qiangzhuang",
"_d_beijing_qianzhuang":"qianzhuang",
"_d_city_qianzhuang":"qianzhuang",
"_d_emei_jinding":"jingding",
"_d_dali_huanggs":"huanggs",
"_d_beijing_dangpu":"dangpu",
"_d_changan_dangpu":"dangpu",
"_d_city_dangpu":"dangpu",
"_d_foshan_dangpu":"dangpu",
"_d_xiangyang_dangpu":"dangpu",
"_d_suzhou_dangpu":"dangpu",]);


//add by JackyBoy@XAJH 2001/5/6
string get_bkpic(object env)
{
    string rf,df;
    rf=replace_string(base_name(env),"/","_");
    df=domain_file(rf);
    if(!undefinedp(rf_bkpic[rf]))
          return rf_bkpic[rf];
    if(!undefinedp(df_bkpic[df]))
          return df_bkpic[df];
    return "";
}

int info(object me, object env)
{
    string *dirs,df;
    mapping exits;

    if( mapp(exits = env->query("exits")) )
        dirs = keys(exits);

    if(sizeof(dirs)==1 && sizeof(dirs)!=0)
        write(TMI("bnway "+dirs[0]+";"));
    else if(sizeof(dirs)!=0)
        write(TMI( sprintf("bnway "+"%s;",implode(dirs[0..sizeof(dirs)], ";")) ));
    df=get_bkpic(env);
    if(df=="") return 1;
    if(df!=me->query_temp("bkpic"))
    {
          me->set_temp("bkpic",df);
          write(TMI("bkpic "+df));
    }
    return 1;
}
void create() { seteuid(getuid()); }

int main(object me, string arg)
{
    object obj;
    int result;
    if( !arg ) result = look_room(me, environment(me),me->query("env/brief"));

    else if( (obj = present(arg, environment(me))) ||  (obj = present(arg, me)) ) {
        if( obj->is_character() ) result = look_living(me, obj);
        else result = look_item(me, obj);
    } else result = look_room_item(me, arg);
    return result;
}
int sort_exits(string str1,string str2)
{
    int i,j;
     if (strcmp(str1,"a")<0 && strcmp(str2,"a")<0){
         if (strlen(str1) < strlen(str2)) return -1;
         if (strlen(str1) == strlen(str2)) return strcmp(str1,str2);
         return 1;
     }else{
         i=member_array(str1, all_exits);
         j=member_array(str2, all_exits);
         if (i>0 && j>0) return i-j;
         else return strcmp(str1,str2);
     }
}

int look_room(object me, object env,int brief)
{

    int i,j,k,l;
    object *inv;
   object room;
    mapping exits,*data;
    string str, *dirs;
    k = 0;
        data = allocate(3000);
    if( !env ) {
        write("你的四周灰蒙蒙地一片，什麽也没有。\n");
        return 1;
    }


/*
        if(brief)
          str = sprintf( HIG"〖"HIW"%s"HIG"〗"NOR,env->query("short"));
         else
*/
          str = sprintf( HIC + "〖%s" + HIC + "〗" + NOR + "%s\n    %s%s" + NOR,
                        env->query("short"),
                        wizardp(me) && SECURITY_D->valid_read(file_name(env),me)? file_name(env): "",
                        env->query("long"),
                        env->query("outdoors")? NATURE_D->outdoor_room_description() : "" );

        if( mapp(exits = env->query("exits")) ) {
        dirs = keys(exits);
        for(i=0; i<sizeof(dirs); i++)

            if( (int)env->query_door(dirs[i], "status") & DOOR_CLOSED )
                dirs[i] = 0;
        dirs -= ({ 0 });

  if( sizeof(dirs)==0)
                         str += "这里没有任何明显的出路。\n";
if( sizeof(dirs)==1)
                          str += "这里唯一的出口是 "WHT + dirs[0] + NOR"。\n";
 if( sizeof(dirs)>1)
            
                          str += sprintf("这里明显的出口是 "+ WHT + "%s"NOR" 和 "WHT"%s"NOR"。\n",
                                implode(dirs[0..sizeof(dirs)-2], "、"), dirs[sizeof(dirs)-1]);
        }

      if (! me->query_temp("tomud")) 
          str += look_all_inventory_of_room(me, env, RETURN_RESULT);
    else
    {
          info(me, env); 
          str +=CLEAN0+ look_all_inventory_of_room(me, env, RETURN_RESULT);
    }
      
   tell_object(me,str);

     if (!me->query("env/brief")&&me->query("env/ditu"))
        {
        if( mapp(exits =env->query("exits")) ) {
        dirs=keys(exits);
        for(i=0; i<sizeof(dirs); i++)
                        if( (int)env->query_door(dirs[i], "status") & DOOR_CLOSED )
                                dirs[i] = 0;
                dirs -= ({ 0 });
        if (sizeof(dirs)!=0)
        {  
          write(FRELINE(8, 40));
          write(SAVEC);
          
            write(SETDISPLAY(7,0)+DELLINE);
          write(SETDISPLAY(1,0)+DELLINE);
          write(SETDISPLAY(2,0)+DELLINE);
          write(SETDISPLAY(3,0)+DELLINE);
          write(SETDISPLAY(4,0)+DELLINE);
          write(SETDISPLAY(5,0)+DELLINE);
          write(SETDISPLAY(6,0)+DELLINE);
          
          write(SETDISPLAY(4,70)+HIR+clean_color(env->query("short"))+NOR);
          for (i=0;i<sizeof(dirs);i++)
          switch(dirs[i])     {
          case "north":
                 write(SETDISPLAY(3,72)+"│");
                 room=load_object(exits["north"]);
                 write(SETDISPLAY(2,70)+clean_color(room->query("short")));
                 break;
          case "south":
                 write(SETDISPLAY(5,72)+"│");
                 room=load_object(exits["south"]);
                 write(SETDISPLAY(6,70)+clean_color(room->query("short")));
                 break;
          case "east":
                 room=load_object(exits["east"]);
                 write(SETDISPLAY(4,80)+clean_color(room->query("short")));
                 write(SETDISPLAY(4,78)+"─");
                 break;
          case "west":
                 room=load_object(exits["west"]);
                 write(SETDISPLAY(4,60)+clean_color(room->query("short")));
                 write(SETDISPLAY(4,68)+"─");
                 break;
          case "westup":
                 room=load_object(exits["westup"]);
                 write(SETDISPLAY(4,60)+clean_color(room->query("short")));
                 write(SETDISPLAY(4,68)+"←");
                 break;
          case "eastup":
                 room=load_object(exits["eastup"]);
                 write(SETDISPLAY(4,80)+clean_color(room->query("short")));
                 write(SETDISPLAY(4,78)+"→");
                 break;
          case "northup":
                 write(SETDISPLAY(3,72)+"↑");
                 room=load_object(exits["northup"]);
                 write(SETDISPLAY(2,70)+clean_color(room->query("short")));
                 break;
          case "southup":
                 write(SETDISPLAY(5,72)+"↓");
                 room=load_object(exits["southup"]);
                 write(SETDISPLAY(6,70)+clean_color(room->query("short")));
                 break;
          case "southdown":
                 write(SETDISPLAY(5,72)+" ↑ ");
                 room=load_object(exits["southdown"]);
                 write(SETDISPLAY(6,70)+clean_color(room->query("short")));
                 break;
          case "northdown":
                 write(SETDISPLAY(3,72)+" ↓ ");
                 room=load_object(exits["northdown"]);
                 write(SETDISPLAY(2,70)+clean_color(room->query("short")));
                 break;
          case "eastdown":
                 room=load_object(exits["eastdown"]);
                 write(SETDISPLAY(4,80)+clean_color(room->query("short")));
                 write(SETDISPLAY(4,78)+"←");
                 break;
          case "westdown":
                 room=load_object(exits["westdown"]);
                 write(SETDISPLAY(4,60)+clean_color(room->query("short")));
                 write(SETDISPLAY(4,68)+"→");
                 break;
          case "northwest":
                 write(SETDISPLAY(3,68)+"＼");
                 room=load_object(exits["northwest"]);
                 write(SETDISPLAY(2,60)+clean_color(room->query("short")));
                 break;
          case "southwest":
                 write(SETDISPLAY(5,68)+"／");
                 room=load_object(exits["southwest"]);
                 write(SETDISPLAY(6,60)+clean_color(room->query("short")));
                 break;
          case "northeast":
                 write(SETDISPLAY(3,76)+"／");
                 room=load_object(exits["northeast"]);
                 write(SETDISPLAY(2,80)+clean_color(room->query("short")));
                 break;
          case "southeast":
                 write(SETDISPLAY(5,76)+"＼");
                 room=load_object(exits["southeast"]);
                 write(SETDISPLAY(6,80)+clean_color(room->query("short")));
                 break;
           }
         
          write(SETDISPLAY(1,58)+"┏━━━━━━━━━━━━━━┓");
          write(SETDISPLAY(2,58)+"┃");
          write(SETDISPLAY(3,58)+"┃");
          write(SETDISPLAY(4,58)+"┃");
          write(SETDISPLAY(5,58)+"┃");
          write(SETDISPLAY(6,58)+"┃");
          write(SETDISPLAY(7,58)+"┗━━━━━━━━━━━━━━┛");
          write(SETDISPLAY(2,88)+"┃");
          write(SETDISPLAY(3,88)+"┃");
          write(SETDISPLAY(4,88)+"┃");
          write(SETDISPLAY(5,88)+"┃");
          write(SETDISPLAY(6,88)+"┃");
          
          write(REST);
        }
          write(TOBOT(50));
        }
        }
        return 1;
}
string desc_of_objects(object *obs)
{
        int i;
        object ob;

        string  str;
        string  ustr;
        mapping count;
        mapping unit;
        string  short_name;
        string  *dk;

        if (obs && sizeof(obs) > 0)
        {
                str = "";
                count   = ([]);
                unit    = ([]);
    
                foreach (ob in obs)
                {
                         short_name = ob->short();
                        if (undefinedp(count[short_name]))
                        {
                                if (ob->query_amount() > 1)
                                        ustr = "批";
                                else
                                        ustr = ob->query("unit");
                                count += ([ short_name : 1 ]);
                                unit += ([ short_name : ustr ]);
                        }
                        else
                                count[short_name] += 1;
                }
    
                dk = sort_array(keys(count), 1);
                for (i = 0; i < sizeof(dk); i++)
                {
                        str += "  ";
                        if (count[dk[i]] > 1)
                                str += chinese_number(count[dk[i]]) + unit[dk[i]];
                        str += dk[i] + "\n";
                }

                return str;
        }

        return "";
}

string look_all_inventory_of_room(object me, object env, int ret_str)
{
    object *inv;
    object *obs;
    object ob;
    string str;

    if (! env || ! me) return "";

    str = "";

    inv = all_inventory(env);
    if (! sizeof(inv)) return str;
    
    if (me->query_temp("tomud"))
    {
          foreach(ob in inv) 
          if (ob != me && me->visible(ob)) 
              str += ADD0(ob); 
    }
    
    if (! me->query("env/brief") || (intp(me->query("env/brief")) && 
      me->query("env/brief") > 1))
    {
        obs = filter_array(inv, (: $(me) != $1 && userp($1) && $(me)->visible($1) :));
        str += desc_of_objects(obs);
    
        obs = filter_array(inv, (: $(me) != $1 && ! userp($1) && $1->is_character() &&
                        $(me)->visible($1) :));
        str += desc_of_objects(obs);
    
        obs = filter_array(inv, (: ! $1->is_character() :), me);
        str += desc_of_objects(obs);
    }
    if (! ret_str)
        tell_object(me, str);

    return str;
}

int look_item(object me, object obj)
{
	object hob;
	mixed *inv;
	mapping count;
	mapping equiped;
	mapping unit;
	string short_name;

	string str;
	string *dk;
	int i;

	count   = ([]);
	unit    = ([]);
	equiped = ([]);

	str = obj->long();
	while (mapp(obj->query_temp("daub")))
	{
		if (! obj->query_temp("daub/poison/remain"))
			// no poison remain now
			break;

		if (obj->query_temp("daub/poison/id") == me->query("id"))
		{
			str += HIG "你发现这上面还有你炼制的" +
			       obj->query_temp("daub/poison/name") +
			       HIG "呢。\n" NOR;
			break;
		}

		if (obj->query_temp("daub/who_id") == me->query("id"))
		{
			str += HIG "这上面还有你亲手布下的" +
			       obj->query_temp("daub/poison/name") +
			       HIG "呢。\n" NOR;
			break;
		}

		if (random(4) && random((int)me->query_skill("poison", 1)) < 30)
			// nothing was worked out
			break;

		str += HIG "忽然间你发现上面似乎泛着一些奇异荧光";
		if (me->query_skill("poison", 1) >= 120)
		{
			str += "，可能是" + obj->query_temp("daub/poison/name");
		}

		str += "。\n" NOR;
		break;
	}

	if (obj->query("consistence"))
		str += sprintf("耐久度：" WHT "%d%%\n" NOR, obj->query("consistence"));

 if (obj->query("base_value"))
		str += sprintf(NOR"         数量：" HIG "+ " NOR"%d\n" NOR, obj->query("(value%10000)/100"));

//显示武器属性
 if (obj->query("flag"))
		str += sprintf(NOR"         使用类型：" HIG "+ " NOR"%s\n" NOR, "双手");
       if (obj->query("weapon_prop/damage"))
		str += sprintf(NOR"         物理攻击：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/damage"));
       if (obj->query("weapon_prop/armor"))
		str += sprintf(NOR"         物理防御：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/armor"));
       if (obj->query("weapon_prop/armor_vs_force"))
		str += sprintf(HIY"         内功抵御：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/armor_vs_force"));
       if (obj->query("weapon_prop/strength"))
		str += sprintf(HIB"         臂力增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/strength"));
       if (obj->query("weapon_prop/intelligence"))
		str += sprintf(HIM"         悟性增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/intelligence"));
       if (obj->query("weapon_prop/constitution"))
		str += sprintf(HIY"         根骨增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/constitution"));
       if (obj->query("weapon_prop/dexerity"))
		str += sprintf(HIG"         身法增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/dexerity"));
       if (obj->query("weapon_prop/karma"))
		str += sprintf(YEL"         福缘增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/karma"));
       if (obj->query("weapon_prop/personality"))
		str += sprintf(YEL"         容貌增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/personality"));
       if (obj->query("weapon_prop/force"))
		str += sprintf(YEL"         内功提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/force"));
       if (obj->query("weapon_prop/dodge"))
		str += sprintf(HIG"         轻功提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/dodge"));
       if (obj->query("weapon_prop/parry"))
		str += sprintf(HIB"         招架提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/parry"));
       if (obj->query("weapon_prop/unarmed"))
		str += sprintf(HIY"         拳脚提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/unarmed"));

       if (obj->query("weapon_prop/sword"))
		str += sprintf(NOR"         剑法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/sword"));
       if (obj->query("weapon_prop/blade"))
		str += sprintf(HIY"         刀法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/blade"));
       if (obj->query("weapon_prop/axe"))
		str += sprintf(HIB"         斧法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/axe"));
       if (obj->query("weapon_prop/throwing"))
		str += sprintf(HIR"         暗器提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/throwing"));
       if (obj->query("weapon_prop/stick"))
		str += sprintf(HIM"         棒法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/stick"));
       if (obj->query("weapon_prop/staff"))
		str += sprintf(HIM"         杖法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/staff"));
       if (obj->query("weapon_prop/spear"))
		str += sprintf(HIB"         枪法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/spear"));
       if (obj->query("weapon_prop/fork"))
		str += sprintf(HIM"         叉法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/fork"));
       if (obj->query("weapon_prop/club"))
		str += sprintf(BLU"         棍法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/club"));
       if (obj->query("weapon_prop/hammer"))
		str += sprintf(GRN"         锤法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/hammer"));
       if (obj->query("weapon_prop/magic"))
		str += sprintf(HIM"         法术提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/magic"));
       if (obj->query("weapon_prop/spells"))
		str += sprintf(HIM"         咒文提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/spells"));
       if (obj->query("weapon_prop/whip"))
		str += sprintf(HIR"         鞭法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/whip"));
       if (obj->query("weapon_prop/poison"))
		str += sprintf(GRN"         毒功提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/poison"));
       if (obj->query("weapon_prop/finger"))
		str += sprintf(HIG"         指法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/finger"));
       if (obj->query("weapon_prop/hand"))
		str += sprintf(HIY"         手法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/hand"));
       if (obj->query("weapon_prop/cuff"))
		str += sprintf(HIY"         杖法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/cuff"));
       if (obj->query("weapon_prop/claw"))
		str += sprintf(NOR"         爪法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/claw"));
       if (obj->query("weapon_prop/strike"))
		str += sprintf(HIM"         掌法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/strike"));
       if (obj->query("weapon_prop/taoism"))
		str += sprintf(HIM"         道学心法：" HIG "+ " NOR"%d\n" NOR, obj->query("weapon_prop/taoism"));
//显示装备属性
       if (obj->query("armor_prop/damage"))
		str += sprintf(NOR"         物理攻击：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/damage"));
       if (obj->query("armor_prop/armor"))
		str += sprintf(NOR"         物理防御：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/armor"));
       if (obj->query("armor_prop/armor_vs_force"))
		str += sprintf(HIY"         内功抵御：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/armor_vs_force"));
       if (obj->query("armor_prop/strength"))
		str += sprintf(HIB"         臂力增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/strength"));
       if (obj->query("armor_prop/intelligence"))
		str += sprintf(HIM"         悟性增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/intelligence"));
       if (obj->query("armor_prop/constitution"))
		str += sprintf(HIY"         根骨增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/constitution"));
       if (obj->query("armor_prop/dexerity"))
		str += sprintf(HIG"         身法增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/dexerity"));
       if (obj->query("armor_prop/karma"))
		str += sprintf(YEL"         福缘增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/karma"));
       if (obj->query("armor_prop/personality"))
		str += sprintf(YEL"         容貌增幅：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/personality"));
       if (obj->query("armor_prop/force"))
		str += sprintf(YEL"         内功提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/force"));
       if (obj->query("armor_prop/dodge"))
		str += sprintf(HIG"         轻功提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/dodge"));
       if (obj->query("armor_prop/parry"))
		str += sprintf(HIB"         招架提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/parry"));
       if (obj->query("armor_prop/unarmed"))
		str += sprintf(HIY"         拳脚提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/unarmed"));
       if (obj->query("armor_prop/sword"))
		str += sprintf(NOR"         剑法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/sword"));

       if (obj->query("armor_prop/blade"))
		str += sprintf(HIY"         刀法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/blade"));
       if (obj->query("armor_prop/axe"))
		str += sprintf(HIB"         斧法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/axe"));
       if (obj->query("armor_prop/throwing"))
		str += sprintf(HIR"         暗器提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/throwing"));
       if (obj->query("armor_prop/stick"))
		str += sprintf(HIM"         棒法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/stick"));
       if (obj->query("armor_prop/staff"))
		str += sprintf(HIM"         杖法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/staff"));
       if (obj->query("armor_prop/spear"))
		str += sprintf(HIB"         枪法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/spear"));
       if (obj->query("armor_prop/fork"))
		str += sprintf(HIM"         叉法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/fork"));
       if (obj->query("armor_prop/club"))
		str += sprintf(HIB"         棍法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/club"));
       if (obj->query("armor_prop/hammer"))
		str += sprintf(GRN"         锤法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/hammer"));
       if (obj->query("armor_prop/magic"))
		str += sprintf(HIM"         法术提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/magic"));
       if (obj->query("armor_prop/spells"))
		str += sprintf(HIM"         咒文提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/spells"));
       if (obj->query("armor_prop/whip"))
		str += sprintf(HIR"         鞭法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/whip"));
       if (obj->query("armor_prop/poison"))
		str += sprintf(GRN"         毒功提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/poison"));
       if (obj->query("armor_prop/finger"))
		str += sprintf(HIG"         指法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/finger"));
       if (obj->query("armor_prop/hand"))
		str += sprintf(HIY"         手法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/hand"));
       if (obj->query("armor_prop/cuff"))
		str += sprintf(HIY"         杖法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/cuff"));
       if (obj->query("armor_prop/claw"))
		str += sprintf(NOR"         爪法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/claw"));
       if (obj->query("armor_prop/strike"))
		str += sprintf(HIM"         掌法提升：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/strike"));
       if (obj->query("armor_prop/taoism"))
		str += sprintf(HIM"         道学心法：" HIG "+ " NOR"%d\n" NOR, obj->query("armor_prop/taoism"));
        if (obj->query("int"))
		str += sprintf(HIR"         镶嵌悟性：" HIG "+ " NOR"%d\n" NOR, obj->query("int"));
       if (obj->query("str"))
		str += sprintf(HIW"         镶嵌臂力：" HIG "+ " NOR"%d\n" NOR, obj->query("str"));
      if (obj->query("con"))
		str += sprintf(HIY"         镶嵌根骨：" HIG "+ " NOR"%d\n" NOR, obj->query("con"));
       if (obj->query("dex"))
		str += sprintf(HIG"         镶嵌身法：" HIG "+ " NOR"%d\n" NOR, obj->query("dex"));
      if (obj->query("damage"))
		str += sprintf(HIW"         镶嵌威力：" HIG "+ " NOR"%d\n" NOR, obj->query("damage"));
          if (me->query("jia/lv"))
		str += sprintf(HIM"         防具等级：" YEL "+ " NOR"%d 级\n" NOR, me->query("jia/lv"));
          if (me->query("weapon/lv"))
		str += sprintf(HIM"         武器等级：" YEL "+ " NOR"%d 级\n" NOR, me->query("weapon/lv"));
          if (obj->query("rate"))
		str += sprintf(MAG"         材料等级：" YEL "+ " NOR"%d 级\n" NOR, obj->query("rate"));
          if (obj->query("value"))
		str += sprintf(HIW"         贩卖价格：" YEL "+ " NOR"%d 两黄金\n" NOR, obj->query("value")/10000);
    

	inv = all_inventory(obj);
	if (! sizeof(inv))
	{
		message("vision", str, me);
		return 1;
	}

	if (obj->is_corpse())
	{
		if (objectp(hob = obj->query_temp("handing")))
		{
			if (hob->query_amount())
				str += "手中还死死握着一" + hob->query("base_unit") +
				       hob->name() + "，";
			else
				str += "手中还死死握着一" + hob->query("unit") +
				       hob->name() + "，";
			inv -= ({ hob });
			if (! sizeof(inv))
				str += "没有什么其他遗物了。\n";
			else
				str += "里面的遗物有：\n";
		} else
			str += "里面的遗物有：\n";
	} else
		str += "里面有：\n";

	for (i = 0; i < sizeof(inv); i++)
	{
		short_name = inv[i]->short();
		if (undefinedp(count[short_name]))
		{
			count += ([ short_name : 1 ]);
			unit += ([ short_name : inv[i]->query("unit") ]);
		}
		else
			count[short_name] += 1;

		if (inv[i]->query("equipped"))
			equiped[short_name] = 1;
	}

	dk = keys(count);
	dk = sort_array(dk, 1);
	for (i = 0; i < sizeof(dk); i++)
	{
	    if (equiped[dk[i]])
		str += HIC "  √" NOR;
	    else
		str += "    ";

	    if (count[dk[i]] > 1)
		str += chinese_number(count[dk[i]]) + unit[dk[i]];
	    str += dk[i] + "\n";
	}

	if (strlen(str) > 4096)
		me->start_more(str);
	else
		message("vision", str, me);
	return 1;
}

int look_living(object me, object obj)
{
    int per_temp,i,j;
    string str, pro,*skills_name;
    mixed *inv;
    mapping my_fam, fam,skills;
    if( me!=obj ){
        if((int)me->query("shen") < 0)
        message("vision", me->name() + "正眯着一双贼眼，不怀好意的盯着你看。\n"NOR, obj);
        else if((int)me->query("shen") > 5000) 
        message("vision", me->name() + "正眯着双眼，笑眯眯的看着你。\n"NOR, obj);
        else if(random(10)>5) message("vision", me->name() + "正盯着你看,不知道有什么企图\n"NOR, obj);
        else message("vision", me->name() + "正盯着你看,不知道在打些什么主意！\n"NOR, obj);
                  }
    if (!objectp(present("fire", me))  && environment(me)->query("outdoors") && NATURE_D->outdoor_room() && !wizardp(me)&&me->query("id")!="snow" ){
    str = sprintf( HIC"\n    你看到前面似乎有个人影，可天太黑了，看不清。\n"NOR);
        write(str);
        return 1;
    }
    str = obj->long();

    pro = (obj==me) ? gender_self(obj->query("gender")) : gender_pronoun(obj->query("gender"));
    if( (string)obj->query("race")=="人类"
    &&  intp(obj->query("age")) )
        str += sprintf("%s看起来约%s多岁。\n", pro, chinese_number(obj->query("age") / 10 * 10));
    per_temp= (obj->query_per()>=30)?20:(obj->query_per()-10);
    if (per_temp<0) per_temp=0;
    if ( (string)obj->query("race")=="人类" ) {
    if ( (string)obj->query("gender") == "女性")
        str += sprintf("%s长的%s。\n", pro, look_level_girl[per_temp]);
    else
        str += sprintf("%s长的%s。\n", pro, look_level_boy[per_temp]);
    skills=obj->query_skills();
    if (!sizeof(skills))
        str+=sprintf("%s看起来似乎不会任何武功。\n", pro);
    else{
        skills_name=sort_array( keys(skills), (: strcmp :) );
        i=random(sizeof(skills_name));
                if (SKILL_D(skills_name[i])->type()=="knowledge")
            str+=sprintf("%s看起来似乎不会任何武功。\n", pro);
        else
            str+=sprintf("%s的武功看起来似乎%s。\n", pro,"/cmds/usr/skills"->skill_level(SKILL_D(skills_name[i])->type(), skills[skills_name[i]]));
    }
// edit by Zjb@TY 
    if ( obj->query("neili") > me->query("neili")*2 ) 
    str += HIR"此人内力及其深厚,看起来你根本不是他的对手,你还是小心一点吧\n"NOR;
    else 
    if ( obj->query("neili")/3 > me->query("neili")/2 )
    str += HIB"此人内力十分深厚,你看不出他的深浅,还是小心为妙!\n"NOR;
    else
    if ( obj->query("neili") > me->query("neili") )
    str += HIM"此人内力虽然比你深厚,但是距离也不大,不过交起手来还是有危险的!\n"NOR;
    else
    if ( obj->query("neili")*2 < me->query("neili") )
    str += HIG"此人内力修为十分差,你一眼便看透了他的虚实!!\n"NOR;
    else
    if ( obj->query("neili")/2 < me->query("neili")/3 )
    str += HIW"此人内力修为比较差,看起来根本不是你的对手!!\n"NOR;
    else
    if ( obj->query("neili") < me->query("neili") )
    str += HIY"此人内力修为虽然没有你高,但是已经相距不远了!!\n"NOR;
    else
    if ( obj->query("neili") == me->query("neili") )
    str += MAG"此人内力修为和你在伯仲之间,想分出高下,看来得过招后才知道!!\n"NOR;


     if ( obj->query("per")>20) {
   if ( (string)obj->query("gender") == "女性" )
             str+=sprintf(RED "%s脸色一沉，转过头来瞪了你一眼，骂道：“看什么看，没见过美女啊！\n"NOR, pro);
               if( (string)obj->query("gender") == "男性"  )
             str+=sprintf(RED "%s脸色一沉，转过头来瞪了你一眼，骂道：“看什么看，没见过帅哥啊！\n"NOR, pro);
  }
  else
{     if ( (string)obj->query("gender") == "女性" ) 
                 str+=sprintf(HIC "%s低垂着头，害羞地说道：“虽然我长得丑,但这不是我的错呀！呜`\n"NOR, pro); 
       if( (string)obj->query("gender") == "男性"  )
  str+=sprintf(HIY "%s一脸羞愧，骂道：“我是不帅,但是受女人爱.哈哈！\n"NOR, pro);
}
}


    // If we both has family, check if we have any relations.
    if( obj!=me
    &&  mapp(fam = obj->query("family"))
    &&  mapp(my_fam = me->query("family")) 
    &&  fam["family_name"] == my_fam["family_name"] ) {
    
        if( fam["generation"]==my_fam["generation"] ) {
            if( (string)obj->query("gender") == "男性" )
                str += sprintf( pro + "是你的%s%s。\n",
                    my_fam["master_id"] == fam["master_id"] ? "": "同门",
                    my_fam["enter_time"] > fam["enter_time"] ? "师兄": "师弟");
            else
                str += sprintf( pro + "是你的%s%s。\n",
                    my_fam["master_id"] == fam["master_id"] ? "": "同门",
                    my_fam["enter_time"] > fam["enter_time"] ? "师姐": "师妹");
        } else if( fam["generation"] < my_fam["generation"] ) {
            if( my_fam["master_id"] == obj->query("id") )
                str += pro + "是你的师父。\n";
            else if( my_fam["generation"] - fam["generation"] > 1 )
                str += pro + "是你的同门长辈。\n";
            else if( fam["enter_time"] < my_fam["enter_time"] )
                str += pro + "是你的师伯。\n";
            else

                str += pro + "是你的师叔。\n";
        } else {
            if( fam["generation"] - my_fam["generation"] > 1 )
                str += pro + "是你的同门晚辈。\n";
            else if( fam["master_id"] == me->query("id") )
                str += pro + "是你的弟子。\n";
            else
                str += pro + "是你的师侄。\n";
        }
    }

    if( obj->query("max_qi") )
//由于数据溢出，修复         str += pro + COMBAT_D->eff_status_msg((int)obj->query("eff_qi") * 100 / (int)obj->query("max_qi")) + "\n";
          str += pro + COMBAT_D->eff_status_msg((int)obj->query("eff_qi") / (int)obj->query("max_qi") * 100) + "\n";
    inv = all_inventory(obj);
    if( sizeof(inv) ) {
        inv = map_array(inv, "inventory_look", this_object(), obj->is_corpse()? 0 : 1 );
        inv -= ({ 0 });
        if( sizeof(inv) )
            str += sprintf( obj->is_corpse() ? "%s的遗体上有:\n%s\n" : "%s%s\n",
                            pro, implode(inv, "\n") );
        if (!obj->query_temp("armor/cloth") && obj->query("race")=="人类" )
            str+=pro+"光着"+YEL+"身子"+NOR+"，什么也没穿！\n";
    }   else    str += sprintf( obj->is_corpse() ? "%s的遗体上什么也没有。\n" : (obj->query("race")=="人类"?"%s光着"+YEL+"身子"+NOR+"，什么也没穿！\n":"它的身上没有任何东西。\n"),pro);
    if (strlen(str)>8192)

    me->start_more(str);
    else     message("vision", str, me);
    if( obj!=me && living(obj)){
        i=obj->query("shen");
        j=me->query("shen");
            if ((i<-500000 && j>500000 ) || (i>500000 && j<-500000 ) ){
            write( obj->name() + "突然转过头来瞪你一眼。\n");
            COMBAT_D->auto_fight(obj, me, "berserk");
        }
    }
    return 1;
}
string inventory_look(object obj, int flag)
{
    string str;
     if( !flag )
        return "      "+obj->short();
    if( obj->query("equipped") ){
            switch( obj->query("armor_type") ) {
                case "cloth":
                case "armor":   str = "身穿";break; break;
                case "boots":   str = "脚穿";break; break;
                case "head":    str = "头戴";break;

                case "neck":    str = "颈围";break;
                case "wrists":  str = "手腕戴着";break;
                case "finger":  str = "手指上戴着";break;
                case "hands":   str = "手上拿着";break;
                case "waist":   str = "腰间绑着";break;
                default:    if ( environment(obj)->query_temp("weapon")==obj ) str = "右手执";
                            else str = "左手执";
            }
    str += "一" + obj->query("unit")+obj->query("name")+"。";
    }
    return str;
}
int look_room_item(object me, string arg)
{
    object env;
    mapping item, exits;
    if( !objectp(env = environment(me)) )
        return notify_fail("这里只有灰蒙蒙地一片，什麽也没有。\n");
    if( mapp(item = env->query("item_desc")) && !undefinedp(item[arg]) ) {
        if( stringp(item[arg]) )
            write(item[arg]);
        else if( functionp(item[arg]) )
            write((string)(*item[arg])(me));

        return 1;
    }
    if( mapp(exits = env->query("exits")) && !undefinedp(exits[arg]) ) {
        if( objectp(env = find_object(exits[arg])) )
        {
            look_room(me, env,me->query("env/brief"));
            tell_room(env,"有人探头探脑地向这边张望了几眼。\n");
         }
        else {
            call_other(exits[arg], "???");
            look_room(me, find_object(exits[arg]),me->query("env/brief"));
        }
        return 1;
    }
    return notify_fail("你要看什麽？\n");
}
string clean_color(string arg)
{
        if(!arg)
                return "";
        arg = replace_string(arg, BLK, "");
        arg = replace_string(arg, RED, "");
        arg = replace_string(arg, GRN, "");
        arg = replace_string(arg, YEL, "");
        arg = replace_string(arg, BLU, "");
        arg = replace_string(arg, MAG, "");
        arg = replace_string(arg, CYN, "");
        arg = replace_string(arg, WHT, "");
        arg = replace_string(arg, HIR, "");
        arg = replace_string(arg, HIG, "");
        arg = replace_string(arg, HIY, "");
        arg = replace_string(arg, HIB, "");
        arg = replace_string(arg, HIM, "");
        arg = replace_string(arg, HIC, "");
        arg = replace_string(arg, HIW, "");
        arg = replace_string(arg, NOR, "");
        arg = replace_string(arg, BLINK,"");
        return arg;
}

int help (object me)
{
    write(@HELP
指令格式: look [<物品>|<生物>|<方向>]
 
这个指令让你查看你所在的环境、某件物品、生物、或是方向。

HELP
);
    return 1;
}


