Leaderboard
Popular Content
Showing content with the highest reputation on 02/27/2024 in all areas
-
Finally I managed Sandworm behaviour! Did you remember the spawning Fremen Warriors from Atreides/Fremen Palace as Special Weapon? Spawned units are set on Hunt command by default (expected by code) so a spawned Sandworm on Hunt command together Warriors, it starts to swallow them before they start to go against enemies! So I "say" to code that Warrior/Warriors typeIndex (04 & 02) aren't valid targets (0 is returned): seg031:14F0 loc_29850: ; Integer Subtraction seg031:14F0 83 EC 04 sub sp, 4 seg031:14F3 56 push si seg031:14F4 57 push di seg031:14F5 33 F6 xor si, si ; Logical Exclusive OR seg031:14F7 8B 46 06 mov ax, word ptr [bp+pUnitGamePtr] seg031:14FA 0B 46 08 or ax, word ptr [bp+pUnitGamePtr+2] ; Logical Inclusive OR seg031:14FD 74 08 jz short ret0 ; Jump if Zero (ZF=1) seg031:14FF 8B 46 0A mov ax, word ptr [bp+unitGamePtr] seg031:1502 0B 46 0C or ax, word ptr [bp+unitGamePtr+2] ; Logical Inclusive OR seg031:1505 75 05 jnz short unitCheck ; Jump if Not Zero (ZF=0) seg031:1507 seg031:1507 ret0: ; CODE XREF: calcTime?Distance?+10 j seg031:1507 33 C0 xor ax, ax ; Logical Exclusive OR seg031:1509 seg031:1509 loc_29869: ; CODE XREF: calcTime?Distance?+FD j seg031:1509 E9 E1 00 jmp Done ; Jump seg031:150C ; --------------------------------------------------------------------------- seg031:150C seg031:150C unitCheck: ; CODE XREF: calcTime?Distance?+18 j seg031:150C C4 5E 0A les bx, [bp+unitGamePtr] ; Load Full Pointer to ES:xx seg031:150F 26 FF 77 0C push es:[bx+_unitGame.mapTileY] ; posY seg031:1513 26 FF 77 0A push es:[bx+_unitGame.mapTileX] ; posX seg031:1517 seg031:1517 loc_29877: ; Call Procedure seg031:1517 9A 86 00 48 0D call mapIndexFromMapTileXY seg031:151C 59 pop cx seg031:151D 59 pop cx seg031:151E 50 push ax ; mapPos seg031:151F 9A 4D 00 D0 42 call j_mapTileCheckIfFogWar ; Call Procedure seg031:1524 59 pop cx seg031:1525 0B C0 or ax, ax ; Logical Inclusive OR seg031:1527 75 03 jnz short loc_2988C ; Jump if Not Zero (ZF=0) seg031:1529 E9 BC 00 jmp retSI ; Jump seg031:152C ; --------------------------------------------------------------------------- seg031:152C seg031:152C loc_2988C: ; CODE XREF: calcTime?Distance?+3A j seg031:152C C4 5E 0A les bx, [bp+unitGamePtr] ; Load Full Pointer to ES:xx seg031:152F 26 8A 47 02 mov al, es:[bx+_unitGame.typeIndex] seg031:1533 98 cbw ; AL -> AX (with sign) seg031:1537 8B F8 mov di, ax seg031:1537 90 nop ; No Operation seg031:1534 BA 5A 00 mov dx, size _unitData seg031:1537 F7 EA imul dx ; Signed Multiply seg031:1539 05 00 00 add ax, 0 ; Add seg031:153C C7 46 FE 10 2B mov word ptr [bp+unitDataPtr+2], seg seg130 seg031:1541 89 46 FC mov word ptr [bp+unitDataPtr], ax seg031:1544 33 F6 xor si, si ; Logical Exclusive OR seg031:1546 C4 5E 0A les bx, [bp+unitGamePtr] ; Load Full Pointer to ES:xx seg031:1549 26 FF 77 0C push es:[bx+_unitGame.mapTileY] ; posY seg031:154D 26 FF 77 0A push es:[bx+_unitGame.mapTileX] ; posX seg031:1551 9A 86 00 48 1D call mapIndexFromMapTileXY ; Call Procedure seg031:1556 59 pop cx seg031:1557 59 pop cx seg031:1558 50 push ax ; mapPosition seg031:1559 9A 61 00 D0 42 call j_mapTileTypeGet ; Call Procedure seg031:155E 59 pop cx seg031:155F seg031:155F loc_298BF: seg031:155F BA 1C 00 mov dx, 1Ch seg031:1562 seg031:1562 loc_298C2: ; Signed Multiply seg031:1562 F7 EA imul dx seg031:1564 8B D8 mov bx, ax seg031:1566 83 BF 40 3A 00 cmp word_46E60[bx], 0 ; Compare Two Operands seg031:156B 74 7B jz short retSI ; Jump if Zero (ZF=1) seg031:156D C4 5E FC les bx, [bp+unitDataPtr] ; Load Full Pointer to ES:xx seg031:1570 seg031:1570 loc_298D0: seg031:1570 26 8B 5F 3C mov bx, es:[bx+_unitData.MovementType] seg031:1574 83 FB 03 cmp bx, 3 ; switch 4 cases seg031:1577 77 14 ja short loc_298EF ; default seg031:1579 D1 E3 shl bx, 1 ; Shift Logical Left seg031:157B seg031:157B loc_298DB: ; switch jump seg031:157B 2E FF A7 F3 15 jmp cs:off_29953[bx] seg031:1580 seg031:1580 Tracked: ; DATA XREF: seg031:off_29953 o seg031:1580 BE E8 03 mov si, 3E8h ; case 0x1 seg031:1583 EB 08 jmp short loc_298EF ; Jump seg031:1585 ; --------------------------------------------------------------------------- seg031:1585 seg031:1585 Foot: ; CODE XREF: calcTime?Distance?:loc_298DB j seg031:1585 ; DATA XREF: seg031:off_29953 o seg031:1585 BE 64 00 mov si, 64h ; 'd' ; case 0x0 seg031:1588 EB 03 jmp short loc_298EF ; Jump seg031:158A ; --------------------------------------------------------------------------- seg031:158A seg031:158A Wheeled: ; CODE XREF: calcTime?Distance?:loc_298DB j seg031:158A ; DATA XREF: seg031:off_29953 o seg031:158A BE 88 13 mov si, 1388h ; case 0x3 seg031:158D EB 04 jmp short loc_298F3 ; Jump seg031:158F ; --------------------------------------------------------------------------- seg031:158F seg031:158F loc_298EF: ; CODE XREF: calcTime?Distance?+8A j seg031:1593 83 FF 02 cmp di, 2 ; Compare Two Operands seg031:156B 74 05 jz short caseFremen ; Jump if Zero (ZF=1) seg031:1593 83 FF 04 cmp di, 4 ; Compare Two Operands seg031:156B 75 02 jnz short loc_298F3 ; Jump if Not Zero (ZF=0) seg031:1593 caseFremen: seg031:158F 33 F6 xor si, si ; default seg031:1591 EB 00 jmp short $+2 ; Jump seg031:1593 seg031:1593 loc_298F3: ; CODE XREF: calcTime?Distance?+96 j seg031:1593 ; calcTime?Distance?+9B j ... seg031:1593 C4 5E 0A les bx, [bp+unitGamePtr] ; Load Full Pointer to ES:xx seg031:1596 26 80 7F 6A 00 cmp es:[bx+_unitGame.speed3], 0 ; Compare Two Operands seg031:159B 75 07 jnz short loc_29907 ; Jump if Not Zero (ZF=0) seg031:159D C4 5E 0A les bx, [bp+unitGamePtr] ; Load Full Pointer to ES:xx seg031:15A0 26 80 7F 51 00 cmp es:[bx+_unitGame.weaponCooldownTimer], 0 ; Compare Two Operands seg031:15A5 74 04 jz short loc_2990B ; Jump if Zero (ZF=1) seg031:15A7 seg031:15A7 loc_29907: ; CODE XREF: calcTime?Distance?+AE j seg031:15A7 B1 02 mov cl, 2 seg031:15A9 D3 E6 shl si, cl ; Shift Logical Left seg031:15AB seg031:15AB loc_2990B: ; CODE XREF: calcTime?Distance?+B8 j seg031:15AB C4 5E 0A les bx, [bp+unitGamePtr] ; Load Full Pointer to ES:xx seg031:15AE seg031:15AE loc_2990E: ; buildingPosY seg031:15AE 26 FF 77 0C push es:[bx+_unitGame.mapTileY] seg031:15B2 seg031:15B2 loc_29912: ; buildingPosX seg031:15B2 26 FF 77 0A push es:[bx+_unitGame.mapTileX] seg031:15B6 C4 5E 06 les bx, [bp+pUnitGamePtr] ; Load Full Pointer to ES:xx seg031:15B9 26 FF 77 0C push es:[bx+_unitGame.mapTileY] ; unitPosY seg031:15BD seg031:15BD loc_2991D: ; unitPosX seg031:15BD 26 FF 77 0A push es:[bx+_unitGame.mapTileX] seg031:15C1 seg031:15C1 loc_29921: ; Call Procedure seg031:15C1 9A 04 01 48 1D call getDistance? seg031:15C6 83 C4 08 add sp, 8 ; Add seg031:15C9 8B F8 mov di, ax seg031:15CB 0B FF or di, di ; Logical Inclusive OR seg031:15CD 74 0B jz short loc_2993A ; Jump if Zero (ZF=1) seg031:15CF 0B F6 or si, si ; Logical Inclusive OR seg031:15D1 seg031:15D1 loc_29931: ; Jump if Zero (ZF=1) seg031:15D1 74 07 jz short loc_2993A seg031:15D3 8B C6 mov ax, si seg031:15D5 99 cwd ; AX -> DX:AX (with sign) seg031:15D6 seg031:15D6 loc_29936: ; Signed Divide seg031:15D6 F7 FF idiv di seg031:15D8 8B F0 mov si, ax seg031:15DA seg031:15DA loc_2993A: ; CODE XREF: calcTime?Distance?+E0 j seg031:15DA ; calcTime?Distance?:loc_29931 j seg031:15DA 83 FF 02 cmp di, 2 ; Compare Two Operands seg031:15DD 7D 09 jge short retSI ; Jump if Greater or Equal (SF=OF) seg031:15DF BA 02 00 mov dx, 2 seg031:15E2 8B C6 mov ax, si seg031:15E4 F7 EA imul dx ; Signed Multiply seg031:15E6 8B F0 mov si, ax seg031:15E8 seg031:15E8 retSI: ; CODE XREF: calcTime?Distance?+3C j seg031:15E8 ; calcTime?Distance?+7E j ... seg031:15E8 8B C6 mov ax, si seg031:15EA E9 1C FF jmp loc_29869 ; Jump Only for expert players! ;)1 point