diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2017-05-10 21:54:23 -0500 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2017-05-10 19:54:23 -0700 |
commit | a030e780e70d9dcd023835449093485358c73629 (patch) | |
tree | 880e3a63b9f1091a90408445b223552b25fcc9fb | |
parent | a3001a290e35296b016bc55be569a611141ce88e (diff) |
decompile sub_800F298 (#290)
decompile sub_800F298
-rw-r--r-- | asm/battle_2.s | 690 | ||||
-rw-r--r-- | src/battle_2.c | 297 |
2 files changed, 283 insertions, 704 deletions
diff --git a/asm/battle_2.s b/asm/battle_2.s index 300c53114..22ede0c37 100644 --- a/asm/battle_2.s +++ b/asm/battle_2.s @@ -6,696 +6,6 @@ .text - thumb_func_start sub_800F298 -sub_800F298: @ 800F298 - push {r4-r7,lr} - mov r7, r8 - push {r7} - bl GetMultiplayerId - lsls r0, 24 - lsrs r6, r0, 24 - ldr r0, _0800F2D0 @ =0x02000000 - ldr r1, _0800F2D4 @ =0x000160cb - adds r0, r1 - strb r6, [r0] - bl RunTasks - bl AnimateSprites - bl BuildOamBuffer - ldr r0, _0800F2D8 @ =gUnknown_02024D1E - ldrb r0, [r0] - cmp r0, 0x7 - bls _0800F2C4 - b _0800F7E0 -_0800F2C4: - lsls r0, 2 - ldr r1, _0800F2DC @ =_0800F2E0 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0800F2D0: .4byte 0x02000000 -_0800F2D4: .4byte 0x000160cb -_0800F2D8: .4byte gUnknown_02024D1E -_0800F2DC: .4byte _0800F2E0 - .align 2, 0 -_0800F2E0: - .4byte _0800F300 - .4byte _0800F340 - .4byte _0800F4DE - .4byte _0800F504 - .4byte _0800F5F8 - .4byte _0800F61C - .4byte _0800F78C - .4byte _0800F7A4 -_0800F300: - ldr r0, _0800F338 @ =gReceivedRemoteLinkPlayers - ldrb r0, [r0] - cmp r0, 0 - bne _0800F30A - b _0800F7E0 -_0800F30A: - bl sub_8007ECC - lsls r0, 24 - cmp r0, 0 - bne _0800F316 - b _0800F7E0 -_0800F316: - ldr r4, _0800F33C @ =0x02000000 - movs r0, 0x1 - strb r0, [r4] - strb r0, [r4, 0x1] - bl sub_800E9EC - bl sub_800EAAC - bl bitmask_all_link_players_but_self - lsls r0, 24 - lsrs r0, 24 - adds r1, r4, 0 - movs r2, 0x20 - bl SendBlock - b _0800F770 - .align 2, 0 -_0800F338: .4byte gReceivedRemoteLinkPlayers -_0800F33C: .4byte 0x02000000 -_0800F340: - bl GetBlockReceivedStatus - movs r1, 0xF - ands r1, r0 - cmp r1, 0xF - beq _0800F34E - b _0800F7E0 -_0800F34E: - bl ResetBlockReceivedFlags - movs r4, 0 - ldr r0, _0800F36C @ =gBlockRecvBuffer - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 1 - cmp r1, r0 - bne _0800F380 - cmp r6, 0 - bne _0800F374 - ldr r0, _0800F370 @ =gBattleTypeFlags - ldrh r1, [r0] - movs r2, 0xC - b _0800F37A - .align 2, 0 -_0800F36C: .4byte gBlockRecvBuffer -_0800F370: .4byte gBattleTypeFlags -_0800F374: - ldr r0, _0800F3B0 @ =gBattleTypeFlags - ldrh r1, [r0] - movs r2, 0x8 -_0800F37A: - orrs r1, r2 - strh r1, [r0] - adds r4, 0x1 -_0800F380: - cmp r4, 0 - bne _0800F41C - movs r2, 0 - ldr r1, _0800F3B4 @ =gBlockRecvBuffer - adds r5, r1, 0 - movs r3, 0x80 - lsls r3, 1 -_0800F38E: - adds r1, r3 - adds r2, 0x1 - cmp r2, 0x3 - bgt _0800F39E - ldrh r0, [r5] - ldrh r7, [r1] - cmp r0, r7 - beq _0800F38E -_0800F39E: - cmp r2, 0x4 - bne _0800F3C4 - cmp r6, 0 - bne _0800F3B8 - ldr r0, _0800F3B0 @ =gBattleTypeFlags - ldrh r1, [r0] - movs r2, 0xC - b _0800F3BE - .align 2, 0 -_0800F3B0: .4byte gBattleTypeFlags -_0800F3B4: .4byte gBlockRecvBuffer -_0800F3B8: - ldr r0, _0800F408 @ =gBattleTypeFlags - ldrh r1, [r0] - movs r2, 0x8 -_0800F3BE: - orrs r1, r2 - strh r1, [r0] - adds r4, 0x1 -_0800F3C4: - cmp r4, 0 - bne _0800F41C - ldr r0, _0800F40C @ =gBlockRecvBuffer - ldrh r2, [r0] - ldr r1, _0800F410 @ =0x00000101 - adds r3, r0, 0 - ldr r5, _0800F408 @ =gBattleTypeFlags - cmp r2, r1 - beq _0800F3F6 -_0800F3D6: - lsls r0, r4, 8 - adds r0, r3 - ldrh r0, [r0] - ldr r1, _0800F410 @ =0x00000101 - cmp r0, r1 - bls _0800F3E6 - cmp r4, r6 - bne _0800F3FE -_0800F3E6: - adds r4, 0x1 - cmp r4, 0x3 - bgt _0800F3FE - lsls r0, r4, 8 - adds r0, r3 - ldrh r0, [r0] - cmp r0, r1 - bne _0800F3D6 -_0800F3F6: - cmp r4, r6 - beq _0800F3D6 - cmp r4, r6 - bge _0800F3D6 -_0800F3FE: - cmp r4, 0x4 - bne _0800F414 - ldrh r0, [r5] - movs r1, 0xC - b _0800F418 - .align 2, 0 -_0800F408: .4byte gBattleTypeFlags -_0800F40C: .4byte gBlockRecvBuffer -_0800F410: .4byte 0x00000101 -_0800F414: - ldrh r0, [r5] - movs r1, 0x8 -_0800F418: - orrs r0, r1 - strh r0, [r5] -_0800F41C: - bl sub_800EB08 - ldr r0, _0800F474 @ =0x0201d000 - ldr r1, _0800F478 @ =gPlayerParty - movs r2, 0x96 - lsls r2, 1 - bl memcpy - ldr r0, _0800F47C @ =sub_800DE30 - movs r1, 0 - bl CreateTask - lsls r0, 24 - lsrs r0, 24 - ldr r2, _0800F480 @ =gTasks - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 3 - adds r1, r2 - movs r2, 0 - movs r0, 0x87 - lsls r0, 1 - strh r0, [r1, 0xA] - movs r0, 0x5A - strh r0, [r1, 0xC] - strh r2, [r1, 0x12] - strh r2, [r1, 0xE] - strh r2, [r1, 0x10] - adds r2, r1, 0 - ldr r0, _0800F484 @ =gBlockRecvBuffer - adds r3, r0, 0x2 - ldr r6, _0800F488 @ =gLinkPlayers - movs r5, 0x3F - movs r7, 0x80 - lsls r7, 1 - movs r4, 0x3 -_0800F464: - ldrh r0, [r6, 0x18] - cmp r0, 0x1 - beq _0800F49E - cmp r0, 0x1 - bgt _0800F48C - cmp r0, 0 - beq _0800F496 - b _0800F4C4 - .align 2, 0 -_0800F474: .4byte 0x0201d000 -_0800F478: .4byte gPlayerParty -_0800F47C: .4byte sub_800DE30 -_0800F480: .4byte gTasks -_0800F484: .4byte gBlockRecvBuffer -_0800F488: .4byte gLinkPlayers -_0800F48C: - cmp r0, 0x2 - beq _0800F4A6 - cmp r0, 0x3 - beq _0800F4B6 - b _0800F4C4 -_0800F496: - ldrh r0, [r3] - adds r1, r5, 0 - ands r1, r0 - b _0800F4AE -_0800F49E: - ldrh r0, [r3] - adds r1, r5, 0 - ands r1, r0 - b _0800F4BE -_0800F4A6: - ldrh r0, [r3] - adds r1, r5, 0 - ands r1, r0 - lsls r1, 6 -_0800F4AE: - ldrh r0, [r2, 0xE] - orrs r1, r0 - strh r1, [r2, 0xE] - b _0800F4C4 -_0800F4B6: - ldrh r0, [r3] - adds r1, r5, 0 - ands r1, r0 - lsls r1, 6 -_0800F4BE: - ldrh r0, [r2, 0x10] - orrs r1, r0 - strh r1, [r2, 0x10] -_0800F4C4: - adds r3, r7 - adds r6, 0x1C - subs r4, 0x1 - cmp r4, 0 - bge _0800F464 - bl ZeroPlayerPartyMons - bl ZeroEnemyPartyMons - ldr r1, _0800F4FC @ =gUnknown_02024D1E - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] -_0800F4DE: - bl sub_8007ECC - lsls r0, 24 - cmp r0, 0 - bne _0800F4EA - b _0800F7E0 -_0800F4EA: - bl bitmask_all_link_players_but_self - lsls r0, 24 - lsrs r0, 24 - ldr r1, _0800F500 @ =0x0201d000 - movs r2, 0xC8 - bl SendBlock - b _0800F770 - .align 2, 0 -_0800F4FC: .4byte gUnknown_02024D1E -_0800F500: .4byte 0x0201d000 -_0800F504: - bl GetBlockReceivedStatus - movs r1, 0xF - ands r1, r0 - cmp r1, 0xF - beq _0800F512 - b _0800F7E0 -_0800F512: - bl ResetBlockReceivedFlags - movs r4, 0 - lsls r0, r6, 3 - subs r0, r6 - lsls r0, 2 - mov r8, r0 - ldr r5, _0800F53C @ =gBlockRecvBuffer - movs r7, 0 -_0800F524: - cmp r4, r6 - bne _0800F558 - ldr r0, _0800F540 @ =gLinkPlayers - adds r0, r7, r0 - ldrh r0, [r0, 0x18] - cmp r0, 0x2 - bgt _0800F544 - cmp r0, 0x1 - bge _0800F550 - cmp r0, 0 - beq _0800F548 - b _0800F5E2 - .align 2, 0 -_0800F53C: .4byte gBlockRecvBuffer -_0800F540: .4byte gLinkPlayers -_0800F544: - cmp r0, 0x3 - bne _0800F5E2 -_0800F548: - ldr r0, _0800F54C @ =gPlayerParty - b _0800F5C8 - .align 2, 0 -_0800F54C: .4byte gPlayerParty -_0800F550: - ldr r0, _0800F554 @ =gPlayerParty + 3 * 0x64 - b _0800F5C8 - .align 2, 0 -_0800F554: .4byte gPlayerParty + 3 * 0x64 -_0800F558: - ldr r2, _0800F578 @ =gLinkPlayers - adds r0, r7, r2 - ldrh r1, [r0, 0x18] - movs r3, 0x1 - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _0800F57C - mov r1, r8 - adds r0, r1, r2 - ldrh r1, [r0, 0x18] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _0800F58A - b _0800F5B0 - .align 2, 0 -_0800F578: .4byte gLinkPlayers -_0800F57C: - mov r1, r8 - adds r0, r1, r2 - ldrh r1, [r0, 0x18] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _0800F5B0 -_0800F58A: - adds r0, r7, r2 - ldrh r2, [r0, 0x18] - cmp r2, 0x2 - bgt _0800F59C - cmp r2, 0x1 - bge _0800F5A8 - cmp r2, 0 - beq _0800F5A0 - b _0800F5E2 -_0800F59C: - cmp r2, 0x3 - bne _0800F5E2 -_0800F5A0: - ldr r0, _0800F5A4 @ =gPlayerParty - b _0800F5C8 - .align 2, 0 -_0800F5A4: .4byte gPlayerParty -_0800F5A8: - ldr r0, _0800F5AC @ =gPlayerParty + 3 * 0x64 - b _0800F5C8 - .align 2, 0 -_0800F5AC: .4byte gPlayerParty + 3 * 0x64 -_0800F5B0: - adds r0, r7, r2 - ldrh r2, [r0, 0x18] - cmp r2, 0x2 - bgt _0800F5C2 - cmp r2, 0x1 - bge _0800F5D8 - cmp r2, 0 - beq _0800F5C6 - b _0800F5E2 -_0800F5C2: - cmp r2, 0x3 - bne _0800F5E2 -_0800F5C6: - ldr r0, _0800F5D4 @ =gEnemyParty -_0800F5C8: - adds r1, r5, 0 - movs r2, 0xC8 - bl memcpy - b _0800F5E2 - .align 2, 0 -_0800F5D4: .4byte gEnemyParty -_0800F5D8: - ldr r0, _0800F5F4 @ =gEnemyParty + 3 * 0x64 - adds r1, r5, 0 - movs r2, 0xC8 - bl memcpy -_0800F5E2: - movs r0, 0x80 - lsls r0, 1 - adds r5, r0 - adds r7, 0x1C - adds r4, 0x1 - cmp r4, 0x3 - ble _0800F524 - b _0800F770 - .align 2, 0 -_0800F5F4: .4byte gEnemyParty + 3 * 0x64 -_0800F5F8: - bl sub_8007ECC - lsls r0, 24 - cmp r0, 0 - bne _0800F604 - b _0800F7E0 -_0800F604: - bl bitmask_all_link_players_but_self - lsls r0, 24 - lsrs r0, 24 - ldr r1, _0800F618 @ =0x0201d0c8 - movs r2, 0x64 - bl SendBlock - b _0800F770 - .align 2, 0 -_0800F618: .4byte 0x0201d0c8 -_0800F61C: - bl GetBlockReceivedStatus - movs r1, 0xF - ands r1, r0 - cmp r1, 0xF - beq _0800F62A - b _0800F7E0 -_0800F62A: - bl ResetBlockReceivedFlags - movs r4, 0 - lsls r0, r6, 3 - subs r0, r6 - lsls r0, 2 - mov r8, r0 - ldr r5, _0800F654 @ =gBlockRecvBuffer - movs r7, 0 -_0800F63C: - cmp r4, r6 - bne _0800F670 - ldr r0, _0800F658 @ =gLinkPlayers - adds r0, r7, r0 - ldrh r0, [r0, 0x18] - cmp r0, 0x2 - bgt _0800F65C - cmp r0, 0x1 - bge _0800F668 - cmp r0, 0 - beq _0800F660 - b _0800F6FA - .align 2, 0 -_0800F654: .4byte gBlockRecvBuffer -_0800F658: .4byte gLinkPlayers -_0800F65C: - cmp r0, 0x3 - bne _0800F6FA -_0800F660: - ldr r0, _0800F664 @ =gPlayerParty + 2 * 0x64 - b _0800F6E0 - .align 2, 0 -_0800F664: .4byte gPlayerParty + 2 * 0x64 -_0800F668: - ldr r0, _0800F66C @ =gPlayerParty + 5 * 0x64 - b _0800F6E0 - .align 2, 0 -_0800F66C: .4byte gPlayerParty + 5 * 0x64 -_0800F670: - ldr r2, _0800F690 @ =gLinkPlayers - adds r0, r7, r2 - ldrh r1, [r0, 0x18] - movs r3, 0x1 - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _0800F694 - mov r1, r8 - adds r0, r1, r2 - ldrh r1, [r0, 0x18] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _0800F6A2 - b _0800F6C8 - .align 2, 0 -_0800F690: .4byte gLinkPlayers -_0800F694: - mov r1, r8 - adds r0, r1, r2 - ldrh r1, [r0, 0x18] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _0800F6C8 -_0800F6A2: - adds r0, r7, r2 - ldrh r2, [r0, 0x18] - cmp r2, 0x2 - bgt _0800F6B4 - cmp r2, 0x1 - bge _0800F6C0 - cmp r2, 0 - beq _0800F6B8 - b _0800F6FA -_0800F6B4: - cmp r2, 0x3 - bne _0800F6FA -_0800F6B8: - ldr r0, _0800F6BC @ =gPlayerParty + 2 * 0x64 - b _0800F6E0 - .align 2, 0 -_0800F6BC: .4byte gPlayerParty + 2 * 0x64 -_0800F6C0: - ldr r0, _0800F6C4 @ =gPlayerParty + 5 * 0x64 - b _0800F6E0 - .align 2, 0 -_0800F6C4: .4byte gPlayerParty + 5 * 0x64 -_0800F6C8: - adds r0, r7, r2 - ldrh r2, [r0, 0x18] - cmp r2, 0x2 - bgt _0800F6DA - cmp r2, 0x1 - bge _0800F6F0 - cmp r2, 0 - beq _0800F6DE - b _0800F6FA -_0800F6DA: - cmp r2, 0x3 - bne _0800F6FA -_0800F6DE: - ldr r0, _0800F6EC @ =gEnemyParty + 2 * 0x64 -_0800F6E0: - adds r1, r5, 0 - movs r2, 0x64 - bl memcpy - b _0800F6FA - .align 2, 0 -_0800F6EC: .4byte gEnemyParty + 2 * 0x64 -_0800F6F0: - ldr r0, _0800F77C @ =gEnemyParty + 5 * 0x64 - adds r1, r5, 0 - movs r2, 0x64 - bl memcpy -_0800F6FA: - movs r0, 0x80 - lsls r0, 1 - adds r5, r0 - adds r7, 0x1C - adds r4, 0x1 - cmp r4, 0x3 - ble _0800F63C - ldr r4, _0800F780 @ =gPlayerParty - adds r0, r4, 0 - bl shedinja_something - adds r0, r4, 0 - adds r0, 0x64 - bl shedinja_something - adds r0, r4, 0 - adds r0, 0xC8 - bl shedinja_something - movs r1, 0x96 - lsls r1, 1 - adds r0, r4, r1 - bl shedinja_something - movs r7, 0xC8 - lsls r7, 1 - adds r0, r4, r7 - bl shedinja_something - movs r1, 0xFA - lsls r1, 1 - adds r0, r4, r1 - bl shedinja_something - ldr r4, _0800F784 @ =gEnemyParty - adds r0, r4, 0 - bl shedinja_something - adds r0, r4, 0 - adds r0, 0x64 - bl shedinja_something - adds r0, r4, 0 - adds r0, 0xC8 - bl shedinja_something - subs r7, 0x64 - adds r0, r4, r7 - bl shedinja_something - movs r1, 0xC8 - lsls r1, 1 - adds r0, r4, r1 - bl shedinja_something - adds r7, 0xC8 - adds r0, r4, r7 - bl shedinja_something -_0800F770: - ldr r1, _0800F788 @ =gUnknown_02024D1E - ldrb r0, [r1] - adds r0, 0x1 - strb r0, [r1] - b _0800F7E0 - .align 2, 0 -_0800F77C: .4byte gEnemyParty + 5 * 0x64 -_0800F780: .4byte gPlayerParty -_0800F784: .4byte gEnemyParty -_0800F788: .4byte gUnknown_02024D1E -_0800F78C: - bl sub_800B950 - ldr r0, _0800F7A0 @ =gUnknown_02024D1E - ldrb r1, [r0] - adds r1, 0x1 - movs r2, 0 - strb r1, [r0] - strb r2, [r0, 0x1] - strb r2, [r0, 0x2] - b _0800F7E0 - .align 2, 0 -_0800F7A0: .4byte gUnknown_02024D1E -_0800F7A4: - ldr r0, _0800F7EC @ =gUnknown_02024D1F - adds r1, r0, 0x1 - bl battle_load_something - lsls r0, 24 - cmp r0, 0 - beq _0800F7E0 - ldr r2, _0800F7F0 @ =gUnknown_030042D0 - ldr r1, _0800F7F4 @ =gMain - ldr r0, [r1] - str r0, [r2] - ldr r0, _0800F7F8 @ =sub_8010824 - str r0, [r1] - ldr r0, _0800F7FC @ =sub_800F808 - bl SetMainCallback2 - ldr r3, _0800F800 @ =gBattleTypeFlags - ldrh r2, [r3] - movs r0, 0x2 - ands r0, r2 - cmp r0, 0 - beq _0800F7E0 - ldr r1, _0800F804 @ =gTrainerBattleOpponent - movs r4, 0x80 - lsls r4, 4 - adds r0, r4, 0 - strh r0, [r1] - movs r0, 0x20 - orrs r0, r2 - strh r0, [r3] -_0800F7E0: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0800F7EC: .4byte gUnknown_02024D1F -_0800F7F0: .4byte gUnknown_030042D0 -_0800F7F4: .4byte gMain -_0800F7F8: .4byte sub_8010824 -_0800F7FC: .4byte sub_800F808 -_0800F800: .4byte gBattleTypeFlags -_0800F804: .4byte gTrainerBattleOpponent - thumb_func_end sub_800F298 - thumb_func_start sub_800F808 sub_800F808: @ 800F808 push {lr} diff --git a/src/battle_2.c b/src/battle_2.c index f623b3da2..019d463fd 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -61,6 +61,7 @@ extern u8 ewram[]; #define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0)) #define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4)) #define ewram160CB (ewram[0x160CB]) +#define ewram1D000 ((struct Pokemon *)(ewram + 0x1D000)) extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; extern u8 gUnknown_02024D1E[]; @@ -264,15 +265,15 @@ void sub_800EB08(void) } else { - s32 r8; + s32 numPlayers; struct BattleEnigmaBerry *src; u8 r4; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) - r8 = 4; + numPlayers = 4; else - r8 = 2; - for (i = 0; i < r8; i++) + numPlayers = 2; + for (i = 0; i < numPlayers; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); r4 = gLinkPlayers[i].lp_field_18; @@ -338,20 +339,20 @@ void sub_800EC9C(void) case 1: if ((GetBlockReceivedStatus() & 3) == 3) { - s32 r3; + s32 id; u8 taskId; ResetBlockReceivedFlags(); - r3 = 0; + id = 0; if (gBlockRecvBuffer[0][0] == 0x100) { if (playerId == 0) gBattleTypeFlags |= 12; else gBattleTypeFlags |= 8; - r3++; + id++; } - if (r3 == 0) + if (id == 0) { if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0]) { @@ -359,17 +360,17 @@ void sub_800EC9C(void) gBattleTypeFlags |= 12; else gBattleTypeFlags |= 8; - r3++; + id++; } - if (r3 == 0) + if (id == 0) { - while (r3 < 2) + while (id < 2) { - if (gBlockRecvBuffer[r3][0] > 0x0101 && r3 != playerId) + if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) break; - r3++; + id++; } - if (r3 == 2) + if (id == 2) gBattleTypeFlags |= 12; else gBattleTypeFlags |= 8; @@ -547,3 +548,271 @@ void sub_800F104(void) break; } } + +void sub_800F298(void) +{ + u8 playerId; + s32 id; + + playerId = GetMultiplayerId(); + ewram160CB = playerId; + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + switch (gUnknown_02024D1E[0]) + { + case 0: + if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC()) + { + ewram0.unk0 = 1; + ewram0.unk1 = 1; + sub_800E9EC(); + sub_800EAAC(); + SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20); + gUnknown_02024D1E[0]++; + } + break; + case 1: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + u8 taskId; + + ResetBlockReceivedFlags(); + id = 0; + if (gBlockRecvBuffer[0][0] == 0x100) + { + if (playerId == 0) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + id++; + } + if (id == 0) + { + s32 i; + + for (i = 0; i < MAX_LINK_PLAYERS; i++) + { + if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0]) + break; + } + if (i == MAX_LINK_PLAYERS) + { + if (playerId == 0) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + id++; + } + if (id == 0) + { + while (id < MAX_LINK_PLAYERS) + { + if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId) + if (id < playerId) + break; + if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId) + break; + id++; + } + if (id == MAX_LINK_PLAYERS) + gBattleTypeFlags |= 12; + else + gBattleTypeFlags |= 8; + } + } + sub_800EB08(); + memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3); + taskId = CreateTask(sub_800DE30, 0); + gTasks[taskId].data[1] = 0x10E; + gTasks[taskId].data[2] = 0x5A; + gTasks[taskId].data[5] = 0; + gTasks[taskId].data[3] = 0; + gTasks[taskId].data[4] = 0; + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F; + break; + case 1: + gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F; + break; + case 2: + gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; + break; + case 3: + gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6; + break; + } + } + ZeroPlayerPartyMons(); + ZeroEnemyPartyMons(); + gUnknown_02024D1E[0]++; + goto step_2; + } + break; + case 2: + step_2: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2); + gUnknown_02024D1E[0]++; + } + break; + case 3: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + ResetBlockReceivedFlags(); + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + if (id == playerId) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + } + } + else + { + if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + } + } + else + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + case 1: + case 2: + memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2); + break; + } + } + } + } + gUnknown_02024D1E[0]++; + } + break; + case 4: + if (sub_8007ECC()) + { + SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon)); + gUnknown_02024D1E[0]++; + } + break; + case 5: + if ((GetBlockReceivedStatus() & 0xF) == 0xF) + { + ResetBlockReceivedFlags(); + for (id = 0; id < MAX_LINK_PLAYERS; id++) + { + if (id == playerId) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + } + } + else + { + if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1)) + || ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1))) + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + } + } + else + { + switch (gLinkPlayers[id].lp_field_18) + { + case 0: + case 3: + memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + case 1: + case 2: + memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon)); + break; + } + } + } + } + + shedinja_something(&gPlayerParty[0]); + shedinja_something(&gPlayerParty[1]); + shedinja_something(&gPlayerParty[2]); + shedinja_something(&gPlayerParty[3]); + shedinja_something(&gPlayerParty[4]); + shedinja_something(&gPlayerParty[5]); + + shedinja_something(&gEnemyParty[0]); + shedinja_something(&gEnemyParty[1]); + shedinja_something(&gEnemyParty[2]); + shedinja_something(&gEnemyParty[3]); + shedinja_something(&gEnemyParty[4]); + shedinja_something(&gEnemyParty[5]); + + gUnknown_02024D1E[0]++; + } + break; + case 6: + sub_800B950(); + gUnknown_02024D1E[0]++; + gUnknown_02024D1E[1] = 0; + gUnknown_02024D1E[2] = 0; + break; + case 7: + if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0) + { + gUnknown_030042D0 = gMain.callback1; + gMain.callback1 = sub_8010824; + SetMainCallback2(sub_800F808); + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + gTrainerBattleOpponent = 0x800; + gBattleTypeFlags |= BATTLE_TYPE_20; + } + } + break; + } +} |