diff options
Diffstat (limited to 'src/party_menu.c')
-rw-r--r-- | src/party_menu.c | 317 |
1 files changed, 317 insertions, 0 deletions
diff --git a/src/party_menu.c b/src/party_menu.c new file mode 100644 index 000000000..ce1b0f32a --- /dev/null +++ b/src/party_menu.c @@ -0,0 +1,317 @@ +#include "global.h" +#include "menu.h" +#include "pokemon.h" +#include "songs.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" + +#define DATA_COUNT (6) + +struct Unk201C000 { + /* 0x00 */ struct Pokemon *pokemon; + /* 0x04 */ u8 var04; + /* 0x05 */ u8 var05; + /* 0x06 */ u16 var06; + u8 pad_08[10]; + /* 0x12 */ u16 var12; +}; + +struct Unk201B260 { + /* 0x00 */ u8 var00; + /* 0x01 */ u8 var01; + u8 pad_02[2]; + /* 0x04 */ s16 var04[DATA_COUNT * 2]; + u8 pad_1C[2]; + /* 0x1E */ u16 var1E; + /* 0x20 */ u16 var20; +}; + +extern struct Unk201B260 unk_201B260; +extern struct Unk201C000 unk_201C000; +extern u8 gStringVar1[]; +extern u8 gUnknown_0202E8F4; +extern u8 gUnknown_0202E8F6; + +extern u8 gUnknown_083769A8[][12]; +extern u8 gUnknown_08376D1C[DATA_COUNT]; +extern u8 *gUnknown_08376D04[DATA_COUNT]; +extern u8 gOtherText_TallPlusAndRightArrow[]; + +void task_pc_turn_off(u8 *u8, int i); +static void sub_806E884(u8 taskId); +void sub_806F8AC(u8 taskId); +void PartyMenuUpdateLevelOrStatus(struct Pokemon *, u8); +u8 ExecuteTableBasedItemEffect__(u8 u8, u16 u16, int i); +void sub_80701DC(u8 taskId); + +u8 sub_806E834(u8 *message, u8 arg1) { + u8 taskId; + + gUnknown_0202E8F6 = 1; + + MenuDrawTextWindow(3, 14, 26, 19); + MenuPrintMessage(message, 4, 15); + + taskId = CreateTask(sub_806E884, 1); + gTasks[taskId].data[0] = arg1; + + return taskId; +} + +static void sub_806E884(u8 taskId) { + if (MenuUpdateWindowText() == 0) { + return; + } + + gUnknown_0202E8F6 = 0; + + if (gTasks[taskId].data[0] == 0) { + MenuZeroFillWindowRect(3, 14, 26, 19); + } + + DestroyTask(taskId); +} + +asm(".section .text_b"); + +#ifdef NONMATCHING +void sub_8070088(u8 taskId) { + u8 dummyTaskId; + struct Task *task2; + + gTasks[taskId].func = TaskDummy; + + if (GetMonData(&gPlayerParty[unk_201C000.var04], MON_DATA_SPECIES) == 0) { + gTasks[taskId].func = sub_80701DC; + return; + } + + dummyTaskId = CreateTask(TaskDummy, 5); + task2 = &gTasks[dummyTaskId]; + + task2->data[10] = GetMonData(unk_201C000.pokemon, MON_DATA_MAX_HP); + task2->data[11] = GetMonData(unk_201C000.pokemon, MON_DATA_HP); + + if (ExecuteTableBasedItemEffect__(unk_201C000.var05, unk_201C000.var06, 0)) { + DestroyTask(dummyTaskId); + gTasks[taskId].func = sub_80701DC; + return; + } + + gUnknown_0202E8F4 = 1; + MenuZeroFillWindowRect(3, 14, 26, 19); + PlaySE(SE_KAIFUKU); + PartyMenuUpdateLevelOrStatus(unk_201C000.pokemon, unk_201C000.var05); + + task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle()][unk_201C000.var05], 9); + unk_201B260.var01 = 2; // u8 + + task2->data[12] = GetMonData(unk_201C000.pokemon, MON_DATA_HP) - task2->data[11]; + task2->data[14]= 1; + unk_201B260.var1E = 1; // u16 + unk_201B260.var20 = 1; // u16 + + unk_201C000.var12 = -0x8000; + task2->func = sub_806F8AC; +} +#else +__attribute__((naked)) +void sub_8070088(void) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldr r1, _08070120 @ =gTasks\n\ + mov r10, r1\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r1, 3\n\ + mov r2, r10\n\ + adds r7, r1, r2\n\ + ldr r5, _08070124 @ =TaskDummy\n\ + str r5, [r7]\n\ + ldr r4, _08070128 @ =0x0201c000\n\ + ldrb r0, [r4, 0x5]\n\ + movs r1, 0x64\n\ + mov r9, r1\n\ + mov r2, r9\n\ + muls r2, r0\n\ + adds r0, r2, 0\n\ + ldr r1, _0807012C @ =gPlayerParty\n\ + mov r8, r1\n\ + add r0, r8\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _08070118\n\ + adds r0, r5, 0\n\ + movs r1, 0x5\n\ + bl CreateTask\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + str r0, [sp]\n\ + mov r0, r10\n\ + adds r0, 0x8\n\ + ldr r2, [sp]\n\ + adds r6, r2, r0\n\ + ldrb r0, [r4, 0x5]\n\ + mov r1, r9\n\ + muls r1, r0\n\ + adds r0, r1, 0\n\ + add r0, r8\n\ + str r0, [r4]\n\ + movs r1, 0x3A\n\ + bl GetMonData\n\ + strh r0, [r6, 0x14]\n\ + ldr r0, [r4]\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + strh r0, [r6, 0x16]\n\ + ldrb r0, [r4, 0x5]\n\ + ldrh r1, [r4, 0x6]\n\ + movs r2, 0\n\ + bl ExecuteTableBasedItemEffect__\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _08070134\n\ + adds r0, r5, 0\n\ + bl DestroyTask\n\ +_08070118:\n\ + ldr r0, _08070130 @ =sub_80701DC\n\ + str r0, [r7]\n\ + b _080701B0\n\ + .align 2, 0\n\ +_08070120: .4byte gTasks\n\ +_08070124: .4byte TaskDummy\n\ +_08070128: .4byte 0x0201c000\n\ +_0807012C: .4byte gPlayerParty\n\ +_08070130: .4byte sub_80701DC\n\ +_08070134:\n\ + ldr r1, _080701C0 @ =gUnknown_0202E8F4\n\ + movs r0, 0x1\n\ + strb r0, [r1]\n\ + movs r0, 0x3\n\ + movs r1, 0xE\n\ + movs r2, 0x1A\n\ + movs r3, 0x13\n\ + bl MenuZeroFillWindowRect\n\ + movs r0, 0x1\n\ + bl PlaySE\n\ + ldr r0, [r4]\n\ + ldrb r1, [r4, 0x5]\n\ + bl PartyMenuUpdateLevelOrStatus\n\ + bl IsDoubleBattle\n\ + adds r1, r0, 0\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldrb r1, [r4, 0x5]\n\ + lsls r1, 1\n\ + adds r0, r1\n\ + ldr r1, _080701C4 @ =gUnknown_083769A8\n\ + adds r0, r1\n\ + movs r1, 0x9\n\ + bl task_pc_turn_off\n\ + ldr r2, _080701C8 @ =0xfffff261\n\ + adds r1, r4, r2\n\ + movs r0, 0x2\n\ + strb r0, [r1]\n\ + ldr r0, [r4]\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + ldrh r1, [r6, 0x16]\n\ + subs r0, r1\n\ + strh r0, [r6, 0x18]\n\ + movs r0, 0x1\n\ + strh r0, [r6, 0x1C]\n\ + ldr r1, _080701CC @ =0xfffff27e\n\ + adds r0, r4, r1\n\ + movs r1, 0x1\n\ + strh r1, [r0]\n\ + ldr r2, _080701D0 @ =0xfffff280\n\ + adds r0, r4, r2\n\ + strh r1, [r0]\n\ + ldrh r1, [r6, 0x16]\n\ + adds r2, 0x2\n\ + adds r0, r4, r2\n\ + strh r1, [r0]\n\ + ldr r0, _080701D4 @ =0xffff8000\n\ + str r0, [r4, 0xC]\n\ + ldr r1, [sp]\n\ + add r1, r10\n\ + ldr r0, _080701D8 @ =sub_806F8AC\n\ + str r0, [r1]\n\ +_080701B0:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080701C0: .4byte gUnknown_0202E8F4\n\ +_080701C4: .4byte gUnknown_083769A8\n\ +_080701C8: .4byte 0xfffff261\n\ +_080701CC: .4byte 0xfffff27e\n\ +_080701D0: .4byte 0xfffff280\n\ +_080701D4: .4byte 0xffff8000\n\ +_080701D8: .4byte sub_806F8AC\n\ + .syntax divided\n"); +} +#endif + + +asm(".section .text_c"); + +void sub_8070848(u8 taskId) { + u8 i; + + MenuDrawTextWindow(11, 0, 29, 7); + + for (i = 0; i < DATA_COUNT; i++) { + u8 x; + u8 y; + u32 stat; + struct Pokemon **pokemon; + + pokemon = &unk_201C000.pokemon; + asm("" ::: "r0"); + stat = GetMonData(*pokemon, gUnknown_08376D1C[i]); + + unk_201B260.var04[i + DATA_COUNT] = stat; + unk_201B260.var04[i] = stat - unk_201B260.var04[i]; + + x = (i / 3) * 9 + 11; + y = ((i % 3) << 1) + 1; + + MenuPrint_PixelCoords(gUnknown_08376D04[i], (x + 1) * 8, y * 8, 1); + + + if (i == 2) { + MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); + } else { + MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); + } + + gStringVar1[0] = 0xFC; + gStringVar1[1] = 0x14; + gStringVar1[2] = 0x06; + + ConvertIntToDecimalStringN(gStringVar1 + 3, unk_201B260.var04[i], 1, 2); + + MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); + } +} |