diff options
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | asm/wild_encounter.s | 1746 | ||||
-rw-r--r-- | data/data2.s | 3 | ||||
-rw-r--r-- | include/fieldmap.h | 20 | ||||
-rw-r--r-- | include/global.h | 45 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/wild_encounter.c | 1059 |
7 files changed, 1100 insertions, 1776 deletions
@@ -73,7 +73,6 @@ asm/battle_setup.o \ asm/cable_club.o \ asm/mori_debug_menu.o \ asm/trainer_see.o \ -asm/wild_encounter.o \ asm/field_effect.o \ asm/rom_80859BC.o \ asm/pokedex.o \ diff --git a/asm/wild_encounter.s b/asm/wild_encounter.s deleted file mode 100644 index 66e33532d..000000000 --- a/asm/wild_encounter.s +++ /dev/null @@ -1,1746 +0,0 @@ - .include "constants/gba_constants.s" - .include "constants/species_constants.s" - .include "asm/macros.s" - - .syntax unified - - .text - - thumb_func_start DisableWildEncounters -DisableWildEncounters: @ 8084978 - ldr r1, _08084980 @ =gWildEncountersDisabled - strb r0, [r1] - bx lr - .align 2, 0 -_08084980: .4byte gWildEncountersDisabled - thumb_func_end DisableWildEncounters - - thumb_func_start sub_8084984 -sub_8084984: @ 8084984 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8 - lsls r0, 16 - lsrs r0, 16 - str r0, [sp] - lsls r1, 16 - lsrs r1, 16 - str r1, [sp, 0x4] - lsls r2, 24 - lsrs r2, 24 - ldr r3, _08084A0C @ =gUnknown_0839DC00 - lsls r1, r2, 1 - adds r1, r2 - lsls r2, r1, 1 - adds r2, r3 - adds r0, r1, 0x1 - lsls r0, 1 - adds r0, r3 - ldrh r0, [r0] - mov r9, r0 - adds r1, 0x2 - lsls r1, 1 - adds r1, r3 - ldrh r6, [r1] - ldrh r5, [r2] - cmp r5, r9 - bhi _08084A2E - ldr r0, _08084A10 @ =gMapHeader - mov r10, r0 -_080849C6: - movs r4, 0 - mov r1, r10 - ldr r0, [r1] - ldr r0, [r0] - cmp r4, r0 - bge _08084A24 - ldr r1, [sp] - lsls r0, r1, 16 - asrs r0, 16 - mov r8, r0 - ldr r1, [sp, 0x4] - lsls r0, r1, 16 - asrs r7, r0, 16 -_080849E0: - adds r0, r4, 0x7 - adds r1, r5, 0x7 - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_805759C - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08084A14 - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r6, r0, 16 - cmp r8, r4 - bne _08084A14 - cmp r7, r5 - bne _08084A14 - adds r0, r6, 0 - b _08084A34 - .align 2, 0 -_08084A0C: .4byte gUnknown_0839DC00 -_08084A10: .4byte gMapHeader -_08084A14: - adds r0, r4, 0x1 - lsls r0, 16 - lsrs r4, r0, 16 - mov r1, r10 - ldr r0, [r1] - ldr r0, [r0] - cmp r4, r0 - blt _080849E0 -_08084A24: - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, r9 - bls _080849C6 -_08084A2E: - adds r0, r6, 0x1 - lsls r0, 16 - lsrs r0, 16 -_08084A34: - add sp, 0x8 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8084984 - - thumb_func_start CheckFeebas -CheckFeebas: @ 8084A44 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x10 - movs r7, 0 - ldr r0, _08084ABC @ =gSaveBlock1 - ldrh r1, [r0, 0x4] - movs r0, 0x88 - lsls r0, 6 - cmp r1, r0 - bne _08084B38 - add r5, sp, 0xC - mov r4, sp - adds r4, 0xE - adds r0, r5, 0 - adds r1, r4, 0 - bl GetXYCoordsOneStepInFrontOfPlayer - ldrh r0, [r5] - subs r0, 0x7 - strh r0, [r5] - ldrh r0, [r4] - subs r0, 0x7 - strh r0, [r4] - movs r0, 0 - ldrsh r1, [r4, r0] - ldr r0, _08084AC0 @ =gUnknown_0839DC00 - mov r9, r5 - mov r8, r4 - ldrh r2, [r0, 0x6] - cmp r1, r2 - blt _08084A8E - ldrh r3, [r0, 0x8] - cmp r1, r3 - bgt _08084A8E - movs r7, 0x1 -_08084A8E: - mov r2, r8 - movs r3, 0 - ldrsh r1, [r2, r3] - ldrh r2, [r0, 0xC] - cmp r1, r2 - blt _08084AA2 - ldrh r0, [r0, 0xE] - cmp r1, r0 - bgt _08084AA2 - movs r7, 0x2 -_08084AA2: - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x31 - bls _08084AC8 - b _08084B38 - .align 2, 0 -_08084ABC: .4byte gSaveBlock1 -_08084AC0: .4byte gUnknown_0839DC00 -_08084AC4: - movs r0, 0x1 - b _08084B3A -_08084AC8: - ldr r0, _08084B48 @ =gSaveBlock1 - ldr r3, _08084B4C @ =0x00002dd6 - adds r0, r3 - ldrh r0, [r0] - bl FeebasSeedRng - movs r5, 0 - ldr r6, _08084B50 @ =0x000001bf -_08084AD8: - bl FeebasRandom - lsls r1, r5, 1 - mov r2, sp - adds r4, r2, r1 - lsls r0, 16 - lsrs r0, 16 - adds r1, r6, 0 - bl __umodsi3 - strh r0, [r4] - lsls r0, 16 - cmp r0, 0 - bne _08084AF6 - strh r6, [r4] -_08084AF6: - ldrh r0, [r4] - subs r0, 0x1 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x2 - bls _08084B08 - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 -_08084B08: - cmp r5, 0x6 - bne _08084AD8 - mov r3, r9 - movs r1, 0 - ldrsh r0, [r3, r1] - mov r2, r8 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r2, r7, 0 - bl sub_8084984 - lsls r0, 16 - lsrs r1, r0, 16 - movs r5, 0 -_08084B24: - lsls r0, r5, 1 - add r0, sp - ldrh r0, [r0] - cmp r1, r0 - beq _08084AC4 - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x5 - bls _08084B24 -_08084B38: - movs r0, 0 -_08084B3A: - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08084B48: .4byte gSaveBlock1 -_08084B4C: .4byte 0x00002dd6 -_08084B50: .4byte 0x000001bf - thumb_func_end CheckFeebas - - thumb_func_start FeebasRandom -FeebasRandom: @ 8084B54 - ldr r2, _08084B68 @ =gUnknown_0202FF80 - ldr r1, [r2] - ldr r0, _08084B6C @ =0x41c64e6d - muls r0, r1 - ldr r1, _08084B70 @ =0x00003039 - adds r0, r1 - str r0, [r2] - lsrs r0, 16 - bx lr - .align 2, 0 -_08084B68: .4byte gUnknown_0202FF80 -_08084B6C: .4byte 0x41c64e6d -_08084B70: .4byte 0x00003039 - thumb_func_end FeebasRandom - - thumb_func_start FeebasSeedRng -FeebasSeedRng: @ 8084B74 - lsls r0, 16 - lsrs r0, 16 - ldr r1, _08084B80 @ =gUnknown_0202FF80 - str r0, [r1] - bx lr - .align 2, 0 -_08084B80: .4byte gUnknown_0202FF80 - thumb_func_end FeebasSeedRng - - thumb_func_start PickWildMon_Grass -PickWildMon_Grass: @ 8084B84 - push {lr} - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x13 - bhi _08084BA0 - movs r0, 0 - b _08084C3A -_08084BA0: - adds r0, r1, 0 - subs r0, 0x14 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x13 - bhi _08084BB0 - movs r0, 0x1 - b _08084C3A -_08084BB0: - adds r0, r1, 0 - subs r0, 0x28 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x9 - bhi _08084BC0 - movs r0, 0x2 - b _08084C3A -_08084BC0: - adds r0, r1, 0 - subs r0, 0x32 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x9 - bhi _08084BD0 - movs r0, 0x3 - b _08084C3A -_08084BD0: - adds r0, r1, 0 - subs r0, 0x3C - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x9 - bhi _08084BE0 - movs r0, 0x4 - b _08084C3A -_08084BE0: - adds r0, r1, 0 - subs r0, 0x46 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x9 - bhi _08084BF0 - movs r0, 0x5 - b _08084C3A -_08084BF0: - adds r0, r1, 0 - subs r0, 0x50 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _08084C00 - movs r0, 0x6 - b _08084C3A -_08084C00: - adds r0, r1, 0 - subs r0, 0x55 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _08084C10 - movs r0, 0x7 - b _08084C3A -_08084C10: - adds r0, r1, 0 - subs r0, 0x5A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bhi _08084C20 - movs r0, 0x8 - b _08084C3A -_08084C20: - adds r0, r1, 0 - subs r0, 0x5E - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bhi _08084C30 - movs r0, 0x9 - b _08084C3A -_08084C30: - cmp r1, 0x62 - beq _08084C38 - movs r0, 0xB - b _08084C3A -_08084C38: - movs r0, 0xA -_08084C3A: - pop {r1} - bx r1 - thumb_func_end PickWildMon_Grass - - thumb_func_start PickWildMon_Water -PickWildMon_Water: @ 8084C40 - push {lr} - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - lsls r0, 24 - lsrs r1, r0, 24 - adds r2, r1, 0 - cmp r1, 0x3B - bhi _08084C5E - movs r0, 0 - b _08084C90 -_08084C5E: - adds r0, r1, 0 - subs r0, 0x3C - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1D - bhi _08084C6E - movs r0, 0x1 - b _08084C90 -_08084C6E: - adds r0, r1, 0 - subs r0, 0x5A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _08084C7E - movs r0, 0x2 - b _08084C90 -_08084C7E: - adds r0, r2, 0 - subs r0, 0x5F - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bls _08084C8E - movs r0, 0x4 - b _08084C90 -_08084C8E: - movs r0, 0x3 -_08084C90: - pop {r1} - bx r1 - thumb_func_end PickWildMon_Water - - thumb_func_start PickWildMon_Fishing -PickWildMon_Fishing: @ 8084C94 - push {r4-r6,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r6, r4, 0 - movs r5, 0 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - lsls r0, 24 - lsrs r1, r0, 24 - cmp r4, 0x1 - beq _08084CCE - cmp r4, 0x1 - bgt _08084CBE - cmp r4, 0 - beq _08084CC4 - b _08084D28 -_08084CBE: - cmp r6, 0x2 - beq _08084CF2 - b _08084D28 -_08084CC4: - movs r5, 0x1 - cmp r1, 0x45 - bhi _08084D28 - movs r5, 0 - b _08084D28 -_08084CCE: - cmp r1, 0x3B - bhi _08084CD4 - movs r5, 0x2 -_08084CD4: - adds r0, r1, 0 - subs r0, 0x3C - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x13 - bhi _08084CE2 - movs r5, 0x3 -_08084CE2: - adds r0, r1, 0 - subs r0, 0x50 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x13 - bhi _08084D28 - movs r5, 0x4 - b _08084D28 -_08084CF2: - cmp r1, 0x27 - bhi _08084CF8 - movs r5, 0x5 -_08084CF8: - adds r0, r1, 0 - subs r0, 0x28 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x27 - bhi _08084D06 - movs r5, 0x6 -_08084D06: - adds r0, r1, 0 - subs r0, 0x50 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xE - bhi _08084D14 - movs r5, 0x7 -_08084D14: - adds r0, r1, 0 - subs r0, 0x5F - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bhi _08084D22 - movs r5, 0x8 -_08084D22: - cmp r1, 0x63 - bne _08084D28 - movs r5, 0x9 -_08084D28: - adds r0, r5, 0 - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end PickWildMon_Fishing - - thumb_func_start RandomInRange -RandomInRange: @ 8084D30 - push {r4,r5,lr} - adds r4, r0, 0 - ldrb r0, [r4, 0x1] - ldrb r1, [r4] - cmp r0, r1 - bcc _08084D40 - ldrb r5, [r4] - b _08084D44 -_08084D40: - ldrb r5, [r4, 0x1] - ldrb r0, [r4] -_08084D44: - subs r4, r0, r5 - adds r4, 0x1 - lsls r4, 24 - lsrs r4, 24 - bl Random - lsls r0, 16 - lsrs r0, 16 - adds r1, r4, 0 - bl __modsi3 - lsls r0, 24 - lsrs r0, 24 - adds r0, r5, r0 - lsls r0, 24 - lsrs r0, 24 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end RandomInRange - - thumb_func_start GetCurrentMapWildMonHeader -GetCurrentMapWildMonHeader: @ 8084D6C - push {r4-r6,lr} - movs r3, 0 - ldr r5, _08084D9C @ =gWildMonHeaders - ldrb r0, [r5] - cmp r0, 0xFF - beq _08084DB8 - adds r6, r5, 0 - ldr r4, _08084DA0 @ =gSaveBlock1 -_08084D7C: - lsls r0, r3, 2 - adds r0, r3 - lsls r0, 2 - adds r2, r0, r6 - ldrb r1, [r2] - movs r0, 0x4 - ldrsb r0, [r4, r0] - cmp r1, r0 - bne _08084DA4 - ldrb r1, [r2, 0x1] - movs r0, 0x5 - ldrsb r0, [r4, r0] - cmp r1, r0 - bne _08084DA4 - adds r0, r3, 0 - b _08084DBA - .align 2, 0 -_08084D9C: .4byte gWildMonHeaders -_08084DA0: .4byte gSaveBlock1 -_08084DA4: - adds r0, r3, 0x1 - lsls r0, 16 - lsrs r3, r0, 16 - lsls r0, r3, 2 - adds r0, r3 - lsls r0, 2 - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0xFF - bne _08084D7C -_08084DB8: - ldr r0, _08084DC0 @ =0x0000ffff -_08084DBA: - pop {r4-r6} - pop {r1} - bx r1 - .align 2, 0 -_08084DC0: .4byte 0x0000ffff - thumb_func_end GetCurrentMapWildMonHeader - - thumb_func_start PickWildMonNature -PickWildMonNature: @ 8084DC4 - push {r4-r7,lr} - sub sp, 0x1C - bl GetSafariZoneFlag - cmp r0, 0x1 - bne _08084E5E - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x4F - bhi _08084E5E - bl sub_80C8448 - adds r7, r0, 0 - cmp r7, 0 - beq _08084E5E - movs r5, 0 -_08084DF2: - mov r1, sp - adds r0, r1, r5 - strb r5, [r0] - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x18 - bls _08084DF2 - movs r5, 0 -_08084E04: - adds r1, r5, 0x1 - lsls r0, r1, 24 - lsrs r4, r0, 24 - adds r6, r1, 0 - cmp r4, 0x18 - bhi _08084E34 - add r5, sp -_08084E12: - bl Random - movs r1, 0x1 - ands r1, r0 - cmp r1, 0 - beq _08084E2A - ldrb r2, [r5] - mov r0, sp - adds r1, r0, r4 - ldrb r0, [r1] - strb r0, [r5] - strb r2, [r1] -_08084E2A: - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x18 - bls _08084E12 -_08084E34: - lsls r0, r6, 24 - lsrs r5, r0, 24 - cmp r5, 0x17 - bls _08084E04 - movs r5, 0 -_08084E3E: - mov r1, sp - adds r4, r1, r5 - ldrb r0, [r4] - adds r1, r7, 0 - bl sub_810CAE4 - lsls r0, 16 - cmp r0, 0 - ble _08084E54 - ldrb r0, [r4] - b _08084E70 -_08084E54: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x18 - bls _08084E3E -_08084E5E: - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x19 - bl __umodsi3 - lsls r0, 24 - lsrs r0, 24 -_08084E70: - add sp, 0x1C - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end PickWildMonNature - - thumb_func_start CreateWildMon -CreateWildMon: @ 8084E78 - push {r4,r5,lr} - sub sp, 0x4 - adds r4, r0, 0 - adds r5, r1, 0 - lsls r4, 16 - lsrs r4, 16 - lsls r5, 24 - lsrs r5, 24 - bl ZeroEnemyPartyMons - bl PickWildMonNature - lsls r0, 24 - lsrs r0, 24 - ldr r1, _08084EAC @ =gEnemyParty - str r0, [sp] - adds r0, r1, 0 - adds r1, r4, 0 - adds r2, r5, 0 - movs r3, 0x20 - bl CreateMonWithNature - add sp, 0x4 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08084EAC: .4byte gEnemyParty - thumb_func_end CreateWildMon - - thumb_func_start GenerateWildMon -GenerateWildMon: @ 8084EB0 - push {r4-r7,lr} - adds r6, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r3, r1, 0 - lsls r2, 24 - lsrs r7, r2, 24 - movs r0, 0 - cmp r1, 0x1 - beq _08084EDA - cmp r1, 0x1 - bgt _08084ECE - cmp r1, 0 - beq _08084ED4 - b _08084EE2 -_08084ECE: - cmp r3, 0x2 - beq _08084EDA - b _08084EE2 -_08084ED4: - bl PickWildMon_Grass - b _08084EDE -_08084EDA: - bl PickWildMon_Water -_08084EDE: - lsls r0, 24 - lsrs r0, 24 -_08084EE2: - lsls r4, r0, 2 - ldr r0, [r6, 0x4] - adds r0, r4 - bl RandomInRange - lsls r0, 24 - lsrs r5, r0, 24 - cmp r7, 0x1 - bne _08084F04 - adds r0, r5, 0 - bl RepelCheck - lsls r0, 24 - cmp r0, 0 - bne _08084F04 - movs r0, 0 - b _08084F12 -_08084F04: - ldr r0, [r6, 0x4] - adds r0, r4, r0 - ldrh r0, [r0, 0x2] - adds r1, r5, 0 - bl CreateWildMon - movs r0, 0x1 -_08084F12: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end GenerateWildMon - - thumb_func_start GenerateFishingWildMon -GenerateFishingWildMon: @ 8084F18 - push {r4,r5,lr} - adds r5, r0, 0 - lsls r0, r1, 24 - lsrs r0, 24 - bl PickWildMon_Fishing - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 22 - ldr r0, [r5, 0x4] - adds r0, r4 - bl RandomInRange - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - ldr r0, [r5, 0x4] - adds r0, r4, r0 - ldrh r0, [r0, 0x2] - bl CreateWildMon - ldr r0, [r5, 0x4] - adds r4, r0 - ldrh r0, [r4, 0x2] - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end GenerateFishingWildMon - - thumb_func_start SetUpMassOutbreakEncounter -SetUpMassOutbreakEncounter: @ 8084F50 - push {r4,r5,lr} - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08084F78 - ldr r0, _08084F74 @ =gSaveBlock1 - movs r1, 0xAC - lsls r1, 6 - adds r0, r1 - ldrb r0, [r0] - bl RepelCheck - lsls r0, 24 - cmp r0, 0 - bne _08084F78 - movs r0, 0 - b _08084FAC - .align 2, 0 -_08084F74: .4byte gSaveBlock1 -_08084F78: - ldr r4, _08084FB4 @ =gSaveBlock1 - ldr r2, _08084FB8 @ =0x00002afc - adds r0, r4, r2 - ldrh r0, [r0] - adds r2, 0x4 - adds r1, r4, r2 - ldrb r1, [r1] - bl CreateWildMon - movs r5, 0 - ldr r0, _08084FBC @ =0x00002b04 - adds r4, r0 -_08084F90: - lsls r0, r5, 1 - adds r0, r4 - ldrh r1, [r0] - lsls r2, r5, 24 - lsrs r2, 24 - ldr r0, _08084FC0 @ =gEnemyParty - bl SetMonMoveSlot - adds r0, r5, 0x1 - lsls r0, 16 - lsrs r5, r0, 16 - cmp r5, 0x3 - bls _08084F90 - movs r0, 0x1 -_08084FAC: - pop {r4,r5} - pop {r1} - bx r1 - .align 2, 0 -_08084FB4: .4byte gSaveBlock1 -_08084FB8: .4byte 0x00002afc -_08084FBC: .4byte 0x00002b04 -_08084FC0: .4byte gEnemyParty - thumb_func_end SetUpMassOutbreakEncounter - - thumb_func_start DoMassOutbreakEncounterTest -DoMassOutbreakEncounterTest: @ 8084FC4 - push {r4,lr} - ldr r4, _08085010 @ =gSaveBlock1 - ldr r1, _08085014 @ =0x00002afc - adds r0, r4, r1 - ldrh r0, [r0] - cmp r0, 0 - beq _08085020 - movs r1, 0x5 - ldrsb r1, [r4, r1] - ldr r2, _08085018 @ =0x00002afe - adds r0, r4, r2 - ldrb r0, [r0] - cmp r1, r0 - bne _08085020 - movs r1, 0x4 - ldrsb r1, [r4, r1] - adds r2, 0x1 - adds r0, r4, r2 - ldrb r0, [r0] - cmp r1, r0 - bne _08085020 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - ldr r2, _0808501C @ =0x00002b0d - adds r1, r4, r2 - lsls r0, 16 - lsrs r0, 16 - ldrb r1, [r1] - cmp r0, r1 - bcs _08085020 - movs r0, 0x1 - b _08085022 - .align 2, 0 -_08085010: .4byte gSaveBlock1 -_08085014: .4byte 0x00002afc -_08085018: .4byte 0x00002afe -_0808501C: .4byte 0x00002b0d -_08085020: - movs r0, 0 -_08085022: - pop {r4} - pop {r1} - bx r1 - thumb_func_end DoMassOutbreakEncounterTest - - thumb_func_start DoWildEncounterRateDiceRoll -DoWildEncounterRateDiceRoll: @ 8085028 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 16 - lsrs r4, 16 - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0xB4 - lsls r1, 4 - bl __umodsi3 - lsls r0, 16 - lsrs r0, 16 - cmp r0, r4 - bcc _0808504C - movs r0, 0 - b _0808504E -_0808504C: - movs r0, 0x1 -_0808504E: - pop {r4} - pop {r1} - bx r1 - thumb_func_end DoWildEncounterRateDiceRoll - - thumb_func_start DoWildEncounterTest -DoWildEncounterTest: @ 8085054 - push {r4,lr} - sub sp, 0x4 - str r0, [sp] - lsls r1, 24 - lsrs r4, r1, 24 - lsls r0, 4 - str r0, [sp] - movs r0, 0x6 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - beq _0808507E - ldr r1, [sp] - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 4 - movs r1, 0x64 - bl __udivsi3 - str r0, [sp] -_0808507E: - mov r0, sp - bl ApplyFluteEncounterRateMod - mov r0, sp - bl ApplyCleanseTagEncounterRateMod - cmp r4, 0 - bne _080850BA - ldr r4, _080850DC @ =gPlayerParty - adds r0, r4, 0 - movs r1, 0x6 - bl GetMonData - cmp r0, 0 - bne _080850BA - adds r0, r4, 0 - bl GetMonAbility - lsls r0, 24 - lsrs r1, r0, 24 - cmp r1, 0x1 - bne _080850B0 - ldr r0, [sp] - lsrs r0, 1 - str r0, [sp] -_080850B0: - cmp r1, 0x23 - bne _080850BA - ldr r0, [sp] - lsls r0, 1 - str r0, [sp] -_080850BA: - ldr r0, [sp] - movs r1, 0xB4 - lsls r1, 4 - cmp r0, r1 - bls _080850C6 - str r1, [sp] -_080850C6: - ldr r0, [sp] - lsls r0, 16 - lsrs r0, 16 - bl DoWildEncounterRateDiceRoll - lsls r0, 24 - lsrs r0, 24 - add sp, 0x4 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080850DC: .4byte gPlayerParty - thumb_func_end DoWildEncounterTest - - thumb_func_start DoGlobalWildEncounterDiceRoll -DoGlobalWildEncounterDiceRoll: @ 80850E0 - push {lr} - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x3B - bhi _080850FC - movs r0, 0x1 - b _080850FE -_080850FC: - movs r0, 0 -_080850FE: - pop {r1} - bx r1 - thumb_func_end DoGlobalWildEncounterDiceRoll - - thumb_func_start StandardWildEncounter -StandardWildEncounter: @ 8085104 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - lsls r0, 16 - lsrs r6, r0, 16 - mov r9, r6 - lsls r1, 16 - lsrs r7, r1, 16 - mov r8, r7 - ldr r0, _080851CC @ =gWildEncountersDisabled - ldrb r0, [r0] - cmp r0, 0x1 - bne _08085122 - b _08085282 -_08085122: - bl GetCurrentMapWildMonHeader - lsls r0, 16 - lsrs r5, r0, 16 - ldr r0, _080851D0 @ =0x0000ffff - cmp r5, r0 - bne _08085132 - b _08085282 -_08085132: - lsls r0, r6, 24 - lsrs r4, r0, 24 - adds r0, r4, 0 - bl sub_8057468 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080851D8 - ldr r1, _080851D4 @ =gWildMonHeaders - lsls r2, r5, 2 - adds r0, r2, r5 - lsls r0, 2 - adds r1, 0x4 - adds r0, r1 - ldr r0, [r0] - adds r4, r2, 0 - cmp r0, 0 - bne _0808515A - b _08085282 -_0808515A: - cmp r7, r6 - beq _0808516A - bl DoGlobalWildEncounterDiceRoll - lsls r0, 24 - cmp r0, 0 - bne _0808516A - b _08085282 -_0808516A: - ldr r1, _080851D4 @ =gWildMonHeaders - adds r0, r4, r5 - lsls r0, 2 - adds r1, 0x4 - adds r0, r1 - ldr r0, [r0] - ldrb r0, [r0] - movs r1, 0 - bl DoWildEncounterTest - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _08085188 - b _08085282 -_08085188: - bl sub_81344CC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _0808524A - bl DoMassOutbreakEncounterTest - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080851AE - movs r0, 0x1 - bl SetUpMassOutbreakEncounter - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _0808527A -_080851AE: - ldr r1, _080851D4 @ =gWildMonHeaders - adds r0, r4, r5 - lsls r0, 2 - adds r1, 0x4 - adds r0, r1 - ldr r0, [r0] - movs r1, 0 - movs r2, 0x1 - bl GenerateWildMon - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _0808527A - b _08085282 - .align 2, 0 -_080851CC: .4byte gWildEncountersDisabled -_080851D0: .4byte 0x0000ffff -_080851D4: .4byte gWildMonHeaders -_080851D8: - adds r0, r4, 0 - bl sub_8057494 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _08085200 - movs r0, 0x8 - bl TestPlayerAvatarFlags - lsls r0, 24 - cmp r0, 0 - beq _08085282 - adds r0, r4, 0 - bl sub_8057434 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085282 -_08085200: - ldr r1, _08085260 @ =gWildMonHeaders - lsls r2, r5, 2 - adds r0, r2, r5 - lsls r0, 2 - adds r1, 0x8 - adds r0, r1 - ldr r0, [r0] - adds r4, r2, 0 - cmp r0, 0 - beq _08085282 - cmp r8, r9 - beq _08085222 - bl DoGlobalWildEncounterDiceRoll - lsls r0, 24 - cmp r0, 0 - beq _08085282 -_08085222: - ldr r1, _08085260 @ =gWildMonHeaders - adds r0, r4, r5 - lsls r0, 2 - adds r1, 0x8 - adds r4, r0, r1 - ldr r0, [r4] - ldrb r0, [r0] - movs r1, 0 - bl DoWildEncounterTest - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085282 - bl sub_81344CC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085268 -_0808524A: - ldr r0, _08085264 @ =gSaveBlock1 + 0x3144 - ldrb r0, [r0, 0xC] - bl RepelCheck - lsls r0, 24 - cmp r0, 0 - beq _08085282 - bl sub_8081A5C - movs r0, 0x1 - b _08085284 - .align 2, 0 -_08085260: .4byte gWildMonHeaders -_08085264: .4byte gSaveBlock1 + 0x3144 -_08085268: - ldr r0, [r4] - movs r1, 0x1 - movs r2, 0x1 - bl GenerateWildMon - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085282 -_0808527A: - bl sub_8081A00 - movs r0, 0x1 - b _08085284 -_08085282: - movs r0, 0 -_08085284: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end StandardWildEncounter - - thumb_func_start RockSmashWildEncounter -RockSmashWildEncounter: @ 8085290 - push {r4,lr} - bl GetCurrentMapWildMonHeader - lsls r0, 16 - lsrs r2, r0, 16 - ldr r0, _080852E0 @ =0x0000ffff - cmp r2, r0 - beq _080852EC - ldr r1, _080852E4 @ =gWildMonHeaders - lsls r0, r2, 2 - adds r0, r2 - lsls r0, 2 - adds r1, 0xC - adds r0, r1 - ldr r4, [r0] - cmp r4, 0 - beq _080852D8 - ldrb r0, [r4] - movs r1, 0x1 - bl DoWildEncounterTest - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080852EC - adds r0, r4, 0 - movs r1, 0x2 - movs r2, 0x1 - bl GenerateWildMon - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x1 - bne _080852EC - bl sub_8081A00 -_080852D8: - ldr r0, _080852E8 @ =gScriptResult - strh r4, [r0] - b _080852F2 - .align 2, 0 -_080852E0: .4byte 0x0000ffff -_080852E4: .4byte gWildMonHeaders -_080852E8: .4byte gScriptResult -_080852EC: - ldr r1, _080852F8 @ =gScriptResult - movs r0, 0 - strh r0, [r1] -_080852F2: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080852F8: .4byte gScriptResult - thumb_func_end RockSmashWildEncounter - - thumb_func_start SweetScentWildEncounter -SweetScentWildEncounter: @ 80852FC - push {r4,r5,lr} - sub sp, 0x4 - mov r5, sp - adds r5, 0x2 - mov r0, sp - adds r1, r5, 0 - bl PlayerGetDestCoords - bl GetCurrentMapWildMonHeader - lsls r0, 16 - lsrs r4, r0, 16 - ldr r0, _0808536C @ =0x0000ffff - cmp r4, r0 - beq _080853DA - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r5, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_8057468 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085380 - ldr r1, _08085370 @ =gWildMonHeaders - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 2 - adds r1, 0x4 - adds r0, r1 - ldr r4, [r0] - cmp r4, 0 - beq _080853DA - bl sub_81344CC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - beq _080853BC - bl DoMassOutbreakEncounterTest - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085374 - movs r0, 0 - bl SetUpMassOutbreakEncounter - b _080853D2 - .align 2, 0 -_0808536C: .4byte 0x0000ffff -_08085370: .4byte gWildMonHeaders -_08085374: - adds r0, r4, 0 - movs r1, 0 - movs r2, 0 - bl GenerateWildMon - b _080853D2 -_08085380: - mov r0, sp - movs r1, 0 - ldrsh r0, [r0, r1] - movs r2, 0 - ldrsh r1, [r5, r2] - bl MapGridGetMetatileBehaviorAt - lsls r0, 24 - lsrs r0, 24 - bl sub_8057494 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080853DA - ldr r1, _080853C4 @ =gWildMonHeaders - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 2 - adds r1, 0x8 - adds r0, r1 - ldr r4, [r0] - cmp r4, 0 - beq _080853DA - bl sub_81344CC - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080853C8 -_080853BC: - bl sub_8081A5C - movs r0, 0x1 - b _080853DC - .align 2, 0 -_080853C4: .4byte gWildMonHeaders -_080853C8: - adds r0, r4, 0 - movs r1, 0x1 - movs r2, 0 - bl GenerateWildMon -_080853D2: - bl sub_8081A00 - movs r0, 0x1 - b _080853DC -_080853DA: - movs r0, 0 -_080853DC: - add sp, 0x4 - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end SweetScentWildEncounter - - thumb_func_start GetFishingWildMonListHeader -GetFishingWildMonListHeader: @ 80853E4 - push {lr} - bl GetCurrentMapWildMonHeader - lsls r0, 16 - lsrs r2, r0, 16 - ldr r0, _0808540C @ =0x0000ffff - cmp r2, r0 - beq _08085414 - ldr r0, _08085410 @ =gWildMonHeaders - lsls r1, r2, 2 - adds r1, r2 - lsls r1, 2 - adds r0, 0x10 - adds r1, r0 - ldr r0, [r1] - cmp r0, 0 - beq _08085414 - movs r0, 0x1 - b _08085416 - .align 2, 0 -_0808540C: .4byte 0x0000ffff -_08085410: .4byte gWildMonHeaders -_08085414: - movs r0, 0 -_08085416: - pop {r1} - bx r1 - thumb_func_end GetFishingWildMonListHeader - - thumb_func_start FishingWildEncounter -FishingWildEncounter: @ 808541C - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - bl CheckFeebas - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0808544C - ldr r4, _08085448 @ =gWildFeebasRoute119Data - adds r0, r4, 0 - bl RandomInRange - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - ldrh r4, [r4, 0x2] - adds r0, r4, 0 - bl CreateWildMon - b _0808546C - .align 2, 0 -_08085448: .4byte gWildFeebasRoute119Data -_0808544C: - ldr r4, _08085484 @ =gWildMonHeaders - bl GetCurrentMapWildMonHeader - lsls r0, 16 - lsrs r0, 16 - lsls r1, r0, 2 - adds r1, r0 - lsls r1, 2 - adds r4, 0x10 - adds r1, r4 - ldr r0, [r1] - adds r1, r5, 0 - bl GenerateFishingWildMon - lsls r0, 16 - lsrs r4, r0, 16 -_0808546C: - movs r0, 0xC - bl sav12_xor_increment - adds r0, r4, 0 - bl sub_80BEA50 - bl sub_8081A00 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08085484: .4byte gWildMonHeaders - thumb_func_end FishingWildEncounter - - thumb_func_start GetLocalWildMon -GetLocalWildMon: @ 8085488 - push {r4-r6,lr} - adds r6, r0, 0 - movs r0, 0 - strb r0, [r6] - bl GetCurrentMapWildMonHeader - lsls r0, 16 - lsrs r3, r0, 16 - ldr r0, _080854C0 @ =0x0000ffff - cmp r3, r0 - beq _080854BA - ldr r2, _080854C4 @ =gWildMonHeaders - lsls r1, r3, 2 - adds r1, r3 - lsls r1, 2 - adds r0, r2, 0x4 - adds r0, r1, r0 - ldr r5, [r0] - adds r2, 0x8 - adds r1, r2 - ldr r4, [r1] - cmp r5, 0 - bne _080854C8 - cmp r4, 0 - bne _080854CE -_080854BA: - movs r0, 0 - b _0808550E - .align 2, 0 -_080854C0: .4byte 0x0000ffff -_080854C4: .4byte gWildMonHeaders -_080854C8: - cmp r4, 0 - bne _080854DC - b _08085500 -_080854CE: - movs r0, 0x1 - strb r0, [r6] - bl PickWildMon_Water - lsls r0, 24 - ldr r1, [r4, 0x4] - b _08085508 -_080854DC: - bl Random - lsls r0, 16 - lsrs r0, 16 - movs r1, 0x64 - bl __umodsi3 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x4F - bls _08085500 - movs r0, 0x1 - strb r0, [r6] - bl PickWildMon_Water - lsls r0, 24 - ldr r1, [r4, 0x4] - b _08085508 -_08085500: - bl PickWildMon_Grass - lsls r0, 24 - ldr r1, [r5, 0x4] -_08085508: - lsrs r0, 22 - adds r0, r1 - ldrh r0, [r0, 0x2] -_0808550E: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end GetLocalWildMon - - thumb_func_start GetMirageIslandMon -GetMirageIslandMon: @ 8085514 - push {r4,lr} - bl GetCurrentMapWildMonHeader - lsls r0, 16 - lsrs r2, r0, 16 - ldr r0, _08085548 @ =0x0000ffff - cmp r2, r0 - beq _08085550 - ldr r1, _0808554C @ =gWildMonHeaders - lsls r0, r2, 2 - adds r0, r2 - lsls r0, 2 - adds r1, 0x8 - adds r0, r1 - ldr r4, [r0] - cmp r4, 0 - beq _08085550 - bl PickWildMon_Water - lsls r0, 24 - ldr r1, [r4, 0x4] - lsrs r0, 22 - adds r0, r1 - ldrh r0, [r0, 0x2] - b _08085552 - .align 2, 0 -_08085548: .4byte 0x0000ffff -_0808554C: .4byte gWildMonHeaders -_08085550: - movs r0, 0 -_08085552: - pop {r4} - pop {r1} - bx r1 - thumb_func_end GetMirageIslandMon - - thumb_func_start UpdateRepelCounter -UpdateRepelCounter: @ 8085558 - push {r4,r5,lr} - ldr r5, _08085588 @ =0x00004021 - adds r0, r5, 0 - bl VarGet - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0 - beq _08085590 - subs r4, r0, 0x1 - lsls r4, 16 - lsrs r4, 16 - adds r0, r5, 0 - adds r1, r4, 0 - bl VarSet - cmp r4, 0 - bne _08085590 - ldr r0, _0808558C @ =Event_RepelWoreOff - bl ScriptContext1_SetupScript - movs r0, 0x1 - b _08085592 - .align 2, 0 -_08085588: .4byte 0x00004021 -_0808558C: .4byte Event_RepelWoreOff -_08085590: - movs r0, 0 -_08085592: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end UpdateRepelCounter - - thumb_func_start RepelCheck -RepelCheck: @ 8085598 - push {r4-r6,lr} - lsls r0, 24 - lsrs r6, r0, 24 - ldr r0, _080855E4 @ =0x00004021 - bl VarGet - lsls r0, 16 - cmp r0, 0 - beq _080855DE - movs r5, 0 -_080855AC: - movs r0, 0x64 - adds r1, r5, 0 - muls r1, r0 - ldr r0, _080855E8 @ =gPlayerParty - adds r4, r1, r0 - adds r0, r4, 0 - movs r1, 0x39 - bl GetMonData - cmp r0, 0 - beq _080855EC - adds r0, r4, 0 - movs r1, 0x2D - bl GetMonData - cmp r0, 0 - bne _080855EC - adds r0, r4, 0 - movs r1, 0x38 - bl GetMonData - lsls r0, 24 - lsrs r0, 24 - cmp r6, r0 - bcc _080855F6 -_080855DE: - movs r0, 0x1 - b _080855F8 - .align 2, 0 -_080855E4: .4byte 0x00004021 -_080855E8: .4byte gPlayerParty -_080855EC: - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x5 - bls _080855AC -_080855F6: - movs r0, 0 -_080855F8: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end RepelCheck - - thumb_func_start ApplyFluteEncounterRateMod -ApplyFluteEncounterRateMod: @ 8085600 - push {r4,lr} - adds r4, r0, 0 - ldr r0, _0808561C @ =0x0000084d - bl FlagGet - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085620 - ldr r0, [r4] - lsrs r1, r0, 1 - adds r0, r1 - b _08085632 - .align 2, 0 -_0808561C: .4byte 0x0000084d -_08085620: - ldr r0, _0808563C @ =0x0000084e - bl FlagGet - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _08085634 - ldr r0, [r4] - lsrs r0, 1 -_08085632: - str r0, [r4] -_08085634: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0808563C: .4byte 0x0000084e - thumb_func_end ApplyFluteEncounterRateMod - - thumb_func_start ApplyCleanseTagEncounterRateMod -ApplyCleanseTagEncounterRateMod: @ 8085640 - push {r4,lr} - adds r4, r0, 0 - ldr r0, _08085664 @ =gPlayerParty - movs r1, 0xC - bl GetMonData - cmp r0, 0xBE - bne _0808565C - ldr r0, [r4] - lsls r0, 1 - movs r1, 0x3 - bl __udivsi3 - str r0, [r4] -_0808565C: - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_08085664: .4byte gPlayerParty - thumb_func_end ApplyCleanseTagEncounterRateMod - - .align 2, 0 @ Don't pad with nop. diff --git a/data/data2.s b/data/data2.s index 54baa2f77..c7df27f3f 100644 --- a/data/data2.s +++ b/data/data2.s @@ -11192,8 +11192,9 @@ gWildFeebasRoute119Data:: @ 839DBFC .byte 20, 25 @ Min/Max level .2byte SPECIES_FEEBAS +@ Some Feebas tile related data gUnknown_0839DC00:: @ 839DC00 - .incbin "baserom.gba", 0x0039dc00, 0x14 + .2byte 0, 0x2D, 0, 0x2E, 0x5B, 0x83, 0x5C, 0x8B, 0x12A, 0 .align 2 gSpriteImage_839DC14:: @ 839DC14 diff --git a/include/fieldmap.h b/include/fieldmap.h index 852a6c337..a7a45218d 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -36,16 +36,16 @@ struct MapData struct MapObjectTemplate { - u8 localId; - u8 filler_1[0x3]; - s16 x; - s16 y; - u8 elevation; - u8 movementType; - u8 filler_A[0x6]; - u8 *script; - u8 filler_14[0x4]; -}; + /*0x00*/ u8 localId; + /*0x01*/ u8 filler_1[0x3]; + /*0x04*/ s16 x; + /*0x06*/ s16 y; + /*0x08*/ u8 elevation; + /*0x09*/ u8 movementType; + /*0x0A*/ u8 filler_A[0x6]; + /*0x10*/ u8 *script; + /*0x14*/ u8 filler_14[0x4]; +}; /*size = 0x18*/ struct WarpEvent { diff --git a/include/global.h b/include/global.h index 207e9b6b2..1691b7776 100644 --- a/include/global.h +++ b/include/global.h @@ -162,17 +162,17 @@ struct SB1_2EFC_Struct struct SaveBlock1 { - struct Coords16 pos; - struct WarpData location; - struct WarpData warp1; - struct WarpData warp2; - struct WarpData warp3; - struct WarpData warp4; - u16 battleMusic; - u8 weather; - u8 filler_2F; - u8 flashUsed; - u16 mapDataId; + /*0x00*/ struct Coords16 pos; + /*0x04*/ struct WarpData location; + /*0x0C*/ struct WarpData warp1; + /*0x14*/ struct WarpData warp2; + /*0x1C*/ struct WarpData warp3; + /*0x24*/ struct WarpData warp4; + /*0x2C*/ u16 battleMusic; + /*0x2E*/ u8 weather; + /*0x2F*/ u8 filler_2F; + /*0x30*/ u8 flashUsed; + /*0x32*/ u16 mapDataId; u16 mapView[0x100]; u8 playerPartyCount; struct Pokemon playerParty[6]; @@ -192,11 +192,11 @@ struct SaveBlock1 u16 trainerRematchStepCounter; u8 trainerRematches[100]; struct MapObject mapObjects[16]; - struct MapObjectTemplate mapObjectTemplates[64]; - u8 flags[0x120]; - u16 vars[0x100]; - u32 gameStats[NUM_GAME_STATS]; - struct BerryTree berryTrees[128]; + /*0xC20*/ struct MapObjectTemplate mapObjectTemplates[64]; + /*0x1220*/ u8 flags[0x120]; + /*0x1340*/ u16 vars[0x100]; + /*0x1540*/ u32 gameStats[NUM_GAME_STATS]; + /*0x1608*/ struct BerryTree berryTrees[128]; /*0x1A08*/ struct SecretBaseRecord secretBases[20]; /*0x2688*/ u8 playerRoomDecor[12]; /*0x2694*/ u8 playerRoomDecorPos[12]; @@ -210,7 +210,18 @@ struct SaveBlock1 u8 decorCushion[10]; u8 padding_2736[2]; u8 tvShows[24][36]; // TODO: TV show struct - u8 filler_2A98[0x464]; + /*0x2A98*/ u8 filler_2A98[0x64]; + /*0x2AFC*/ u16 outbreakPokemonSpecies; + /*0x2AFE*/ u8 outbreakLocationMapNum; + /*0x2AFF*/ u8 outbreakLocationMapGroup; + /*0x2B00*/ u8 outbreakPokemonLevel; + /*0x2B01*/ u8 filler_2B01[3]; + /*0x2B04*/ u16 outbreakPokemonMoves[4]; + /*0x2B0C*/ u8 unk2B0C; + /*0x2B0D*/ u8 outbreakPokemonProbability; + /*0x2B0E*/ u8 filler_2B0E[0x2C8]; + /*0x2DD6*/ u16 feebasLocationSeed; + /*0x2DD8*/ u8 filler_2DD8[0x124]; struct SB1_2EFC_Struct sb1_2EFC_struct[5]; u8 filler_2F9C[0x1A8]; /*0x3144*/ struct Roamer roamer; diff --git a/ld_script.txt b/ld_script.txt index 0a0dbea63..4f67527a7 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -93,7 +93,7 @@ SECTIONS { asm/mori_debug_menu.o(.text); asm/trainer_see.o(.text); src/fldeff_emotion.o(.text); - asm/wild_encounter.o(.text); + src/wild_encounter.o(.text); asm/field_effect.o(.text); asm/rom_80859BC.o(.text); src/option_menu.o(.text); diff --git a/src/wild_encounter.c b/src/wild_encounter.c new file mode 100644 index 000000000..2e93683b7 --- /dev/null +++ b/src/wild_encounter.c @@ -0,0 +1,1059 @@ +#include "gba/gba.h" +#include "fieldmap.h" +#include "global.h" +#include "pokemon.h" +#include "rng.h" +#include "script.h" + +struct WildPokemon { + u8 minLevel; + u8 maxLevel; + u16 species; +}; + +struct WildPokemonInfo { + u8 encounterRate; + struct WildPokemon *wildPokemon; +}; + +struct WildPokemonHeader { + u8 mapGroup; + u8 mapNum; + struct WildPokemonInfo *landMonsInfo; + struct WildPokemonInfo *waterMonsInfo; + struct WildPokemonInfo *rockSmashMonsInfo; + struct WildPokemonInfo *fishingMonsInfo; +}; + +extern bool8 sub_805759C(u8); +extern void GetXYCoordsOneStepInFrontOfPlayer(void *, void *); +extern u32 sub_80C8448(void); +extern s16 sub_810CAE4(u8, u32); +extern bool32 GetSafariZoneFlag(void); +extern u8 TestPlayerAvatarFlags(u8); +extern u8 sub_8057468(u8); +extern u8 sub_81344CC(void); +extern u8 sub_8057494(u8); +extern void sub_8081A00(void); +extern u8 sub_8057434(u8); +extern void PlayerGetDestCoords(u16 *x, u16 *y); +extern void sub_80BEA50(u16); +extern void sav12_xor_increment(u8); +extern u8 FlagGet(u16); +extern u16 VarGet(u16); +extern int MapGridGetMetatileBehaviorAt(int x, int y); + +extern u8 gWildEncountersDisabled; +extern u16 gUnknown_0839DC00[]; +//extern u16 gUnknown_0839DC00[3][3]; +extern u32 gUnknown_0202FF80; //Feebas rng value +extern struct WildPokemonHeader gWildMonHeaders[]; +extern struct Pokemon gEnemyParty[6]; +extern struct Pokemon gPlayerParty[6]; +extern u16 gScriptResult; +extern struct WildPokemon gWildFeebasRoute119Data; +extern u8 Event_RepelWoreOff[]; + +#define NUM_FEEBAS_SPOTS 6 + +u16 sub_8084984(s16 x, s16 y, u8 c); +bool8 CheckFeebas(void); +u16 FeebasRandom(void); +void FeebasSeedRng(u16 seed); +u8 PickWildMon_Grass(void); +u8 PickWildMon_Water(void); +u8 PickWildMon_Fishing(u8 rod); +u8 RandomInRange(struct WildPokemon *wildPokemon); +u16 GetCurrentMapWildMonHeader(void); +u8 PickWildMonNature(void); +void CreateWildMon(u16 species, u8 b); +bool8 GenerateWildMon(struct WildPokemonInfo *a, u8 b, u8 c); +u16 GenerateFishingWildMon(struct WildPokemonInfo *a, u8 rod); +bool8 SetUpMassOutbreakEncounter(u8 a); +bool8 DoMassOutbreakEncounterTest(void); +bool8 DoWildEncounterRateDiceRoll(u16 a); +bool8 DoWildEncounterTest(u32 a, u8 b); +bool8 DoGlobalWildEncounterDiceRoll(void); +bool8 StandardWildEncounter(u16 a, u16 b); +void RockSmashWildEncounter(void); +u8 SweetScentWildEncounter(void); +u8 GetFishingWildMonListHeader(void); +void FishingWildEncounter(u8 rod); +u16 GetLocalWildMon(u8 *a1); +u16 GetMirageIslandMon(void); +bool8 UpdateRepelCounter(void); +bool8 RepelCheck(bool8 level); +void ApplyFluteEncounterRateMod(u32 *a1); +void ApplyCleanseTagEncounterRateMod(u32 *a1); + + +void DisableWildEncounters(bool8 disable) +{ + gWildEncountersDisabled = disable; +} + +u16 sub_8084984(s16 x, s16 y, u8 c) +{ + //odd, but needed to match + u16 *arr = gUnknown_0839DC00; + u16 *ptr = &arr[c * 3]; + u16 r9 = gUnknown_0839DC00[c * 3 + 1]; + u16 r6 = gUnknown_0839DC00[c * 3 + 2]; + u16 r5 = *ptr; + + while(r5 <= r9) + { + u16 i; + + for(i = 0; i < gMapHeader.mapData->width; i++) + { + if(sub_805759C(MapGridGetMetatileBehaviorAt(i + 7, r5 + 7)) == TRUE) + { + r6++; + if(x == i && y == r5) + return r6; + } + //_08084A14 + } + r5++; + } + + return r6 + 1; +} + +bool8 CheckFeebas(void) +{ + u16 feebasSpots[6]; + s16 x; + s16 y; + u8 r7 = 0; + u8 i; + u16 foo; + + if(gSaveBlock1.location.mapGroup == 0 && gSaveBlock1.location.mapNum == 0x22) + { + GetXYCoordsOneStepInFrontOfPlayer(&x, &y); + x -= 7; + y -= 7; + + // *sigh* whatever gets the code to match! + { + register u16 *arr asm("r0"); + if(y >= (arr = gUnknown_0839DC00)[3 * 1 + 0] && y <= arr[3 * 1 + 1]) + r7 = 1; + if(y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1]) + r7 = 2; + } + //_08084A8E + + if(Random() % 100 > 49) //Why not just do (Random() & 1) to get a 50% chance? + return FALSE; + //_08084AC8 + FeebasSeedRng(gSaveBlock1.feebasLocationSeed); + for(i = 0; i != NUM_FEEBAS_SPOTS;) + { + feebasSpots[i] = FeebasRandom() % 447; + if(feebasSpots[i] == 0) + feebasSpots[i] = 447; + if(feebasSpots[i] < 1 || feebasSpots[i] >= 4) + i++; + } + foo = sub_8084984(x, y, r7); + for(i = 0; i < NUM_FEEBAS_SPOTS; i++) + { + if(foo == feebasSpots[i]) + return TRUE; + } + } + //_08084B38 + return FALSE; +} + +u16 FeebasRandom(void) +{ + gUnknown_0202FF80 = 12345 + 0x41C64E6D * gUnknown_0202FF80; + return gUnknown_0202FF80 >> 16; +} + +void FeebasSeedRng(u16 seed) +{ + gUnknown_0202FF80 = seed; +} + +u8 PickWildMon_Grass(void) +{ + u8 val = Random() % 100; + + if(val < 20) + return 0; + if(val >= 20 && val < 40) + return 1; + if(val >= 40 && val < 50) + return 2; + if(val >= 50 && val < 60) + return 3; + if(val >= 60 && val < 70) + return 4; + if(val >= 70 && val < 80) + return 5; + if(val >= 80 && val < 85) + return 6; + if(val >= 85 && val < 90) + return 7; + if(val >= 90 && val < 94) + return 8; + if(val >= 94 && val < 98) + return 9; + if(val == 98) + return 10; + else + return 11; +} + +u8 PickWildMon_Water(void) +{ + u8 val = Random() % 100; + + if(val < 60) + return 0; + if(val >= 60 && val < 90) + return 1; + if(val >= 90 && val < 95) + return 2; + if(val >= 95 && val < 99) + return 3; + else + return 4; +} + +u8 PickWildMon_Fishing(u8 rod) +{ + u32 r5 = 0; + u8 val = Random() % 100; + + switch(rod) + { + case 0: //old rod? + if(val < 70) + r5 = 0; + else + r5 = 1; + return r5; + case 1: //good rod? + if(val < 60) + r5 = 2; + if(val >= 60 && val < 80) + r5 = 3; + if(val >= 80 && val < 100) + r5 = 4; + return r5; + case 2: //super rod? + if(val < 40) + r5 = 5; + if(val >= 40 && val < 80) + r5 = 6; + if(val >= 80 && val < 95) + r5 = 7; + if(val >= 95 && val < 99) + r5 = 8; + if(val == 99) + r5 = 9; + return r5; + default: + return r5; + } + + return r5; +} + +//Chooses level of wild Pokemon +u8 RandomInRange(struct WildPokemon *wildPokemon) +{ + u8 min; + u8 max; + u8 range; + u8 rand; + + //Make sure minimum level is less than maximum level + if(wildPokemon->maxLevel >= wildPokemon->minLevel) + { + min = wildPokemon->minLevel; + max = wildPokemon->maxLevel; + } + else + { + min = wildPokemon->maxLevel; + max = wildPokemon->minLevel; + } + range = max - min + 1; + rand = Random() % range; + return min + rand; +} + +u16 GetCurrentMapWildMonHeader(void) +{ + u16 i; + + for(i = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++) + { + if(gWildMonHeaders[i].mapGroup == gSaveBlock1.location.mapGroup && + gWildMonHeaders[i].mapNum == gSaveBlock1.location.mapNum) + return i; + } + return -1; +} + +u8 PickWildMonNature(void) +{ + u16 foo; + u32 r7; + u8 arr[25]; + + if(GetSafariZoneFlag() == TRUE && Random() % 100 < 80) + { + r7 = sub_80C8448(); + + if(r7) + { + u8 i; + + for(i = 0; i < 25; i++) + arr[i] = i; + //_08084E04 + for(i = 0; i < 24; i++) + { + u8 j; + + for(j = i + 1; j < 25; j++) + { + if(Random() & 1) + { + u8 temp = arr[i]; + + arr[i] = arr[j]; + arr[j] = temp; + } + } + } + //_08084E3E + for(i = 0; i < 25; i++) + { + if(sub_810CAE4(arr[i], r7) > 0) + return arr[i]; + } + } + } + //_08084E5E + return Random() % 25; +} + +void CreateWildMon(u16 species, u8 b) +{ + ZeroEnemyPartyMons(); + CreateMonWithNature(&gEnemyParty[0], species, b, 0x20, PickWildMonNature()); +} + +bool8 GenerateWildMon(struct WildPokemonInfo *a, u8 b, u8 c) +{ + u8 mon = 0; + u8 level; + + switch(b) + { + case 0: + mon = PickWildMon_Grass(); + break; + case 1: + mon = PickWildMon_Water(); + break; + case 2: + mon = PickWildMon_Water(); + break; + default: + break; + } + + level = RandomInRange(&a->wildPokemon[mon]); + if(c == 1 && RepelCheck(level) == 0) + { + return 0; + } + else + { + CreateWildMon(a->wildPokemon[mon].species, level); + return 1; + } +} + +u16 GenerateFishingWildMon(struct WildPokemonInfo *a, u8 rod) +{ + u8 mon = PickWildMon_Fishing(rod); + u8 level = RandomInRange(&a->wildPokemon[mon]); + + CreateWildMon(a->wildPokemon[mon].species, level); + return a->wildPokemon[mon].species; +} + +bool8 SetUpMassOutbreakEncounter(u8 a) +{ + u16 i; + + if(a == 1 && RepelCheck(gSaveBlock1.outbreakPokemonLevel) == 0) + { + return 0; + } + //_08084F78 + CreateWildMon(gSaveBlock1.outbreakPokemonSpecies, gSaveBlock1.outbreakPokemonLevel); + for(i = 0; i < 4; i++) + { + SetMonMoveSlot(&gEnemyParty[0], gSaveBlock1.outbreakPokemonMoves[i], i); + } + return 1; +} + +bool8 DoMassOutbreakEncounterTest(void) +{ + if(gSaveBlock1.outbreakPokemonSpecies && + gSaveBlock1.location.mapNum == gSaveBlock1.outbreakLocationMapNum && + gSaveBlock1.location.mapGroup == gSaveBlock1.outbreakLocationMapGroup) + { + if(Random() % 100 < gSaveBlock1.outbreakPokemonProbability) + return 1; + } + return 0; +} + +bool8 DoWildEncounterRateDiceRoll(u16 a) +{ + if(Random() % 2880 < a) + return TRUE; + else + return FALSE; +} + +bool8 DoWildEncounterTest(u32 encounterRate, u8 b) +{ + encounterRate *= 16; + + if(TestPlayerAvatarFlags(6)) + { + encounterRate = encounterRate * 80 / 100; + } + //_0808507E + ApplyFluteEncounterRateMod(&encounterRate); + ApplyCleanseTagEncounterRateMod(&encounterRate); + + if(b == 0) + { + // UB: Too few arguments for function 'GetMonData' + if(!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)) + { + u32 ability = GetMonAbility(&gPlayerParty[0]); + if(ability == 1) + encounterRate /= 2; + if(ability == 0x23) + encounterRate *= 2; + } + } + //_080850BA + if(encounterRate > 2880) + encounterRate = 2880; + return DoWildEncounterRateDiceRoll(encounterRate); +} + +bool8 DoGlobalWildEncounterDiceRoll(void) +{ + if(Random() % 100 >= 60) + return FALSE; + else + return TRUE; +} + +#ifdef NONMATCHING +//ToDo: fix control flow +bool8 StandardWildEncounter(u16 a, u16 b) +{ + u16 unk; + + if(gWildEncountersDisabled != TRUE) + { + unk = GetCurrentMapWildMonHeader(); + + if(unk != 0xFFFF) + { + if(sub_8057468(a) == 1) + { + if(gWildMonHeaders[unk].landMonsInfo) + { + if(b != a && !DoGlobalWildEncounterDiceRoll()) + return 0; + + if(DoWildEncounterTest(gWildMonHeaders[unk].landMonsInfo->encounterRate, 0) == TRUE) + { + if(sub_81344CC() == TRUE) + { + //_0808524A + if(RepelCheck(gSaveBlock1.roamer.level)) + { + sub_8081A5C(); + return 1; + } + } + else + { + if(DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(1) == TRUE + || GenerateWildMon(gWildMonHeaders[unk].landMonsInfo, 0, 1) == 1) + { + //_0808527A + asm(""); + sub_8081A00(); + return 1; + } + } + } + } + } + else + { + //_080851D8 + if(sub_8057494(a) == TRUE || TestPlayerAvatarFlags(8) && sub_8057434(a) == TRUE) + { + if(gWildMonHeaders[unk].waterMonsInfo) + { + if(b != a && !DoGlobalWildEncounterDiceRoll()) + return 0; + + if(DoWildEncounterTest(gWildMonHeaders[unk].waterMonsInfo->encounterRate, 0) == TRUE) + { + if(sub_81344CC() == TRUE) + { + //_0808524A + if(RepelCheck(gSaveBlock1.roamer.level)) + { + sub_8081A5C(); + return 1; + } + } + else + { + //_08085268 + if(GenerateWildMon(gWildMonHeaders[unk].waterMonsInfo, 1, 1) == 1) + { + //_0808527A + sub_8081A00(); + return 1; + } + } + } + } + } + } + } + } + return 0; +} +#else +__attribute__((naked)) +bool8 StandardWildEncounter(u16 a, u16 b) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + mov r9, r6\n\ + lsls r1, 16\n\ + lsrs r7, r1, 16\n\ + mov r8, r7\n\ + ldr r0, _080851CC\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x1\n\ + bne _08085122\n\ + b _08085282\n\ +_08085122:\n\ + bl GetCurrentMapWildMonHeader\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldr r0, _080851D0\n\ + cmp r5, r0\n\ + bne _08085132\n\ + b _08085282\n\ +_08085132:\n\ + lsls r0, r6, 24\n\ + lsrs r4, r0, 24\n\ + adds r0, r4, 0\n\ + bl sub_8057468\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080851D8\n\ + ldr r1, _080851D4\n\ + lsls r2, r5, 2\n\ + adds r0, r2, r5\n\ + lsls r0, 2\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + adds r4, r2, 0\n\ + cmp r0, 0\n\ + bne _0808515A\n\ + b _08085282\n\ +_0808515A:\n\ + cmp r7, r6\n\ + beq _0808516A\n\ + bl DoGlobalWildEncounterDiceRoll\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _0808516A\n\ + b _08085282\n\ +_0808516A:\n\ + ldr r1, _080851D4\n\ + adds r0, r4, r5\n\ + lsls r0, 2\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + ldrb r0, [r0]\n\ + movs r1, 0\n\ + bl DoWildEncounterTest\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _08085188\n\ + b _08085282\n\ +_08085188:\n\ + bl sub_81344CC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _0808524A\n\ + bl DoMassOutbreakEncounterTest\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080851AE\n\ + movs r0, 0x1\n\ + bl SetUpMassOutbreakEncounter\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _0808527A\n\ +_080851AE:\n\ + ldr r1, _080851D4\n\ + adds r0, r4, r5\n\ + lsls r0, 2\n\ + adds r1, 0x4\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0\n\ + movs r2, 0x1\n\ + bl GenerateWildMon\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _0808527A\n\ + b _08085282\n\ + .align 2, 0\n\ +_080851CC: .4byte gWildEncountersDisabled\n\ +_080851D0: .4byte 0x0000ffff\n\ +_080851D4: .4byte gWildMonHeaders\n\ +_080851D8:\n\ + adds r0, r4, 0\n\ + bl sub_8057494\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + beq _08085200\n\ + movs r0, 0x8\n\ + bl TestPlayerAvatarFlags\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08085282\n\ + adds r0, r4, 0\n\ + bl sub_8057434\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _08085282\n\ +_08085200:\n\ + ldr r1, _08085260\n\ + lsls r2, r5, 2\n\ + adds r0, r2, r5\n\ + lsls r0, 2\n\ + adds r1, 0x8\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + adds r4, r2, 0\n\ + cmp r0, 0\n\ + beq _08085282\n\ + cmp r8, r9\n\ + beq _08085222\n\ + bl DoGlobalWildEncounterDiceRoll\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08085282\n\ +_08085222:\n\ + ldr r1, _08085260\n\ + adds r0, r4, r5\n\ + lsls r0, 2\n\ + adds r1, 0x8\n\ + adds r4, r0, r1\n\ + ldr r0, [r4]\n\ + ldrb r0, [r0]\n\ + movs r1, 0\n\ + bl DoWildEncounterTest\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _08085282\n\ + bl sub_81344CC\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _08085268\n\ +_0808524A:\n\ + ldr r0, _08085264\n\ + ldrb r0, [r0, 0xC]\n\ + bl RepelCheck\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08085282\n\ + bl sub_8081A5C\n\ + movs r0, 0x1\n\ + b _08085284\n\ + .align 2, 0\n\ +_08085260: .4byte gWildMonHeaders\n\ +_08085264: .4byte gSaveBlock1 + 0x3144\n\ +_08085268:\n\ + ldr r0, [r4]\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + bl GenerateWildMon\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _08085282\n\ +_0808527A:\n\ + bl sub_8081A00\n\ + movs r0, 0x1\n\ + b _08085284\n\ +_08085282:\n\ + movs r0, 0\n\ +_08085284:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +void RockSmashWildEncounter(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if(headerNum != 0xFFFF) + { + struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerNum].rockSmashMonsInfo; + + if(wildPokemonInfo == NULL) + { + gScriptResult = 0; + return; + } + else if(DoWildEncounterTest(wildPokemonInfo->encounterRate, 1) == TRUE && + GenerateWildMon(wildPokemonInfo, 2, 1) == 1) + { + sub_8081A00(); + gScriptResult = 1; + return; + } + } + gScriptResult = 0; + return; +} + +u8 SweetScentWildEncounter(void) +{ + s16 x; + s16 y; + u16 headerNum; + struct WildPokemonInfo *wildPokemonInfo; + + PlayerGetDestCoords(&x, &y); + //headerNum = GetCurrentMapWildMonHeader(); + if((headerNum = GetCurrentMapWildMonHeader()) != 0xFFFF) + { + if(sub_8057468(MapGridGetMetatileBehaviorAt(x, y)) == 1) + { + wildPokemonInfo = gWildMonHeaders[headerNum].landMonsInfo; + + if(wildPokemonInfo == NULL) + return 0; + + if(sub_81344CC() == 1) + { + //_080853BC + sub_8081A5C(); + return 1; + } + + if(DoMassOutbreakEncounterTest() == 1) + SetUpMassOutbreakEncounter(0); + else + //_08085374 + GenerateWildMon(wildPokemonInfo, 0, 0); + //_080853D2 + sub_8081A00(); + return 1; + } + //_08085380 + else + { + if(sub_8057494(MapGridGetMetatileBehaviorAt(x, y)) == 1) + { + wildPokemonInfo = gWildMonHeaders[headerNum].waterMonsInfo; + + if(wildPokemonInfo == NULL) + return 0; + + if(sub_81344CC() == 1) + { + sub_8081A5C(); + return 1; + } + else + //_080853C8 + GenerateWildMon(wildPokemonInfo, 1, 0); + sub_8081A00(); + return 1; + } + } + } + return 0; +} + +u8 GetFishingWildMonListHeader(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if(headerNum != 0xFFFF && gWildMonHeaders[headerNum].fishingMonsInfo != NULL) + return 1; + else + return 0; +} + +void FishingWildEncounter(u8 rod) +{ + u16 species; + + if(CheckFeebas() == TRUE) + { + u8 level = RandomInRange(&gWildFeebasRoute119Data); + + species = gWildFeebasRoute119Data.species; + CreateWildMon(species, level); + } + else + { + species = GenerateFishingWildMon( + gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo, + rod); + } + sav12_xor_increment(12); + sub_80BEA50(species); + sub_8081A00(); +} + +#ifdef NONMATCHING +u16 GetLocalWildMon(u8 *a1) +{ + u16 headerNum; + + *a1 = 0; + headerNum = GetCurrentMapWildMonHeader(); + if(headerNum != 0xFFFF) + { + struct WildPokemonInfo *landMonsInfo = gWildMonHeaders[headerNum].landMonsInfo; + struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; + + if(landMonsInfo || waterMonsInfo) + { + if(waterMonsInfo && landMonsInfo == NULL) + { + //_080854CE + *a1 = 1; + return waterMonsInfo->wildPokemon[PickWildMon_Water()].species; + } + else if(landMonsInfo && waterMonsInfo) + { + //_080854DC + if(Random() % 100 < 80) + //jump to _08085500 + return landMonsInfo->wildPokemon[PickWildMon_Grass()].species; + else + { + *a1 = 1; + return waterMonsInfo->wildPokemon[PickWildMon_Water()].species; + } + } + else if(landMonsInfo && waterMonsInfo == NULL) + { + //_08085500: + return landMonsInfo->wildPokemon[PickWildMon_Grass()].species; + } + } + } + return 0; +} +#else +__attribute__((naked)) +u16 GetLocalWildMon(u8 *a1) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r6, r0, 0\n\ + movs r0, 0\n\ + strb r0, [r6]\n\ + bl GetCurrentMapWildMonHeader\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldr r0, _080854C0\n\ + cmp r3, r0\n\ + beq _080854BA\n\ + ldr r2, _080854C4\n\ + lsls r1, r3, 2\n\ + adds r1, r3\n\ + lsls r1, 2\n\ + adds r0, r2, 0x4\n\ + adds r0, r1, r0\n\ + ldr r5, [r0]\n\ + adds r2, 0x8\n\ + adds r1, r2\n\ + ldr r4, [r1]\n\ + cmp r5, 0\n\ + bne _080854C8\n\ + cmp r4, 0\n\ + bne _080854CE\n\ +_080854BA:\n\ + movs r0, 0\n\ + b _0808550E\n\ + .align 2, 0\n\ +_080854C0: .4byte 0x0000ffff\n\ +_080854C4: .4byte gWildMonHeaders\n\ +_080854C8:\n\ + cmp r4, 0\n\ + bne _080854DC\n\ + b _08085500\n\ +_080854CE:\n\ + movs r0, 0x1\n\ + strb r0, [r6]\n\ + bl PickWildMon_Water\n\ + lsls r0, 24\n\ + ldr r1, [r4, 0x4]\n\ + b _08085508\n\ +_080854DC:\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x64\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + cmp r0, 0x4F\n\ + bls _08085500\n\ + movs r0, 0x1\n\ + strb r0, [r6]\n\ + bl PickWildMon_Water\n\ + lsls r0, 24\n\ + ldr r1, [r4, 0x4]\n\ + b _08085508\n\ +_08085500:\n\ + bl PickWildMon_Grass\n\ + lsls r0, 24\n\ + ldr r1, [r5, 0x4]\n\ +_08085508:\n\ + lsrs r0, 22\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x2]\n\ +_0808550E:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +u16 GetMirageIslandMon(void) +{ + u16 headerNum = GetCurrentMapWildMonHeader(); + + if(headerNum != 0xFFFF) + { + struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerNum].waterMonsInfo; + + if(waterMonsInfo) + return waterMonsInfo->wildPokemon[PickWildMon_Water()].species; + } + return 0; +} + +bool8 UpdateRepelCounter(void) +{ + u16 steps = VarGet(0x4021); + + if(steps != 0) + { + steps--; + VarSet(0x4021, steps); + if(steps == 0) + { + ScriptContext1_SetupScript(Event_RepelWoreOff); + return TRUE; + } + } + return FALSE; +} + +//Returns FALSE if Repel prevents wild Pokemon at the specified level from appearing +bool8 RepelCheck(bool8 level) +{ + u8 i; + + if(!VarGet(0x4021)) + return TRUE; + else + { + for(i = 0; i < 6; i++) + { + // UB: Too few arguments for function 'GetMonData' + if(GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + if(level < (u8)GetMonData(&gPlayerParty[i], MON_DATA_LEVEL)) + return FALSE; + else + return TRUE; + } + } + return FALSE; + } +} + +void ApplyFluteEncounterRateMod(u32 *a1) +{ + if(FlagGet(0x84D) == 1) + *a1 = *a1 + *a1 / 2; + else if(FlagGet(0x84E) == 1) + *a1 = *a1 / 2; +} + +void ApplyCleanseTagEncounterRateMod(u32 *a1) +{ + // UB: Too few arguments for function 'GetMonData' + if(GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == 0xBE) + *a1 = *a1 * 2 / 3; +} |