newpro 发表于 2013-8-21 13:23:34

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

//wuxiang-jian.c
// Write By LSXK's System on 2013/8/20 星期二 18:34:02

#include <ansi.h>
inherit SKILL;

mixed* actions;
mapping user;
mapping *action = ({

([
"action" : "$N使一招“相即无相”,手中$w随意挥舞,突然一剑朝$n刺去",
"force" : 300,
"dodge" : 0,
"parry" : 50,
"lvl" : 0,
"damage" : 300,
"skill_name" : "相即无相",
"damage_type" : "刺伤"
]),
});

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

int practice_skill(object me)
{
if ((int)me->query("jingli") < 1000)
return notify_fail("你的体力太低了。\n");
if ((int)me->query("neili") < 1000)
return notify_fail("你的内力不够练习该技能。\n");
me->receive_damage("jingli", 100);
me->add("neili", -100);
return 1;
}
void add_actions(object me,mixed act){
int i;
string id = me->query("id");
if(!intp(me->query("wuxiang")) || me->query("wuxiang")==0){
user = sizeof(user)+1;
me->set("wuxiang",1);
}
i = sizeof(actions]);
actions]= act;
}
string query_skill_name(int level)
{
int i;
for(i = sizeof(action); i > 0; i--)
if(level >= action["lvl"])
return action["skill_name"];
}

mapping query_action(object me, object weapon)
{
int i;
string id = me->query("id");
if(sizeof(actions])==0){
for(i = sizeof(action); i > 0; i--)
if(me->query("level") >= action["lvl"])
return action;
}
i = sizeof(actions]);
return actions];
}

string perform_action_file(string action)
{
return __DIR__"wuxiang-jian/" + action;
}

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

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

执行时段错误:*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 ("修炼神功")
呼叫来自:<function> 的 <function>() 第 0 行,物件: /clone/user/user#3784 ("修炼神功")
呼叫来自:/kungfu/skill/wuxiang-jian.c 的 query_action() 第 57 行,物件: /kungfu/skill/wuxiang-jian

北大侠客行MUD,中国最好的MUD

pkuxfeng 发表于 2013-8-21 13:57:46

me->query("")的返回值是什么类型?

newpro 发表于 2013-8-21 14:42:32

你说的是me->query("wuxiang")吗?那是我用来判断actions是否有此userid的记录的标识,在pfm使用过后就set其为1。因为不能直接判定==0,所以加了一个intp判断

newpro 发表于 2013-8-21 14:42:55

貌似在pfm里不能把它设为1才对

zues 发表于 2013-8-21 17:41:24

要判断一下actions]是否为空

newpro 发表于 2013-8-21 17:58:44

求科普,怎么判断是否为空啊?

newpro 发表于 2013-8-21 17:59:01

用sizeof不行吗?

zues 发表于 2013-8-21 21:47:08

sizeof(0)不行

sunyc 发表于 2013-8-22 02:08:15

arrayp()

newpro 发表于 2013-8-22 09:47:17

哦,原来如此
页: [1]
查看完整版本: 关于一段学习他人招式的代码