diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-10-31 17:06:06 -0400 |
---|---|---|
committer | PikalaxALT <PikalaxALT@gmail.com> | 2019-10-31 18:45:07 -0400 |
commit | 079310c70baecd11bd72ab493ee012f483ea2bf9 (patch) | |
tree | 3e08157597383fc414ac2523cc13e6eed0868334 | |
parent | b07b36c6d29fbfdb8e75e343870ae8e87e9308bd (diff) |
Finish decomp of wild_encounter
-rw-r--r-- | asm/field_control_avatar.s | 6 | ||||
-rw-r--r-- | asm/field_player_avatar.s | 4 | ||||
-rw-r--r-- | asm/wild_encounter.s | 1007 | ||||
-rw-r--r-- | data/event_scripts.s | 4 | ||||
-rw-r--r-- | data/specials.inc | 2 | ||||
-rw-r--r-- | include/event_scripts.h | 2 | ||||
-rw-r--r-- | include/fieldmap.h | 2 | ||||
-rw-r--r-- | include/wild_encounter.h | 7 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/new_game.c | 2 | ||||
-rw-r--r-- | src/quest_log.c | 4 | ||||
-rw-r--r-- | src/wild_encounter.c | 521 | ||||
-rw-r--r-- | sym_ewram.txt | 8 |
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 |