summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/itemfinder.s521
-rw-r--r--data/strings.s6
-rw-r--r--include/field_specials.h1
-rw-r--r--include/global.fieldmap.h36
-rw-r--r--include/strings.h5
-rw-r--r--ld_script.txt2
-rw-r--r--src/itemfinder.c204
7 files changed, 241 insertions, 534 deletions
diff --git a/asm/itemfinder.s b/asm/itemfinder.s
index 8a2dec9de..fbf0a8578 100644
--- a/asm/itemfinder.s
+++ b/asm/itemfinder.s
@@ -5,519 +5,6 @@
.text
- thumb_func_start sub_813EC8C
-sub_813EC8C: @ 813EC8C
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- movs r2, 0
- ldr r7, _0813ECE0 @ =gMapHeader
- lsls r1, r4, 2
- adds r0, r1, r4
- lsls r3, r0, 3
- ldr r5, _0813ECE4 @ =gTasks+0x8
- adds r6, r1, 0
- movs r1, 0
-_0813ECA2:
- lsls r0, r2, 1
- adds r0, r3
- adds r0, r5
- strh r1, [r0]
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xF
- bls _0813ECA2
- ldr r0, [r7, 0x4]
- adds r1, r4, 0
- bl sub_813EE14
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _0813ECFC
- bl sub_813F3EC
- ldr r0, _0813ECE8 @ =gTasks
- adds r1, r6, r4
- lsls r1, 3
- adds r1, r0
- movs r2, 0x14
- ldrsh r0, [r1, r2]
- cmp r0, 0x1
- bne _0813ECF0
- ldr r0, _0813ECEC @ =sub_813EDB0
- str r0, [r1]
- b _0813ED08
- .align 2, 0
-_0813ECE0: .4byte gMapHeader
-_0813ECE4: .4byte gTasks+0x8
-_0813ECE8: .4byte gTasks
-_0813ECEC: .4byte sub_813EDB0
-_0813ECF0:
- ldr r0, _0813ECF8 @ =sub_813ED3C
- str r0, [r1]
- b _0813ED08
- .align 2, 0
-_0813ECF8: .4byte sub_813ED3C
-_0813ECFC:
- ldr r2, _0813ED10 @ =gUnknown_8416513
- ldr r3, _0813ED14 @ =sub_813ED18
- adds r0, r4, 0
- movs r1, 0x2
- bl DisplayItemMessageOnField
-_0813ED08:
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0813ED10: .4byte gUnknown_8416513
-_0813ED14: .4byte sub_813ED18
- thumb_func_end sub_813EC8C
-
- thumb_func_start sub_813ED18
-sub_813ED18: @ 813ED18
- push {r4,lr}
- adds r4, r0, 0
- lsls r4, 24
- lsrs r4, 24
- movs r0, 0
- movs r1, 0x1
- bl ClearDialogWindowAndFrame
- bl sub_80696C0
- bl ScriptContext2_Disable
- adds r0, r4, 0
- bl DestroyTask
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_813ED18
-
- thumb_func_start sub_813ED3C
-sub_813ED3C: @ 813ED3C
- push {r4-r7,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r6, r1, 3
- ldr r7, _0813ED80 @ =gTasks+0x8
- adds r4, r6, r7
- movs r1, 0x6
- ldrsh r0, [r4, r1]
- movs r1, 0x19
- bl __modsi3
- lsls r0, 16
- cmp r0, 0
- bne _0813EDA2
- movs r2, 0
- ldrsh r0, [r4, r2]
- movs r2, 0x2
- ldrsh r1, [r4, r2]
- bl GetPlayerDirectionTowardsHiddenItem
- lsls r0, 24
- lsrs r5, r0, 24
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _0813ED88
- adds r0, r7, 0
- subs r0, 0x8
- adds r0, r6, r0
- ldr r1, _0813ED84 @ =sub_813F364
- str r1, [r0]
- b _0813EDA8
- .align 2, 0
-_0813ED80: .4byte gTasks+0x8
-_0813ED84: .4byte sub_813F364
-_0813ED88:
- movs r0, 0x41
- bl PlaySE
- ldrb r0, [r4, 0xA]
- adds r1, r5, 0
- bl sub_813F40C
- ldrh r0, [r4, 0xA]
- adds r0, 0x1
- strh r0, [r4, 0xA]
- ldrh r0, [r4, 0x8]
- subs r0, 0x1
- strh r0, [r4, 0x8]
-_0813EDA2:
- ldrh r0, [r4, 0x6]
- adds r0, 0x1
- strh r0, [r4, 0x6]
-_0813EDA8:
- pop {r4-r7}
- pop {r0}
- bx r0
- thumb_func_end sub_813ED3C
-
- thumb_func_start sub_813EDB0
-sub_813EDB0: @ 813EDB0
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r5, r1, 3
- ldr r6, _0813EDE4 @ =gTasks+0x8
- adds r4, r5, r6
- movs r1, 0x6
- ldrsh r0, [r4, r1]
- movs r1, 0x19
- bl __modsi3
- lsls r0, 16
- cmp r0, 0
- bne _0813EE08
- movs r1, 0x8
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _0813EDEC
- adds r0, r6, 0
- subs r0, 0x8
- adds r0, r5, r0
- ldr r1, _0813EDE8 @ =sub_813F3A8
- str r1, [r0]
- b _0813EE0E
- .align 2, 0
-_0813EDE4: .4byte gTasks+0x8
-_0813EDE8: .4byte sub_813F3A8
-_0813EDEC:
- movs r0, 0x41
- bl PlaySE
- bl sub_813F5AC
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r4, 0xE]
- ldrh r0, [r4, 0xA]
- adds r0, 0x1
- strh r0, [r4, 0xA]
- ldrh r0, [r4, 0x8]
- subs r0, 0x1
- strh r0, [r4, 0x8]
-_0813EE08:
- ldrh r0, [r4, 0x6]
- adds r0, 0x1
- strh r0, [r4, 0x6]
-_0813EE0E:
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_813EDB0
-
- thumb_func_start sub_813EE14
-sub_813EE14: @ 813EE14
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x4
- mov r8, r0
- lsls r1, 24
- lsrs r1, 24
- mov r9, r1
- mov r4, sp
- adds r4, 0x2
- mov r0, sp
- adds r1, r4, 0
- bl PlayerGetDestCoords
- ldr r1, _0813EEC8 @ =gTasks
- mov r2, r9
- lsls r0, r2, 2
- add r0, r9
- lsls r0, 3
- adds r0, r1
- movs r1, 0
- strh r1, [r0, 0xC]
- movs r3, 0
- mov r0, r8
- ldrb r0, [r0, 0x3]
- cmp r3, r0
- bge _0813EF04
-_0813EE4E:
- lsls r3, 16
- asrs r1, r3, 16
- mov r0, r8
- ldr r2, [r0, 0x10]
- lsls r0, r1, 1
- adds r0, r1
- lsls r7, r0, 2
- adds r1, r7, r2
- ldrb r0, [r1, 0x5]
- mov r10, r3
- cmp r0, 0x7
- bne _0813EEF2
- ldr r0, [r1, 0x8]
- movs r1, 0x1
- bl sub_80CC44C
- lsls r0, 16
- lsrs r0, 16
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- bne _0813EEF2
- mov r1, r8
- ldr r2, [r1, 0x10]
- adds r2, r7, r2
- ldrh r0, [r2]
- adds r0, 0x7
- mov r1, sp
- ldrh r1, [r1]
- subs r0, r1
- lsls r0, 16
- lsrs r5, r0, 16
- ldrh r0, [r2, 0x2]
- adds r0, 0x7
- mov r3, sp
- ldrh r1, [r3, 0x2]
- subs r0, r1
- lsls r0, 16
- lsrs r4, r0, 16
- adds r6, r4, 0
- ldr r0, [r2, 0x8]
- movs r1, 0x3
- bl sub_80CC44C
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1
- bne _0813EECC
- cmp r5, 0
- bne _0813EEF2
- cmp r4, 0
- bne _0813EEF2
- mov r1, r8
- ldr r0, [r1, 0x10]
- adds r0, r7, r0
- ldr r1, [r0, 0x8]
- mov r0, r9
- bl sub_813EF40
- b _0813EF2E
- .align 2, 0
-_0813EEC8: .4byte gTasks
-_0813EECC:
- lsls r0, r5, 16
- asrs r1, r0, 16
- movs r2, 0xE0
- lsls r2, 11
- adds r0, r2
- lsrs r0, 16
- cmp r0, 0xE
- bhi _0813EEF2
- lsls r0, r6, 16
- asrs r2, r0, 16
- movs r3, 0x5
- negs r3, r3
- cmp r2, r3
- blt _0813EEF2
- cmp r2, 0x5
- bgt _0813EEF2
- mov r0, r9
- bl sub_813F220
-_0813EEF2:
- movs r0, 0x80
- lsls r0, 9
- add r0, r10
- lsrs r3, r0, 16
- asrs r0, 16
- mov r1, r8
- ldrb r1, [r1, 0x3]
- cmp r0, r1
- blt _0813EE4E
-_0813EF04:
- mov r0, r9
- bl sub_813F108
- ldr r0, _0813EF24 @ =gTasks
- mov r2, r9
- lsls r1, r2, 2
- add r1, r9
- lsls r1, 3
- adds r1, r0
- movs r3, 0xC
- ldrsh r0, [r1, r3]
- cmp r0, 0x1
- beq _0813EF28
- movs r0, 0
- b _0813EF30
- .align 2, 0
-_0813EF24: .4byte gTasks
-_0813EF28:
- mov r0, r9
- bl sub_813EF9C
-_0813EF2E:
- movs r0, 0x1
-_0813EF30:
- add sp, 0x4
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_813EE14
-
- thumb_func_start sub_813EF40
-sub_813EF40: @ 813EF40
- push {r4,r5,lr}
- adds r5, r1, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r4, r0, 2
- adds r4, r0
- lsls r4, 3
- ldr r0, _0813EF8C @ =gTasks+0x8
- adds r4, r0
- adds r0, r5, 0
- movs r1, 0x1
- bl sub_80CC44C
- ldr r1, _0813EF90 @ =gSpecialVar_0x8004
- strh r0, [r1]
- adds r0, r5, 0
- movs r1, 0
- bl sub_80CC44C
- ldr r1, _0813EF94 @ =gSpecialVar_0x8005
- strh r0, [r1]
- ldr r0, _0813EF98 @ =gSpecialVar_0x8006
- movs r5, 0x1
- strh r5, [r0]
- ldrh r1, [r1]
- movs r0, 0
- bl TV_PrintIntToStringVar
- strh r5, [r4, 0x4]
- movs r0, 0
- strh r0, [r4]
- strh r0, [r4, 0x2]
- movs r0, 0x3
- strh r0, [r4, 0x8]
- strh r5, [r4, 0xC]
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0813EF8C: .4byte gTasks+0x8
-_0813EF90: .4byte gSpecialVar_0x8004
-_0813EF94: .4byte gSpecialVar_0x8005
-_0813EF98: .4byte gSpecialVar_0x8006
- thumb_func_end sub_813EF40
-
- thumb_func_start sub_813EF9C
-sub_813EF9C: @ 813EF9C
- push {r4,lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, r0, 2
- adds r1, r0
- lsls r1, 3
- ldr r0, _0813EFEC @ =gTasks+0x8
- adds r1, r0
- ldrh r3, [r1, 0x2]
- ldrh r2, [r1]
- movs r4, 0
- ldrsh r0, [r1, r4]
- cmp r0, 0
- bne _0813EFBC
- cmp r3, 0
- beq _0813EFF8
-_0813EFBC:
- movs r4, 0
- ldrsh r0, [r1, r4]
- cmp r0, 0
- bge _0813EFCA
- negs r0, r0
- lsls r0, 16
- lsrs r2, r0, 16
-_0813EFCA:
- movs r4, 0x2
- ldrsh r0, [r1, r4]
- cmp r0, 0
- bge _0813EFD8
- negs r0, r0
- lsls r0, 16
- lsrs r3, r0, 16
-_0813EFD8:
- lsls r0, r2, 16
- asrs r2, r0, 16
- lsls r0, r3, 16
- asrs r0, 16
- cmp r2, r0
- ble _0813EFF0
- cmp r2, 0x3
- ble _0813EFF8
- movs r0, 0x2
- b _0813EFFA
- .align 2, 0
-_0813EFEC: .4byte gTasks+0x8
-_0813EFF0:
- cmp r0, 0x3
- ble _0813EFF8
- movs r0, 0x2
- b _0813EFFA
-_0813EFF8:
- movs r0, 0x4
-_0813EFFA:
- strh r0, [r1, 0x8]
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_813EF9C
-
- thumb_func_start sub_813F004
-sub_813F004: @ 813F004
- push {r4,r5,lr}
- lsls r1, 16
- lsrs r1, 16
- lsls r2, 16
- lsrs r2, 16
- ldrb r5, [r0, 0x3]
- ldr r4, [r0, 0x10]
- movs r3, 0
- cmp r3, r5
- bge _0813F066
- lsls r0, r1, 16
- asrs r1, r0, 16
- lsls r0, r2, 16
- asrs r2, r0, 16
-_0813F020:
- ldrb r0, [r4, 0x5]
- cmp r0, 0x7
- bne _0813F05E
- ldrh r0, [r4]
- cmp r1, r0
- bne _0813F05E
- ldrh r0, [r4, 0x2]
- cmp r2, r0
- bne _0813F05E
- ldr r0, [r4, 0x8]
- movs r1, 0x1
- bl sub_80CC44C
- lsls r0, 16
- lsrs r5, r0, 16
- ldr r0, [r4, 0x8]
- movs r1, 0x3
- bl sub_80CC44C
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x1
- beq _0813F066
- adds r0, r5, 0
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- bne _0813F066
- movs r0, 0x1
- b _0813F068
-_0813F05E:
- adds r4, 0xC
- adds r3, 0x1
- cmp r3, r5
- blt _0813F020
-_0813F066:
- movs r0, 0
-_0813F068:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_813F004
-
thumb_func_start sub_813F070
sub_813F070: @ 813F070
push {r4-r6,lr}
@@ -950,14 +437,14 @@ sub_813F364: @ 813F364
push {lr}
lsls r0, 24
lsrs r0, 24
- ldr r2, _0813F378 @ =gUnknown_8416476
+ ldr r2, _0813F378 @ =gText_ItemfinderResponding
ldr r3, _0813F37C @ =sub_813F380
movs r1, 0x2
bl DisplayItemMessageOnField
pop {r0}
bx r0
.align 2, 0
-_0813F378: .4byte gUnknown_8416476
+_0813F378: .4byte gText_ItemfinderResponding
_0813F37C: .4byte sub_813F380
thumb_func_end sub_813F364
@@ -985,14 +472,14 @@ sub_813F3A8: @ 813F3A8
push {lr}
lsls r0, 24
lsrs r0, 24
- ldr r2, _0813F3BC @ =gUnknown_84164BE
+ ldr r2, _0813F3BC @ =gText_ItemfinderShakingWildly
ldr r3, _0813F3C0 @ =sub_813F3C4
movs r1, 0x2
bl DisplayItemMessageOnField
pop {r0}
bx r0
.align 2, 0
-_0813F3BC: .4byte gUnknown_84164BE
+_0813F3BC: .4byte gText_ItemfinderShakingWildly
_0813F3C0: .4byte sub_813F3C4
thumb_func_end sub_813F3A8
diff --git a/data/strings.s b/data/strings.s
index 05bd47c88..98b137425 100644
--- a/data/strings.s
+++ b/data/strings.s
@@ -582,13 +582,13 @@ gUnknown_8416425:: @ 8416425
gUnknown_8416451:: @ 8416451
.string "You can't dismount your BIKE here.{PAUSE_UNTIL_PRESS}$"
-gUnknown_8416476:: @ 8416476
+gText_ItemfinderResponding:: @ 8416476
.string "Huh?\nThe ITEMFINDER's responding!\pThere's an item buried around here!{PAUSE_UNTIL_PRESS}$"
-gUnknown_84164BE:: @ 84164BE
+gText_ItemfinderShakingWildly:: @ 84164BE
.string "Oh!\nThe ITEMFINDER's shaking wildly!\pThere's an item buried underfoot!\p‥ ‥ ‥ ‥ ‥ ‥{PAUSE_UNTIL_PRESS}$"
-gUnknown_8416513:: @ 8416513
+gText_NopeTheresNoResponse:: @ 8416513
.string "‥ ‥ ‥ ‥Nope!\nThere's no response.{PAUSE_UNTIL_PRESS}$"
gUnknown_8416537:: @ 8416537
diff --git a/include/field_specials.h b/include/field_specials.h
index 9a85a8b49..40adbdf9a 100644
--- a/include/field_specials.h
+++ b/include/field_specials.h
@@ -14,5 +14,6 @@ u8 ContextNpcGetTextColor(void);
void set_unknown_box_id(u8);
u16 get_unknown_box_id(void);
bool8 sub_80CC7B4(void);
+u16 sub_80CC44C(struct HiddenItemStruct hiddenItem, u8 attr);
#endif // GUARD_FIELD_SPECIALS_H
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index 3623737ea..cc9510997 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -120,26 +120,34 @@ struct CoordEvent
u8 *script;
};
+struct HiddenItemStruct
+{
+ u32 field_00:16;
+ u32 hiddenItemId:8; // flag offset to determine flag lookup
+ u32 field_03_0:7;
+ u32 field_03_7:1;
+};
+
+union BgUnion
+{ // carried over from diego's FR/LG work, seems to be the same struct
+ // in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union.
+ u8 *script;
+
+ // hidden item type probably
+ struct HiddenItemStruct hiddenItem;
+
+ // secret base type
+ u32 secretBaseId;
+
+};
+
struct BgEvent
{
u16 x, y;
u8 unk4;
u8 kind;
// 0x2 padding for the union beginning.
- union { // carried over from diego's FR/LG work, seems to be the same struct
- // in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union.
- u8 *script;
-
- // hidden item type probably
- struct {
- u8 filler6[0x2];
- u16 hiddenItemId; // flag offset to determine flag lookup
- } hiddenItem;
-
- // secret base type
- u32 secretBaseId;
-
- } bgUnion;
+ union BgUnion bgUnion;
};
struct MapEvents
diff --git a/include/strings.h b/include/strings.h
index b0221b8e9..9ddce6044 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -324,4 +324,9 @@ extern const u8 gText_ThrowAwayStrVar2OfThisItemQM[];
extern const u8 gText_BerryPouch[];
extern const u8 gText_TheBerryPouchWillBePutAway[];
+// itemfinder
+extern const u8 gText_ItemfinderResponding[];
+extern const u8 gText_ItemfinderShakingWildly[];
+extern const u8 gText_NopeTheresNoResponse[];
+
#endif //GUARD_STRINGS_H
diff --git a/ld_script.txt b/ld_script.txt
index a61f88d14..596ef05e2 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -252,6 +252,7 @@ SECTIONS {
asm/wild_pokemon_area.o(.text);
src/dynamic_placeholder_text_util.o(.text);
src/berry_pouch.o(.text);
+ src/itemfinder.o(.text);
asm/itemfinder.o(.text);
src/buy_menu_helpers.o(.text);
src/slot_machine.o(.text);
@@ -467,6 +468,7 @@ SECTIONS {
data/wild_pokemon_area.o(.rodata);
src/dynamic_placeholder_text_util.o(.rodata);
src/berry_pouch.o(.rodata);
+ src/itemfinder.o(.rodata);
data/itemfinder.o(.rodata);
src/buy_menu_helpers.o(.rodata);
src/slot_machine.o(.rodata);
diff --git a/src/itemfinder.c b/src/itemfinder.c
new file mode 100644
index 000000000..20db9e5d2
--- /dev/null
+++ b/src/itemfinder.c
@@ -0,0 +1,204 @@
+#include "global.h"
+#include "task.h"
+#include "new_menu_helpers.h"
+#include "strings.h"
+#include "map_obj_lock.h"
+#include "script.h"
+#include "sound.h"
+#include "event_data.h"
+#include "field_player_avatar.h"
+#include "field_specials.h"
+#include "constants/songs.h"
+
+void sub_813ED18(u8 taskId);
+void sub_813ED3C(u8 taskId);
+void sub_813EDB0(u8 taskId);
+bool8 sub_813EE14(struct MapEvents *events, u8 taskId);
+void sub_813EF9C(u8 taskId);
+void sub_813F108(u8 taskId);
+void sub_813F220(u8 taskId, s16 dx, s16 dy);
+u8 GetPlayerDirectionTowardsHiddenItem(s16 x, s16 y);
+void sub_813F364(u8 taskId);
+void sub_813F3A8(u8 taskId);
+void sub_813F3EC(void);
+void sub_813F40C(u8 palIdx, u8 direction);
+u8 sub_813F5AC(void);
+void sub_813EF40(u8 taskId, struct HiddenItemStruct hiddenItem);
+
+void sub_813EC8C(u8 taskId)
+{
+ u8 i;
+ for (i = 0; i < 16; i++)
+ gTasks[taskId].data[i] = 0;
+ if (sub_813EE14(gMapHeader.events, taskId) == TRUE)
+ {
+ sub_813F3EC();
+ if (gTasks[taskId].data[6] == 1)
+ gTasks[taskId].func = sub_813EDB0;
+ else
+ gTasks[taskId].func = sub_813ED3C;
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, 2, gText_NopeTheresNoResponse, sub_813ED18);
+ }
+}
+
+void sub_813ED18(u8 taskId)
+{
+ ClearDialogWindowAndFrame(0, TRUE);
+ sub_80696C0();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+void sub_813ED3C(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ u8 direction;
+ if (data[3] % 25 == 0)
+ {
+ direction = GetPlayerDirectionTowardsHiddenItem(data[0], data[1]);
+ if (data[4] == 0)
+ {
+ gTasks[taskId].func = sub_813F364;
+ return;
+ }
+ else
+ {
+ PlaySE(SE_TOY_F);
+ sub_813F40C(data[5], direction);
+ data[5]++;
+ data[4]--;
+ }
+ }
+ data[3]++;
+}
+
+void sub_813EDB0(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ if (data[3] % 25 == 0)
+ {
+ if (data[4] == 0)
+ {
+ gTasks[taskId].func = sub_813F3A8;
+ return;
+ }
+ else
+ {
+ PlaySE(SE_TOY_F);
+ data[7] = sub_813F5AC();
+ data[5]++;
+ data[4]--;
+ }
+ }
+ data[3]++;
+}
+
+bool8 sub_813EE14(struct MapEvents *events, u8 taskId)
+{
+ s16 x, y, i, dx, dy;
+ PlayerGetDestCoords(&x, &y);
+ gTasks[taskId].data[2] = 0;
+ for (i = 0; i < events->bgEventCount; i++)
+ {
+ if (events->bgEvents[i].kind == 7 && !FlagGet(sub_80CC44C(events->bgEvents[i].bgUnion.hiddenItem, 1)))
+ {
+ dx = events->bgEvents[i].x + 7 - x;
+ dy = events->bgEvents[i].y + 7 - y;
+ if (sub_80CC44C(events->bgEvents[i].bgUnion.hiddenItem, 3) == TRUE)
+ {
+ if (dx == 0 && dy == 0)
+ {
+ sub_813EF40(taskId, events->bgEvents[i].bgUnion.hiddenItem);
+ return TRUE;
+ }
+ }
+ else if (
+ dx >= -7
+ && dx <= 7
+ && dy >= -5
+ && dy <= 5
+ )
+ {
+ sub_813F220(taskId, dx, dy);
+ }
+ }
+ }
+ sub_813F108(taskId);
+ if (gTasks[taskId].data[2] == 1)
+ {
+ sub_813EF9C(taskId);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_813EF40(u8 taskId, struct HiddenItemStruct hiddenItem)
+{
+ s16 * data = gTasks[taskId].data;
+ gSpecialVar_0x8004 = sub_80CC44C(hiddenItem, 1);
+ gSpecialVar_0x8005 = sub_80CC44C(hiddenItem, 0);
+ gSpecialVar_0x8006 = 1;
+ TV_PrintIntToStringVar(0, gSpecialVar_0x8005);
+ data[2] = 1;
+ data[0] = 0;
+ data[1] = 0;
+ data[4] = 3;
+ data[6] = 1;
+}
+
+void sub_813EF9C(u8 taskId)
+{
+ s16 * data = gTasks[taskId].data;
+ s16 r3 = data[1];
+ s16 r2 = data[0];
+ if (data[0] == 0 && data[1] == 0)
+ data[4] = 4;
+ else
+ {
+ if (data[0] < 0)
+ r2 = data[0] * -1;
+ if (data[1] < 0)
+ r3 = data[1] * -1;
+ if (r2 > r3)
+ {
+ if (r2 > 3)
+ data[4] = 2;
+ else
+ data[4] = 4;
+ }
+ else
+ {
+ if (r3 > 3)
+ data[4] = 2;
+ else
+ data[4] = 4;
+ }
+ }
+}
+
+bool8 sub_813F004(struct MapEvents *events, s16 x, s16 y)
+{
+ s32 i;
+ u16 eventFlag;
+ s32 bgEventCount = events->bgEventCount;
+ struct BgEvent *bgEvents = events->bgEvents;
+ for (i = 0; i < bgEventCount; i++)
+ {
+ if (
+ bgEvents[i].kind == 7
+ && x == bgEvents[i].x
+ && y == bgEvents[i].y
+ )
+ {
+ eventFlag = sub_80CC44C(bgEvents[i].bgUnion.hiddenItem, 1);
+ if (sub_80CC44C(bgEvents[i].bgUnion.hiddenItem, 3) != TRUE && !FlagGet(eventFlag))
+ return TRUE;
+ else
+ return FALSE;
+ }
+ }
+ return FALSE;
+}