北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 6727|回复: 0

床及椅子的应用思路(zz)

[复制链接]
发表于 2004-6-19 15:08:23 | 显示全部楼层 |阅读模式
作者:waiwai 更新日期:2004-02-16 类别:MUD文档->系统开发 总浏览/今日:32/1
基本思路:
1.一张椅子单独实现功能,不在room文件写功能,哪个room需要,可以随便放置一个。
2.两张椅子或多张相同文件的椅子在一个房间,如何区分实现功能。
3.椅子和床混杂的房间,多张椅子多张床如何合理的实现功能。
4.一张椅子坐多个人,单人床,双人床及10人大铺如何区分及反馈。
5.在有床的房间,sleep时,必须先上床,然后sleep,取消单独的sleep的类似多余的
  gobed等,gobed毛病太多了。。。
6.玩家在床或椅子上断线,离线,昏迷,死亡等,如何合理地恢复椅子床的空置状态。
7.实现在坐或躺的状态下,不减年龄和食物饮水。

--------------------------------------------------------------------------

指令相关:
--------------------------------------------------------------------------
go.c
移动时自动判断消除自身坐或躺的状态,自动消除椅子或床的标记
比如:
sit = me->query_temp("marks/sit");

if( sit )   {

if( me->query("race") == "野兽" )
message( "vision", me->name() + "伸了个懒腰,从"+sit->name()+"上跳下来跑了出去。。。n",
environment(sit), ({me}) );
else
message( "vision", me->name() + "伸了个懒腰,从"+sit->name()+"上站起来走了出去。。。n",
environment(sit), ({me}) );

if( userp(me) && environment(me) == environment(sit) )
tell_object(me,"n你伸了个懒腰,从"+sit->name()+"上站起来走了出来。。。n");

if( sit->query("owner"))
sit->delete("owner");

if( sit->query("sit_over_num"))
sit->add("sit_over_num",-1);

if( sit->query("sit_over"))
sit->delete("sit_over/"+log_id(me));

me->delete_temp("marks/sit");

if( me->query_temp("sit/msg") )
me->delete_temp("sit/msg");

}

--------------------------------------------------------------------------
get.c
自身在坐或躺的状态,被人get同时,自动判断消除自身坐或躺的状态,
自动消除椅子或床的标记。
比如:

if( obj->is_character() ) {

// Added by waiwai@2004/01/16
sit = obj->query_temp("marks/sit");

if( sit && environment(me) == environment(sit) ) {

if( sit->query("owner"))
sit->delete("owner");

if( sit->query("sit_over_num"))
sit->add("sit_over_num",-1);

if( sit->query("sit_over"))
sit->delete("sit_over/"+log_id(obj));

obj->delete_temp("marks/sit");

if( obj->query_temp("sit/msg") )
obj->delete_temp("sit/msg");

  message_vision( "$N将$n从"+sit->name()+"上扶了起来背在背上。n", me, obj );

} else
  message_vision( "$N将$n扶了起来背在背上。n", me, obj );

}
--------------------------------------------------------------------------
quit.c
离线中force_quit时,需加判断消除椅子或床的该人标记
比如:
sit = me->query_temp("marks/sit");

if( sit )   {

if( sit->query("owner"))
sit->delete("owner");

if( sit->query("sit_over_num"))
sit->add("sit_over_num",-1);

if( sit->query("sit_over"))
sit->delete("sit_over/"+log_id(me));
}

--------------------------------------------------------------------------
sleep.c
在系统中有if_bed标记的房间均放置至少一个床
sit = me->query_temp("marks/sit");

if( where->query("if_bed") && userp(me) ) {
if( !sit   )
return notify_fail(WHT"你没有躺(lies)在床上怎么睡觉啊?n"NOR);

if( sit && where != environment(sit) )
return notify_fail(WHT"你是躺(lies)在"+sit->name()+"的吧?床不在这啊?n"NOR);
}

老系统中if_bed的房间似乎比较可笑,没有床,也可以往被中一钻睡觉,而即使摆着
张床也只是看的。。。

if( sit )
message_vision(HIY "$N"HIY"往被中一钻,不一会便鼾声大作,进入了梦乡。n" NOR,me);
else
message_vision(HIY "$N"HIY"就地一躺,不一会便鼾声大作,进入了梦乡。n" NOR,me);

sleep中要注意区分野兽,玩家和一般NPC针对force_sleep的状态处理问题
野兽,如小狗小猫就没必要设置busy一类的。。
另外野兽sleep醒了后可以自动跳下床,比如:
if( !userp(me) && me->query_temp("marks/sit") )
  me->command_function("standup");

--------------------------------------------------------------------------


