summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/pokeblock_feed.s2
-rw-r--r--asm/rom6.s10
-rw-r--r--asm/wild_encounter.s1325
-rw-r--r--data/wild_encounter.s2
-rw-r--r--include/global.h2
-rw-r--r--include/pokeblock.h2
-rw-r--r--include/vars.h1
-rw-r--r--include/wild_encounter.h39
-rw-r--r--ld_script.txt1
-rw-r--r--src/wild_encounter.c483
-rw-r--r--sym_ewram.txt6
11 files changed, 574 insertions, 1299 deletions
diff --git a/asm/pokeblock_feed.s b/asm/pokeblock_feed.s
index 9830db888..9cbee2fb9 100644
--- a/asm/pokeblock_feed.s
+++ b/asm/pokeblock_feed.s
@@ -704,7 +704,7 @@ sub_817A1C4: @ 817A1C4
lsls r0, 24
lsrs r0, 24
adds r1, r4, 0
- bl sub_8136FE4
+ bl PokeblockGetGain
ldr r6, =gUnknown_0203BC9E
strh r0, [r6]
ldr r1, =gStringVar1
diff --git a/asm/rom6.s b/asm/rom6.s
index 15c7acb95..8080f5420 100644
--- a/asm/rom6.s
+++ b/asm/rom6.s
@@ -2779,7 +2779,7 @@ sub_8136C8C: @ 8136C8C
adds r2, r6
ldr r1, [r5]
adds r1, r2
- bl sub_8136FE4
+ bl PokeblockGetGain
adds r4, r0, 0
lsls r4, 16
lsrs r4, 16
@@ -3177,8 +3177,8 @@ _08136FDE:
bx r1
thumb_func_end sub_8136F9C
- thumb_func_start sub_8136FE4
-sub_8136FE4: @ 8136FE4
+ thumb_func_start PokeblockGetGain
+PokeblockGetGain: @ 8136FE4
push {r4-r7,lr}
mov r7, r9
mov r6, r8
@@ -3227,7 +3227,7 @@ _0813702A:
pop {r1}
bx r1
.pool
- thumb_func_end sub_8136FE4
+ thumb_func_end PokeblockGetGain
thumb_func_start sub_8137044
sub_8137044: @ 8137044
@@ -3261,7 +3261,7 @@ _08137074:
ldr r0, =gUnknown_085B2720
adds r1, r0
adds r0, r5, 0
- bl sub_8136FE4
+ bl PokeblockGetGain
lsls r0, 16
cmp r0, 0
ble _081370A0
diff --git a/asm/wild_encounter.s b/asm/wild_encounter.s
index 70346e4d7..19b7eeba6 100644
--- a/asm/wild_encounter.s
+++ b/asm/wild_encounter.s
@@ -5,1251 +5,6 @@
.text
- thumb_func_start sub_80B48B8
-sub_80B48B8: @ 80B48B8
- ldr r1, =gUnknown_02038C00
- strb r0, [r1]
- bx lr
- .pool
- thumb_func_end sub_80B48B8
-
- thumb_func_start sub_80B48C4
-sub_80B48C4: @ 80B48C4
- 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, =gUnknown_08553A7C
- 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 _080B496E
- ldr r0, =gMapHeader
- mov r10, r0
-_080B4906:
- movs r4, 0
- mov r1, r10
- ldr r0, [r1]
- ldr r0, [r0]
- cmp r4, r0
- bge _080B4964
- 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
-_080B4920:
- adds r0, r4, 0x7
- adds r1, r5, 0x7
- bl MapGridGetMetatileBehaviorAt
- lsls r0, 24
- lsrs r0, 24
- bl MetatileBehavior_IsSurfableAndNotWaterfall
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080B4954
- adds r0, r6, 0x1
- lsls r0, 16
- lsrs r6, r0, 16
- cmp r8, r4
- bne _080B4954
- cmp r7, r5
- bne _080B4954
- adds r0, r6, 0
- b _080B4974
- .pool
-_080B4954:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- mov r1, r10
- ldr r0, [r1]
- ldr r0, [r0]
- cmp r4, r0
- blt _080B4920
-_080B4964:
- adds r0, r5, 0x1
- lsls r0, 16
- lsrs r5, r0, 16
- cmp r5, r9
- bls _080B4906
-_080B496E:
- adds r0, r6, 0x1
- lsls r0, 16
- lsrs r0, 16
-_080B4974:
- 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_80B48C4
-
- thumb_func_start sub_80B4984
-sub_80B4984: @ 80B4984
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x10
- movs r7, 0
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldrh r1, [r0, 0x4]
- movs r0, 0x88
- lsls r0, 6
- cmp r1, r0
- bne _080B4A7A
- 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, =gUnknown_08553A7C
- mov r9, r5
- mov r8, r4
- ldrh r2, [r0, 0x6]
- cmp r1, r2
- blt _080B49D0
- ldrh r3, [r0, 0x8]
- cmp r1, r3
- bgt _080B49D0
- movs r7, 0x1
-_080B49D0:
- mov r2, r8
- movs r3, 0
- ldrsh r1, [r2, r3]
- ldrh r2, [r0, 0xC]
- cmp r1, r2
- blt _080B49E4
- ldrh r0, [r0, 0xE]
- cmp r1, r0
- bgt _080B49E4
- movs r7, 0x2
-_080B49E4:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x64
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x31
- bls _080B4A08
- b _080B4A7A
- .pool
-_080B4A04:
- movs r0, 0x1
- b _080B4A7C
-_080B4A08:
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r3, =0x00002e6a
- adds r0, r3
- ldrh r0, [r0]
- bl sub_80B4AB8
- movs r5, 0
- ldr r6, =0x000001bf
-_080B4A1A:
- bl sub_80B4A98
- 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 _080B4A38
- strh r6, [r4]
-_080B4A38:
- ldrh r0, [r4]
- subs r0, 0x1
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x2
- bls _080B4A4A
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
-_080B4A4A:
- cmp r5, 0x6
- bne _080B4A1A
- 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_80B48C4
- lsls r0, 16
- lsrs r1, r0, 16
- movs r5, 0
-_080B4A66:
- lsls r0, r5, 1
- add r0, sp
- ldrh r0, [r0]
- cmp r1, r0
- beq _080B4A04
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x5
- bls _080B4A66
-_080B4A7A:
- movs r0, 0
-_080B4A7C:
- add sp, 0x10
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_80B4984
-
- thumb_func_start sub_80B4A98
-sub_80B4A98: @ 80B4A98
- ldr r2, =gUnknown_02038C04
- ldr r1, [r2]
- ldr r0, =0x41c64e6d
- muls r0, r1
- ldr r1, =0x00003039
- adds r0, r1
- str r0, [r2]
- lsrs r0, 16
- bx lr
- .pool
- thumb_func_end sub_80B4A98
-
- thumb_func_start sub_80B4AB8
-sub_80B4AB8: @ 80B4AB8
- lsls r0, 16
- lsrs r0, 16
- ldr r1, =gUnknown_02038C04
- str r0, [r1]
- bx lr
- .pool
- thumb_func_end sub_80B4AB8
-
- thumb_func_start wild_pokemon_rand_grass
-wild_pokemon_rand_grass: @ 80B4AC8
- 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 _080B4AE4
- movs r0, 0
- b _080B4B7E
-_080B4AE4:
- adds r0, r1, 0
- subs r0, 0x14
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x13
- bhi _080B4AF4
- movs r0, 0x1
- b _080B4B7E
-_080B4AF4:
- adds r0, r1, 0
- subs r0, 0x28
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _080B4B04
- movs r0, 0x2
- b _080B4B7E
-_080B4B04:
- adds r0, r1, 0
- subs r0, 0x32
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _080B4B14
- movs r0, 0x3
- b _080B4B7E
-_080B4B14:
- adds r0, r1, 0
- subs r0, 0x3C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _080B4B24
- movs r0, 0x4
- b _080B4B7E
-_080B4B24:
- adds r0, r1, 0
- subs r0, 0x46
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _080B4B34
- movs r0, 0x5
- b _080B4B7E
-_080B4B34:
- adds r0, r1, 0
- subs r0, 0x50
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x4
- bhi _080B4B44
- movs r0, 0x6
- b _080B4B7E
-_080B4B44:
- adds r0, r1, 0
- subs r0, 0x55
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x4
- bhi _080B4B54
- movs r0, 0x7
- b _080B4B7E
-_080B4B54:
- adds r0, r1, 0
- subs r0, 0x5A
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080B4B64
- movs r0, 0x8
- b _080B4B7E
-_080B4B64:
- adds r0, r1, 0
- subs r0, 0x5E
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080B4B74
- movs r0, 0x9
- b _080B4B7E
-_080B4B74:
- cmp r1, 0x62
- beq _080B4B7C
- movs r0, 0xB
- b _080B4B7E
-_080B4B7C:
- movs r0, 0xA
-_080B4B7E:
- pop {r1}
- bx r1
- thumb_func_end wild_pokemon_rand_grass
-
- thumb_func_start wild_pokemon_rand_water
-wild_pokemon_rand_water: @ 80B4B84
- 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 _080B4BA2
- movs r0, 0
- b _080B4BD4
-_080B4BA2:
- adds r0, r1, 0
- subs r0, 0x3C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1D
- bhi _080B4BB2
- movs r0, 0x1
- b _080B4BD4
-_080B4BB2:
- adds r0, r1, 0
- subs r0, 0x5A
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x4
- bhi _080B4BC2
- movs r0, 0x2
- b _080B4BD4
-_080B4BC2:
- adds r0, r2, 0
- subs r0, 0x5F
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bls _080B4BD2
- movs r0, 0x4
- b _080B4BD4
-_080B4BD2:
- movs r0, 0x3
-_080B4BD4:
- pop {r1}
- bx r1
- thumb_func_end wild_pokemon_rand_water
-
- thumb_func_start sub_80B4BD8
-sub_80B4BD8: @ 80B4BD8
- 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 _080B4C12
- cmp r4, 0x1
- bgt _080B4C02
- cmp r4, 0
- beq _080B4C08
- b _080B4C6C
-_080B4C02:
- cmp r6, 0x2
- beq _080B4C36
- b _080B4C6C
-_080B4C08:
- movs r5, 0x1
- cmp r1, 0x45
- bhi _080B4C6C
- movs r5, 0
- b _080B4C6C
-_080B4C12:
- cmp r1, 0x3B
- bhi _080B4C18
- movs r5, 0x2
-_080B4C18:
- adds r0, r1, 0
- subs r0, 0x3C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x13
- bhi _080B4C26
- movs r5, 0x3
-_080B4C26:
- adds r0, r1, 0
- subs r0, 0x50
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x13
- bhi _080B4C6C
- movs r5, 0x4
- b _080B4C6C
-_080B4C36:
- cmp r1, 0x27
- bhi _080B4C3C
- movs r5, 0x5
-_080B4C3C:
- adds r0, r1, 0
- subs r0, 0x28
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x27
- bhi _080B4C4A
- movs r5, 0x6
-_080B4C4A:
- adds r0, r1, 0
- subs r0, 0x50
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xE
- bhi _080B4C58
- movs r5, 0x7
-_080B4C58:
- adds r0, r1, 0
- subs r0, 0x5F
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080B4C66
- movs r5, 0x8
-_080B4C66:
- cmp r1, 0x63
- bne _080B4C6C
- movs r5, 0x9
-_080B4C6C:
- adds r0, r5, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_80B4BD8
-
- thumb_func_start sub_80B4C74
-sub_80B4C74: @ 80B4C74
- push {r4-r7,lr}
- adds r4, r0, 0
- ldrb r0, [r4, 0x1]
- ldrb r1, [r4]
- cmp r0, r1
- bcc _080B4C86
- ldrb r7, [r4]
- adds r6, r0, 0
- b _080B4C8A
-_080B4C86:
- ldrb r7, [r4, 0x1]
- ldrb r6, [r4]
-_080B4C8A:
- subs r4, r6, r7
- 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 r4, r0, 24
- ldr r5, =gPlayerParty
- adds r0, r5, 0
- movs r1, 0x6
- bl GetMonData
- cmp r0, 0
- bne _080B4CEA
- adds r0, r5, 0
- bl GetMonAbility
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x37
- beq _080B4CC8
- cmp r0, 0x48
- beq _080B4CC8
- cmp r0, 0x2E
- bne _080B4CEA
-_080B4CC8:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- bne _080B4CE0
- adds r0, r6, 0
- b _080B4CF0
- .pool
-_080B4CE0:
- cmp r4, 0
- beq _080B4CEA
- subs r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
-_080B4CEA:
- adds r0, r7, r4
- lsls r0, 24
- lsrs r0, 24
-_080B4CF0:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80B4C74
-
- thumb_func_start get_wild_data_index_for_map
-get_wild_data_index_for_map: @ 80B4CF8
- push {r4-r6,lr}
- movs r4, 0
- ldr r0, =gWildMonHeaders
- ldrb r1, [r0]
- adds r5, r0, 0
- cmp r1, 0xFF
- beq _080B4D6C
- ldr r6, =0x00006a18
-_080B4D08:
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 2
- adds r3, r0, r5
- ldrb r1, [r3]
- ldr r0, =gSaveBlock1Ptr
- ldr r2, [r0]
- movs r0, 0x4
- ldrsb r0, [r2, r0]
- cmp r1, r0
- bne _080B4D58
- ldrb r1, [r3, 0x1]
- movs r0, 0x5
- ldrsb r0, [r2, r0]
- cmp r1, r0
- bne _080B4D58
- ldrh r0, [r2, 0x4]
- cmp r0, r6
- bne _080B4D44
- ldr r0, =0x0000403e
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x8
- bls _080B4D3E
- movs r0, 0
-_080B4D3E:
- adds r0, r4, r0
- lsls r0, 16
- lsrs r4, r0, 16
-_080B4D44:
- adds r0, r4, 0
- b _080B4D6E
- .pool
-_080B4D58:
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 2
- adds r0, r5
- ldrb r0, [r0]
- cmp r0, 0xFF
- bne _080B4D08
-_080B4D6C:
- ldr r0, =0x0000ffff
-_080B4D6E:
- pop {r4-r6}
- pop {r1}
- bx r1
- .pool
- thumb_func_end get_wild_data_index_for_map
-
- thumb_func_start sub_80B4D78
-sub_80B4D78: @ 80B4D78
- push {r4-r7,lr}
- sub sp, 0x1C
- bl GetSafariZoneFlag
- cmp r0, 0x1
- bne _080B4E0E
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x64
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x4F
- bhi _080B4E0E
- bl SafariZoneGetActivePokeblock
- adds r7, r0, 0
- cmp r7, 0
- beq _080B4E0E
- movs r5, 0
-_080B4DA6:
- 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 _080B4DA6
- movs r5, 0
-_080B4DB8:
- adds r1, r5, 0x1
- lsls r0, r1, 24
- lsrs r4, r0, 24
- adds r6, r1, 0
- cmp r4, 0x18
- bhi _080B4DE8
- add r5, sp
-_080B4DC6:
- bl Random
- movs r1, 0x1
- ands r1, r0
- cmp r1, 0
- beq _080B4DDE
- ldrb r2, [r5]
- mov r0, sp
- adds r1, r0, r4
- ldrb r0, [r1]
- strb r0, [r5]
- strb r2, [r1]
-_080B4DDE:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x18
- bls _080B4DC6
-_080B4DE8:
- lsls r0, r6, 24
- lsrs r5, r0, 24
- cmp r5, 0x17
- bls _080B4DB8
- movs r5, 0
-_080B4DF2:
- mov r1, sp
- adds r4, r1, r5
- ldrb r0, [r4]
- adds r1, r7, 0
- bl sub_8136FE4
- lsls r0, 16
- cmp r0, 0
- bgt _080B4E48
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x18
- bls _080B4DF2
-_080B4E0E:
- ldr r4, =gPlayerParty
- adds r0, r4, 0
- movs r1, 0x6
- bl GetMonData
- cmp r0, 0
- bne _080B4E4C
- adds r0, r4, 0
- bl GetMonAbility
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1C
- bne _080B4E4C
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- bne _080B4E4C
- adds r0, r4, 0
- movs r1, 0
- bl GetMonData
- b _080B4E54
- .pool
-_080B4E48:
- ldrb r0, [r4]
- b _080B4E5E
-_080B4E4C:
- bl Random
- lsls r0, 16
- lsrs r0, 16
-_080B4E54:
- movs r1, 0x19
- bl __umodsi3
- lsls r0, 24
- lsrs r0, 24
-_080B4E5E:
- add sp, 0x1C
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_80B4D78
-
- thumb_func_start sub_80B4E68
-sub_80B4E68: @ 80B4E68
- push {r4-r7,lr}
- sub sp, 0xC
- lsls r0, 16
- lsrs r6, r0, 16
- lsls r1, 24
- lsrs r7, r1, 24
- bl ZeroEnemyPartyMons
- movs r2, 0x1
- ldr r1, =gBaseStats
- lsls r0, r6, 3
- subs r0, r6
- lsls r0, 2
- adds r0, r1
- ldrb r0, [r0, 0x10]
- cmp r0, 0
- beq _080B4E96
- cmp r0, 0
- blt _080B4E98
- cmp r0, 0xFF
- bgt _080B4E98
- cmp r0, 0xFE
- blt _080B4E98
-_080B4E96:
- movs r2, 0
-_080B4E98:
- cmp r2, 0
- beq _080B4F28
- ldr r5, =gPlayerParty
- adds r0, r5, 0
- movs r1, 0x6
- bl GetMonData
- cmp r0, 0
- bne _080B4F28
- adds r0, r5, 0
- bl GetMonAbility
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x38
- bne _080B4F28
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x3
- bl __umodsi3
- lsls r0, 16
- cmp r0, 0
- beq _080B4F28
- adds r0, r5, 0
- movs r1, 0xB
- bl GetMonData
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- adds r0, r5, 0
- movs r1, 0
- bl GetMonData
- adds r1, r0, 0
- adds r0, r4, 0
- bl GetGenderFromSpeciesAndPersonality
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xFE
- bne _080B4F00
- movs r4, 0
- b _080B4F02
- .pool
-_080B4F00:
- movs r4, 0xFE
-_080B4F02:
- bl sub_80B4D78
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gEnemyParty
- str r4, [sp]
- str r0, [sp, 0x4]
- movs r0, 0
- str r0, [sp, 0x8]
- adds r0, r1, 0
- adds r1, r6, 0
- adds r2, r7, 0
- movs r3, 0x20
- bl CreateMonWithGenderNatureLetter
- b _080B4F40
- .pool
-_080B4F28:
- bl sub_80B4D78
- lsls r0, 24
- lsrs r0, 24
- ldr r1, =gEnemyParty
- str r0, [sp]
- adds r0, r1, 0
- adds r1, r6, 0
- adds r2, r7, 0
- movs r3, 0x20
- bl CreateMonWithNature
-_080B4F40:
- add sp, 0xC
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_80B4E68
-
- thumb_func_start sub_80B4F4C
-sub_80B4F4C: @ 80B4F4C
- push {r4-r6,lr}
- sub sp, 0x4
- adds r5, r0, 0
- lsls r1, 24
- lsrs r3, r1, 24
- adds r4, r3, 0
- lsls r2, 24
- lsrs r6, r2, 24
- movs r1, 0
- mov r0, sp
- strb r1, [r0]
- cmp r3, 0x1
- beq _080B4FA0
- cmp r3, 0x1
- bgt _080B4F70
- cmp r3, 0
- beq _080B4F76
- b _080B4FBA
-_080B4F70:
- cmp r4, 0x2
- beq _080B4FB2
- b _080B4FBA
-_080B4F76:
- ldr r0, [r5, 0x4]
- movs r1, 0x8
- movs r2, 0x2A
- mov r3, sp
- bl TryGetAbilityInfluencedWildMonIndex
- lsls r0, 24
- cmp r0, 0
- bne _080B4FBA
- ldr r0, [r5, 0x4]
- movs r1, 0xD
- movs r2, 0x9
- mov r3, sp
- bl TryGetAbilityInfluencedWildMonIndex
- lsls r0, 24
- cmp r0, 0
- bne _080B4FBA
- bl wild_pokemon_rand_grass
- b _080B4FB6
-_080B4FA0:
- ldr r0, [r5, 0x4]
- movs r1, 0xD
- movs r2, 0x9
- mov r3, sp
- bl TryGetAbilityInfluencedWildMonIndex
- lsls r0, 24
- cmp r0, 0
- bne _080B4FBA
-_080B4FB2:
- bl wild_pokemon_rand_water
-_080B4FB6:
- mov r1, sp
- strb r0, [r1]
-_080B4FBA:
- mov r0, sp
- ldrb r1, [r0]
- lsls r1, 2
- ldr r0, [r5, 0x4]
- adds r0, r1
- bl sub_80B4C74
- lsls r0, 24
- lsrs r4, r0, 24
- movs r0, 0x1
- ands r0, r6
- cmp r0, 0
- beq _080B4FE0
- adds r0, r4, 0
- bl sub_80B58CC
- lsls r0, 24
- cmp r0, 0
- beq _080B5000
-_080B4FE0:
- ldr r0, =gMapHeader
- ldrh r1, [r0, 0x12]
- movs r0, 0xB3
- lsls r0, 1
- cmp r1, r0
- beq _080B5008
- movs r0, 0x2
- ands r0, r6
- cmp r0, 0
- beq _080B5008
- adds r0, r4, 0
- bl DoKeenEyeIntimidateWildEncounterTest
- lsls r0, 24
- cmp r0, 0
- bne _080B5008
-_080B5000:
- movs r0, 0
- b _080B501C
- .pool
-_080B5008:
- mov r0, sp
- ldrb r0, [r0]
- ldr r1, [r5, 0x4]
- lsls r0, 2
- adds r0, r1
- ldrh r0, [r0, 0x2]
- adds r1, r4, 0
- bl sub_80B4E68
- movs r0, 0x1
-_080B501C:
- add sp, 0x4
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_80B4F4C
-
- thumb_func_start sub_80B5024
-sub_80B5024: @ 80B5024
- push {r4,r5,lr}
- adds r5, r0, 0
- lsls r0, r1, 24
- lsrs r0, 24
- bl sub_80B4BD8
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 22
- ldr r0, [r5, 0x4]
- adds r0, r4
- bl sub_80B4C74
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r0, [r5, 0x4]
- adds r0, r4, r0
- ldrh r0, [r0, 0x2]
- bl sub_80B4E68
- ldr r0, [r5, 0x4]
- adds r4, r0
- ldrh r0, [r4, 0x2]
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80B5024
-
- thumb_func_start SetUpMassOutbreakEncounter
-SetUpMassOutbreakEncounter: @ 80B505C
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x1
- ands r0, r1
- cmp r0, 0
- beq _080B508C
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, =0x00002b94
- adds r0, r1
- ldrb r0, [r0]
- bl sub_80B58CC
- lsls r0, 24
- cmp r0, 0
- bne _080B508C
- movs r0, 0
- b _080B50C6
- .pool
-_080B508C:
- ldr r0, =gSaveBlock1Ptr
- ldr r1, [r0]
- ldr r2, =0x00002b90
- adds r0, r1, r2
- ldrh r0, [r0]
- adds r2, 0x4
- adds r1, r2
- ldrb r1, [r1]
- bl sub_80B4E68
- movs r4, 0
-_080B50A2:
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- lsls r1, r4, 1
- ldr r2, =0x00002b98
- adds r0, r2
- adds r0, r1
- ldrh r1, [r0]
- lsls r2, r4, 24
- lsrs r2, 24
- ldr r0, =gEnemyParty
- bl SetMonMoveSlot
- adds r0, r4, 0x1
- lsls r0, 16
- lsrs r4, r0, 16
- cmp r4, 0x3
- bls _080B50A2
- movs r0, 0x1
-_080B50C6:
- pop {r4}
- pop {r1}
- bx r1
- .pool
- thumb_func_end SetUpMassOutbreakEncounter
-
- thumb_func_start DoMassOutbreakEncounterTest
-DoMassOutbreakEncounterTest: @ 80B50DC
- push {r4,lr}
- ldr r4, =gSaveBlock1Ptr
- ldr r2, [r4]
- ldr r1, =0x00002b90
- adds r0, r2, r1
- ldrh r0, [r0]
- cmp r0, 0
- beq _080B513C
- movs r1, 0x5
- ldrsb r1, [r2, r1]
- ldr r3, =0x00002b92
- adds r0, r2, r3
- ldrb r0, [r0]
- cmp r1, r0
- bne _080B513C
- movs r1, 0x4
- ldrsb r1, [r2, r1]
- adds r3, 0x1
- adds r0, r2, r3
- ldrb r0, [r0]
- cmp r1, r0
- bne _080B513C
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x64
- bl __umodsi3
- ldr r1, [r4]
- ldr r2, =0x00002ba1
- adds r1, r2
- lsls r0, 16
- lsrs r0, 16
- ldrb r1, [r1]
- cmp r0, r1
- bcs _080B513C
- movs r0, 0x1
- b _080B513E
- .pool
-_080B513C:
- movs r0, 0
-_080B513E:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end DoMassOutbreakEncounterTest
-
- thumb_func_start DoWildEncounterRateDiceRoll
-DoWildEncounterRateDiceRoll: @ 80B5144
- 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 _080B5168
- movs r0, 0
- b _080B516A
-_080B5168:
- movs r0, 0x1
-_080B516A:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end DoWildEncounterRateDiceRoll
-
- thumb_func_start DoWildEncounterRateTest
-DoWildEncounterRateTest: @ 80B5170
- 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 _080B519A
- ldr r1, [sp]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 4
- movs r1, 0x64
- bl __udivsi3
- str r0, [sp]
-_080B519A:
- mov r0, sp
- bl affects_encounter_rate_based_on_flags
- mov r0, sp
- bl ApplyCleanseTagWildEncounterRateReduction
- cmp r4, 0
- bne _080B5216
- ldr r4, =gPlayerParty
- adds r0, r4, 0
- movs r1, 0x6
- bl GetMonData
- cmp r0, 0
- bne _080B5216
- adds r0, r4, 0
- bl GetMonAbility
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080B51E8
- ldr r0, =gMapHeader
- ldrh r1, [r0, 0x12]
- ldr r0, =0x00000169
- cmp r1, r0
- bne _080B5210
- ldr r1, [sp]
- lsls r0, r1, 1
- adds r0, r1
- lsrs r0, 2
- b _080B5214
- .pool
-_080B51E8:
- cmp r0, 0x23
- bne _080B51F2
- ldr r0, [sp]
- lsls r0, 1
- b _080B5214
-_080B51F2:
- cmp r0, 0x49
- beq _080B5210
- cmp r0, 0x47
- bne _080B5200
- ldr r0, [sp]
- lsls r0, 1
- b _080B5214
-_080B5200:
- cmp r0, 0x8
- bne _080B5216
- ldr r0, =gSaveBlock1Ptr
- ldr r0, [r0]
- adds r0, 0x2E
- ldrb r0, [r0]
- cmp r0, 0x8
- bne _080B5216
-_080B5210:
- ldr r0, [sp]
- lsrs r0, 1
-_080B5214:
- str r0, [sp]
-_080B5216:
- ldr r0, [sp]
- movs r1, 0xB4
- lsls r1, 4
- cmp r0, r1
- bls _080B5222
- str r1, [sp]
-_080B5222:
- 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
- .pool
- thumb_func_end DoWildEncounterRateTest
thumb_func_start DoGlobalWildEncounterDiceRoll
DoGlobalWildEncounterDiceRoll: @ 80B523C
@@ -1307,13 +62,13 @@ is_it_battle_time_2: @ 80B5288
lsls r1, 16
lsrs r7, r1, 16
mov r8, r7
- ldr r0, =gUnknown_02038C00
+ ldr r0, =sWildEncountersDisabled
ldrb r0, [r0]
cmp r0, 0x1
bne _080B52A6
b _080B54FE
_080B52A6:
- bl get_wild_data_index_for_map
+ bl GetCurrentMapWildMonHeaderId
lsls r0, 16
lsrs r5, r0, 16
ldr r0, =0x0000ffff
@@ -1355,7 +110,7 @@ _080B52F8:
ldr r0, [r4]
movs r1, 0
movs r2, 0x2
- bl sub_80B4F4C
+ bl TryGenerateWildMon
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -1410,7 +165,7 @@ _080B5372:
ldr r0, [r4]
movs r1, 0
movs r2, 0x2
- bl sub_80B4F4C
+ bl TryGenerateWildMon
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -1489,7 +244,7 @@ _080B5418:
ldr r0, [r0]
movs r1, 0
movs r2, 0x3
- bl sub_80B4F4C
+ bl TryGenerateWildMon
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -1561,7 +316,7 @@ _080B54BA:
ldr r1, =0x000031dc
adds r0, r1
ldrb r0, [r0, 0xC]
- bl sub_80B58CC
+ bl IsWildLevelAllowedByRepel
lsls r0, 24
cmp r0, 0
beq _080B54FE
@@ -1573,7 +328,7 @@ _080B54E4:
ldr r0, [r4]
movs r1, 0x1
movs r2, 0x3
- bl sub_80B4F4C
+ bl TryGenerateWildMon
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -1596,7 +351,7 @@ _080B5500:
thumb_func_start rock_smash_wild_pokemon_encounter
rock_smash_wild_pokemon_encounter: @ 80B550C
push {r4,lr}
- bl get_wild_data_index_for_map
+ bl GetCurrentMapWildMonHeaderId
lsls r0, 16
lsrs r2, r0, 16
ldr r0, =0x0000ffff
@@ -1621,7 +376,7 @@ rock_smash_wild_pokemon_encounter: @ 80B550C
adds r0, r4, 0
movs r1, 0x2
movs r2, 0x3
- bl sub_80B4F4C
+ bl TryGenerateWildMon
lsls r0, 24
lsrs r4, r0, 24
cmp r4, 0x1
@@ -1652,7 +407,7 @@ SweetScentWildEncounter: @ 80B5578
mov r0, sp
adds r1, r5, 0
bl PlayerGetDestCoords
- bl get_wild_data_index_for_map
+ bl GetCurrentMapWildMonHeaderId
lsls r0, 16
lsrs r4, r0, 16
ldr r0, =0x0000ffff
@@ -1676,7 +431,7 @@ SweetScentWildEncounter: @ 80B5578
ldr r0, [r0]
movs r1, 0
movs r2, 0
- bl sub_80B4F4C
+ bl TryGenerateWildMon
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -1709,7 +464,7 @@ _080B55EC:
ldr r0, [r0]
movs r1, 0
movs r2, 0
- bl sub_80B4F4C
+ bl TryGenerateWildMon
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -1758,7 +513,7 @@ _080B5680:
adds r0, r4, 0
movs r1, 0
movs r2, 0
- bl sub_80B4F4C
+ bl TryGenerateWildMon
b _080B56EA
_080B568C:
mov r0, sp
@@ -1802,7 +557,7 @@ _080B56E0:
adds r0, r4, 0
movs r1, 0x1
movs r2, 0
- bl sub_80B4F4C
+ bl TryGenerateWildMon
_080B56EA:
bl sub_80B0698
movs r0, 0x1
@@ -1819,7 +574,7 @@ _080B56F4:
thumb_func_start GetFishingWildMonListHeader
GetFishingWildMonListHeader: @ 80B56FC
push {lr}
- bl get_wild_data_index_for_map
+ bl GetCurrentMapWildMonHeaderId
lsls r0, 16
lsrs r2, r0, 16
ldr r0, =0x0000ffff
@@ -1849,25 +604,25 @@ sub_80B5734: @ 80B5734
push {r4,r5,lr}
lsls r0, 24
lsrs r5, r0, 24
- bl sub_80B4984
+ bl CheckFeebas
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
bne _080B5764
ldr r4, =gUnknown_08553A78
adds r0, r4, 0
- bl sub_80B4C74
+ bl ChooseWildMonLevel
adds r1, r0, 0
lsls r1, 24
lsrs r1, 24
ldrh r4, [r4, 0x2]
adds r0, r4, 0
- bl sub_80B4E68
+ bl CreateWildMon
b _080B5784
.pool
_080B5764:
ldr r4, =gWildMonHeaders
- bl get_wild_data_index_for_map
+ bl GetCurrentMapWildMonHeaderId
lsls r0, 16
lsrs r0, 16
lsls r1, r0, 2
@@ -1877,7 +632,7 @@ _080B5764:
adds r1, r4
ldr r0, [r1]
adds r1, r5, 0
- bl sub_80B5024
+ bl GenerateFishingWildMon
lsls r0, 16
lsrs r4, r0, 16
_080B5784:
@@ -1898,7 +653,7 @@ wild_pokemon_rand_for_map: @ 80B57A0
adds r6, r0, 0
movs r0, 0
strb r0, [r6]
- bl get_wild_data_index_for_map
+ bl GetCurrentMapWildMonHeaderId
lsls r0, 16
lsrs r3, r0, 16
ldr r0, =0x0000ffff
@@ -1929,7 +684,7 @@ _080B57E0:
_080B57E6:
movs r0, 0x1
strb r0, [r6]
- bl wild_pokemon_rand_water
+ bl ChooseWildMonIndex_WaterRock
lsls r0, 24
ldr r1, [r4, 0x4]
b _080B5820
@@ -1945,12 +700,12 @@ _080B57F4:
bls _080B5818
movs r0, 0x1
strb r0, [r6]
- bl wild_pokemon_rand_water
+ bl ChooseWildMonIndex_WaterRock
lsls r0, 24
ldr r1, [r4, 0x4]
b _080B5820
_080B5818:
- bl wild_pokemon_rand_grass
+ bl ChooseWildMonIndex_Land
lsls r0, 24
ldr r1, [r5, 0x4]
_080B5820:
@@ -1966,7 +721,7 @@ _080B5826:
thumb_func_start sub_80B582C
sub_80B582C: @ 80B582C
push {r4,lr}
- bl get_wild_data_index_for_map
+ bl GetCurrentMapWildMonHeaderId
lsls r0, 16
lsrs r2, r0, 16
ldr r0, =0x0000ffff
@@ -1981,7 +736,7 @@ sub_80B582C: @ 80B582C
ldr r4, [r0]
cmp r4, 0
beq _080B5868
- bl wild_pokemon_rand_water
+ bl ChooseWildMonIndex_WaterRock
lsls r0, 24
ldr r1, [r4, 0x4]
lsrs r0, 22
@@ -2039,8 +794,8 @@ _080B58C6:
bx r1
thumb_func_end sub_80B5870
- thumb_func_start sub_80B58CC
-sub_80B58CC: @ 80B58CC
+ thumb_func_start IsWildLevelAllowedByRepel
+IsWildLevelAllowedByRepel: @ 80B58CC
push {r4-r6,lr}
lsls r0, 24
lsrs r6, r0, 24
@@ -2089,11 +844,11 @@ _080B592C:
pop {r4-r6}
pop {r1}
bx r1
- thumb_func_end sub_80B58CC
+ thumb_func_end IsWildLevelAllowedByRepel
- thumb_func_start DoKeenEyeIntimidateWildEncounterTest
-@ _BOOL1 DoKeenEyeIntimidateWildEncounterTest(u8 wildMonLevel)
-DoKeenEyeIntimidateWildEncounterTest: @ 80B5934
+ thumb_func_start IsAbilityAllowingEncounter
+@ _BOOL1 IsAbilityAllowingEncounter(u8 wildMonLevel)
+IsAbilityAllowingEncounter: @ 80B5934
push {r4,r5,lr}
lsls r0, 24
lsrs r5, r0, 24
@@ -2138,7 +893,7 @@ _080B598A:
pop {r4,r5}
pop {r1}
bx r1
- thumb_func_end DoKeenEyeIntimidateWildEncounterTest
+ thumb_func_end IsAbilityAllowingEncounter
thumb_func_start TryGetRandomWildMonIndexByType
@ _BOOL1 TryGetRandomWildMonIndexByType(WildMonEntry *mons, u8 type, u8 numMons, u8 *monIndex)
@@ -2295,9 +1050,9 @@ _080B5AA6:
bx r1
thumb_func_end TryGetAbilityInfluencedWildMonIndex
- thumb_func_start affects_encounter_rate_based_on_flags
-@ void affects_encounter_rate_based_on_flags(u32 *val)
-affects_encounter_rate_based_on_flags: @ 80B5AB0
+ thumb_func_start ApplyFluteEncounterRateMod
+@ void ApplyFluteEncounterRateMod(u32 *val)
+ApplyFluteEncounterRateMod: @ 80B5AB0
push {r4,lr}
adds r4, r0, 0
ldr r0, =0x000008ad
@@ -2327,10 +1082,10 @@ _080B5AE4:
pop {r0}
bx r0
.pool
- thumb_func_end affects_encounter_rate_based_on_flags
+ thumb_func_end ApplyFluteEncounterRateMod
- thumb_func_start ApplyCleanseTagWildEncounterRateReduction
-ApplyCleanseTagWildEncounterRateReduction: @ 80B5AF0
+ thumb_func_start ApplyCleanseTagEncounterRateMod
+ApplyCleanseTagEncounterRateMod: @ 80B5AF0
push {r4,lr}
adds r4, r0, 0
ldr r0, =gPlayerParty
@@ -2348,6 +1103,6 @@ _080B5B0C:
pop {r0}
bx r0
.pool
- thumb_func_end ApplyCleanseTagWildEncounterRateReduction
+ thumb_func_end ApplyCleanseTagEncounterRateMod
.align 2, 0 @ Don't pad with nop.
diff --git a/data/wild_encounter.s b/data/wild_encounter.s
index ddb842a76..8540fefac 100644
--- a/data/wild_encounter.s
+++ b/data/wild_encounter.s
@@ -18,5 +18,5 @@ gUnknown_08553A14:: @ 8553A14
gUnknown_08553A78:: @ 8553A78
.incbin "baserom.gba", 0x553a78, 0x4
-gUnknown_08553A7C:: @ 8553A7C
+gRoute119WaterTileData:: @ 8553A7C
.incbin "baserom.gba", 0x553a7c, 0x14
diff --git a/include/global.h b/include/global.h
index 3421517d7..7547d523b 100644
--- a/include/global.h
+++ b/include/global.h
@@ -579,7 +579,7 @@ struct SaveBlock1
/*0x2BB0*/ u16 unk2BB0[6];
/*0x2BBC*/ u16 unk2BBC[6];
/*0x2BC8*/ u16 unk2BC8[6];
- /*0x2BD4*/ u16 unk2BD4[3];
+ /*0x2BD4*/ u16 unk2BD4[6];
/*0x2BE0*/ struct MailStruct mail[16];
/*0x2E20*/ u8 additionalPhrases[5]; // bitfield for 33 additional phrases in easy chat system
/*0x2E25*/ u8 unk2E25[3]; // possibly padding?
diff --git a/include/pokeblock.h b/include/pokeblock.h
index 5d52f8e55..b0e93f0e5 100644
--- a/include/pokeblock.h
+++ b/include/pokeblock.h
@@ -23,6 +23,7 @@ enum
};
void ClearPokeblocks(void);
+s16 PokeblockGetGain(u8, const struct Pokeblock *);
/*
void sub_810B96C(void);
@@ -32,7 +33,6 @@ s16 GetPokeblockData(const struct Pokeblock *, u8);
u8 sub_810C9E8(struct Pokeblock *);
void sub_810BA7C(u8);
bool8 PokeblockClearIfExists(u8);
-s16 PokeblockGetGain(u8, const struct Pokeblock *);
u8 sub_810CB68(u8, u8*);
void PokeblockCopyName(struct Pokeblock *pokeblock, u8 *dest);
void CB2_PreparePokeblockFeedScene(void);
diff --git a/include/vars.h b/include/vars.h
index f8057d4b5..763b7379d 100644
--- a/include/vars.h
+++ b/include/vars.h
@@ -30,6 +30,7 @@
#define VAR_RESET_RTC_ENABLE 0x402C
#define VAR_0x4037 0x4037
+#define VAR_ALTERING_CAVE_WILD_SET 0x403E
#define VAR_DAYS 0x4040
#define VAR_DEPT_STORE_FLOOR 0x4043
diff --git a/include/wild_encounter.h b/include/wild_encounter.h
new file mode 100644
index 000000000..c9d7c3fa1
--- /dev/null
+++ b/include/wild_encounter.h
@@ -0,0 +1,39 @@
+#ifndef GUARD_WILD_ENCOUNTER_H
+#define GUARD_WILD_ENCOUNTER_H
+
+struct WildPokemon
+{
+ u8 minLevel;
+ u8 maxLevel;
+ u16 species;
+};
+
+struct WildPokemonInfo
+{
+ u8 encounterRate;
+ const struct WildPokemon *wildPokemon;
+};
+
+struct WildPokemonHeader
+{
+ u8 mapGroup;
+ u8 mapNum;
+ const struct WildPokemonInfo *landMonsInfo;
+ const struct WildPokemonInfo *waterMonsInfo;
+ const struct WildPokemonInfo *rockSmashMonsInfo;
+ const struct WildPokemonInfo *fishingMonsInfo;
+};
+
+extern const struct WildPokemonHeader gWildMonHeaders[];
+
+void DisableWildEncounters(bool8 disabled);
+bool8 StandardWildEncounter(u16 a, u16 b);
+void ScrSpecial_RockSmashWildEncounter(void);
+bool8 SweetScentWildEncounter(void);
+bool8 DoesCurrentMapHaveFishingMons(void);
+void FishingWildEncounter(u8 rod);
+u16 GetLocalWildMon(bool8 *isWaterMon);
+u16 GetLocalWaterMon(void);
+bool8 UpdateRepelCounter(void);
+
+#endif // GUARD_WILD_ENCOUNTER_H
diff --git a/ld_script.txt b/ld_script.txt
index 2c958ea5a..b04f2f9af 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -124,6 +124,7 @@ SECTIONS {
asm/battle_setup.o(.text);
asm/cable_club.o(.text);
asm/trainer_see.o(.text);
+ src/wild_encounter.o(.text);
asm/wild_encounter.o(.text);
asm/field_effect.o(.text);
asm/unknown_task.o(.text);
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
new file mode 100644
index 000000000..7d4cc7794
--- /dev/null
+++ b/src/wild_encounter.c
@@ -0,0 +1,483 @@
+#include "global.h"
+#include "wild_encounter.h"
+#include "pokemon.h"
+#include "species.h"
+#include "metatile_behavior.h"
+#include "fieldmap.h"
+#include "rng.h"
+#include "map_constants.h"
+#include "field_player_avatar.h"
+#include "abilities.h"
+#include "event_data.h"
+#include "safari_zone.h"
+#include "pokeblock.h"
+
+EWRAM_DATA u8 sWildEncountersDisabled = 0;
+EWRAM_DATA u32 sFeebasRngValue = 0;
+
+#define NUM_FEEBAS_SPOTS 6
+
+extern const u16 gRoute119WaterTileData[];
+
+// this file's functions
+u16 FeebasRandom(void);
+void FeebasSeedRng(u16 seed);
+bool8 IsWildLevelAllowedByRepel(u8 level);
+void ApplyFluteEncounterRateMod(u32 *encRate);
+void ApplyCleanseTagEncounterRateMod(u32 *encRate);
+bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex);
+bool8 IsAbilityAllowingEncounter(u8 level);
+
+void DisableWildEncounters(bool8 disabled)
+{
+ sWildEncountersDisabled = disabled;
+}
+
+u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section)
+{
+ u16 xCur;
+ u16 yCur;
+ u16 yMin = gRoute119WaterTileData[section * 3 + 0];
+ u16 yMax = gRoute119WaterTileData[section * 3 + 1];
+ u16 tileNum = gRoute119WaterTileData[section * 3 + 2];
+
+ for (yCur = yMin; yCur <= yMax; yCur++)
+ {
+ for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++)
+ {
+ u8 tileBehaviorId = MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7);
+ if (MetatileBehavior_IsSurfableAndNotWaterfall(tileBehaviorId) == TRUE)
+ {
+ tileNum++;
+ if (x == xCur && y == yCur)
+ return tileNum;
+ }
+ }
+ }
+ return tileNum + 1;
+}
+
+bool8 CheckFeebas(void)
+{
+ u8 i;
+ u16 feebasSpots[NUM_FEEBAS_SPOTS];
+ s16 x;
+ s16 y;
+ u8 route119section = 0;
+ u16 waterTileNum;
+
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ROUTE119
+ && gSaveBlock1Ptr->location.mapNum == MAP_ID_ROUTE119)
+ {
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ x -= 7;
+ y -= 7;
+
+#ifdef NONMATCHING
+ if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1])
+ route119section = 1;
+ if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1])
+ route119section = 2;
+#else
+ {
+ register const u16 *arr asm("r0");
+ if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1])
+ route119section = 1;
+ if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1])
+ route119section = 2;
+ }
+#endif
+
+ if (Random() % 100 > 49) // 50% chance of encountering Feebas
+ return FALSE;
+
+ FeebasSeedRng(gSaveBlock1Ptr->easyChatPairs[0].unk2);
+ 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++;
+ }
+ waterTileNum = GetRoute119WaterTileNum(x, y, route119section);
+ for (i = 0; i < NUM_FEEBAS_SPOTS; i++)
+ {
+ if (waterTileNum == feebasSpots[i])
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+u16 FeebasRandom(void)
+{
+ sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue;
+ return sFeebasRngValue >> 16;
+}
+
+void FeebasSeedRng(u16 seed)
+{
+ sFeebasRngValue = seed;
+}
+
+u8 ChooseWildMonIndex_Land(void)
+{
+ u8 rand = Random() % 100;
+
+ if (rand < 20) // 20% chance
+ return 0;
+ if (rand >= 20 && rand < 40) // 20% chance
+ return 1;
+ if (rand >= 40 && rand < 50) // 10% chance
+ return 2;
+ if (rand >= 50 && rand < 60) // 10% chance
+ return 3;
+ if (rand >= 60 && rand < 70) // 10% chance
+ return 4;
+ if (rand >= 70 && rand < 80) // 10% chance
+ return 5;
+ if (rand >= 80 && rand < 85) // 5% chance
+ return 6;
+ if (rand >= 85 && rand < 90) // 5% chance
+ return 7;
+ if (rand >= 90 && rand < 94) // 4% chance
+ return 8;
+ if (rand >= 94 && rand < 98) // 4% chance
+ return 9;
+ if (rand == 98) // 1% chance
+ return 10;
+ else // 1% chance
+ return 11;
+}
+
+u8 ChooseWildMonIndex_WaterRock(void)
+{
+ u8 rand = Random() % 100;
+
+ if (rand < 60) // 60% chance
+ return 0;
+ if (rand >= 60 && rand < 90) // 30% chance
+ return 1;
+ if (rand >= 90 && rand < 95) // 5% chance
+ return 2;
+ if (rand >= 95 && rand < 99) // 4% chance
+ return 3;
+ else // 1% chance
+ return 4;
+}
+
+enum
+{
+ OLD_ROD,
+ GOOD_ROD,
+ SUPER_ROD
+};
+
+u8 ChooseWildMonIndex_Fishing(u8 rod)
+{
+ u8 wildMonIndex = 0;
+ u8 rand = Random() % 100;
+
+ switch (rod)
+ {
+ case OLD_ROD:
+ if (rand < 70) // 70% chance
+ wildMonIndex = 0;
+ else // 30% chance
+ wildMonIndex = 1;
+ break;
+ case GOOD_ROD:
+ if (rand < 60) // 60% chance
+ wildMonIndex = 2;
+ if (rand >= 60 && rand < 80) // 20% chance
+ wildMonIndex = 3;
+ if (rand >= 80 && rand < 100) // 20% chance
+ wildMonIndex = 4;
+ break;
+ case SUPER_ROD:
+ if (rand < 40) // 40% chance
+ wildMonIndex = 5;
+ if (rand >= 40 && rand < 80) // 40% chance
+ wildMonIndex = 6;
+ if (rand >= 80 && rand < 95) // 15% chance
+ wildMonIndex = 7;
+ if (rand >= 95 && rand < 99) // 4% chance
+ wildMonIndex = 8;
+ if (rand == 99) // 1% chance
+ wildMonIndex = 9;
+ break;
+ }
+ return wildMonIndex;
+}
+
+u8 ChooseWildMonLevel(const 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;
+
+ // check ability for max level mon
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ {
+ u8 ability = GetMonAbility(&gPlayerParty[0]);
+ if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)
+ {
+ if (Random() % 2 == 0)
+ return max;
+
+ if (rand != 0)
+ rand--;
+ }
+ }
+
+ return min + rand;
+}
+
+u16 GetCurrentMapWildMonHeaderId(void)
+{
+ u16 i;
+
+ for (i = 0; ; i++)
+ {
+ const struct WildPokemonHeader *wildHeader = &gWildMonHeaders[i];
+ if (wildHeader->mapGroup == 0xFF)
+ break;
+
+ if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup &&
+ gWildMonHeaders[i].mapNum == gSaveBlock1Ptr->location.mapNum)
+ {
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ALTERING_CAVE &&
+ gSaveBlock1Ptr->location.mapNum == MAP_ID_ALTERING_CAVE)
+ {
+ u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET);
+ if (alteringCaveId > 8)
+ alteringCaveId = 0;
+
+ i += alteringCaveId;
+ }
+
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+u8 PickWildMonNature(void)
+{
+ u8 i;
+ u8 j;
+ struct Pokeblock *safariPokeblock;
+ u8 natures[25];
+
+ if (GetSafariZoneFlag() == TRUE && Random() % 100 < 80)
+ {
+ safariPokeblock = SafariZoneGetActivePokeblock();
+ if (safariPokeblock != NULL)
+ {
+ for (i = 0; i < 25; i++)
+ natures[i] = i;
+ for (i = 0; i < 24; i++)
+ {
+ for (j = i + 1; j < 25; j++)
+ {
+ if (Random() & 1)
+ {
+ u8 temp = natures[i];
+
+ natures[i] = natures[j];
+ natures[j] = temp;
+ }
+ }
+ }
+ for (i = 0; i < 25; i++)
+ {
+ if (PokeblockGetGain(natures[i], safariPokeblock) > 0)
+ return natures[i];
+ }
+ }
+ }
+ // check synchronize for a pokemon with the same ability
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)
+ && GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE
+ && Random() % 2 == 0)
+ {
+ return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % 25;
+ }
+
+ // random nature
+ return Random() % 25;
+}
+
+void CreateWildMon(u16 species, u8 level)
+{
+ bool32 checkCuteCharm;
+
+ ZeroEnemyPartyMons();
+ checkCuteCharm = TRUE;
+
+ switch (gBaseStats[species].genderRatio)
+ {
+ case MON_MALE:
+ case MON_FEMALE:
+ case MON_GENDERLESS:
+ checkCuteCharm = FALSE;
+ break;
+ }
+
+ if (checkCuteCharm
+ && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)
+ && GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM
+ && Random() % 3 != 0)
+ {
+ u16 leadingMonSpecies = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES);
+ u32 leadingMonPersonality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY);
+ u8 gender = GetGenderFromSpeciesAndPersonality(leadingMonSpecies, leadingMonPersonality);
+
+ // misses mon is genderless check, although no genderless mon can have cute charm as ability
+ if (gender == MON_FEMALE)
+ gender = MON_MALE;
+ else
+ gender = MON_FEMALE;
+
+ CreateMonWithGenderNatureLetter(&gEnemyParty[0], species, level, 32, gender, PickWildMonNature(), 0);
+ return;
+ }
+
+ CreateMonWithNature(&gEnemyParty[0], species, level, 32, PickWildMonNature());
+}
+
+enum
+{
+ WILD_AREA_LAND,
+ WILD_AREA_WATER,
+ WILD_AREA_ROCKS,
+ WILD_AREA_FISHING,
+};
+
+#define WILD_CHECK_REPEL 0x1
+#define WILD_CHECK_KEEN_EYE 0x2
+
+bool8 TryGenerateWildMon(struct WildPokemonInfo *wildMonInfo, u8 area, u8 flags)
+{
+ u8 wildMonIndex = 0;
+ u8 level;
+
+ switch (area)
+ {
+ case WILD_AREA_LAND:
+ if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex))
+ break;
+ if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex))
+ break;
+
+ wildMonIndex = ChooseWildMonIndex_Land();
+ break;
+ case WILD_AREA_WATER:
+ if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex))
+ break;
+
+ wildMonIndex = ChooseWildMonIndex_WaterRock();
+ break;
+ case WILD_AREA_ROCKS:
+ wildMonIndex = ChooseWildMonIndex_WaterRock();
+ break;
+ }
+
+ level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
+ if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level))
+ return FALSE;
+ if (gMapHeader.mapDataId != 0x166 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level))
+ return FALSE;
+
+ CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level);
+ return TRUE;
+}
+
+u16 GenerateFishingWildMon(struct WildPokemonInfo *wildMonInfo, u8 rod)
+{
+ u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod);
+ u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
+
+ CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level);
+ return wildMonInfo->wildPokemon[wildMonIndex].species;
+}
+
+bool8 SetUpMassOutbreakEncounter(u8 flags)
+{
+ u16 i;
+
+ if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(gSaveBlock1Ptr->outbreakPokemonLevel))
+ return FALSE;
+
+ CreateWildMon(gSaveBlock1Ptr->outbreakPokemonSpecies, gSaveBlock1Ptr->outbreakPokemonLevel);
+ for (i = 0; i < 4; i++)
+ SetMonMoveSlot(&gEnemyParty[0], gSaveBlock1Ptr->outbreakPokemonMoves[i], i);
+
+ return TRUE;
+}
+
+bool8 DoMassOutbreakEncounterTest(void)
+{
+ if (gSaveBlock1Ptr->outbreakPokemonSpecies != 0
+ && gSaveBlock1Ptr->location.mapNum == gSaveBlock1Ptr->outbreakLocationMapNum
+ && gSaveBlock1Ptr->location.mapGroup == gSaveBlock1Ptr->outbreakLocationMapGroup)
+ {
+ if (Random() % 100 < gSaveBlock1Ptr->outbreakPokemonProbability)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 DoWildEncounterRateDiceRoll(u16 encounterRate)
+{
+ if (Random() % 2880 < encounterRate)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility)
+{
+ encounterRate *= 16;
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ encounterRate = encounterRate * 80 / 100;
+ ApplyFluteEncounterRateMod(&encounterRate);
+ ApplyCleanseTagEncounterRateMod(&encounterRate);
+ if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
+ {
+ u32 ability = GetMonAbility(&gPlayerParty[0]);
+
+ if (ability == ABILITY_STENCH && gMapHeader.mapDataId == 0x169)
+ encounterRate = encounterRate * 3 / 4;
+ else if (ability == ABILITY_STENCH)
+ encounterRate /= 2;
+ else if (ability == ABILITY_ILLUMINATE)
+ encounterRate *= 2;
+ else if (ability == ABILITY_WHITE_SMOKE)
+ encounterRate /= 2;
+ else if (ability == ABILITY_ARENA_TRAP)
+ encounterRate *= 2;
+ else if (ability == ABILITY_SAND_VEIL && gSaveBlock1Ptr->weather == 8)
+ encounterRate /= 2;
+ }
+ if (encounterRate > 2880)
+ encounterRate = 2880;
+ return DoWildEncounterRateDiceRoll(encounterRate);
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 7f835af30..b96ece7eb 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -789,11 +789,7 @@ gUnknown_02038BF9: @ 2038BF9
gUnknown_02038BFC: @ 2038BFC
.space 0x4
-gUnknown_02038C00: @ 2038C00
- .space 0x4
-
-gUnknown_02038C04: @ 2038C04
- .space 0x4
+ .include "src/wild_encounter.o"
gFieldEffectArguments: @ 2038C08
.space 0x20