UBR365K 发表于 2019-9-17 10:12:14

关于边移动边射击[SWGB]

SWGB中用主单位+合并单位给城堡(fortress)两种攻击,一直在想能否用这个来实现边移动边攻击,但是帝国程序中,主单位如果移动,合并单位(annex_unit)会留在原地不动T_T

昨天试了一下,给投石车类(属于建筑,可以设置合并单位annex_unit)单位在攻击检测函数中加入一小段代码,循环将annex_unit的坐标替换为主单位的坐标,因为这种暴力替换坐标系统并不认为是在移动,所以annex_unit仍然能任意攻击,看起来就和边移动边射击一样,而且不需要触发,可以用在随机地图里面(但估计联机同步可能不行,没试过)

主要问题攻击检测函数只在有敌人时才会被调用,还是要找到所有移动函数,确保主单位/合并单位任何时候坐标都是同步的。等有空时穷举所有的f......+48h, f......+4ch代码,找一下所有的移动函数。。。

最大的问题:合并单位攻击时,主单位的动画不会有任何改变。因为我只是想给SWGB中的歼星舰做出炮塔防御效果,所以不影响。骑射手看着就会很不自然了
不知道合并单位是否设置了强制invisible,如果可以可视的话,应该可以做出车体移动、炮塔旋转攻击的效果

希望做过这方面的前辈分享下经验。。。谢谢

UBR365K 发表于 2019-9-17 10:38:50

https://s2.ax1x.com/2019/09/17/n4QDbV.gif

wongyuhua 发表于 2019-9-17 12:51:48

好麻烦哦,红警2有旋转炮塔的单位只需一句OpportunityFire=yes
估计也不能指望决定版实现,hit & run可是蒙古与匈奴骑射称霸亚欧的重要因素之一

我是谁004 发表于 2019-9-17 13:11:42

楼主你好,反汇编当然是一个复杂而繁琐的事情,不过做好了成就感也是很高的。
您可以看一看1.5的传送单位是怎么做的,里面调用了什么子程序,也许有所帮助。

UBR365K 发表于 2019-9-17 13:44:51

本帖最后由 UBR365K 于 2019-9-17 18:06 编辑

我是谁004 发表于 2019-9-17 13:11
楼主你好,反汇编当然是一个复杂而繁琐的事情,不过做好了成就感也是很高的。
您可以看一看1.5的传送单位是 ...
哈哈,多谢004前辈光临,
我目前电脑上没装帝国2,不过SWGB和帝国2引擎几乎一模一样,代码结构应该都一样

我现在就是找不到移动时更新坐标的函数在哪里,不过找到了一个代码段看着像是pathfinding判断,任何单位只要在移动就会调用,现在测试了下,基本可以比较稳定的gun & run 了,下班回家再全面测试下。。。
编辑:基本确定了地面单位只要移动就会循环调用这个函数,但是飞行模式单位不会。为了给歼星舰加上移动攻击能力,还要继续找咯。。。

https://s2.ax1x.com/2019/09/17/n4q6Te.md.jpg
https://s2.ax1x.com/2019/09/17/n4qVeS.gif

代码超简单,就是检查是建筑类型80,有附加单位,复制坐标,
.rsrc:007B8940   ; ---------------------------------------------------------------------------
.rsrc:007B8940   ; START OF FUNCTION CHUNK FOR sub_4B0470
.rsrc:007B8940
.rsrc:007B8940   loc_7B8940:                           ; CODE XREF: sub_4B0470+16Aj
.rsrc:007B8940 030               push    edx
.rsrc:007B8941 034               push    eax
.rsrc:007B8942 038               push    ecx
.rsrc:007B8943 03C               mov   cx,
.rsrc:007B8947 03C               cmp   cl, 50h
.rsrc:007B894A 03C               nop
.rsrc:007B894B 03C               jnz   short loc_7B8963
.rsrc:007B894D 03C               mov   edx,
.rsrc:007B8953 03C               test    edx, edx
.rsrc:007B8955 03C               jz      short loc_7B8963
.rsrc:007B8957 03C               mov   eax,
.rsrc:007B895A 03C               mov   ecx,
.rsrc:007B895D 03C               mov   , eax
.rsrc:007B8960 03C               mov   , ecx
.rsrc:007B8963
.rsrc:007B8963   loc_7B8963:                           ; CODE XREF: sub_4B0470+3084DBj
.rsrc:007B8963                                             ; sub_4B0470+3084E5j
.rsrc:007B8963 03C               pop   ecx
.rsrc:007B8964 038               pop   eax
.rsrc:007B8965 034               pop   edx
.rsrc:007B8966 030               fld   dword ptr
.rsrc:007B8969 030               fsub    dword ptr
.rsrc:007B896C 030               jmp   loc_4B05E0
.rsrc:007B896C   ; END OF FUNCTION CHUNK FOR sub_4B0470
.rsrc:007B896C   ; ---------------------------------------------------------------------------


