summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_control_avatar.s6
-rw-r--r--asm/field_player_avatar.s4
-rw-r--r--asm/wild_encounter.s1007
-rw-r--r--data/event_scripts.s4
-rw-r--r--data/specials.inc2
-rw-r--r--include/event_scripts.h2
-rw-r--r--include/fieldmap.h2
-rw-r--r--include/wild_encounter.h7
-rw-r--r--ld_script.txt1
-rw-r--r--src/new_game.c2
-rw-r--r--src/quest_log.c4
-rw-r--r--src/wild_encounter.c521
-rw-r--r--sym_ewram.txt8
13 files changed, 505 insertions, 1065 deletions
diff --git a/asm/field_control_avatar.s b/asm/field_control_avatar.s
index 46587dc52..dd84f75c1 100644
--- a/asm/field_control_avatar.s
+++ b/asm/field_control_avatar.s
@@ -1725,7 +1725,7 @@ sub_806D5E8: @ 806D5E8
lsls r0, 24
cmp r0, 0
bne _0806D658
- bl sub_80830B8
+ bl UpdateRepelCounter
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1
@@ -1956,7 +1956,7 @@ _0806D7E2:
thumb_func_start RestartWildEncounterImmunitySteps
RestartWildEncounterImmunitySteps: @ 806D7E8
push {lr}
- bl sub_80832D4
+ bl ResetEncounterRateModifiers
pop {r0}
bx r0
thumb_func_end RestartWildEncounterImmunitySteps
@@ -1964,7 +1964,7 @@ RestartWildEncounterImmunitySteps: @ 806D7E8
thumb_func_start is_it_battle_time_3
is_it_battle_time_3: @ 806D7F4
push {lr}
- bl sub_80833B0
+ bl TryStandardWildEncounter
lsls r0, 24
lsrs r0, 24
pop {r1}
diff --git a/asm/field_player_avatar.s b/asm/field_player_avatar.s
index 5e7f64670..f6b50bdc6 100644
--- a/asm/field_player_avatar.s
+++ b/asm/field_player_avatar.s
@@ -4481,7 +4481,7 @@ sub_805D508: @ 805D508
ldrh r0, [r4, 0x8]
adds r0, 0x1
strh r0, [r4, 0x8]
- bl sub_8082F78
+ bl DoesCurrentMapHaveFishingMons
lsls r0, 24
cmp r0, 0
beq _0805D53A
@@ -4791,7 +4791,7 @@ _0805D788:
ldrh r0, [r5, 0x26]
lsls r0, 24
lsrs r0, 24
- bl sub_8082FB0
+ bl FishingWildEncounter
ldr r0, _0805D7BC @ =sub_805D304
bl FindTaskIdByFunc
lsls r0, 24
diff --git a/asm/wild_encounter.s b/asm/wild_encounter.s
deleted file mode 100644
index 9a0749cd9..000000000
--- a/asm/wild_encounter.s
+++ /dev/null
@@ -1,1007 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_8082CBC
-sub_8082CBC: @ 8082CBC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r6, r0, 0
- lsls r1, 16
- lsrs r7, r1, 16
- mov r8, r7
- ldr r0, _08082D44 @ =gUnknown_20386DC
- ldrb r0, [r0]
- cmp r0, 0x1
- bne _08082CD4
- b _08082E46
-_08082CD4:
- bl sub_8082934
- lsls r0, 16
- lsrs r4, r0, 16
- ldr r0, _08082D48 @ =0x0000ffff
- cmp r4, r0
- bne _08082CE4
- b _08082E46
-_08082CE4:
- adds r0, r6, 0
- movs r1, 0x4
- bl sub_8058F1C
- cmp r0, 0x1
- bne _08082D78
- ldr r1, _08082D4C @ =gWildMonHeaders
- lsls r2, r4, 2
- adds r0, r2, r4
- lsls r0, 2
- adds r1, 0x4
- adds r0, r1
- ldr r0, [r0]
- adds r5, r2, 0
- cmp r0, 0
- bne _08082D06
- b _08082E46
-_08082D06:
- adds r0, r6, 0
- movs r1, 0
- bl sub_8058F1C
- cmp r7, r0
- beq _08082D1E
- bl sub_8082C98
- lsls r0, 24
- cmp r0, 0
- bne _08082D1E
- b _08082E46
-_08082D1E:
- ldr r1, _08082D4C @ =gWildMonHeaders
- adds r0, r5, r4
- lsls r0, 2
- adds r1, 0x4
- adds r4, r0, r1
- ldr r0, [r4]
- ldrb r0, [r0]
- movs r1, 0
- bl sub_8082BCC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _08082D50
-_08082D3A:
- ldr r0, [r4]
- ldrb r0, [r0]
- bl sub_8083410
- b _08082E46
- .align 2, 0
-_08082D44: .4byte gUnknown_20386DC
-_08082D48: .4byte 0x0000ffff
-_08082D4C: .4byte gWildMonHeaders
-_08082D50:
- bl TryStartRoamerEncounter
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _08082DFA
- ldr r4, [r4]
- adds r0, r4, 0
- movs r1, 0
- movs r2, 0x1
- bl sub_8082AEC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _08082E38
- ldrb r0, [r4]
- bl sub_8083410
- b _08082E46
-_08082D78:
- adds r0, r6, 0
- movs r1, 0x4
- bl sub_8058F1C
- cmp r0, 0x2
- beq _08082DA8
- movs r0, 0x8
- bl TestPlayerAvatarFlags
- lsls r0, 24
- cmp r0, 0
- beq _08082E46
- adds r0, r6, 0
- movs r1, 0
- bl sub_8058F1C
- lsls r0, 24
- lsrs r0, 24
- bl MetatileBehavior_IsBridge
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08082E46
-_08082DA8:
- ldr r1, _08082E18 @ =gWildMonHeaders
- lsls r2, r4, 2
- adds r0, r2, r4
- lsls r0, 2
- adds r1, 0x8
- adds r0, r1
- ldr r0, [r0]
- adds r5, r2, 0
- cmp r0, 0
- beq _08082E46
- adds r0, r6, 0
- movs r1, 0
- bl sub_8058F1C
- cmp r8, r0
- beq _08082DD2
- bl sub_8082C98
- lsls r0, 24
- cmp r0, 0
- beq _08082E46
-_08082DD2:
- ldr r1, _08082E18 @ =gWildMonHeaders
- adds r0, r5, r4
- lsls r0, 2
- adds r1, 0x8
- adds r4, r0, r1
- ldr r0, [r4]
- ldrb r0, [r0]
- movs r1, 0
- bl sub_8082BCC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08082D3A
- bl TryStartRoamerEncounter
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08082E24
-_08082DFA:
- ldr r0, _08082E1C @ =gSaveBlock1Ptr
- ldr r0, [r0]
- ldr r1, _08082E20 @ =0x000030d0
- adds r0, r1
- ldrb r0, [r0, 0xC]
- bl sub_808310C
- lsls r0, 24
- cmp r0, 0
- beq _08082E46
- bl BattleSetup_StartRoamerBattle
- movs r0, 0x1
- b _08082E48
- .align 2, 0
-_08082E18: .4byte gWildMonHeaders
-_08082E1C: .4byte gSaveBlock1Ptr
-_08082E20: .4byte 0x000030d0
-_08082E24:
- ldr r4, [r4]
- adds r0, r4, 0
- movs r1, 0x1
- movs r2, 0x1
- bl sub_8082AEC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08082E40
-_08082E38:
- bl BattleSetup_StartWildBattle
- movs r0, 0x1
- b _08082E48
-_08082E40:
- ldrb r0, [r4]
- bl sub_8083410
-_08082E46:
- movs r0, 0
-_08082E48:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_8082CBC
-
- thumb_func_start Special_RockSmashEncounter
-Special_RockSmashEncounter: @ 8082E54
- push {r4,lr}
- bl sub_8082934
- lsls r0, 16
- lsrs r2, r0, 16
- ldr r0, _08082EA4 @ =0x0000ffff
- cmp r2, r0
- beq _08082EB0
- ldr r1, _08082EA8 @ =gWildMonHeaders
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 2
- adds r1, 0xC
- adds r0, r1
- ldr r4, [r0]
- cmp r4, 0
- beq _08082E9C
- ldrb r0, [r4]
- movs r1, 0x1
- bl sub_8082BCC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08082EB0
- adds r0, r4, 0
- movs r1, 0x2
- movs r2, 0x1
- bl sub_8082AEC
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x1
- bne _08082EB0
- bl BattleSetup_StartWildBattle
-_08082E9C:
- ldr r0, _08082EAC @ =gSpecialVar_Result
- strh r4, [r0]
- b _08082EB6
- .align 2, 0
-_08082EA4: .4byte 0x0000ffff
-_08082EA8: .4byte gWildMonHeaders
-_08082EAC: .4byte gSpecialVar_Result
-_08082EB0:
- ldr r1, _08082EBC @ =gSpecialVar_Result
- movs r0, 0
- strh r0, [r1]
-_08082EB6:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08082EBC: .4byte gSpecialVar_Result
- thumb_func_end Special_RockSmashEncounter
-
- thumb_func_start SweetScentWildEncounter
-SweetScentWildEncounter: @ 8082EC0
- push {r4,r5,lr}
- sub sp, 0x4
- mov r4, sp
- adds r4, 0x2
- mov r0, sp
- adds r1, r4, 0
- bl PlayerGetDestCoords
- bl sub_8082934
- lsls r0, 16
- lsrs r5, r0, 16
- ldr r0, _08082F14 @ =0x0000ffff
- cmp r5, r0
- beq _08082F6C
- mov r0, sp
- movs r1, 0
- ldrsh r0, [r0, r1]
- movs r2, 0
- ldrsh r1, [r4, r2]
- movs r2, 0x4
- bl sub_8058F48
- cmp r0, 0x1
- bne _08082F1C
- bl TryStartRoamerEncounter
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _08082F3C
- ldr r1, _08082F18 @ =gWildMonHeaders
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 2
- adds r1, 0x4
- adds r0, r1
- ldr r0, [r0]
- cmp r0, 0
- beq _08082F6C
- movs r1, 0
- b _08082F58
- .align 2, 0
-_08082F14: .4byte 0x0000ffff
-_08082F18: .4byte gWildMonHeaders
-_08082F1C:
- mov r0, sp
- movs r1, 0
- ldrsh r0, [r0, r1]
- movs r2, 0
- ldrsh r1, [r4, r2]
- movs r2, 0x4
- bl sub_8058F48
- cmp r0, 0x2
- bne _08082F6C
- bl TryStartRoamerEncounter
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08082F44
-_08082F3C:
- bl BattleSetup_StartRoamerBattle
- movs r0, 0x1
- b _08082F6E
-_08082F44:
- ldr r1, _08082F68 @ =gWildMonHeaders
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 2
- adds r1, 0x8
- adds r0, r1
- ldr r0, [r0]
- cmp r0, 0
- beq _08082F6C
- movs r1, 0x1
-_08082F58:
- movs r2, 0
- bl sub_8082AEC
- bl BattleSetup_StartWildBattle
- movs r0, 0x1
- b _08082F6E
- .align 2, 0
-_08082F68: .4byte gWildMonHeaders
-_08082F6C:
- movs r0, 0
-_08082F6E:
- add sp, 0x4
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end SweetScentWildEncounter
-
- thumb_func_start sub_8082F78
-sub_8082F78: @ 8082F78
- push {lr}
- bl sub_8082934
- lsls r0, 16
- lsrs r2, r0, 16
- ldr r0, _08082FA0 @ =0x0000ffff
- cmp r2, r0
- beq _08082FA8
- ldr r0, _08082FA4 @ =gWildMonHeaders
- lsls r1, r2, 2
- adds r1, r2
- lsls r1, 2
- adds r0, 0x10
- adds r1, r0
- ldr r0, [r1]
- cmp r0, 0
- beq _08082FA8
- movs r0, 0x1
- b _08082FAA
- .align 2, 0
-_08082FA0: .4byte 0x0000ffff
-_08082FA4: .4byte gWildMonHeaders
-_08082FA8:
- movs r0, 0
-_08082FAA:
- pop {r1}
- bx r1
- thumb_func_end sub_8082F78
-
- thumb_func_start sub_8082FB0
-sub_8082FB0: @ 8082FB0
- push {r4,r5,lr}
- adds r5, r0, 0
- lsls r5, 24
- lsrs r5, 24
- ldr r4, _08082FE4 @ =gWildMonHeaders
- bl sub_8082934
- 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 sub_8082B64
- movs r0, 0xC
- bl IncrementGameStat
- bl BattleSetup_StartWildBattle
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08082FE4: .4byte gWildMonHeaders
- thumb_func_end sub_8082FB0
-
- thumb_func_start GetLocalWildMon
-GetLocalWildMon: @ 8082FE8
- push {r4-r6,lr}
- adds r6, r0, 0
- movs r0, 0
- strb r0, [r6]
- bl sub_8082934
- lsls r0, 16
- lsrs r3, r0, 16
- ldr r0, _08083020 @ =0x0000ffff
- cmp r3, r0
- beq _0808301A
- ldr r2, _08083024 @ =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 _08083028
- cmp r4, 0
- bne _0808302E
-_0808301A:
- movs r0, 0
- b _0808306E
- .align 2, 0
-_08083020: .4byte 0x0000ffff
-_08083024: .4byte gWildMonHeaders
-_08083028:
- cmp r4, 0
- bne _0808303C
- b _08083060
-_0808302E:
- movs r0, 0x1
- strb r0, [r6]
- bl ChooseWildMonIndex_WaterRock
- lsls r0, 24
- ldr r1, [r4, 0x4]
- b _08083068
-_0808303C:
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x64
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x4F
- bls _08083060
- movs r0, 0x1
- strb r0, [r6]
- bl ChooseWildMonIndex_WaterRock
- lsls r0, 24
- ldr r1, [r4, 0x4]
- b _08083068
-_08083060:
- bl ChooseWildMonIndex_Land
- lsls r0, 24
- ldr r1, [r5, 0x4]
-_08083068:
- lsrs r0, 22
- adds r0, r1
- ldrh r0, [r0, 0x2]
-_0808306E:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end GetLocalWildMon
-
- thumb_func_start GetLocalWaterMon
-GetLocalWaterMon: @ 8083074
- push {r4,lr}
- bl sub_8082934
- lsls r0, 16
- lsrs r2, r0, 16
- ldr r0, _080830A8 @ =0x0000ffff
- cmp r2, r0
- beq _080830B0
- ldr r1, _080830AC @ =gWildMonHeaders
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 2
- adds r1, 0x8
- adds r0, r1
- ldr r4, [r0]
- cmp r4, 0
- beq _080830B0
- bl ChooseWildMonIndex_WaterRock
- lsls r0, 24
- ldr r1, [r4, 0x4]
- lsrs r0, 22
- adds r0, r1
- ldrh r0, [r0, 0x2]
- b _080830B2
- .align 2, 0
-_080830A8: .4byte 0x0000ffff
-_080830AC: .4byte gWildMonHeaders
-_080830B0:
- movs r0, 0
-_080830B2:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetLocalWaterMon
-
- thumb_func_start sub_80830B8
-sub_80830B8: @ 80830B8
- push {r4,r5,lr}
- bl InUnionRoom
- cmp r0, 0x1
- beq _08083104
- ldr r0, _080830F8 @ =gUnknown_203ADFA
- ldrb r0, [r0]
- cmp r0, 0x2
- beq _08083104
- ldr r5, _080830FC @ =0x00004020
- adds r0, r5, 0
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0
- beq _08083104
- subs r4, r0, 0x1
- lsls r4, 16
- lsrs r4, 16
- adds r0, r5, 0
- adds r1, r4, 0
- bl VarSet
- cmp r4, 0
- bne _08083104
- ldr r0, _08083100 @ =EventScript_1BFB65
- bl ScriptContext1_SetupScript
- movs r0, 0x1
- b _08083106
- .align 2, 0
-_080830F8: .4byte gUnknown_203ADFA
-_080830FC: .4byte 0x00004020
-_08083100: .4byte EventScript_1BFB65
-_08083104:
- movs r0, 0
-_08083106:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80830B8
-
- thumb_func_start sub_808310C
-sub_808310C: @ 808310C
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r6, r0, 24
- ldr r0, _08083158 @ =0x00004020
- bl VarGet
- lsls r0, 16
- cmp r0, 0
- beq _08083152
- movs r5, 0
-_08083120:
- movs r0, 0x64
- adds r1, r5, 0
- muls r1, r0
- ldr r0, _0808315C @ =gPlayerParty
- adds r4, r1, r0
- adds r0, r4, 0
- movs r1, 0x39
- bl GetMonData
- cmp r0, 0
- beq _08083160
- adds r0, r4, 0
- movs r1, 0x2D
- bl GetMonData
- cmp r0, 0
- bne _08083160
- adds r0, r4, 0
- movs r1, 0x38
- bl GetMonData
- lsls r0, 24
- lsrs r0, 24
- cmp r6, r0
- bcc _0808316A
-_08083152:
- movs r0, 0x1
- b _0808316C
- .align 2, 0
-_08083158: .4byte 0x00004020
-_0808315C: .4byte gPlayerParty
-_08083160:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, 0x5
- bls _08083120
-_0808316A:
- movs r0, 0
-_0808316C:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_808310C
-
- thumb_func_start ApplyFluteEncounterRateMod
-ApplyFluteEncounterRateMod: @ 8083174
- push {r4,lr}
- adds r4, r0, 0
- bl sub_80831A0
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _0808318A
- cmp r0, 0x2
- beq _08083192
- b _08083198
-_0808318A:
- ldr r0, [r4]
- lsrs r1, r0, 1
- adds r0, r1
- b _08083196
-_08083192:
- ldr r0, [r4]
- lsrs r0, 1
-_08083196:
- str r0, [r4]
-_08083198:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end ApplyFluteEncounterRateMod
-
- thumb_func_start sub_80831A0
-sub_80831A0: @ 80831A0
- push {lr}
- ldr r0, _080831B4 @ =0x00000803
- bl FlagGet
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080831B8
- movs r0, 0x1
- b _080831D2
- .align 2, 0
-_080831B4: .4byte 0x00000803
-_080831B8:
- ldr r0, _080831CC @ =0x00000804
- bl FlagGet
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _080831D0
- movs r0, 0
- b _080831D2
- .align 2, 0
-_080831CC: .4byte 0x00000804
-_080831D0:
- movs r0, 0x2
-_080831D2:
- pop {r1}
- bx r1
- thumb_func_end sub_80831A0
-
- thumb_func_start ApplyCleanseTagEncounterRateMod
-ApplyCleanseTagEncounterRateMod: @ 80831D8
- push {r4,lr}
- adds r4, r0, 0
- bl sub_80831F8
- lsls r0, 24
- cmp r0, 0
- beq _080831F2
- ldr r0, [r4]
- lsls r0, 1
- movs r1, 0x3
- bl __udivsi3
- str r0, [r4]
-_080831F2:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end ApplyCleanseTagEncounterRateMod
-
- thumb_func_start sub_80831F8
-sub_80831F8: @ 80831F8
- push {lr}
- ldr r0, _08083208 @ =gUnknown_20386D0
- ldrh r0, [r0, 0xA]
- cmp r0, 0xBE
- beq _0808320C
- movs r0, 0
- b _0808320E
- .align 2, 0
-_08083208: .4byte gUnknown_20386D0
-_0808320C:
- movs r0, 0x1
-_0808320E:
- pop {r1}
- bx r1
- thumb_func_end sub_80831F8
-
- thumb_func_start sub_8083214
-sub_8083214: @ 8083214
- push {lr}
- lsls r0, 16
- lsrs r0, 16
- ldr r1, _08083228 @ =gUnknown_20386D0
- str r0, [r1]
- bl sub_80832D4
- pop {r0}
- bx r0
- .align 2, 0
-_08083228: .4byte gUnknown_20386D0
- thumb_func_end sub_8083214
-
- thumb_func_start sub_808322C
-sub_808322C: @ 808322C
- ldr r2, _08083240 @ =gUnknown_20386D0
- ldr r1, [r2]
- ldr r0, _08083244 @ =0x41c64e6d
- muls r0, r1
- ldr r1, _08083248 @ =0x00003039
- adds r0, r1
- str r0, [r2]
- lsrs r0, 16
- bx lr
- .align 2, 0
-_08083240: .4byte gUnknown_20386D0
-_08083244: .4byte 0x41c64e6d
-_08083248: .4byte 0x00003039
- thumb_func_end sub_808322C
-
- thumb_func_start sub_808324C
-sub_808324C: @ 808324C
- push {r4,r5,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- adds r5, r4, 0
- bl sub_8082934
- lsls r0, 16
- lsrs r2, r0, 16
- ldr r0, _08083284 @ =0x0000ffff
- cmp r2, r0
- beq _080832CC
- cmp r4, 0x1
- bne _0808328C
- ldr r1, _08083288 @ =gWildMonHeaders
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 2
- adds r1, 0x4
- adds r0, r1
- ldr r0, [r0]
- cmp r0, 0
- beq _080832CC
- ldrb r1, [r0]
- cmp r1, 0x4F
- bhi _080832A8
- cmp r1, 0x9
- bls _080832B4
- b _080832B8
- .align 2, 0
-_08083284: .4byte 0x0000ffff
-_08083288: .4byte gWildMonHeaders
-_0808328C:
- cmp r5, 0x2
- bne _080832CC
- ldr r1, _080832AC @ =gWildMonHeaders
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 2
- adds r1, 0x8
- adds r0, r1
- ldr r0, [r0]
- cmp r0, 0
- beq _080832CC
- ldrb r1, [r0]
- cmp r1, 0x4F
- bls _080832B0
-_080832A8:
- movs r0, 0
- b _080832CE
- .align 2, 0
-_080832AC: .4byte gWildMonHeaders
-_080832B0:
- cmp r1, 0x9
- bhi _080832B8
-_080832B4:
- movs r0, 0x8
- b _080832CE
-_080832B8:
- ldrb r0, [r0]
- movs r1, 0xA
- bl __udivsi3
- adds r1, r0, 0
- movs r0, 0x8
- subs r0, r1
- lsls r0, 24
- lsrs r0, 24
- b _080832CE
-_080832CC:
- movs r0, 0xFF
-_080832CE:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_808324C
-
- thumb_func_start sub_80832D4
-sub_80832D4: @ 80832D4
- ldr r0, _080832E0 @ =gUnknown_20386D0
- movs r2, 0
- movs r1, 0
- strh r1, [r0, 0x6]
- strb r2, [r0, 0x8]
- bx lr
- .align 2, 0
-_080832E0: .4byte gUnknown_20386D0
- thumb_func_end sub_80832D4
-
- thumb_func_start sub_80832E4
-sub_80832E4: @ 80832E4
- push {r4,r5,lr}
- movs r1, 0x4
- bl sub_8058F1C
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0
- beq _080833A0
- bl sub_808324C
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xFF
- beq _080833A0
- lsls r4, 8
- movs r5, 0xA0
- lsls r5, 3
- bl sub_80831A0
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _08083318
- cmp r0, 0x2
- beq _08083326
- b _0808332A
-_08083318:
- lsrs r0, r4, 1
- subs r4, r0
- lsrs r0, r5, 1
- movs r1, 0xA0
- lsls r1, 3
- adds r5, r0, r1
- b _0808332A
-_08083326:
- lsls r4, 1
- lsrs r5, 1
-_0808332A:
- ldr r0, _08083368 @ =gPlayerParty
- movs r1, 0xC
- bl GetMonData
- ldr r1, _0808336C @ =gUnknown_20386D0
- strh r0, [r1, 0xA]
- bl sub_80831F8
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _08083356
- adds r0, r4, 0
- movs r1, 0x3
- bl __udivsi3
- adds r4, r0
- adds r0, r5, 0
- movs r1, 0x3
- bl __udivsi3
- subs r5, r0
-_08083356:
- bl sub_8082C58
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _08083370
- cmp r0, 0x2
- beq _08083376
- b _0808337A
- .align 2, 0
-_08083368: .4byte gPlayerParty
-_0808336C: .4byte gUnknown_20386D0
-_08083370:
- lsls r4, 1
- lsrs r5, 1
- b _0808337A
-_08083376:
- lsrs r4, 1
- lsls r5, 1
-_0808337A:
- lsrs r4, 8
- lsrs r5, 8
- ldr r1, _080833A4 @ =gUnknown_20386D0
- ldrb r0, [r1, 0x8]
- cmp r0, r4
- bcs _080833A8
- adds r0, 0x1
- strb r0, [r1, 0x8]
- bl Random
- lsls r0, 16
- lsrs r0, 16
- movs r1, 0x64
- bl __umodsi3
- lsls r0, 16
- lsrs r0, 16
- cmp r0, r5
- bcc _080833A8
-_080833A0:
- movs r0, 0
- b _080833AA
- .align 2, 0
-_080833A4: .4byte gUnknown_20386D0
-_080833A8:
- movs r0, 0x1
-_080833AA:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80832E4
-
- thumb_func_start sub_80833B0
-sub_80833B0: @ 80833B0
- push {r4,r5,lr}
- adds r4, r0, 0
- bl sub_80832E4
- lsls r0, 24
- cmp r0, 0
- bne _080833D4
- adds r0, r4, 0
- movs r1, 0
- bl sub_8058F1C
- ldr r1, _080833D0 @ =gUnknown_20386D0
- strh r0, [r1, 0x4]
- movs r0, 0
- b _0808340A
- .align 2, 0
-_080833D0: .4byte gUnknown_20386D0
-_080833D4:
- ldr r5, _080833F4 @ =gUnknown_20386D0
- ldrh r1, [r5, 0x4]
- adds r0, r4, 0
- bl sub_8082CBC
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- beq _080833F8
- adds r0, r4, 0
- movs r1, 0
- bl sub_8058F1C
- strh r0, [r5, 0x4]
- movs r0, 0
- b _0808340A
- .align 2, 0
-_080833F4: .4byte gUnknown_20386D0
-_080833F8:
- movs r0, 0
- movs r1, 0
- strh r1, [r5, 0x6]
- strb r0, [r5, 0x8]
- adds r0, r4, 0
- bl sub_8058F1C
- strh r0, [r5, 0x4]
- movs r0, 0x1
-_0808340A:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_80833B0
-
- thumb_func_start sub_8083410
-sub_8083410: @ 8083410
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r0, _0808342C @ =0x00004020
- bl VarGet
- lsls r0, 16
- cmp r0, 0
- bne _08083434
- ldr r1, _08083430 @ =gUnknown_20386D0
- ldrh r0, [r1, 0x6]
- adds r0, r4
- b _08083438
- .align 2, 0
-_0808342C: .4byte 0x00004020
-_08083430: .4byte gUnknown_20386D0
-_08083434:
- ldr r1, _08083440 @ =gUnknown_20386D0
- movs r0, 0
-_08083438:
- strh r0, [r1, 0x6]
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08083440: .4byte gUnknown_20386D0
- thumb_func_end sub_8083410
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/data/event_scripts.s b/data/event_scripts.s
index a3943d494..eb2c8ed60 100644
--- a/data/event_scripts.s
+++ b/data/event_scripts.s
@@ -10397,7 +10397,7 @@ EventScript_1BE06F:: @ 81BE06F
applymovement VAR_LAST_TALKED, Movement_1BE08F
waitmovement 0
removeobject VAR_LAST_TALKED
- special Special_RockSmashEncounter
+ special ScrSpecial_RockSmashWildEncounter
compare_var_to_value VAR_RESULT, 0
goto_if eq, EventScript_1BE08D
waitstate
@@ -11731,7 +11731,7 @@ EventScript_81BFB5F:: @ 81BFB5F
setflashradius 0
end
-EventScript_1BFB65:: @ 81BFB65
+EventScript_RepelWoreOff:: @ 81BFB65
msgbox Text_1BFB6E, 3
end
diff --git a/data/specials.inc b/data/specials.inc
index 516b5f768..9da9bdfc7 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -179,7 +179,7 @@ gSpecials:: @ 815FD60
def_special sub_8113510
def_special sub_81130A8
def_special sub_8113530
- def_special Special_RockSmashEncounter
+ def_special ScrSpecial_RockSmashWildEncounter
def_special nullsub_75
def_special nullsub_75
def_special nullsub_75
diff --git a/include/event_scripts.h b/include/event_scripts.h
index c0f0300b1..e8fc40fa4 100644
--- a/include/event_scripts.h
+++ b/include/event_scripts.h
@@ -1186,4 +1186,6 @@ extern const u8 Text_1BCA95[];
extern const u8 Text_1BCACB[];
extern const u8 Text_1BCAF2[];
+extern const u8 EventScript_RepelWoreOff[];
+
#endif //GUARD_EVENT_SCRIPTS_H
diff --git a/include/fieldmap.h b/include/fieldmap.h
index c3709c616..4af4342f7 100644
--- a/include/fieldmap.h
+++ b/include/fieldmap.h
@@ -28,5 +28,7 @@ struct MapConnection * GetMapConnectionAtPos(s16 x, s16 y);
void sub_8059948(u8 a0, u8 a1);
void save_serialize_map(void);
+u32 sub_8058F1C(u32 original, u8 bit);
+u32 sub_8058F48(s16 x, s16 y, u8 z);
#endif //GUARD_FIELDMAP_H
diff --git a/include/wild_encounter.h b/include/wild_encounter.h
index 6dbde30af..d0420438a 100644
--- a/include/wild_encounter.h
+++ b/include/wild_encounter.h
@@ -34,7 +34,7 @@ struct WildPokemonHeader
extern const struct WildPokemonHeader gWildMonHeaders[];
void DisableWildEncounters(bool8 disabled);
-bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior);
+bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavior);
void ScrSpecial_RockSmashWildEncounter(void);
bool8 SweetScentWildEncounter(void);
bool8 DoesCurrentMapHaveFishingMons(void);
@@ -42,9 +42,10 @@ void FishingWildEncounter(u8 rod);
u16 GetLocalWildMon(bool8 *isWaterMon);
u16 GetLocalWaterMon(void);
bool8 UpdateRepelCounter(void);
-void sub_8082740(bool8 state);
+void DisableWildEncounters(bool8 state);
u8 GetUnownLetterByPersonalityLoByte(u32 personality);
bool8 SweetScentWildEncounter(void);
-void sub_8083214(u16 randVal);
+void SeedWildEncounterRng(u16 randVal);
+void ResetEncounterRateModifiers(void);
#endif // GUARD_WILD_ENCOUNTER_H
diff --git a/ld_script.txt b/ld_script.txt
index 5a1787878..a8919e9b2 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -126,7 +126,6 @@ SECTIONS {
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);
asm/option_menu.o(.text);
diff --git a/src/new_game.c b/src/new_game.c
index e27c862bb..4c1dc2dbf 100644
--- a/src/new_game.c
+++ b/src/new_game.c
@@ -102,7 +102,7 @@ void ResetMenuAndMonGlobals(void)
ResetTMCaseCursorPos();
BerryPouch_CursorResetToTop();
sub_811089C();
- sub_8083214(Random());
+ SeedWildEncounterRng(Random());
ResetSpecialVars();
}
diff --git a/src/quest_log.c b/src/quest_log.c
index 896a44d17..d76a6173d 100644
--- a/src/quest_log.c
+++ b/src/quest_log.c
@@ -870,7 +870,7 @@ static void sub_8110F90(u8 unused)
gSaveBlock1Ptr->location.warpId = -1;
gUnknown_203ADF8 = 0;
gDisableMapMusicChangeOnMapLoad = 1;
- sub_8082740(1);
+ DisableWildEncounters(TRUE);
sub_8111368();
}
@@ -1600,7 +1600,7 @@ static void sub_81120AC(u8 taskId)
ScriptContext2_Disable();
gTextFlags.autoScroll = FALSE;
gUnknown_2036E28 = 0;
- sub_8082740(0);
+ DisableWildEncounters(FALSE);
gHelpSystemEnabled = TRUE;
DestroyTask(taskId);
break;
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index d6d115348..5cb614c83 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -2,38 +2,53 @@
#include "random.h"
#include "wild_encounter.h"
#include "event_data.h"
+#include "fieldmap.h"
+#include "roamer.h"
#include "field_player_avatar.h"
+#include "battle_setup.h"
+#include "overworld.h"
+#include "metatile_behavior.h"
+#include "event_scripts.h"
+#include "script.h"
+#include "link.h"
+#include "quest_log.h"
#include "constants/species.h"
#include "constants/maps.h"
#include "constants/vars.h"
#include "constants/abilities.h"
+#include "constants/items.h"
-struct UnkStruct_20386D0
+struct WildEncounterData
{
- u8 filler_0[6];
- u16 unk_6;
- u8 unk_8;
- u8 unk_9;
+ u32 rngState;
+ u16 prevMetaTileBehavior;
+ u16 encounterRateBuff;
+ u8 stepsSinceLastEncounter;
+ u8 abilityEffect;
+ u16 leadMonHeldItem;
};
-EWRAM_DATA struct UnkStruct_20386D0 gUnknown_20386D0 = {};
-EWRAM_DATA bool8 gUnknown_20386DC = FALSE;
+static EWRAM_DATA struct WildEncounterData sWildEncounterData = {};
+static EWRAM_DATA bool8 sWildEncountersDisabled = 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);
+static bool8 UnlockedTanobyOrAreNotInTanoby(void);
+static u32 GenerateUnownPersonalityByLetter(u8 letter);
+static bool8 IsWildLevelAllowedByRepel(u8 level);
+static void ApplyFluteEncounterRateMod(u32 *rate);
+static u8 GetFluteEncounterRateModType(void);
+static void ApplyCleanseTagEncounterRateMod(u32 *rate);
+static u8 IsLeadMonHoldingCleanseTag(void);
+static u16 WildEncounterRandom(void);
+static void AddToWildEncounterRateBuff(u8 encouterRate);
-void sub_8082740(bool8 state)
+void DisableWildEncounters(bool8 state)
{
- gUnknown_20386DC = state;
+ sWildEncountersDisabled = state;
}
-u8 ChooseWildMonIndex_Land(void)
+static u8 ChooseWildMonIndex_Land(void)
{
u8 pct = Random() % 100;
if (pct < 20)
@@ -61,7 +76,7 @@ u8 ChooseWildMonIndex_Land(void)
return 11;
}
-u8 ChooseWildMonIndex_WaterRock(void)
+static u8 ChooseWildMonIndex_WaterRock(void)
{
u8 pct = Random() % 100;
if (pct < 60)
@@ -75,7 +90,7 @@ u8 ChooseWildMonIndex_WaterRock(void)
return 4;
}
-u8 ChooseWildMonIndex_Fishing(u8 rod)
+static u8 ChooseWildMonIndex_Fishing(u8 rod)
{
u8 slot = 0;
u8 pct = Random() % 100;
@@ -111,7 +126,7 @@ u8 ChooseWildMonIndex_Fishing(u8 rod)
return slot;
}
-u8 ChooseWildMonLevel(const struct WildPokemon * info)
+static u8 ChooseWildMonLevel(const struct WildPokemon * info)
{
u8 lo;
u8 hi;
@@ -132,7 +147,7 @@ u8 ChooseWildMonLevel(const struct WildPokemon * info)
return lo + res;
}
-u16 sub_8082934(void)
+static u16 GetCurrentMapWildMonHeaderId(void)
{
u16 i;
@@ -164,7 +179,7 @@ u16 sub_8082934(void)
return -1;
}
-bool8 UnlockedTanobyOrAreNotInTanoby(void)
+static bool8 UnlockedTanobyOrAreNotInTanoby(void)
{
if (FlagGet(FLAG_SYS_UNLOCKED_TANOBY_RUINS))
return TRUE;
@@ -182,7 +197,7 @@ bool8 UnlockedTanobyOrAreNotInTanoby(void)
return FALSE;
}
-void GenerateWildMon(u16 species, u8 level, u8 slot)
+static void GenerateWildMon(u16 species, u8 level, u8 slot)
{
u32 personality;
s8 chamber;
@@ -199,7 +214,7 @@ void GenerateWildMon(u16 species, u8 level, u8 slot)
}
}
-u32 GenerateUnownPersonalityByLetter(u8 letter)
+static u32 GenerateUnownPersonalityByLetter(u8 letter)
{
u32 personality;
do
@@ -214,7 +229,7 @@ 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)
+static bool8 TryGenerateWildMon(const struct WildPokemonInfo * info, u8 tableIdx, u8 a2)
{
u8 slot = 0;
u8 level;
@@ -231,7 +246,7 @@ bool8 sub_8082AEC(const struct WildPokemonInfo * info, u8 tableIdx, u8 a2)
break;
}
level = ChooseWildMonLevel(&info->wildPokemon[slot]);
- if (a2 == 1 && !sub_808310C(level))
+ if (a2 == 1 && !IsWildLevelAllowedByRepel(level))
{
return FALSE;
}
@@ -239,7 +254,7 @@ bool8 sub_8082AEC(const struct WildPokemonInfo * info, u8 tableIdx, u8 a2)
return TRUE;
}
-u16 sub_8082B64(const struct WildPokemonInfo * info, u8 rod)
+static u16 GenerateFishingEncounter(const struct WildPokemonInfo * info, u8 rod)
{
u8 slot = ChooseWildMonIndex_Fishing(rod);
u8 level = ChooseWildMonLevel(&info->wildPokemon[slot]);
@@ -247,24 +262,24 @@ u16 sub_8082B64(const struct WildPokemonInfo * info, u8 rod)
return info->wildPokemon[slot].species;
}
-bool8 DoWildEncounterRateDiceRoll(u16 a0)
+static bool8 DoWildEncounterRateDiceRoll(u16 a0)
{
- if (sub_808322C() % 1600 < a0)
+ if (WildEncounterRandom() % 1600 < a0)
return TRUE;
return FALSE;
}
-bool8 sub_8082BCC(u32 encounterRate, bool8 ignoreAbility)
+static bool8 DoWildEncounterRateTest(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;
+ encounterRate += sWildEncounterData.encounterRateBuff * 16 / 200;
ApplyFluteEncounterRateMod(&encounterRate);
ApplyCleanseTagEncounterRateMod(&encounterRate);
if (!ignoreAbility)
{
- switch (gUnknown_20386D0.unk_9)
+ switch (sWildEncounterData.abilityEffect)
{
case 1:
encounterRate /= 2;
@@ -279,23 +294,455 @@ bool8 sub_8082BCC(u32 encounterRate, bool8 ignoreAbility)
return DoWildEncounterRateDiceRoll(encounterRate);
}
-u8 sub_8082C58(void)
+static u8 GetAbilityEncounterRateModType(void)
{
- gUnknown_20386D0.unk_9 = 0;
+ sWildEncounterData.abilityEffect = 0;
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
{
u8 ability = GetMonAbility(&gPlayerParty[0]);
if (ability == ABILITY_STENCH)
- gUnknown_20386D0.unk_9 = 1;
+ sWildEncounterData.abilityEffect = 1;
else if (ability == ABILITY_ILLUMINATE)
- gUnknown_20386D0.unk_9 = 2;
+ sWildEncounterData.abilityEffect = 2;
}
- return gUnknown_20386D0.unk_9;
+ return sWildEncounterData.abilityEffect;
}
-bool8 sub_8082C98(void)
+static bool8 DoGlobalWildEncounterDiceRoll(void)
{
if ((Random() % 100) >= 60)
return FALSE;
return TRUE;
}
+
+bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavior)
+{
+ u16 headerId;
+ struct Roamer *roamer;
+
+ if (sWildEncountersDisabled == TRUE)
+ return FALSE;
+
+ headerId = GetCurrentMapWildMonHeaderId();
+ if (headerId != 0xFFFF)
+ {
+ if (sub_8058F1C(currMetaTileBehavior, 4) == TRUE)
+ {
+ if (gWildMonHeaders[headerId].landMonsInfo == NULL)
+ return FALSE;
+ else if (previousMetaTileBehavior != sub_8058F1C(currMetaTileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
+ return FALSE;
+ if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
+ {
+ AddToWildEncounterRateBuff(gWildMonHeaders[headerId].landMonsInfo->encounterRate);
+ return FALSE;
+ }
+
+ else if (TryStartRoamerEncounter() == TRUE)
+ {
+ roamer = &gSaveBlock1Ptr->roamer;
+ if (!IsWildLevelAllowedByRepel(roamer->level))
+ {
+ return FALSE;
+ }
+
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+ else
+ {
+
+ // try a regular wild land encounter
+ if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, 0, 1) == TRUE)
+ {
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ else
+ {
+ AddToWildEncounterRateBuff(gWildMonHeaders[headerId].landMonsInfo->encounterRate);
+ }
+ }
+ }
+ else if (sub_8058F1C(currMetaTileBehavior, 4) == 2
+ || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetaTileBehavior, 0)) == TRUE))
+ {
+ if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
+ return FALSE;
+ else if (previousMetaTileBehavior != sub_8058F1C(currMetaTileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
+ return FALSE;
+ else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE)
+ {
+ AddToWildEncounterRateBuff(gWildMonHeaders[headerId].waterMonsInfo->encounterRate);
+ return FALSE;
+ }
+
+ if (TryStartRoamerEncounter() == TRUE)
+ {
+ roamer = &gSaveBlock1Ptr->roamer;
+ if (!IsWildLevelAllowedByRepel(roamer->level))
+ {
+ return FALSE;
+ }
+
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+ else // try a regular surfing encounter
+ {
+ if (TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, 1, 1) == TRUE)
+ {
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ else
+ {
+ AddToWildEncounterRateBuff(gWildMonHeaders[headerId].waterMonsInfo->encounterRate);
+ }
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+void ScrSpecial_RockSmashWildEncounter(void)
+{
+ u16 headerIdx = GetCurrentMapWildMonHeaderId();
+ if (headerIdx == 0xFFFF)
+ gSpecialVar_Result = FALSE;
+ else if (gWildMonHeaders[headerIdx].rockSmashMonsInfo == NULL)
+ gSpecialVar_Result = FALSE;
+ else if (DoWildEncounterRateTest(gWildMonHeaders[headerIdx].rockSmashMonsInfo->encounterRate, TRUE) != TRUE)
+ gSpecialVar_Result = FALSE;
+ else if (TryGenerateWildMon(gWildMonHeaders[headerIdx].rockSmashMonsInfo, 2, 1) == TRUE)
+ {
+ BattleSetup_StartWildBattle();
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ gSpecialVar_Result = FALSE;
+}
+
+bool8 SweetScentWildEncounter(void)
+{
+ s16 x, y;
+ u16 headerId;
+
+ PlayerGetDestCoords(&x, &y);
+ headerId = GetCurrentMapWildMonHeaderId();
+ if (headerId != 0xFFFF)
+ {
+ if (sub_8058F48(x, y, 4) == 1)
+ {
+ if (TryStartRoamerEncounter() == TRUE)
+ {
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+
+ if (gWildMonHeaders[headerId].landMonsInfo == NULL)
+ return FALSE;
+
+ TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, 0, 0);
+
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ else if (sub_8058F48(x, y, 4) == 2)
+ {
+ if (TryStartRoamerEncounter() == TRUE)
+ {
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+
+ if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
+ return FALSE;
+
+ TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, 1, 0);
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 DoesCurrentMapHaveFishingMons(void)
+{
+ u16 headerIdx = GetCurrentMapWildMonHeaderId();
+ if (headerIdx == 0xFFFF)
+ return FALSE;
+ if (gWildMonHeaders[headerIdx].fishingMonsInfo == NULL)
+ return FALSE;
+ return TRUE;
+}
+
+void FishingWildEncounter(u8 rod)
+{
+ GenerateFishingEncounter(gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo, rod);
+ IncrementGameStat(GAME_STAT_FISHING_CAPTURES);
+ BattleSetup_StartWildBattle();
+}
+
+u16 GetLocalWildMon(bool8 *isWaterMon)
+{
+ u16 headerId;
+ const struct WildPokemonInfo * landMonsInfo;
+ const struct WildPokemonInfo * waterMonsInfo;
+
+ *isWaterMon = FALSE;
+ headerId = GetCurrentMapWildMonHeaderId();
+ if (headerId == 0xFFFF)
+ return SPECIES_NONE;
+ landMonsInfo = gWildMonHeaders[headerId].landMonsInfo;
+ waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo;
+ // Neither
+ if (landMonsInfo == NULL && waterMonsInfo == NULL)
+ return SPECIES_NONE;
+ // Land Pokemon
+ else if (landMonsInfo != NULL && waterMonsInfo == NULL)
+ return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species;
+ // Water Pokemon
+ else if (landMonsInfo == NULL && waterMonsInfo != NULL)
+ {
+ *isWaterMon = TRUE;
+ return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species;
+ }
+ // Either land or water Pokemon
+ if ((Random() % 100) < 80)
+ {
+ return landMonsInfo->wildPokemon[ChooseWildMonIndex_Land()].species;
+ }
+ else
+ {
+ *isWaterMon = TRUE;
+ return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species;
+ }
+}
+
+u16 GetLocalWaterMon(void)
+{
+ u16 headerId = GetCurrentMapWildMonHeaderId();
+
+ if (headerId != 0xFFFF)
+ {
+ const struct WildPokemonInfo * waterMonsInfo = gWildMonHeaders[headerId].waterMonsInfo;
+
+ if (waterMonsInfo)
+ return waterMonsInfo->wildPokemon[ChooseWildMonIndex_WaterRock()].species;
+ }
+ return SPECIES_NONE;
+}
+
+bool8 UpdateRepelCounter(void)
+{
+ u16 steps;
+
+ if (InUnionRoom() == TRUE)
+ return FALSE;
+
+ if (gUnknown_203ADFA == 2)
+ return FALSE;
+
+ steps = VarGet(VAR_REPEL_STEP_COUNT);
+
+ if (steps != 0)
+ {
+ steps--;
+ VarSet(VAR_REPEL_STEP_COUNT, steps);
+ if (steps == 0)
+ {
+ ScriptContext1_SetupScript(EventScript_RepelWoreOff);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static bool8 IsWildLevelAllowedByRepel(u8 wildLevel)
+{
+ u8 i;
+
+ if (!VarGet(VAR_REPEL_STEP_COUNT))
+ return TRUE;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_HP) && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG))
+ {
+ u8 ourLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
+
+ if (wildLevel < ourLevel)
+ return FALSE;
+ else
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+static void ApplyFluteEncounterRateMod(u32 *encounterRate)
+{
+ switch (GetFluteEncounterRateModType())
+ {
+ case 1:
+ *encounterRate += *encounterRate / 2;
+ break;
+ case 2:
+ *encounterRate = *encounterRate / 2;
+ break;
+ }
+}
+
+static u8 GetFluteEncounterRateModType(void)
+{
+ if (FlagGet(FLAG_SYS_WHITE_FLUTE_ACTIVE) == TRUE)
+ return 1;
+ else if (FlagGet(FLAG_SYS_BLACK_FLUTE_ACTIVE) == TRUE)
+ return 2;
+ else
+ return 0;
+}
+
+static void ApplyCleanseTagEncounterRateMod(u32 *encounterRate)
+{
+ if (IsLeadMonHoldingCleanseTag())
+ *encounterRate = *encounterRate * 2 / 3;
+}
+
+static bool8 IsLeadMonHoldingCleanseTag(void)
+{
+ if (sWildEncounterData.leadMonHeldItem == ITEM_CLEANSE_TAG)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void SeedWildEncounterRng(u16 seed)
+{
+ sWildEncounterData.rngState = seed;
+ ResetEncounterRateModifiers();
+}
+
+static u16 WildEncounterRandom(void)
+{
+ sWildEncounterData.rngState *= 1103515245;
+ sWildEncounterData.rngState += 12345;
+ return sWildEncounterData.rngState >> 16;
+}
+
+static u8 GetMapBaseEncounterCooldown(u8 a0)
+{
+ u16 headerIdx = GetCurrentMapWildMonHeaderId();
+ if (headerIdx == 0xFFFF)
+ return 0xFF;
+ if (a0 == 1)
+ {
+ if (gWildMonHeaders[headerIdx].landMonsInfo == NULL)
+ return 0xFF;
+ if (gWildMonHeaders[headerIdx].landMonsInfo->encounterRate >= 80)
+ return 0;
+ if (gWildMonHeaders[headerIdx].landMonsInfo->encounterRate < 10)
+ return 8;
+ return 8 - (gWildMonHeaders[headerIdx].landMonsInfo->encounterRate / 10);
+ }
+ if (a0 == 2)
+ {
+ if (gWildMonHeaders[headerIdx].waterMonsInfo == NULL)
+ return 0xFF;
+ if (gWildMonHeaders[headerIdx].waterMonsInfo->encounterRate >= 80)
+ return 0;
+ if (gWildMonHeaders[headerIdx].waterMonsInfo->encounterRate < 10)
+ return 8;
+ return 8 - (gWildMonHeaders[headerIdx].waterMonsInfo->encounterRate / 10);
+ }
+ return 0xFF;
+}
+
+void ResetEncounterRateModifiers(void)
+{
+ sWildEncounterData.encounterRateBuff = 0;
+ sWildEncounterData.stepsSinceLastEncounter = 0;
+}
+
+static bool8 HandleWildEncounterCooldown(u32 currMetaTileBehavior)
+{
+ u8 unk = sub_8058F1C(currMetaTileBehavior, 4);
+ u32 minSteps;
+ u32 encRate;
+ if (unk == 0)
+ return FALSE;
+ minSteps = GetMapBaseEncounterCooldown(unk);
+ if (minSteps == 0xFF)
+ return FALSE;
+ minSteps *= 256;
+ encRate = 5 * 256;
+ switch (GetFluteEncounterRateModType())
+ {
+ case 1:
+ minSteps -= minSteps / 2;
+ encRate += encRate / 2;
+ break;
+ case 2:
+ minSteps *= 2;
+ encRate /= 2;
+ break;
+ }
+ sWildEncounterData.leadMonHeldItem = GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM);
+ if (IsLeadMonHoldingCleanseTag() == TRUE)
+ {
+ minSteps += minSteps / 3;
+ encRate -= encRate / 3;
+ }
+ switch (GetAbilityEncounterRateModType())
+ {
+ case 1:
+ minSteps *= 2;
+ encRate /= 2;
+ break;
+ case 2:
+ minSteps /= 2;
+ encRate *= 2;
+ break;
+ }
+ minSteps /= 256;
+ encRate /= 256;
+ if (sWildEncounterData.stepsSinceLastEncounter >= minSteps)
+ return TRUE;
+ sWildEncounterData.stepsSinceLastEncounter++;
+ if ((Random() % 100) < encRate)
+ return TRUE;
+ return FALSE;
+}
+
+bool8 TryStandardWildEncounter(u32 currMetaTileBehavior)
+{
+ if (!HandleWildEncounterCooldown(currMetaTileBehavior))
+ {
+ sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0);
+ return FALSE;
+ }
+ else if (StandardWildEncounter(currMetaTileBehavior, sWildEncounterData.prevMetaTileBehavior) == TRUE)
+ {
+ sWildEncounterData.encounterRateBuff = 0;
+ sWildEncounterData.stepsSinceLastEncounter = 0;
+ sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0);
+ return TRUE;
+ }
+ else
+ {
+ sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0);
+ return FALSE;
+ }
+}
+
+static void AddToWildEncounterRateBuff(u8 encounterRate)
+{
+ if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
+ sWildEncounterData.encounterRateBuff += encounterRate;
+ else
+ sWildEncounterData.encounterRateBuff = 0;
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index d4c25d15f..51501e162 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -213,13 +213,9 @@ gUnknown_20386A8: @ 20386A8
.include "src/battle_setup.o"
.align 2
+ .include "src/wild_encounter.o"
-gUnknown_20386D0: @ 20386D0
- .space 0xC
-
-gUnknown_20386DC: @ 20386DC
- .space 0x4
-
+ .align 2
gFieldEffectArguments: @ 20386E0
.space 0x20