diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2019-05-20 10:15:31 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2019-05-20 10:15:31 -0400 |
commit | 68ac134c0c82db82e0b59b071d766108c3bbd9f6 (patch) | |
tree | 5fdc26c242d19f8451a6ec140297c75d0f55e372 | |
parent | 8583174c801fd5ce13fa0fefbd9daa9f1e6ba193 (diff) |
Finish wireless_communication_status_screen
-rw-r--r-- | asm/wireless_communication_status_screen.s | 310 | ||||
-rw-r--r-- | include/librfu.h | 27 | ||||
-rw-r--r-- | include/link_rfu.h | 1 | ||||
-rw-r--r-- | include/union_room.h | 149 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/wireless_communication_status_screen.c | 128 |
6 files changed, 297 insertions, 319 deletions
diff --git a/asm/wireless_communication_status_screen.s b/asm/wireless_communication_status_screen.s deleted file mode 100644 index f0bb19614..000000000 --- a/asm/wireless_communication_status_screen.s +++ /dev/null @@ -1,310 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_814F65C -sub_814F65C: @ 814F65C - push {r4-r7,lr} - sub sp, 0x18 - mov r12, r2 - ldr r2, [sp, 0x2C] - ldr r4, [sp, 0x30] - lsls r0, 24 - lsrs r7, r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - lsls r3, 24 - lsrs r6, r3, 24 - lsls r2, 24 - lsrs r3, r2, 24 - lsls r4, 24 - lsrs r0, r4, 24 - cmp r0, 0x4 - bhi _0814F6E6 - lsls r0, 2 - ldr r1, _0814F688 @ =_0814F68C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0814F688: .4byte _0814F68C - .align 2, 0 -_0814F68C: - .4byte _0814F6A0 - .4byte _0814F6AE - .4byte _0814F6BC - .4byte _0814F6CA - .4byte _0814F6D8 -_0814F6A0: - add r1, sp, 0x14 - movs r0, 0 - strb r0, [r1] - movs r0, 0x2 - strb r0, [r1, 0x1] - movs r0, 0x3 - b _0814F6E4 -_0814F6AE: - add r1, sp, 0x14 - movs r0, 0 - strb r0, [r1] - movs r0, 0x1 - strb r0, [r1, 0x1] - movs r0, 0x3 - b _0814F6E4 -_0814F6BC: - add r1, sp, 0x14 - movs r0, 0 - strb r0, [r1] - movs r0, 0x4 - strb r0, [r1, 0x1] - movs r0, 0x5 - b _0814F6E4 -_0814F6CA: - add r1, sp, 0x14 - movs r0, 0 - strb r0, [r1] - movs r0, 0x7 - strb r0, [r1, 0x1] - movs r0, 0x6 - b _0814F6E4 -_0814F6D8: - add r1, sp, 0x14 - movs r0, 0 - strb r0, [r1] - movs r0, 0x1 - strb r0, [r1, 0x1] - movs r0, 0x2 -_0814F6E4: - strb r0, [r1, 0x2] -_0814F6E6: - negs r0, r5 - orrs r0, r5 - lsrs r0, 31 - str r0, [sp] - movs r0, 0 - str r0, [sp, 0x4] - add r0, sp, 0x14 - str r0, [sp, 0x8] - movs r0, 0x1 - negs r0, r0 - str r0, [sp, 0xC] - mov r0, r12 - str r0, [sp, 0x10] - adds r0, r7, 0 - adds r1, r5, 0 - adds r2, r6, 0 - bl AddTextPrinterParametrized2 - add sp, 0x18 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_814F65C - - thumb_func_start sub_814F714 -sub_814F714: @ 814F714 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - mov r12, r0 - adds r7, r1, 0 - ldrb r0, [r0, 0xA] - lsls r0, 25 - lsrs r0, 25 - mov r8, r0 - movs r4, 0 - ldr r0, _0814F78C @ =gUnknown_846FAC0 - mov r9, r0 - movs r1, 0x1 - add r1, r9 - mov r10, r1 - mov r3, r12 - adds r3, 0x4 - str r3, [sp] -_0814F73E: - lsls r0, r4, 1 - adds r2, r0, r4 - mov r3, r9 - adds r1, r2, r3 - adds r5, r0, 0 - adds r6, r4, 0x1 - ldrb r1, [r1] - cmp r8, r1 - bne _0814F7A2 - mov r0, r12 - ldrb r1, [r0, 0x1A] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x1 - bne _0814F7A2 - mov r0, r9 - adds r0, 0x2 - adds r3, r2, r0 - ldrb r0, [r3] - cmp r0, 0 - bne _0814F790 - movs r2, 0 - movs r1, 0 - ldr r3, [sp] -_0814F76E: - adds r0, r3, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _0814F778 - adds r2, 0x1 -_0814F778: - adds r1, 0x1 - cmp r1, 0x3 - ble _0814F76E - adds r2, 0x1 - adds r0, r5, r4 - add r0, r10 - ldrb r1, [r0] - lsls r1, 2 - adds r1, r7 - b _0814F79C - .align 2, 0 -_0814F78C: .4byte gUnknown_846FAC0 -_0814F790: - mov r1, r10 - adds r0, r2, r1 - ldrb r1, [r0] - lsls r1, 2 - adds r1, r7 - ldrb r2, [r3] -_0814F79C: - ldr r0, [r1] - adds r0, r2 - str r0, [r1] -_0814F7A2: - adds r4, r6, 0 - cmp r4, 0x16 - bls _0814F73E - mov r0, r8 - 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_814F714 - - thumb_func_start sub_814F7BC -sub_814F7BC: @ 814F7BC - push {r4,lr} - movs r4, 0 - adds r3, r1, 0 - adds r2, r0, 0 -_0814F7C4: - ldr r1, [r2] - ldr r0, [r3] - cmp r1, r0 - beq _0814F7D0 - movs r0, 0x1 - b _0814F7DC -_0814F7D0: - adds r3, 0x4 - adds r2, 0x4 - adds r4, 0x1 - cmp r4, 0x3 - ble _0814F7C4 - movs r0, 0 -_0814F7DC: - pop {r4} - pop {r1} - bx r1 - thumb_func_end sub_814F7BC - - thumb_func_start sub_814F7E4 -sub_814F7E4: @ 814F7E4 - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x10 - adds r6, r0, 0 - mov r9, r1 - adds r5, r2, 0 - lsls r4, r3, 24 - lsrs r4, 24 - movs r0, 0 - mov r8, r0 - mov r0, sp - movs r1, 0 - movs r2, 0x10 - bl memset - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 3 - ldr r1, _0814F84C @ =gTasks+0x8 - adds r7, r0, r1 - movs r4, 0 -_0814F812: - lsls r1, r4, 5 - ldr r0, [r7] - adds r0, r1 - mov r1, sp - bl sub_814F714 - adds r1, r0, 0 - ldr r0, [r5] - cmp r1, r0 - beq _0814F82C - str r1, [r5] - movs r2, 0x1 - mov r8, r2 -_0814F82C: - adds r5, 0x4 - adds r4, 0x1 - cmp r4, 0xF - ble _0814F812 - mov r0, sp - mov r1, r9 - bl sub_814F7BC - cmp r0, 0 - bne _0814F850 - mov r3, r8 - cmp r3, 0x1 - beq _0814F874 - movs r0, 0 - b _0814F876 - .align 2, 0 -_0814F84C: .4byte gTasks+0x8 -_0814F850: - adds r1, r6, 0 - mov r0, sp - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - mov r1, r9 - mov r0, sp - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - ldr r0, [r6] - ldr r1, [r6, 0x4] - adds r0, r1 - ldr r1, [r6, 0x8] - adds r0, r1 - str r0, [r6, 0xC] -_0814F874: - movs r0, 0x1 -_0814F876: - add sp, 0x10 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_814F7E4 - - .align 2, 0 @ Don't pad with nop. diff --git a/include/librfu.h b/include/librfu.h index dbc8a41a6..90f69cb5a 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -67,6 +67,33 @@ union RfuPacket struct RfuPacket8 rfuPacket8; }; +struct UnkLinkRfuStruct_02022B14Substruct +{ + u16 unk_00_0:4; + u16 unk_00_4:1; + u16 unk_00_5:1; + u16 unk_00_6:1; + u16 unk_00_7:1; + u16 unk_01_0:1; + u16 unk_01_1:1; + u16 unk_01_2:4; + u16 unk_01_6:2; + u8 playerTrainerId[2]; +}; + +struct __attribute__((packed, aligned(2))) UnkLinkRfuStruct_02022B14 +{ + struct UnkLinkRfuStruct_02022B14Substruct unk_00; + u8 unk_04[4]; + u16 species:10; + u16 type:6; + u8 unk_0a_0:7; + u8 unk_0a_7:1; + u8 playerGender:1; + u8 unk_0b_1:7; + u8 unk_0c; +}; + struct RfuStruct { vs32 unk_0; diff --git a/include/link_rfu.h b/include/link_rfu.h index 8d02577a5..7e0ea2068 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -17,5 +17,6 @@ void MEvent_CreateTask_CardOrNewsWithFriend(u8); void MEvent_CreateTask_CardOrNewsOverWireless(u8); void MEvent_CreateTask_Leader(u8); void sub_80F9E2C(void * data); +u8 sub_8116DE0(void); #endif //GUARD_LINK_RFU_H diff --git a/include/union_room.h b/include/union_room.h new file mode 100644 index 000000000..2e97d87f4 --- /dev/null +++ b/include/union_room.h @@ -0,0 +1,149 @@ +#ifndef GUARD_UNION_ROOM_H +#define GUARD_UNION_ROOM_H + +struct UnkStruct_Shared +{ + struct UnkLinkRfuStruct_02022B14 field_0; + u8 ALIGNED(4) playerName[PLAYER_NAME_LENGTH]; +}; + +struct UnkStruct_x1C +{ + struct UnkStruct_Shared unk0; + u8 unk18:1; +}; + +struct UnkStruct_x20 +{ + struct UnkStruct_Shared unk; + u16 field_18; + u8 field_1A_0:2; + u8 field_1A_1:1; + u8 field_1B; + u8 field_1D; + u8 field_1E; + u8 field_1F; +}; + +struct UnkStruct_Main0 +{ + struct UnkStruct_x20 arr[8]; +}; + +struct UnkStruct_Main4 +{ + struct UnkStruct_x1C arr[5]; +}; + +struct UnkStruct_Main8 +{ + struct UnkStruct_x20 arr[5]; +}; + +struct UnkStruct_Leader +{ + struct UnkStruct_Main0 *field_0; + struct UnkStruct_Main4 *field_4; + struct UnkStruct_Main8 *field_8; + u8 state; + u8 textState; + u8 field_E; + u8 listWindowId; + u8 field_10; + u8 field_11; + u8 listTaskId; + u8 field_13; + u8 field_14; + u8 field_15; + u8 field_16; + u8 field_17; + u8 field_18; + u8 field_19; + u16 field_1A; +}; + +struct UnkStruct_Group +{ + struct UnkStruct_Main0 *field_0; + struct UnkStruct_Main4 *field_4; + u8 state; + u8 textState; + u8 field_A; + u8 listWindowId; + u8 field_C; + u8 field_D; + u8 listTaskId; + u8 field_F; + u8 field_10; + u8 field_11; + u8 field_12; + u8 field_13; + u8 field_14; + u8 field_15; +}; + +struct UnkStruct_8019BA8 +{ + u8 field_0; + u8 field_1; + s8 field_2; + u8 field_3; +}; + +struct UnkStruct_URoom +{ + struct UnkStruct_Main0 *field_0; + struct UnkStruct_Main4 *field_4; + struct UnkStruct_Main0 *field_8; + struct UnkStruct_Main4 *field_C; + u16 field_10; + u16 field_12; + u8 state; + u8 stateAfterPrint; + u8 textState; + u8 field_17; + u8 field_18; + u8 field_19; + u8 field_1A; + u8 field_1B; + u8 field_1C; + u8 field_1D; + u8 field_1E; + u8 field_1F; + u8 field_20; + u8 spriteIds[40]; + u8 field_49; + u8 field_4A; + u16 field_4C[6]; + u8 field_58[0x98 - 0x58]; + u16 field_98; + u16 field_9A[3]; + struct UnkStruct_8019BA8 field_A0[8]; + u8 field_C0[12][15]; + u8 field_174[48]; + u8 field_1A4[200]; +}; + +union UnkUnion_Main +{ + struct UnkStruct_Leader *leader; + struct UnkStruct_Group *group; + struct UnkStruct_URoom *uRoom; +}; + +struct TradeUnkStruct +{ + u16 field_0; + u16 type; + u32 playerPersonality; + u8 field_8; + u8 field_9; + u16 playerSpecies; + u16 playerLevel; + u16 species; + u16 level; + u16 field_12; + u32 personality; +}; + +#endif //GUARD_UNION_ROOM_H diff --git a/ld_script.txt b/ld_script.txt index a2f01cea2..6081171bb 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -252,7 +252,6 @@ SECTIONS { asm/berry_crush_2.o(.text); asm/berry_crush_3.o(.text); src/wireless_communication_status_screen.o(.text); - asm/wireless_communication_status_screen.o(.text); src/braille_text.o(.text); asm/text_window.o(.text); src/quest_log_8150454.o(.text); diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index f2a802449..4907bd6e1 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -13,11 +13,17 @@ #include "unk_text_util.h" #include "overworld.h" #include "sound.h" +#include "menu.h" +#include "librfu.h" +#include "link_rfu.h" +#include "union_room.h" #include "constants/songs.h" struct WirelessCommunicationStatusScreenStruct { - u32 field_00[6][4]; + u32 field_00[4]; + u32 field_10[4]; + u32 field_20[16]; u8 field_60; u8 field_61; u8 filler_62[0xA]; @@ -37,9 +43,8 @@ extern const u8 gUnknown_841E29E[]; void sub_814F1E4(void); void sub_814F46C(u8 taskId); -u8 sub_8116DE0(void); void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx); -bool32 sub_814F7E4(u32 * a0, u32 * a1, u32 * a2, u8 a3); +bool32 sub_814F7E4(u32 * a0, u32 * a1, u32 * a2, u8 taskId); const u16 gUnknown_846F4D0[][16] = { INCBIN_U16("graphics/misc/unk_846f4d0.gbapal"), @@ -148,8 +153,7 @@ const u8 gUnknown_846FAC0[][3] = { {0x54, 0x02, 0x01}, {0x53, 0x02, 0x02}, {0x51, 0x02, 0x01}, - {0x52, 0x02, 0x01}, - {0x00, 0x00, 0x00} + {0x52, 0x02, 0x01} }; void sub_814F19C(void) @@ -197,7 +201,7 @@ void sub_814F1E4(void) SetVBlankCallback(sub_814F1C0); gUnknown_3002040->field_60 = CreateTask(sub_814F46C, 0); gUnknown_3002040->field_61 = sub_8116DE0(); - gUnknown_3002040->field_00[1][3] = 1; + gUnknown_3002040->field_10[3] = 1; ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); ChangeBgX(1, 0, 0); @@ -287,12 +291,12 @@ void sub_814F46C(u8 taskId) gTasks[taskId].data[0]++; break; case 3: - if (sub_814F7E4(gUnknown_3002040->field_00[0], gUnknown_3002040->field_00[1], gUnknown_3002040->field_00[2], gUnknown_3002040->field_61)) + if (sub_814F7E4(gUnknown_3002040->field_00, gUnknown_3002040->field_10, gUnknown_3002040->field_20, gUnknown_3002040->field_61)) { FillWindowPixelBuffer(2, 0x00); for (i = 0; i < 4; i++) { - ConvertIntToDecimalStringN(gStringVar4, gUnknown_3002040->field_00[0][i], STR_CONV_MODE_RIGHT_ALIGN, 2); + ConvertIntToDecimalStringN(gStringVar4, gUnknown_3002040->field_00[i], STR_CONV_MODE_RIGHT_ALIGN, 2); if (i != 3) sub_814F65C(2, 3, gStringVar4, 4, 30 * i + 10, 1); else @@ -322,3 +326,111 @@ void sub_814F46C(u8 taskId) break; } } + +void sub_814F65C(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 palIdx) +{ + struct TextColor textColor; + switch (palIdx) + { + case 0: + textColor.fgColor = 0; + textColor.bgColor = 2; + textColor.shadowColor = 3; + break; + case 1: + textColor.fgColor = 0; + textColor.bgColor = 1; + textColor.shadowColor = 3; + break; + case 2: + textColor.fgColor = 0; + textColor.bgColor = 4; + textColor.shadowColor = 5; + break; + case 3: + textColor.fgColor = 0; + textColor.bgColor = 7; + textColor.shadowColor = 6; + break; + case 4: + textColor.fgColor = 0; + textColor.bgColor = 1; + textColor.shadowColor = 2; + break; + // default: UB + } + AddTextPrinterParametrized2(windowId, fontId,x, y, fontId == 0 ? 0 : 1, 0, &textColor, -1, str); +} + +u32 sub_814F714(struct UnkStruct_x20 * unk20, u32 * arg1) +{ + u32 r8 = unk20->unk.field_0.unk_0a_0; + s32 i, j, k; + + for (i = 0; i < NELEMS(gUnknown_846FAC0); i++) + { + if (r8 == gUnknown_846FAC0[i][0] && unk20->field_1A_0 == 1) + { + if (gUnknown_846FAC0[i][2] == 0) + { + k = 0; + for (j = 0; j < 4; j++) + { + if (unk20->unk.field_0.unk_04[j] != 0) k++; + } + k++; + arg1[gUnknown_846FAC0[i][1]] += k; + } + else + { + arg1[gUnknown_846FAC0[i][1]] += gUnknown_846FAC0[i][2]; + } + } + } + + return r8; +} + +bool32 sub_814F7BC(const u32 * ptr0, const u32 * ptr1) +{ + s32 i; + + for (i = 0; i < 4; i++) + { + if (ptr0[i] != ptr1[i]) + return TRUE; + } + + return FALSE; +} + +bool32 sub_814F7E4(u32 * a0, u32 * a1, u32 * a2, u8 taskId) +{ + bool32 r8 = FALSE; + u32 sp0[4] = {0, 0, 0, 0}; + struct UnkStruct_Group * group = (void *)gTasks[taskId].data; + s32 i; + + for (i = 0; i < 16; i++) + { + u32 r1 = sub_814F714(&group->field_0->arr[i], sp0); + if (r1 != a2[i]) + { + a2[i] = r1; + r8 = TRUE; + } + } + + if (sub_814F7BC(sp0, a1) == FALSE) + { + if (r8 == TRUE) + return TRUE; + else + return FALSE; + } + + memcpy(a0, sp0, sizeof(sp0)); + memcpy(a1, sp0, sizeof(sp0)); + a0[3] = a0[0] + a0[1] + a0[2]; + return TRUE; +} |