我是谁004 发表于 2019-9-17 19:18:37

UBR365K 发表于 2019-9-17 13:44
哈哈,多谢004前辈光临,
我目前电脑上没装帝国2,不过SWGB和帝国2引擎几乎一模一样,代码结构应该都一样
...

{:153:}这个当然在帝国2上用不了,引擎一样不代表程序也一样呀,而且SW的程序功能和帝国也有所不同。

UBR365K 发表于 2019-9-17 19:37:53

哈哈,我一直把SWGB当个帝国2的大模组看的,SWGB原版增加的几个功能护盾,电厂,绝地武士也都挺鸡肋。话说帝国2原版里,annex_unit是否只用在城镇中心上?好像几乎没见到单位有带annex_unit的

我是谁004 发表于 2019-9-17 22:39:26

晚上试了一下,在帝国2中做出了这种效果,而且附加单位会跟随从属单位移动。但这样的问题有两个,一是不能手动操纵他们,只会自动寻找目标;二是它们如果锁定了一个正在遭受攻击的目标,就会不受射程限制不断攻击它,直到玩家失去它的视野或者被摧毁

UBR365K 发表于 2019-9-19 13:35:20

本帖最后由 UBR365K 于 2019-9-19 13:59 编辑

又做了一些测试,
1。SWGB中当附加单位攻击地面目标时也会有忽视射程的问题,但是当攻击空中目标(单位类型48,43,59,62,63,64,与是否设置飞行模式无关)时是完全正常的!也不会锁死在一个目标。

因为SWGB用附加单位给城堡增加了防空攻击,基本可以肯定开发者重写了附加单位的攻击判断代码,对空中单位单独处理。现在只要能找到这段代码改一下判断条件,就可以让附加单位完美gun & run,而且研究下肯定能增进对程序机制的了解。。。

2。只暴力修改坐标,和濒死单位强制进驻一样,单位的视野和图像还是留在原地,导致1)做不出车体移动,炮塔旋转攻击的效果。2)视野留在原地虽然完全不影响对空中单位的攻击判断,但是很讨厌。。。 如果设置视野为0则只有被攻击的时候才会自动反击也很讨厌。。。(话说或许能利用这个作出绝地武士光剑反弹的效果?)

不知道视野和图像的机制是什么样的,如果是存储在玩家全局数据里,遇到有单位移动的event才调取具体单位坐标就很难改了。。。 up1.5的传送解决这个了吗?

3。找到设置了飞行模式的单位的寻路pathfinding了,在0x004146F0,语句都一样,可以直接调用改坐标代码。现在只要能解决上面两个问题就万事大吉了。。。
https://s2.ax1x.com/2019/09/19/nqgF0g.md.jpg


我是谁004 发表于 2019-9-19 14:03:29

UBR365K 发表于 2019-9-19 13:35
又做了一些测试,
1。SWGB中当附加单位攻击地面目标时也会有忽视射程的问题,但是当攻击空中目标(单位类型 ...

您如果只研究SW的话,那就无法与帝国2联系起来了。
1.5能传送是因为本来就有这么一个传送单位的子程序,所以自然可以调用。再加上停止单位行为的代码(当然这个问题下不需要),就可以完美地传送。
昨天我又进行了研制,现在可以在指派主体的时候,让附加单位也指定目标。后续还会考虑停止和对地攻击时的指令。
我还发现,附加单位的坐标偏移的绝对值不能小于0.5,否则会出问题。
顺便,那不是hit & run么?
页: [1]
查看完整版本: 关于边移动边射击[SWGB]