diff options
author | PikalaxALT <PikalaxALT@gmail.com> | 2019-11-09 10:57:16 -0500 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2019-11-09 10:57:16 -0500 |
commit | 9773fcf278cd9e830440c993a3e79899c2f89b67 (patch) | |
tree | 1ef4b70dcb9fa5b38a1708e62ee0772059884c0a | |
parent | 4eb386f7c4f9e4f9cd579421f8e064ee20c3f64c (diff) |
Battle Tower through nonmatching sub_80E61DC
-rw-r--r-- | asm/battle_tower.s | 1489 | ||||
-rw-r--r-- | src/battle_tower.c | 919 |
2 files changed, 919 insertions, 1489 deletions
diff --git a/asm/battle_tower.s b/asm/battle_tower.s index d4bad6bd1..3d4169293 100644 --- a/asm/battle_tower.s +++ b/asm/battle_tower.s @@ -5,1495 +5,6 @@ .text - thumb_func_start sub_80E5970 -sub_80E5970: @ 80E5970 - push {r4,r5,lr} - movs r4, 0 - movs r5, 0 -_080E5976: - ldr r0, _080E5990 @ =gSaveBlock2Ptr - ldr r0, [r0] - ldr r1, _080E5994 @ =0x0000055e - adds r0, r1 - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0x6 - bhi _080E59B8 - lsls r0, 2 - ldr r1, _080E5998 @ =_080E599C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080E5990: .4byte gSaveBlock2Ptr -_080E5994: .4byte 0x0000055e -_080E5998: .4byte _080E599C - .align 2, 0 -_080E599C: - .4byte _080E59B8 - .4byte _080E59D0 - .4byte _080E59F0 - .4byte _080E5A00 - .4byte _080E59E0 - .4byte _080E59E8 - .4byte _080E5A00 -_080E59B8: - lsls r0, r5, 24 - lsrs r0, 24 - bl sub_80E5A38 - cmp r4, 0 - bne _080E5A00 - movs r0, 0x80 - lsls r0, 7 - movs r1, 0x5 - bl VarSet - b _080E5A00 -_080E59D0: - lsls r0, r5, 24 - lsrs r0, 24 - bl sub_80E5A38 - movs r0, 0x80 - lsls r0, 7 - movs r1, 0x1 - b _080E59F6 -_080E59E0: - movs r0, 0x80 - lsls r0, 7 - movs r1, 0x2 - b _080E59F6 -_080E59E8: - movs r0, 0x80 - lsls r0, 7 - movs r1, 0x3 - b _080E59F6 -_080E59F0: - movs r0, 0x80 - lsls r0, 7 - movs r1, 0x4 -_080E59F6: - bl VarSet - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 -_080E5A00: - adds r5, 0x1 - cmp r5, 0x1 - ble _080E5976 - ldr r0, _080E5A2C @ =gSaveBlock2Ptr - ldr r0, [r0] - ldr r1, _080E5A30 @ =0x0000055e - adds r0, r1 - ldrh r1, [r0] - ldr r0, _080E5A34 @ =0x00000303 - cmp r1, r0 - bne _080E5A20 - movs r0, 0x80 - lsls r0, 7 - movs r1, 0x5 - bl VarSet -_080E5A20: - bl sub_80E7064 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080E5A2C: .4byte gSaveBlock2Ptr -_080E5A30: .4byte 0x0000055e -_080E5A34: .4byte 0x00000303 - thumb_func_end sub_80E5970 - - thumb_func_start sub_80E5A38 -sub_80E5A38: @ 80E5A38 - lsls r0, 24 - lsrs r0, 24 - ldr r3, _080E5A64 @ =gSaveBlock2Ptr - ldr r1, [r3] - ldr r2, _080E5A68 @ =0x0000055e - adds r1, r2 - adds r1, r0 - movs r2, 0 - strb r2, [r1] - ldr r2, [r3] - lsls r0, 1 - movs r3, 0xAC - lsls r3, 3 - adds r1, r2, r3 - adds r1, r0 - movs r3, 0x1 - strh r3, [r1] - ldr r1, _080E5A6C @ =0x00000564 - adds r2, r1 - adds r2, r0 - strh r3, [r2] - bx lr - .align 2, 0 -_080E5A64: .4byte gSaveBlock2Ptr -_080E5A68: .4byte 0x0000055e -_080E5A6C: .4byte 0x00000564 - thumb_func_end sub_80E5A38 - - thumb_func_start sub_80E5A70 -sub_80E5A70: @ 80E5A70 - push {r4-r7,lr} - sub sp, 0x2C - lsls r0, 24 - lsrs r5, r0, 24 - lsls r1, 16 - lsrs r6, r1, 16 - add r4, sp, 0x28 - movs r0, 0 - strb r0, [r4] - bl ValidateEReaderTrainer - ldr r0, _080E5AA4 @ =gSpecialVar_Result - ldrh r0, [r0] - adds r7, r4, 0 - cmp r0, 0 - bne _080E5A9E - ldr r0, _080E5AA8 @ =gSaveBlock2Ptr - ldr r0, [r0] - ldr r1, _080E5AAC @ =0x000004a2 - adds r0, r1 - ldrh r0, [r0] - cmp r0, r6 - beq _080E5AB0 -_080E5A9E: - movs r0, 0 - b _080E5B02 - .align 2, 0 -_080E5AA4: .4byte gSpecialVar_Result -_080E5AA8: .4byte gSaveBlock2Ptr -_080E5AAC: .4byte 0x000004a2 -_080E5AB0: - movs r6, 0x32 - cmp r5, 0 - beq _080E5AB8 - movs r6, 0x64 -_080E5AB8: - movs r4, 0 -_080E5ABA: - ldr r0, _080E5B0C @ =gSaveBlock2Ptr - ldr r1, [r0] - movs r0, 0x2C - muls r0, r4 - adds r1, r0 - movs r2, 0x9C - lsls r2, 3 - adds r0, r1, r2 - ldrb r2, [r0] - cmp r2, r6 - bne _080E5A9E - ldr r3, _080E5B10 @ =0x000004d4 - adds r0, r1, r3 - ldrh r0, [r0] - adds r3, 0x2 - adds r1, r3 - ldrh r1, [r1] - str r2, [sp] - add r2, sp, 0x10 - str r2, [sp, 0x4] - add r2, sp, 0x1C - str r2, [sp, 0x8] - str r7, [sp, 0xC] - movs r2, 0x1 - adds r3, r5, 0 - bl sub_80E6564 - adds r4, 0x1 - cmp r4, 0x2 - ble _080E5ABA - movs r1, 0 - ldrb r0, [r7] - cmp r0, 0x3 - bne _080E5B00 - movs r1, 0x1 -_080E5B00: - adds r0, r1, 0 -_080E5B02: - add sp, 0x2C - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080E5B0C: .4byte gSaveBlock2Ptr -_080E5B10: .4byte 0x000004d4 - thumb_func_end sub_80E5A70 - - thumb_func_start sub_80E5B14 -sub_80E5B14: @ 80E5B14 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x24 - movs r0, 0 - str r0, [sp, 0x14] - ldr r4, _080E5B58 @ =gSaveBlock2Ptr - ldr r0, [r4] - ldr r1, _080E5B5C @ =0x0000055c - adds r0, r1 - ldrb r0, [r0] - lsls r0, 31 - lsrs r0, 31 - mov r8, r0 - bl sub_80E7188 - lsls r0, 16 - lsrs r0, 16 - mov r9, r0 - mov r0, r8 - mov r1, r9 - bl sub_80E5A70 - lsls r0, 24 - cmp r0, 0 - beq _080E5B64 - ldr r0, [r4] - ldr r2, _080E5B60 @ =0x0000056c - adds r0, r2 - movs r1, 0xC8 - strb r1, [r0] - b _080E5C0C - .align 2, 0 -_080E5B58: .4byte gSaveBlock2Ptr -_080E5B5C: .4byte 0x0000055c -_080E5B60: .4byte 0x0000056c -_080E5B64: - movs r6, 0 - movs r3, 0xA4 - mov r10, r3 - movs r7, 0xAA - lsls r7, 1 - mov r12, r7 - ldr r0, _080E5BE8 @ =gSaveBlock2Ptr - ldr r0, [r0] - str r0, [sp, 0x18] - mov r1, sp - str r1, [sp, 0x1C] -_080E5B7A: - mov r0, r10 - muls r0, r6 - add r0, r12 - movs r4, 0 - movs r5, 0 - movs r1, 0 - adds r2, r6, 0x1 - str r2, [sp, 0x20] - ldr r3, [sp, 0x18] - adds r2, r3, r0 -_080E5B8E: - ldm r2!, {r0} - orrs r4, r0 - adds r5, r0 - adds r1, 0x1 - cmp r1, 0x27 - bls _080E5B8E - ldr r7, _080E5BE8 @ =gSaveBlock2Ptr - ldr r2, [r7] - mov r3, r10 - muls r3, r6 - adds r1, r2, r3 - movs r7, 0xAB - lsls r7, 1 - adds r0, r1, r7 - ldrh r0, [r0] - cmp r0, r9 - bne _080E5BD8 - mov r7, r12 - adds r0, r1, r7 - ldrb r0, [r0] - cmp r0, r8 - bne _080E5BD8 - cmp r4, 0 - beq _080E5BD8 - movs r1, 0xFA - lsls r1, 1 - adds r0, r2, r1 - adds r0, r3 - ldr r0, [r0] - cmp r0, r5 - bne _080E5BD8 - ldr r2, [sp, 0x1C] - stm r2!, {r6} - str r2, [sp, 0x1C] - ldr r3, [sp, 0x14] - adds r3, 0x1 - str r3, [sp, 0x14] -_080E5BD8: - ldr r6, [sp, 0x20] - cmp r6, 0x4 - ble _080E5B7A - ldr r7, [sp, 0x14] - cmp r7, 0 - bne _080E5BEC - movs r0, 0 - b _080E5C0E - .align 2, 0 -_080E5BE8: .4byte gSaveBlock2Ptr -_080E5BEC: - bl Random - ldr r1, _080E5C20 @ =gSaveBlock2Ptr - ldr r4, [r1] - lsls r0, 16 - lsrs r0, 16 - ldr r1, [sp, 0x14] - bl __modsi3 - lsls r0, 2 - add r0, sp - ldr r0, [r0] - adds r0, 0x64 - ldr r1, _080E5C24 @ =0x0000056c - adds r4, r1 - strb r0, [r4] -_080E5C0C: - movs r0, 0x1 -_080E5C0E: - add sp, 0x24 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080E5C20: .4byte gSaveBlock2Ptr -_080E5C24: .4byte 0x0000056c - thumb_func_end sub_80E5B14 - - thumb_func_start ChooseNextBattleTowerTrainer -ChooseNextBattleTowerTrainer: @ 80E5C28 - push {r4-r7,lr} - mov r7, r8 - push {r7} - ldr r5, _080E5C6C @ =gSaveBlock2Ptr - ldr r0, [r5] - ldr r1, _080E5C70 @ =0x0000055c - adds r0, r1 - ldrb r0, [r0] - lsls r0, 31 - lsrs r6, r0, 31 - bl sub_80E5B14 - lsls r0, 24 - cmp r0, 0 - beq _080E5C7C - ldr r0, [r5] - ldr r4, _080E5C74 @ =0x0000056c - adds r0, r4 - ldrb r0, [r0] - bl sub_80E5E5C - ldr r1, [r5] - lsls r2, r6, 1 - movs r3, 0xAC - lsls r3, 3 - adds r0, r1, r3 - adds r0, r2 - ldrh r0, [r0] - adds r0, r1, r0 - ldr r2, _080E5C78 @ =0x00000571 - adds r0, r2 - adds r1, r4 - b _080E5E3E - .align 2, 0 -_080E5C6C: .4byte gSaveBlock2Ptr -_080E5C70: .4byte 0x0000055c -_080E5C74: .4byte 0x0000056c -_080E5C78: .4byte 0x00000571 -_080E5C7C: - ldr r2, [r5] - lsls r0, r6, 1 - ldr r3, _080E5D1C @ =0x00000564 - adds r1, r2, r3 - adds r1, r0 - ldrh r1, [r1] - adds r6, r0, 0 - cmp r1, 0x7 - bls _080E5C90 - b _080E5DB8 -_080E5C90: - movs r1, 0xAC - lsls r1, 3 - adds r0, r2, r1 - adds r0, r6 - ldrh r0, [r0] - cmp r0, 0x7 - bne _080E5D2C - adds r7, r6, 0 - mov r8, r5 -_080E5CA2: - bl Random - movs r1, 0xFF - ands r1, r0 - lsls r2, r1, 2 - adds r2, r1 - mov r3, r8 - ldr r4, [r3] - ldr r1, _080E5D1C @ =0x00000564 - adds r0, r4, r1 - adds r0, r7 - ldrh r1, [r0] - subs r1, 0x1 - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 1 - adds r0, 0x14 - lsrs r2, 7 - adds r2, r0 - lsls r2, 16 - lsrs r5, r2, 16 - movs r3, 0 - movs r0, 0xAC - lsls r0, 3 - adds r2, r4, r0 - adds r0, r2, r7 - ldrh r0, [r0] - subs r0, 0x1 - cmp r3, r0 - bge _080E5CFC - ldr r0, _080E5D20 @ =0x00000572 - adds r1, r4, r0 - ldrb r0, [r1] - cmp r0, r5 - beq _080E5CFC - adds r0, r2, r6 - ldrh r0, [r0] - subs r4, r0, 0x1 -_080E5CEE: - adds r3, 0x1 - cmp r3, r4 - bge _080E5CFC - adds r0, r1, r3 - ldrb r0, [r0] - cmp r0, r5 - bne _080E5CEE -_080E5CFC: - mov r1, r8 - ldr r0, [r1] - movs r2, 0xAC - lsls r2, 3 - adds r0, r2 - adds r0, r6 - ldrh r0, [r0] - subs r0, 0x1 - ldr r4, _080E5D24 @ =gSaveBlock2Ptr - cmp r3, r0 - bne _080E5CA2 - ldr r0, [r4] - ldr r3, _080E5D28 @ =0x0000056c - adds r0, r3 - b _080E5E16 - .align 2, 0 -_080E5D1C: .4byte 0x00000564 -_080E5D20: .4byte 0x00000572 -_080E5D24: .4byte gSaveBlock2Ptr -_080E5D28: .4byte 0x0000056c -_080E5D2C: - adds r7, r6, 0 - mov r8, r5 -_080E5D30: - bl Random - movs r1, 0xFF - ands r1, r0 - lsls r0, r1, 2 - adds r0, r1 - lsrs r5, r0, 6 - mov r0, r8 - ldr r4, [r0] - ldr r1, _080E5DA8 @ =0x00000564 - adds r0, r4, r1 - adds r0, r7 - ldrh r1, [r0] - subs r1, 0x1 - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 1 - adds r0, r5, r0 - lsls r0, 16 - lsrs r5, r0, 16 - movs r3, 0 - movs r0, 0xAC - lsls r0, 3 - adds r2, r4, r0 - adds r0, r2, r7 - ldrh r0, [r0] - subs r0, 0x1 - cmp r3, r0 - bge _080E5D88 - ldr r0, _080E5DAC @ =0x00000572 - adds r1, r4, r0 - ldrb r0, [r1] - cmp r0, r5 - beq _080E5D88 - adds r0, r2, r6 - ldrh r0, [r0] - subs r4, r0, 0x1 -_080E5D7A: - adds r3, 0x1 - cmp r3, r4 - bge _080E5D88 - adds r0, r1, r3 - ldrb r0, [r0] - cmp r0, r5 - bne _080E5D7A -_080E5D88: - mov r1, r8 - ldr r0, [r1] - movs r2, 0xAC - lsls r2, 3 - adds r0, r2 - adds r0, r6 - ldrh r0, [r0] - subs r0, 0x1 - ldr r4, _080E5DB0 @ =gSaveBlock2Ptr - cmp r3, r0 - bne _080E5D30 - ldr r0, [r4] - ldr r3, _080E5DB4 @ =0x0000056c - adds r0, r3 - b _080E5E16 - .align 2, 0 -_080E5DA8: .4byte 0x00000564 -_080E5DAC: .4byte 0x00000572 -_080E5DB0: .4byte gSaveBlock2Ptr -_080E5DB4: .4byte 0x0000056c -_080E5DB8: - adds r7, r5, 0 -_080E5DBA: - bl Random - movs r1, 0xFF - ands r1, r0 - lsls r0, r1, 4 - subs r0, r1 - lsls r0, 1 - asrs r0, 8 - adds r0, 0x46 - lsls r0, 16 - lsrs r5, r0, 16 - movs r3, 0 - ldr r1, [r7] - movs r2, 0xAC - lsls r2, 3 - adds r0, r1, r2 - adds r0, r6 - ldrh r0, [r0] - subs r4, r0, 0x1 - cmp r3, r4 - bge _080E5DFC - ldr r0, _080E5E4C @ =0x00000572 - adds r1, r0 - ldrb r0, [r1] - cmp r0, r5 - beq _080E5DFC -_080E5DEE: - adds r3, 0x1 - cmp r3, r4 - bge _080E5DFC - adds r0, r1, r3 - ldrb r0, [r0] - cmp r0, r5 - bne _080E5DEE -_080E5DFC: - ldr r0, [r7] - movs r1, 0xAC - lsls r1, 3 - adds r0, r1 - adds r0, r6 - ldrh r0, [r0] - subs r0, 0x1 - ldr r4, _080E5E50 @ =gSaveBlock2Ptr - cmp r3, r0 - bne _080E5DBA - ldr r0, [r4] - ldr r2, _080E5E54 @ =0x0000056c - adds r0, r2 -_080E5E16: - strb r5, [r0] - ldr r0, [r4] - ldr r3, _080E5E54 @ =0x0000056c - adds r0, r3 - ldrb r0, [r0] - bl sub_80E5E5C - ldr r1, [r4] - movs r2, 0xAC - lsls r2, 3 - adds r0, r1, r2 - adds r2, r0, r6 - ldrh r0, [r2] - cmp r0, 0x6 - bhi _080E5E42 - adds r0, r1, r0 - ldr r3, _080E5E58 @ =0x00000571 - adds r0, r3 - ldr r2, _080E5E54 @ =0x0000056c - adds r1, r2 -_080E5E3E: - ldrb r1, [r1] - strb r1, [r0] -_080E5E42: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080E5E4C: .4byte 0x00000572 -_080E5E50: .4byte gSaveBlock2Ptr -_080E5E54: .4byte 0x0000056c -_080E5E58: .4byte 0x00000571 - thumb_func_end ChooseNextBattleTowerTrainer - - thumb_func_start sub_80E5E5C -sub_80E5E5C: @ 80E5E5C - push {lr} - ldr r0, _080E5E6C @ =0x00004010 - movs r1, 0x12 - bl VarSet - pop {r0} - bx r0 - .align 2, 0 -_080E5E6C: .4byte 0x00004010 - thumb_func_end sub_80E5E5C - - thumb_func_start SetEReaderTrainerGfxId -SetEReaderTrainerGfxId: @ 80E5E70 - push {lr} - movs r0, 0xC8 - bl sub_80E5E5C - pop {r0} - bx r0 - thumb_func_end SetEReaderTrainerGfxId - - thumb_func_start sub_80E5E7C -sub_80E5E7C: @ 80E5E7C - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x20 - movs r1, 0 - mov r8, r1 - mov r10, r0 - movs r5, 0 - ldr r2, _080E5F08 @ =gSaveBlock2Ptr - ldr r0, [r2] - mov r4, r10 - ldrb r4, [r4, 0xC] - str r4, [sp, 0x18] - mov r9, r5 - movs r7, 0x4 - str r7, [sp, 0x1C] - movs r1, 0xB0 - lsls r1, 1 - adds r1, r0 - mov r12, r1 -_080E5EA8: - movs r6, 0 - movs r3, 0 - mov r2, r12 - ldrb r0, [r2] - ldr r4, [sp, 0x18] - cmp r0, r4 - bne _080E5EDA - mov r4, r9 - mov r2, r10 - adds r2, 0xC -_080E5EBC: - adds r3, 0x1 - cmp r3, 0x3 - bgt _080E5EDA - ldr r7, _080E5F08 @ =gSaveBlock2Ptr - ldr r0, [r7] - adds r1, r3, r4 - movs r7, 0xB0 - lsls r7, 1 - adds r0, r7 - adds r0, r1 - adds r1, r2, r3 - ldrb r0, [r0] - ldrb r1, [r1] - cmp r0, r1 - beq _080E5EBC -_080E5EDA: - cmp r3, 0x4 - bne _080E5F20 - movs r6, 0 - ldr r1, _080E5F08 @ =gSaveBlock2Ptr - ldr r0, [r1] - movs r3, 0xAC - lsls r3, 1 - adds r0, r3 - ldr r2, [sp, 0x1C] - adds r0, r2 - ldrb r0, [r0] - mov r4, r10 - ldrb r4, [r4, 0x8] - cmp r0, r4 - bne _080E5F20 - adds r1, r0, 0 - mov r2, r9 - adds r2, 0x4 -_080E5EFE: - cmp r1, 0xFF - bne _080E5F0C - movs r6, 0x7 - b _080E5F20 - .align 2, 0 -_080E5F08: .4byte gSaveBlock2Ptr -_080E5F0C: - adds r6, 0x1 - cmp r6, 0x6 - bgt _080E5F20 - ldr r7, _080E5F4C @ =gSaveBlock2Ptr - ldr r0, [r7] - adds r0, r3 - adds r0, r2 - ldrb r0, [r0] - cmp r0, r1 - beq _080E5EFE -_080E5F20: - cmp r6, 0x7 - beq _080E5F36 - movs r0, 0xA4 - add r9, r0 - ldr r1, [sp, 0x1C] - adds r1, 0xA4 - str r1, [sp, 0x1C] - add r12, r0 - adds r5, 0x1 - cmp r5, 0x4 - ble _080E5EA8 -_080E5F36: - cmp r5, 0x4 - bgt _080E5F50 - ldr r2, _080E5F4C @ =gSaveBlock2Ptr - ldr r0, [r2] - movs r1, 0xA4 - muls r1, r5 - adds r0, r1 - movs r4, 0xAA - lsls r4, 1 - adds r0, r4 - b _080E5F90 - .align 2, 0 -_080E5F4C: .4byte gSaveBlock2Ptr -_080E5F50: - movs r5, 0 - ldr r7, _080E5F9C @ =gSaveBlock2Ptr - ldr r0, [r7] - movs r1, 0xAB - lsls r1, 1 - adds r0, r1 - ldrh r0, [r0] - cmp r0, 0 - beq _080E5F7C - adds r3, r7, 0 - adds r2, r1, 0 - movs r1, 0 -_080E5F68: - adds r1, 0xA4 - adds r5, 0x1 - cmp r5, 0x4 - bgt _080E5FA0 - ldr r0, [r3] - adds r0, r1 - adds r0, r2 - ldrh r0, [r0] - cmp r0, 0 - bne _080E5F68 -_080E5F7C: - cmp r5, 0x4 - bgt _080E5FA0 - ldr r1, _080E5F9C @ =gSaveBlock2Ptr - ldr r0, [r1] - movs r1, 0xA4 - muls r1, r5 - adds r0, r1 - movs r2, 0xAA - lsls r2, 1 - adds r0, r2 -_080E5F90: - mov r1, r10 - movs r2, 0xA4 - bl memcpy - b _080E6062 - .align 2, 0 -_080E5F9C: .4byte gSaveBlock2Ptr -_080E5FA0: - mov r2, sp - ldr r4, _080E5FF8 @ =gSaveBlock2Ptr - ldr r0, [r4] - movs r3, 0xAB - lsls r3, 1 - adds r0, r3 - ldrh r0, [r0] - movs r1, 0 - strh r0, [r2] - add r0, sp, 0xC - strh r1, [r0] - movs r7, 0x1 - add r8, r7 - movs r5, 0x1 - add r0, sp, 0xC - mov r9, r0 - mov r12, r3 -_080E5FC2: - movs r3, 0 - adds r7, r5, 0x1 - cmp r3, r8 - bge _080E6006 - ldr r1, _080E5FF8 @ =gSaveBlock2Ptr - ldr r0, [r1] - movs r2, 0xA4 - adds r1, r5, 0 - muls r1, r2 - adds r0, r1 - mov r1, r12 - adds r4, r0, r1 - mov r6, sp -_080E5FDC: - lsls r0, r3, 1 - add r0, sp - ldrh r2, [r4] - adds r1, r2, 0 - ldrh r0, [r0] - cmp r1, r0 - bcs _080E5FFC - movs r3, 0 - movs r4, 0x1 - mov r8, r4 - strh r2, [r6] - mov r0, r9 - strh r5, [r0] - b _080E6006 - .align 2, 0 -_080E5FF8: .4byte gSaveBlock2Ptr -_080E5FFC: - cmp r1, r0 - bhi _080E6006 - adds r3, 0x1 - cmp r3, r8 - blt _080E5FDC -_080E6006: - cmp r3, r8 - bne _080E602C - mov r1, r8 - lsls r2, r1, 1 - mov r4, sp - adds r3, r4, r2 - ldr r1, _080E6074 @ =gSaveBlock2Ptr - ldr r0, [r1] - movs r4, 0xA4 - adds r1, r5, 0 - muls r1, r4 - adds r0, r1 - add r0, r12 - ldrh r0, [r0] - strh r0, [r3] - add r2, r9 - strh r5, [r2] - movs r0, 0x1 - add r8, r0 -_080E602C: - adds r5, r7, 0 - cmp r5, 0x4 - ble _080E5FC2 - bl Random - lsls r0, 16 - lsrs r0, 16 - mov r1, r8 - bl __modsi3 - adds r5, r0, 0 - ldr r0, _080E6074 @ =gSaveBlock2Ptr - ldr r0, [r0] - lsls r1, r5, 1 - add r1, sp - adds r1, 0xC - ldrh r2, [r1] - movs r1, 0xA4 - muls r1, r2 - adds r0, r1 - movs r1, 0xAA - lsls r1, 1 - adds r0, r1 - mov r1, r10 - movs r2, 0xA4 - bl memcpy -_080E6062: - add sp, 0x20 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080E6074: .4byte gSaveBlock2Ptr - thumb_func_end sub_80E5E7C - - thumb_func_start GetBattleTowerTrainerFrontSpriteId -GetBattleTowerTrainerFrontSpriteId: @ 80E6078 - push {lr} - ldr r0, _080E6094 @ =gSaveBlock2Ptr - ldr r3, [r0] - ldr r0, _080E6098 @ =0x0000056c - adds r1, r3, r0 - ldrb r0, [r1] - cmp r0, 0xC8 - bne _080E60A4 - ldr r1, _080E609C @ =gFacilityClassToPicIndex - ldr r2, _080E60A0 @ =0x000004a1 - adds r0, r3, r2 - ldrb r0, [r0] - adds r0, r1 - b _080E60D6 - .align 2, 0 -_080E6094: .4byte gSaveBlock2Ptr -_080E6098: .4byte 0x0000056c -_080E609C: .4byte gFacilityClassToPicIndex -_080E60A0: .4byte 0x000004a1 -_080E60A4: - cmp r0, 0x63 - bls _080E60C4 - ldr r2, _080E60C0 @ =gFacilityClassToPicIndex - ldrb r0, [r1] - subs r0, 0x64 - movs r1, 0xA4 - muls r0, r1 - adds r0, r3, r0 - adds r1, 0xB1 - adds r0, r1 - ldrb r0, [r0] - adds r0, r2 - b _080E60D6 - .align 2, 0 -_080E60C0: .4byte gFacilityClassToPicIndex -_080E60C4: - ldr r3, _080E60DC @ =gFacilityClassToPicIndex - ldr r2, _080E60E0 @ =gBattleTowerTrainers - ldrb r1, [r1] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0] - adds r0, r3 -_080E60D6: - ldrb r0, [r0] - pop {r1} - bx r1 - .align 2, 0 -_080E60DC: .4byte gFacilityClassToPicIndex -_080E60E0: .4byte gBattleTowerTrainers - thumb_func_end GetBattleTowerTrainerFrontSpriteId - - thumb_func_start sub_80E60E4 -sub_80E60E4: @ 80E60E4 - push {lr} - ldr r0, _080E6100 @ =gSaveBlock2Ptr - ldr r3, [r0] - ldr r0, _080E6104 @ =0x0000056c - adds r1, r3, r0 - ldrb r0, [r1] - cmp r0, 0xC8 - bne _080E6110 - ldr r1, _080E6108 @ =gFacilityClassToTrainerClass - ldr r2, _080E610C @ =0x000004a1 - adds r0, r3, r2 - ldrb r0, [r0] - adds r0, r1 - b _080E6144 - .align 2, 0 -_080E6100: .4byte gSaveBlock2Ptr -_080E6104: .4byte 0x0000056c -_080E6108: .4byte gFacilityClassToTrainerClass -_080E610C: .4byte 0x000004a1 -_080E6110: - cmp r0, 0x63 - bhi _080E6130 - ldr r3, _080E6128 @ =gFacilityClassToTrainerClass - ldr r2, _080E612C @ =gBattleTowerTrainers - ldrb r1, [r1] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0] - adds r0, r3 - b _080E6144 - .align 2, 0 -_080E6128: .4byte gFacilityClassToTrainerClass -_080E612C: .4byte gBattleTowerTrainers -_080E6130: - ldr r2, _080E614C @ =gFacilityClassToTrainerClass - ldrb r0, [r1] - subs r0, 0x64 - movs r1, 0xA4 - muls r0, r1 - adds r0, r3, r0 - adds r1, 0xB1 - adds r0, r1 - ldrb r0, [r0] - adds r0, r2 -_080E6144: - ldrb r0, [r0] - pop {r1} - bx r1 - .align 2, 0 -_080E614C: .4byte gFacilityClassToTrainerClass - thumb_func_end sub_80E60E4 - - thumb_func_start sub_80E6150 -sub_80E6150: @ 80E6150 - push {r4-r6,lr} - adds r4, r0, 0 - ldr r0, _080E6178 @ =gSaveBlock2Ptr - ldr r1, [r0] - ldr r2, _080E617C @ =0x0000056c - adds r0, r1, r2 - ldrb r2, [r0] - cmp r2, 0xC8 - bne _080E6184 - movs r3, 0 - ldr r0, _080E6180 @ =0x000004a4 - adds r2, r1, r0 -_080E6168: - adds r0, r4, r3 - adds r1, r2, r3 - ldrb r1, [r1] - strb r1, [r0] - adds r3, 0x1 - cmp r3, 0x6 - ble _080E6168 - b _080E61CE - .align 2, 0 -_080E6178: .4byte gSaveBlock2Ptr -_080E617C: .4byte 0x0000056c -_080E6180: .4byte 0x000004a4 -_080E6184: - cmp r2, 0x63 - bhi _080E61AC - movs r3, 0 - adds r5, r0, 0 - ldr r6, _080E61A8 @ =gBattleTowerTrainers + 1 -_080E618E: - adds r2, r4, r3 - ldrb r1, [r5] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r3, r0 - adds r0, r6 - ldrb r0, [r0] - strb r0, [r2] - adds r3, 0x1 - cmp r3, 0x2 - ble _080E618E - b _080E61CE - .align 2, 0 -_080E61A8: .4byte gBattleTowerTrainers + 1 -_080E61AC: - movs r3, 0 - adds r5, r0, 0 - movs r0, 0xAC - lsls r0, 1 - adds r2, r1, r0 - movs r6, 0xA4 -_080E61B8: - adds r1, r4, r3 - ldrb r0, [r5] - subs r0, 0x64 - muls r0, r6 - adds r0, r3, r0 - adds r0, r2, r0 - ldrb r0, [r0] - strb r0, [r1] - adds r3, 0x1 - cmp r3, 0x6 - ble _080E61B8 -_080E61CE: - adds r1, r4, r3 - movs r0, 0xFF - strb r0, [r1] - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_80E6150 - - thumb_func_start sub_80E61DC -sub_80E61DC: @ 80E61DC - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - movs r0, 0 - str r0, [sp, 0x18] - movs r1, 0x3C - str r1, [sp, 0x1C] - add r4, sp, 0xC - movs r0, 0xFF - strb r0, [r4] - bl ZeroEnemyPartyMons - ldr r1, _080E6210 @ =gSaveBlock2Ptr - ldr r0, [r1] - ldr r2, _080E6214 @ =0x0000056c - adds r0, r2 - ldrb r0, [r0] - cmp r0, 0x13 - bhi _080E6218 - movs r3, 0x6 - str r3, [sp, 0x14] - b _080E62F4 - .align 2, 0 -_080E6210: .4byte gSaveBlock2Ptr -_080E6214: .4byte 0x0000056c -_080E6218: - cmp r0, 0x1D - bhi _080E6226 - movs r0, 0x9 - str r0, [sp, 0x14] - movs r1, 0x1E - str r1, [sp, 0x18] - b _080E62F4 -_080E6226: - cmp r0, 0x27 - bhi _080E6234 - movs r2, 0xC - str r2, [sp, 0x14] - movs r3, 0x3C - str r3, [sp, 0x18] - b _080E62F4 -_080E6234: - cmp r0, 0x31 - bhi _080E6242 - movs r0, 0xF - str r0, [sp, 0x14] - movs r1, 0x5A - str r1, [sp, 0x18] - b _080E62F4 -_080E6242: - cmp r0, 0x3B - bhi _080E6250 - movs r2, 0x12 - str r2, [sp, 0x14] - movs r3, 0x78 - str r3, [sp, 0x18] - b _080E62F4 -_080E6250: - cmp r0, 0x45 - bhi _080E625E - movs r0, 0x15 - str r0, [sp, 0x14] - movs r1, 0x96 - str r1, [sp, 0x18] - b _080E62F4 -_080E625E: - cmp r0, 0x4F - bhi _080E626C - movs r2, 0x1F - str r2, [sp, 0x14] - movs r3, 0xB4 - str r3, [sp, 0x18] - b _080E62F4 -_080E626C: - cmp r0, 0x63 - bhi _080E627E - movs r0, 0x1F - str r0, [sp, 0x14] - movs r1, 0xC8 - str r1, [sp, 0x18] - movs r2, 0x64 - str r2, [sp, 0x1C] - b _080E62F4 -_080E627E: - cmp r0, 0xC8 - bne _080E62B0 - movs r6, 0 - adds r4, r1, 0 -_080E6286: - movs r0, 0x64 - muls r0, r6 - ldr r1, _080E62A8 @ =gEnemyParty - adds r0, r1 - movs r1, 0x2C - adds r2, r6, 0 - muls r2, r1 - ldr r3, _080E62AC @ =0x000004d4 - adds r2, r3 - ldr r1, [r4] - adds r1, r2 - bl CreateBattleTowerMon - adds r6, 0x1 - cmp r6, 0x2 - ble _080E6286 - b _080E64A6 - .align 2, 0 -_080E62A8: .4byte gEnemyParty -_080E62AC: .4byte 0x000004d4 -_080E62B0: - movs r6, 0 -_080E62B2: - movs r0, 0x64 - muls r0, r6 - ldr r1, _080E62E4 @ =gEnemyParty - adds r0, r1 - ldr r1, _080E62E8 @ =gSaveBlock2Ptr - ldr r1, [r1] - ldr r3, _080E62EC @ =0x0000056c - adds r2, r1, r3 - ldrb r3, [r2] - movs r2, 0xA4 - muls r2, r3 - ldr r3, _080E62F0 @ =0xffffc144 - adds r2, r3 - adds r1, r2 - movs r2, 0x2C - muls r2, r6 - adds r2, 0x1C - adds r1, r2 - bl CreateBattleTowerMon - adds r6, 0x1 - cmp r6, 0x2 - ble _080E62B2 - b _080E64A6 - .align 2, 0 -_080E62E4: .4byte gEnemyParty -_080E62E8: .4byte gSaveBlock2Ptr -_080E62EC: .4byte 0x0000056c -_080E62F0: .4byte 0xffffc144 -_080E62F4: - ldr r2, _080E6314 @ =gSaveBlock2Ptr - ldr r0, [r2] - ldr r1, _080E6318 @ =0x0000055c - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - adds r1, r2, 0 - cmp r0, 0 - beq _080E6320 - ldr r2, _080E631C @ =gBattleTowerLevel100Mons - mov r10, r2 - movs r3, 0x64 - str r3, [sp, 0x10] - b _080E6328 - .align 2, 0 -_080E6314: .4byte gSaveBlock2Ptr -_080E6318: .4byte 0x0000055c -_080E631C: .4byte gBattleTowerLevel100Mons -_080E6320: - ldr r0, _080E6378 @ =gBattleTowerLevel50Mons - mov r10, r0 - movs r2, 0x32 - str r2, [sp, 0x10] -_080E6328: - ldr r2, _080E637C @ =gBattleTowerTrainers - ldr r0, [r1] - ldr r3, _080E6380 @ =0x0000056c - adds r0, r3 - ldrb r1, [r0] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 2 - adds r0, r2 - ldrb r0, [r0, 0x4] - str r0, [sp, 0x20] - movs r6, 0 -_080E6340: - bl Random - movs r1, 0xFF - ands r1, r0 - ldr r2, [sp, 0x1C] - adds r0, r1, 0 - muls r0, r2 - asrs r0, 8 - ldr r3, [sp, 0x18] - adds r7, r0, r3 - ldr r0, [sp, 0x20] - cmp r0, 0 - beq _080E636A - lsls r0, r7, 4 - add r0, r10 - ldrb r0, [r0, 0x3] - ldr r1, [sp, 0x20] - ands r0, r1 - cmp r0, r1 - beq _080E636A - b _080E64A0 -_080E636A: - movs r5, 0 - lsls r0, r7, 4 - mov r2, r10 - adds r3, r0, r2 - movs r4, 0 - b _080E6388 - .align 2, 0 -_080E6378: .4byte gBattleTowerLevel50Mons -_080E637C: .4byte gBattleTowerTrainers -_080E6380: .4byte 0x0000056c -_080E6384: - adds r4, 0x64 - adds r5, 0x1 -_080E6388: - cmp r5, r6 - bge _080E63A2 - ldr r1, _080E64B8 @ =gEnemyParty - adds r0, r4, r1 - movs r1, 0xB - movs r2, 0 - str r3, [sp, 0x24] - bl GetMonData - ldr r3, [sp, 0x24] - ldrh r2, [r3] - cmp r0, r2 - bne _080E6384 -_080E63A2: - cmp r5, r6 - bne _080E64A0 - movs r5, 0 - cmp r5, r6 - bge _080E63F0 - ldr r3, _080E64BC @ =sBattleTowerHeldItems - mov r9, r3 - lsls r0, r7, 4 - add r0, r10 - mov r8, r0 - movs r3, 0 -_080E63B8: - ldr r0, _080E64B8 @ =gEnemyParty - adds r4, r3, r0 - adds r0, r4, 0 - movs r1, 0xC - movs r2, 0 - str r3, [sp, 0x24] - bl GetMonData - ldr r3, [sp, 0x24] - cmp r0, 0 - beq _080E63E8 - adds r0, r4, 0 - movs r1, 0xC - movs r2, 0 - bl GetMonData - mov r2, r8 - ldrb r1, [r2, 0x2] - lsls r1, 1 - add r1, r9 - ldr r3, [sp, 0x24] - ldrh r1, [r1] - cmp r0, r1 - beq _080E63F0 -_080E63E8: - adds r3, 0x64 - adds r5, 0x1 - cmp r5, r6 - blt _080E63B8 -_080E63F0: - cmp r5, r6 - bne _080E64A0 - movs r5, 0 - cmp r5, r6 - bge _080E6412 - add r0, sp, 0x4 - ldrh r0, [r0] - cmp r0, r7 - beq _080E6412 - add r1, sp, 0x4 -_080E6404: - adds r1, 0x2 - adds r5, 0x1 - cmp r5, r6 - bge _080E6412 - ldrh r0, [r1] - cmp r0, r7 - bne _080E6404 -_080E6412: - cmp r5, r6 - bne _080E64A0 - lsls r0, r6, 1 - add r0, sp - adds r0, 0x4 - strh r7, [r0] - movs r3, 0x64 - adds r0, r6, 0 - muls r0, r3 - ldr r1, _080E64B8 @ =gEnemyParty - adds r0, r1 - lsls r4, r7, 4 - mov r3, r10 - adds r2, r4, r3 - ldrh r1, [r2] - ldrb r2, [r2, 0xC] - str r2, [sp] - ldr r2, [sp, 0x10] - ldr r3, [sp, 0x14] - bl CreateMonWithEVSpread - movs r5, 0 - adds r0, r6, 0x1 - mov r9, r0 - mov r8, r4 - movs r0, 0x64 - adds r7, r6, 0 - muls r7, r0 - mov r0, r10 - adds r0, 0x4 - adds r4, r0 - ldr r3, _080E64B8 @ =gEnemyParty -_080E6452: - ldrh r1, [r4] - lsls r2, r5, 24 - lsrs r2, 24 - adds r0, r7, r3 - str r3, [sp, 0x24] - bl SetMonMoveSlot - ldrh r0, [r4] - ldr r3, [sp, 0x24] - cmp r0, 0xDA - bne _080E646E - movs r0, 0 - mov r1, sp - strb r0, [r1, 0xC] -_080E646E: - adds r4, 0x2 - adds r5, 0x1 - cmp r5, 0x3 - ble _080E6452 - movs r2, 0x64 - adds r4, r6, 0 - muls r4, r2 - ldr r3, _080E64B8 @ =gEnemyParty - adds r4, r3 - adds r0, r4, 0 - movs r1, 0x20 - add r2, sp, 0xC - bl SetMonData - mov r0, r8 - add r0, r10 - ldrb r2, [r0, 0x2] - lsls r2, 1 - ldr r0, _080E64BC @ =sBattleTowerHeldItems - adds r2, r0 - adds r0, r4, 0 - movs r1, 0xC - bl SetMonData - mov r6, r9 -_080E64A0: - cmp r6, 0x3 - beq _080E64A6 - b _080E6340 -_080E64A6: - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080E64B8: .4byte gEnemyParty -_080E64BC: .4byte sBattleTowerHeldItems - thumb_func_end sub_80E61DC - thumb_func_start sub_80E64C0 sub_80E64C0: @ 80E64C0 push {r4-r6,lr} diff --git a/src/battle_tower.c b/src/battle_tower.c index feab13d69..0ed20d6c9 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1,9 +1,20 @@ #include "global.h" #include "battle_tower.h" +#include "random.h" +#include "text.h" +#include "event_data.h" #include "constants/species.h" #include "constants/items.h" #include "constants/moves.h" #include "constants/pokemon.h" +#include "constants/vars.h" +#include "constants/map_objects.h" + +void sub_80E5A38(u8 levelType); +void sub_80E5E5C(u8 trainerClass); +u16 sub_80E7188(u8 levelType); +void sub_80E7064(void); +void sub_80E6564(u16 species, u16 heldItem, u8 unused, u8 levelType, u8 monLevel, u16 *validSpecies, u16 *validHeldItems, u8 *numValid); #include "data/battle_tower/trainers.h" @@ -131,3 +142,911 @@ const u16 sLongStreakPrizes[] = { ITEM_CHOICE_BAND }; +void sub_80E5970(void) +{ + u8 count = 0; + s32 levelType; + + for (levelType = 0; levelType < 2; levelType++) + { + switch (gSaveBlock2Ptr->battleTower.var_4AE[levelType]) + { + default: + case 0: + sub_80E5A38(levelType); + if (count == 0) + VarSet(VAR_0x4000, 5); + break; + case 1: + sub_80E5A38(levelType); + VarSet(VAR_0x4000, 1); + count++; + break; + case 3: + break; + case 4: + VarSet(VAR_0x4000, 2); + count++; + break; + case 5: + VarSet(VAR_0x4000, 3); + count++; + break; + case 6: + break; + case 2: + VarSet(VAR_0x4000, 4); + count++; + break; + } + } + if (gSaveBlock2Ptr->battleTower.var_4AE[0] == 3 && gSaveBlock2Ptr->battleTower.var_4AE[1] == 3) + VarSet(VAR_0x4000, 5); + sub_80E7064(); +} + +void sub_80E5A38(u8 levelType) +{ + gSaveBlock2Ptr->battleTower.var_4AE[levelType] = 0; + gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] = 1; + gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] = 1; +} + +bool8 sub_80E5A70(u8 levelType, u16 winStreak) +{ + u8 trainerTeamLevel; + u8 monLevel; + s32 i; + u16 validPartySpecies[6]; + u16 validPartyHeldItems[6]; + u8 numValid; + + numValid = 0; + + ValidateEReaderTrainer(); + + if (gSpecialVar_Result != 0 || gSaveBlock2Ptr->battleTower.ereaderTrainer.winStreak != winStreak) + return FALSE; + + if (levelType != 0) + trainerTeamLevel = 100; + else + trainerTeamLevel = 50; + + for (i = 0; i < 3; i++) + { + monLevel = gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].level; + if (gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].level != trainerTeamLevel) + return FALSE; + + sub_80E6564( + gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].species, + gSaveBlock2Ptr->battleTower.ereaderTrainer.party[i].heldItem, + 1, + levelType, + monLevel, + validPartySpecies, + validPartyHeldItems, + &numValid); + } + + return (numValid == 3); +} + +bool8 sub_80E5B14(void) +{ + s32 recordIndex, i; + u8 battleTowerLevelType; + u16 winStreak; + bool8 retVal; + s32 numCandidates; + u32 trainerIds[5]; + + numCandidates = 0; + battleTowerLevelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; + + winStreak = sub_80E7188(battleTowerLevelType); + if (sub_80E5A70(battleTowerLevelType, winStreak)) + { + gSaveBlock2Ptr->battleTower.battleTowerTrainerId = BATTLE_TOWER_EREADER_TRAINER_ID; + retVal = TRUE; + } + else + { + // Check if one of the battle tower trainers from record mixing should be the next trainer. + for (recordIndex = 0; recordIndex < 5; recordIndex++) + { + struct BattleTowerRecord *record = &gSaveBlock2Ptr->battleTower.records[recordIndex]; + u32 recordHasData = 0; + u32 checksum = 0; + + for (i = 0; i < sizeof(struct BattleTowerRecord) / sizeof(u32) - 1; i++) + { + recordHasData |= ((u32 *) record)[i]; + checksum += ((u32 *) record)[i]; + } + + if (gSaveBlock2Ptr->battleTower.records[recordIndex].winStreak == winStreak + && gSaveBlock2Ptr->battleTower.records[recordIndex].battleTowerLevelType == battleTowerLevelType + && recordHasData + && gSaveBlock2Ptr->battleTower.records[recordIndex].checksum == checksum) + { + trainerIds[numCandidates] = recordIndex; + numCandidates++; + } + } + + if (numCandidates == 0) + { + retVal = FALSE; + } + else + { + gSaveBlock2Ptr->battleTower.battleTowerTrainerId = + trainerIds[Random() % numCandidates] + BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID; + retVal = TRUE; + } + } + return retVal; +} + +void ChooseNextBattleTowerTrainer(void) +{ + int i; + u16 trainerId; + bool8 levelType; + + levelType = gSaveBlock2Ptr->battleTower.battleTowerLevelType; + if (sub_80E5B14()) + { + sub_80E5E5C(gSaveBlock2Ptr->battleTower.battleTowerTrainerId); + gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId; + return; + } + + if (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] <= 7) + { + if (gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] == 7) + { + do + { + trainerId = ((Random() & 0xFF) * 5) >> 7; + trainerId += (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1) * 10 + 20; + + // Ensure trainer wasn't previously fought in this challenge. + for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++); + } + while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1); + gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId; + } + else + { + do + { + trainerId = (((Random() & 0xFF) * 5) >> 6); + trainerId += (gSaveBlock2Ptr->battleTower.curStreakChallengesNum[levelType] - 1) * 10; + + // Ensure trainer wasn't previously fought in this challenge. + for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++); + } + while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1); + gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId; + } + } + else + { + do + { + trainerId = (((Random() & 0xFF) * 30) >> 8) + 70; + + // Ensure trainer wasn't previously fought in this challenge. + for (i = 0; i < gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1 && gSaveBlock2Ptr->battleTower.battledTrainerIds[i] != trainerId; i++); + } + while (i != gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1); + gSaveBlock2Ptr->battleTower.battleTowerTrainerId = trainerId; + } + + sub_80E5E5C(gSaveBlock2Ptr->battleTower.battleTowerTrainerId); + // Don't bother saving this trainer, since it's the last one in the challenge. + if (gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] < 7) + gSaveBlock2Ptr->battleTower.battledTrainerIds[gSaveBlock2Ptr->battleTower.curChallengeBattleNum[levelType] - 1] = gSaveBlock2Ptr->battleTower.battleTowerTrainerId; +} + +void sub_80E5E5C(u8 trainerClass) +{ + VarSet(VAR_OBJ_GFX_ID_0, MAP_OBJ_GFX_YOUNGSTER); +} + +void SetEReaderTrainerGfxId(void) +{ + sub_80E5E5C(BATTLE_TOWER_EREADER_TRAINER_ID); +} + +void sub_80E5E7C(struct BattleTowerRecord * record0) +{ + s32 i; + s32 j; + s32 k; + s32 l = 0; + struct BattleTowerRecord * record = record0; + + u16 winStreaks[6]; + u16 indices[6]; + + for (i = 0; i < 5; i++) + { + k = 0; + for (j = 0; j < 4; j++) + { + if (gSaveBlock2Ptr->battleTower.records[i].trainerId[j] != record->trainerId[j]) + break; + } + if (j == 4) + { + for (k = 0; k < 7; k++) + { + if (gSaveBlock2Ptr->battleTower.records[i].name[j] != record->name[j]) + break; + if (record->name[j] == EOS) + { + k = 7; + break; + } + } + } + if (k == 7) + break; + } + + if (i < 5) + { + gSaveBlock2Ptr->battleTower.records[i] = *record; + return; + } + + for (i = 0; i < 5; i++) + { + if (gSaveBlock2Ptr->battleTower.records[i].winStreak == 0) + break; + } + + if (i < 5) + { + gSaveBlock2Ptr->battleTower.records[i] = *record; + return; + } + + winStreaks[0] = gSaveBlock2Ptr->battleTower.records[0].winStreak; + indices[0] = 0; + l++; + + for (i = 1; i < 5; i++) + { + for (j = 0; j < l; j++) + { + if (gSaveBlock2Ptr->battleTower.records[i].winStreak < winStreaks[j]) + { + j = 0; + l = 1; + winStreaks[0] = gSaveBlock2Ptr->battleTower.records[i].winStreak; + indices[0] = i; + break; + } + if (gSaveBlock2Ptr->battleTower.records[i].winStreak > winStreaks[j]) + break; + } + if (j == l) + { + winStreaks[l] = gSaveBlock2Ptr->battleTower.records[i].winStreak; + indices[l] = i; + l++; + } + } + i = Random() % l; + gSaveBlock2Ptr->battleTower.records[indices[i]] = *record; +} + +u8 GetBattleTowerTrainerFrontSpriteId(void) +{ + if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass]; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + return gFacilityClassToPicIndex[gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].trainerClass]; + } + else + { + return gFacilityClassToPicIndex[gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; + } +} + +u8 sub_80E60E4(void) +{ + if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.ereaderTrainer.trainerClass]; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId >= BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + return gFacilityClassToTrainerClass[gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].trainerClass]; + } + else + { + return gFacilityClassToTrainerClass[gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].trainerClass]; + } +} + +void sub_80E6150(u8 *dest) +{ + s32 i; + if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + for (i = 0; i < 7; i++) + dest[i] = gSaveBlock2Ptr->battleTower.ereaderTrainer.name[i]; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + for (i = 0; i < 3; i++) + dest[i] = gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].name[i]; + } + else + { + for (i = 0; i < 7; i++) + dest[i] = gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].name[i]; + } + dest[i] = EOS; +} + +#ifdef NONMATCHING // r6/r7 swap +void sub_80E61DC(void) +{ + s32 partyIndex; + s32 i; + u16 chosenMonIndices[3]; + u8 friendship; + u8 level; + u8 fixedIV; + u8 battleMonsOffset; + u8 monPoolSize; + u8 teamFlags; + const struct BattleTowerPokemonTemplate *battleTowerMons; + + battleMonsOffset = 0; + monPoolSize = 60; + friendship = 255; + + ZeroEnemyPartyMons(); + + // Different trainers have access to different sets of pokemon to use in battle. + // The pokemon later in gBattleTowerLevel100Mons or gBattleTowerLevel50Mons are + // stronger. Additionally, the later trainers' pokemon are granted higher IVs. + if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 20) + { + fixedIV = 6; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 30) + { + fixedIV = 9; + battleMonsOffset = 30; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 40) + { + fixedIV = 12; + battleMonsOffset = 60; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 50) + { + fixedIV = 15; + battleMonsOffset = 90; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 60) + { + fixedIV = 18; + battleMonsOffset = 120; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 70) + { + fixedIV = 21; + battleMonsOffset = 150; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < 80) + { + fixedIV = 31; + battleMonsOffset = 180; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId < BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID) + { + fixedIV = 31; + battleMonsOffset = 200; + monPoolSize = 100; + } + else if (gSaveBlock2Ptr->battleTower.battleTowerTrainerId == BATTLE_TOWER_EREADER_TRAINER_ID) + { + // Load E-Reader trainer's party. + for (partyIndex = 0; partyIndex < 3; partyIndex++) + CreateBattleTowerMon(&gEnemyParty[partyIndex], &gSaveBlock2Ptr->battleTower.ereaderTrainer.party[partyIndex]); + return; + } + else + { + // Load a battle tower record's party. (From record mixing) + for (partyIndex = 0; partyIndex < 3; partyIndex++) + { + CreateBattleTowerMon( + &gEnemyParty[partyIndex], + &gSaveBlock2Ptr->battleTower.records[gSaveBlock2Ptr->battleTower.battleTowerTrainerId - BATTLE_TOWER_RECORD_MIXING_TRAINER_BASE_ID].party[partyIndex]); + } + return; + } + + // Use the appropriate list of pokemon and level depending on the + // current challenge type. (level 50 or level 100 challenge) + if (gSaveBlock2Ptr->battleTower.battleTowerLevelType != 0) + { + battleTowerMons = gBattleTowerLevel100Mons; + level = 100; + } + else + { + battleTowerMons = gBattleTowerLevel50Mons; + level = 50; + } + + teamFlags = gBattleTowerTrainers[gSaveBlock2Ptr->battleTower.battleTowerTrainerId].teamFlags; + + // Attempt to fill the trainer's party with random Pokemon until 3 have been + // successfully chosen. The trainer's party may not have duplicate pokemon species + // or duplicate held items. Each pokemon must have all of the trainer's team flags + // set, as well. If any of those conditions are not met, then the loop starts over + // and another pokemon is chosen at random. + partyIndex = 0; + while (partyIndex != 3) + { + // Pick a random pokemon index based on the number of pokemon available to choose from + // and the starting offset in the battle tower pokemon array. + s32 battleMonIndex = ((Random() & 0xFF) * monPoolSize) / 256 + battleMonsOffset; + + // Ensure the chosen pokemon has compatible team flags with the trainer. + if (teamFlags == 0 || (battleTowerMons[battleMonIndex].teamFlags & teamFlags) == teamFlags) + { + // Ensure this pokemon species isn't a duplicate. + for (i = 0; i < partyIndex; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_SPECIES, NULL) == battleTowerMons[battleMonIndex].species) + break; + } + + if (i != partyIndex) + continue; + + // Ensure this pokemon's held item isn't a duplicate. + for (i = 0; i < partyIndex; i++) + { + if (GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) != 0 + && GetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, NULL) == sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]) + break; + } + + if (i != partyIndex) + continue; + + // Ensure this exact pokemon index isn't a duplicate. This check doesn't seem necessary + // because the species and held items were already checked directly above. Perhaps this + // is leftover code before the logic for duplicate species and held items was added. + //for (i = 0; i < partyIndex && chosenMonIndices[i] != battleMonIndex; i++); + for (i = 0; i < partyIndex; i++) + { + if (chosenMonIndices[i] == battleMonIndex) + break; + } + + if (i != partyIndex) + continue; + + chosenMonIndices[partyIndex] = battleMonIndex; + + // Place the chosen pokemon into the trainer's party. + CreateMonWithEVSpread( + &gEnemyParty[partyIndex], + battleTowerMons[battleMonIndex].species, + level, + fixedIV, + battleTowerMons[battleMonIndex].evSpread); + + // Give the chosen pokemon its specified moves. + for (i = 0; i < 4; i++) + { + SetMonMoveSlot(&gEnemyParty[partyIndex], battleTowerMons[battleMonIndex].moves[i], i); + if (battleTowerMons[battleMonIndex].moves[i] == MOVE_FRUSTRATION) + friendship = 0; // MOVE_FRUSTRATION is more powerful the lower the pokemon's friendship is. + } + + SetMonData(&gEnemyParty[partyIndex], MON_DATA_FRIENDSHIP, &friendship); + SetMonData(&gEnemyParty[partyIndex], MON_DATA_HELD_ITEM, &sBattleTowerHeldItems[battleTowerMons[battleMonIndex].heldItem]); + + // The pokemon was successfully added to the trainer's party, so it's safe to move on to + // the next party slot. + partyIndex++; + } + } +} +#else +NAKED +void sub_80E61DC(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x28\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp, 0x18]\n" + "\tmovs r1, 0x3C\n" + "\tstr r1, [sp, 0x1C]\n" + "\tadd r4, sp, 0xC\n" + "\tmovs r0, 0xFF\n" + "\tstrb r0, [r4]\n" + "\tbl ZeroEnemyPartyMons\n" + "\tldr r1, _080E6210 @ =gSaveBlock2Ptr\n" + "\tldr r0, [r1]\n" + "\tldr r2, _080E6214 @ =0x0000056c\n" + "\tadds r0, r2\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x13\n" + "\tbhi _080E6218\n" + "\tmovs r3, 0x6\n" + "\tstr r3, [sp, 0x14]\n" + "\tb _080E62F4\n" + "\t.align 2, 0\n" + "_080E6210: .4byte gSaveBlock2Ptr\n" + "_080E6214: .4byte 0x0000056c\n" + "_080E6218:\n" + "\tcmp r0, 0x1D\n" + "\tbhi _080E6226\n" + "\tmovs r0, 0x9\n" + "\tstr r0, [sp, 0x14]\n" + "\tmovs r1, 0x1E\n" + "\tstr r1, [sp, 0x18]\n" + "\tb _080E62F4\n" + "_080E6226:\n" + "\tcmp r0, 0x27\n" + "\tbhi _080E6234\n" + "\tmovs r2, 0xC\n" + "\tstr r2, [sp, 0x14]\n" + "\tmovs r3, 0x3C\n" + "\tstr r3, [sp, 0x18]\n" + "\tb _080E62F4\n" + "_080E6234:\n" + "\tcmp r0, 0x31\n" + "\tbhi _080E6242\n" + "\tmovs r0, 0xF\n" + "\tstr r0, [sp, 0x14]\n" + "\tmovs r1, 0x5A\n" + "\tstr r1, [sp, 0x18]\n" + "\tb _080E62F4\n" + "_080E6242:\n" + "\tcmp r0, 0x3B\n" + "\tbhi _080E6250\n" + "\tmovs r2, 0x12\n" + "\tstr r2, [sp, 0x14]\n" + "\tmovs r3, 0x78\n" + "\tstr r3, [sp, 0x18]\n" + "\tb _080E62F4\n" + "_080E6250:\n" + "\tcmp r0, 0x45\n" + "\tbhi _080E625E\n" + "\tmovs r0, 0x15\n" + "\tstr r0, [sp, 0x14]\n" + "\tmovs r1, 0x96\n" + "\tstr r1, [sp, 0x18]\n" + "\tb _080E62F4\n" + "_080E625E:\n" + "\tcmp r0, 0x4F\n" + "\tbhi _080E626C\n" + "\tmovs r2, 0x1F\n" + "\tstr r2, [sp, 0x14]\n" + "\tmovs r3, 0xB4\n" + "\tstr r3, [sp, 0x18]\n" + "\tb _080E62F4\n" + "_080E626C:\n" + "\tcmp r0, 0x63\n" + "\tbhi _080E627E\n" + "\tmovs r0, 0x1F\n" + "\tstr r0, [sp, 0x14]\n" + "\tmovs r1, 0xC8\n" + "\tstr r1, [sp, 0x18]\n" + "\tmovs r2, 0x64\n" + "\tstr r2, [sp, 0x1C]\n" + "\tb _080E62F4\n" + "_080E627E:\n" + "\tcmp r0, 0xC8\n" + "\tbne _080E62B0\n" + "\tmovs r6, 0\n" + "\tadds r4, r1, 0\n" + "_080E6286:\n" + "\tmovs r0, 0x64\n" + "\tmuls r0, r6\n" + "\tldr r1, _080E62A8 @ =gEnemyParty\n" + "\tadds r0, r1\n" + "\tmovs r1, 0x2C\n" + "\tadds r2, r6, 0\n" + "\tmuls r2, r1\n" + "\tldr r3, _080E62AC @ =0x000004d4\n" + "\tadds r2, r3\n" + "\tldr r1, [r4]\n" + "\tadds r1, r2\n" + "\tbl CreateBattleTowerMon\n" + "\tadds r6, 0x1\n" + "\tcmp r6, 0x2\n" + "\tble _080E6286\n" + "\tb _080E64A6\n" + "\t.align 2, 0\n" + "_080E62A8: .4byte gEnemyParty\n" + "_080E62AC: .4byte 0x000004d4\n" + "_080E62B0:\n" + "\tmovs r6, 0\n" + "_080E62B2:\n" + "\tmovs r0, 0x64\n" + "\tmuls r0, r6\n" + "\tldr r1, _080E62E4 @ =gEnemyParty\n" + "\tadds r0, r1\n" + "\tldr r1, _080E62E8 @ =gSaveBlock2Ptr\n" + "\tldr r1, [r1]\n" + "\tldr r3, _080E62EC @ =0x0000056c\n" + "\tadds r2, r1, r3\n" + "\tldrb r3, [r2]\n" + "\tmovs r2, 0xA4\n" + "\tmuls r2, r3\n" + "\tldr r3, _080E62F0 @ =0xffffc144\n" + "\tadds r2, r3\n" + "\tadds r1, r2\n" + "\tmovs r2, 0x2C\n" + "\tmuls r2, r6\n" + "\tadds r2, 0x1C\n" + "\tadds r1, r2\n" + "\tbl CreateBattleTowerMon\n" + "\tadds r6, 0x1\n" + "\tcmp r6, 0x2\n" + "\tble _080E62B2\n" + "\tb _080E64A6\n" + "\t.align 2, 0\n" + "_080E62E4: .4byte gEnemyParty\n" + "_080E62E8: .4byte gSaveBlock2Ptr\n" + "_080E62EC: .4byte 0x0000056c\n" + "_080E62F0: .4byte 0xffffc144\n" + "_080E62F4:\n" + "\tldr r2, _080E6314 @ =gSaveBlock2Ptr\n" + "\tldr r0, [r2]\n" + "\tldr r1, _080E6318 @ =0x0000055c\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tadds r1, r2, 0\n" + "\tcmp r0, 0\n" + "\tbeq _080E6320\n" + "\tldr r2, _080E631C @ =gBattleTowerLevel100Mons\n" + "\tmov r10, r2\n" + "\tmovs r3, 0x64\n" + "\tstr r3, [sp, 0x10]\n" + "\tb _080E6328\n" + "\t.align 2, 0\n" + "_080E6314: .4byte gSaveBlock2Ptr\n" + "_080E6318: .4byte 0x0000055c\n" + "_080E631C: .4byte gBattleTowerLevel100Mons\n" + "_080E6320:\n" + "\tldr r0, _080E6378 @ =gBattleTowerLevel50Mons\n" + "\tmov r10, r0\n" + "\tmovs r2, 0x32\n" + "\tstr r2, [sp, 0x10]\n" + "_080E6328:\n" + "\tldr r2, _080E637C @ =gBattleTowerTrainers\n" + "\tldr r0, [r1]\n" + "\tldr r3, _080E6380 @ =0x0000056c\n" + "\tadds r0, r3\n" + "\tldrb r1, [r0]\n" + "\tlsls r0, r1, 2\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r0, r2\n" + "\tldrb r0, [r0, 0x4]\n" + "\tstr r0, [sp, 0x20]\n" + "\tmovs r6, 0\n" + "_080E6340:\n" + "\tbl Random\n" + "\tmovs r1, 0xFF\n" + "\tands r1, r0\n" + "\tldr r2, [sp, 0x1C]\n" + "\tadds r0, r1, 0\n" + "\tmuls r0, r2\n" + "\tasrs r0, 8\n" + "\tldr r3, [sp, 0x18]\n" + "\tadds r7, r0, r3\n" + "\tldr r0, [sp, 0x20]\n" + "\tcmp r0, 0\n" + "\tbeq _080E636A\n" + "\tlsls r0, r7, 4\n" + "\tadd r0, r10\n" + "\tldrb r0, [r0, 0x3]\n" + "\tldr r1, [sp, 0x20]\n" + "\tands r0, r1\n" + "\tcmp r0, r1\n" + "\tbeq _080E636A\n" + "\tb _080E64A0\n" + "_080E636A:\n" + "\tmovs r5, 0\n" + "\tlsls r0, r7, 4\n" + "\tmov r2, r10\n" + "\tadds r3, r0, r2\n" + "\tmovs r4, 0\n" + "\tb _080E6388\n" + "\t.align 2, 0\n" + "_080E6378: .4byte gBattleTowerLevel50Mons\n" + "_080E637C: .4byte gBattleTowerTrainers\n" + "_080E6380: .4byte 0x0000056c\n" + "_080E6384:\n" + "\tadds r4, 0x64\n" + "\tadds r5, 0x1\n" + "_080E6388:\n" + "\tcmp r5, r6\n" + "\tbge _080E63A2\n" + "\tldr r1, _080E64B8 @ =gEnemyParty\n" + "\tadds r0, r4, r1\n" + "\tmovs r1, 0xB\n" + "\tmovs r2, 0\n" + "\tstr r3, [sp, 0x24]\n" + "\tbl GetMonData\n" + "\tldr r3, [sp, 0x24]\n" + "\tldrh r2, [r3]\n" + "\tcmp r0, r2\n" + "\tbne _080E6384\n" + "_080E63A2:\n" + "\tcmp r5, r6\n" + "\tbne _080E64A0\n" + "\tmovs r5, 0\n" + "\tcmp r5, r6\n" + "\tbge _080E63F0\n" + "\tldr r3, _080E64BC @ =sBattleTowerHeldItems\n" + "\tmov r9, r3\n" + "\tlsls r0, r7, 4\n" + "\tadd r0, r10\n" + "\tmov r8, r0\n" + "\tmovs r3, 0\n" + "_080E63B8:\n" + "\tldr r0, _080E64B8 @ =gEnemyParty\n" + "\tadds r4, r3, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xC\n" + "\tmovs r2, 0\n" + "\tstr r3, [sp, 0x24]\n" + "\tbl GetMonData\n" + "\tldr r3, [sp, 0x24]\n" + "\tcmp r0, 0\n" + "\tbeq _080E63E8\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xC\n" + "\tmovs r2, 0\n" + "\tbl GetMonData\n" + "\tmov r2, r8\n" + "\tldrb r1, [r2, 0x2]\n" + "\tlsls r1, 1\n" + "\tadd r1, r9\n" + "\tldr r3, [sp, 0x24]\n" + "\tldrh r1, [r1]\n" + "\tcmp r0, r1\n" + "\tbeq _080E63F0\n" + "_080E63E8:\n" + "\tadds r3, 0x64\n" + "\tadds r5, 0x1\n" + "\tcmp r5, r6\n" + "\tblt _080E63B8\n" + "_080E63F0:\n" + "\tcmp r5, r6\n" + "\tbne _080E64A0\n" + "\tmovs r5, 0\n" + "\tcmp r5, r6\n" + "\tbge _080E6412\n" + "\tadd r0, sp, 0x4\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r7\n" + "\tbeq _080E6412\n" + "\tadd r1, sp, 0x4\n" + "_080E6404:\n" + "\tadds r1, 0x2\n" + "\tadds r5, 0x1\n" + "\tcmp r5, r6\n" + "\tbge _080E6412\n" + "\tldrh r0, [r1]\n" + "\tcmp r0, r7\n" + "\tbne _080E6404\n" + "_080E6412:\n" + "\tcmp r5, r6\n" + "\tbne _080E64A0\n" + "\tlsls r0, r6, 1\n" + "\tadd r0, sp\n" + "\tadds r0, 0x4\n" + "\tstrh r7, [r0]\n" + "\tmovs r3, 0x64\n" + "\tadds r0, r6, 0\n" + "\tmuls r0, r3\n" + "\tldr r1, _080E64B8 @ =gEnemyParty\n" + "\tadds r0, r1\n" + "\tlsls r4, r7, 4\n" + "\tmov r3, r10\n" + "\tadds r2, r4, r3\n" + "\tldrh r1, [r2]\n" + "\tldrb r2, [r2, 0xC]\n" + "\tstr r2, [sp]\n" + "\tldr r2, [sp, 0x10]\n" + "\tldr r3, [sp, 0x14]\n" + "\tbl CreateMonWithEVSpread\n" + "\tmovs r5, 0\n" + "\tadds r0, r6, 0x1\n" + "\tmov r9, r0\n" + "\tmov r8, r4\n" + "\tmovs r0, 0x64\n" + "\tadds r7, r6, 0\n" + "\tmuls r7, r0\n" + "\tmov r0, r10\n" + "\tadds r0, 0x4\n" + "\tadds r4, r0\n" + "\tldr r3, _080E64B8 @ =gEnemyParty\n" + "_080E6452:\n" + "\tldrh r1, [r4]\n" + "\tlsls r2, r5, 24\n" + "\tlsrs r2, 24\n" + "\tadds r0, r7, r3\n" + "\tstr r3, [sp, 0x24]\n" + "\tbl SetMonMoveSlot\n" + "\tldrh r0, [r4]\n" + "\tldr r3, [sp, 0x24]\n" + "\tcmp r0, 0xDA\n" + "\tbne _080E646E\n" + "\tmovs r0, 0\n" + "\tmov r1, sp\n" + "\tstrb r0, [r1, 0xC]\n" + "_080E646E:\n" + "\tadds r4, 0x2\n" + "\tadds r5, 0x1\n" + "\tcmp r5, 0x3\n" + "\tble _080E6452\n" + "\tmovs r2, 0x64\n" + "\tadds r4, r6, 0\n" + "\tmuls r4, r2\n" + "\tldr r3, _080E64B8 @ =gEnemyParty\n" + "\tadds r4, r3\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x20\n" + "\tadd r2, sp, 0xC\n" + "\tbl SetMonData\n" + "\tmov r0, r8\n" + "\tadd r0, r10\n" + "\tldrb r2, [r0, 0x2]\n" + "\tlsls r2, 1\n" + "\tldr r0, _080E64BC @ =sBattleTowerHeldItems\n" + "\tadds r2, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xC\n" + "\tbl SetMonData\n" + "\tmov r6, r9\n" + "_080E64A0:\n" + "\tcmp r6, 0x3\n" + "\tbeq _080E64A6\n" + "\tb _080E6340\n" + "_080E64A6:\n" + "\tadd sp, 0x28\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080E64B8: .4byte gEnemyParty\n" + "_080E64BC: .4byte sBattleTowerHeldItems"); +} +#endif //NONMATCHING |