找回密码
 点一下
楼主: 冷漠

关于模拟可叠加类献祭技能

[复制链接]
 楼主| 发表于 2012-8-28 20:02:43 | 显示全部楼层
[trigger]Set
    事件
        单位 - 任意单位 发动技能效果
    条件
    动作
        设置 Count_01 = (Count_01 + 1)
        设置 Hero[Count_01] = (触发单位)
        如果 ((Damage <预设> 处于开启状态) 不等于 TRUE) 成立则 (触发器 - 开启 Damage <预设>) 否则 (--------   --------)
[/trigger]
[trigger]
Damage
    事件
        时间 - 每 0.01 秒触发事件
    条件
    动作
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                Count_01 不等于 0
            Then - 动作
                For Index_01 从 1 到 Count_01, 做动作
                    Loop - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                (Hero[Index_01] 拥有 神圣护甲) 等于 TRUE
                            Then - 动作
                                设置 Location[0] = (Hero[Index_01] 的位置)
                                设置 Group[Index_01] = (半径为 500.00 圆心为 Location[0] 且满足 ((((匹配单位) 是存活的) 等于 TRUE) and (((匹配单位) 是 (Hero[Index_01] 的所有者) 的敌对单位) 等于 TRUE)) 的所有单位)
                                单位组 - 选取 Group[Index_01] 内所有单位做动作
                                    Loop - 动作
                                        For Index_02[Index_01] 从 1 到 Count_02[Index_01], 做动作
                                            Loop - 动作
                                                如果所有条件成立则做动作1,否则做动作2
                                                    If - 条件
                                                        (选取单位) 等于 Unit[Index_02[Index_01]]
                                                    Then - 动作
                                                        设置 Boolean[0] = TRUE
                                                    Else - 动作
                                        如果所有条件成立则做动作1,否则做动作2
                                            If - 条件
                                                Boolean[0] 不等于 TRUE
                                            Then - 动作
                                                设置 Count_02[Index_01] = (Count_02[Index_01] + 1)
                                                设置 Unit[Count_02[Index_01]] = (选取单位)
                                                单位 - 命令 Hero[Index_01] 对 Unit[Count_02[Index_01]] 造成 30.00 点伤害,攻击类型: 法术 伤害类型: 魔法
                                                设置 Integer[Count_02[Index_01]] = 99
                                                如果 ((Damage Cd <预设> 处于开启状态) 不等于 TRUE) 成立则 (触发器 - 开启 Damage Cd <预设>) 否则 (--------   --------)
                                            Else - 动作
                                        设置 Boolean[0] = FALSE
                                单位组 - 删除 Group[Index_01]
                                点 - 清除 Location[0]
                            Else - 动作
            Else - 动作
                触发器 - 关闭 (当前触发)
                游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: 关闭持续时间...
[/trigger]
[trigger]
Damage Cd
    事件
        时间 - 每 0.01 秒触发事件
    条件
    动作
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                Count_01 不等于 0
            Then - 动作
                For Index_03 从 1 到 Count_01, 做动作
                    Loop - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                Count_02[Index_03] 不等于 0
                            Then - 动作
                                For Index_04[Index_03] 从 1 到 Count_02[Index_03], 做动作
                                    Loop - 动作
                                        如果所有条件成立则做动作1,否则做动作2
                                            If - 条件
                                                Integer[Index_04[Index_03]] 不等于 0
                                            Then - 动作
                                                设置 Integer[Index_04[Index_03]] = (Integer[Index_04[Index_03]] - 1)
                                            Else - 动作
                                                设置 Unit[Index_04[Index_03]] = Unit[Count_02[Index_03]]
                                                设置 Unit[Count_02[Index_03]] = 没有单位
                                                设置 Integer[Index_04[Index_03]] = Integer[Count_02[Index_03]]
                                                设置 Integer[Count_02[Index_03]] = 0
                                                设置 Index_04[Index_03] = (Index_04[Index_03] - 1)
                                                设置 Count_02[Index_03] = (Count_02[Index_03] - 1)
                            Else - 动作
                                如果所有条件成立则做动作1,否则做动作2
                                    If - 条件
                                        (Hero[Index_03] 拥有 神圣护甲) 不等于 TRUE
                                    Then - 动作
                                        设置 Hero[Index_03] = Hero[Count_01]
                                        设置 Hero[Count_01] = 没有单位
                                        设置 Count_02[Index_03] = Count_02[Count_01]
                                        设置 Count_02[Count_01] = 0
                                        设置 Index_03 = (Index_03 - 1)
                                        设置 Index_01 = (Index_01 - 1)
                                        设置 Count_01 = (Count_01 - 1)
                                    Else - 动作
            Else - 动作
                触发器 - 关闭 (当前触发)
                游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: 关闭伤害间隔...