系统相关:
--------------------------------------------------------------------------
/feature/command.c
在这里主要控制在坐着或躺着的状态可以使用的系统功能指令
--------------------------------------------------------------------------
/feature/damage.c
1.战斗昏迷或死亡,自动载下椅子或床,合理恢复自身及坐具状态
if( objectp(sit = query_temp("marks/sit")) ) {

if( environment(this_object())== environment(sit) ) {
              message_vision(HIW"n$N"HIW"一头从$n"HIW"上面栽了下来!n"NOR, this_object(), sit);

if( sit->query("sit_over_num"))
sit->add("sit_over_num",-1);

if( sit->query("sit_over"))
sit->delete("sit_over/"+log_id(this_object()));

this_object()->delete_temp("marks/sit");

if( this_object()->query_temp("sit/msg") )
this_object()->delete_temp("sit/msg");
}

}

2.心跳中判断坐或躺的状态,不减饮水食物
  比如:if (userp(ob) && ob->query_temp("sit/msg") ) return -1;
--------------------------------------------------------------------------
/feature/name.c
坐及躺的状态反馈信息设置
比如:
sit = me->query_temp("marks/sit");

if( sit && (sit->is_bed() || sit->is_chair())
&& environment(me) == environment(sit) ) {
if(me->query_temp("sit/msg"))
str += " <"WHT+me->query_temp("sit/msg")+NOR">";
}
--------------------------------------------------------------------------
/std/item/item.c
物件状态反馈目前该物件上有几个人及状态

比如:

if( sizeof(null)>0 ) {
if( sizeof(null)==1 )
str += NOR" <上面"+msg+"着"+implode(null[0..1],",")+NOR">";
else
if( sizeof(null)==2 )
str += NOR" <上面"+msg+"着"+implode(null[0..2],",")+NOR">";
else
if( sizeof(null)<=5 )
str += NOR" <上面"+msg+"着"+implode(null[0..sizeof(null)-2], ",")+"和"+null[sizeof(null)-1]+">";
else
str += NOR" <上面"+msg+"着"+implode(null[0..4], ",")+"n"+
implode(null[5..sizeof(null)-2], ",")+"和"+null[sizeof(null)-1]+">";
}
--------------------------------------------------------------------------
/std/item/sit-bed.c
系统中椅子或床的总继承文件,实现坐下(sit)或站起来(stand)的基本功能
--------------------------------------------------------------------------
/obj/user.c
1.在update_age()中加入坐或躺的状态不减年龄的设置
2.断线时自动消除椅子或床的标记,以免断线中别人无法使用
--------------------------------------------------------------------------


实际场景:
--------------------------------------------------------------------------
「厢房」s『窗外』→ 隆冬的上午(Winter) [天气]:大雪(Snow) ※   
   
厢房里整整齐齐,南北各有一红砖大炕,铺着锦花棉被。炕上
有硬木炕桌,放有茶锺瓷碗。墙上有一些字画,写着:“一诚
达上,寸敬虔归。”

  〖 出口 〗:east 和 west
  道士(Dao shi)
  道士(Dao shi)
  z 红砖大炕(da kang)
  z 红砖大炕(da kang)

>>道士懒懒地往红砖大炕上一躺。。。
道士往被中一钻,不一会便鼾声大作,进入了梦乡。

「厢房」s『窗外』→ 隆冬的上午(Winter) [天气]:大雪(Snow) ※   
   
厢房里整整齐齐,南北各有一红砖大炕,铺着锦花棉被。炕上
有硬木炕桌,放有茶锺瓷碗。墙上有一些字画,写着:“一诚
达上,寸敬虔归。”

  〖 出口 〗:east 和 west
  道士(Dao shi)
  道士(Dao shi) <正懒懒地躺在红砖大炕上><睡梦中>
  z 红砖大炕(da kang) <上面正躺着道士(Chechi)>
  z 红砖大炕(da kang)
>>道士一觉醒来,精力充沛地活动了一下筋骨。
道士伸了个懒腰,从红砖大炕上站了起来。


你懒懒地往红砖大炕上一躺。。。

「厢房」s『窗外』→ 隆冬的正午(Winter) [天气]:大雪(Snow) ※   
   
厢房里整整齐齐,南北各有一红砖大炕,铺着锦花棉被。炕上
有硬木炕桌,放有茶锺瓷碗。墙上有一些字画,写着:“罗天
大醮,彻夜看经。”

    这里唯一的〖 出口 〗:west
  道士(Dao shi)
  道士(Dao shi) <正懒懒地躺在红砖大炕上><睡梦中>
  z 红砖大炕(da kang) <上面正躺着没头脑(waiwai),道士(Chechi)>
  z 红砖大炕(da kang)
--------------------------------------------------------------------------


