summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/wild_encounter.s778
-rw-r--r--data/data_835B488.s10
-rw-r--r--include/wild_encounter.h2
-rw-r--r--ld_script.txt2
-rw-r--r--src/wild_encounter.c301
5 files changed, 319 insertions, 774 deletions
diff --git a/asm/wild_encounter.s b/asm/wild_encounter.s
index 86e3d964f..9a0749cd9 100644
--- a/asm/wild_encounter.s
+++ b/asm/wild_encounter.s
@@ -5,772 +5,6 @@
.text
- thumb_func_start sub_8082740
-sub_8082740: @ 8082740
- ldr r1, _08082748 @ =gUnknown_20386DC
- strb r0, [r1]
- bx lr
- .align 2, 0
-_08082748: .4byte gUnknown_20386DC
- thumb_func_end sub_8082740
-
- thumb_func_start ChooseWildMonIndex_Land
-ChooseWildMonIndex_Land: @ 808274C
- 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 _08082768
- movs r0, 0
- b _08082802
-_08082768:
- adds r0, r1, 0
- subs r0, 0x14
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x13
- bhi _08082778
- movs r0, 0x1
- b _08082802
-_08082778:
- adds r0, r1, 0
- subs r0, 0x28
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _08082788
- movs r0, 0x2
- b _08082802
-_08082788:
- adds r0, r1, 0
- subs r0, 0x32
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _08082798
- movs r0, 0x3
- b _08082802
-_08082798:
- adds r0, r1, 0
- subs r0, 0x3C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _080827A8
- movs r0, 0x4
- b _08082802
-_080827A8:
- adds r0, r1, 0
- subs r0, 0x46
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x9
- bhi _080827B8
- movs r0, 0x5
- b _08082802
-_080827B8:
- adds r0, r1, 0
- subs r0, 0x50
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x4
- bhi _080827C8
- movs r0, 0x6
- b _08082802
-_080827C8:
- adds r0, r1, 0
- subs r0, 0x55
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x4
- bhi _080827D8
- movs r0, 0x7
- b _08082802
-_080827D8:
- adds r0, r1, 0
- subs r0, 0x5A
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080827E8
- movs r0, 0x8
- b _08082802
-_080827E8:
- adds r0, r1, 0
- subs r0, 0x5E
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080827F8
- movs r0, 0x9
- b _08082802
-_080827F8:
- cmp r1, 0x62
- beq _08082800
- movs r0, 0xB
- b _08082802
-_08082800:
- movs r0, 0xA
-_08082802:
- pop {r1}
- bx r1
- thumb_func_end ChooseWildMonIndex_Land
-
- thumb_func_start ChooseWildMonIndex_WaterRock
-ChooseWildMonIndex_WaterRock: @ 8082808
- 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 _08082826
- movs r0, 0
- b _08082858
-_08082826:
- adds r0, r1, 0
- subs r0, 0x3C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1D
- bhi _08082836
- movs r0, 0x1
- b _08082858
-_08082836:
- adds r0, r1, 0
- subs r0, 0x5A
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x4
- bhi _08082846
- movs r0, 0x2
- b _08082858
-_08082846:
- adds r0, r2, 0
- subs r0, 0x5F
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bls _08082856
- movs r0, 0x4
- b _08082858
-_08082856:
- movs r0, 0x3
-_08082858:
- pop {r1}
- bx r1
- thumb_func_end ChooseWildMonIndex_WaterRock
-
- thumb_func_start ChooseWildMonIndex_Fishing
-ChooseWildMonIndex_Fishing: @ 808285C
- 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 _08082896
- cmp r4, 0x1
- bgt _08082886
- cmp r4, 0
- beq _0808288C
- b _080828F0
-_08082886:
- cmp r6, 0x2
- beq _080828BA
- b _080828F0
-_0808288C:
- movs r5, 0x1
- cmp r1, 0x45
- bhi _080828F0
- movs r5, 0
- b _080828F0
-_08082896:
- cmp r1, 0x3B
- bhi _0808289C
- movs r5, 0x2
-_0808289C:
- adds r0, r1, 0
- subs r0, 0x3C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x13
- bhi _080828AA
- movs r5, 0x3
-_080828AA:
- adds r0, r1, 0
- subs r0, 0x50
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x13
- bhi _080828F0
- movs r5, 0x4
- b _080828F0
-_080828BA:
- cmp r1, 0x27
- bhi _080828C0
- movs r5, 0x5
-_080828C0:
- adds r0, r1, 0
- subs r0, 0x28
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x27
- bhi _080828CE
- movs r5, 0x6
-_080828CE:
- adds r0, r1, 0
- subs r0, 0x50
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0xE
- bhi _080828DC
- movs r5, 0x7
-_080828DC:
- adds r0, r1, 0
- subs r0, 0x5F
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x3
- bhi _080828EA
- movs r5, 0x8
-_080828EA:
- cmp r1, 0x63
- bne _080828F0
- movs r5, 0x9
-_080828F0:
- adds r0, r5, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end ChooseWildMonIndex_Fishing
-
- thumb_func_start ChooseWildMonLevel
-ChooseWildMonLevel: @ 80828F8
- push {r4,r5,lr}
- adds r4, r0, 0
- ldrb r0, [r4, 0x1]
- ldrb r1, [r4]
- cmp r0, r1
- bcc _08082908
- ldrb r5, [r4]
- b _0808290C
-_08082908:
- ldrb r5, [r4, 0x1]
- ldrb r0, [r4]
-_0808290C:
- 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 ChooseWildMonLevel
-
- thumb_func_start sub_8082934
-sub_8082934: @ 8082934
- push {r4-r6,lr}
- movs r4, 0
- ldr r0, _08082990 @ =gWildMonHeaders
- ldrb r1, [r0]
- adds r5, r0, 0
- cmp r1, 0xFF
- beq _080829B4
- ldr r6, _08082994 @ =0x00007a01
-_08082944:
- lsls r0, r4, 2
- adds r0, r4
- lsls r0, 2
- adds r3, r0, r5
- ldrb r1, [r3]
- ldr r0, _08082998 @ =gSaveBlock1Ptr
- ldr r2, [r0]
- movs r0, 0x4
- ldrsb r0, [r2, r0]
- cmp r1, r0
- bne _080829A0
- ldrb r1, [r3, 0x1]
- movs r0, 0x5
- ldrsb r0, [r2, r0]
- cmp r1, r0
- bne _080829A0
- ldrh r0, [r2, 0x4]
- cmp r0, r6
- bne _08082980
- ldr r0, _0808299C @ =0x00004024
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x8
- bls _0808297A
- movs r0, 0
-_0808297A:
- adds r0, r4, r0
- lsls r0, 16
- lsrs r4, r0, 16
-_08082980:
- bl sub_80829C0
- lsls r0, 24
- cmp r0, 0
- beq _080829B4
- adds r0, r4, 0
- b _080829B6
- .align 2, 0
-_08082990: .4byte gWildMonHeaders
-_08082994: .4byte 0x00007a01
-_08082998: .4byte gSaveBlock1Ptr
-_0808299C: .4byte 0x00004024
-_080829A0:
- 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 _08082944
-_080829B4:
- ldr r0, _080829BC @ =0x0000ffff
-_080829B6:
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_080829BC: .4byte 0x0000ffff
- thumb_func_end sub_8082934
-
- thumb_func_start sub_80829C0
-sub_80829C0: @ 80829C0
- push {lr}
- ldr r0, _080829EC @ =0x00000849
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- bne _080829F4
- ldr r0, _080829F0 @ =gSaveBlock1Ptr
- ldr r1, [r0]
- movs r0, 0x4
- ldrsb r0, [r1, r0]
- cmp r0, 0x2
- bne _080829F4
- ldrb r0, [r1, 0x5]
- subs r0, 0x1B
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x6
- bhi _080829F4
- movs r0, 0
- b _080829F6
- .align 2, 0
-_080829EC: .4byte 0x00000849
-_080829F0: .4byte gSaveBlock1Ptr
-_080829F4:
- movs r0, 0x1
-_080829F6:
- pop {r1}
- bx r1
- thumb_func_end sub_80829C0
-
- thumb_func_start sub_80829FC
-sub_80829FC: @ 80829FC
- push {r4-r6,lr}
- sub sp, 0x10
- lsls r0, 16
- lsrs r4, r0, 16
- lsls r1, 24
- lsrs r6, r1, 24
- lsls r2, 24
- lsrs r5, r2, 24
- bl ZeroEnemyPartyMons
- cmp r4, 0xC9
- beq _08082A3C
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x19
- bl __umodsi3
- lsls r0, 24
- lsrs r0, 24
- ldr r1, _08082A38 @ =gEnemyParty
- str r0, [sp]
- adds r0, r1, 0
- adds r1, r4, 0
- adds r2, r6, 0
- movs r3, 0x20
- bl CreateMonWithNature
- b _08082A74
- .align 2, 0
-_08082A38: .4byte gEnemyParty
-_08082A3C:
- ldr r0, _08082A7C @ =gSaveBlock1Ptr
- ldr r0, [r0]
- ldrb r1, [r0, 0x5]
- subs r1, 0x1B
- ldr r2, _08082A80 @ =gUnknown_83CA71C
- lsls r1, 24
- asrs r1, 24
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 2
- adds r0, r5, r0
- adds r0, r2
- ldrb r0, [r0]
- bl sub_8082A88
- ldr r2, _08082A84 @ =gEnemyParty
- movs r1, 0x1
- str r1, [sp]
- str r0, [sp, 0x4]
- movs r0, 0
- str r0, [sp, 0x8]
- str r0, [sp, 0xC]
- adds r0, r2, 0
- movs r1, 0xC9
- adds r2, r6, 0
- movs r3, 0x20
- bl CreateMon
-_08082A74:
- add sp, 0x10
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_08082A7C: .4byte gSaveBlock1Ptr
-_08082A80: .4byte gUnknown_83CA71C
-_08082A84: .4byte gEnemyParty
- thumb_func_end sub_80829FC
-
- thumb_func_start sub_8082A88
-sub_8082A88: @ 8082A88
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r5, r0, 24
-_08082A8E:
- bl Random
- adds r4, r0, 0
- bl Random
- lsls r4, 16
- lsls r0, 16
- lsrs r0, 16
- orrs r4, r0
- adds r0, r4, 0
- bl GetUnownLetterByPersonalityLoByte
- lsls r0, 24
- lsrs r0, 24
- cmp r0, r5
- bne _08082A8E
- adds r0, r4, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8082A88
-
- thumb_func_start GetUnownLetterByPersonalityLoByte
-GetUnownLetterByPersonalityLoByte: @ 8082AB8
- push {lr}
- adds r2, r0, 0
- movs r0, 0xC0
- lsls r0, 18
- ands r0, r2
- lsrs r0, 18
- movs r1, 0xC0
- lsls r1, 10
- ands r1, r2
- lsrs r1, 12
- orrs r0, r1
- movs r1, 0xC0
- lsls r1, 2
- ands r1, r2
- lsrs r1, 6
- orrs r0, r1
- movs r1, 0x3
- ands r1, r2
- orrs r0, r1
- movs r1, 0x1C
- bl __umodsi3
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end GetUnownLetterByPersonalityLoByte
-
- thumb_func_start sub_8082AEC
-sub_8082AEC: @ 8082AEC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r7, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r1, 0
- lsls r2, 24
- lsrs r2, 24
- mov r8, r2
- movs r6, 0
- cmp r1, 0x1
- beq _08082B1C
- cmp r1, 0x1
- bgt _08082B10
- cmp r1, 0
- beq _08082B16
- b _08082B24
-_08082B10:
- cmp r0, 0x2
- beq _08082B1C
- b _08082B24
-_08082B16:
- bl ChooseWildMonIndex_Land
- b _08082B20
-_08082B1C:
- bl ChooseWildMonIndex_WaterRock
-_08082B20:
- lsls r0, 24
- lsrs r6, r0, 24
-_08082B24:
- lsls r4, r6, 2
- ldr r0, [r7, 0x4]
- adds r0, r4
- bl ChooseWildMonLevel
- lsls r0, 24
- lsrs r5, r0, 24
- mov r0, r8
- cmp r0, 0x1
- bne _08082B48
- adds r0, r5, 0
- bl sub_808310C
- lsls r0, 24
- cmp r0, 0
- bne _08082B48
- movs r0, 0
- b _08082B58
-_08082B48:
- ldr r0, [r7, 0x4]
- adds r0, r4, r0
- ldrh r0, [r0, 0x2]
- adds r1, r5, 0
- adds r2, r6, 0
- bl sub_80829FC
- movs r0, 0x1
-_08082B58:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_8082AEC
-
- thumb_func_start sub_8082B64
-sub_8082B64: @ 8082B64
- push {r4-r6,lr}
- adds r6, r0, 0
- lsls r0, r1, 24
- lsrs r0, 24
- bl ChooseWildMonIndex_Fishing
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- lsls r5, r4, 2
- ldr r0, [r6, 0x4]
- adds r0, r5
- bl ChooseWildMonLevel
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- ldr r0, [r6, 0x4]
- adds r0, r5, r0
- ldrh r0, [r0, 0x2]
- adds r2, r4, 0
- bl sub_80829FC
- ldr r0, [r6, 0x4]
- adds r5, r0
- ldrh r0, [r5, 0x2]
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_8082B64
-
- thumb_func_start sub_8082BA0
-sub_8082BA0: @ 8082BA0
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- bl sub_808322C
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0xC8
- lsls r1, 3
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- cmp r0, r4
- bcc _08082BC4
- movs r0, 0
- b _08082BC6
-_08082BC4:
- movs r0, 0x1
-_08082BC6:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_8082BA0
-
- thumb_func_start sub_8082BCC
-sub_8082BCC: @ 8082BCC
- push {r4,r5,lr}
- sub sp, 0x4
- str r0, [sp]
- lsls r1, 24
- lsrs r5, r1, 24
- lsls r0, 4
- str r0, [sp]
- movs r0, 0x6
- bl TestPlayerAvatarFlags
- lsls r0, 24
- cmp r0, 0
- beq _08082BF6
- ldr r1, [sp]
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 4
- movs r1, 0x64
- bl __udivsi3
- str r0, [sp]
-_08082BF6:
- ldr r4, _08082C24 @ =gUnknown_20386D0
- ldrh r0, [r4, 0x6]
- lsls r0, 4
- movs r1, 0xC8
- bl __divsi3
- ldr r1, [sp]
- adds r1, r0
- str r1, [sp]
- mov r0, sp
- bl sub_8083174
- mov r0, sp
- bl sub_80831D8
- cmp r5, 0
- bne _08082C34
- ldrb r0, [r4, 0x9]
- cmp r0, 0x1
- beq _08082C28
- cmp r0, 0x2
- beq _08082C2E
- b _08082C34
- .align 2, 0
-_08082C24: .4byte gUnknown_20386D0
-_08082C28:
- ldr r0, [sp]
- lsrs r0, 1
- b _08082C32
-_08082C2E:
- ldr r0, [sp]
- lsls r0, 1
-_08082C32:
- str r0, [sp]
-_08082C34:
- ldr r0, [sp]
- movs r1, 0xC8
- lsls r1, 3
- cmp r0, r1
- bls _08082C40
- str r1, [sp]
-_08082C40:
- ldr r0, [sp]
- lsls r0, 16
- lsrs r0, 16
- bl sub_8082BA0
- lsls r0, 24
- lsrs r0, 24
- add sp, 0x4
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_8082BCC
-
- thumb_func_start sub_8082C58
-sub_8082C58: @ 8082C58
- push {r4,r5,lr}
- ldr r5, _08082C90 @ =gUnknown_20386D0
- movs r0, 0
- strb r0, [r5, 0x9]
- ldr r4, _08082C94 @ =gPlayerParty
- adds r0, r4, 0
- movs r1, 0x6
- bl GetMonData
- cmp r0, 0
- bne _08082C84
- adds r0, r4, 0
- bl GetMonAbility
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _08082C82
- cmp r0, 0x23
- bne _08082C84
- movs r0, 0x2
-_08082C82:
- strb r0, [r5, 0x9]
-_08082C84:
- ldr r0, _08082C90 @ =gUnknown_20386D0
- ldrb r0, [r0, 0x9]
- pop {r4,r5}
- pop {r1}
- bx r1
- .align 2, 0
-_08082C90: .4byte gUnknown_20386D0
-_08082C94: .4byte gPlayerParty
- thumb_func_end sub_8082C58
-
- thumb_func_start sub_8082C98
-sub_8082C98: @ 8082C98
- 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 _08082CB4
- movs r0, 0x1
- b _08082CB6
-_08082CB4:
- movs r0, 0
-_08082CB6:
- pop {r1}
- bx r1
- thumb_func_end sub_8082C98
-
thumb_func_start sub_8082CBC
sub_8082CBC: @ 8082CBC
push {r4-r7,lr}
@@ -1372,8 +606,8 @@ _0808316C:
bx r1
thumb_func_end sub_808310C
- thumb_func_start sub_8083174
-sub_8083174: @ 8083174
+ thumb_func_start ApplyFluteEncounterRateMod
+ApplyFluteEncounterRateMod: @ 8083174
push {r4,lr}
adds r4, r0, 0
bl sub_80831A0
@@ -1398,7 +632,7 @@ _08083198:
pop {r4}
pop {r0}
bx r0
- thumb_func_end sub_8083174
+ thumb_func_end ApplyFluteEncounterRateMod
thumb_func_start sub_80831A0
sub_80831A0: @ 80831A0
@@ -1431,8 +665,8 @@ _080831D2:
bx r1
thumb_func_end sub_80831A0
- thumb_func_start sub_80831D8
-sub_80831D8: @ 80831D8
+ thumb_func_start ApplyCleanseTagEncounterRateMod
+ApplyCleanseTagEncounterRateMod: @ 80831D8
push {r4,lr}
adds r4, r0, 0
bl sub_80831F8
@@ -1448,7 +682,7 @@ _080831F2:
pop {r4}
pop {r0}
bx r0
- thumb_func_end sub_80831D8
+ thumb_func_end ApplyCleanseTagEncounterRateMod
thumb_func_start sub_80831F8
sub_80831F8: @ 80831F8
diff --git a/data/data_835B488.s b/data/data_835B488.s
index 47b609caa..8beeeaf7c 100644
--- a/data/data_835B488.s
+++ b/data/data_835B488.s
@@ -9,7 +9,15 @@
.include "data/wild_encounters.inc"
gUnknown_83CA71C:: @ 83CA71C
- .incbin "baserom.gba", 0x3CA71C, 0xED4
+ .byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27
+ .byte 2, 2, 2, 3, 3, 3, 7, 7, 7, 20, 20, 14
+ .byte 13, 13, 13, 13, 18, 18, 18, 18, 8, 8, 4, 4
+ .byte 15, 15, 11, 11, 9, 9, 17, 17, 17, 16, 16, 16
+ .byte 24, 24, 19, 19, 6, 6, 6, 5, 5, 5, 10, 10
+ .byte 21, 21, 21, 22, 22, 22, 23, 23, 12, 12, 1, 1
+ .byte 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26
+
+ .incbin "baserom.gba", 0x3CA770, 0xE80
gUnknown_83CB5F0:: @ 83CB5F0
.incbin "baserom.gba", 0x3CB5F0, 0x200
diff --git a/include/wild_encounter.h b/include/wild_encounter.h
index 5bcab1249..6dbde30af 100644
--- a/include/wild_encounter.h
+++ b/include/wild_encounter.h
@@ -42,7 +42,7 @@ void FishingWildEncounter(u8 rod);
u16 GetLocalWildMon(bool8 *isWaterMon);
u16 GetLocalWaterMon(void);
bool8 UpdateRepelCounter(void);
-void sub_8082740(u8);
+void sub_8082740(bool8 state);
u8 GetUnownLetterByPersonalityLoByte(u32 personality);
bool8 SweetScentWildEncounter(void);
void sub_8083214(u16 randVal);
diff --git a/ld_script.txt b/ld_script.txt
index 6893d0666..5a1787878 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -125,6 +125,7 @@ SECTIONS {
src/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);
src/scanline_effect.o(.text);
@@ -430,6 +431,7 @@ SECTIONS {
src/battle_setup.o(.rodata);
data/cable_club.o(.rodata);
data/trainer_see.o(.rodata);
+ src/wild_encounter.o(.rodata);
data/data_835B488.o(.rodata);
src/pokemon_icon.o(.rodata);
data/data_835B488.o(.rodata.83D4100);
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
new file mode 100644
index 000000000..d6d115348
--- /dev/null
+++ b/src/wild_encounter.c
@@ -0,0 +1,301 @@
+#include "global.h"
+#include "random.h"
+#include "wild_encounter.h"
+#include "event_data.h"
+#include "field_player_avatar.h"
+#include "constants/species.h"
+#include "constants/maps.h"
+#include "constants/vars.h"
+#include "constants/abilities.h"
+
+struct UnkStruct_20386D0
+{
+ u8 filler_0[6];
+ u16 unk_6;
+ u8 unk_8;
+ u8 unk_9;
+};
+
+EWRAM_DATA struct UnkStruct_20386D0 gUnknown_20386D0 = {};
+EWRAM_DATA bool8 gUnknown_20386DC = FALSE;
+
+extern const u8 gUnknown_83CA71C[][12];
+
+bool8 UnlockedTanobyOrAreNotInTanoby(void);
+u32 GenerateUnownPersonalityByLetter(u8 letter);
+bool8 sub_808310C(u8 level);
+u16 sub_808322C(void);
+void ApplyFluteEncounterRateMod(u32 *rate);
+void ApplyCleanseTagEncounterRateMod(u32 *rate);
+
+void sub_8082740(bool8 state)
+{
+ gUnknown_20386DC = state;
+}
+
+u8 ChooseWildMonIndex_Land(void)
+{
+ u8 pct = Random() % 100;
+ if (pct < 20)
+ return 0;
+ if (pct >= 20 && pct < 40)
+ return 1;
+ if (pct >= 40 && pct < 50)
+ return 2;
+ if (pct >= 50 && pct < 60)
+ return 3;
+ if (pct >= 60 && pct < 70)
+ return 4;
+ if (pct >= 70 && pct < 80)
+ return 5;
+ if (pct >= 80 && pct < 85)
+ return 6;
+ if (pct >= 85 && pct < 90)
+ return 7;
+ if (pct >= 90 && pct < 94)
+ return 8;
+ if (pct >= 94 && pct < 98)
+ return 9;
+ if (pct == 98)
+ return 10;
+ return 11;
+}
+
+u8 ChooseWildMonIndex_WaterRock(void)
+{
+ u8 pct = Random() % 100;
+ if (pct < 60)
+ return 0;
+ if (pct >= 60 && pct < 90)
+ return 1;
+ if (pct >= 90 && pct < 95)
+ return 2;
+ if (pct >= 95 && pct < 99)
+ return 3;
+ return 4;
+}
+
+u8 ChooseWildMonIndex_Fishing(u8 rod)
+{
+ u8 slot = 0;
+ u8 pct = Random() % 100;
+ switch (rod)
+ {
+ case 0: // old
+ if (pct < 70)
+ slot = 0;
+ else
+ slot = 1;
+ break;
+ case 1:
+ if (pct < 60)
+ slot = 2;
+ if (pct >= 60 && pct < 80)
+ slot = 3;
+ if (pct >= 80 && pct < 100)
+ slot = 4;
+ break;
+ case 2:
+ if (pct < 40)
+ slot = 5;
+ if (pct >= 40 && pct < 80)
+ slot = 6;
+ if (pct >= 80 && pct < 95)
+ slot = 7;
+ if (pct >= 95 && pct < 99)
+ slot = 8;
+ if (pct == 99)
+ slot = 9;
+ break;
+ }
+ return slot;
+}
+
+u8 ChooseWildMonLevel(const struct WildPokemon * info)
+{
+ u8 lo;
+ u8 hi;
+ u8 mod;
+ u8 res;
+ if (info->maxLevel >= info->minLevel)
+ {
+ lo = info->minLevel;
+ hi = info->maxLevel;
+ }
+ else
+ {
+ lo = info->maxLevel;
+ hi = info->minLevel;
+ }
+ mod = hi - lo + 1;
+ res = Random() % mod;
+ return lo + res;
+}
+
+u16 sub_8082934(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(SIX_ISLAND_ALTERING_CAVE) &&
+ gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_ALTERING_CAVE))
+ {
+ u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET);
+ if (alteringCaveId > 8)
+ alteringCaveId = 0;
+
+ i += alteringCaveId;
+ }
+
+ if (!UnlockedTanobyOrAreNotInTanoby())
+ break;
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+bool8 UnlockedTanobyOrAreNotInTanoby(void)
+{
+ if (FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS))
+ return TRUE;
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER))
+ return TRUE;
+ if (!(gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_LIPTOO_CHAMBER)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_WEEPTH_CHAMBER)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_DILFORD_CHAMBER)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_SCUFIB_CHAMBER)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_RIXY_CHAMBER)
+ || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_VIAPOIS_CHAMBER)
+ ))
+ return TRUE;
+ return FALSE;
+}
+
+void GenerateWildMon(u16 species, u8 level, u8 slot)
+{
+ u32 personality;
+ s8 chamber;
+ ZeroEnemyPartyMons();
+ if (species != SPECIES_UNOWN)
+ {
+ CreateMonWithNature(&gEnemyParty[0], species, level, 32, Random() % 25);
+ }
+ else
+ {
+ chamber = gSaveBlock1Ptr->location.mapNum - MAP_NUM(SEVEN_ISLAND_TANOBY_RUINS_MONEAN_CHAMBER);
+ personality = GenerateUnownPersonalityByLetter(gUnknown_83CA71C[chamber][slot]);
+ CreateMon(&gEnemyParty[0], species, level, 32, TRUE, personality, FALSE, 0);
+ }
+}
+
+u32 GenerateUnownPersonalityByLetter(u8 letter)
+{
+ u32 personality;
+ do
+ {
+ personality = (Random() << 16) | Random();
+ } while (GetUnownLetterByPersonalityLoByte(personality) != letter);
+ return personality;
+}
+
+u8 GetUnownLetterByPersonalityLoByte(u32 personality)
+{
+ return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;
+}
+
+bool8 sub_8082AEC(const struct WildPokemonInfo * info, u8 tableIdx, u8 a2)
+{
+ u8 slot = 0;
+ u8 level;
+ switch (tableIdx)
+ {
+ case 0:
+ slot = ChooseWildMonIndex_Land();
+ break;
+ case 1:
+ slot = ChooseWildMonIndex_WaterRock();
+ break;
+ case 2:
+ slot = ChooseWildMonIndex_WaterRock();
+ break;
+ }
+ level = ChooseWildMonLevel(&info->wildPokemon[slot]);
+ if (a2 == 1 && !sub_808310C(level))
+ {
+ return FALSE;
+ }
+ GenerateWildMon(info->wildPokemon[slot].species, level, slot);
+ return TRUE;
+}
+
+u16 sub_8082B64(const struct WildPokemonInfo * info, u8 rod)
+{
+ u8 slot = ChooseWildMonIndex_Fishing(rod);
+ u8 level = ChooseWildMonLevel(&info->wildPokemon[slot]);
+ GenerateWildMon(info->wildPokemon[slot].species, level, slot);
+ return info->wildPokemon[slot].species;
+}
+
+bool8 DoWildEncounterRateDiceRoll(u16 a0)
+{
+ if (sub_808322C() % 1600 < a0)
+ return TRUE;
+ return FALSE;
+}
+
+bool8 sub_8082BCC(u32 encounterRate, bool8 ignoreAbility)
+{
+ encounterRate *= 16;
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ encounterRate = encounterRate * 80 / 100;
+ encounterRate += gUnknown_20386D0.unk_6 * 16 / 200;
+ ApplyFluteEncounterRateMod(&encounterRate);
+ ApplyCleanseTagEncounterRateMod(&encounterRate);
+ if (!ignoreAbility)
+ {
+ switch (gUnknown_20386D0.unk_9)
+ {
+ case 1:
+ encounterRate /= 2;
+ break;
+ case 2:
+ encounterRate *= 2;
+ break;
+ }
+ }
+ if (encounterRate > 1600)
+ encounterRate = 1600;
+ return DoWildEncounterRateDiceRoll(encounterRate);
+}
+
+u8 sub_8082C58(void)
+{
+ gUnknown_20386D0.unk_9 = 0;
+ if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
+ {
+ u8 ability = GetMonAbility(&gPlayerParty[0]);
+ if (ability == ABILITY_STENCH)
+ gUnknown_20386D0.unk_9 = 1;
+ else if (ability == ABILITY_ILLUMINATE)
+ gUnknown_20386D0.unk_9 = 2;
+ }
+ return gUnknown_20386D0.unk_9;
+}
+
+bool8 sub_8082C98(void)
+{
+ if ((Random() % 100) >= 60)
+ return FALSE;
+ return TRUE;
+}