北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 7111|回复: 9

关于一段学习他人招式的代码

[复制链接]
发表于 2013-8-21 13:23:34 | 显示全部楼层 |阅读模式
  1. //wuxiang-jian.c
  2. // Write By LSXK's System on 2013/8/20 星期二 18:34:02

  3. #include
  4. inherit SKILL;

  5. mixed* actions;
  6. mapping user;
  7. mapping *action = ({

  8. ([
  9. "action" : "$N使一招“相即无相”,手中$w随意挥舞,突然一剑朝$n刺去",
  10. "force" : 300,
  11. "dodge" : 0,
  12. "parry" : 50,
  13. "lvl" : 0,
  14. "damage" : 300,
  15. "skill_name" : "相即无相",
  16. "damage_type" : "刺伤"
  17. ]),
  18. });

  19. int valid_enable(string usage) { return usage == "parry" || usage == "sword"; }

  20. int practice_skill(object me)
  21. {
  22. if ((int)me->query("jingli") < 1000)
  23. return notify_fail("你的体力太低了。\n");
  24. if ((int)me->query("neili") < 1000)
  25. return notify_fail("你的内力不够练习该技能。\n");
  26. me->receive_damage("jingli", 100);
  27. me->add("neili", -100);
  28. return 1;
  29. }
  30. void add_actions(object me,mixed act){
  31. int i;
  32. string id = me->query("id");
  33. if(!intp(me->query("wuxiang")) || me->query("wuxiang")==0){
  34. user[id] = sizeof(user)+1;
  35. me->set("wuxiang",1);
  36. }
  37. i = sizeof(actions[user[id]]);
  38. actions[user[id]][i]= act;
  39. }
  40. string query_skill_name(int level)
  41. {
  42. int i;
  43. for(i = sizeof(action); i > 0; i--)
  44. if(level >= action[i-1]["lvl"])
  45. return action[i-1]["skill_name"];
  46. }

  47. mapping query_action(object me, object weapon)
  48. {
  49. int i;
  50. string id = me->query("id");
  51. if(sizeof(actions[user[id]])==0){
  52. for(i = sizeof(action); i > 0; i--)
  53. if(me->query("level") >= action[i-1]["lvl"])
  54. return action[random(i)];
  55. }
  56. i = sizeof(actions[user[id]]);
  57. return actions[user[id]][random(i)];
  58. }

  59. string perform_action_file(string action)
  60. {
  61. return __DIR__"wuxiang-jian/" + action;
  62. }
复制代码

  1. #include
  2. #include
  3. #define LEARN "「" MAG "无相之术" NOR "」"
  4. inherit F_SSERVER;
  5. int perform(object me, object target)
  6. {
  7.         string msg1;
  8.         string msg2;
  9.         mapping action;
  10.         string name;
  11.       if (! target || ! me->is_fighting(target))
  12.             return notify_fail(LEARN "只能对战斗中的对手使用。\n");
  13.         if(me->query_skill("wuxiang-jian",1)<200)
  14.                 return notify_fail("你的无相剑法运用的不是很娴熟,无法了解“无相”之意\n");
  15.         if(me->query_skill("martial-cognize",1)<200)
  16.                 return notify_fail("武学修养乃是武学之本,像你这般本末倒置,岂不怪哉?\n");
  17.         if(me->query("neili")<1000)
  18.                 return notify_fail("没有内力就是半个废人,废人就算习得高深的剑术又有何用?\n");
  19.         if(me->query_int()<40)
  20.                 return notify_fail("像你这般悟性奇低之人,又怎能习得高深剑术?\n");
  21.         if(me->query_con()<40)
  22.                 return notify_fail("根骨不够,纵使习得高深技巧,不得其运用之法,那不是等于无用?\n");
  23.         if(!objectp(me->query_temp("weapon")))
  24.             return notify_fail("你必须装备武器才能使用" LEARN "。\n");
  25.         if(!objectp(target->query_temp("weapon")))
  26.                 return notify_fail("你也真是有趣,你难道想用兵器学来拳脚功夫?\n");
  27.         msg1 = HIC "只见$N突然苦思冥想,对$n的攻击视而不见!\n"NOR
  28.                  HIR "$n见有机可乘,立即对$N发动了攻击!\n"NOR;
  29.         message_combatd(msg1, me, target);
  30.         COMBAT_D->do_attack(target,me,target->query_temp("weapon"),0);
  31.         msg2 = HIB "$N嘿嘿一笑,仿佛摸清了$n的来路,默默将其记载脑海中\n"
  32.                  HIR "$n被这一笑吓得毛骨悚然。\n"NOR;
  33.         message_combatd(msg2, me, target);
  34.         action = target->query_action();
  35.         me->set("wuxiang",1);
  36.         "/kungfu/skill/wuxiang-jian"->add_actions(me,action);
  37.         name=action->query("name");
  38.         tell_object(me,HIR"你成功习得对手的武功招式"+name+"!"NOR);
  39.         return 1;
  40. }
复制代码

大家帮我看看错在哪里好吗?错误显示:

执行时段错误:*Value being indexed is zero.
程式:/kungfu/skill/wuxiang-jian.c 第 57 行
物件:/kungfu/skill/wuxiang-jian
呼叫来自:/inherit/char/char.c 的 heart_beat() 第 180 行,物件: /clone/user/user#3784 ("修炼神功")
呼叫来自:/feature/attack.c 的 attack() 第 527 行,物件: /clone/user/user#3784 ("修炼神功")
呼叫来自:/adm/daemons/combatd.c 的 fight() 第 1707 行,物件: /adm/daemons/combatd
呼叫来自:/adm/daemons/combatd.c 的 do_attack() 第 576 行,物件: /adm/daemons/combatd
呼叫来自:/feature/attack.c 的 query_action() 第 429 行,物件: /clone/user/user#3784 ("修炼神功")
呼叫来自:() 第 0 行,物件: /clone/user/user#3784 ("修炼神功")
呼叫来自:/kungfu/skill/wuxiang-jian.c 的 query_action() 第 57 行,物件: /kungfu/skill/wuxiang-jian

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-21 13:57:46 | 显示全部楼层
me->query("")的返回值是什么类型?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-21 14:42:32 | 显示全部楼层
你说的是me->query("wuxiang")吗?那是我用来判断actions是否有此userid的记录的标识,在pfm使用过后就set其为1。因为不能直接判定==0,所以加了一个intp判断
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-21 14:42:55 | 显示全部楼层
貌似在pfm里不能把它设为1才对
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-21 17:41:24 | 显示全部楼层
要判断一下actions[user[id]]是否为空
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-21 17:58:44 | 显示全部楼层
求科普,怎么判断是否为空啊?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-21 17:59:01 | 显示全部楼层
用sizeof不行吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-21 21:47:08 | 显示全部楼层
sizeof(0)不行
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2013-8-22 02:08:15 | 显示全部楼层
arrayp()
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2013-8-22 09:47:17 | 显示全部楼层
哦,原来如此
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-4-18 10:09 AM , Processed in 0.011957 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表