其他人看到的
--------------------------------------------------------------------------
「厢房」s『窗外』→ 隆冬的正午(Winter) [天气]:大雪(Snow) ※   
   
厢房里整整齐齐,南北各有一红砖大炕,铺着锦花棉被。炕上
有硬木炕桌,放有茶锺瓷碗。墙上有一些字画,写着:“罗天
大醮,彻夜看经。”

    这里唯一的〖 出口 〗:west
  光辉岁月领袖 没头脑(Waiwai) <正懒懒地躺在红砖大炕上>
  道士(Dao shi)
  道士(Dao shi) <正懒懒地躺在红砖大炕上><睡梦中>
  z 红砖大炕(da kang) <上面正躺着没头脑(waiwai),道士(Chechi)>
  z 红砖大炕(da kang)
--------------------------------------------------------------------------

躺上3个人的情形
--------------------------------------------------------------------------
「厢房」s『窗外』→ 隆冬的正午(Winter) [天气]:大雪(Snow) ※   
   
厢房里整整齐齐,南北各有一红砖大炕,铺着锦花棉被。炕上
有硬木炕桌,放有茶锺瓷碗。墙上有一些字画,写着:“罗天
大醮,彻夜看经。”

    这里唯一的〖 出口 〗:west
  ㊣ 西游记帮众 测试(Seach) <正懒懒地躺在红砖大炕上>
  道士(Dao shi)
  道士(Dao shi) <正懒懒地躺在红砖大炕上><睡梦中>
  z 红砖大炕(da kang) <上面正躺着道士(Chechi),没头脑(waiwai)和测试(seach)>
  z 红砖大炕(da kang)
--------------------------------------------------------------------------

看大炕
--------------------------------------------------------------------------
l dakang
这是一张红砖大炕。
红砖大炕可以躺(lies)得下10个人,休息好了可以随时起床(standup)。
红砖大炕可用有效ID:da kang, dakang, kang
──────────────────────────────
[组成物质] → 主质:木(Wood)           辅质:铁钉(Iron-Nail)

--------------------------------------------------------------------------


椅子的情形
--------------------------------------------------------------------------
>>测试悠闲地坐在了红木太师椅上。

look

  〖 出口 〗:north、south、up 和 west
  ㊣ 西游记帮众 测试(Seach) <正悠闲地坐在红木太师椅上>
  店小二(Xiao er) ㊣
  z 红木太师椅(taishi yi) <上面端坐着测试(seach)>
  邮差 千里眼(Qianli yan)
  z 楠木高背椅(nanmu yi)
--------------------------------------------------------------------------


东海之滨的一个石条
--------------------------------------------------------------------------
>>l shi tiao
这是一根石条。
一根可以坐(sit)的下3个人的石条。
石条可用有效ID:shi tiao, shitiao
──────────────────────────────
[组成物质] → 主质:大理石(Marble)     辅质:大理石(Marble)


「东海之滨」 隆冬的夜晚,夜幕笼罩著大地,万物在洁白的厚雪下沉沉睡去   
   
面前便是东海,茫茫大海望不到边际。海面上波涛汹涌,几丈高的
浪头此起彼伏,象是要吞灭一切敢于到海上的东西。也许这里便是
路的尽头,面前的大海对一个凡人来说是不可逾越的。离岸不远处
漂着一只木筏 (mufa)

  〖 出口 〗:north、east 和 west
    [泊船] 目前没有任何船只停泊在此。
  ㊣ 西游记帮众 测试(Seach)
  z 石条(shi tiao)
>>测试若有所思地坐在了石条上。

>>sit shi tiao
你若有所思地坐在了石条上。

「东海之滨」 隆冬的深夜,夜幕低垂,寒风中晴朗的夜空满天繁星   
   
面前便是东海,茫茫大海望不到边际。海面上波涛汹涌,几丈高的
浪头此起彼伏,象是要吞灭一切敢于到海上的东西。也许这里便是
路的尽头,面前的大海对一个凡人来说是不可逾越的。离岸不远处
漂着一只木筏 (mufa)

  〖 出口 〗:north、east 和 west
    [泊船] 目前没有任何船只停泊在此。
  光辉岁月领袖 没头脑(Waiwai) <正若有所思地坐在石条上>
  z 石条(shi tiao) <上面端坐着测试(seach),没头脑(waiwai)>
--------------------------------------------------------------------------

或许还有考虑不周的地方,但这是一个思路,虽然没什么大的技术含量,总的来说
是向生活化,真实化前进了一步吧。。。

后附(1):
inherit SIT_ITEM
--------------------------------------------------------------------------
/******************************************/
/* MUDLIB:Glory of Days Past 〓光辉岁月〓 */
/* Updated Admin By Waiwai@2003/04/09     */
/* Admin Email:[email]wkzstory@21cn.com[/email]         */
/******************************************/
// Created by waiwai@2004/01/16
// 游戏中床以及具有坐功能的物件继承文件

