summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--asm/wild_encounter.s1746
-rw-r--r--data/data2.s3
-rw-r--r--include/fieldmap.h20
-rw-r--r--include/global.h45
-rw-r--r--ld_script.txt2
-rw-r--r--src/wild_encounter.c1059
7 files changed, 1100 insertions, 1776 deletions
diff --git a/Makefile b/Makefile
index 96b78f0ac..f51f7bbd0 100644
--- a/Makefile
+++ b/Makefile
@@ -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;
+}