summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfl4shk <fl4shk@users.noreply.github.com>2016-11-09 02:51:59 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2016-11-08 23:51:59 -0800
commit926ecbe8226cb7dffdca2e91b0fe81de3ceafcd6 (patch)
tree068f62a28681a4c4ffb6e574909859eb5fc2205c /src
parented1f329d168f398df644bebdc4904184c0eabe23 (diff)
safari_zone.c (#94)
* about halfway through with safari_zone.c * Figured out more of UnkSafariZoneStruct * Finished safari_zone.c
Diffstat (limited to 'src')
-rw-r--r--src/safari_zone.c305
1 files changed, 305 insertions, 0 deletions
diff --git a/src/safari_zone.c b/src/safari_zone.c
new file mode 100644
index 000000000..32cf35ca2
--- /dev/null
+++ b/src/safari_zone.c
@@ -0,0 +1,305 @@
+#include "global.h"
+#include "flag.h"
+#include "main.h"
+#include "script.h"
+#include "string_util.h"
+
+
+#define FLAG_ID_SAFARI_ZONE 0x082C
+
+struct UnkSafariZoneStruct
+{
+ /*0x00*/ s16 x;
+ /*0x02*/ s16 y;
+ /*0x04*/ s8 mapNum;
+ /*0x05*/ u8 counter;
+ /*0x06*/ u8 field_4;
+ /*0x07*/ u8 field_5;
+ /*0x08*/ struct Pokeblock pokeblock;
+};
+
+
+void ClearEveryUnkSafariZoneStruct(void);
+void sub_80C8508(void);
+extern void c2_exit_to_overworld_2_switch(void);
+extern void c2_exit_to_overworld_1_continue_scripts_restart_music(void);
+extern void sub_8080E44(void);
+extern void CB2_LoadMap(void);
+extern void sav12_xor_increment(u8);
+extern void warp_in(void);
+extern void GetXYCoordsOneStepInFrontOfPlayer(void *, void *);
+extern void PlayerGetDestCoords(u16 *, u16 *);
+
+extern u8 gUnknown_02024D26;
+extern u8 gUnknown_02038808;
+extern u16 gUnknown_0203880A;
+
+extern struct UnkSafariZoneStruct gUnkSafariZoneStructArr[10];
+
+extern void (*gUnknown_0300485C)(void);
+
+extern u8 gUnknown_081C340A;
+extern u8 gUnknown_081C342D;
+extern u8 gUnknown_081C3448;
+extern u8 gUnknown_081C3459;
+extern u8 *gUnknown_083F7EB8[];
+
+extern u16 gScriptResult;
+
+
+bool32 GetSafariZoneFlag(void)
+{
+ bool8 ret = FlagGet(FLAG_ID_SAFARI_ZONE);
+
+ return ret;
+}
+
+void SetSafariZoneFlag(void)
+{
+ FlagSet(FLAG_ID_SAFARI_ZONE);
+}
+
+void ResetSafariZoneFlag(void)
+{
+ FlagReset(FLAG_ID_SAFARI_ZONE);
+}
+
+
+void sub_80C81B8(void)
+{
+ sav12_xor_increment(0x11);
+ SetSafariZoneFlag();
+ ClearEveryUnkSafariZoneStruct();
+
+ gUnknown_02038808 = 0x1E;
+ gUnknown_0203880A = 0x1F4;
+}
+
+void sub_80C81E4(void)
+{
+ ResetSafariZoneFlag();
+ ClearEveryUnkSafariZoneStruct();
+
+ gUnknown_02038808 = 0;
+ gUnknown_0203880A = 0;
+}
+
+bool8 safari_step(void)
+{
+ if (GetSafariZoneFlag() == FALSE)
+ {
+ return FALSE;
+ }
+
+ sub_80C8508();
+
+ if (!(--gUnknown_0203880A))
+ {
+ ScriptContext1_SetupScript(&gUnknown_081C3448);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_80C823C(void)
+{
+ ScriptContext1_SetupScript(&gUnknown_081C342D);
+}
+
+void sub_80C824C(void)
+{
+ if (gUnknown_02038808 != 0)
+ {
+ SetMainCallback2(c2_exit_to_overworld_2_switch);
+ }
+ else if (gUnknown_02024D26 == 8)
+ {
+ ScriptContext2_RunNewScript(&gUnknown_081C340A);
+ warp_in();
+ gUnknown_0300485C = sub_8080E44;
+ SetMainCallback2(CB2_LoadMap);
+ }
+ else if (gUnknown_02024D26 == 7)
+ {
+ ScriptContext1_SetupScript(&gUnknown_081C3459);
+ ScriptContext1_Stop();
+ SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
+ }
+}
+
+void ClearSingleUnkSafariZoneStruct(u8 index)
+{
+ memset(&gUnkSafariZoneStructArr[index], 0,
+ sizeof(struct UnkSafariZoneStruct));
+}
+
+void ClearEveryUnkSafariZoneStruct(void)
+{
+ // 10 is the number of struct UnkSafariZoneStruct's in
+ // gUnkSafariZoneStructArr. It might be a good idea to create a #define
+ // for it.
+ memset(gUnkSafariZoneStructArr, 0, sizeof(struct UnkSafariZoneStruct)
+ * 10);
+}
+
+void sub_80C82EC(void)
+{
+ s16 x, y;
+ u16 i;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+
+ // 10 is the number of struct UnkSafariZoneStruct's in
+ // gUnkSafariZoneStructArr. It might be a good idea to create a #define
+ // for it.
+ for (i = 0; i < 10; i++)
+ {
+ if (gSaveBlock1.location.mapNum == gUnkSafariZoneStructArr[i].mapNum
+ && gUnkSafariZoneStructArr[i].x == x
+ && gUnkSafariZoneStructArr[i].y == y)
+ {
+ gScriptResult = i;
+
+ StringCopy(gStringVar1, gUnknown_083F7EB8
+ [gUnkSafariZoneStructArr[i].pokeblock.color]);
+
+ return;
+ }
+ }
+
+ gScriptResult = -1;
+}
+
+void sub_80C837C(void)
+{
+ s16 x, y;
+ u16 i;
+
+ PlayerGetDestCoords(&x, &y);
+
+ // 10 is the number of struct UnkSafariZoneStruct's in
+ // gUnkSafariZoneStructArr. It might be a good idea to create a #define
+ // for it.
+ for (i = 0; i < 10; i++)
+ {
+ if (gSaveBlock1.location.mapNum
+ == gUnkSafariZoneStructArr[i].mapNum)
+ {
+ x -= gUnkSafariZoneStructArr[i].x;
+ y -= gUnkSafariZoneStructArr[i].y;
+
+ if (x < 0)
+ {
+ x *= -1;
+ }
+ if (y < 0)
+ {
+ y *= -1;
+ }
+
+ if ((x + y) <= 5)
+ {
+ gScriptResult = i;
+ return;
+ }
+ }
+ }
+
+ gScriptResult = -1;
+}
+
+struct Pokeblock *unref_sub_80C8418(void)
+{
+ sub_80C82EC();
+
+ if (gScriptResult == 0xFFFF)
+ {
+ return NULL;
+ }
+
+ return &gUnkSafariZoneStructArr[gScriptResult].pokeblock;
+}
+
+
+struct Pokeblock *sub_80C8448(void)
+{
+ sub_80C837C();
+
+ if (gScriptResult == 0xFFFF)
+ {
+ return NULL;
+ }
+
+ return &gUnkSafariZoneStructArr[gScriptResult].pokeblock;
+}
+
+
+void sub_80C8478(u8 pokeblock_index)
+{
+ s16 x, y;
+ u8 i;
+
+ // 10 is the number of struct UnkSafariZoneStruct's in
+ // gUnkSafariZoneStructArr. It might be a good idea to create a #define
+ // for it.
+ for (i = 0; i < 10; i++)
+ {
+ if (gUnkSafariZoneStructArr[i].mapNum == 0
+ && gUnkSafariZoneStructArr[i].x == 0
+ && gUnkSafariZoneStructArr[i].y == 0)
+ {
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+
+ gUnkSafariZoneStructArr[i].mapNum
+ = gSaveBlock1.location.mapNum;
+
+ gUnkSafariZoneStructArr[i].pokeblock
+ = gSaveBlock1.pokeblocks[pokeblock_index];
+
+ gUnkSafariZoneStructArr[i].counter = 0x64;
+ gUnkSafariZoneStructArr[i].x = x;
+ gUnkSafariZoneStructArr[i].y = y;
+ break;
+ }
+ }
+}
+
+void sub_80C8508(void)
+{
+ u8 i;
+
+ // 10 is the number of struct UnkSafariZoneStruct's in
+ // gUnkSafariZoneStructArr. It might be a good idea to create a #define
+ // for it.
+ for (i = 0; i < 10; i++)
+ {
+ if (gUnkSafariZoneStructArr[i].counter != 0)
+ {
+ gUnkSafariZoneStructArr[i].counter--;
+
+ if (gUnkSafariZoneStructArr[i].counter == 0)
+ {
+ ClearSingleUnkSafariZoneStruct(i);
+ }
+ }
+ }
+}
+
+bool8 unref_sub_80C853C(void)
+{
+ sub_80C82EC();
+
+ if (gScriptResult == 0xFFFF)
+ {
+ return FALSE;
+ }
+
+ ConvertIntToDecimalStringN(gStringVar2,
+ gUnkSafariZoneStructArr[gScriptResult].counter,
+ STR_CONV_MODE_LEADING_ZEROS, 3);
+
+ return TRUE;
+}
+
+