#include

inherit ITEM;

void init()
{
add_action("do_standup",({ "stand","standup" }));
add_action("do_sit",({ "sit","lies" }));
}

int do_sit(string arg)
{     
object me, env, obj;
int i, max;
string msg;

me=this_player();

if (me->query_temp("marks/sit"))
return notify_fail("你目前"+me->query_temp("sit/msg")+NOR"。n");

if( !arg )
return notify_fail(WHT"你要在什么上面歇息?n"NOR);

      if (! objectp(obj = present(arg, environment(me) )) || !obj)
return notify_fail(YEL"你要在什么上面歇息?n"NOR);

if( !obj->is_chair() && !obj->is_bed() )
return notify_fail(obj->name()+"目前不是可以歇息的物件!n");

if( obj->is_chair() ) msg= "坐";
if( obj->is_bed() ) msg= "躺";

      if( me->ride() )
return notify_fail("你要骑着坐骑"+msg+"在"+obj->name()+"?你确实有创意!n");
   
if((int)obj->query("sit_over_num") <=0) {
if(obj->query("sit_over"))
obj->delete("sit_over");

if(obj->query("sit_over_num"))
obj->delete("sit_over_num");
}

max = (int)obj->max_user();

if( !max || max<=1 ) max=1;

if( (int)obj->query("sit_over_num")>= max )
return notify_fail(obj->name()+"目前最多"+msg+"得下"+max+"个人,你没地"+msg+"了。n");
      
      if( me->is_busy() && userp(me) )
return notify_fail("你正忙着做其他事,没时间"+msg+"在"+obj->name()+"上!n");

me->set_temp("marks/sit", obj);

if( me->query("race") != "野兽" )
me->set_temp("sit/msg", WHT"正"+obj->query("sit_msg")+msg+"在"+obj->name()+WHT"上"NOR);
else
me->set_temp("sit/msg", WHT"正懒懒地趴在"+obj->name()+WHT"上"NOR);

obj->set("sit_over/"+log_id(me),1);
obj->add("sit_over_num",1);

if( me->query("race") != "野兽" ) {
if( obj->is_chair() )
message_vision("$N"+obj->query("sit_msg")+"坐在了"+obj->name()+"上。n",me);
else
message_vision("$N"+obj->query("sit_msg")+"往"+obj->name()+"上一躺。。。n",me);
} else
message_vision("$N跳到了"+obj->name()+"上。n",me);

if( userp(me) )
me->start_busy(1);

      return 1;
}

int do_standup(string arg)
{
object me, obj;

me=this_player();

      if( me->is_busy() && userp(me) )
return notify_fail("你正忙着做其他事,没时间起来!n");

obj = me->query_temp("marks/sit");

      if (!obj)
          return notify_fail("你本来就站着。n");
else {

obj->delete("sit_over/"+log_id(me));
obj->add("sit_over_num",-1);

if((int)obj->query("sit_over_num") <=0) {
if(obj->query("sit_over"))
obj->delete("sit_over");

if(obj->query("sit_over_num"))
obj->delete("sit_over_num");
}

if( me->query_temp("sit/msg") )
me->delete_temp("sit/msg");

if( me->query_temp("marks/sit") )
me->delete_temp("marks/sit");

if( me->query("race") != "野兽" )
message_vision("$N伸了个懒腰,从"+obj->name()+"上站了起来。n", me);
else
message_vision("$N伸了个懒腰,从"+obj->name()+"上跳了下来。n", me);

if( userp(me) )
me->start_busy(1);

}

return 1;
}

后附(2) 大炕物件
--------------------------------------------------------------------------
/******************************************/
/* MUDLIB:Glory of Days Past 〓光辉岁月〓 */
/* Updated Admin By Waiwai@2003/04/09     */
/* Admin Email:[email]wkzstory@21cn.com[/email]         */
/******************************************/
// Created by waiwai@2004/01/16

#include

inherit SIT_ITEM;

int is_bed() { return 1; }

int max_user() { return 10; }

void create()
{
set_name(RED"红砖大炕"NOR, ({ "da kang", "dakang", "kang" }) );
set_weight(300);
if( clonep() )
set_default_object(__FILE__);
else
{
set("no_get",1);
set("unit", "张");
set("long", name()+"可以躺(lies)得下"+max_user()+"个人,休息好了可以随时起床(standup)。n");
set("value", 1000000);
set("prep", "on");
set("material", "wood");
set("Fmaterial", "iron-nail");
}

set("sit_msg", "懒懒地");

setup();
}
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-4-25 01:28 PM , Processed in 0.008736 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表