[/trigger]


目前触发写成这样,基本来说只有一个触发单位N个选取单位都没有BUG,只是一个以上的触发单位就不知道为什么出错,导致造成多倍伤害,麻烦看看……

连同附件送上……

模拟献祭.w3x

22 KB, 下载次数: 1

回复

使用道具 举报

发表于 2012-8-29 00:59:07 | 显示全部楼层
哎哎,为什么我收不到@呢
回复

使用道具 举报

发表于 2012-8-29 01:27:24 | 显示全部楼层
[trigger]S
    事件
        单位 - 任意单位 学习技能
    条件
        (学习技能) 等于 专注光环
    动作
        单位组 - 添加 (触发单位) 到 XA_HG
[/trigger]
[trigger]D
    事件
        时间 - 每 0.01 秒触发事件
    条件
    动作
        单位组 - 选取 XA_HG 内所有单位做动作
            Loop - 动作
                设置 XA_HU = (选取单位)
                设置 Temp_Loaction = ((选取单位) 的位置)
                设置 Temp_Group = (半径为 512.00 圆心为 Temp_Loaction 且满足 (((匹配单位) 是 ((选取单位) 的所有者) 的敌对单位) 等于 TRUE) 的所有单位)
                单位组 - 选取 Temp_Group 内所有单位做动作
                    Loop - 动作
                        For Loop_I 从 1 到 XA_UC, 做动作
                            Loop - 动作
                                如果所有条件成立则做动作1,否则做动作2
                                    If - 条件
                                        XA_HU 等于 XA_AU[Loop_I]
                                        (选取单位) 等于 XA_DU[Loop_I]
                                    Then - 动作
                                        跳过剩余动作
                                    Else - 动作
                        设置 XA_UC = (XA_UC + 1)
                        设置 XA_AU[XA_UC] = XA_HU
                        设置 XA_DU[XA_UC] = (选取单位)
                        设置 XA_TI[XA_UC] = 100
                        单位 - 命令 XA_HU 对 (选取单位) 造成 (10.00 x (转换 (专注光环 的等级对 XA_HU) 为实数)) 点伤害,攻击类型: 法术 伤害类型: 火焰
                        特殊效果 - 创建并绑定特效到 overhead 对 (选取单位) ,使用模型: Abilities\\Spells\\NightElf\\Immolation\\ImmolationDamage.mdl
                        特殊效果 - 删除 (最后创建的特效)
                点 - 清除 Temp_Loaction
                单位组 - 删除 Temp_Group
        For Loop_I 从 1 到 XA_UC, 做动作
            Loop - 动作
                如果所有条件成立则做动作1,否则做动作2
                    If - 条件
                        XA_TI[Loop_I] 小于或等于 0
                    Then - 动作
                        设置 XA_AU[Loop_I] = XA_AU[XA_UC]
                        设置 XA_DU[Loop_I] = XA_DU[XA_UC]
                        设置 XA_TI[Loop_I] = XA_TI[XA_UC]
                        设置 XA_UC = (XA_UC - 1)
                    Else - 动作
                        设置 XA_TI[Loop_I] = (XA_TI[Loop_I] - 1)
