找回密码
 注册
楼主: luckybaby

[攻略心得] 【法术研究之:蛛网术】

[复制链接]
发表于 2007-4-24 10:02:05 | 显示全部楼层
那个法术的脚本比较复杂……

分多个效果,且每个效果有多个脚本。主要是范围法术设计有 On Exit 和 On Enter

暂时还没看出个头绪来…… DoDo JJ 有没有具体测试哪个比较有问题?应该是施展前可以选的吧?

Hamper Movement
Entangle
Camouflage
这3个?有问题的是 Hamper Movement 还是 Entangle?粗略的看了看Hamper Movement On Enter部分就似乎没有做任何鉴定……直接就apply效果了?(可能是我没看懂吧)

解读中……

我猜测一下写脚本者的意图……现在估计问题出在Hamper Movement 的那些脚本上。按照目前写的
Hamper Movement包括4个脚本部分

X2_S0_VineMHmp——这个脚本主要是在一个指定的点Apply一个区域效果,主要语句也就是
//Create an instance of the AOE Object using the Apply Effect function
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, lTarget, RoundsToSeconds(nDuration));

X2_S0_VineMHmpA——这个应该是对进入上述区域的生物加上效果的脚本,我是没看到有什么鉴定

X2_S0_VineMHmpB——感觉按照作者的意图是希望离开上述区域的生物就会被去掉减速等效果……然则 我看到那个多重if嵌套的判定就感觉,出事故的概率非常高。

关键语句(大家帮忙分析吧):

    if(GetHasSpellEffect(531, oTarget))
    {
        //Search through the valid effects on the target.
        eAOE = GetFirstEffect(oTarget);
        while (GetIsEffectValid(eAOE) && bValid == FALSE)
        {
            if (GetEffectCreator(eAOE) == GetAreaOfEffectCreator())
            {
                if(GetEffectType(eAOE) == EFFECT_TYPE_MOVEMENT_SPEED_DECREASE)
                {
                    //If the effect was created by the Acid_Fog then remove it
                    if(GetEffectSpellId(eAOE) == 531)
                    {
                        RemoveEffect(oTarget, eAOE);
                        bValid = TRUE;
                    }
                }
            }
            //Get next effect on the target
            eAOE = GetNextEffect(oTarget);
        }

最后一部分X2_S0_VineMHmpC—— 注释里写了 Heartbeat,我想应该是进入区域后,每轮(或者每一段时间)都鉴定一下……然则我同样没找到所谓的反射鉴定(基本就是从VineMHmpA里copy的连那句注释掉的都是)

关键语句:
    while(GetIsObjectValid(oTarget))
    {
        // if(!GetHasFeat(FEAT_WOODLAND_STRIDE, oTarget) &&(GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) != TRUE) )
        if( (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) != TRUE) )        // AFW-OEI 05/01/2006: Woodland Stride no longer protects from spells
        {
            if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
            {
                SignalEvent(oTarget, EventSpellCastAt(GetAreaOfEffectCreator(), GetSpellId()));
                fDelay = GetRandomDelay(0.0, 2.0);
                DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget));
            }
        }
        //Get next target in spell area
        oTarget = GetNextInPersistentObject();
    }

——————————————————————
汗~~~ 谁有看出鉴定在哪里?或者更有头绪的理解么?我是1.05版的~~~

按照目前我个人理解,这法术完全是被写成每轮apply一个减速效果(可能不会叠加,因为apply前似乎有判定是不是是已经被减速者,然则还是没写对,弄不好还真多重叠加减速),且离开范围区域仍然一直受影响……和DoDo JJ的描述差不多……

ps:我希望是我的理解力太差,而不是写脚本的竟然就只有这种逻辑……
发表于 2007-4-24 10:45:24 | 显示全部楼层
说的便是Hamper Movement。且减速效果叠加,100%叠加。除法术免疫和法术馒头和Freedom外几乎无法以任何形式抵抗,或许可以用带免疫减速属性的装备抵抗掉吧,然我不记得见过这种东西来着。

逆推萝莉的战术便是基于此法术。我很厚道的没建Zan archery形态的build,否则上手对手减速50%,凭借自己150%的速度大可以完美演绎蜘蛛流。[s:7]
发表于 2007-4-24 10:57:14 | 显示全部楼层
写这个法术脚本的人……实在是太“混”了吧 大汗……

感觉上这个法术主要是围绕Event的…… 目前来看是将脚本在不同的事件 On Enter、On Exit、和每轮的Heartbeat中去执行.

在我看来On Enter 本来就有些多余……因为既然进入区域的每轮都必须做个判定(已经在区域中的对象,也能在Heartbeat时触发的),那么On Enter完全可以不必写。当然写也无妨,和Heartbeat区别不大……

实在要发指写那个的人,不测也就算了(估计没有测试部门这一说)。写之前连“叠加”这种基本逻辑都毫不在乎……莫非真是“游戏”之作。再次证明对于脚本连最简单的code review都没有…… 而且这个还是2002年留下的“陈年烂帐”

再看了几眼,On Exit 那堆脚本如果工作的话,脚本看来是没有问题的(至少还没看出来)。这个法术可能只要改掉叠加,和鉴定后再Apply的话可能就会工作正常……

hoho 不知道海底眼还在不在,让他去修修。
发表于 2007-4-24 11:47:28 | 显示全部楼层
为何楼上的满篇的中国字,合在一起我便一句也看不懂了腻~~

&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; [y:5] &#160;<=对所有脚本Lore判定自动取1的人
 楼主| 发表于 2007-4-24 17:42:57 | 显示全部楼层
关于vine mine的讨论去新帖吧。

另外,GREASE我看了下脚本发现减速效果居然也需要作reflex鉴定(法术说明中是不需要的,脚本注释中也是不需要的,OTZ),于是grease的作用也大打折扣了。证据如下,谁有兴趣可以去测试。

if(!MySavingThrow(SAVING_THROW_REFLEX, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_NONE, OBJECT_SELF)){
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHit, oTarget);
}
发表于 2007-4-24 18:01:17 | 显示全部楼层
恩 该有的没有。不该有的就有……

看来真的要信奉“自己改”这条规则了 呵呵

脚本目前最大的问题,就是写法混乱。连基本写法都不统一,有鉴定的,没鉴定的。单体的范围效果的全一堆东西往上叠…… 无论怎么说感觉最好的写法就是将一些类似的情况统一写成安全的格式……

这样可读性也好的多了。恩,好像是蛮废话的,大概也是我做了一段时间半调子的代码测试留下的一些职业习惯吧……虽然还是有注释,不过估计也就“自己”看得懂那种……

ps:说不定一冲动,直接加入某社团(黑社会),把那些法术脚本都排一遍算了……不过实在不熟悉nwnscript 读还勉强可以
发表于 2007-4-24 19:35:47 | 显示全部楼层
我放蛛网术总是粘住自己
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|奥德赛公会

GMT+8, 2026-6-17 07:50 , Processed in 0.010886 second(s), 14 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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