summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/itemfinder.c204
1 files changed, 204 insertions, 0 deletions
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;
+}