作者laechan (小太保)
看板mud
标题[闲聊] 防具属性随机配置设定
时间Sat Oct 27 22:41:26 2012
首先,定义一个 mapping 资料
mapping attrib_data=([
"cri_rate" : "爆击机率提高 NUM%",
"cri_dam" : "爆击伤害提高 NUM%",
"hold_rate" : "击中有 NUM% 机率造成定身",
"time_cure" : "每秒回复 NUM 点生命值",
.
.
]);
那麽令 keys_attrib = keys(attrib_data),就取得
cri_rate、cri_dam、.... 等等的属性。
则当我们用像是「监定」这类的指令,去监定一件武
防时,一般来说有几点要决定..
一、这件武防,「哪些 attrib 不能给」。
例如说当我们判断到它是腰带类时,可能我们设
计是腰带没有爆率,那就做底下动作..
switch(type)
{
case "belt":
keys_attrib-=({"cri_rate"});
二、这件武防监定後要给几属
例如假设四属,然後机率性可以到六属、七属这
样,这个就依自己设定的风格来决定,假设得到
的值叫做 attrib_kind。
三、每一个属性的大小值配置
这个一般交给 switch 去做是最直觉的,例如
switch(attrib_name) ←──────────────────┐
{ │
// 爆率: 1.0%~10.0%, 实际值用 10~100 代表 │
// 而且是 10,15,20,25,.... 这样的值而已 │
case "cri_rate": │
r = 2 + random(19); // 产生出 2,3,4,..,20 的随机值 │
r = r * 5; // 产生出 10,15,20,...,100 的随机值 │
│
attrib[attrib_name]=r; │
│
那可以想像,其外包的回圈如下.. │
│
// 看几属 │
for(i=0;i<attrib_kind;i++) │
{ │
n=sizeof(keys_attrib); │
// 随机取得其中一属 │
attrib_name = keys_attrib[random(n)]; │
// 马上将 attrib_name 自 keys_attrib 扣掉 │
keys_attrib-= ({attrib_name}); │
│
switch(attrib_name) 接上面─→──────────────┘
{
.
.
四、最後将属性设进防具中
假设该防具为 object ob,而上面我们每跑一个 switch,
就会做 attrib[attrib_name] = r 的动作,因此最後就是
ob->set("attrib",attrib); 就行了。
最後,我们要观看设定结果,例如...
> view boots
慾望导航者
───────────────────
等级:63
护甲:334
型态:boots
售价:2257
属性:+76 力量
+40 智力
+51 毒素抗性
+55 全元素抗性
每秒回复 116 点生命值
爆击机率提高 3.5%
+12% 移动速度
───────────────────
在属性部份的程式码就可以这样写..
msgs=({});
keys_attrib = keys((mapping)ob->query("attrib"));
foreach(attrib_name in keys_attrib)
{
switch(attrib_name)
{
// 秒回
case "time_cure":
attrib_desc=attrib_data["time_cure"];
r=(int)ob->query("attrib/time_cure");
attrib_desc=substr(attrib_desc,"NUM",""+r);
msgs+=({attrib_desc});
break;
// 爆率, 10 = 1.0%, 35 = 3.5%, 以此类推
case "cri_rate":
attrib_desc=attrib_data["cri_rate"];
r = (int)ob->query("attrib/cri_rate");
attrib_desc=substr(attrib_desc,"NUM",""+(r/10)+"."+(r%10)+"%");
msgs+=({attrib_desc});
break;
.
.
}
}
// 到这里就会得到 msgs
msg+="属性:"+implode(msgs,"\n ")+"\n";
简单使用 implode 就可以显示出上面那一长串。
暗黑的设计则比上面多了几个特性
一、其属性的显示「有顺序性」
例如一定是 +力量、+智力 这些叙述先出现。这个只需
自己定义一个 sort_attrib 阵列就可以搞定。
二、多了镶洞的设定
但是这个一样可以使用 attrib_data 来实现,这里简单
讲解其中一种做法,例如 attrib_name 增加 "hole_1"
、"hole_2"、"hole_3" 这几种词。
则最先要做的,就是 hole_2 跑出的条件,一定是先有
hole_1、hole3 跑出的条件,一定是先有 hole_2。
再来,其「数值」一开始都是 0。0 就代表有洞,但是
没有插宝石。
然後 D3 有四种宝石,每种宝石假设有 10 种等级,也
就是说,我们就可以这样做
红宝石:代表数值 0~9
紫宝石:代表数值 10~19
黄宝石:代表数值 20~29
绿宝石:代表数值 30~39
这样就可以这样干
case "hole_1":
// 先取得数值
r = (int)ob->query("attrib/hole_1");
if(r==0)
msgs+=({"[○] 空的镶孔"});
else
{
switch(r/10)
{
case 0:
msgs+=({"[镶着"HIR"红宝石"NOR"] +"+(((r%10)+1)*4)+" 力量"}); break;
case 1:
msgs+=({"[镶着"HIM"紫宝石"NOR"] +"+(((r%10)+1)*4)+" 体质"}); break;
case 2:
msgs+=({"[镶着"YEL"黄宝石"NOR"] +"+(((r%10)+1)*4)+" 智力"}); break;
case 3:
msgs+=({"[镶着"HIG"绿宝石"NOR"] +"+(((r%10)+1)*4)+" 敏捷"}); break;
}
}
这样在检视防具时就会看到如下的东西
属性:+76 力量
+40 智力
[镶着
紫宝石] +40 体质
[○] 空的镶孔
而依防具或武器的不同部位,决定插宝石的效果的部份
则跟上面的做法大同小异,就是多个 switch 而已。
当然也可以在 attrib_data 里面这样定
"hole_1":"[镶着STONE] +NUM STAT",
这就代表要替换的目标就是 STONE、NUM 及 STAT,例如
以 35 这个数字来说,就各自代表「绿宝石」、「+24」
、「敏捷」这三个意义。
到这里,就可以完美模拟 D3 的「
稀有」等级以下的装备。
传奇及套装则是另外的系统支援的,那个就蛮复杂的就不在
这边讲哩。
(但是概念是类似的)
总之,先定义好适合自己 mud 的 attrib_data,然後就可以
透过简单的 for、random 及 switch 的搭配,去实现高随机
配置武防的属性种类、数量及数值。
而一般来说通常是透过「监定」这道程序来实现,它的好处就
是可以在「玩家取得未监定防具」到「监定完毕」之间的时间
设置防机设定,例如..
> identify unidentified-armor
*
*
*
****** * ***** *
* * * *
* * ***** * *
****** * * * *
* * * *****
* * *
****** *
请回答上面的数字:6151
"当─!"物品监定完成。
设计玩家在取得未监定装备後「一段时间内」必须将装备监定
完毕,否则装备将失效;然後再透过上述的防机设计,来避免
机器人监定的情况出现,就可以达到防机效果。
Laechan@Sanc
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 42.66.251.237 (10/27 22:47)
1F:推 pssjim:有看有推 10/28 08:26
2F:推 PiGFAcE:我们也是这样做, 哈哈, 大推原po 10/31 00:18
3F:→ PiGFAcE:只是下面6151的那个方法 , 有巫师提议过本想用来防挂机, 10/31 00:18
4F:→ PiGFAcE:可是我觉得凭空冒出Ansi文字实在有点破坏游戏的包装了 10/31 00:18
5F:→ PiGFAcE:所以还在想更好的方法 10/31 00:18
6F:→ PiGFAcE:推!! 10/31 00:19
7F:→ laechan:可以用「监定码」的方式,比方请输入该防具上的监定码 10/31 07:16
8F:→ laechan:我目前的设计是玩家到手防具後一定时间内要监定完毕,所以 10/31 07:17
9F:→ laechan:还有另一种做法就是玩家必须拿去给 npc 监定,然後在路途上 10/31 07:17
10F:→ laechan:可以设定某关卡需输入数字码, 或者找该npc监定时需先回答 10/31 07:18
11F:→ laechan:数字码,这种型式是以「不给玩家监定指令」为前提. 10/31 07:18
12F:推 bonix:要怎麽把L大的文章下载到电脑啊? 01/08 21:10
13F:→ bonix:我的LPC语言能力实在跟不上L大的课程,但这些将来又很有学习 01/08 21:11
14F:→ bonix:意义。现在想自己写MUD,好多创意都不得其门而入 ~"~ 01/08 21:12