mud 板


LINE

看板 mud  RSS
这个是我最近接触音游後(6/2 起),觉得可以写进 mud 的东西。 它的 demo 类似底下影片 https://www.youtube.com/watch?v=5zYmrBORZKs
以 mud 来说,就类似在一座城镇里头,的某一个房间,里面会看 到两只 npc 在做交谈的动作,我的想法是: 道具店 这里是位於城镇中心,喷水池广场旁的的一间小小的道具店, 里头贩售着一些好用的东西,可以来看看喔(list)。 明显出口有: south. (listen)两位村民正在这里交谈着。 > 我希望玩家看到这样的画面,会想下 listen 指令,下了之後, 会看到如下的画面呈现 > listen 冒险者A: 听说这里有卖小镇地图,我们进去看看好不好 冒险者B: 有需要买吗, 你不是早就把地图都背下来了? 冒险者A: 就买来研究看看咩,说不定会发现什麽隐藏入口 冒险者B: 厚~ 有那种东西的话早就一传十、十传百了 冒险者A: 不管, 我就是要买......什麽! 一张地图要5000!? 冒险者B: 你今天才知道喔? =.= [ 你获得了 0.1% 的经验值。 ] 那上面要怎麽写呢? 首先,跟道具店这样的房间有关的对话,假设都储存在一个叫 grocery.o 的物件储存档内,那麽它的格式就类似底下 mapping talks=([ "一个适当的key名":@LONG 冒险者A: 听说这里有卖小镇地图,我们进去看看好不好 冒险者B: 有需要买吗, 你不是早就把地图都背下来了? 冒险者A: 就买来研究看看咩,说不定会发现什麽隐藏入口 冒险者B: 厚~ 有那种东西的话早就一传十、十传百了 冒险者A: 不管, 我就是要买......什麽! 一张地图要5000!? 冒险者B: 你今天才知道喔? =.= LONG , . . ]); (资料不是透过宣告建立的,真正只有一行宣告 mapping talks) 之所以使用 mapping 而不使用 array,是因为这样要做对话资 料的指定动作(比方删除),会比较方便而且精确。 我目前是以 time() 的字串( ""+time() )当 key 名,当我这样 做的时候,在 mud 内透过指令去编辑对话资料,按 . 储存时, 就能以储存当下的 ""+time() 做为 key 名,甚少会发生 key名 重覆的情况,还能依 key 名看出建立的时间。 从这里来逆推,建资料的指令可以这样写 > listen -log grocery 请开始编辑, 按 ~q 离开, 按 . 结束 =================================================== 後面指定 grocery,它就会将编好的东西假设叫 talk_str: if(ob=find_object(TALK_DIR+"grocery")) ob->log_talks(talk_str); 而 log_talks 的函数大致长这样 int log_talks(string str) { string times=""+time(); // 如果真的有重覆 key 就不储存 if(!undefinedp(talks[times])) return 1; talks[times]=str; save_object(TALK_DIR+"grocery"); return 1; } 这样就能储存对话资料。 那现在假设我们储存了很多笔 grocery 这类房间可以用的对话 ,那很自然的会写提取对话的指令,其提取到的对话是随机的, 那可以这样写 // user = 下指令的玩家 void listen_talks(object user) { int r,s; mixed tmps=({}); if(!user) return 1; tmps=keys(talks); s=sizeof(tmps); r=random(s); // 依分行符号 \n 将字串拆成阵列 tmps tmps=explode(talks[tmps[r]],"\n"); call_out("dump_talks",1,user,tmps,0,s); return ; } void dump_talks(object user,mixed tmps,int i,int s) { if(!env) return ; tell_object(user,tmps[i]); i=i+1; if(i>s) // 代表对话结束 { i=user->query("exp_up"); user->add_exp(i/1000); // 0.1% tell_object(user,HIW"[ 你获得了 0.1% 的经验值. ]"NOR"\n"); return ; } // loop call_out call_out("dump_talks",1,env,tmps,i,s); return ; } 以上是这东西的简单写法,给 sanc 用的部份我已经写得差不多 了,预计八月就会正式实装,只是我不是用 call_out,而是用 我以前提过的 times_check 系统,就是用 heart_beat 心跳的 方式。 各家写法不同很正常,这没有说一定要怎麽写。 sanc 的 listen 指令实际说明长底下这样 listen 指令语法: ============================================================ listen -export 房间档->资料档的指向列表 listen -add 房间档 = 资料档 设定房间档指向特定资料档 listen -del 房间档 删除房间档的指向设定 listen -check 房间档or资料档 列出资料指向设定状况 listen -log 资料档 储存某一资料档的对话资料 listen -here 资料档 储存某一资料档的此地限定对话 listen -clean 资料档 编号 清除某一资料档的对话资料 listen -list 资料档 列出某一资料档的对话资料 ============================================================ 上面都是给 wiz 使用的指令格式,玩家则只要下 listen 即可。 顺便藉这个例子来说明,我想大家都同意,要把看到的什麽 东西,写进 mud 里头,对於像我这种程度的 mud coder 来 说并不难,这样的人很多。 但是对 coder 来说我觉得最头痛的还是内容的扩充、扩充到 一定程度後的资料管理(增删改)、以及後续如何不间断地再 扩充其内容、.. 内容才是重点。 我个人是先玩了音游,然後觉得这东西可以写进 sanc 里面 ,然後多年经验下来,我第一优先思考的就是: 我有没有能力及时间,建立足够的资料量? 之後,我觉得我应该有能力及时间,那接着,我才开始写这 个系统,包括储存用物件、listen 指令等。 反之,如果我觉得我没有这个能力,或是没有这个时间,那 我就不会去写,因为写了也没意义,它能 work 但是内容会 很贫乏。 那我评估「我可以」的其中一个依据,是网路上能找到很多 东西,基於 sanc 的开放性风格,很多找到的东西都能拿来 用,所以我预期资料量是不会太低的...大概。 然後我的想法是,只要对话是有内容的,那对话本身就不是 重点了,玩家固然会听看看对话在说些啥,但重点仍会放在 听完对话後能取得的东西上面,也就是说,只要先确保对话 是有内容的,然後这时对话就变成只是一个过程了,讲白一 点今天就是要送玩家 0.1% 经验值,但总是要透过一些机制 来给予,才会比较像是在玩游戏。 那,可以将这种东西的游戏性设计到什麽程度呢? 比方,我可以在一百则对话里面,穿插一则重要的情报,例 如这座小镇真的有一个隐藏出口存在,则玩家如果幸运地听 到这则对话,他就有机会发现到这个隐藏出口。 (因为对话基本上是随机的,不过,这同样是各家写法) 我想说的就是,搜集资料、消化资料(才能变成可用的东西) 、思考资料(夏天很容易想到脑袋发烧发热)、....这些是很 烦人的,反过来说,这种事有其它人做,并且将我要的东西 依我要的格式(这里的格式指的是"至少要对话六句"这种)提 供给我时,要建多少资料、或是要让资料做怎样的呈现,都 不会是问题。 分工的重要性,就在这个地方,最好 coder 跟非 coder 角 色要分开,各司其职。 校长兼撞钟,开发效率一定差。 补充一下,除了 loop callout,还有另一种也算常见的写法 for(i=1;i<=s;i++) call_out("dump_talks",user,i,tmps[i-1]); 一次做 n 个 call_out 让它们前後都差 1 秒的时间。 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.33.66.104 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/mud/M.1564222568.A.272.html ※ 编辑: laechan (114.33.66.104 台湾), 07/27/2019 18:29:55
1F:推 bonix : 好文~ 推一个! 1.34.62.104 07/28 00:03
2F:推 LeaderKing : 赞,我也是看到什麽idea就会想实装 223.139.40.244 07/29 10:24
3F:推 farmerlu : 推! 140.112.30.37 07/29 19:08







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:iOS站内搜寻

TOP