diff --git a/asm/overlay_53.s b/asm/overlay_53.s index 8eac21428..0289e9d60 100644 --- a/asm/overlay_53.s +++ b/asm/overlay_53.s @@ -21,457 +21,13 @@ .extern ov53_021E6908 .extern ov53_021E6928 .extern ov53_021E6988 - - thumb_func_start ov53_021E6B9C -ov53_021E6B9C: ; 0x021E6B9C - push {r3, r4} - mov r2, #0x1f - add r4, r0, #0 - asr r3, r0, #5 - and r4, r2 - and r3, r2 - asr r0, r0, #0xa - add r4, r4, r1 - add r3, r3, r1 - add r0, r0, r1 - cmp r4, #0x1f - ble _021E6BB8 - add r4, r2, #0 - b _021E6BBE -_021E6BB8: - cmp r4, #0 - bge _021E6BBE - mov r4, #0 -_021E6BBE: - cmp r3, #0x1f - ble _021E6BC6 - mov r3, #0x1f - b _021E6BCC -_021E6BC6: - cmp r3, #0 - bge _021E6BCC - mov r3, #0 -_021E6BCC: - cmp r0, #0x1f - ble _021E6BD4 - mov r0, #0x1f - b _021E6BDA -_021E6BD4: - cmp r0, #0 - bge _021E6BDA - mov r0, #0 -_021E6BDA: - lsl r1, r0, #0xa - lsl r0, r3, #5 - orr r0, r1 - orr r0, r4 - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - pop {r3, r4} - bx lr - .balign 4, 0 - thumb_func_end ov53_021E6B9C - - thumb_func_start ov53_021E6BEC -ov53_021E6BEC: ; 0x021E6BEC - push {r3, r4, r5, r6, lr} - sub sp, #4 - add r5, r0, #0 - ldr r0, _021E6C9C ; =0x00000163 - add r6, r1, #0 - ldrb r0, [r5, r0] - mov r4, #0 - mov r1, #1 - cmp r0, #0 - beq _021E6C06 - cmp r0, #1 - beq _021E6C06 - add r1, r4, #0 -_021E6C06: - cmp r1, #0 - bne _021E6C0E - bl GF_AssertFail -_021E6C0E: - cmp r6, #0 - bne _021E6C2E - mov r0, #0x5a - lsl r0, r0, #2 - ldr r2, [r5, r0] - add r1, r2, #1 - str r1, [r5, r0] - mov r0, #0xa - mul r0, r2 - lsl r0, r0, #0x10 - lsr r0, r0, #0x10 - bl GF_SinDeg - lsl r0, r0, #3 - asr r4, r0, #0xc - b _021E6C36 -_021E6C2E: - mov r0, #0x5a - mov r1, #0 - lsl r0, r0, #2 - str r1, [r5, r0] -_021E6C36: - ldr r0, _021E6CA0 ; =0x00000136 - lsl r1, r4, #0x18 - ldrh r0, [r5, r0] - asr r1, r1, #0x18 - bl ov53_021E6B9C - add r1, sp, #0 - strh r0, [r1] - ldr r0, _021E6CA4 ; =0x00001CFF - mov r1, #0 - bl ov53_021E6B9C - add r1, sp, #0 - strh r0, [r1, #2] - ldr r3, _021E6C9C ; =0x00000163 - mov r0, #6 - ldrb r3, [r5, r3] - add r1, sp, #0 - mov r2, #4 - lsl r4, r3, #2 - ldr r3, _021E6CA8 ; =ov53_021E8508 - ldr r3, [r3, r4] - lsl r3, r3, #0x11 - lsr r3, r3, #0x10 - bl BG_LoadPlttData - ldr r0, _021E6CA0 ; =0x00000136 - add r1, sp, #0 - ldrh r2, [r5, r0] - add r0, #0x2d - strh r2, [r1] - ldr r2, _021E6CAC ; =0x0000739B - strh r2, [r1, #2] - ldrb r0, [r5, r0] - cmp r0, #0 - bne _021E6C82 - mov r3, #1 - b _021E6C84 -_021E6C82: - mov r3, #0 -_021E6C84: - lsl r4, r3, #2 - ldr r3, _021E6CA8 ; =ov53_021E8508 - mov r0, #6 - ldr r3, [r3, r4] - add r1, sp, #0 - lsl r3, r3, #0x11 - mov r2, #4 - lsr r3, r3, #0x10 - bl BG_LoadPlttData - add sp, #4 - pop {r3, r4, r5, r6, pc} - .balign 4, 0 -_021E6C9C: .word 0x00000163 -_021E6CA0: .word 0x00000136 -_021E6CA4: .word 0x00001CFF -_021E6CA8: .word ov53_021E8508 -_021E6CAC: .word 0x0000739B - thumb_func_end ov53_021E6BEC - - thumb_func_start ov53_021E6CB0 -ov53_021E6CB0: ; 0x021E6CB0 - push {r3, lr} - ldr r1, _021E6CD8 ; =0x00000136 - mov r2, #4 - ldrh r1, [r0, r1] - add r0, sp, #0 - mov r3, #0x18 - strh r1, [r0] - ldr r1, _021E6CDC ; =0x0000739B - strh r1, [r0, #2] - mov r0, #6 - add r1, sp, #0 - bl BG_LoadPlttData - mov r0, #6 - add r1, sp, #0 - mov r2, #4 - mov r3, #0x1c - bl BG_LoadPlttData - pop {r3, pc} - .balign 4, 0 -_021E6CD8: .word 0x00000136 -_021E6CDC: .word 0x0000739B - thumb_func_end ov53_021E6CB0 - - thumb_func_start ov53_021E6CE0 -ov53_021E6CE0: ; 0x021E6CE0 - push {r3, r4, r5, r6, lr} - sub sp, #0xc - ldr r3, _021E6DD8 ; =ov53_021E8530 - add r5, r0, #0 - mov r4, #0 - add r2, sp, #0 - mov r1, #0xc -_021E6CEE: - ldrb r0, [r3] - add r3, r3, #1 - strb r0, [r2] - add r2, r2, #1 - sub r1, r1, #1 - bne _021E6CEE - ldr r0, _021E6DDC ; =gSystem + 0x40 - ldrh r0, [r0, #0x24] - cmp r0, #0 - beq _021E6D38 - add r0, sp, #0 - bl TouchscreenHitbox_FindRectAtTouchNew - add r6, r0, #0 - mov r0, #0 - mvn r0, r0 - cmp r6, r0 - beq _021E6DD0 - ldr r0, _021E6DE0 ; =0x00000163 - mov r1, #1 - strb r6, [r5, r0] - add r2, r0, #3 - strb r1, [r5, r2] - mov r2, #2 - add r0, r0, #2 - strb r2, [r5, r0] - add r0, r5, #0 - bl ov53_021E6BEC - ldr r0, _021E6DE4 ; =SEQ_SE_DP_SELECT - bl PlaySE - mov r0, #0x5f - lsl r0, r0, #2 - str r6, [r5, r0] - mov r4, #1 - b _021E6DD0 -_021E6D38: - ldr r0, _021E6DE8 ; =0x00000162 - ldrb r0, [r5, r0] - cmp r0, #0 - bne _021E6D5E - ldr r0, _021E6DEC ; =gSystem - ldr r1, [r0, #0x48] - mov r0, #0x31 - tst r0, r1 - beq _021E6DD0 - ldr r0, _021E6DE4 ; =SEQ_SE_DP_SELECT - bl PlaySE - ldr r0, _021E6DE8 ; =0x00000162 - mov r1, #1 - strb r1, [r5, r0] - add r0, r5, #0 - bl ov53_021E6BEC - b _021E6DD0 -_021E6D5E: - add r0, r5, #0 - mov r1, #0 - bl ov53_021E6BEC - ldr r0, _021E6DEC ; =gSystem - mov r1, #0x20 - ldr r0, [r0, #0x48] - tst r1, r0 - beq _021E6D84 - ldr r0, _021E6DE0 ; =0x00000163 - ldrb r1, [r5, r0] - cmp r1, #0 - beq _021E6DD0 - sub r1, r1, #1 - strb r1, [r5, r0] - ldr r0, _021E6DE4 ; =SEQ_SE_DP_SELECT - bl PlaySE - b _021E6DD0 -_021E6D84: - mov r1, #0x10 - tst r1, r0 - beq _021E6DA4 - ldr r0, _021E6DE0 ; =0x00000163 - sub r1, r0, #2 - ldrb r1, [r5, r1] - ldrb r2, [r5, r0] - sub r1, r1, #1 - cmp r2, r1 - beq _021E6DD0 - add r1, r2, #1 - strb r1, [r5, r0] - ldr r0, _021E6DE4 ; =SEQ_SE_DP_SELECT - bl PlaySE - b _021E6DD0 -_021E6DA4: - mov r1, #1 - tst r0, r1 - beq _021E6DD0 - ldr r0, _021E6DE8 ; =0x00000162 - mov r2, #0 - strb r2, [r5, r0] - add r2, r0, #4 - strb r1, [r5, r2] - mov r2, #2 - add r0, r0, #3 - strb r2, [r5, r0] - add r0, r5, #0 - bl ov53_021E6BEC - ldr r0, _021E6DE4 ; =SEQ_SE_DP_SELECT - bl PlaySE - ldr r0, _021E6DE0 ; =0x00000163 - mov r4, #1 - ldrb r1, [r5, r0] - add r0, #0x19 - str r1, [r5, r0] -_021E6DD0: - add r0, r4, #0 - add sp, #0xc - pop {r3, r4, r5, r6, pc} - nop -_021E6DD8: .word ov53_021E8530 -_021E6DDC: .word gSystem + 0x40 -_021E6DE0: .word 0x00000163 -_021E6DE4: .word SEQ_SE_DP_SELECT -_021E6DE8: .word 0x00000162 -_021E6DEC: .word gSystem - thumb_func_end ov53_021E6CE0 - - thumb_func_start ov53_021E6DF0 -ov53_021E6DF0: ; 0x021E6DF0 - mov r1, #5 - mov r2, #0 - lsl r1, r1, #6 - str r2, [r0, r1] - add r1, r1, #4 - str r2, [r0, r1] - bx lr - .balign 4, 0 - thumb_func_end ov53_021E6DF0 - - thumb_func_start ov53_021E6E00 -ov53_021E6E00: ; 0x021E6E00 - push {r3, r4, r5, r6, r7, lr} - sub sp, #0x40 - mov r1, #0x51 - add r2, r0, #0 - lsl r1, r1, #2 - ldr r0, [r2, r1] - mov r7, #0 - cmp r0, #0 - beq _021E6E16 - sub r0, r0, #1 - b _021E6E22 -_021E6E16: - sub r0, r1, #4 - ldr r0, [r2, r0] - add r3, r0, #1 - sub r0, r1, #4 - str r3, [r2, r0] - mov r0, #8 -_021E6E22: - mov r3, #0x4d - lsl r3, r3, #2 - str r0, [r2, r1] - ldrh r0, [r2, r3] - cmp r0, #0 - bne _021E6E34 - ldr r6, _021E6E74 ; =ov53_021E859C - add r5, sp, #0x28 - b _021E6E38 -_021E6E34: - ldr r6, _021E6E78 ; =ov53_021E85B4 - add r5, sp, #0x10 -_021E6E38: - add r4, r5, #0 - ldmia r6!, {r0, r1} - stmia r5!, {r0, r1} - ldmia r6!, {r0, r1} - stmia r5!, {r0, r1} - ldmia r6!, {r0, r1} - add r3, #0xc - stmia r5!, {r0, r1} - ldr r0, [r2, r3] - lsl r0, r0, #2 - ldr r1, [r4, r0] - cmp r1, #0xff - bne _021E6E56 - mov r7, #1 - b _021E6E6C -_021E6E56: - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - str r0, [sp, #8] - ldr r0, [r2] - mov r3, #1 - str r0, [sp, #0xc] - ldr r2, [r2, #0x18] - mov r0, #0x78 - bl GfGfxLoader_LoadCharData -_021E6E6C: - add r0, r7, #0 - add sp, #0x40 - pop {r3, r4, r5, r6, r7, pc} - nop -_021E6E74: .word ov53_021E859C -_021E6E78: .word ov53_021E85B4 - thumb_func_end ov53_021E6E00 - - thumb_func_start ov53_021E6E7C -ov53_021E6E7C: ; 0x021E6E7C - push {r3, r4, lr} - sub sp, #0x1c - add r0, sp, #0xc - add r1, sp, #0 - mov r4, #msg_0219_00001 - bl GF_RTC_CopyDateTime - ldr r0, [sp] - ldr r3, [sp, #4] - mov r1, #0x64 - add r2, r0, #0 - mul r2, r1 - add r0, r3, r2 - lsl r1, r1, #2 - cmp r0, r1 - blo _021E6EA2 - ldr r1, _021E6EE4 ; =0x00000423 - cmp r0, r1 - bls _021E6EDC -_021E6EA2: - ldr r1, _021E6EE8 ; =0x0000044C - cmp r0, r1 - blo _021E6EB2 - ldr r1, _021E6EEC ; =0x00000617 - cmp r0, r1 - bhi _021E6EB2 - mov r4, #msg_0219_00002 - b _021E6EDC -_021E6EB2: - mov r1, #0x19 - lsl r1, r1, #6 - cmp r0, r1 - blo _021E6EC4 - ldr r1, _021E6EF0 ; =0x00000743 - cmp r0, r1 - bhi _021E6EC4 - mov r4, #msg_0219_00003 - b _021E6EDC -_021E6EC4: - ldr r1, _021E6EF4 ; =0x0000076C - cmp r0, r1 - blo _021E6ED4 - ldr r1, _021E6EF8 ; =0x00000937 - cmp r0, r1 - bhi _021E6ED4 - mov r4, #msg_0219_00004 - b _021E6EDC -_021E6ED4: - ldr r1, _021E6EFC ; =0x00000167 - cmp r0, r1 - bhi _021E6EDC - mov r4, #msg_0219_00005 -_021E6EDC: - add r0, r4, #0 - add sp, #0x1c - pop {r3, r4, pc} - nop -_021E6EE4: .word 0x00000423 -_021E6EE8: .word 0x0000044C -_021E6EEC: .word 0x00000617 -_021E6EF0: .word 0x00000743 -_021E6EF4: .word 0x0000076C -_021E6EF8: .word 0x00000937 -_021E6EFC: .word 0x00000167 - thumb_func_end ov53_021E6E7C + .extern ov53_021E6B9C + .extern ov53_021E6BEC + .extern ov53_021E6CB0 + .extern ov53_021E6CE0 + .extern ov53_021E6DF0 + .extern ov53_021E6E00 + .extern ov53_021E6E7C thumb_func_start ov53_021E6F00 ov53_021E6F00: ; 0x021E6F00 diff --git a/scripts/palconv.sh b/scripts/palconv.sh new file mode 100755 index 000000000..2e39a179f --- /dev/null +++ b/scripts/palconv.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +# palconv + +if [ $# -ne 1 ]; then + echo -e "usage: $(basename "$0") RGBHEX" 1>&2 + exit 1 +fi +if ! [[ $1 =~ ^(0x[0-9a-fA-F]+|[0-9]+)$ ]]; then + echo -e "error: could not interpret color as base 10 or 16 integer" 1>&2 + exit 1 +fi +printf "RGB(%d, %d, %d)\n" $((($1)&31)) $((($1>>5)&31)) $((($1>>10)&31)) diff --git a/src/oaks_speech.c b/src/oaks_speech.c index d8746edc6..56c1537e8 100644 --- a/src/oaks_speech.c +++ b/src/oaks_speech.c @@ -3,11 +3,13 @@ #include "global.h" #include "msgdata/msg.naix" +#include "msgdata/msg/msg_0219.h" #include "font.h" #include "gf_gfx_loader.h" #include "launch_application.h" #include "main.h" +#include "math_util.h" #include "overlay_36.h" #include "overlay_manager.h" #include "player_data.h" @@ -69,9 +71,11 @@ typedef struct OaksSpeechData { u16 unk_136; u8 filler_138[0x4]; int unk_13C; - u8 filler_140[0x20]; + int unk_140; + int unk_144; + u8 filler_148[0x18]; OakSpeechData_Sub160 unk_160; - u8 filler_168[4]; + int unk_168; int unk_16C; u8 filler_170[0x8]; OaksSpeechData_Sub178 *unk_178; @@ -99,6 +103,13 @@ void ov53_021E6824(OaksSpeechData *data, int a1); void ov53_021E6908(OakSpeechData_Sub160 *dest, int a1); void ov53_021E6928(OaksSpeechData *data, int a1); int ov53_021E6988(OaksSpeechData *data, int a1); +u16 ov53_021E6B9C(u16 a0, s8 a1); +void ov53_021E6BEC(OaksSpeechData *data, int a1); +void ov53_021E6CB0(OaksSpeechData *data); +BOOL ov53_021E6CE0(OaksSpeechData *data); +void ov53_021E6DF0(OaksSpeechData *data); +BOOL ov53_021E6E00(OaksSpeechData *data); +int ov53_021E6E7C(OaksSpeechData *data); BOOL ov53_021E6F9C(OaksSpeechData *data); void ov53_021E7ECC(OaksSpeechData *data); void ov53_021E7F24(OaksSpeechData *data); @@ -111,6 +122,7 @@ extern const WindowTemplate ov53_021E8500; extern const int ov53_021E86B0[][4]; extern const WindowTemplate ov53_021E8680[][3]; extern const int ov53_021E8604[][3]; +extern const int ov53_021E8508[]; // note: this is an artifact from -ipa file extern const u32 ov53_021E84F8[]; @@ -854,3 +866,163 @@ int ov53_021E6988(OaksSpeechData *data, int a1) { return ret; } + +u16 ov53_021E6B9C(u16 a0, s8 a1) { + int r = a0 & 0x1F; + int g = (a0 >> 5) & 0x1F; + int b = (a0 >> 10); + + r += a1; + g += a1; + b += a1; + + if (r > 31) { + r = 31; + } else if (r < 0) { + r = 0; + } + if (g > 31) { + g = 31; + } else if (g < 0) { + g = 0; + } + if (b > 31) { + b = 31; + } else if (b < 0) { + b = 0; + } + return (b << 10) | (g << 5) | r; +} + +void ov53_021E6BEC(OaksSpeechData *data, int a1) { + int r4 = 0; + u16 sp0[2]; + + GF_ASSERT(data->unk_160.unk_3 == 0 || data->unk_160.unk_3 == 1); + if (a1 == 0) { + r4 = (GF_SinDeg((data->unk_168++) * 10) * 8) >> FX32_SHIFT; + } else { + data->unk_168 = 0; + } + sp0[0] = ov53_021E6B9C(data->unk_136, r4); + sp0[1] = ov53_021E6B9C(RGB(31, 7, 7), 0); + BG_LoadPlttData(6, sp0, 4, ov53_021E8508[data->unk_160.unk_3] * 2); + sp0[0] = data->unk_136; + sp0[1] = RGB(27, 28, 28); + BG_LoadPlttData(6, sp0, 4, ov53_021E8508[!data->unk_160.unk_3] * 2); +} + +void ov53_021E6CB0(OaksSpeechData *data) { + u16 sp0[2]; + + sp0[0] = data->unk_136; + sp0[1] = RGB(27, 28, 28); + BG_LoadPlttData(6, sp0, 4, 0x18); + BG_LoadPlttData(6, sp0, 4, 0x1C); +} + +BOOL ov53_021E6CE0(OaksSpeechData *data) { + BOOL ret = FALSE; + int r6; + + extern const TouchscreenHitbox ov53_021E8530[3]; + TouchscreenHitbox sp0[3]; + ARRAY_ASSIGN(sp0, ov53_021E8530); + + if (gSystem.touchNew) { + r6 = TouchscreenHitbox_FindRectAtTouchNew(sp0); + if (r6 != -1) { + data->unk_160.unk_3 = r6; + data->unk_160.unk_6 = 1; + data->unk_160.unk_5 = 2; + ov53_021E6BEC(data, 1); + PlaySE(SEQ_SE_DP_SELECT); + data->unk_17C = r6; + ret = TRUE; + } + } else if (!data->unk_160.unk_2) { + if (gSystem.newKeys & (PAD_BUTTON_A | PAD_KEY_LEFT | PAD_KEY_RIGHT)) { + PlaySE(SEQ_SE_DP_SELECT); + data->unk_160.unk_2 = 1; + ov53_021E6BEC(data, 1); + } + } else { + ov53_021E6BEC(data, 0); + if (gSystem.newKeys & PAD_KEY_LEFT) { + if (data->unk_160.unk_3 != 0) { + --data->unk_160.unk_3; + PlaySE(SEQ_SE_DP_SELECT); + } + } else if (gSystem.newKeys & PAD_KEY_RIGHT) { + if (data->unk_160.unk_3 != data->unk_160.unk_1 - 1) { + ++data->unk_160.unk_3; + PlaySE(SEQ_SE_DP_SELECT); + } + } else if (gSystem.newKeys & PAD_BUTTON_A) { + data->unk_160.unk_2 = 0; + data->unk_160.unk_6 = 1; + data->unk_160.unk_5 = 2; + ov53_021E6BEC(data, 1); + PlaySE(SEQ_SE_DP_SELECT); + ret = TRUE; + data->unk_17C = data->unk_160.unk_3; + } + } + + return ret; +} + +void ov53_021E6DF0(OaksSpeechData *data) { + data->unk_140 = 0; + data->unk_144 = 0; +} + +BOOL ov53_021E6E00(OaksSpeechData *data) { + BOOL ret = FALSE; + int r1; + + if (data->unk_144 != 0) { + --data->unk_144; + } else { + ++data->unk_140; + data->unk_144 = 8; + } + if (data->playerGender == PLAYER_GENDER_MALE) { + extern const int ov53_021E859C[6]; + int sp28[6]; + ARRAY_ASSIGN(sp28, ov53_021E859C); + r1 = sp28[data->unk_140]; + } else { + extern const int ov53_021E85B4[6]; + int sp10[6]; + ARRAY_ASSIGN(sp10, ov53_021E85B4); + r1 = sp10[data->unk_140]; + } + if (r1 == 0xFF) { + ret = TRUE; + } else { + GfGfxLoader_LoadCharData(NARC_a_1_2_0, r1, data->bgConfig, GF_BG_LYR_MAIN_1, 0, 0, FALSE, data->heapId); + } + + return ret; +} + +int ov53_021E6E7C(OaksSpeechData *data) { + RTCDate date; + RTCTime time; + int ret = msg_0219_00001; + GF_RTC_CopyDateTime(&date, &time); + u32 time_hhmm = time.minute + time.hour * 100; + if (time_hhmm >= 400 && time_hhmm <= 1059) { + ret = msg_0219_00001; + } else if (time_hhmm >= 1100 && time_hhmm <= 1559) { + ret = msg_0219_00002; + } else if (time_hhmm >= 1600 && time_hhmm <= 1859) { + ret = msg_0219_00003; + } else if (time_hhmm >= 1900 && time_hhmm <= 2359) { + ret = msg_0219_00004; + } else if (time_hhmm >= 0 && time_hhmm <= 359) { + ret = msg_0219_00005; + } + return ret; +}