[/trigger]
话说这样写就可以了,没必要写那么复杂的(其实如果用”等待1.00秒会更简单“)
可叠加献祭.w3x (14 KB, 下载次数: 2)
回复

使用道具 举报

 楼主| 发表于 2012-8-29 01:27:35 | 显示全部楼层
……
收不到么……
刚刚又钻了半小时的牛角尖……
还是想不通为什么多人时运行正确不能……
真心求破……


没注意到你发了

我研究一下

话说等待不是说能不用就尽量不用么
回复

使用道具 举报

发表于 2012-8-29 01:39:50 | 显示全部楼层
你的触发的问题我还没看出来.....
猜测可能是循环整数的问题吧...……

还有就是,我写的是被动的“专注光环”
貌似你需要的是主动型的...没注意

不过其实都差不多,换一下事件,加一句动作就可以了
用定时删除,或者每次检查BUFF都可以,时间到期后将英雄从单位组中删除就可以了
回复

使用道具 举报

发表于 2012-8-29 01:55:01 | 显示全部楼层

回 冷漠 的帖子

冷漠:……
收不到么……
刚刚又钻了半小时的牛角尖……
还是想不通为什么多人时运行正确不能……
真心求破……
.......(2012-08-29 01:27)嬀/color]
我也没注意你发了,能打断我的三连真是太好了

话说如果不知道触发哪里错了,可以加一些“显示文本信息”之类的动作进去
然后根据显示的信息进行排查错误......不然有时候是怎么看都看不出问题的

至于等待呢...确实效率比较低,误差比较大,不过倒也不会引起BUG
能不用最好不用吧...不过用好了确实能提升做图效率(也就是偷懒^_^)
毕竟现在的玩家的电脑比以前好多了,效率低点也不会太卡的...
回复

使用道具 举报

 楼主| 发表于 2012-8-29 19:14:31 | 显示全部楼层

回 美味豆沙包 的帖子

美味豆沙包:我也没注意你发了,能打断我的三连真是太好了

话说如果不知道触发哪里错了,可以加一些“显示文本信息”之类的动作进去
然后根据显示的信息进行排查错误......不然有时候是怎么看都看不出问题的
....... (2012-08-29 01:55)
我有加过信息文本进行排查,但是就是看不出哪有问题……

想过很多次,逻辑上应该没错,但事实就是不懂哪错……
回复

使用道具 举报

 楼主| 发表于 2012-8-29 19:16:50 | 显示全部楼层

回 美味豆沙包 的帖子

美味豆沙包:你的触发的问题我还没看出来.....
猜测可能是循环整数的问题吧...……

还有就是,我写的是被动的“专注光环”
貌似你需要的是主动型的...没注意
....... (2012-08-29 01:39)
主动或被动很简单,那些我还是懂的

可以的话我还是想弄明白我的思路为什么无法供应给多人

目前想来想去最可能的还是双套索引整数出问题
回复

使用道具 举报

 楼主| 发表于 2012-8-30 01:56:28 | 显示全部楼层
[trigger]
Set
    事件
        单位 - 任意单位 发动技能效果
    条件
        (施放技能) 等于 通魔
    动作
        设置 Count_01 = (Count_01 + 1)
        设置 Hero_01[Count_01] = (触发单位)
        设置 Location[0] = (技能施放点)
        设置 Unit_01[Count_01] = (新建 (Hero_01[Count_01] 的所有者) 的 步兵 在 Location[0] 面向角度:默认建筑朝向 度)
        单位 - 为 Unit_01[Count_01] 设置 水元素 类型的生命周期,持续时间为 3.00 秒
        点 - 清除 Location[0]
        如果 ((Damage <预设> 处于开启状态) 不等于 TRUE) 成立则 (触发器 - 开启 Damage <预设>) 否则 (--------   --------)
