mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2025-01-13 23:23:43 +01:00
berry blender fix merge conflicts
This commit is contained in:
commit
b0657350a4
@ -25426,8 +25426,8 @@ sub_81A7B84: @ 81A7B84
|
|||||||
.pool
|
.pool
|
||||||
thumb_func_end sub_81A7B84
|
thumb_func_end sub_81A7B84
|
||||||
|
|
||||||
thumb_func_start sub_81A7B90
|
thumb_func_start TryGenerateBattlePikeWildMon
|
||||||
sub_81A7B90: @ 81A7B90
|
TryGenerateBattlePikeWildMon: @ 81A7B90
|
||||||
push {r4-r7,lr}
|
push {r4-r7,lr}
|
||||||
mov r7, r10
|
mov r7, r10
|
||||||
mov r6, r9
|
mov r6, r9
|
||||||
@ -25437,7 +25437,7 @@ sub_81A7B90: @ 81A7B90
|
|||||||
lsls r0, 24
|
lsls r0, 24
|
||||||
lsrs r0, 24
|
lsrs r0, 24
|
||||||
mov r8, r0
|
mov r8, r0
|
||||||
bl sub_81A7D00
|
bl GetBattlePikeWildMonHeaderId
|
||||||
lsls r0, 24
|
lsls r0, 24
|
||||||
lsrs r6, r0, 24
|
lsrs r6, r0, 24
|
||||||
ldr r7, =gSaveBlock2Ptr
|
ldr r7, =gSaveBlock2Ptr
|
||||||
@ -25596,10 +25596,10 @@ _081A7CE2:
|
|||||||
pop {r1}
|
pop {r1}
|
||||||
bx r1
|
bx r1
|
||||||
.pool
|
.pool
|
||||||
thumb_func_end sub_81A7B90
|
thumb_func_end TryGenerateBattlePikeWildMon
|
||||||
|
|
||||||
thumb_func_start sub_81A7D00
|
thumb_func_start GetBattlePikeWildMonHeaderId
|
||||||
sub_81A7D00: @ 81A7D00
|
GetBattlePikeWildMonHeaderId: @ 81A7D00
|
||||||
push {lr}
|
push {lr}
|
||||||
ldr r0, =gSaveBlock2Ptr
|
ldr r0, =gSaveBlock2Ptr
|
||||||
ldr r1, [r0]
|
ldr r1, [r0]
|
||||||
@ -25638,7 +25638,7 @@ _081A7D4C:
|
|||||||
adds r0, r1, 0
|
adds r0, r1, 0
|
||||||
pop {r1}
|
pop {r1}
|
||||||
bx r1
|
bx r1
|
||||||
thumb_func_end sub_81A7D00
|
thumb_func_end GetBattlePikeWildMonHeaderId
|
||||||
|
|
||||||
thumb_func_start sub_81A7D54
|
thumb_func_start sub_81A7D54
|
||||||
sub_81A7D54: @ 81A7D54
|
sub_81A7D54: @ 81A7D54
|
||||||
@ -29386,8 +29386,8 @@ _081A9B86:
|
|||||||
.pool
|
.pool
|
||||||
thumb_func_end sub_81A9B44
|
thumb_func_end sub_81A9B44
|
||||||
|
|
||||||
thumb_func_start sub_81A9C04
|
thumb_func_start GenerateBattlePyramidWildMon
|
||||||
sub_81A9C04: @ 81A9C04
|
GenerateBattlePyramidWildMon: @ 81A9C04
|
||||||
push {r4-r6,lr}
|
push {r4-r6,lr}
|
||||||
sub sp, 0x14
|
sub sp, 0x14
|
||||||
ldr r0, =gSaveBlock2Ptr
|
ldr r0, =gSaveBlock2Ptr
|
||||||
@ -29627,7 +29627,7 @@ _081A9E0C:
|
|||||||
pop {r0}
|
pop {r0}
|
||||||
bx r0
|
bx r0
|
||||||
.pool
|
.pool
|
||||||
thumb_func_end sub_81A9C04
|
thumb_func_end GenerateBattlePyramidWildMon
|
||||||
|
|
||||||
thumb_func_start sub_81A9E28
|
thumb_func_start sub_81A9E28
|
||||||
sub_81A9E28: @ 81A9E28
|
sub_81A9E28: @ 81A9E28
|
||||||
|
@ -82,8 +82,8 @@ task_add_01_battle_start: @ 80B065C
|
|||||||
.pool
|
.pool
|
||||||
thumb_func_end task_add_01_battle_start
|
thumb_func_end task_add_01_battle_start
|
||||||
|
|
||||||
thumb_func_start sub_80B0698
|
thumb_func_start BattleSetup_StartWildBattle
|
||||||
sub_80B0698: @ 80B0698
|
BattleSetup_StartWildBattle: @ 80B0698
|
||||||
push {lr}
|
push {lr}
|
||||||
bl GetSafariZoneFlag
|
bl GetSafariZoneFlag
|
||||||
cmp r0, 0
|
cmp r0, 0
|
||||||
@ -95,15 +95,15 @@ _080B06A8:
|
|||||||
_080B06AC:
|
_080B06AC:
|
||||||
pop {r0}
|
pop {r0}
|
||||||
bx r0
|
bx r0
|
||||||
thumb_func_end sub_80B0698
|
thumb_func_end BattleSetup_StartWildBattle
|
||||||
|
|
||||||
thumb_func_start sub_80B06B0
|
thumb_func_start BattleSetup_StartBattlePikeWildBattle
|
||||||
sub_80B06B0: @ 80B06B0
|
BattleSetup_StartBattlePikeWildBattle: @ 80B06B0
|
||||||
push {lr}
|
push {lr}
|
||||||
bl sub_80B07B4
|
bl sub_80B07B4
|
||||||
pop {r0}
|
pop {r0}
|
||||||
bx r0
|
bx r0
|
||||||
thumb_func_end sub_80B06B0
|
thumb_func_end BattleSetup_StartBattlePikeWildBattle
|
||||||
|
|
||||||
thumb_func_start sub_80B06BC
|
thumb_func_start sub_80B06BC
|
||||||
sub_80B06BC: @ 80B06BC
|
sub_80B06BC: @ 80B06BC
|
||||||
@ -147,8 +147,8 @@ _080B06F2:
|
|||||||
.pool
|
.pool
|
||||||
thumb_func_end sub_80B06BC
|
thumb_func_end sub_80B06BC
|
||||||
|
|
||||||
thumb_func_start sub_80B072C
|
thumb_func_start BattleSetup_StartRoamerBattle
|
||||||
sub_80B072C: @ 80B072C
|
BattleSetup_StartRoamerBattle: @ 80B072C
|
||||||
push {lr}
|
push {lr}
|
||||||
bl ScriptContext2_Enable
|
bl ScriptContext2_Enable
|
||||||
bl player_bitmagic
|
bl player_bitmagic
|
||||||
@ -174,7 +174,7 @@ sub_80B072C: @ 80B072C
|
|||||||
pop {r0}
|
pop {r0}
|
||||||
bx r0
|
bx r0
|
||||||
.pool
|
.pool
|
||||||
thumb_func_end sub_80B072C
|
thumb_func_end BattleSetup_StartRoamerBattle
|
||||||
|
|
||||||
thumb_func_start sub_80B077C
|
thumb_func_start sub_80B077C
|
||||||
sub_80B077C: @ 80B077C
|
sub_80B077C: @ 80B077C
|
||||||
|
@ -1246,7 +1246,7 @@ sub_809C8DC: @ 809C8DC
|
|||||||
lsrs r0, 24
|
lsrs r0, 24
|
||||||
cmp r0, 0x1
|
cmp r0, 0x1
|
||||||
beq _0809C92E
|
beq _0809C92E
|
||||||
bl sub_80B5870
|
bl UpdateRepelCounter
|
||||||
lsls r0, 24
|
lsls r0, 24
|
||||||
lsrs r0, 24
|
lsrs r0, 24
|
||||||
cmp r0, 0x1
|
cmp r0, 0x1
|
||||||
@ -1607,7 +1607,7 @@ _0809CC0C:
|
|||||||
ldr r5, =gUnknown_020375D6
|
ldr r5, =gUnknown_020375D6
|
||||||
ldrh r1, [r5]
|
ldrh r1, [r5]
|
||||||
adds r0, r4, 0
|
adds r0, r4, 0
|
||||||
bl is_it_battle_time_2
|
bl StandardWildEncounter
|
||||||
lsls r0, 24
|
lsls r0, 24
|
||||||
lsrs r0, 24
|
lsrs r0, 24
|
||||||
cmp r0, 0x1
|
cmp r0, 0x1
|
||||||
|
@ -4316,7 +4316,7 @@ fish5: @ 808CABC
|
|||||||
adds r0, 0x1
|
adds r0, 0x1
|
||||||
strh r0, [r5, 0x8]
|
strh r0, [r5, 0x8]
|
||||||
movs r6, 0
|
movs r6, 0
|
||||||
bl GetFishingWildMonListHeader
|
bl DoesCurrentMapHaveFishingMons
|
||||||
lsls r0, 24
|
lsls r0, 24
|
||||||
cmp r0, 0
|
cmp r0, 0
|
||||||
bne _0808CADC
|
bne _0808CADC
|
||||||
@ -4640,7 +4640,7 @@ _0808CD58:
|
|||||||
ldrh r0, [r5, 0x26]
|
ldrh r0, [r5, 0x26]
|
||||||
lsls r0, 24
|
lsls r0, 24
|
||||||
lsrs r0, 24
|
lsrs r0, 24
|
||||||
bl sub_80B5734
|
bl FishingWildEncounter
|
||||||
movs r0, 0x1
|
movs r0, 0x1
|
||||||
bl sub_80ED950
|
bl sub_80ED950
|
||||||
ldr r0, =Task_Fish
|
ldr r0, =Task_Fish
|
||||||
|
@ -704,7 +704,7 @@ sub_817A1C4: @ 817A1C4
|
|||||||
lsls r0, 24
|
lsls r0, 24
|
||||||
lsrs r0, 24
|
lsrs r0, 24
|
||||||
adds r1, r4, 0
|
adds r1, r4, 0
|
||||||
bl sub_8136FE4
|
bl PokeblockGetGain
|
||||||
ldr r6, =gUnknown_0203BC9E
|
ldr r6, =gUnknown_0203BC9E
|
||||||
strh r0, [r6]
|
strh r0, [r6]
|
||||||
ldr r1, =gStringVar1
|
ldr r1, =gStringVar1
|
||||||
|
@ -2675,12 +2675,12 @@ sub_8085B2C: @ 8085B2C
|
|||||||
ldr r1, =gUnknown_02032306
|
ldr r1, =gUnknown_02032306
|
||||||
movs r0, 0x1
|
movs r0, 0x1
|
||||||
strb r0, [r1]
|
strb r0, [r1]
|
||||||
bl sub_80B582C
|
bl GetLocalWaterMon
|
||||||
b _08085B62
|
b _08085B62
|
||||||
.pool
|
.pool
|
||||||
_08085B5C:
|
_08085B5C:
|
||||||
ldr r0, =gUnknown_02032306
|
ldr r0, =gUnknown_02032306
|
||||||
bl wild_pokemon_rand_for_map
|
bl GetLocalWildMon
|
||||||
_08085B62:
|
_08085B62:
|
||||||
ldr r1, =gUnknown_02032304
|
ldr r1, =gUnknown_02032304
|
||||||
strh r0, [r1]
|
strh r0, [r1]
|
||||||
|
10
asm/rom6.s
10
asm/rom6.s
@ -2779,7 +2779,7 @@ sub_8136C8C: @ 8136C8C
|
|||||||
adds r2, r6
|
adds r2, r6
|
||||||
ldr r1, [r5]
|
ldr r1, [r5]
|
||||||
adds r1, r2
|
adds r1, r2
|
||||||
bl sub_8136FE4
|
bl PokeblockGetGain
|
||||||
adds r4, r0, 0
|
adds r4, r0, 0
|
||||||
lsls r4, 16
|
lsls r4, 16
|
||||||
lsrs r4, 16
|
lsrs r4, 16
|
||||||
@ -3177,8 +3177,8 @@ _08136FDE:
|
|||||||
bx r1
|
bx r1
|
||||||
thumb_func_end sub_8136F9C
|
thumb_func_end sub_8136F9C
|
||||||
|
|
||||||
thumb_func_start sub_8136FE4
|
thumb_func_start PokeblockGetGain
|
||||||
sub_8136FE4: @ 8136FE4
|
PokeblockGetGain: @ 8136FE4
|
||||||
push {r4-r7,lr}
|
push {r4-r7,lr}
|
||||||
mov r7, r9
|
mov r7, r9
|
||||||
mov r6, r8
|
mov r6, r8
|
||||||
@ -3227,7 +3227,7 @@ _0813702A:
|
|||||||
pop {r1}
|
pop {r1}
|
||||||
bx r1
|
bx r1
|
||||||
.pool
|
.pool
|
||||||
thumb_func_end sub_8136FE4
|
thumb_func_end PokeblockGetGain
|
||||||
|
|
||||||
thumb_func_start sub_8137044
|
thumb_func_start sub_8137044
|
||||||
sub_8137044: @ 8137044
|
sub_8137044: @ 8137044
|
||||||
@ -3261,7 +3261,7 @@ _08137074:
|
|||||||
ldr r0, =gUnknown_085B2720
|
ldr r0, =gUnknown_085B2720
|
||||||
adds r1, r0
|
adds r1, r0
|
||||||
adds r0, r5, 0
|
adds r0, r5, 0
|
||||||
bl sub_8136FE4
|
bl PokeblockGetGain
|
||||||
lsls r0, 16
|
lsls r0, 16
|
||||||
cmp r0, 0
|
cmp r0, 0
|
||||||
ble _081370A0
|
ble _081370A0
|
||||||
|
2353
asm/wild_encounter.s
2353
asm/wild_encounter.s
File diff suppressed because it is too large
Load Diff
@ -80,7 +80,7 @@
|
|||||||
.equiv FLAG_0x050, 0x50
|
.equiv FLAG_0x050, 0x50
|
||||||
.equiv FLAG_0x051, 0x51
|
.equiv FLAG_0x051, 0x51
|
||||||
.equiv FLAG_0x052, 0x52
|
.equiv FLAG_0x052, 0x52
|
||||||
.equiv FLAG_0x053, 0x53
|
.equiv FLAG_LEGENDARIES_IN_SOOTOPOLIS, 0x53
|
||||||
.equiv FLAG_0x054, 0x54
|
.equiv FLAG_0x054, 0x54
|
||||||
.equiv FLAG_0x055, 0x55
|
.equiv FLAG_0x055, 0x55
|
||||||
.equiv FLAG_0x056, 0x56
|
.equiv FLAG_0x056, 0x56
|
||||||
|
@ -60,7 +60,7 @@
|
|||||||
.equiv VAR_0x403B, 0x403B
|
.equiv VAR_0x403B, 0x403B
|
||||||
.equiv VAR_0x403C, 0x403C
|
.equiv VAR_0x403C, 0x403C
|
||||||
.equiv VAR_0x403D, 0x403D
|
.equiv VAR_0x403D, 0x403D
|
||||||
.equiv VAR_0x403E, 0x403E
|
.equiv VAR_ALTERING_CAVE_WILD_SET, 0x403E
|
||||||
.equiv VAR_0x403F, 0x403F
|
.equiv VAR_0x403F, 0x403F
|
||||||
.equiv VAR_DAYS, 0x4040
|
.equiv VAR_DAYS, 0x4040
|
||||||
.equiv VAR_0x4041, 0x4041
|
.equiv VAR_0x4041, 0x4041
|
||||||
|
@ -116,7 +116,7 @@ Route111_EventScript_2907FB:: @ 82907FB
|
|||||||
specialvar VAR_RESULT, sub_81393FC
|
specialvar VAR_RESULT, sub_81393FC
|
||||||
compare_var_to_value VAR_RESULT, 1
|
compare_var_to_value VAR_RESULT, 1
|
||||||
goto_eq Route111_EventScript_290829
|
goto_eq Route111_EventScript_290829
|
||||||
special rock_smash_wild_pokemon_encounter
|
special RockSmashWildEncounter
|
||||||
compare_var_to_value VAR_RESULT, 0
|
compare_var_to_value VAR_RESULT, 0
|
||||||
goto_eq Route111_EventScript_290829
|
goto_eq Route111_EventScript_290829
|
||||||
waitstate
|
waitstate
|
||||||
|
@ -127,7 +127,7 @@ SeafloorCavern_Room9_EventScript_234DC9:: @ 8234DC9
|
|||||||
clearflag FLAG_0x3E6
|
clearflag FLAG_0x3E6
|
||||||
clearflag FLAG_0x3E5
|
clearflag FLAG_0x3E5
|
||||||
setflag FLAG_0x347
|
setflag FLAG_0x347
|
||||||
setflag FLAG_0x053
|
setflag FLAG_LEGENDARIES_IN_SOOTOPOLIS
|
||||||
clearflag FLAG_0x3B0
|
clearflag FLAG_0x3B0
|
||||||
clearflag FLAG_0x3B1
|
clearflag FLAG_0x3B1
|
||||||
setflag FLAG_SYS_WEATHER_CTRL
|
setflag FLAG_SYS_WEATHER_CTRL
|
||||||
|
@ -545,7 +545,7 @@ SootopolisCity_EventScript_1E5C1E:: @ 81E5C1E
|
|||||||
waitstate
|
waitstate
|
||||||
clearflag FLAG_SYS_WEATHER_CTRL
|
clearflag FLAG_SYS_WEATHER_CTRL
|
||||||
setvar VAR_0x40CA, 3
|
setvar VAR_0x40CA, 3
|
||||||
clearflag FLAG_0x053
|
clearflag FLAG_LEGENDARIES_IN_SOOTOPOLIS
|
||||||
fadenewbgm BGM_RUNECITY
|
fadenewbgm BGM_RUNECITY
|
||||||
delay 120
|
delay 120
|
||||||
clearflag FLAG_SPECIAL_FLAG_0x4000
|
clearflag FLAG_SPECIAL_FLAG_0x4000
|
||||||
@ -598,7 +598,7 @@ SootopolisCity_EventScript_1E5CCE:: @ 81E5CCE
|
|||||||
waitstate
|
waitstate
|
||||||
clearflag FLAG_SYS_WEATHER_CTRL
|
clearflag FLAG_SYS_WEATHER_CTRL
|
||||||
setvar VAR_0x40CA, 2
|
setvar VAR_0x40CA, 2
|
||||||
clearflag FLAG_0x053
|
clearflag FLAG_LEGENDARIES_IN_SOOTOPOLIS
|
||||||
fadenewbgm BGM_NAMINORI
|
fadenewbgm BGM_NAMINORI
|
||||||
delay 120
|
delay 120
|
||||||
clearflag FLAG_SPECIAL_FLAG_0x4000
|
clearflag FLAG_SPECIAL_FLAG_0x4000
|
||||||
|
@ -181,7 +181,7 @@ gSpecials:: @ 81DBA64
|
|||||||
def_special sub_813BF60
|
def_special sub_813BF60
|
||||||
def_special sub_813BA60
|
def_special sub_813BA60
|
||||||
def_special sub_813BF7C
|
def_special sub_813BF7C
|
||||||
def_special rock_smash_wild_pokemon_encounter
|
def_special RockSmashWildEncounter
|
||||||
def_special GabbyAndTyGetBattleNum
|
def_special GabbyAndTyGetBattleNum
|
||||||
def_special GabbyAndTyAfterInterview
|
def_special GabbyAndTyAfterInterview
|
||||||
def_special GabbyAndTyBeforeInterview
|
def_special GabbyAndTyBeforeInterview
|
||||||
|
@ -9,14 +9,14 @@
|
|||||||
|
|
||||||
.incbin "baserom.gba", 0x55370c, 0x188
|
.incbin "baserom.gba", 0x55370c, 0x188
|
||||||
|
|
||||||
gUnknown_08553894:: @ 8553894
|
gBattlePyramidWildMonHeaders:: @ 8553894
|
||||||
.incbin "baserom.gba", 0x553894, 0x180
|
.incbin "baserom.gba", 0x553894, 0x180
|
||||||
|
|
||||||
gUnknown_08553A14:: @ 8553A14
|
gBattlePikeWildMonHeaders:: @ 8553A14
|
||||||
.incbin "baserom.gba", 0x553a14, 0x64
|
.incbin "baserom.gba", 0x553a14, 0x64
|
||||||
|
|
||||||
gUnknown_08553A78:: @ 8553A78
|
gWildFeebasRoute119Data:: @ 8553A78
|
||||||
.incbin "baserom.gba", 0x553a78, 0x4
|
.incbin "baserom.gba", 0x553a78, 0x4
|
||||||
|
|
||||||
gUnknown_08553A7C:: @ 8553A7C
|
gRoute119WaterTileData:: @ 8553A7C
|
||||||
.incbin "baserom.gba", 0x553a7c, 0x14
|
.incbin "baserom.gba", 0x553a7c, 0x14
|
||||||
|
@ -4,6 +4,9 @@
|
|||||||
void BattleSetup_StartScriptedWildBattle(void);
|
void BattleSetup_StartScriptedWildBattle(void);
|
||||||
u8 BattleSetup_GetTerrainId(void);
|
u8 BattleSetup_GetTerrainId(void);
|
||||||
u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data);
|
u8 *BattleSetup_ConfigureTrainerBattle(const u8 *data);
|
||||||
|
void BattleSetup_StartBattlePikeWildBattle(void);
|
||||||
|
void BattleSetup_StartWildBattle(void);
|
||||||
|
void BattleSetup_StartRoamerBattle(void);
|
||||||
|
|
||||||
u8 HasTrainerAlreadyBeenFought(u16);
|
u8 HasTrainerAlreadyBeenFought(u16);
|
||||||
void trainer_flag_set(u16);
|
void trainer_flag_set(u16);
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
#ifndef GUARD_FLAGS_H
|
#ifndef GUARD_FLAGS_H
|
||||||
#define GUARD_FLAGS_H
|
#define GUARD_FLAGS_H
|
||||||
|
|
||||||
#define FLAG_PENDING_DAYCARE_EGG 0x86
|
|
||||||
#define FLAG_340 0x340
|
#define FLAG_340 0x340
|
||||||
|
#define FLAG_LEGENDARIES_IN_SOOTOPOLIS 0x53
|
||||||
|
#define FLAG_PENDING_DAYCARE_EGG 0x86
|
||||||
|
|
||||||
#define FLAG_TRAINER_FLAG_START 0x500
|
#define FLAG_TRAINER_FLAG_START 0x500
|
||||||
|
|
||||||
|
@ -238,7 +238,9 @@ struct SaveBlock2
|
|||||||
/*0xCA9*/ u8 field_CA9_d : 1; // 0x20
|
/*0xCA9*/ u8 field_CA9_d : 1; // 0x20
|
||||||
/*0xCA9*/ u8 field_CA9_e : 1; // 0x40
|
/*0xCA9*/ u8 field_CA9_e : 1; // 0x40
|
||||||
/*0xCA9*/ u8 field_CA9_f : 1; // 0x80
|
/*0xCA9*/ u8 field_CA9_f : 1; // 0x80
|
||||||
/*0xCAA*/ u16 field_CAA[0x2e];
|
/*0xCAA*/ u16 field_CAA[4];
|
||||||
|
/*0xCB2*/ u16 battlePyramidWildHeaderId;
|
||||||
|
/*0xCB4*/ u8 field_CB4[82];
|
||||||
/*0xD06*/ u8 field_D06;
|
/*0xD06*/ u8 field_D06;
|
||||||
/*0xD07*/ u8 field_D07;
|
/*0xD07*/ u8 field_D07;
|
||||||
/*0xD08*/ u8 filler_D08[0x112];
|
/*0xD08*/ u8 filler_D08[0x112];
|
||||||
|
@ -180,6 +180,7 @@ void LinkVSync(void);
|
|||||||
void Timer3Intr(void);
|
void Timer3Intr(void);
|
||||||
void SerialCB(void);
|
void SerialCB(void);
|
||||||
u8 GetLinkPlayerCount(void);
|
u8 GetLinkPlayerCount(void);
|
||||||
|
bool32 InUnionRoom(void);
|
||||||
|
|
||||||
void sub_800E0E8(void);
|
void sub_800E0E8(void);
|
||||||
bool8 sub_800A520(void);
|
bool8 sub_800A520(void);
|
||||||
|
@ -22,13 +22,12 @@ enum
|
|||||||
PBLOCK_FEEL,
|
PBLOCK_FEEL,
|
||||||
};
|
};
|
||||||
|
|
||||||
// rom6
|
|
||||||
void ClearPokeblocks(void);
|
void ClearPokeblocks(void);
|
||||||
s8 GetFirstFreePokeblockSlot(void);
|
s8 GetFirstFreePokeblockSlot(void);
|
||||||
|
|
||||||
bool32 AddPokeblock(struct Pokeblock *pokeblock);
|
bool32 AddPokeblock(struct Pokeblock *pokeblock);
|
||||||
u8 GetHighestPokeblocksFlavourLevel(const struct Pokeblock *pokeblock);
|
u8 GetHighestPokeblocksFlavourLevel(const struct Pokeblock *pokeblock);
|
||||||
u8 GetPokeblocksFeel(const struct Pokeblock *pokeblock);
|
u8 GetPokeblocksFeel(const struct Pokeblock *pokeblock);
|
||||||
u8 GetPokeblocksFlavour(const struct Pokeblock *pokeblock);
|
u8 GetPokeblocksFlavour(const struct Pokeblock *pokeblock);
|
||||||
|
s16 PokeblockGetGain(u8, const struct Pokeblock *);
|
||||||
|
|
||||||
#endif // GUARD_POKEBLOCK_H
|
#endif // GUARD_POKEBLOCK_H
|
||||||
|
@ -14,5 +14,6 @@ void sub_80EEA70(void);
|
|||||||
void sub_80F14F8(TVShow *shows);
|
void sub_80F14F8(TVShow *shows);
|
||||||
size_t sub_80EF370(int value);
|
size_t sub_80EF370(int value);
|
||||||
bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unused, u8 sheen, u8 language);
|
bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unused, u8 sheen, u8 language);
|
||||||
|
void SetPokemonAnglerSpecies(u16 species);
|
||||||
|
|
||||||
#endif //GUARD_TV_H
|
#endif //GUARD_TV_H
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#define VAR_RESET_RTC_ENABLE 0x402C
|
#define VAR_RESET_RTC_ENABLE 0x402C
|
||||||
|
|
||||||
#define VAR_0x4037 0x4037
|
#define VAR_0x4037 0x4037
|
||||||
|
#define VAR_ALTERING_CAVE_WILD_SET 0x403E
|
||||||
#define VAR_DAYS 0x4040
|
#define VAR_DAYS 0x4040
|
||||||
|
|
||||||
#define VAR_DEPT_STORE_FLOOR 0x4043
|
#define VAR_DEPT_STORE_FLOOR 0x4043
|
||||||
|
44
include/wild_encounter.h
Normal file
44
include/wild_encounter.h
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#ifndef GUARD_WILD_ENCOUNTER_H
|
||||||
|
#define GUARD_WILD_ENCOUNTER_H
|
||||||
|
|
||||||
|
#define LAND_WILD_COUNT 12
|
||||||
|
#define WATER_WILD_COUNT 5
|
||||||
|
#define ROCK_WILD_COUNT 5
|
||||||
|
#define FISH_WILD_COUNT 10
|
||||||
|
|
||||||
|
struct WildPokemon
|
||||||
|
{
|
||||||
|
u8 minLevel;
|
||||||
|
u8 maxLevel;
|
||||||
|
u16 species;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WildPokemonInfo
|
||||||
|
{
|
||||||
|
u8 encounterRate;
|
||||||
|
const struct WildPokemon *wildPokemon;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WildPokemonHeader
|
||||||
|
{
|
||||||
|
u8 mapGroup;
|
||||||
|
u8 mapNum;
|
||||||
|
const struct WildPokemonInfo *landMonsInfo;
|
||||||
|
const struct WildPokemonInfo *waterMonsInfo;
|
||||||
|
const struct WildPokemonInfo *rockSmashMonsInfo;
|
||||||
|
const struct WildPokemonInfo *fishingMonsInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern const struct WildPokemonHeader gWildMonHeaders[];
|
||||||
|
|
||||||
|
void DisableWildEncounters(bool8 disabled);
|
||||||
|
bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior);
|
||||||
|
void ScrSpecial_RockSmashWildEncounter(void);
|
||||||
|
bool8 SweetScentWildEncounter(void);
|
||||||
|
bool8 DoesCurrentMapHaveFishingMons(void);
|
||||||
|
void FishingWildEncounter(u8 rod);
|
||||||
|
u16 GetLocalWildMon(bool8 *isWaterMon);
|
||||||
|
u16 GetLocalWaterMon(void);
|
||||||
|
bool8 UpdateRepelCounter(void);
|
||||||
|
|
||||||
|
#endif // GUARD_WILD_ENCOUNTER_H
|
@ -123,7 +123,7 @@ SECTIONS {
|
|||||||
asm/battle_setup.o(.text);
|
asm/battle_setup.o(.text);
|
||||||
asm/cable_club.o(.text);
|
asm/cable_club.o(.text);
|
||||||
asm/trainer_see.o(.text);
|
asm/trainer_see.o(.text);
|
||||||
asm/wild_encounter.o(.text);
|
src/wild_encounter.o(.text);
|
||||||
asm/field_effect.o(.text);
|
asm/field_effect.o(.text);
|
||||||
asm/unknown_task.o(.text);
|
asm/unknown_task.o(.text);
|
||||||
asm/option_menu.o(.text);
|
asm/option_menu.o(.text);
|
||||||
|
2
src/tv.c
2
src/tv.c
@ -1883,7 +1883,7 @@ void PutFishingAdviceShowOnTheAir(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sub_80EDA3C(u16 species)
|
void SetPokemonAnglerSpecies(u16 species)
|
||||||
{
|
{
|
||||||
sPokemonAnglerSpecies = species;
|
sPokemonAnglerSpecies = species;
|
||||||
}
|
}
|
||||||
|
933
src/wild_encounter.c
Normal file
933
src/wild_encounter.c
Normal file
@ -0,0 +1,933 @@
|
|||||||
|
#include "global.h"
|
||||||
|
#include "wild_encounter.h"
|
||||||
|
#include "pokemon.h"
|
||||||
|
#include "species.h"
|
||||||
|
#include "metatile_behavior.h"
|
||||||
|
#include "fieldmap.h"
|
||||||
|
#include "rng.h"
|
||||||
|
#include "map_constants.h"
|
||||||
|
#include "field_player_avatar.h"
|
||||||
|
#include "abilities.h"
|
||||||
|
#include "event_data.h"
|
||||||
|
#include "safari_zone.h"
|
||||||
|
#include "pokeblock.h"
|
||||||
|
#include "battle_setup.h"
|
||||||
|
#include "roamer.h"
|
||||||
|
#include "game_stat.h"
|
||||||
|
#include "tv.h"
|
||||||
|
#include "link.h"
|
||||||
|
#include "script.h"
|
||||||
|
#include "items.h"
|
||||||
|
|
||||||
|
extern const u8 EventScript_RepelWoreOff[];
|
||||||
|
|
||||||
|
#define NUM_FEEBAS_SPOTS 6
|
||||||
|
|
||||||
|
extern const u16 gRoute119WaterTileData[];
|
||||||
|
extern const struct WildPokemonHeader gBattlePikeWildMonHeaders[];
|
||||||
|
extern const struct WildPokemonHeader gBattlePyramidWildMonHeaders[];
|
||||||
|
extern const struct WildPokemon gWildFeebasRoute119Data;
|
||||||
|
|
||||||
|
extern u8 GetBattlePikeWildMonHeaderId(void);
|
||||||
|
extern bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate);
|
||||||
|
extern void GenerateBattlePyramidWildMon(void);
|
||||||
|
extern bool8 InBattlePike(void);
|
||||||
|
extern bool8 InBattlePyramid(void);
|
||||||
|
|
||||||
|
// this file's functions
|
||||||
|
static u16 FeebasRandom(void);
|
||||||
|
static void FeebasSeedRng(u16 seed);
|
||||||
|
static bool8 IsWildLevelAllowedByRepel(u8 level);
|
||||||
|
static void ApplyFluteEncounterRateMod(u32 *encRate);
|
||||||
|
static void ApplyCleanseTagEncounterRateMod(u32 *encRate);
|
||||||
|
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex);
|
||||||
|
static bool8 IsAbilityAllowingEncounter(u8 level);
|
||||||
|
|
||||||
|
EWRAM_DATA u8 sWildEncountersDisabled = 0;
|
||||||
|
EWRAM_DATA u32 sFeebasRngValue = 0;
|
||||||
|
|
||||||
|
void DisableWildEncounters(bool8 disabled)
|
||||||
|
{
|
||||||
|
sWildEncountersDisabled = disabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u16 GetRoute119WaterTileNum(s16 x, s16 y, u8 section)
|
||||||
|
{
|
||||||
|
u16 xCur;
|
||||||
|
u16 yCur;
|
||||||
|
u16 yMin = gRoute119WaterTileData[section * 3 + 0];
|
||||||
|
u16 yMax = gRoute119WaterTileData[section * 3 + 1];
|
||||||
|
u16 tileNum = gRoute119WaterTileData[section * 3 + 2];
|
||||||
|
|
||||||
|
for (yCur = yMin; yCur <= yMax; yCur++)
|
||||||
|
{
|
||||||
|
for (xCur = 0; xCur < gMapHeader.mapData->width; xCur++)
|
||||||
|
{
|
||||||
|
u8 tileBehaviorId = MapGridGetMetatileBehaviorAt(xCur + 7, yCur + 7);
|
||||||
|
if (MetatileBehavior_IsSurfableAndNotWaterfall(tileBehaviorId) == TRUE)
|
||||||
|
{
|
||||||
|
tileNum++;
|
||||||
|
if (x == xCur && y == yCur)
|
||||||
|
return tileNum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tileNum + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 CheckFeebas(void)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
u16 feebasSpots[NUM_FEEBAS_SPOTS];
|
||||||
|
s16 x;
|
||||||
|
s16 y;
|
||||||
|
u8 route119Section = 0;
|
||||||
|
u16 waterTileNum;
|
||||||
|
|
||||||
|
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ROUTE119
|
||||||
|
&& gSaveBlock1Ptr->location.mapNum == MAP_ID_ROUTE119)
|
||||||
|
{
|
||||||
|
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
||||||
|
x -= 7;
|
||||||
|
y -= 7;
|
||||||
|
|
||||||
|
#ifdef NONMATCHING
|
||||||
|
if (y >= gRoute119WaterTileData[3 * 1 + 0] && y <= gRoute119WaterTileData[3 * 1 + 1])
|
||||||
|
route119Section = 1;
|
||||||
|
if (y >= gRoute119WaterTileData[3 * 2 + 0] && y <= gRoute119WaterTileData[3 * 2 + 1])
|
||||||
|
route119Section = 2;
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
register const u16 *arr asm("r0");
|
||||||
|
if (y >= (arr = gRoute119WaterTileData)[3 * 1 + 0] && y <= arr[3 * 1 + 1])
|
||||||
|
route119Section = 1;
|
||||||
|
if (y >= arr[3 * 2 + 0] && y <= arr[3 * 2 + 1])
|
||||||
|
route119Section = 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (Random() % 100 > 49) // 50% chance of encountering Feebas
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
FeebasSeedRng(gSaveBlock1Ptr->easyChatPairs[0].unk2);
|
||||||
|
for (i = 0; i != NUM_FEEBAS_SPOTS;)
|
||||||
|
{
|
||||||
|
feebasSpots[i] = FeebasRandom() % 447;
|
||||||
|
if (feebasSpots[i] == 0)
|
||||||
|
feebasSpots[i] = 447;
|
||||||
|
if (feebasSpots[i] < 1 || feebasSpots[i] >= 4)
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
waterTileNum = GetRoute119WaterTileNum(x, y, route119Section);
|
||||||
|
for (i = 0; i < NUM_FEEBAS_SPOTS; i++)
|
||||||
|
{
|
||||||
|
if (waterTileNum == feebasSpots[i])
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The number 1103515245 comes from the example implementation of rand and srand
|
||||||
|
// in the ISO C standard.
|
||||||
|
|
||||||
|
static u16 FeebasRandom(void)
|
||||||
|
{
|
||||||
|
sFeebasRngValue = (1103515245 * sFeebasRngValue) + 12345;
|
||||||
|
return sFeebasRngValue >> 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void FeebasSeedRng(u16 seed)
|
||||||
|
{
|
||||||
|
sFeebasRngValue = seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 ChooseWildMonIndex_Land(void)
|
||||||
|
{
|
||||||
|
u8 rand = Random() % 100;
|
||||||
|
|
||||||
|
if (rand < 20) // 20% chance
|
||||||
|
return 0;
|
||||||
|
else if (rand >= 20 && rand < 40) // 20% chance
|
||||||
|
return 1;
|
||||||
|
else if (rand >= 40 && rand < 50) // 10% chance
|
||||||
|
return 2;
|
||||||
|
else if (rand >= 50 && rand < 60) // 10% chance
|
||||||
|
return 3;
|
||||||
|
else if (rand >= 60 && rand < 70) // 10% chance
|
||||||
|
return 4;
|
||||||
|
else if (rand >= 70 && rand < 80) // 10% chance
|
||||||
|
return 5;
|
||||||
|
else if (rand >= 80 && rand < 85) // 5% chance
|
||||||
|
return 6;
|
||||||
|
else if (rand >= 85 && rand < 90) // 5% chance
|
||||||
|
return 7;
|
||||||
|
else if (rand >= 90 && rand < 94) // 4% chance
|
||||||
|
return 8;
|
||||||
|
else if (rand >= 94 && rand < 98) // 4% chance
|
||||||
|
return 9;
|
||||||
|
else if (rand == 98) // 1% chance
|
||||||
|
return 10;
|
||||||
|
else // 1% chance
|
||||||
|
return 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 ChooseWildMonIndex_WaterRock(void)
|
||||||
|
{
|
||||||
|
u8 rand = Random() % 100;
|
||||||
|
|
||||||
|
if (rand < 60) // 60% chance
|
||||||
|
return 0;
|
||||||
|
else if (rand >= 60 && rand < 90) // 30% chance
|
||||||
|
return 1;
|
||||||
|
else if (rand >= 90 && rand < 95) // 5% chance
|
||||||
|
return 2;
|
||||||
|
else if (rand >= 95 && rand < 99) // 4% chance
|
||||||
|
return 3;
|
||||||
|
else // 1% chance
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
OLD_ROD,
|
||||||
|
GOOD_ROD,
|
||||||
|
SUPER_ROD
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 ChooseWildMonIndex_Fishing(u8 rod)
|
||||||
|
{
|
||||||
|
u8 wildMonIndex = 0;
|
||||||
|
u8 rand = Random() % 100;
|
||||||
|
|
||||||
|
switch (rod)
|
||||||
|
{
|
||||||
|
case OLD_ROD:
|
||||||
|
if (rand < 70) // 70% chance
|
||||||
|
wildMonIndex = 0;
|
||||||
|
else // 30% chance
|
||||||
|
wildMonIndex = 1;
|
||||||
|
break;
|
||||||
|
case GOOD_ROD:
|
||||||
|
if (rand < 60) // 60% chance
|
||||||
|
wildMonIndex = 2;
|
||||||
|
if (rand >= 60 && rand < 80) // 20% chance
|
||||||
|
wildMonIndex = 3;
|
||||||
|
if (rand >= 80 && rand < 100) // 20% chance
|
||||||
|
wildMonIndex = 4;
|
||||||
|
break;
|
||||||
|
case SUPER_ROD:
|
||||||
|
if (rand < 40) // 40% chance
|
||||||
|
wildMonIndex = 5;
|
||||||
|
if (rand >= 40 && rand < 80) // 40% chance
|
||||||
|
wildMonIndex = 6;
|
||||||
|
if (rand >= 80 && rand < 95) // 15% chance
|
||||||
|
wildMonIndex = 7;
|
||||||
|
if (rand >= 95 && rand < 99) // 4% chance
|
||||||
|
wildMonIndex = 8;
|
||||||
|
if (rand == 99) // 1% chance
|
||||||
|
wildMonIndex = 9;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return wildMonIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon)
|
||||||
|
{
|
||||||
|
u8 min;
|
||||||
|
u8 max;
|
||||||
|
u8 range;
|
||||||
|
u8 rand;
|
||||||
|
|
||||||
|
// Make sure minimum level is less than maximum level
|
||||||
|
if (wildPokemon->maxLevel >= wildPokemon->minLevel)
|
||||||
|
{
|
||||||
|
min = wildPokemon->minLevel;
|
||||||
|
max = wildPokemon->maxLevel;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
min = wildPokemon->maxLevel;
|
||||||
|
max = wildPokemon->minLevel;
|
||||||
|
}
|
||||||
|
range = max - min + 1;
|
||||||
|
rand = Random() % range;
|
||||||
|
|
||||||
|
// check ability for max level mon
|
||||||
|
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
|
||||||
|
{
|
||||||
|
u8 ability = GetMonAbility(&gPlayerParty[0]);
|
||||||
|
if (ability == ABILITY_HUSTLE || ability == ABILITY_VITAL_SPIRIT || ability == ABILITY_PRESSURE)
|
||||||
|
{
|
||||||
|
if (Random() % 2 == 0)
|
||||||
|
return max;
|
||||||
|
|
||||||
|
if (rand != 0)
|
||||||
|
rand--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return min + rand;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u16 GetCurrentMapWildMonHeaderId(void)
|
||||||
|
{
|
||||||
|
u16 i;
|
||||||
|
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
{
|
||||||
|
const struct WildPokemonHeader *wildHeader = &gWildMonHeaders[i];
|
||||||
|
if (wildHeader->mapGroup == 0xFF)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup &&
|
||||||
|
gWildMonHeaders[i].mapNum == gSaveBlock1Ptr->location.mapNum)
|
||||||
|
{
|
||||||
|
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP_ALTERING_CAVE &&
|
||||||
|
gSaveBlock1Ptr->location.mapNum == MAP_ID_ALTERING_CAVE)
|
||||||
|
{
|
||||||
|
u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET);
|
||||||
|
if (alteringCaveId > 8)
|
||||||
|
alteringCaveId = 0;
|
||||||
|
|
||||||
|
i += alteringCaveId;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 PickWildMonNature(void)
|
||||||
|
{
|
||||||
|
u8 i;
|
||||||
|
u8 j;
|
||||||
|
struct Pokeblock *safariPokeblock;
|
||||||
|
u8 natures[25];
|
||||||
|
|
||||||
|
if (GetSafariZoneFlag() == TRUE && Random() % 100 < 80)
|
||||||
|
{
|
||||||
|
safariPokeblock = SafariZoneGetActivePokeblock();
|
||||||
|
if (safariPokeblock != NULL)
|
||||||
|
{
|
||||||
|
for (i = 0; i < 25; i++)
|
||||||
|
natures[i] = i;
|
||||||
|
for (i = 0; i < 24; i++)
|
||||||
|
{
|
||||||
|
for (j = i + 1; j < 25; j++)
|
||||||
|
{
|
||||||
|
if (Random() & 1)
|
||||||
|
{
|
||||||
|
u8 temp = natures[i];
|
||||||
|
|
||||||
|
natures[i] = natures[j];
|
||||||
|
natures[j] = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < 25; i++)
|
||||||
|
{
|
||||||
|
if (PokeblockGetGain(natures[i], safariPokeblock) > 0)
|
||||||
|
return natures[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check synchronize for a pokemon with the same ability
|
||||||
|
if (!GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)
|
||||||
|
&& GetMonAbility(&gPlayerParty[0]) == ABILITY_SYNCHRONIZE
|
||||||
|
&& Random() % 2 == 0)
|
||||||
|
{
|
||||||
|
return GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY) % 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
// random nature
|
||||||
|
return Random() % 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CreateWildMon(u16 species, u8 level)
|
||||||
|
{
|
||||||
|
bool32 checkCuteCharm;
|
||||||
|
|
||||||
|
ZeroEnemyPartyMons();
|
||||||
|
checkCuteCharm = TRUE;
|
||||||
|
|
||||||
|
switch (gBaseStats[species].genderRatio)
|
||||||
|
{
|
||||||
|
case MON_MALE:
|
||||||
|
case MON_FEMALE:
|
||||||
|
case MON_GENDERLESS:
|
||||||
|
checkCuteCharm = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkCuteCharm
|
||||||
|
&& !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3)
|
||||||
|
&& GetMonAbility(&gPlayerParty[0]) == ABILITY_CUTE_CHARM
|
||||||
|
&& Random() % 3 != 0)
|
||||||
|
{
|
||||||
|
u16 leadingMonSpecies = GetMonData(&gPlayerParty[0], MON_DATA_SPECIES);
|
||||||
|
u32 leadingMonPersonality = GetMonData(&gPlayerParty[0], MON_DATA_PERSONALITY);
|
||||||
|
u8 gender = GetGenderFromSpeciesAndPersonality(leadingMonSpecies, leadingMonPersonality);
|
||||||
|
|
||||||
|
// misses mon is genderless check, although no genderless mon can have cute charm as ability
|
||||||
|
if (gender == MON_FEMALE)
|
||||||
|
gender = MON_MALE;
|
||||||
|
else
|
||||||
|
gender = MON_FEMALE;
|
||||||
|
|
||||||
|
CreateMonWithGenderNatureLetter(&gEnemyParty[0], species, level, 32, gender, PickWildMonNature(), 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateMonWithNature(&gEnemyParty[0], species, level, 32, PickWildMonNature());
|
||||||
|
}
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
WILD_AREA_LAND,
|
||||||
|
WILD_AREA_WATER,
|
||||||
|
WILD_AREA_ROCKS,
|
||||||
|
WILD_AREA_FISHING,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define WILD_CHECK_REPEL 0x1
|
||||||
|
#define WILD_CHECK_KEEN_EYE 0x2
|
||||||
|
|
||||||
|
static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 area, u8 flags)
|
||||||
|
{
|
||||||
|
u8 wildMonIndex = 0;
|
||||||
|
u8 level;
|
||||||
|
|
||||||
|
switch (area)
|
||||||
|
{
|
||||||
|
case WILD_AREA_LAND:
|
||||||
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex))
|
||||||
|
break;
|
||||||
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex))
|
||||||
|
break;
|
||||||
|
|
||||||
|
wildMonIndex = ChooseWildMonIndex_Land();
|
||||||
|
break;
|
||||||
|
case WILD_AREA_WATER:
|
||||||
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex))
|
||||||
|
break;
|
||||||
|
|
||||||
|
wildMonIndex = ChooseWildMonIndex_WaterRock();
|
||||||
|
break;
|
||||||
|
case WILD_AREA_ROCKS:
|
||||||
|
wildMonIndex = ChooseWildMonIndex_WaterRock();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
|
||||||
|
if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level))
|
||||||
|
return FALSE;
|
||||||
|
if (gMapHeader.mapDataId != 0x166 && flags & WILD_CHECK_KEEN_EYE && !IsAbilityAllowingEncounter(level))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u16 GenerateFishingWildMon(const struct WildPokemonInfo *wildMonInfo, u8 rod)
|
||||||
|
{
|
||||||
|
u8 wildMonIndex = ChooseWildMonIndex_Fishing(rod);
|
||||||
|
u8 level = ChooseWildMonLevel(&wildMonInfo->wildPokemon[wildMonIndex]);
|
||||||
|
|
||||||
|
CreateWildMon(wildMonInfo->wildPokemon[wildMonIndex].species, level);
|
||||||
|
return wildMonInfo->wildPokemon[wildMonIndex].species;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 SetUpMassOutbreakEncounter(u8 flags)
|
||||||
|
{
|
||||||
|
u16 i;
|
||||||
|
|
||||||
|
if (flags & WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(gSaveBlock1Ptr->outbreakPokemonLevel))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
CreateWildMon(gSaveBlock1Ptr->outbreakPokemonSpecies, gSaveBlock1Ptr->outbreakPokemonLevel);
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
SetMonMoveSlot(&gEnemyParty[0], gSaveBlock1Ptr->outbreakPokemonMoves[i], i);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 DoMassOutbreakEncounterTest(void)
|
||||||
|
{
|
||||||
|
if (gSaveBlock1Ptr->outbreakPokemonSpecies != 0
|
||||||
|
&& gSaveBlock1Ptr->location.mapNum == gSaveBlock1Ptr->outbreakLocationMapNum
|
||||||
|
&& gSaveBlock1Ptr->location.mapGroup == gSaveBlock1Ptr->outbreakLocationMapGroup)
|
||||||
|
{
|
||||||
|
if (Random() % 100 < gSaveBlock1Ptr->outbreakPokemonProbability)
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate)
|
||||||
|
{
|
||||||
|
if (Random() % 2880 < encounterRate)
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
ApplyFluteEncounterRateMod(&encounterRate);
|
||||||
|
ApplyCleanseTagEncounterRateMod(&encounterRate);
|
||||||
|
if (!ignoreAbility && !GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
|
||||||
|
{
|
||||||
|
u32 ability = GetMonAbility(&gPlayerParty[0]);
|
||||||
|
|
||||||
|
if (ability == ABILITY_STENCH && gMapHeader.mapDataId == 0x169)
|
||||||
|
encounterRate = encounterRate * 3 / 4;
|
||||||
|
else if (ability == ABILITY_STENCH)
|
||||||
|
encounterRate /= 2;
|
||||||
|
else if (ability == ABILITY_ILLUMINATE)
|
||||||
|
encounterRate *= 2;
|
||||||
|
else if (ability == ABILITY_WHITE_SMOKE)
|
||||||
|
encounterRate /= 2;
|
||||||
|
else if (ability == ABILITY_ARENA_TRAP)
|
||||||
|
encounterRate *= 2;
|
||||||
|
else if (ability == ABILITY_SAND_VEIL && gSaveBlock1Ptr->weather == 8)
|
||||||
|
encounterRate /= 2;
|
||||||
|
}
|
||||||
|
if (encounterRate > 2880)
|
||||||
|
encounterRate = 2880;
|
||||||
|
return DoWildEncounterRateDiceRoll(encounterRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 DoGlobalWildEncounterDiceRoll(void)
|
||||||
|
{
|
||||||
|
if (Random() % 100 >= 60)
|
||||||
|
return FALSE;
|
||||||
|
else
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 AreLegendariesInSootopolisPreventingEncounters(void)
|
||||||
|
{
|
||||||
|
if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP_SOOTOPOLIS_CITY
|
||||||
|
|| gSaveBlock1Ptr->location.mapNum != MAP_ID_SOOTOPOLIS_CITY)
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FlagGet(FLAG_LEGENDARIES_IN_SOOTOPOLIS);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior)
|
||||||
|
{
|
||||||
|
u16 headerId;
|
||||||
|
struct Roamer *roamer;
|
||||||
|
|
||||||
|
if (sWildEncountersDisabled == TRUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
headerId = GetCurrentMapWildMonHeaderId();
|
||||||
|
if (headerId == 0xFFFF) // invalid
|
||||||
|
{
|
||||||
|
if (gMapHeader.mapDataId == 0x166)
|
||||||
|
{
|
||||||
|
headerId = GetBattlePikeWildMonHeaderId();
|
||||||
|
if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
|
||||||
|
return FALSE;
|
||||||
|
else if (DoWildEncounterRateTest(gBattlePikeWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
|
||||||
|
return FALSE;
|
||||||
|
else if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE)
|
||||||
|
return FALSE;
|
||||||
|
else if (!TryGenerateBattlePikeWildMon(TRUE))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
BattleSetup_StartBattlePikeWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (gMapHeader.mapDataId == 0x169)
|
||||||
|
{
|
||||||
|
headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId;
|
||||||
|
if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
|
||||||
|
return FALSE;
|
||||||
|
else if (DoWildEncounterRateTest(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
|
||||||
|
return FALSE;
|
||||||
|
else if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
GenerateBattlePyramidWildMon();
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (MetatileBehavior_IsLandWildEncounter(currMetaTileBehavior) == TRUE)
|
||||||
|
{
|
||||||
|
if (gWildMonHeaders[headerId].landMonsInfo == NULL)
|
||||||
|
return FALSE;
|
||||||
|
else if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
|
||||||
|
return FALSE;
|
||||||
|
else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (TryStartRoamerEncounter() == TRUE)
|
||||||
|
{
|
||||||
|
roamer = &gSaveBlock1Ptr->roamer;
|
||||||
|
if (!IsWildLevelAllowedByRepel(roamer->level))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
BattleSetup_StartRoamerBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
|
||||||
|
{
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// try a regular wild land encounter
|
||||||
|
if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
|
||||||
|
{
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (MetatileBehavior_IsWaterWildEncounter(currMetaTileBehavior) == TRUE
|
||||||
|
|| (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(currMetaTileBehavior) == TRUE))
|
||||||
|
{
|
||||||
|
if (AreLegendariesInSootopolisPreventingEncounters() == TRUE)
|
||||||
|
return FALSE;
|
||||||
|
else if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
|
||||||
|
return FALSE;
|
||||||
|
else if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
|
||||||
|
return FALSE;
|
||||||
|
else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE)
|
||||||
|
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, WILD_AREA_WATER, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
|
||||||
|
{
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RockSmashWildEncounter(void)
|
||||||
|
{
|
||||||
|
u16 headerId = GetCurrentMapWildMonHeaderId();
|
||||||
|
|
||||||
|
if (headerId != 0xFFFF)
|
||||||
|
{
|
||||||
|
const struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerId].rockSmashMonsInfo;
|
||||||
|
|
||||||
|
if (wildPokemonInfo == NULL)
|
||||||
|
{
|
||||||
|
gSpecialVar_Result = FALSE;
|
||||||
|
}
|
||||||
|
else if (DoWildEncounterRateTest(wildPokemonInfo->encounterRate, 1) == TRUE
|
||||||
|
&& TryGenerateWildMon(wildPokemonInfo, 2, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
|
||||||
|
{
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
gSpecialVar_Result = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gSpecialVar_Result = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gSpecialVar_Result = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 SweetScentWildEncounter(void)
|
||||||
|
{
|
||||||
|
s16 x, y;
|
||||||
|
u16 headerId;
|
||||||
|
|
||||||
|
PlayerGetDestCoords(&x, &y);
|
||||||
|
headerId = GetCurrentMapWildMonHeaderId();
|
||||||
|
if (headerId == 0xFFFF) // invalid
|
||||||
|
{
|
||||||
|
if (gMapHeader.mapDataId == 0x166)
|
||||||
|
{
|
||||||
|
headerId = GetBattlePikeWildMonHeaderId();
|
||||||
|
if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
TryGenerateBattlePikeWildMon(FALSE);
|
||||||
|
BattleSetup_StartBattlePikeWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (gMapHeader.mapDataId == 0x169)
|
||||||
|
{
|
||||||
|
headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId;
|
||||||
|
if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
GenerateBattlePyramidWildMon();
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (MetatileBehavior_IsLandWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == TRUE)
|
||||||
|
{
|
||||||
|
if (gWildMonHeaders[headerId].landMonsInfo == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (TryStartRoamerEncounter() == TRUE)
|
||||||
|
{
|
||||||
|
BattleSetup_StartRoamerBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DoMassOutbreakEncounterTest() == TRUE)
|
||||||
|
SetUpMassOutbreakEncounter(0);
|
||||||
|
else
|
||||||
|
TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0);
|
||||||
|
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else if (MetatileBehavior_IsWaterWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == TRUE)
|
||||||
|
{
|
||||||
|
if (AreLegendariesInSootopolisPreventingEncounters() == TRUE)
|
||||||
|
return FALSE;
|
||||||
|
if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (TryStartRoamerEncounter() == TRUE)
|
||||||
|
{
|
||||||
|
BattleSetup_StartRoamerBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, 0);
|
||||||
|
BattleSetup_StartWildBattle();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool8 DoesCurrentMapHaveFishingMons(void)
|
||||||
|
{
|
||||||
|
u16 headerId = GetCurrentMapWildMonHeaderId();
|
||||||
|
|
||||||
|
if (headerId != 0xFFFF && gWildMonHeaders[headerId].fishingMonsInfo != NULL)
|
||||||
|
return TRUE;
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FishingWildEncounter(u8 rod)
|
||||||
|
{
|
||||||
|
u16 species;
|
||||||
|
|
||||||
|
if (CheckFeebas() == TRUE)
|
||||||
|
{
|
||||||
|
u8 level = ChooseWildMonLevel(&gWildFeebasRoute119Data);
|
||||||
|
|
||||||
|
species = gWildFeebasRoute119Data.species;
|
||||||
|
CreateWildMon(species, level);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
species = GenerateFishingWildMon(gWildMonHeaders[GetCurrentMapWildMonHeaderId()].fishingMonsInfo, rod);
|
||||||
|
}
|
||||||
|
IncrementGameStat(GAME_STAT_FISHING_CAPTURES);
|
||||||
|
SetPokemonAnglerSpecies(species);
|
||||||
|
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 (InBattlePike() || InBattlePyramid())
|
||||||
|
return FALSE;
|
||||||
|
if (InUnionRoom() == TRUE)
|
||||||
|
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 bool8 IsAbilityAllowingEncounter(u8 level)
|
||||||
|
{
|
||||||
|
u8 ability;
|
||||||
|
|
||||||
|
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
ability = GetMonAbility(&gPlayerParty[0]);
|
||||||
|
if (ability == ABILITY_KEEN_EYE || ability == ABILITY_INTIMIDATE)
|
||||||
|
{
|
||||||
|
u8 playerMonLevel = GetMonData(&gPlayerParty[0], MON_DATA_LEVEL);
|
||||||
|
if (playerMonLevel > 5 && level <= playerMonLevel - 5 && !(Random() % 2))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 TryGetRandomWildMonIndexByType(const struct WildPokemon *wildMon, u8 type, u8 numMon, u8 *monIndex)
|
||||||
|
{
|
||||||
|
u8 validIndexes[numMon]; // variable length array, an interesting feature
|
||||||
|
u8 i, validMonCount;
|
||||||
|
|
||||||
|
for (i = 0; i < numMon; i++)
|
||||||
|
validIndexes[i] = 0;
|
||||||
|
|
||||||
|
for (validMonCount = 0, i = 0; i < numMon; i++)
|
||||||
|
{
|
||||||
|
if (gBaseStats[wildMon[i].species].type1 == type || gBaseStats[wildMon[i].species].type2 == type)
|
||||||
|
validIndexes[validMonCount++] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validMonCount == 0 || validMonCount == numMon)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
*monIndex = validIndexes[Random() % validMonCount];
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u8 ability, u8 *monIndex)
|
||||||
|
{
|
||||||
|
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_BIT3))
|
||||||
|
return FALSE;
|
||||||
|
else if (GetMonAbility(&gPlayerParty[0]) != ability)
|
||||||
|
return FALSE;
|
||||||
|
else if (Random() % 2 != 0)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TryGetRandomWildMonIndexByType(wildMon, type, LAND_WILD_COUNT, monIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ApplyFluteEncounterRateMod(u32 *encRate)
|
||||||
|
{
|
||||||
|
if (FlagGet(FLAG_SYS_ENC_UP_ITEM) == TRUE)
|
||||||
|
*encRate += *encRate / 2;
|
||||||
|
else if (FlagGet(FLAG_SYS_ENC_DOWN_ITEM) == TRUE)
|
||||||
|
*encRate = *encRate / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ApplyCleanseTagEncounterRateMod(u32 *encRate)
|
||||||
|
{
|
||||||
|
if (GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == ITEM_CLEANSE_TAG)
|
||||||
|
*encRate = *encRate * 2 / 3;
|
||||||
|
}
|
@ -763,11 +763,7 @@ gUnknown_02038BF9: @ 2038BF9
|
|||||||
gUnknown_02038BFC: @ 2038BFC
|
gUnknown_02038BFC: @ 2038BFC
|
||||||
.space 0x4
|
.space 0x4
|
||||||
|
|
||||||
gUnknown_02038C00: @ 2038C00
|
.include "src/wild_encounter.o"
|
||||||
.space 0x4
|
|
||||||
|
|
||||||
gUnknown_02038C04: @ 2038C04
|
|
||||||
.space 0x4
|
|
||||||
|
|
||||||
gFieldEffectArguments: @ 2038C08
|
gFieldEffectArguments: @ 2038C08
|
||||||
.space 0x20
|
.space 0x20
|
||||||
|
Loading…
x
Reference in New Issue
Block a user