looksj.c

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

C
547
字号
// look.c

#include <room.h>
#include <ansi.h>
#include <combat.h>
inherit F_CLEAN_UP;

int look_room(object me, object env, int night);
int look_item(object me, object obj);
int look_living(object me, object obj);
int look_room_item(object me, string arg);
string getper(object obj);
string tough_level(int power, int hide_level);
string gettof(object obj);
string getdam(object obj);
string getatt(object obj);
string getdef(object obj);
string getdog(object obj);
void create() { seteuid(getuid()); }

int main(object me, string arg)
{
        object obj;
        int result;
if (me)
return notify_fail("这个指令只能由系统执行。\n");
        if( !arg ) result = look_room(me, environment(me), NATURE_D->is_night());
        else if( (obj = present(arg, me)) || (obj = present(arg, environment(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 look_room(object me, object env, int night)
{
        int i;
        object *inv;
        mapping exits;
        string str, *dirs;

        if( !env ) {
                write("你的四周灰蒙蒙地一片,什么也没有。\n");
                return 1;
        }
        
        str = env->query("long");
        // night ^_^ , added by snowman@SJ
        
        if(env->query("no_light")
           && !env->query_night_light()
           && random(me->query_con()) < 35){
                if(env->query("night_long")) str = env->query("night_long");
                else str = "这里一片漆黑,你虽然睁大了眼睛仔细观看,可还是看不清楚周围的\n"+ 
                           "事物。一切都被笼罩在黑暗之中,伸手不见五指... \n";
                }
                
        else if(env->query("outdoors") && night 
           && !env->query_night_light()
           && random(me->query_con()) < 35){
                if(env->query("night_long")) str = env->query("night_long");
                else str = "夜晚了,你虽然睁大了眼睛仔细观看,可还是看不清楚周围的事物。\n"+
                           "一切都被夜色所笼罩,连脚下的道路都模糊不清了... \n";
                }      
                     
        str = sprintf( "%s - %s\n    %s%s",
                env->query("short"),
                wizardp(me)? file_name(env): "",
                str,
                env->query("outdoors")? NATURE_D->outdoor_room_description() : "" );

        if( mapp(exits = env->query("exits")) ) {
                dirs = sort_array(keys(exits), 1);
                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";
                        
                // night ^_^ , added by snowman@SJ
                else if((env->query("outdoors") || env->query("no_light")) 
                        && night && !env->query_night_light()
                        && random(me->query_con()) < 35){
                        i = random(sizeof(dirs));
                        if( random(me->query_con()) < 10) i = 0;
                        else if( random(me->query_con()) < 20) i = 1;
                        if( i <= 0 )
                                str += "    这里看不见任何明显的出路。\n";
                        else if( i == 1 )
                                str += "    这里看得见的唯一出口是 " + BOLD + dirs[i-1] + NOR + "。\n";
                        else str += sprintf("    这里看得清的出口是 " + BOLD + "%s" + NOR + "。\n", implode(dirs[1..i], "、"));
                        }
                // hehehe.....
                
                else if( sizeof(dirs)==1 )
                        str += "    这里唯一的出口是 " + BOLD + dirs[0] + NOR + "。\n";
                        
                else    str += sprintf("    这里明显的出口是 " + BOLD + "%s" + NOR + " 和 " + BOLD + "%s" + NOR + "。\n",
                                implode(dirs[0..sizeof(dirs)-2], "、"), dirs[sizeof(dirs)-1]);
                        
        }
//      str += env->door_description();

        inv = all_inventory(env);
        for(i=0; i<sizeof(inv); i++) {
                if( inv[i]==me ) continue;
                if( !me->visible(inv[i]) ) continue;
                
                // night.
                if((env->query("outdoors") || env->query("no_light")) 
                   && night 
                   && !env->query_night_light() 
                   && random(me->query_con()) < 35 
                   && !inv[i]->is_character()) continue;   
                // hehehehehehe.....   
                str += "  " + inv[i]->short() + "\n";
        }

        write(str);
        return 1;
}

int look_item(object me, object obj)
{
        mixed *inv;
        string prep;

        write(obj->long());
        inv = all_inventory(obj);
        if( !obj->is_closed() && sizeof(inv)) {
                switch( (string)obj->query("prep") ) {
                        case "on":
                                prep = "上";
                                break;
                        case "under":
                                prep = "下";
                                break;
                        case "behind":
                                prep = "后";
                                break;
                        case "inside":
                                prep = "里";
                                break;
                        default:
                                prep = "里";
                                break;
                        }
                inv = map_array(inv, "inventory_look", this_object() );
                message("vision", sprintf("%s面有:\n  %s\n", prep,
                        implode(inv, "\n  ") ), me);
        }
        return 1;
}

string getper(object obj)
{
        int per, age;

        string str;

        per = obj->query_per();
        age = obj->query("age");
        
        if ((string) obj->query("gender") == "女性"){
            if (per >= 40) str = "超凡脱俗,娇艳绝伦,貌如西子胜三分!\n";
            else if (per >= 37){
                      if(obj->max_food_capacity() > 320)
                           str = "驻唇不涂一点红,回眸一笑百媚生!\n";
                      else str = "清丽绝俗,冰清玉洁,有如画中天仙!\n";
                      }
            else if (per >= 33){
                      if(obj->max_food_capacity() > 320)
                           str = "容貌丰美,气质高雅,堪称人间仙子!\n";
                      else str = "容貌娇美,姣花照水,堪称人间仙子!\n";
                      }
            else if (per >= 30){
                      if(obj->max_food_capacity() > 320)
                           str = "脸若银盆,眼如水杏,相貌绝美!\n";
                      else str = "美奂绝伦,一笑倾城,再笑倾国!\n";
                      }
            else if (per >= 27) str = "羞花闭月,宛若天仙!\n";
            else if (per >= 24) str = "花颜月貌,柔媚娇俏!\n";
            else if (per >= 20) str = "楚楚动人,有几分姿色!\n";
            else if (per >= 17) str = "相貌平庸,很是一般。\n";
            else if (per >= 14) str = "五官挪位,貌似无盐。\n";
            else str = "一塌糊涂,不是人样!\n";
        } else {
            if (per >= 40) str = "英姿勃发,一表人才,称为古往今来第一人!\n";
            else if (per >= 37) str = "玉树临风,风流倜傥,堪称绝世美男!\n";
            else if (per >= 33) str = "清秀俊雅,相貌非凡,真是人中龙凤!\n";
            else if (per >= 30){
                      if(obj->max_food_capacity() < 160)
                             str = "貌似美女,脸若冠玉,弱不禁风!\n";
                      else  str = "貌似潘安,容比宋玉,仪表堂堂!\n";
                      }
            else if (per >= 27) str = "相貌出众,堪称美男!\n";
            else if (per >= 24) str = "英俊潇洒,气质非凡。\n";
            else if (per >= 20) str = "五官端正,相貌平平。\n";
            else if (per >= 17) str = "五官不正,满脸麻子。\n";
            else if (per >= 14) str = "牛眼驴唇,面目狰狞。\n";
            else str = "有如雷公下凡,八戒返魂!\n";
        }
        return "长得" + str;
}

string gettof(object ob)
{
        object weapon;
        string skill_type;
        int attack_points, hide_level;
        mapping prepare;

        if( objectp(weapon = ob->query_temp("weapon")) )
        {
                skill_type = weapon->query("skill_type");
        }
        else
        {
                prepare = ob->query_skill_prepare();
                if (!sizeof(prepare)) skill_type = "unarmed";
                else skill_type = keys(prepare)[0];
        }

        attack_points = COMBAT_D->skill_power(ob, skill_type, SKILL_USAGE_ATTACK);
        
        if( intp(hide_level = ob->query_temp("hide_level")) && hide_level > 0)
               return tough_level(attack_points/100, hide_level);
        return tough_level(attack_points/100, 0);
}

string getatt(object ob)
{
        object weapon;
        string skill_type;
        int attack_points, hide_level;
        mapping prepare;

        if( objectp(weapon = ob->query_temp("weapon")) )
        {
                skill_type = weapon->query("skill_type");
        }
        else
        {
                prepare = ob->query_skill_prepare();
                if (!sizeof(prepare)) skill_type = "unarmed";
                else skill_type = keys(prepare)[0];
        }

attack_points = COMBAT_D->skill_power(ob, skill_type, SKILL_USAGE_ATTACK);         
        if( intp(hide_level = ob->query_temp("hide_level")) && hide_level > 0)
               return tough_level(attack_points/100, hide_level);
        return tough_level(attack_points/100, 0);
}

string getdef(object ob)
{
        object weapon;
        string skill_type;
        int attack_points, hide_level;
        mapping prepare;

        if( objectp(weapon = ob->query_temp("weapon")) )
        {
                skill_type = weapon->query("skill_type");
        }
        else
        {
                prepare = ob->query_skill_prepare();
                if (!sizeof(prepare)) skill_type = "unarmed";
                else skill_type = keys(prepare)[0];
        }

⌨️ 快捷键说明

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