作者laechan (小太保)
看板mud_sanc
标题Re: [wizs] 问题请教(二十三)
时间Sun Jun 12 07:28:59 2011
※ 引述《amosdeus (幽素)》之铭言:
: int i,r,j,l,time;
: object ppl,ob=this_object(),room;
: mixed usr;
: ppl = this_player();
: room = environment(ob);
// 加底下这个判断
if(userp(room)) return 1;
: usr = all_inventory(room);
: //usr = ppl->query_temp("ats");
: r = random(3);
: time = query("S_R/time"); //移除计时
: if(!ob) time = time / 2; //使用者不在时间减少
: if( time < 1)
: {
: write(CYN"运转四时剑阵的已经能源消耗完毕,剑阵一并崩然溃散。\n"NOR);
: remove();
: }
: else
: set("S_R/time",time-1);
这个判断可以往前挪. 另外 remove() 下方要 return 1;
因为 ob=this_object(), 若 ob->remove() 程式就应停止
: foreach(ob in usr)
: {
: if(userp(ob))
: {
: if(!ob) continue;
: if(ob->query("no_attack")) continue;
: if(!ob->query("ats")) continue;
要知道玩家有无攻击对象, 有两种判断方式
if(ob->query_attackers()) 代表若 ob 有攻击对象
if(ob->query_current_attacker()) 代表若 ob「有正要攻击的那个对象」
一般用第一个就行了。直接读玩家的 ats 跟使用函数读法的差异,
在於 ats 有可能为 ({ 0 }) 这样的东西 = 实际上攻击的对象已经
消失, 使用函数读取时它判断到 ({ 0 }) 会先移除.
: switch(r)
: {
: case 0:
: ppl->shut(HIM"\n\n$N【春之迷蒙】->$O"NOR,11111,11111,({"dam","physics",2}),ob);
: break;
: case 1:
: ppl->shut(HIM"\n\n$N【夏之骄蹇】->$O"NOR,11111,11111,({"dam","physics",2}),ob);
: break;
: case 2:
: ppl->shut(HIM"\n\n$N【秋之累绶】->$O"NOR,11111,11111,({"dam","physics",2}),ob);
: break;
: case 3:
: ppl->shut(HIM"\n\n$N【冬之离葬】->$O"NOR,11111,11111,({"dam","physics",2}),ob);
: break;
: }
: }
: else
: i++;
: }
: if(i==sizeof(usr))
: {
: delete("callouting");
: remove_call_out("room_check_poison");
: return 1;
: }
: call_out("room_check_poison",2); //两回合攻击一次
: return 1;
: }
: int disband(string str)
: {
: object ppl = this_player();
: if(!str || str == "" ) return notify_fail("什麽?\n"NOR);
: if(str!="range") return notify_fail("你是要解除剑阵吗?(disband range)\n"NOR);
: if((string)ppl->query("name")!=query("name"))
: return notify_fail("你并不能控制这座剑阵。\n"NOR);
: command("drop all"); //drop没反应 要改别的方式
: write("你解除四时剑阵了.\n");
: remove();
: return 1;
: }
: 问题一:
: 请问要怎样让 剑阵 在每一次 call_out("room_check_poison",2);
: 都能读取到 使用者 正在攻击的敌人 ppl->query_temp("ats");
: 让 ppl->shut(HIM"\n\n$N【春之迷蒙】->$O"................
: 能够使用;
: 或者是 让 剑阵 读取到 使用者 的攻击敌人参数
: 然後再用直接扣血的方式(但是要做抗性判断,跟属性闪避的判断)
: 还要考虑玩家先布下剑阵时在进行战斗。
: 问题二:
: //增加剑法类的攻击威力。
: //从slash的指令或是剑法的技能档增加读取到剑阵便增加攻击力
: slash的档案可以在哪里看到,另一个构思中的技能:飞剑 也用得到
/cmds/std/_slash.c 以及 /d/slash/*.c
slash指令已经cp 一份到你的目录 ~plain/_slash.c,
/d/slash 则应该有对你开放可读权限.
因为你的剑阵是实体物品,只要设定特殊 id 跟参数,
就可以用 present 的方式去 check.
: 飞剑的攻击与数量:
: 一:
: 只招换出一只 飞剑 增加攻击次数一
: 比如 "四时剑法" 攻击次数为四,在读取到飞剑参数後攻击加一,变
: 成攻击次数为五。
这个就依剑法的不同,自行决定做法即可。个人比较建议先让
所有剑法都先 inherit 同一个 /d/slash 下的样本继承档
(该样本继承档则 inherit DAEMON;)
这样你做相关修改才会比较方便. 不然根据经验, 要一个一个
改技能档, 容易有出错的风险.
: 二:
: 可由 "剑士之心" 或是 "气劲(air)" 除於三千最多能,同时有三把飞
: 剑(这部分由撰写者决定)。
: 这里的原则是一的情况下可以达到原攻击的八九成,二的情况下飞剑只
: 数多攻击力就要下降。
: 直接从指令作修改比较快,修改剑类技能就比较麻烦也占记忆体。
: 以上 谢谢
: Plain@Sanc
重点在於你构想中的「多一剑」的实际执行形式为何,例如「
若大剑技+飞剑」时又是怎样的呈现方式?
如果是我的话在不改技能档的情况下只改指令档也是可以的.
// _slash.c
已经先 call 剑法去施展出攻击了
if(ob=present(特殊id,所处环境))
if(ob->query(特殊参数)) 或 if(ob->check_剑阵_是可运作中的())
ob->ppl_is_slashing(ppl,玩家施展的剑法,几级,攻击对象是谁);
return 1;
// ob档
int ppl_is_slashing(object ppl,string skillname,int lv,object tar)
{
switch(skillname)
{
case "4-season slash": ppl->shut(四时相关叙述,伤害,命中,({xx}),tar); break;
case "crack slash": ...
.
.
.
}
}
这应该是不必动到技能档本身的比较简易的修改方式。
Belldandy.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.253.168.79
1F:推 justinj :看到这个....原来ghost的招式还是会有问题...amem 06/12 08:46
2F:→ hlead :改以上写法在侧看看吧..avert 06/12 09:20
3F:推 justinj :norr你少改一只....封魔的devil.c 06/13 20:26
4F:→ hlead :有改道吧? 06/15 00:09