求助:怎么获取skills中的factor?
mud吧
全部回复
仅看楼主
level 8
xiuliinlove 楼主
先上图:
图一:
图二:
图一中我怀疑那个damage_factor应该是忘了取值,而我猜想取值的对象就应该是图二的apply_factor。但我不知道取值的表达式应该怎么写。是damage_factor=action->query(apply_factor)、damage_factor=action["apply_factor"]或者别的其它什么代码?在改大唐双龙传的mudlib,别的自己可以一点点测试看效果,但这个真心不容易看出来自己胡乱猜测和改写的代码是否正确有效……
对mudlib代码懂得不多,连看带猜也只能弄明白一点皮毛,恳请大家帮忙指教,谢谢!
2014年08月19日 02点08分 1
level 8
xiuliinlove 楼主
貌似图被吃了??附上文字版代码:
图一的代码(主要看表情所在行的代码):
//计算攻击者将会造成的伤害:
int get_damage(object me,object victim,object weapon,mapping action,mapping apply_action,string skill_name)
{
int damage,skill_level,base_skill_level;
int damage_factor;[呵呵]
string base_skill;
int w_damage,w_min_damage,w_max_damage;
int w_strong;
int str_factor;
damage=0;
skill_level=0;
base_skill_level=0;
if(weapon&&weapon->query("max_strong")){
w_strong=weapon->query("strong");
if(w_strong<0) w_strong=0;
w_min_damage=me->query_temp("apply/min_damage")+me->query_temp("apply/enhance_min_damage")+
me->query_temp("apply/double_damage");
w_max_damage=me->query_temp("apply/damage")+me->query_temp("apply/enhance_max_damage")+
me->query_temp("apply/double_damage");
if(w_min_damage>w_max_damage)
w_min_damage=w_max_damage;
if(weapon->query("save_flag")&&userp(me))
damage=w_min_damage+random(w_max_damage-w_min_damage);
else
damage=w_max_damage;
damage=damage-damage*(weapon->query("max_strong")-w_strong)/weapon->query("max_strong");
if(userp(me)&&weapon->query("save_flag")&&
weapon->query("user")!=me->query("id"))
damage=damage/5;
else
damage +=weapon->query("user_skill")/10;
}
else
damage=me->query_temp("apply/damage");
if(me->query("jiali",1)&&me->query("force",1)>me->query("jiali",1)){
me->add("force",-(int)me->query("jiali",1));
if(!weapon)
damage +=(int)me->query("jiali",1)*5/3;
else
damage +=me->query("jiali")/2;
}
if(stringp(skill_name)
&&intp(SKILL_D(skill_name)->skill_damage(me,victim)))
damage +=SKILL_D(skill_name)->skill_damage(me,victim);
if(stringp(skill_name)){
if(weapon)
skill_level=(int)me->query_skill(skill_name,1);
else
skill_level=(int)me->query_skill(skill_name,1)*3/2;
if(stringp(base_skill=SKILL_D(skill_name)->query_base())){
if(base_skill!="base"){
base_skill_level=(int)me->query_skill(base_skill,1);
damage +=(skill_level+base_skill_level/2);
}
}
else
damage +=(skill_level);
}
str_factor = me->query_str();
damage = damage+(damage/4)*str_factor/20;
return damage+damage*damage_factor/40;[呵呵]
}
图二的代码:
mapping *action = ({
([ "action":"$N手中$w猛地一挥,剑走偏锋,朝$n的$l处刺去!",
"apply_factor": 4,
"name" : "沉沙剑法",
"damage_type":"刺伤",
]),
([ "action":"$N手腕一沉,剑锋下倾,划了弧线,刺向$n的$l!",
"apply_factor": 4,
"name" : "沉沙剑法",
"damage_type":"刺伤",
]),
([ "action":"$N剑走轻灵,虚刺数下,百虚之中突然一招刺向$n的$l!",
"apply_factor": 4,
"name" : "沉沙剑法",
"damage_type":"刺伤",
]),
([ "action":"$N真气灌注于$w之上,低哼一声,朝$n的$l刺去!",
"apply_factor": 4,
"name" : "沉沙剑法",
"damage_type":"刺伤",
]),
});
2014年08月19日 02点08分 2
level 5
mapping action;int damage_factor;
actions=me->query_action();
damage_factor=action["apply_fator"];
2014年08月19日 03点08分 3
非常感谢[大拇指]。有的点方向了。
2014年08月19日 03点08分
你好。我改好了,用你写的代码会报错没心跳。然后我尝试着写个damage_factor=action["apply_factor"];不报错了。但是,我不知道这个代码是否真的生效。请问,怎样在战斗时实时显示damage_factor的值以和skills中的apply_factor值对照?
2014年08月19日 16点08分
我在显示战斗和受伤信息的combat_msg后面加了个tell_object(me, "【测试精灵】:factor:"+damage_factor);但是引号和加号移来移去折腾了好久,要么直接报错没心跳,要么就是直接给我原样显示“damage_factor”而不是显示数值[不高兴]。求教怎样写代码能实时显示damage_factor的数值?
2014年08月19日 16点08分
回复 xiuliinlove :写法应该没错的,你要看下LOG是哪里错误。
2014年08月20日 01点08分
level 15
3楼第二行多打了个s。
至于战斗信息,起码写成
+ to_string(damage_factor)
或者用sprintf也行,int不能直接连string
2014年08月19日 16点08分 4
现在的mudos, 似乎 string a , int b, a = "aaa" + b, 也没问题
2014年08月20日 06点08分
战斗信息实在折腾的累了,无奈之际想了个笨方法验证了factor的有效性:把某个功夫改得只有一招,然后手动调节apply_factor对照damage_msg的显示来判断伤害是否改变……结果伤害是改变的,所以生效……
2014年08月20日 13点08分
level 13
想知道 apply_factor 到底有没有赋值, 直接搜一下在函数内是否还有出现过就行了
至于武功里面的 apply_factor 调用, 实际是
武功文件里面的 mapping *action -->
本文件的mapping query_action() 函数 -->
/feature/attack.c 的 mixed query_action(int flag) 函数
因此你可以使用 me->query_action() 获取到 武功文件的某一招式的 参数们
如: ([ "action":"$N手中$w猛地一挥,剑走偏锋,朝$n的$l处刺去!",
"apply_factor": 4,
"name" : "沉沙剑法",
"damage_type":"刺伤",
]),
普通武功招式的描述也是这么获取的, 你看看 combatd.c 的do_attack()里面
2014年08月20日 06点08分 5
我觉着你1楼贴的函数的传入参数 mapping action 很可疑. 你全代码搜一下 get_damage 这个函数的被调用例子
2014年08月20日 06点08分
你好。感觉主要是dtsl的mudlib有点另类。从别的mudlib移植的代码很少能生效- -至于生效问题我已经用笨方法验证了(请见4楼)。至于获取参数主要是代码里既有action=me->query_action()又有action=me->query("actions")还有actionp什么的,不知道具体怎么写和怎么组合。
2014年08月20日 13点08分
而且也不清楚取的结果是某个参数还是一堆参数。很多代码是照抄照搬+排列组合试出来的,对代码了解实在有限。只是觉得dtsl的系统构成比较符合我的心意,但细察之下错漏和bug太多,只能硬着头皮来一点一点修正,顺便进行下适当的改造。。。等搞好了也许可以请朋友帮忙架设一下。
2014年08月20日 13点08分
回复 xiuliinlove :不要从别的MUDLIB移植代码,因为设置都不一样的。除非你清楚原MUD的各种设置。慢慢研究下原MUD代码吧。
2014年08月20日 14点08分
1