diff --git a/Makefile b/Makefile index a4c4568c..99b1d5c6 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ MID_BUILDDIR = $(OBJ_DIR)/$(MID_SUBDIR) ASFLAGS := -mcpu=arm7tdmi --defsym $(GAME_VERSION)=1 --defsym REVISION=$(REVISION) --defsym $(GAME_LANGUAGE)=1 CC1 := tools/agbcc/bin/agbcc -override CFLAGS += -Wimplicit -Wparentheses -Werror -O2 +override CFLAGS += -Wimplicit -Wparentheses -Werror -Wno-multichar -O2 # -fhex-asm ifeq ($(DINFO),1) diff --git a/asm/code_08055FF4.s b/asm/code_08055FF4.s deleted file mode 100644 index 0effa9a0..00000000 --- a/asm/code_08055FF4.s +++ /dev/null @@ -1,369 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080560B8 -sub_080560B8: @ 0x080560B8 - push {r4, lr} - bl sub_08056134 - cmp r0, #0 - bne _080560F8 - movs r0, #0x80 - lsls r0, r0, #0x12 - bl sub_0807CF30 - adds r1, r0, #0 - movs r0, #1 - rsbs r0, r0, #0 - cmp r1, r0 - blt _080560E4 - cmp r1, #0 - ble _080560E4 - cmp r1, #1 - bne _080560E4 - bl sub_08056134 - cmp r0, #0 - bne _080560F8 -_080560E4: - ldr r0, _08056128 @ =gUnk_08100CD4 - movs r4, #0x80 - lsls r4, r4, #0x12 - adds r1, r4, #0 - movs r2, #0x10 - bl _DmaCopy - adds r0, r4, #0 - bl sub_0807CF10 -_080560F8: - ldr r2, _0805612C @ =gUnk_02000010 - ldr r1, [r2] - ldr r0, _08056130 @ =0x4D435A33 - eors r1, r0 - rsbs r0, r1, #0 - orrs r0, r1 - lsrs r0, r0, #0x1f - ldrb r1, [r2, #4] - cmp r1, #0 - beq _08056112 - cmp r1, #0xc1 - beq _08056112 - movs r0, #1 -_08056112: - cmp r0, #0 - beq _08056124 - ldr r4, _0805612C @ =gUnk_02000010 - adds r0, r4, #0 - movs r1, #0x20 - bl _DmaZero - ldr r0, _08056130 @ =0x4D435A33 - str r0, [r4] -_08056124: - pop {r4, pc} - .align 2, 0 -_08056128: .4byte gUnk_08100CD4 -_0805612C: .4byte gUnk_02000010 -_08056130: .4byte 0x4D435A33 - - thumb_func_start sub_08056134 -sub_08056134: @ 0x08056134 - push {lr} - movs r2, #0x80 - lsls r2, r2, #0x12 - ldr r1, [r2] - ldr r0, _08056164 @ =0x4D435A33 - cmp r1, r0 - bne _08056160 - ldrb r0, [r2, #4] - cmp r0, #2 - bhi _08056160 - ldrb r0, [r2, #5] - cmp r0, #2 - bhi _08056160 - ldrb r0, [r2, #6] - cmp r0, #2 - bhi _08056160 - ldrb r0, [r2, #7] - cmp r0, #1 - bne _08056160 - ldrb r0, [r2, #0xe] - cmp r0, #0 - beq _08056168 -_08056160: - movs r0, #0 - b _0805616A - .align 2, 0 -_08056164: .4byte 0x4D435A33 -_08056168: - movs r0, #1 -_0805616A: - pop {pc} - - thumb_func_start sub_0805616C -sub_0805616C: @ 0x0805616C - push {lr} - ldr r0, _080561E8 @ =0x80040000 - bl PlaySFX - ldr r0, _080561EC @ =gScreen - adds r3, r0, #0 - adds r3, #0x6c - ldrb r2, [r3] - adds r0, #0x6d - movs r1, #0 - strb r2, [r0] - strb r1, [r3] - ldr r1, _080561F0 @ =0x040000B0 - ldrh r2, [r1, #0xa] - ldr r0, _080561F4 @ =0x0000C5FF - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r2, [r1, #0xa] - ldr r0, _080561F8 @ =0x00007FFF - ands r0, r2 - strh r0, [r1, #0xa] - ldrh r0, [r1, #0xa] - ldr r0, [r1, #8] - movs r2, #0x80 - lsls r2, r2, #0x18 - cmp r0, #0 - bge _080561AA -_080561A2: - ldr r0, [r1, #8] - ands r0, r2 - cmp r0, #0 - bne _080561A2 -_080561AA: - ldr r2, _080561FC @ =0x040000BC - ldr r0, [r2, #8] - movs r1, #0x80 - lsls r1, r1, #0x18 - cmp r0, #0 - bge _080561BE -_080561B6: - ldr r0, [r2, #8] - ands r0, r1 - cmp r0, #0 - bne _080561B6 -_080561BE: - ldr r2, _08056200 @ =0x040000C8 - ldr r0, [r2, #8] - movs r1, #0x80 - lsls r1, r1, #0x18 - cmp r0, #0 - bge _080561D2 -_080561CA: - ldr r0, [r2, #8] - ands r0, r1 - cmp r0, #0 - bne _080561CA -_080561D2: - ldr r2, _08056204 @ =0x040000D4 - ldr r0, [r2, #8] - movs r1, #0x80 - lsls r1, r1, #0x18 - cmp r0, #0 - bge _080561E6 -_080561DE: - ldr r0, [r2, #8] - ands r0, r1 - cmp r0, #0 - bne _080561DE -_080561E6: - pop {pc} - .align 2, 0 -_080561E8: .4byte 0x80040000 -_080561EC: .4byte gScreen -_080561F0: .4byte 0x040000B0 -_080561F4: .4byte 0x0000C5FF -_080561F8: .4byte 0x00007FFF -_080561FC: .4byte 0x040000BC -_08056200: .4byte 0x040000C8 -_08056204: .4byte 0x040000D4 - - thumb_func_start sub_08056208 -sub_08056208: @ 0x08056208 - push {lr} - ldr r0, _08056224 @ =0x80060000 - bl PlaySFX - ldr r0, _08056228 @ =gScreen - adds r3, r0, #0 - adds r3, #0x6d - ldrb r2, [r3] - adds r0, #0x6c - movs r1, #0 - strb r2, [r0] - strb r1, [r3] - pop {pc} - .align 2, 0 -_08056224: .4byte 0x80060000 -_08056228: .4byte gScreen - - thumb_func_start sub_0805622C -sub_0805622C: @ 0x0805622C - ldr r3, _08056248 @ =gScreen - str r0, [r3, #0x70] - str r1, [r3, #0x74] - str r2, [r3, #0x78] - adds r3, #0x6c - movs r2, #1 - movs r0, #1 - strb r0, [r3] - ldr r1, _0805624C @ =gUnk_03003DE4 - ldrb r0, [r1] - eors r0, r2 - strb r0, [r1] - bx lr - .align 2, 0 -_08056248: .4byte gScreen -_0805624C: .4byte gUnk_03003DE4 - - thumb_func_start sub_08056250 -sub_08056250: @ 0x08056250 - ldr r0, _0805625C @ =gScreen - adds r0, #0x6c - movs r1, #0 - strb r1, [r0] - bx lr - .align 2, 0 -_0805625C: .4byte gScreen - - thumb_func_start sub_08056260 -sub_08056260: @ 0x08056260 - push {r4, r5, r6, lr} - mov r6, sb - mov r5, r8 - push {r5, r6} - movs r1, #0x80 - lsls r1, r1, #0x13 - movs r0, #0x80 - strh r0, [r1] - ldr r1, _080562B8 @ =0x04000132 - ldr r2, _080562BC @ =0x00008304 - adds r0, r2, #0 - strh r0, [r1] - ldr r6, _080562C0 @ =0x04000208 - movs r0, #0 - mov r8, r0 - strh r0, [r6] - ldr r5, _080562C4 @ =0x04000200 - ldrh r4, [r5] - movs r1, #0xc0 - lsls r1, r1, #6 - adds r0, r1, #0 - strh r0, [r5] - movs r2, #1 - mov sb, r2 - strh r2, [r6] - bl SoundBiasReset - svc #3 - bl SoundBiasSet - mov r0, r8 - strh r0, [r6] - strh r4, [r5] - mov r1, sb - strh r1, [r6] - ldr r0, _080562C8 @ =gUnk_03001000 - ldrb r1, [r0, #1] - mov r2, r8 - strb r2, [r0, #1] - pop {r3, r4} - mov r8, r3 - mov sb, r4 - pop {r4, r5, r6, pc} - .align 2, 0 -_080562B8: .4byte 0x04000132 -_080562BC: .4byte 0x00008304 -_080562C0: .4byte 0x04000208 -_080562C4: .4byte 0x04000200 -_080562C8: .4byte gUnk_03001000 - - thumb_func_start sub_080562CC -sub_080562CC: @ 0x080562CC - push {r4, r5, r6, lr} - ldr r6, _080562FC @ =gRoomControls - movs r4, #0xa - ldrsh r5, [r6, r4] - ldrh r4, [r6, #6] - subs r5, r5, r4 - subs r5, r5, r0 - adds r5, #0xf0 - movs r4, #0xc - ldrsh r0, [r6, r4] - ldrh r4, [r6, #8] - subs r0, r0, r4 - subs r0, r0, r1 - adds r0, #0xa0 - adds r2, #0xf0 - adds r3, #0xa0 - movs r1, #0 - cmp r5, r2 - bhs _080562F8 - cmp r0, r3 - bhs _080562F8 - movs r1, #1 -_080562F8: - adds r0, r1, #0 - pop {r4, r5, r6, pc} - .align 2, 0 -_080562FC: .4byte gRoomControls - - thumb_func_start sub_08056300 -sub_08056300: @ 0x08056300 - push {r4, lr} - adds r4, r0, #0 - b _0805631C -_08056306: - ldrh r0, [r4, #2] - ldrh r1, [r4, #4] - ldrh r2, [r4, #6] - ldrh r3, [r4, #8] - bl sub_080562CC - cmp r0, #0 - beq _0805631A - ldrh r0, [r4] - b _08056324 -_0805631A: - adds r4, #0xa -_0805631C: - ldrh r0, [r4] - cmp r0, #0xff - bne _08056306 - movs r0, #0xff -_08056324: - pop {r4, pc} - .align 2, 0 - - thumb_func_start NulledItem -NulledItem: @ 0x08056328 - push {lr} - bl DeleteThisEntity - pop {pc} - - thumb_func_start sub_08056330 -sub_08056330: @ 0x08056330 - push {lr} - bl DeleteThisEntity - pop {pc} - - thumb_func_start sub_08056338 -sub_08056338: @ 0x08056338 - push {lr} - movs r2, #1 - rsbs r2, r2, #0 - ldr r0, _08056358 @ =gTextBox - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0 - bne _08056354 - ldr r1, _0805635C @ =gUnk_02000040 - ldrb r0, [r1] - cmp r0, #3 - bne _08056354 - ldrb r2, [r1, #1] -_08056354: - adds r0, r2, #0 - pop {pc} - .align 2, 0 -_08056358: .4byte gTextBox -_0805635C: .4byte gUnk_02000040 diff --git a/asm/non_matching/sub_080560B8.inc b/asm/non_matching/sub_080560B8.inc new file mode 100644 index 00000000..87523947 --- /dev/null +++ b/asm/non_matching/sub_080560B8.inc @@ -0,0 +1,66 @@ + .include "asm/macros.inc" + + .include "constants/constants.inc" + + .syntax unified + + .text + + push {r4, lr} + bl sub_08056134 + cmp r0, #0 + bne _080560F8 + movs r0, #0x80 + lsls r0, r0, #0x12 + bl sub_0807CF30 + adds r1, r0, #0 + movs r0, #1 + rsbs r0, r0, #0 + cmp r1, r0 + blt _080560E4 + cmp r1, #0 + ble _080560E4 + cmp r1, #1 + bne _080560E4 + bl sub_08056134 + cmp r0, #0 + bne _080560F8 +_080560E4: + ldr r0, _08056128 @ =sDefaultSettings + movs r4, #0x80 + lsls r4, r4, #0x12 + adds r1, r4, #0 + movs r2, #0x10 + bl _DmaCopy + adds r0, r4, #0 + bl sub_0807CF10 +_080560F8: + ldr r2, _0805612C @ =gUnk_02000010 + ldr r1, [r2] + ldr r0, _08056130 @ =0x4D435A33 + eors r1, r0 + rsbs r0, r1, #0 + orrs r0, r1 + lsrs r0, r0, #0x1f + ldrb r1, [r2, #4] + cmp r1, #0 + beq _08056112 + cmp r1, #0xc1 + beq _08056112 + movs r0, #1 +_08056112: + cmp r0, #0 + beq _08056124 + ldr r4, _0805612C @ =gUnk_02000010 + adds r0, r4, #0 + movs r1, #0x20 + bl _DmaZero + ldr r0, _08056130 @ =0x4D435A33 + str r0, [r4] +_08056124: + pop {r4, pc} + .align 2, 0 +_08056128: .4byte sDefaultSettings +_0805612C: .4byte gUnk_02000010 +_08056130: .4byte 0x4D435A33 + .syntax divided diff --git a/data/data_08100CD4.s b/data/data_08100CD4.s deleted file mode 100755 index 6c1a96b2..00000000 --- a/data/data_08100CD4.s +++ /dev/null @@ -1,8 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08100CD4:: @ 08100CD4 - .incbin "baserom.gba", 0x100CD4, 0x0000010 diff --git a/include/functions.h b/include/functions.h index b2f73c87..a7e2d24c 100644 --- a/include/functions.h +++ b/include/functions.h @@ -321,4 +321,6 @@ extern void sub_08008790(Entity*, u32); extern u32 CheckIsDungeon(); extern void sub_0804ACF8(); extern void sub_08073904(Entity*); +extern u32 sub_08056134(void); +extern u32 sub_0807CF30(void*); #endif diff --git a/include/gba/macro.h b/include/gba/macro.h index 63043ebb..2fa1abb2 100644 --- a/include/gba/macro.h +++ b/include/gba/macro.h @@ -167,6 +167,12 @@ #define DmaClear16Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 16) #define DmaClear32Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 32) +#define DmaWait(DmaNo) \ +{ \ + vu32 *(DmaCntp) = (vu32 *)REG_ADDR_DMA##DmaNo; \ + while (DmaCntp[2] & (DMA_ENABLE << 16)) ; \ +} + #define IntrEnable(flags) \ { \ u16 imeTemp; \ diff --git a/include/gba/syscall.h b/include/gba/syscall.h index dc528ffe..d319a9fe 100644 --- a/include/gba/syscall.h +++ b/include/gba/syscall.h @@ -11,6 +11,18 @@ #define RESET_REGS 0x80 #define RESET_ALL 0xFF +#define SystemCall(x) { asm("svc " #x); } + +extern void SoundBiasReset(); +extern void SoundBiasSet(); + +#define Stop() \ +{ \ + SoundBiasReset(); \ + SystemCall(3); \ + SoundBiasSet(); \ +} + void SoftReset(u32 resetFlags); void RegisterRamReset(u32 resetFlags); diff --git a/include/global.h b/include/global.h index 146dfc14..de47c6ac 100644 --- a/include/global.h +++ b/include/global.h @@ -47,6 +47,7 @@ #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) >= (b) ? (a) : (b)) +#define BOOLCAST(x) ((-x | x) >> 31) #define static_assert(cond) extern char assertion[(cond) ? 1 : -1] #if NON_MATCHING diff --git a/include/main.h b/include/main.h index 7fa87211..71d6fbd0 100644 --- a/include/main.h +++ b/include/main.h @@ -23,6 +23,13 @@ enum { SCREEN_DEBUG_TEXT, }; +#define GAME_LANGUAGE GAME_LANGUAGE_EN +#define SIGNATURE 'MCZ3' +#define GAME_LANGUAGE_EN 1 +#define MAX_MSG_SPEED 3 +#define MAX_SAVE_FILES 3 +#define MAX_BRIGHTNESS 3 + typedef struct { u8 interruptFlag; u8 field_0x1; diff --git a/include/screen.h b/include/screen.h index 953cde84..5046e62f 100644 --- a/include/screen.h +++ b/include/screen.h @@ -72,6 +72,11 @@ typedef struct { /*0x08*/ BgSettings bg; /*0x20*/ BgAffSettings affine; /*0x38*/ BgControls controls; + /*0x6c*/ u8 _6c; + /*0x6d*/ u8 _6d; + /*0x70*/ u32 _70; + /*0x74*/ u32 _74; + /*0x78*/ u32 _78; } Screen; extern BgControls gBgControls; diff --git a/include/structures.h b/include/structures.h index 596fa9bb..fecc4af0 100644 --- a/include/structures.h +++ b/include/structures.h @@ -6,12 +6,16 @@ #include "player.h" typedef struct { - char header[4]; + int signature; u8 saveFileId; u8 messageSpeed; u8 brightnessPref; u8 gameLanguage; + u8 _8[6]; + u8 _e; } struct_02000000; +#define gUnk_02000000 ((struct_02000000*)(0x2000000)) +// extern struct_02000000 gUnk_02000000; typedef struct { u8 unk_00; @@ -30,11 +34,8 @@ typedef struct { u16 field_0xa; } struct_0807D1C4; -#define gUnk_02000000 ((struct_02000000*)(0x2000000)) -// extern struct_02000000 gUnk_02000000; - typedef struct { - u8 filler0[0x4]; + s32 signature; u8 field_0x4; u8 listenForKeyPresses; } struct_02000010; diff --git a/linker.ld b/linker.ld index 2c9e5126..69f5cc52 100644 --- a/linker.ld +++ b/linker.ld @@ -465,8 +465,7 @@ SECTIONS { src/code_0805436C.o(.text); asm/code_0805436C.o(.text); src/sub_08055E08.o(.text); - src/mainLoop.o(.text); - asm/code_08055FF4.o(.text); + src/main.o(.text); src/textbox.o(.text); asm/code_08056418.o(.text); src/manager/manager1.o(.text); @@ -993,8 +992,7 @@ SECTIONS { data/data_080D3D94.o(.rodata); data/entity_headers.o(.rodata); data/data_080D5360.o(.rodata); - src/mainLoop.o(.rodata); - data/data_08100CD4.o(.rodata); + src/main.o(.rodata); data/tileset_headers.o(.rodata); data/metatile_headers.o(.rodata); data/map_headers.o(.rodata); diff --git a/src/code_0807CC3C.c b/src/code_0807CC3C.c index 80e0bfe7..b16dca9e 100644 --- a/src/code_0807CC3C.c +++ b/src/code_0807CC3C.c @@ -42,7 +42,7 @@ u32 sub_0807CDE8(u32 arg0) { temp = 1; break; case 2: - temp = sub_0807CF10((u8*)gUnk_02000000->header); + temp = sub_0807CF10((u8*)&gUnk_02000000->signature); break; } gMenu.field_0xa = temp; diff --git a/src/enemy/helmasaur.c b/src/enemy/helmasaur.c index 3980c94c..5dd4c27d 100644 --- a/src/enemy/helmasaur.c +++ b/src/enemy/helmasaur.c @@ -337,7 +337,7 @@ bool32 sub_0802C0E8(Entity* this) { u32 ret = FALSE; if (!sub_0806FC24(TILE(x, y), 9)) { u32 tmp = sub_080AE4CC(ent, x, y, 0); - ret = (-tmp | tmp) >> 0x1f; + ret = BOOLCAST(tmp); } return ret; } diff --git a/src/mainLoop.c b/src/main.c similarity index 54% rename from src/mainLoop.c rename to src/main.c index 33c1d27a..ed058b61 100644 --- a/src/mainLoop.c +++ b/src/main.c @@ -1,9 +1,13 @@ #include "global.h" #include "functions.h" +#include "structures.h" #include "main.h" +#include "screen.h" #include "random.h" #include "readKeyInput.h" +extern u8 gUnk_03003DE4; + extern void sub_0804FF84(u32); extern u16 gPaletteBuffer[]; extern void VBlankInterruptWait(void); @@ -137,3 +141,128 @@ void DoSoftReset(void) { DisableInterruptsAndDMA(); SoftReset(RESET_ALL & ~(RESET_EWRAM | RESET_SIO_REGS)); } + +const int sDefaultSettings[] = { SIGNATURE, '\1\1\1\0', 'KNIL', '\0\0\0\0' }; + +// single misplaced ldr +NONMATCH("asm/non_matching/sub_080560B8.inc", void sub_080560B8(void)) { + u32 temp; + u32 b; + + if (!sub_08056134()) { + switch ((s32)sub_0807CF30((void*)0x2000000)) { + case 1: + if (sub_08056134()) + break; + case 0: + case -1: + default: + _DmaCopy(&sDefaultSettings, (void*)0x2000000, 16); + sub_0807CF10((u8*)0x2000000); + break; + } + } + + temp = gUnk_02000010.signature ^ SIGNATURE; + b = BOOLCAST(temp); + + if ((gUnk_02000010.field_0x4 != 0) && (gUnk_02000010.field_0x4 != 0xc1)) { + b = 1; + } + if (b != 0) { + _DmaZero((u8*)&gUnk_02000010.signature, 0x20); + gUnk_02000010.signature = SIGNATURE; + } +} +END_NONMATCH + +u32 sub_08056134(void) { + if ((gUnk_02000000->signature != SIGNATURE) || (gUnk_02000000->saveFileId >= MAX_SAVE_FILES) || + (gUnk_02000000->messageSpeed >= MAX_MSG_SPEED) || (gUnk_02000000->brightnessPref >= MAX_BRIGHTNESS) || + (gUnk_02000000->gameLanguage != GAME_LANGUAGE) || (gUnk_02000000->_e != 0)) + return FALSE; + + return TRUE; +} + +void sub_0805616C() { + PlaySFX(0x80040000); + gScreen._6d = gScreen._6c; + gScreen._6c = 0; + + DmaStop(0); + + DmaWait(0); + DmaWait(1); + DmaWait(2); + DmaWait(3); +} + +void sub_08056208() { + PlaySFX(0x80060000); + gScreen._6c = gScreen._6d; + gScreen._6d = 0; +} + +void sub_0805622C(u32 a1, u32 a2, u32 a3) { + gScreen._70 = a1; + gScreen._74 = a2; + gScreen._78 = a3; + gScreen._6c = 1; + gUnk_03003DE4 ^= 1; +} + +void sub_08056250() { + gScreen._6c = 0; +} + +void sub_08056260(void) { + u32 temp; + Main* temp2; + + REG_DISPCNT = 0x80; + REG_KEYCNT = 0x8304; + REG_IME = 0; + temp = REG_IE; + REG_IE = 0x3000; + REG_IME = 1; + Stop(); + REG_IME = 0; + REG_IE = temp; + REG_IME = 1; + temp2 = &gUnk_03001000; + asm("ldrb r1, [r0, #0x1]"); + temp2->field_0x1 = 0; +} + +// Convert in-game AABB to screen coordinates and check if it's within the viewport +u32 sub_080562CC(u32 x0, u32 y0, u32 x1, u32 y1) { + u32 result; + u32 x = ((gRoomControls.roomScrollX - gRoomControls.roomOriginX) - x0 + DISPLAY_WIDTH); + u32 y = ((gRoomControls.roomScrollY - gRoomControls.roomOriginY) - y0 + DISPLAY_HEIGHT); + u32 a = x1 + DISPLAY_WIDTH; + u32 b = y1 + DISPLAY_HEIGHT; + if ((x < a) && (y < b)) + result = TRUE; + else + result = FALSE; + return result; +} + +// Iterate over array of AABBs and check if any fit on screen +u16 sub_08056300(u16* arr) { + u16* i; + for (i = arr; *i != 0xff; i += 5) { + if (sub_080562CC(i[1], i[2], i[3], i[4]) != 0) + return *i; + } + return 0xff; +} + +void NulledItem() { + DeleteThisEntity(); +} + +void sub_08056330() { + DeleteThisEntity(); +} diff --git a/src/npc/beedle.c b/src/npc/beedle.c index 3b30e19b..6e6a525a 100644 --- a/src/npc/beedle.c +++ b/src/npc/beedle.c @@ -159,5 +159,5 @@ void sub_08063504(Entity* this, u32* param_2) { u32 uVar1; uVar1 = sub_080544DC(gUnk_0810C88C[this->entityType.parameter]); - param_2[5] = (-uVar1 | uVar1) >> 0x1F; + param_2[5] = BOOLCAST(uVar1); } diff --git a/src/npc/forestMinish.c b/src/npc/forestMinish.c index abf4878d..be59fbaa 100644 --- a/src/npc/forestMinish.c +++ b/src/npc/forestMinish.c @@ -154,7 +154,7 @@ void sub_080601D4(Entity* this) { uVar2 = 2; } else { temp = CheckKinstoneFused(0x17); - uVar2 = (-temp | temp) >> 0x1f; + uVar2 = BOOLCAST(temp); } TextboxNoOverlap(gUnk_0810A354[uVar2], this); } @@ -169,7 +169,7 @@ void sub_0806021C(Entity* this) { // jabber nut uVar1 = GetInventoryValue(0x5B); - uVar2 = (-uVar1 | uVar1) >> 0x1f; + uVar2 = BOOLCAST(uVar1); // earth element if (GetInventoryValue(0x40)) { diff --git a/src/npc/goron.c b/src/npc/goron.c index 33345e48..dcc0ac33 100644 --- a/src/npc/goron.c +++ b/src/npc/goron.c @@ -64,7 +64,7 @@ void sub_080693D0(Entity* this) { sub_0807DD94(this, 0); if (this->animIndex == 8) { u32 var0 = this->field_0x82.HWORD & 0xF; - bool32 createFx65 = ((-var0) | var0) >> 0x1F; // = !var0 + bool32 createFx65 = BOOLCAST(var0); // = !var0 if (this->frames.all == 1) { this->frames.all = 0; diff --git a/src/npc/goronMerchant.c b/src/npc/goronMerchant.c index 35de4c0a..7cfdb685 100644 --- a/src/npc/goronMerchant.c +++ b/src/npc/goronMerchant.c @@ -114,7 +114,7 @@ u32 sub_080696BC(Entity* this) { } temp = CheckGlobalFlag(0x3e); - uVar1 = (-temp | temp) >> 0x1f; + uVar1 = BOOLCAST(temp); if (CheckGlobalFlag(0x3f)) { uVar1 = 2; diff --git a/src/npc/guard.c b/src/npc/guard.c index cfcb027d..e225c33b 100644 --- a/src/npc/guard.c +++ b/src/npc/guard.c @@ -68,7 +68,7 @@ void sub_08063D44(Entity* this) { temp = this->entityType.subtype; temp ^= 0x15; - idx = ((-temp | temp) >> 0x1f) * 4; + idx = BOOLCAST(temp) * 4; if (!LoadExtraSpriteData(this, &gUnk_0810F524[idx])) return; @@ -132,7 +132,7 @@ void sub_08063E90(Entity* this) { temp = this->entityType.subtype; temp ^= 0x15; - idx = ((-temp | temp) >> 0x1f) * 4; + idx = BOOLCAST(temp) * 4; if (!LoadExtraSpriteData(this, &gUnk_0810F524[idx])) return; diff --git a/src/npc/mutoh.c b/src/npc/mutoh.c index 1be4d5e8..01cf6481 100644 --- a/src/npc/mutoh.c +++ b/src/npc/mutoh.c @@ -66,7 +66,7 @@ void sub_080670B4(Entity* this) { uVar2 = 0; if (GetInventoryValue(0x11) == 0) { uVar1 = CheckGlobalFlag(TABIDACHI); - uVar2 = (-uVar1 | uVar1) >> 0x1f; + uVar2 = BOOLCAST(uVar1); } TextboxNoOverlap(gUnk_08110C0C[uVar2], this); } diff --git a/src/npc/townMinish.c b/src/npc/townMinish.c index 0f454fc6..69b7eda7 100644 --- a/src/npc/townMinish.c +++ b/src/npc/townMinish.c @@ -299,7 +299,7 @@ void sub_0806B098(Entity* this) { idx = 1; if (CheckGlobalFlag(0x29)) { f = CheckGlobalFlag(0x2a); - idx = (-f | f) >> 0x1f; + idx = BOOLCAST(f); } } TextboxNoOverlap(gUnk_08112C50[(this->entityType.parameter - 7) * 3 + idx], this); diff --git a/src/object/lightableSwitch.c b/src/object/lightableSwitch.c index ecc6449e..16609d50 100644 --- a/src/object/lightableSwitch.c +++ b/src/object/lightableSwitch.c @@ -60,7 +60,7 @@ void sub_0809EABC(Entity* this) { u32 f; f = CheckFlags(this->field_0x86.HWORD); - anySet = (-f | f) >> 0x1F; + anySet = BOOLCAST(f); if (this->frameIndex != anySet) { this->frameIndex = anySet; } diff --git a/src/room.c b/src/room.c index e9d2c358..e2c418c6 100644 --- a/src/room.c +++ b/src/room.c @@ -4489,7 +4489,7 @@ void sub_0804E3C4() { u32 index; u32 tmp; tmp = CheckGlobalFlag(LV4_CLEAR); - index = (-tmp | tmp) >> 0x1F; + index = BOOLCAST(tmp); if (CheckGlobalFlag(LV5_CLEAR)) { index = 2; } diff --git a/src/textbox.c b/src/textbox.c index f426e392..6237ffe5 100644 --- a/src/textbox.c +++ b/src/textbox.c @@ -2,6 +2,7 @@ #include "room.h" #include "entity.h" #include "textbox.h" +#include "structures.h" void _DmaZero(); void ShowTextbox(); @@ -10,31 +11,31 @@ void TextboxAtPosition(); extern u32 gUnk_02022780; extern u32 gUnk_02036A40; extern u32 gUnk_02036A38; -extern u32 gUnk_02000040; -void sub_08056360(void) +s32 sub_08056338(void) { + s32 result; -{ - if ((gTextBox.doTextBox & 127) != 0) { - gTextBox.doTextBox = 136; - } - return; + result = -1; + if (((gTextBox.doTextBox & 0x7f) == 0) && (gUnk_02000040.unk_00 == 3)) + result = gUnk_02000040.unk_01; + return result; } -void TextboxNoOverlapFollow(u32 index) +void sub_08056360(void) { + if ((gTextBox.doTextBox & 0x7f) != 0) { + gTextBox.doTextBox = 0x80 | 0x8; + } +} -{ +void TextboxNoOverlapFollow(u32 index) { if (gRoomControls.cameraTarget != NULL) { TextboxNoOverlap(index, gRoomControls.cameraTarget); } else { ShowTextbox(index); } - return; } -void TextboxNoOverlap(u32 index, Entity* ent) - -{ +void TextboxNoOverlap(u32 index, Entity* ent) { s16 y; s16 h; @@ -43,22 +44,19 @@ void TextboxNoOverlap(u32 index, Entity* ent) y = ent->y.HALF.HI; h = ent->height.HALF.HI; - if (88 < ((y + h) - gRoomControls.roomScrollY)) { + if (((y + h) - gRoomControls.roomScrollY) > 0x58) { gTextBox.textWindowPosY = 1; } - return; } void sub_080563C8(u32 param_1, u32 param_2) { TextboxAtPosition(param_1, 1, param_2); - return; } void TextboxAtPosition(u32 index, u32 x, u32 y) { ShowTextbox(index); gTextBox.textWindowPosX = x; gTextBox.textWindowPosY = y; - return; } void ShowTextbox(u32 index, u32 param_2, u32* dest) { @@ -70,15 +68,12 @@ void ShowTextbox(u32 index, u32 param_2, u32* dest) { gTextBox.textWindowPosX = 1; gTextBox.textWindowPosY = 12; gTextBox.doTextBox = 1; - return; } void sub_08056418(void) { - _DmaZero(&gTextBox, 32); _DmaZero(&gUnk_02022780, 168); _DmaZero(&gUnk_02036A40, 8); _DmaZero(&gUnk_02036A38, 8); _DmaZero(&gUnk_02000040, 4); - return; } diff --git a/src/tmc.code-workspace b/src/tmc.code-workspace index f890504e..6ed05aa3 100644 --- a/src/tmc.code-workspace +++ b/src/tmc.code-workspace @@ -1,7 +1,9 @@ { "folders" : [ { "path" : ".." } ], "settings" : { "files.associations" : { - "algorithm" : "cpp", "ios" : "c" + "algorithm": "cpp", + "ios": "c", + "functions.h": "c" } } }