显示标签为“MUD”的博文。显示所有博文
显示标签为“MUD”的博文。显示所有博文

2009年1月3日星期六

一个skill的招式资料中,各值的意义

作者:三界神话

// 注:一切只是依据 combatd.c 所作出的解释。
// 如仍有其他的公用的、必要的程序会用到这些设置,
// 那么这里所说的一切解释皆有可能不正确。

// 以奈何单机内现行的华山剑法第一式为例。


([ "action":"$N一招「白云出岫」,剑势灵动轻盈,手中$w点向$n的$l",
"force" : 150,
"dodge" : 5,
"parry" : 5,
"damage": 15,
"lvl" : 0,
"skill_name" : "白云出岫",
"damage_type": "刺伤"
]),

([

"skill_name" : "白云出岫",
// 招式名


"lvl" : 0,
// 技能在多少等级或以上时,能出这一招


"action":"$N一招「白云出岫」,剑势灵动轻盈,手中$w点向$n的$l",
// 描述。描述要遵循一个规则,就是只有前部分,没有后果,
// 后果还要经过判断才知晓。
// $N, 攻击者 $n,被攻击者,$w,兵器,$l,攻击部位


"force" : 150,
// 仅在攻击成功时,这个会给伤害力加成……整十数有效。
// 但是很多 skill file 里,总会见到一些非整十的设置,例如 125,意义是?……
// 公式如下:
// if( !objectp(weapon) )
// damage_bonus += action["force"] /10 * (damage_bonus / 100);
// else damage_bonus += action["force"] /10 * (damage_bonus/300);
// 意思是如果是空手打,加成大很多
// damage_bonus 最初值是攻击者的后天膂力,即 query_str()
// damage_bonus 好象乱78糟的,一时间也看不了那么多
// 暂时不理它
// 不过我怀疑……如果是后天膂力低,并且用的又不是空手时,damage_bonus 怎么加
// 也很难加到 300,一算,即使这里设置 10000000,结果还是0,搞什么啊


"dodge" : 5,
// 这个是有好处的,在 combatd.c 的 do_attack() 里,
// 判断攻防成功率之前,给 me 设置了一个 set_temp("fight/dodge"
//
// fight/dodge 将在计算躲闪概率的时候有加成,整十数有效。
// 当技能等级越高时,它的加成将会越高。
// 而在某些 code 里见到一些 5,8,12,15等,还有设置为 -0 的,
// 要么就是他们写 code 时根本不了解参数含义,要么就是还有别的用途,
// 暂时不理会罢。
//
// 就 combatd.c 来说,这个值的设置非常的有用。object 在发出一个招式
// 进攻后,以这个值的多少,可以设定其随后一次防御时的成功率加大或是降低。
// 例如某招式设置了 action["dodge"] = 100, 那么自然的,这一招过后,
// object 的躲闪概率就会加大一些。而设置了 -100 时,就会降低了。
// 有了这个值,招式是否“拼命”,就能够体现出来了。值得注意的是,
// 当一个新的招式发出时(即再次调用 do_attack() 时),它将被重新
// 设置一次。如果新招式资料里无 "dodge",将被设置为 0。
//
// 附:skill 等级低时,似乎其变化要十分的大,才能见到更显眼的效果。
// 一些CODE里的各招式有 5,8,12,15 的递增,就此看来,似乎是该 wiz 的
// 一厢情愿而已,实际可以说是没什么效果变化的。
// 此值具体变化未测试亦无法精确测试,无建议值。


"parry" : 5,
// 这个又是??……这个值的原意大概是和 dodge 一样,
// 不同的是,它是计算 防御概率 的,而 dodge 是 躲闪概率 的。
// 问题是! 整个 combatd.c 里也没见到哪里有应用到它,所以?……


// 注:dodge 和 parry 有的招式没有而 force, damage 就好象个个有。
// 另外还有一个影响非常大的 query_tmep( "apply/speed" ) 值是与
// combat 相关的,后面再说。


"damage_type": "割伤",
// 伤害类型,一般的剑法都是 “刺伤”和“割伤”


"post_action": (: call_other, "/adm/daemons/weapond.c", "bash_weapon" ,
// 特别的附加效果,可以用 call_other 方式调用其他文件的函数,亦可以
// 直接使用如: "post_action" : (: special_func ,
// 的方式来调用本文件内的函数。该函数将被默认传入4个参数,分别是:
// object me(攻击者), object victim(攻击目标), object weapon(兵器) 和 int damage(伤害力)
// 例子里的函数是有机会把对手的兵器搞断或脱手的。
// 在 combatd.c 的 do_attack() 里,每进行一回进攻,无论被躲闪、被防御
// 或是成功击中,都会在 attack 结束后,调用这个附加的函数一次。


"damage": 15,
// 伤害力,整十有效,这里是 combatd.c 的公式
// damage += action["damage"] /10 * (damage / 30);
// 那这个 15 岂非白痴行为,会误导我的,5555555
// 附:
// ##############################################################
// damage 处理全过程:
// 1, damage = me->query_temp("apply/damage"
// 即临时攻击力。此值一般是武器的攻击力,又或者是 pfm 时被
// 临时增加的攻击力。
//
// 2, damage = (damage + random(damage)) / 2;
// 好,这里有个随机!!!此时最少 damage 需要 2,否则将会
// 得到 0 的结果。
//
// 2-1, damage += (me->query_temp("apply/attack"+1) /10 * (damage /10);
// 这是 NPC 的加成,玩家跳过这一步。
//
// 3, damage += action["damage"] /10 * (damage / 30);
// 注意!!!!!!这里的情况是,如果剑招(即本文件设置的值)
// damage <>query_skill(attack_skill)+1)/10 * (damage /10);
// 好,开始进行 skill level 加成了,以下情况不加成:
// 1 -- skill level 为9或以下时,无加成
// 2 -- 之前的几步统计下来, damage < damage_bonus =" me-">query_str();
// 然后,开始计算 "damage_bonus",这个值初始是后天膂力
//
// 6, 如果有 加力,将执行一个 mixed 型的函数,damage_bonus 将
// 会在该函数的返回值中,可能得到加成。这要视各 skill 而定,
// 各 skill 可以 mixed hit_ob() 函数返回一个 int ,或返回
// 一个带有 ["damage"] 的 mapping ,来达到更改 damage_bonus
// 的效果。
// 加成时,若是无兵器的招式,damage_bonus 将直接加入该值,
// 如有兵器,则只加上 1/3 .
//
// 7, 如果招式里定义了 "force" ----- 就是这个文件里的 action["force"] 啦
// 那么来点加成。不过,如果 force<10>query_skill(attack_skill)/4
// + me->query_skill("force"/2+1)/10* (damage_bonus /10);
// else damage_bonus += (me->query_skill(attack_skill)/4+1) /10* (damage_bonus /10);
// 意思是,空手攻击时,加成为:
// ("攻击skill的等级" 的 1/4) + (内功等级的约 1/20 * damage_bonus 的 1/10)
// 那么说,一个 100 lv 的 skill, 内功即使为 0, 这里也可以得到 25 点的加成
// 但是如果是兵器类的 skill, 就只能得到几点的加成,如 100 lv sks, 甚至可能得到
// 两三点的加成而已,反差巨大。
//
// 9, 接下来看兵器里有没有特殊的加成。将调用兵器文件中的 hit_ob()
// 函数,该函数若返回一个 int, 则直接加入这个值到 damage_bonus 中。
//
// 10, 接着看看 加劲 的加成。简易公式如下:
// foo = my["jingli"]/20 + my["jiajin"] - your["jingli"]/25;
// 当 foo > 0 时,直接加入 damage_bonus 中。
// 例如我的精力 1000,对手精力2000,那么就是:
// 50 + 最大加劲二十分之一即50 - 对手的精力/25即80 == 20 点
//
// 11, 如果攻击模式是 "快速攻击",攻击力减半
//
// 12, 将 damage 与 damage_bonus 组合起来。这时将进行一个
// 计算,最多时可以得到全部的 damage_bonus ,最少时可以得到
// 一半的 damage_bonus.
// 而如果 damage_bonus 的值为负的话,同理, damage 减去同样
// 随机范围的 damage_bonus 值。
//
// 此时进行一个强制判断,以保证组合后的 damage 值最小为 0。
//
// 13, 进行一个循环!以彼此的 combat_exp 作判断:
// 取一个 random(攻击者的exp), 如果比 被攻击者的 exp 大,
// 那么 damage 削减为原来的三分之二(2/3),并将作判断的 "攻击
// 者的exp" 值降半,重新循环
//
// 14, 这里是一个呕吐级的判断,如果被攻击者身穿特别的防具(该防具文件
// 内以mixed is_special() 函数返回任意非零值即可),那么,调用其
// 文件的 mixed hit_ob() 函数,若此函数返回 int 或 mapping 型
// 的值,damage 将直接赋予该值(int or mapping["damage"])。
// 此时,前面所做一切均告作废,yeah,真是高章,高,实在是高
//
// 15, 此时再作一个判断,如果被攻击者身备(jifa)特别的轻功(该轻功
// 文件内以 mixed is_special() 函数返回任意非零值即可),那么,
// 原理同 14 ,也是让前面所做一切均告无效的一个步骤, yeah
//
//
// 到了这时,终于得到 damage 的最终值了!但是很郁闷的是,
// 它不作是否非0的判断,就直接对对手进行伤害,系统偶尔会
// 报出 “攻击力为负”的 bug, 大概是 special armor 或
// special dodge 造成的吧。
//
// 接下来就暂时不关 damage 的事喽。
// ##############################################################


]),


// 以上是一个 skill 招式的基本资料。

// 还有另一个特别的设置 "weapon", 该设置直接影响:
// 在攻击时,如果被防御(并非“被闪躲”和“命中”)时,
// 若招式里有这个值,对方防御成功的几率减半。
// 这个值好象未在其他地方有应用,而有的 skill file 里曾见到
// 招式里设置了例如 "weapon": "剑芒", 等,不知道是否有特别的含义。


// 再附: combatd.c 进行攻击流程时,有几个设在 object me 身上的值
// 是相当的有影响的,它们分别是:
// me->query_temp("apply/speed" ---- 与攻击频率成正比,但亦与被快速反击的几率成正比
// me->query_temp("apply/damage" ---- 直接影响攻击的强度
// me->query_temp("apply/armor" ---- 直接影响受打击的程度
// me->query_temp("apply/dodge" ---- ?......

// 这几个值, combatd.c 都不会去改变它们,所以要体现其他的一些效果,
// 必须另行设置;并且,需要非常小心避免出现无限累积的 BUG !

其实 skill 还可以写得更精彩,而不仅仅是 damage 和描述的变化而已。配合上 "dodge", 配合上 query_parry_msg(), 配合上 hit_ob(), 配合上 "post_action", ……真的是每一招都可以有不同的变化,根据描述所决定的效果之多,唉。只有想不到的,没有写不成的……

可是很多,很多,很多的 skill 中,特别的只是 pfm; 或者进一步,在 query_action() 里有一些变化(配合 pfm 或特别的武器使用该skill);或者再进一步,在 hit_ob()里体现一些特别的效果——但是,有哪个 skill ,能在每一招每一式之间,都有着不同的效果么?

例如我出了一招“腾空而起”的招式,那么除了这一招应该攻击力大一些之外,而很多wiz没有理会的是,在这之后的一定时间里,攻击频率就该低一些?这一招失败时被反击的几率是否就该大一些?被反击命中时,受到的损害是否就该大一些?……

噢……

2008年12月31日星期三

zmud指令

zmud内键指令详解

2007-05-01 18:36 来源: tymud.com 网友评论 0 条 浏览次数 0

格式: #abort
描述: 终止此指令之后的命令。
举例:get all from corpse;#abort;get silver from corpse

格式:#action 触发器 命令 类名
描述:当mud返回信息与触发器匹配时指令命令。
举例:#action {看起来钟四嫂想杀死你} {#beep;kill zhong} killnpc

格式:#add 变量名 表达式
描述:把一个表达式的结果与变量相加后赋给变量,如果类型是字串则添加到变量尾。
举例:#add golds 10 (注---gold是存储黄金数量的变量名)

格式:#alias 快捷命令名 命令
描述:用一个简单的命令名替代一个复杂命令。
举例:#alias kk {kick npc;kill npc}

格式:#alarm 时间匹配 命令
描述:当mud时间或系统时间到某一特定值时执行命令。
举例:#alarm -30:00 {save} #alarm 3:00:00 {say "为什么还不休息?明天要工作呢!"}

格式: #all 命令
描述: 所有窗口同时执行命令。
举例: #all save

格式: #backup
描述: 从路径记录中删除最后一步,并返回上一步位置。
举例: #backup

格式: #beep 表达式
描述: 鸣笛声。
举例: #beep #beep 16 (播放windows事件16的声音)

格式: #button 表达式 字串
描述: 激活按钮,相当于点击按钮。表达式为按钮序号,字串为按钮的显示。
举例: #button 1

格式: #c+ (#c-)
描述: 捕获(停止捕获)mud输出到一个zmud editor窗口。
举例: #c+ temp #c- temp (zmud editor窗口名为temp)

格式: #case 表达式 命令1 命令2 命令3 ....
描述: 根据表达式的值分情况执行命令。表达式为1,执行命令1,依次类推。
举例: #case 1 {save} {quit} #case %random {xixi} {hi} {smile}

格式: #capture 表达式 窗口名
描述: 类似#c+ #c-
举例: #capture

格式: #character
描述: 把当前角色的名字送给mud
举例: #character

格式: #close 文件号
描述: 关闭一个文件。
举例: #close 1 #close tell (关闭窗口名为tell的窗口)

格式: #class 字串 表达式
描述: 设置类的状态。
举例: #class automapper 1 (打开automapper类) #class (查阅所有类的状态)

格式:#clr
描述:清屏。
举例:#clr

格式:#color 色彩 触发器
描述:改变文本色彩或设置一个色彩机器人。
举例:#color red {tells the group}

格式:#connect
描述:重新连接。
举例:#connect

格式: #cr
描述: 送一个空行给mud,相当于换行。
举例: #cr

格式: #cw 色彩
描述: 设置机器人触发器的色彩。
举例: #trigger {闲聊} {#cw red}

格式:#dde 字串 字串 字串
描述:把一个dde宏送给dde服务。(dde 动态数据交换)
举例:#DDE NETSCAPE WWW_OpenURL {http://pobox.com/~~zugg/zmud.html}

格式: #debug 文件名
描述: 切换调试状态。
举例: #debug temp

格式:#default literal
描述:把所有特殊角色设为缺省,当前值被存储到堆栈。原值可用#nodef恢复。
举例:#default

格式:#disconnect
描述:断开当前连接。
举例:#trigger {看起来(%x)想杀死你} {halt;#disconnect}

格式:#dump
描述:存储参数。
举例:#dump

格式:#echo 字串
描述:回显字串到zmud 窗口。
举例:#echo xixi

格式:#earse 文件名
描述:从当前目录或磁盘删除一个文件。
举例:#earse temp.tmp

格式:#evaluate 表达式
描述:回显表达式的值。
举例:#evaluate 100/4

格式:#execute 命令
描述:执行一个命令。
举例:#execute hp

格式:#file 文件号 文件名
描述:打开一个文件。
举例:#file 1 test.txt

格式:#find
描述:在地图中定位当前位置。
举例:#find

格式:#forall 字串 命令
描述:循环执行列表中命令。
举例:list=word|ring|shield #FORALL @list {repair %i}

格式:#freeze 表达式
描述:冻结屏幕。
举例:#freeze 1 #freeze

格式:#function name literal
描述:保存变量的功能定义。
举例:#FU fact {%if(%1<=1,1,%1*@fact(%eval(%1-1)))}
   #EVAL @fact(5) #SHOW @fact(5)

格式:#gag 触发器
描述:从机器人触发器中删除行。
举例:#trigger {chat} {#gag 2}

格式:#help literal
描述:从命令行中得到帮助。
举例:#help alias

格式:#h+ (#h-)
描述:从命令历史记录表中提取下(上)一个命令。
举例:#h+ #h-

格式:#highlight 触发器
描述:高亮度显示触发器
举例:#highlight xixi

格式:#history 表达式
描述:提取命令历史记录表中第几个命令。
举例:#history 3

格式:#host
描述:显示当前mud主机的名字。
举例:#host

格式:#if 布尔式 命令1 命令2
描述:如果布尔式为真则执行命令1,否则执行命令2。
举例:#if @gold<1000 {say 玫儿姐姐好} {say 玫儿姐姐不好}

格式:#ignore 类名
描述:切换机器人开关。
举例:#ignore

格式:#input
描述:把特殊文本放入命令行中。
举例:#input hp

格式:#key 键名 命令
描述:定义宏键。
举例:#key F1 eat ya #key he jiudai

格式:#killall
描述:删除所有zmud定义。(包括alias,trigger等)
举例:#killall

格式:#log 文件名
描述:打开log文件,或设置log开关状态。
举例:#log #log xxx.txt

格式:#read 文件名 表达式
描述:读取执行一个文件脚本,或读取文件记录。
举例:#read xxx.txt 10

格式:#loop 范围 命令
描述:循环执行命令。
举例:#loop 3 north

格式:#mark
描述:开始记录路径。
举例:#mark

格式:#math 变量名 表达式
描述:运算表达式,结果赋给变量。
举例:#math x 13-5

格式:#media 命令
描述:送一个命令给多媒体设备。
举例:#media next (播放下一音轨)

格式:#memory
描述:显示剩余内存。
举例:#memory

格式:#menu 字串
描述:执行菜单中的命令。
举例:#MENU {FILE|OPEN}

格式:#mess 字串
描述:在另一窗口中显示信息。
举例:#mess 警告

格式:#name 字串
描述:改变当前任务的名字。
举例:#name zmud

格式:#noop
描述:空指令。
举例:#noop

格式:#nodef
描述:参考#default。
举例:#nodeg

格式:#ok
描述:路径定义成功。
举例:#ok

格式:#path 路径名
描述:路径保存。
举例:#path xxx

格式:#pick 命令1 命令2 命令3
描述:选择执行命令。
举例:#pick {save} {quit} {xixi}

格式:#play 文件名
描述:播放多媒体文件。
举例:#play xxx.mid

格式:#prompt 变量名 字串 字串
描述:用户输入变量值
举例:#prompt xxx

格式:#pw
描述:把你的密码送给mud
举例:#pw

格式:#retrace 路径名
描述:跟踪路径。
举例:#retrace xxx

格式:#record
描述:记录命令组到快捷方式中(alias)
举例:#record xxx


格式:#load 文件名 .mud
描述:装载存盘文件。
举例: #load xxx.mud

格式:#rename 名字1 名字2
描述:更改变量快捷机器人名字。
举例:#rename xxx xxx1

格式:#reset 文件号
描述:初始化文件。
举例:#reset 1

格式:#say 字串
描述:在zmud窗口显示字串,不送到mud
举例:say xixi

格式:#save 文件名
描述:存储当前设置到一个mud文件。
举例:#save xxx.mud

格式:#scroll 触发器
描述:显示触发的字串。
举例:#scroll 你 3

格式:#send 文件名 字串
描述:发送文件中所有与字串吻合的到mud optionally prefixed
举例:#send xxx.txt xixi

格式:#session 字串 表达式
描述:打开一个新的任务。
举例:#session 10.89.64.4 6666

格式:#show 字串
描述:回显字串。
举例:#show xixi

格式:#slow 路径名
描述:慢速行走。
举例:#slow xxx

格式:#status literal
描述:显示定义状态窗口。
举例:#Status {Gold: @gold Tank: @tank}

格式:#step 路径名
描述:单步行走。
举例:#step xxx

格式:#stop
描述:停止慢速行走。
举例:#stop

格式:#stwin literal
描述:显示定义状态窗口。
举例:#Stwin {Gold: @gold Tank: @tank}

格式:#Substitute 触发器
描述:Substitute文本。
举例:#TRIGGER {(*) tells you,} {#SUB {%1:}}

格式:#t+ (#t-) 类名
描述:打开(关闭)机器人
举例:#t+ xxx #t- xxx

格式:#t?
描述:显示异步时钟的秒数。
举例:#?

格式:#tab 命令名
描述:设置自动填充命令。
举例:#tab abcded (使用时按'a'后按下'tab'键)

格式:#timer 表达式 字串 表达式
描述:设置异步时钟。
举例:#timer

格式:#trigger 触发器 命令组 类名
描述:生成机器人。
举例:#Trigger {^Username:} {#CH}

格式:#tset 表达式
描述:设置异步时钟秒数。
举例:#tset 20

格式:#type 文件名 触发器
描述:显示文件。
举例:#type xxx.txt

格式:#tzro
描述:tick timer置0。
举例:#tzero

格式:#until 布尔式 命令
描述:执行命令直到布尔式为真。
举例:#until (@x=1) {hp}

格式:#unalias 名字
描述:删除alias。
举例:#unalias xxx

格式:#unkey 名字
描述:删除key。
举例:#unkey xxx

格式:#untrigger 名字
描述:删除trigger。
举例:#untrigger xxx

格式:#unvar 名字
描述:删除variable。
举例:#unvar xxx

格式:#url 字串
描述:用浏览器打开该网页。
举例:#url http://meir.126.com

格式:#variable 变量名 表达式
描述:变量赋值。
举例:#var x 111-89

格式:#version
描述:显示zmud版本。
举例:#version

格式:#wait 表达式
描述:延迟。
举例:#wait 2000

格式:#while 布尔式 命令
描述:当布尔式为真执行命令。
举例:#while (@x<1) {hp}

格式:#write 文件号 字串 表达式
描述:向文件写一个记录
举例:#WRI 6 {this is record 3} 3

格式:#yesno 字串 字串 字串
描述:生成问题确认对话框。
举例:#YESNO where to you want to go today??{Temple:.temple} {Guild:.guild} {Microsoft:#URL http://www.microsoft.com}