[/trigger]
[trigger]
Damage
    事件
        时间 - 每 0.01 秒触发事件
    条件
    动作
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                Count_01 不等于 0
            Then - 动作
                For Index_01 从 1 到 Count_01, 做动作
                    Loop - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                (Unit_01[Index_01] 是存活的) 等于 TRUE
                            Then - 动作
                                设置 Location[0] = (Unit_01[Index_01] 的位置)
                                设置 Group[0] = (半径为 1000.00 圆心为 Location[0] 且满足 ((((匹配单位) 是存活的) 等于 TRUE) and (((匹配单位) 是 (Hero_01[Index_01] 的所有者) 的敌对单位) 等于 TRUE)) 的所有单位)
                                单位组 - 选取 Group[0] 内所有单位做动作
                                    Loop - 动作
                                        For Index_02 从 1 到 Count_02, 做动作
                                            Loop - 动作
                                                如果所有条件成立则做动作1,否则做动作2
                                                    If - 条件
                                                        Hero_01[Index_01] 等于 Hero_02[Index_02]
                                                        (选取单位) 等于 Unit_02[Index_02]
                                                    Then - 动作
                                                        跳过剩余动作
                                                    Else - 动作
                                        设置 Count_02 = (Count_02 + 1)
                                        设置 Hero_02[Count_02] = Hero_01[Index_01]
                                        设置 Unit_02[Count_02] = (选取单位)
                                        设置 Integer[Count_02] = 100
                                        单位 - 命令 Hero_01[Index_01] 对 Unit_02[Count_02] 造成 30.00 点伤害,攻击类型: 法术 伤害类型: 魔法
                                        特殊效果 - 创建并绑定特效到 chest 对 Unit_02[Count_02] ,使用模型: Abilities\\Spells\\Undead\\DeathandDecay\\DeathandDecayDamage.mdl
                                        特殊效果 - 删除 (最后创建的特效)
                                单位组 - 删除 Group[0]
                                点 - 清除 Location[0]
                            Else - 动作
                                设置 Hero_01[Index_01] = Hero_01[Count_01]
                                设置 Hero_01[Count_01] = 没有单位
                                设置 Unit_01[Index_01] = Unit_01[Count_01]
                                设置 Unit_01[Count_01] = 没有单位
                                如果所有条件成立则做动作1,否则做动作2
                                    If - 条件
                                        Count_02 等于 0
                                    Then - 动作
                                        设置 Count_01 = (Count_01 - 1)
                                    Else - 动作
                For Index_02 从 1 到 Count_02, 做动作
                    Loop - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                Integer[Index_02] 不等于 0
                            Then - 动作
                                设置 Integer[Index_02] = (Integer[Index_02] - 1)
                            Else - 动作
                                设置 Hero_02[Index_02] = Hero_02[Count_02]
                                设置 Hero_02[Count_02] = 没有单位
                                设置 Unit_02[Index_02] = Unit_02[Count_02]
                                设置 Unit_02[Count_02] = 没有单位
                                设置 Integer[Index_02] = Integer[Count_02]
                                设置 Integer[Count_02] = 0
                                设置 Count_02 = (Count_02 - 1)
            Else - 动作
                触发器 - 关闭 (当前触发)
                游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: 关闭持续时间...
[/trigger]

经指点把触发改成了这样,测试无发现任何BUG

唯一美中不足的情况是,在技能无Cd状态下,技能伤害无法叠加,只能跟随其后

比如Hero发动技能
持续3秒后消失
每秒造成30点伤害
而在无Cd的情况下,在2秒再次发动技能
那么在有效范围内实际造成的伤害次数为5次,也就是假设应该造成180点伤害,却只有150点实际伤害

请问一下包子兄,在伤害单位与受伤单位循环判断那里应该怎么改才能受到正确的叠加伤害,或者说,如何只跳过当前的单位判断?
回复

使用道具 举报

