diff options
Diffstat (limited to 'src/field_tasks.c')
-rw-r--r-- | src/field_tasks.c | 859 |
1 files changed, 0 insertions, 859 deletions
diff --git a/src/field_tasks.c b/src/field_tasks.c deleted file mode 100644 index caf2ce6b9..000000000 --- a/src/field_tasks.c +++ /dev/null @@ -1,859 +0,0 @@ -// -// Created by scott on 6/22/2017. -// - -#include "global.h" -#include "task.h" -#include "main.h" -#include "vars.h" -#include "bike.h" -#include "item.h" -#include "items.h" -#include "event_data.h" -#include "rom4.h" -#include "clock.h" -#include "script.h" -#include "field_special_scene.h" -#include "field_effect_helpers.h" -#include "secret_base.h" -#include "metatile_behavior.h" -#include "fieldmap.h" -#include "field_player_avatar.h" -#include "field_camera.h" -#include "songs.h" -#include "sound.h" -#include "field_tasks.h" - -void DummyPerStepCallback(u8); -void PerStepCallback_8069F64(u8); -void PerStepCallback_8069AA0(u8); -void PerStepCallback_8069864(u8); -void PerStepCallback_8069DD4(u8); -void PerStepCallback_806A07C(u8); - -void (*const gUnknown_08376364[])(u8) = { - DummyPerStepCallback, - PerStepCallback_8069F64, - PerStepCallback_8069AA0, - PerStepCallback_8069864, - PerStepCallback_8069DD4, - EndTruckSequence, - sub_80BCF1C, - PerStepCallback_806A07C -}; - -void Task_RunPerStepCallback(u8 taskId) -{ - int idx = gTasks[taskId].data[0]; - gUnknown_08376364[idx](taskId); -} - -static void RunTimeBasedEvents(s16 *taskData) -{ - switch (*taskData) - { - case 0: - if (gMain.vblankCounter1 & 0x1000) - { - DoTimeBasedEvents(); - (*taskData)++; - } - break; - case 1: - if (!(gMain.vblankCounter1 & 0x1000)) - { - (*taskData)--; - } - break; - } -} - -void Task_RunTimeBasedEvents(u8 taskId) -{ - s16 *taskData = gTasks[taskId].data; - if (!ScriptContext2_IsEnabled()) - { - RunTimeBasedEvents(taskData); - sub_80540D0(taskData + 1, taskData + 2); - } -} - -void Task_MuddySlope(u8); - -void SetUpFieldTasks(void) -{ - if (!FuncIsActiveTask(Task_RunPerStepCallback)) - { - u8 taskId = CreateTask(Task_RunPerStepCallback, 0x50); - gTasks[taskId].data[0] = 0; - } - if (!FuncIsActiveTask(Task_MuddySlope)) - { - CreateTask(Task_MuddySlope, 0x50); - } - if (!FuncIsActiveTask(Task_RunTimeBasedEvents)) - { - CreateTask(Task_RunTimeBasedEvents, 0x50); - } -} - -void ActivatePerStepCallback(u8 callback) -{ - s16 *dataPointer; - s16 *dataStart; - s16 zero; - u8 taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) - { - dataStart = gTasks[taskId].data; - zero = 0; - dataPointer = &dataStart[15]; - do - { - *dataPointer-- = zero; - } while ((int)dataPointer >= (int)dataStart); - if (callback >= ARRAY_COUNT(gUnknown_08376364)) - { - *dataStart = 0; - } - else - { - *dataStart = callback; - } - } -} - -void ResetFieldTasksArgs(void) -{ - u8 taskId; - s16 *taskData; - taskId = FindTaskIdByFunc(Task_RunPerStepCallback); - if (taskId != 0xff) - { - taskData = gTasks[taskId].data; - } - taskId = FindTaskIdByFunc(Task_RunTimeBasedEvents); - if (taskId != 0xff) - { - taskData = gTasks[taskId].data; - taskData[1] = 0; - taskData[2] = 0; - } -} - -const struct MetatileOffset gUnknown_08376384[][2] = { - {{ 0, 0,0x259}, { 0, 1,0x261}}, - {{ 0, -1,0x259}, { 0, 0,0x261}}, - {{ 0, 0,0x252}, { 1, 0,0x253}}, - {{ -1, 0,0x252}, { 0, 0,0x253}} -}; - -const struct MetatileOffset gUnknown_083763A4[][2] = { - {{ 0, 0,0x25A}, { 0, 1,0x262}}, - {{ 0, -1,0x25A}, { 0, 0,0x262}}, - {{ 0, 0,0x254}, { 1, 0,0x255}}, - {{ -1, 0,0x254}, { 0, 0,0x255}} -}; - -const struct MetatileOffset gUnknown_083763C4[][2] = { - {{ 0, 0,0x258}, { 0, 1,0x260}}, - {{ 0, -1,0x258}, { 0, 0,0x260}}, - {{ 0, 0,0x250}, { 1, 0,0x251}}, - {{ -1, 0,0x250}, { 0, 0,0x251}} -}; - -void DummyPerStepCallback(u8 taskId) {} - -const struct MetatileOffset *sub_80695E0(const struct MetatileOffset a0[][2], s8 a1) -{ - if (sub_80576A0(a1)) - { - return a0[0]; - } - else if (sub_80576B4(a1)) - { - return a0[1]; - } - else if (sub_80576C8(a1)) - { - return a0[2]; - } - else if (sub_80576DC(a1)) - { - return a0[3]; - } - else - { - return NULL; - } -} - -#ifdef NONMATCHING -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) -{ - const struct MetatileOffset *offsetData = sub_80695E0(offsets, MapGridGetMetatileBehaviorAt(x, y)); - const struct MetatileOffset *offsetData2 = offsetData; - if (offsetData != NULL) - { - MapGridSetMetatileIdAt(x + offsetData[0].x, y + offsetData[0].y, offsetData[0].tileId); - if (flag) - { - CurrentMapDrawMetatileAt(x + offsetData[0].x, y + offsetData[0].y); - } - MapGridSetMetatileIdAt(x + offsetData2[1].x, y + offsetData2[1].y, offsetData2[1].tileId); - if (flag) - { - CurrentMapDrawMetatileAt(x + offsetData2[1].x, y + offsetData2[1].y); - } - } -} -#else -__attribute__((naked)) -void sub_8069638(const struct MetatileOffset offsets[][2], s16 x, s16 y, bool32 flag) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tmov r7, r8\n" - "\tpush {r7}\n" - "\tadds r5, r0, 0\n" - "\tmov r8, r3\n" - "\tlsls r1, 16\n" - "\tasrs r6, r1, 16\n" - "\tlsls r2, 16\n" - "\tasrs r7, r2, 16\n" - "\tadds r0, r6, 0\n" - "\tadds r1, r7, 0\n" - "\tbl MapGridGetMetatileBehaviorAt\n" - "\tadds r1, r0, 0\n" - "\tlsls r1, 16\n" - "\tlsrs r1, 16\n" - "\tadds r0, r5, 0\n" - "\tbl sub_80695E0\n" - "\tadds r4, r0, 0\n" - "\tadds r5, r4, 0\n" - "\tcmp r4, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r4, 0x2]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _0806968E\n" - "\tmovs r0, 0\n" - "\tldrsb r0, [r4, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x1\n" - "\tldrsb r1, [r4, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_0806968E:\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tldrh r2, [r5, 0x6]\n" - "\tbl MapGridSetMetatileIdAt\n" - "\tmov r0, r8\n" - "\tcmp r0, 0\n" - "\tbeq _080696B6\n" - "\tmovs r0, 0x4\n" - "\tldrsb r0, [r5, r0]\n" - "\tadds r0, r6, r0\n" - "\tmovs r1, 0x5\n" - "\tldrsb r1, [r5, r1]\n" - "\tadds r1, r7, r1\n" - "\tbl CurrentMapDrawMetatileAt\n" - "_080696B6:\n" - "\tpop {r3}\n" - "\tmov r8, r3\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif - -void sub_80696C0(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_08376384, x, y, flag); -} - -void sub_80696E4(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_083763A4, x, y, flag); -} - -void sub_8069708(s16 x, s16 y, bool32 flag) -{ - sub_8069638(gUnknown_083763C4, x, y, flag); -} - -bool32 sub_806972C(s16 x1, s16 y1, s16 x2, s16 y2) -{ - s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x2, y2); - if (sub_80576A0(metatileBehavior)) - { - if (y1 > y2) - { - return FALSE; - } - } - else if (sub_80576B4(metatileBehavior)) - { - if (y1 < y2) - { - return FALSE; - } - } - else if (sub_80576C8(metatileBehavior)) - { - if (x1 > x2) - { - return FALSE; - } - } - else if (sub_80576DC(metatileBehavior)) - { - if (x1 < x2) - { - return FALSE; - } - } - return TRUE; -} - -bool32 sub_80697C8(s16 x1, s16 y1, s16 x2, s16 y2) -{ - s8 metatileBehavior = MapGridGetMetatileBehaviorAt(x1, y1); - if (sub_80576A0(metatileBehavior)) - { - if (y1 < y2) - { - return FALSE; - } - } - else if (sub_80576B4(metatileBehavior)) - { - if (y1 > y2) - { - return FALSE; - } - } - else if (sub_80576C8(metatileBehavior)) - { - if (x1 < x2) - { - return FALSE; - } - } - else if (sub_80576DC(metatileBehavior)) - { - if (x1 > x2) - { - return FALSE; - } - } - return TRUE; -} - -void PerStepCallback_8069864(u8 taskId) -{ - s16 *data; - s16 x, y; - data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - switch (data[1]) - { - case 0: - data[2] = x; - data[3] = y; - sub_80696E4(x, y, TRUE); - data[1] = 1; - break; - case 1: - if (x != data[2] || y != data[3]) - { - if (sub_806972C(x, y, data[2], data[3])) - { - sub_80696C0(data[2], data[3], TRUE); - sub_8069708(data[2], data[3], FALSE); - data[4] = data[2]; - data[5] = data[3]; - data[1] = 2; - data[6] = 8; - } - else - { - data[4] = -1; - data[5] = -1; - } - if (sub_80697C8(x, y, data[2], data[3])) - { - sub_80696C0(x, y, TRUE); - data[1] = 2; - data[6] = 8; - } - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsPacifidlogLog(MapGridGetMetatileBehaviorAt(x, y))) - { - PlaySE(SE_MIZU); - } - } - break; - case 2: - if ((--data[6]) == 0) - { - sub_80696E4(x, y, TRUE); - if (data[4] != -1 && data[5] != -1) - { - sub_8069708(data[4], data[5], TRUE); - } - data[1] = 1; - } - break; - } -} - -void sub_80699D8(s16 x, s16 y) -{ - u8 z = PlayerGetZCoord(); - if (!(z & 0x01)) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x24e: - MapGridSetMetatileIdAt(x, y, 0x24f); - break; - case 0x256: - MapGridSetMetatileIdAt(x, y, 0x257); - break; - } - } -} - -void sub_8069A3C(s16 x, s16 y) -{ - u8 z = PlayerGetZCoord(); - if (!(z & 0x01)) - { - switch (MapGridGetMetatileIdAt(x, y)) - { - case 0x24f: - MapGridSetMetatileIdAt(x, y, 0x24e); - break; - case 0x257: - MapGridSetMetatileIdAt(x, y, 0x256); - break; - } - } -} - -void PerStepCallback_8069AA0(u8 taskId) -{ - bool8 isFortreeBridgeCur; - bool8 isFortreeBridgePrev; - u8 z, flag; - s16 x, y, x2, y2; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - switch (data[1]) - { - default: - break; - case 0: - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y))) - { - sub_80699D8(x, y); - CurrentMapDrawMetatileAt(x, y); - } - data[1] = 1; - break; - case 1: - x2 = data[2]; - y2 = data[3]; - if (x == x2 && y == y2) - { - break; - } - isFortreeBridgeCur = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x, y)); - isFortreeBridgePrev = MetatileBehavior_IsFortreeBridge(MapGridGetMetatileBehaviorAt(x2, y2)); - z = PlayerGetZCoord(); - flag = 0; - if ((u8)(z & 1) == 0) - { - flag = 1; - } - if (flag && (isFortreeBridgeCur == 1 || isFortreeBridgePrev == 1)) - { - PlaySE(SE_HASHI); - } - if (isFortreeBridgePrev) - { - sub_8069A3C(x2, y2); - CurrentMapDrawMetatileAt(x2, y2); - sub_80699D8(x, y); - CurrentMapDrawMetatileAt(x, y); - } - data[4] = x2; - data[5] = y2; - data[2] = x; - data[3] = y; - if (!isFortreeBridgePrev) - { - break; - } - data[6] = 16; - data[1] = 2; - // fallthrough - case 2: - data[6]--; - x2 = data[4]; - y2 = data[5]; - switch (data[6] % 7) - { - case 0: - CurrentMapDrawMetatileAt(x2, y2); - case 1: - case 2: - case 3: - break; - case 4: - sub_80699D8(x2, y2); - CurrentMapDrawMetatileAt(x2, y2); - sub_8069A3C(x2, y2); - case 5: - case 6: - case 7: - break; - } - if (data[6] == 0) - { - data[1] = 1; - } - break; - } -} - -const u16 gUnknown_083763E4[] = { - 0, - 0, - 0, - 0, - 0, - 0, - VAR_0x4001, - VAR_0x4002, - VAR_0x4003, - VAR_0x4004, - 0, - 0, - VAR_0x4005, - VAR_0x4006, - VAR_0x4007, - 0, - 0, - VAR_0x4008, - VAR_0x4009, - VAR_0x400A, - 0, - 0, - 0, - 0, - 0, - 0 -}; - -bool32 sub_8069CB8(s16 x, s16 y) -{ - if ((u16)(x - 3) < 11 && (u16)(y - 6) < 14 && gUnknown_083763E4[y]) - { - return TRUE; - } - return FALSE; -} - -void sub_8069CFC(s16 x, s16 y) -{ - if (sub_8069CB8(x, y)) - { - *GetVarPointer(gUnknown_083763E4[y]) |= (1 << (x - 3)); - } -} - -bool32 sub_8069D34(s16 x, s16 y) -{ - u32 var; - if (!sub_8069CB8(x, y)) - { - return FALSE; - } - var = VarGet(gUnknown_083763E4[y]) << 16; - if (((1 << 16) << (x - 3)) & var) - { - return TRUE; - } - return FALSE; -} - -void sub_8069D78(void) -{ - s32 x, y; - s32 width = gMapHeader.mapData->width; - s32 height = gMapHeader.mapData->height; - for (x=0; x<width; x++) - { - for (y=0; y<height; y++) - { - if (sub_8069D34(x, y) == TRUE) - { - MapGridSetMetatileIdAt(x + 7, y + 7, 0x20e); - } - } - } -} - -void PerStepCallback_8069DD4(u8 taskId) -{ - s16 x, y; - u16 tileBehavior; - u16 *var; - s16 *data = gTasks[taskId].data; - switch (data[1]) - { - case 0: - PlayerGetDestCoords(&x, &y); - data[2] = x; - data[3] = y; - data[1] = 1; - break; - case 1: - PlayerGetDestCoords(&x, &y); - if (x != data[2] || y != data[3]) - { - data[2] = x; - data[3] = y; - tileBehavior = MapGridGetMetatileBehaviorAt(x, y); - var = GetVarPointer(VAR_ICE_STEP_COUNT); - if (MetatileBehavior_IsThinIce(tileBehavior) == TRUE) - { - (*var)++; - data[6] = 4; - data[1] = 2; - data[4] = x; - data[5] = y; - } - else if (MetatileBehavior_IsCrackedIce(tileBehavior) == TRUE) - { - *var = 0; - data[6] = 4; - data[1] = 3; - data[4] = x; - data[5] = y; - } - } - break; - case 2: - if (data[6] != 0) - { - data[6]--; - } - else - { - x = data[4]; - y = data[5]; - PlaySE(SE_RU_BARI); - MapGridSetMetatileIdAt(x, y, 0x20e); - CurrentMapDrawMetatileAt(x, y); - sub_8069CFC(x - 7, y - 7); - data[1] = 1; - } - break; - case 3: - if (data[6] != 0) - { - data[6]--; - } - else - { - x = data[4]; - y = data[5]; - PlaySE(SE_RU_GASYAN); - MapGridSetMetatileIdAt(x, y, 0x206); - CurrentMapDrawMetatileAt(x, y); - data[1] = 1; - } - break; - } -} - -void PerStepCallback_8069F64(u8 taskId) -{ - s16 x, y; - u16 *var; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - if (x != data[1] || y != data[2]) - { - data[1] = x; - data[2] = y; - if (MetatileBehavior_IsAshGrass(MapGridGetMetatileBehaviorAt(x, y))) - { - if (MapGridGetMetatileIdAt(x, y) == 0x20a) - { - ash(x, y, 0x212, 4); - } - else - { - ash(x, y, 0x206, 4); - } - if (CheckBagHasItem(ITEM_SOOT_SACK, 1)) - { - var = GetVarPointer(VAR_ASH_GATHER_COUNT); - if (*var < 9999) - { - (*var)++; - } - } - } - } -} - -void sub_806A040(s16 x, s16 y) -{ - MapGridSetMetatileIdAt(x, y, MapGridGetMetatileIdAt(x, y) == 0x22f ? 0x206 : 0x237); - CurrentMapDrawMetatileAt(x, y); -} - -void PerStepCallback_806A07C(u8 taskId) -{ - s16 x, y; - u16 behavior; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - behavior = MapGridGetMetatileBehaviorAt(x, y); - if (data[4] != 0 && (--data[4]) == 0) - { - sub_806A040(data[5], data[6]); - } - if (data[7] != 0 && (--data[7]) == 0) - { - sub_806A040(data[8], data[9]); - } - if (MetatileBehavior_IsCrackedFloorHole(behavior)) - { - VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty - } - if ((x != data[2] || y != data[3])) - { - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsCrackedFloor(behavior)) - { - if (GetPlayerSpeed() != 4) - { - VarSet(VAR_ICE_STEP_COUNT, 0); // this var does double duty - } - if (data[4] == 0) - { - data[4] = 3; - data[5] = x; - data[6] = y; - } - else if (data[7] == 0) - { - data[7] = 3; - data[8] = x; - data[9] = y; - } - } - } -} - -const u16 gUnknown_08376418[] = {0xe8, 0xeb, 0xea, 0xe9}; - -void sub_806A18C(s16 *data, s16 x, s16 y) -{ - u16 tile; - if ((--data[0]) == 0) - { - tile = 0xe8; - } - else - { - tile = gUnknown_08376418[data[0] / 8]; - } - MapGridSetMetatileIdAt(x, y, tile); - CurrentMapDrawMetatileAt(x, y); - MapGridSetMetatileIdAt(x, y, 0xe8); -} - -void Task_MuddySlope(u8 taskId) -{ - s16 x, y, x2, y2; - int i; - u16 mapIndices; - s16 *data = gTasks[taskId].data; - PlayerGetDestCoords(&x, &y); - mapIndices = (gSaveBlock1.location.mapGroup << 8) | gSaveBlock1.location.mapNum; - switch (data[1]) - { - case 0: - data[0] = mapIndices; - data[2] = x; - data[3] = y; - data[1] = 1; - data[4] = 0; - data[7] = 0; - data[10] = 0; - data[13] = 0; - break; - case 1: - if (data[2] != x || data[3] != y) - { - data[2] = x; - data[3] = y; - if (MetatileBehavior_IsMuddySlope(MapGridGetMetatileBehaviorAt(x, y))) - { - for (i=4; i<14; i+=3) - { - if (data[i] == 0) - { - data[i] = 32; - data[i + 1] = x; - data[i + 2] = y; - break; - } - } - } - } - break; - } - if (gUnknown_0202E844.field_0 && mapIndices != data[0]) - { - data[0] = mapIndices; - x2 = gUnknown_0202E844.x; - y2 = gUnknown_0202E844.y; - } - else - { - x2 = 0; - y2 = 0; - } - for (i=4; i<14; i+=3) - { - if (data[i]) - { - data[i + 1] -= x2; - data[i + 2] -= y2; - sub_806A18C(&data[i], data[i + 1], data[i + 2]); - } - } -} |