作者laechan (小太保)
看板mud_sanc
标题[wizs] 函数 show
时间Sat May 1 22:37:30 2010
贴出来,大家来看看问题在哪。
底下是个人猜测:因为增加了幻影术的判断造成需 substr 的东西过多
void show(object me,object tar,string msg,int dam)
{
string wp_name,tmp,tname,mname,con,s1,s2;
mixed obs;
int i,dam2,u,t,j;
u=userp(me); //->query("user");
t=userp(tar); //->query("user");
// 玩家对玩家PK时减伤
if(u && t)
dam=dam/15;
// msg 里面有 $W 时以呼叫者手拿的武器名称替代
if(strsrch(msg,"$W")>0)
{
object wp;
wp = (object)me->query("weapon1");
if(wp)
{
wp_name=wp->query("name");
msg=substr(msg,"$W",wp_name+NOR);
}
else
msg=substr(msg,"$W", "拳脚");
}
// 取得自己及对方的 chi_name
tname=tar->query("chi_name");
mname=me->query("chi_name");
//
这里可以做节省运算
msg+="\n";
// $N替代为 mname
//
这里应该就可以再做 $O 替代为 tname
tmp=substr(msg,"$N",mname);
//
这个判断有过早的嫌疑
//
写在这里代表任何状况的呼叫show(包含非战斗中)都替换
if(me->query_temp("illusion spell")>0)
{
// 增加一行幻影术的讯息
wp_name=substr(msg,"$N",mname+"的幻影");
tmp+=wp_name;
}
// 将 tmp 的 $O(包含有幻影术那行) 替换为 tname 并存为 s2
s2=substr(tmp,"$O",tname);
// 若 !dam = 一般呼叫 show 的状态(最後面没有伤害显示值)
//
但这个判断可能是错的
//
正确的判断应该是 "不需要这个 if", 直接做下面
if(!dam)
{
obs=all_inventory(environment(me));
// 底下的讯息不显示给 me 跟 tar 看
obs-=({me,tar});
j=sizeof(obs);
for(i=0;i<j;i++)
{
if(!obs[i]->query("user")) continue;
if(obs[i]->query("record_data/no_environment_msg")) continue;
// 把含有 $N 跟 $O 名字的讯息显示给 me 跟 tar 以外的人看
tell_object(obs[i],s2);
}
//
这里应该就直接做 tell_object(me 跟 tar 然後就 return ;
}
//
底下又做了一次上面的东西,我猜是重覆了
//
我会再多看几次,若确定是重覆就会更正
if(me->query_temp("illusion spell")>0)
{
wp_name=substr(wp_name,"$N","$N的幻影");
tmp=msg+wp_name;
}
else
tmp=msg;
// 底下的讯息部份
// s1 : 显示给自己看(所以$N替换为"你", $O替换为 tname)
// s2 : 显示给敌人看(所以$O替换为"你", $N替换为 mname)
s1=substr(tmp,"$N",me->query("sex_name"));
s1=substr(s1,"$O",tname);
s2=substr(tmp,"$O",tar->query("sex_name"));
s2=substr(s2,"$N",mname);
//
这里可能有问题
if(dam<1)
{
if(u)
tell_object(me,s1);
if(t && tar!=me)
tell_object(tar,s2);
return ;
}
// 执行到这里确定 tar 有受到 dam 伤害
// 所以底下是对的
tar->receive_damage(dam);
// for 幻影术的伤害部份实装底下程式段 by Laechan@Sanc 2010/03/22
// 这里基本上是对的, 更严格一点可以 if(me && tar && 幻影术)
if(me->query_temp("illusion spell")>0 && tar)
{
//
这里公式的修改可借用 deus 写在某物件的变通公式来做
tar->receive_damage(dam);
dam=dam*2; // dam+dam2;
}
//
我猜这里还有 bug, 古老的某一个 bug
if(tar)
{
con=Condit(tar,dam);
if(t && tar!=me)
tell_object(tar,s2+"「"HIR+mname+con+NOR"」\n");
if(u)
tell_object(me,s1+"「"HIM+tname+HIM+con+NOR"」\n"); //C no colo
}
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.253.173.213
1F:→ laechan :刚刚趁线上有玩家,先更新了两处,if(!dam) 跟illusion 05/01 23:18
2F:→ laechan :疑似重覆处 05/01 23:18