发表于 2012-8-30 08:32:38 | 显示全部楼层
由于“伤害记录”是和“英雄”绑在一起的,所以相同英雄的技能无法叠加
你可以把数据绑在“(新建 (Hero_01[Count_01] 的所有者) 的 步兵 在 Location[0] 面向角度:默认建筑朝向 度)”身上
这样每次施放技能产生的单位都不一样,然后判断重复伤害时就会单独计算了
回复

使用道具 举报

发表于 2012-8-30 08:35:47 | 显示全部楼层
顺便说一下,这几天都上不了网了,大家想吃早餐的时候不要想我。
回复

使用道具 举报

发表于 2012-8-30 08:49:06 | 显示全部楼层
豆沙包真是方便~~
回复

使用道具 举报

发表于 2012-8-30 09:17:24 | 显示全部楼层
我还以为是sc2技能的研究文,仔细一看原来是楼主……
回复

使用道具 举报

 楼主| 发表于 2012-8-30 19:51:23 | 显示全部楼层
Else - 动作
    设置 Hero_01[Index_01] = Hero_01[Count_01]
    设置 Hero_01[Count_01] = 没有单位
    设置 Unit_01[Index_01] = Unit_01[Count_01]
    设置 Unit_01[Count_01] = 没有单位
    设置 Count_01 = (Count_01 - 1)

这段触发中的Count_01是为了判断是否有单位正在使用该技能而使用计时器,否则就关闭计时器减少资源消耗

而我的设想是所有属于触发者的整数计算都为0时,才减1

比如:整数I[1]、I[3]、I[5]属于Hero[1]的整数计算,那么整数I[1]、I[3]、I[5]均为0时才会设置Count_01 - 1进行排泄

这样做感觉比较仔细,而且不会在单位还在读秒时就关闭触发,不过感觉太麻烦

还是说检查到Unit_01死亡的话直接排泄单位,再判断Count_02是否等于0,直接设置Count_01等于0?

感觉后者方便,但是会不会比较浪费资源呢?
回复

使用道具 举报

 楼主| 发表于 2012-8-30 20:11:49 | 显示全部楼层
[trigger]
如果所有条件成立则做动作1,否则做动作2
    If - 条件
        Count_02 等于 0
    Then - 动作
        For Index_01 从 1 到 Count_01, 做动作
            Loop - 动作
                设置 Hero_01[Index_01] = 没有单位
                设置 Unit_01[Index_01] = 没有单位
        设置 Count_01 = 0
    Else - 动作
[/trigger]
[trigger]
Else - 动作
    设置 Hero_01[Index_01] = Hero_01[Count_01]
    设置 Hero_01[Count_01] = 没有单位
    设置 Unit_01[Index_01] = Unit_01[Count_01]
    设置 Unit_01[Count_01] = 没有单位
如果 (Count_02 等于 0) 成立则 (设置 Count_01 = 0) 否则 (--------   --------)
[/trigger]

我设想的那种方法我觉得还是太难了,至少我想不出……

我想了这两种方法来进行排泄,请问一下哪种比较精确?或许说还有更精确的方法么?
回复

使用道具 举报

发表于 2012-8-30 23:13:37 | 显示全部楼层
还是收不到@呢.....
楼上的问题等我回学校之后再看吧......
回复

使用道具 举报

 楼主| 发表于 2012-8-30 23:39:04 | 显示全部楼层

回 美味鱼汤包 的帖子

美味鱼汤包:还是收不到@呢.....
楼上的问题等我回学校之后再看吧...... (2012-08-30 23:13)
……

你到底有多少种包子、不,多少个小号……


[trigger]
Set
    事件
        单位 - 任意单位 发动技能效果
    条件
        (施放技能) 等于 通魔
    动作
        设置 Count_01 = (Count_01 + 1)
        设置 Hero_01[Count_01] = (触发单位)
        设置 Location[0] = (技能施放点)
        设置 Unit_01[Count_01] = (新建 (Hero_01[Count_01] 的所有者) 的 步兵 在 Location[0] 面向角度:默认建筑朝向 度)
        单位 - 为 Unit_01[Count_01] 设置 水元素 类型的生命周期,持续时间为 3.00 秒
        点 - 清除 Location[0]
        如果 ((Damage <预设> 处于开启状态) 不等于 TRUE) 成立则 (触发器 - 开启 Damage <预设>) 否则 (--------   --------)
