⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 home.c

📁 C实现的MUD,对大家基本入门网络游戏很有帮助!
💻 C
字号:
// home.c
// standard home for players.
// by mon. 3/3/97

#include <ansi.h>

inherit F_SAVE;
inherit ITEM;

string out="/d/taohuacun/taohua7";

int save_room();
int do_bed();
string check_str(string str);
object find_bed(object me);
void get_long_text(string str, string text);
void get_bed_long_text(string str, string text);

int is_home() {return 1;}

void create()
{
     set_name("新房",({"room"}));
     set("short", "标准新房");
     set("long", @LONG

一切都设置好了,只等一些室内装修。
LONG
     );
     set("home_host",({"def_host"}));
//     set("env/invisibility",1);
     set("exits", ([
       "out": out,
     ]));
     set_max_encumbrance(100000000);
//     set_max_items(20);
     set_weight(10000000);
     set("no_get",1);
//     set("no_magic", 1);
     set("no_fight", 1);
     seteuid(getuid());
     setup();

}

void init()
{
     object me=this_player(), env=this_object();
     object *present;
     string id,*home_host,*invited;
     int i,inv,j,k;

     if(env==environment(me))
     {
         set_name(this_object()->query("short"), ({this_object()->query("file_name")}));
         id=(me->parse_command_id_list())[0];
         home_host=env->query("home_host");

         if (member_array(id,home_host)==-1 && !me->query("is_baby"))
         {
             invited=me->query_temp("invited");
             inv=0;
             if(invited)
             {
                 for(i=0;i<=sizeof(invited)-1;i++)
                 {
                     if(member_array(invited[i],home_host)>-1)
                     {
                         inv=1;
                         break;
                     }
                 }
             }
             if(inv==1)
             {
                 present=all_inventory(env);
                 j=sizeof(present);
                 k=0;
                 if(j)
                 {
                     for(i=0; i<j; i++)
                     {
                         if(member_array(present[i]->query("id"),home_host)>-1)
                         {
                             k=1;
                             break;
                         }
                     }
                 }
                 if(!k)
                 {
                     write("主人不在家,您还是呆会儿再来吧。\n");
                     me->move(out,1);
                     tell_room(out,me->query("name")+"失望地走了出来。\n",({me}));
                     return;
                 }
             }
             else
             {
                 tell_object(me, "啊哈! 闯进来了!\n");
                 tell_object(me, "某某飞起一脚,正好踢中你的屁股 。  \n");
                 tell_object(me, "某某飞起一脚,正好踢中你的屁股 。  \n");
                 me->move(out,1);
                 tell_room(out,me->query("name")+
                  "似乎被人一脚踢了出来,神色有点狼狈。\n", ({me}));
                 return;
             }
             tell_room(env,me->query("name")+"拉开门,走了进来。\n",({me}));
         }
         add_action("do_bed", "gosleep");
         add_action("do_bed", "gobed" );
         add_action("do_bed", "bed");
         add_action("go_out", "out");
         find_bed(me);
         if (member_array(me->query("id"),home_host)>-1)
         {
             add_action("set_long", "homedesc");
             add_action("set_short", "homename");
             add_action("set_bed_long", "beddesc");
             add_action("set_bed_short", "bedname");
             add_action("do_findbaby","findbaby");
         }
     }
     return;
}

int do_findbaby()
{
    object me=this_player(),*list,*parents,baby,where;
    int number,size,i,j,found;
    string myid,*babyid;

    number=me->query("child");
    if(number==0) return notify_fail("您还没有生下孩子呢。:)\n");

    myid=me->query("id");

    list=children("/d/taohuacun/npc/baby");
    size=sizeof(list);

    for(i=1;i<=number;i++)
    {
        found=0;
        if(size>0)
        {
            for(j=0;j<size;j++)
            {
                if(list[j]->query("id")==me->query("child_"+i+"/id")[0])
                {
                    where=environment(list[j]);
                    if(where)
                    {
                        found=1;
                        write(list[j]->query("name")+"现在在");
                        if(where->query("short"))
                        {
                            write(where->query("short"));
                        }
                        else
                        {
                            write(where->short());
                        }
                        write("。\n");
                        break;
// If one have more than one boys or girls, break here after first match. Dream 01/03/98.
                    }
                }
            }
        }
        if(found==0)
        {
            if(me->query("child_"+i+"/id"))
            {
     //modify old baby data, for compatibility.
                if(stringp(me->query("child_"+i+"/id")))
                {
                    babyid=({me->query("child_"+i+"/id")})+({"baby"});
                    me->set("child_"+i+"/id",babyid);
                    me->save();
                }
                babyid=me->query("child_"+i+"/id");
                baby=new("/d/taohuacun/npc/baby");
                baby->set("long",me->query("child_"+i+"/long"));
                baby->set("gender",me->query("child_"+i+"/gender"));
                baby->set("parents",me->query("child_"+i+"/parents"));
                baby->set_name(me->query("child_"+i+"/name"),babyid);
                baby->move(environment(me));
                message_vision("你忽然看到床底下"+
                   ({"探出一颗小脑瓜","伸出一双小脚丫","伸出一支小手"})
                   [random(3)]+"...\n",me);
            }
            else
            {
                write("Error: don't have data for baby "+i+". Please report to wiz. :)\n");
            }
        }
    }
    return 1;
}

