Due to this excellent support the analysis of sub_4A6238 is finished and we have now full control over the mechanics.
sub_53EF90 locks/unlocks tactical combat commands (ebx: 0=lock, 1=unlock / edx: command-ID)
Default for each valid command in combat.mnu is unlocked (for all groups! i.e. this happens if not referred in sub_4A6238 e.g. solo/group cloak 08/6C & withdraw 0B/6F)
After this, the available commands get unlocked for each combat group (see code below).
: (note changing combat group via ship function requires major code alterations at various locations)
edi (base for some command-IDs) is 0 in solo mode resp. 64h in group mode
Code: Select all
AUTO:004A6331 lea edx, [esp+8]
AUTO:004A6335 mov al, [esp+150h]
AUTO:004A633C call read_shiplist_sst
AUTO:004A6341 mov edx, [esp+70h]
AUTO:004A6345 cmp dx, 7
AUTO:004A6349 jnz solo_mode__lock_station_commands
AUTO:004A634F
AUTO:004A634F station__lock_ship_commands:
AUTO:004A634F mov edx, 1
AUTO:004A6354 mov eax, [ecx+38h]
AUTO:004A6357 xor ebx, ebx
AUTO:004A6359 call lock_unlock_TC_command
AUTO:004A635E mov edx, 2
AUTO:004A6363 mov eax, [ecx+38h]
AUTO:004A6366 xor ebx, ebx
AUTO:004A6368 call lock_unlock_TC_command
AUTO:004A636D mov edx, 3
AUTO:004A6372 mov eax, [ecx+38h]
AUTO:004A6375 xor ebx, ebx
AUTO:004A6377 call lock_unlock_TC_command
AUTO:004A637C mov edx, 4
AUTO:004A6381 mov eax, [ecx+38h]
AUTO:004A6384 xor ebx, ebx
AUTO:004A6386 call lock_unlock_TC_command
AUTO:004A638B mov edx, 7
AUTO:004A6390 mov eax, [ecx+38h]
AUTO:004A6393 xor ebx, ebx
AUTO:004A6395 call lock_unlock_TC_command
AUTO:004A639A mov edx, 5
AUTO:004A639F mov eax, [ecx+38h]
AUTO:004A63A2 xor ebx, ebx
AUTO:004A63A4 call lock_unlock_TC_command
AUTO:004A63A9 mov edx, 6
AUTO:004A63AE mov eax, [ecx+38h]
AUTO:004A63B1 xor ebx, ebx
AUTO:004A63B3 call lock_unlock_TC_command
AUTO:004A63B8 mov edx, 0Ch
AUTO:004A63BD mov eax, [ecx+38h]
AUTO:004A63C0 xor ebx, ebx
AUTO:004A63C2 call lock_unlock_TC_command
AUTO:004A63C7 mov edx, 0Dh
AUTO:004A63CC mov eax, [ecx+38h]
AUTO:004A63CF xor ebx, ebx
AUTO:004A63D1 call lock_unlock_TC_command
AUTO:004A63D6 mov edx, 9
AUTO:004A63DB mov eax, [ecx+38h]
AUTO:004A63DE xor ebx, ebx
AUTO:004A63E0 call lock_unlock_TC_command
AUTO:004A63E5 mov edx, 0Ah
AUTO:004A63EA mov eax, [ecx+38h]
AUTO:004A63ED xor ebx, ebx
AUTO:004A63EF call lock_unlock_TC_command
AUTO:004A63F4 mov edx, 65h
AUTO:004A63F9 mov eax, [ecx+38h]
AUTO:004A63FC xor ebx, ebx
AUTO:004A63FE call lock_unlock_TC_command
AUTO:004A6403 mov edx, 66h
AUTO:004A6408 mov eax, [ecx+38h]
AUTO:004A640B xor ebx, ebx
AUTO:004A640D call lock_unlock_TC_command
AUTO:004A6412 mov edx, 67h
AUTO:004A6417 mov eax, [ecx+38h]
AUTO:004A641A xor ebx, ebx
AUTO:004A641C call lock_unlock_TC_command
AUTO:004A6421 mov edx, 68h
AUTO:004A6426 mov eax, [ecx+38h]
AUTO:004A6429 xor ebx, ebx
AUTO:004A642B call lock_unlock_TC_command
AUTO:004A6430 mov edx, 6Bh
AUTO:004A6435 mov eax, [ecx+38h]
AUTO:004A6438 xor ebx, ebx
AUTO:004A643A call lock_unlock_TC_command
AUTO:004A643F mov edx, 69h
AUTO:004A6444 mov eax, [ecx+38h]
AUTO:004A6447 xor ebx, ebx
AUTO:004A6449 call lock_unlock_TC_command
AUTO:004A644E mov edx, 6Ah
AUTO:004A6453 mov eax, [ecx+38h]
AUTO:004A6456 xor ebx, ebx
AUTO:004A6458 call lock_unlock_TC_command
AUTO:004A645D mov edx, 70h
AUTO:004A6462 mov eax, [ecx+38h]
AUTO:004A6465 xor ebx, ebx
AUTO:004A6467 call lock_unlock_TC_command
AUTO:004A646C mov edx, 71h
AUTO:004A6471 mov eax, [ecx+38h]
AUTO:004A6474 xor ebx, ebx
AUTO:004A6476 call lock_unlock_TC_command
AUTO:004A647B mov edx, 6Dh
AUTO:004A6480 mov eax, [ecx+38h]
AUTO:004A6483 xor ebx, ebx
AUTO:004A6485 call lock_unlock_TC_command
AUTO:004A648A mov edx, 6Eh
AUTO:004A648F mov eax, [ecx+38h]
AUTO:004A6492 xor ebx, ebx
AUTO:004A6494 call lock_unlock_TC_command
AUTO:004A6499 mov ebx, 1
AUTO:004A649E mov edx, 0C8h
AUTO:004A64A3 mov eax, [ecx+38h]
AUTO:004A64A6 call lock_unlock_TC_command
AUTO:004A64AB mov ebx, 1
AUTO:004A64B0 mov edx, 0C9h
AUTO:004A64B5 mov eax, [ecx+38h]
AUTO:004A64B8 call lock_unlock_TC_command
AUTO:004A64BD mov edx, 384h
AUTO:004A64C2 mov eax, [ecx+38h]
AUTO:004A64C5 xor ebx, ebx
AUTO:004A64C7 call lock_unlock_TC_command
AUTO:004A64CC mov edx, 385h
AUTO:004A64D1 mov eax, [ecx+38h]
AUTO:004A64D4 xor ebx, ebx
AUTO:004A64D6
AUTO:004A64D6 last_command_all__lex_select_Order:
AUTO:004A64D6 call lock_unlock_TC_command
====================================================
AUTO:004A65EF solo_mode__lock_station_commands:
AUTO:004A65EF cmp dx, 6
AUTO:004A65F3 jz station__lock_ship_commands
AUTO:004A65F9 mov edx, 0C8h
AUTO:004A65FE mov eax, [ecx+38h]
AUTO:004A6601 xor ebx, ebx
AUTO:004A6603 call lock_unlock_TC_command
AUTO:004A6608 mov edx, 0C9h
AUTO:004A660D mov eax, [ecx+38h]
AUTO:004A6610 xor ebx, ebx
AUTO:004A6612 call lock_unlock_TC_command
AUTO:004A6617 cmp ds:if_group_mode_0, 0
AUTO:004A661E jz group_mode
AUTO:004A6624 mov edx, 65h
AUTO:004A6629 mov eax, [ecx+38h]
AUTO:004A662C xor ebx, ebx
AUTO:004A662E call lock_unlock_TC_command
AUTO:004A6633 mov edx, 66h
AUTO:004A6638 mov eax, [ecx+38h]
AUTO:004A663B xor ebx, ebx
AUTO:004A663D call lock_unlock_TC_command
AUTO:004A6642 mov edx, 67h
AUTO:004A6647 mov eax, [ecx+38h]
AUTO:004A664A xor ebx, ebx
AUTO:004A664C call lock_unlock_TC_command
AUTO:004A6651 mov edx, 68h
AUTO:004A6656 mov eax, [ecx+38h]
AUTO:004A6659 xor ebx, ebx
AUTO:004A665B call lock_unlock_TC_command
AUTO:004A6660 mov edx, 6Bh
AUTO:004A6665 mov eax, [ecx+38h]
AUTO:004A6668 xor ebx, ebx
AUTO:004A666A call lock_unlock_TC_command
AUTO:004A666F mov edx, 69h
AUTO:004A6674 mov eax, [ecx+38h]
AUTO:004A6677 xor ebx, ebx
AUTO:004A6679 call lock_unlock_TC_command
AUTO:004A667E mov edx, 6Ah
AUTO:004A6683 mov eax, [ecx+38h]
AUTO:004A6686 xor ebx, ebx
AUTO:004A6688 call lock_unlock_TC_command
AUTO:004A668D mov edx, 70h
AUTO:004A6692 mov eax, [ecx+38h]
AUTO:004A6695 xor ebx, ebx
AUTO:004A6697 call lock_unlock_TC_command
AUTO:004A669C mov edx, 71h
AUTO:004A66A1 mov eax, [ecx+38h]
AUTO:004A66A4 xor ebx, ebx
AUTO:004A66A6 call lock_unlock_TC_command
AUTO:004A66AB mov edx, 6Dh
AUTO:004A66B0 mov eax, [ecx+38h]
AUTO:004A66B3 xor ebx, ebx
AUTO:004A66B5 call lock_unlock_TC_command
AUTO:004A66BA mov edx, 6Eh
AUTO:004A66BF mov eax, [ecx+38h]
AUTO:004A66C2 xor ebx, ebx
AUTO:004A66C4 call lock_unlock_TC_command
AUTO:004A66C9 mov edx, 384h
AUTO:004A66CE mov eax, [ecx+38h]
AUTO:004A66D1 xor ebx, ebx
AUTO:004A66D3 call lock_unlock_TC_command
AUTO:004A66D8 mov ebx, 1
AUTO:004A66DD mov edx, 385h
AUTO:004A66E2 mov eax, [ecx+38h]
AUTO:004A66E5 xor edi, edi
AUTO:004A66E7
AUTO:004A66E7 lock_ship_commands_2:
AUTO:004A66E7 call lock_unlock_TC_command
AUTO:004A66EC lea edx, [edi+1]
AUTO:004A66EF mov eax, [ecx+38h]
AUTO:004A66F2 xor ebx, ebx
AUTO:004A66F4 call lock_unlock_TC_command
AUTO:004A66F9 lea edx, [edi+2]
AUTO:004A66FC mov eax, [ecx+38h]
AUTO:004A66FF xor ebx, ebx
AUTO:004A6701 call lock_unlock_TC_command
AUTO:004A6706 lea edx, [edi+3]
AUTO:004A6709 mov eax, [ecx+38h]
AUTO:004A670C xor ebx, ebx
AUTO:004A670E call lock_unlock_TC_command
AUTO:004A6713 lea edx, [edi+4]
AUTO:004A6716 mov eax, [ecx+38h]
AUTO:004A6719 xor ebx, ebx
AUTO:004A671B call lock_unlock_TC_command
AUTO:004A6720 lea edx, [edi+5]
AUTO:004A6723 mov eax, [ecx+38h]
AUTO:004A6726 xor ebx, ebx
AUTO:004A6728 call lock_unlock_TC_command
AUTO:004A672D lea edx, [edi+6]
AUTO:004A6730 mov eax, [ecx+38h]
AUTO:004A6733 xor ebx, ebx
AUTO:004A6735 call lock_unlock_TC_command
AUTO:004A673A mov esi, [esp+70h]
AUTO:004A673E cmp si, 9 ; switch 10 cases
AUTO:004A6742 ja short unlock_shared_commands_ships ; default
AUTO:004A6744 xor eax, eax
AUTO:004A6746 mov ax, si
AUTO:004A6749 jmp combat_groups_switch[eax*4] ; switch jump
AUTO:004A6750
AUTO:004A6750 fast_group_commands_:
AUTO:004A6750 xor esi, esi ; case 0x0
AUTO:004A6752 mov ebp, 1
AUTO:004A6757
AUTO:004A6757 index_loop_fast_group:
AUTO:004A6757 mov ebx, ebp
AUTO:004A6759 mov edx, ds:fast_group_commands[esi]
AUTO:004A675F mov eax, [ecx+38h]
AUTO:004A6762 add edx, edi
AUTO:004A6764 add esi, 4
AUTO:004A6767 call lock_unlock_TC_command
AUTO:004A676C cmp esi, 0Ch
AUTO:004A676F jnz short index_loop_fast_group
AUTO:004A6771 lea eax, [eax+0]
AUTO:004A6774
AUTO:004A6774 unlock_shared_commands_ships:
AUTO:004A6774
AUTO:004A6774 mov ebx, 1 ; default
AUTO:004A6779 lea edx, [edi+7]
AUTO:004A677C mov eax, [ecx+38h]
AUTO:004A677F call lock_unlock_TC_command
AUTO:004A6784 mov ebx, 1
AUTO:004A6789 lea edx, [edi+9]
AUTO:004A678C mov eax, [ecx+38h]
AUTO:004A678F call lock_unlock_TC_command
AUTO:004A6794 mov ebx, 1
AUTO:004A6799 lea edx, [edi+0Ah]
AUTO:004A679C mov eax, [ecx+38h]
AUTO:004A679F call lock_unlock_TC_command
AUTO:004A67A4 mov ebx, 1
AUTO:004A67A9 lea edx, [edi+0Ch]
AUTO:004A67AC mov eax, [ecx+38h]
AUTO:004A67AF jmp last_command_all__lex_select_Order
AUTO:004A67B4 ; ---------------------------------------------------------------------------
AUTO:004A67B4
AUTO:004A67B4 group_mode:
AUTO:004A67B4 mov edx, 1
AUTO:004A67B9 mov eax, [ecx+38h]
AUTO:004A67BC xor ebx, ebx
AUTO:004A67BE call lock_unlock_TC_command
AUTO:004A67C3 mov edx, 2
AUTO:004A67C8 mov eax, [ecx+38h]
AUTO:004A67CB xor ebx, ebx
AUTO:004A67CD call lock_unlock_TC_command
AUTO:004A67D2 mov edx, 3
AUTO:004A67D7 mov eax, [ecx+38h]
AUTO:004A67DA xor ebx, ebx
AUTO:004A67DC call lock_unlock_TC_command
AUTO:004A67E1 mov edx, 4
AUTO:004A67E6 mov eax, [ecx+38h]
AUTO:004A67E9 xor ebx, ebx
AUTO:004A67EB call lock_unlock_TC_command
AUTO:004A67F0 mov edx, 7
AUTO:004A67F5 mov eax, [ecx+38h]
AUTO:004A67F8 xor ebx, ebx
AUTO:004A67FA call lock_unlock_TC_command
AUTO:004A67FF mov edx, 5
AUTO:004A6804 mov eax, [ecx+38h]
AUTO:004A6807 xor ebx, ebx
AUTO:004A6809 call lock_unlock_TC_command
AUTO:004A680E mov edx, 6
AUTO:004A6813 mov eax, [ecx+38h]
AUTO:004A6816 xor ebx, ebx
AUTO:004A6818 call lock_unlock_TC_command
AUTO:004A681D mov edx, 0Ch
AUTO:004A6822 mov eax, [ecx+38h]
AUTO:004A6825 xor ebx, ebx
AUTO:004A6827 call lock_unlock_TC_command
AUTO:004A682C mov edx, 0Dh
AUTO:004A6831 mov eax, [ecx+38h]
AUTO:004A6834 xor ebx, ebx
AUTO:004A6836 call lock_unlock_TC_command
AUTO:004A683B mov edx, 9
AUTO:004A6840 mov eax, [ecx+38h]
AUTO:004A6843 xor ebx, ebx
AUTO:004A6845 call lock_unlock_TC_command
AUTO:004A684A mov edx, 0Ah
AUTO:004A684F mov eax, [ecx+38h]
AUTO:004A6852 xor ebx, ebx
AUTO:004A6854 call lock_unlock_TC_command
AUTO:004A6859 mov ebx, 1
AUTO:004A685E mov edx, 384h
AUTO:004A6863 mov eax, [ecx+38h]
AUTO:004A6866 call lock_unlock_TC_command
AUTO:004A686B mov edx, 385h
AUTO:004A6870 mov eax, [ecx+38h]
AUTO:004A6873 xor ebx, ebx
AUTO:004A6875 mov edi, 64h
AUTO:004A687A jmp lock_ship_commands_2
AUTO:004A687F ; ---------------------------------------------------------------------------
AUTO:004A687F
AUTO:004A687F support_group_commands_:
AUTO:004A687F
AUTO:004A687F cmp word ptr [esp+120h], 3 ; case 0x5
AUTO:004A6888 jnz unlock_shared_commands_ships ; default
AUTO:004A688E mov ebx, 1
AUTO:004A6893 lea edx, [edi+2]
AUTO:004A6896 mov eax, [ecx+38h]
AUTO:004A6899 call lock_unlock_TC_command
AUTO:004A689E jmp unlock_shared_commands_ships ; default
AUTO:004A68A3 ; ---------------------------------------------------------------------------
AUTO:004A68A3
AUTO:004A68A3 slow_group_commands_:
AUTO:004A68A3
AUTO:004A68A3 xor esi, esi ; case 0x2
AUTO:004A68A5 mov ebp, 1
AUTO:004A68AA
AUTO:004A68AA index_loop_slow_group:
AUTO:004A68AA mov ebx, ebp
AUTO:004A68AC mov edx, ds:slow_group_commands[esi]
AUTO:004A68B2 mov eax, [ecx+38h]
AUTO:004A68B5 add edx, edi
AUTO:004A68B7 add esi, 4
AUTO:004A68BA call lock_unlock_TC_command
AUTO:004A68BF cmp esi, 10h
AUTO:004A68C2 jnz short index_loop_slow_group
AUTO:004A68C4 jmp unlock_shared_commands_ships ; default
AUTO:004A68C9 ; ---------------------------------------------------------------------------
AUTO:004A68C9
AUTO:004A68C9 strike_group_commands_:
AUTO:004A68C9
AUTO:004A68C9 xor esi, esi ; case 0x3
AUTO:004A68CB mov ebp, 1
AUTO:004A68D0
AUTO:004A68D0 index_loop_strike_group:
AUTO:004A68D0 mov ebx, ebp
AUTO:004A68D2 mov edx, ds:strike_group_commands[esi]
AUTO:004A68D8 mov eax, [ecx+38h]
AUTO:004A68DB add edx, edi
AUTO:004A68DD add esi, 4
AUTO:004A68E0 call lock_unlock_TC_command
AUTO:004A68E5 cmp esi, 0Ch
AUTO:004A68E8 jnz short index_loop_strike_group
AUTO:004A68EA jmp unlock_shared_commands_ships ; default
Optimising sub_4A6238, via smarter code sharing & using loops, allows fixing command ship bug and proper implementation of cloak & hold (+ if desired withdraw 0B/6F).