作者laechan (挥泪斩马云)
看板mud
标题[闲聊] 关於武防精链的做法评估
时间Thu May 21 11:15:46 2020
灌个水。(真物理灌水,咕噜咕噜...
sanc 还没真正实装这个东西,想说来研究看看,或许打着打着,
sanc 那边就给它实装了也说不定。
在部份 mud,玩家资料档的 obj_data 栏位可以做如下储存:
obj_data ([
"/weapon/lodoos/sword1#123456":(["improve_lv":5, ...]),
.
.
])
也就是以物品的档名做为 key 值,後面接这个物品的额外储存资
料,当玩家 login 时,依照 key 值 clone_object 物品出来的
同时,再做以下的动作:
ob=clone_object(files);
foreach(str in keys(obj_data[files]))
ob->set(str,obj_data[files][str]);
例如把上述的 improve_lv 值 5 设定到该 clone_object 出来的
物品上面,再把该物品 move 到玩家身上。
这类关於额外储存的资料,需满足以下条件:
一、最少设定(储存)项目
二、最简设定(储存)原则
比方也有人是用 refine 做为精链的意思,我个人的评估思维是,
如果指令敲起来好敲(refine蛮好敲的),意思也有点儿到了,长度
没有很长....这里的长度指的是
refine_lv 精链等级
refine_stat 精链所提升的属性质
.
.
做为储存栏位来说看起来还 ok,那我多半就会用了。
那首先就 refine_lv 即精链等级来说,像 RO 可以精练到 1x 等
,而且是武器防具都可以,而且还有套装及插卡方面的设定,还会
有依精链值做额外属性加成的设定,因此我会一并考虑精链是否额
外储存 refine_stat 的问题。
我的思维是,假设做额外储存,那直觉上会有几个问题:
1.如果我改变精链规则,我很难去更动之前已被玩家精链的物品
2.若不存这个栏位,我怎麽解决载入时的 loading 问题
3.我将来要怎麽去统一管理这些已经被精链的物品的refine_stat
储存值
1 的部份就是说,比方我原先订 +1 就是该武防各属性 +5,那後来
我觉得 +5 太多了想改 +3 时,玩家之前已精链的东西我就得做额
外的处理(把那些 +5 改成 +3)。
而既然以後可能会有这个问题,那还不如在 loading 时就处理:
ob=clone_object(files);
foreach(str in keys(obj_data[files]))
{
ob->set(str,obj_data[files][str]);
switch(str)
{
case "refine_lv":
lv=obj_data[files][str];
ob->set("refine_stat",lv*5);
.
.
上面的意思就是说我只储存 refine_lv,而当玩家登入时,我再依该
物品的 refine_lv 值,来设定 refine_stat 的值是多少;玩家save
或是把该物品储放进仓库时,只存 refine_lv 不存 refine_stat,也
就是上述的最少设定(储存)项目,而上面的 switch..case.. 用来做
为额外的处理。
那麽 coding 常遇到的情况就是
当我们储存的项目越多时 就可以减少很多额外的处理
当我们储存的项目很少时 就需要很多其它额外的处理
例如我们只单存一个 refine_lv 时,就可以想见在很多地方都需要先
读取出这个值,然後再做额外的运算来得到其它我们想要的东西,例
如 refine_stat、refine_name、.... 等等。
通常根据均值定理,可得出一个适当的储存项目数量,使得储存的项
目不至於过多,且不会增加很多需做的额外处理。
但是根据经验,其实还有另一种做法,就是 RO 所采取的额外描述法
例如 RO 的蛇披,它的 Special DEX 部份是这麽说的
https://upload.8591.com.tw/ware/201905/1557133186868273AY.png
Dex+1
精链值+8时Dex+3
当精链值+9时MATK+1%
当精练值+12时ASPD+1,固定咏唱时间-7%
也就是说,玩家登入或从仓库拿出此物品时,只载入 refine_lv 的设
定值,但是当玩家做 wear 或 wield 时,才做以下的动作:
lv=ob->query("refine_lv");
switch(lv)
{
case 1..7: ob->add("stat/dex",1);
case 8 : ob->add("stat/dex",3);
.
.
}
而其它时候,比方玩家 view 该物品时,只会看到上面的「描述」,以
及该物品的精链值,既然玩家只有在做 wear 及 wield 时,该精链值才
会有作用,那自然只需在玩家 wear 及 wield 时做相关的处理就好。
我相信 RO 也是这样做的,所以它们才会规定物品在手持或穿戴时无法
精链,必须先脱下来才行。
因此理论上,只储存 refine_lv 值应该是可以的。
而这可以带来几个好处:
一、refine_lv 这个储存栏位的变动性不高,应该确定就是这个栏位,
连同精链指令也可以顺便定为 refine。
二、之後可以只先处理 wield/wear 指令,马上就能进行相关测试,例
如穿脱时的玩家属性变化、quit/login 时是否正常载入等。
三、再之後才是其它与观看该物品相关的指令,例如 inventory、look
、view、auc、.....等。
精链名称的部份,最直觉是以下的显示:
+0时: 罗德斯长剑(lodoos sword)
+9时:
+9罗德斯长剑(lodoos sword)
然後最优先考量是战斗时,是否希望+9出现:
你以手中的罗德斯长剑刺向小麻雀
你以手中的+9罗德斯长剑刺向小麻雀
看起来好像让 +9 出现也不错?当然这与各家 mud 风格有关且因人而
异。
其它的话问题就小一点,如果希望到处都能带 +9,那麽在载入时就做
处理是比较好的:
foreach(str in keys(obj_data[files]))
{
ob->set(str,obj_data[files][str]);
switch(str)
{
case "refine_lv":
lv=obj_data[files][str];
if(lv>0)
{
shorts=ob->query("short");
ob->set("short",sprintf(HIG"+%d"NOR"%-s",lv,shorts));
.
.
这样它就到处带 +9 时,那万一玩家将 +9 精链成 +10 呢,也很简单
因为它格式是固定的:
shorts=ob->query("short");
lv=ob->query("refine_lv");
shorts=replace_string(shorts,"+"+lv,"+"+(lv+1));
因为 +n 这个东西在物品的 short 只会出现在精链识别名称区块,平
常不可能有精链值为 0 的物品,其名称会带 +n 的,就容易做名称上
的取代。
有时间再打点别的回在下篇。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.33.66.104 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/mud/M.1590030949.A.FC2.html
※ 编辑: laechan (114.33.66.104 台湾), 05/21/2020 11:16:04
※ laechan:转录至看板 mud_sanc 05/21 11:16
※ 编辑: laechan (114.33.66.104 台湾), 05/21/2020 11:19:21
1F:推 tsetsethatha: 感谢发文 !! 05/21 12:20
2F:推 smmoon : 幻世的宝石系统也类似作法 clone_object() 05/22 09:44
每个 mud 有每个 mud 的风格,设定也因人而异,出发点都差不多,
过程则会在各种思维及考量下而迥异,但只要弄出来的东西都是可以
work 的就行了,特别是2020的现在,随便弄一台server功能都数倍
於以前,目前比较不需要考量很多(我主要是已经习惯了)。
※ 编辑: laechan (114.33.66.104 台湾), 05/22/2020 10:53:54
3F:推 dontpkme : 感谢分享思路 05/22 15:38
4F:→ taily : 我那边是 int wear(){ if( ::wear() ){ .... 05/22 17:51
5F:→ taily : 我写过精练,是属於你外部储存,如果要修改已经精练的 05/22 18:03
6F:→ taily : 再read_file()单一档案,取代refine_state对我较简单 05/22 18:05