[/trigger]
[trigger]
Damage
    事件
        时间 - 每 0.01 秒触发事件
    条件
    动作
        如果所有条件成立则做动作1,否则做动作2
            If - 条件
                Count_01 不等于 0
            Then - 动作
                For Index_01 从 1 到 Count_01, 做动作
                    Loop - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                (Unit_01[Index_01] 是存活的) 等于 TRUE
                            Then - 动作
                                设置 Location[0] = (Unit_01[Index_01] 的位置)
                                设置 Group[0] = (半径为 1000.00 圆心为 Location[0] 且满足 ((((匹配单位) 是存活的) 等于 TRUE) and (((匹配单位) 是 (Hero_01[Index_01] 的所有者) 的敌对单位) 等于 TRUE)) 的所有单位)
                                单位组 - 选取 Group[0] 内所有单位做动作
                                    Loop - 动作
                                        For Index_02 从 1 到 Count_02, 做动作
                                            Loop - 动作
                                                如果所有条件成立则做动作1,否则做动作2
                                                    If - 条件
                                                        Unit_01[Index_01] 等于 Unit_02[Index_02]
                                                        (选取单位) 等于 Unit_03[Index_02]
                                                    Then - 动作
                                                        跳过剩余动作
                                                    Else - 动作
                                        设置 Count_02 = (Count_02 + 1)
                                        设置 Unit_02[Count_02] = Unit_01[Index_01]
                                        设置 Unit_03[Count_02] = (选取单位)
                                        设置 Integer[Count_02] = 100
                                        单位 - 命令 Hero_01[Index_01] 对 Unit_03[Count_02] 造成 30.00 点伤害,攻击类型: 法术 伤害类型: 魔法
                                        特殊效果 - 创建并绑定特效到 chest 对 Unit_03[Count_02] ,使用模型: Abilities\\Spells\\Undead\\DeathandDecay\\DeathandDecayDamage.mdl
                                        特殊效果 - 删除 (最后创建的特效)
                                单位组 - 删除 Group[0]
                                点 - 清除 Location[0]
                            Else - 动作
                                设置 Hero_01[Index_01] = Hero_01[Count_01]
                                设置 Hero_01[Count_01] = 没有单位
                                设置 Unit_01[Index_01] = Unit_01[Count_01]
                                设置 Unit_01[Count_01] = 没有单位
                For Index_02 从 1 到 Count_02, 做动作
                    Loop - 动作
                        如果所有条件成立则做动作1,否则做动作2
                            If - 条件
                                Integer[Index_02] 不等于 0
                            Then - 动作
                                设置 Integer[Index_02] = (Integer[Index_02] - 1)
                                游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: (转换 Integer[Index_02] 为字符串)
                            Else - 动作
                                设置 Unit_02[Index_02] = Unit_02[Count_02]
                                设置 Unit_02[Count_02] = 没有单位
                                设置 Unit_03[Index_02] = Unit_03[Count_02]
                                设置 Unit_03[Count_02] = 没有单位
                                设置 Integer[Index_02] = Integer[Count_02]
                                设置 Integer[Count_02] = 0
                                设置 Count_02 = (Count_02 - 1)
                如果 (Count_02 等于 0) 成立则 (设置 Count_01 = 0) 否则 (--------   --------)
            Else - 动作
                触发器 - 关闭 (当前触发)
                游戏 - 对 玩家1(红色) 在屏幕位移(0.00,0.00)处显示文本: 关闭持续时间...
[/trigger]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-6-18 21:34 , Processed in 0.119809 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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