object find_bed(object me)
{
    object env,*inv,table,card,bed,home=this_object();
    string str;
    int i;
    env=environment(me);
    inv=all_inventory(env);
    if(i=sizeof(inv))
    {
        for(i=0; i<sizeof(inv); i++)
        {
            if (inv[i]->query("id")=="bed")
            {
                bed=inv[i];
                break;
            }
        }
    }

    if(!bed)
    {
        table=new(__DIR__"table");
        table->move(home);
        card=new(__DIR__"card");
        card->move(table);
        bed=new(__DIR__"bed");
        bed->set("out",this_object());
        if(strlen(str=home->query("bed_short"))>1)
        {
            bed->set("short",str);
            bed->set_name(str,({bed->query("id")}));
        }
        if(strlen(str=home->query("bed_long"))>1)
        {
            bed->set("long",str);
        }
        bed->move(home);
    }
    return bed;
}

int do_bed()
{
    object me=this_player(),bed;
    bed=find_bed(me);
    message_vision(HIY "$N掀开纱帐,准备上床了。\n\n" NOR, me);
    if(!me->move(bed))
    {
        write(HIY "床上已经挤不下了!\n" NOR);
    }
    else
    {
        message_vision(HIY "\n沙帐轻轻一动,$N钻了进来。\n" NOR, me);
    }
    return 1;
}

string query_save_file()
{
    return DATA_DIR"playerhomes/"+this_object()->query("file_name");
}

int save_room()
{
    string file;

    file=this_object()->query_save_file();

//   if( file_size(file+".o")!=-1 ) {
//     write("档案已存在,要删除旧档吗?[y/n]");
//     input_to("save_room_file");
//     return 1;
//       }
//   return save_room_file("y");
//}
//int save_room_file(string yn)
//{
//   if( strlen(yn)<1 || yn[0]!='y' ) return 1;

    write("存档 .....\n");
    if( save() )
    {
        write("Ok.\n");
        return 1;
    }
    else
    {
        write("你没有写入这个档案的权利。\n");
        return 0;
    }
}

int go_out()
{
    object me=this_player();
    tell_room(this_object(),me->query("name")+"推开门,走了出去。\n",({me}));
    me->move(out);
    message_vision("$N推开门,走了出来。\n",me);
    return 1;
}

int set_short(string str)
{
    if(!str) return 0;

    str=check_str(str);
    set("short",str);
    set_name(this_object()->query("short"), ({this_object()->query("file_name")}));
    save_room();
    return 1;
}

int set_bed_short(string str)
{   object bed;
    if(!str) return 0;

    str=check_str(str);
    if(objectp(bed=present("home_bed",this_object())) && bed->query("id") == "home_bed")
    {
        set("bed_short",str);
        bed->set("short",str);
        bed->set_name(str,({bed->query("id")}));
        save_room();
        return 1;
    }
    return 0;
}

int set_long()
{
    string str;
    this_player()->edit( (:get_long_text, str :) );
    return 1;
}

int set_bed_long()
{
    string str;
    this_player()->edit( (:get_bed_long_text, str :) );
    return 1;
}

void get_long_text(string str, string text)
{
    str=check_str(text);
    set("long",str);
    save_room();
    return;
}

void get_bed_long_text(string str, string text)
{
    object bed;

    str=check_str(text);
    set("bed_long",str);
    if(objectp(bed=present("home_bed",this_object())))
    {
        bed->set("long",str);
    }
    save_room();
    return;
}

string check_str(string str)
{
    str=replace_string(str,"\"","");
    str=replace_string(str,";","");
    str=replace_string(str,"\\","");
    str=replace_string(str,"/","");
    str=replace_string(str,"'","");
    str=replace_string(str,"`","");
    str=replace_string(str,",","");
    str=replace_string(str,"!","");
    str=replace_string(str,"~","");
    str=replace_string(str,"{","");
    str=replace_string(str,"}","");
    str=replace_string(str,"$","");
    str=replace_string(str,"&","");
    return str;
}

int clean_up()
{    //clean_up homes
    object *inv,*inv1;
    int i,j;

    if( !clonep() && this_object()->query("no_clean_up") ) return 1;

    inv = all_inventory();
    for(i=sizeof(inv)-1; i>=0; i--)
    {
        if(userp(inv[i])) return 1;
        if(inv[i]->query("if_bed"))
        {  //a bed object
            inv1=all_inventory(inv[i]);
            if(sizeof(inv1)>0)
                for(j=sizeof(inv1)-1; j>=0; j--)
                {
                    if (userp(inv1[j])) return 1;
                }
        }
    }

    destruct(this_object());
    return 0;
}

⌨️ 快捷键说明

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