From f1216076d7cb6a383682f423c9b5c14e152e484b Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Thu, 7 Sep 2017 00:51:59 -0600 Subject: Begin librfu decompilation --- src/librfu.c | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 src/librfu.c (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c new file mode 100644 index 000000000..2cf5d6dad --- /dev/null +++ b/src/librfu.c @@ -0,0 +1,217 @@ +#include "global.h" + +#include "main.h" + +typedef struct RfuStruct +{ + s32 unk_0; + u8 unk_4; + u8 unk_5; + u8 unk_6; + u8 unk_7; + u8 unk_8; + u8 unk_9; + u8 timerSelect; + u8 unk_b; + u32 unk_c; + vu8 unk_10; + u8 unk_11; + vu16 unk_12; + vu8 msMode; + u8 unk_15; + u8 unk_16; + u8 unk_17; + void * callbackM; + void * callbackS; + u32 callbackID; + void * unk_24; + void * unk_28; + vu8 unk_2c; + u8 padding[3]; +} RfuStruct; + +typedef struct RfuIntrStruct +{ + u8 unk28Data[0x74]; + u8 unk24Data[0x74]; + u8 block1[0x960]; + u8 block2[0x30]; +} RfuIntrStruct; + +typedef struct RfuState +{ + RfuStruct *rfuStruct; +} RfuState; + +extern IntrFunc IntrSIO32(); +extern struct RfuState gRfuState; +void STWI_init_Callback_M(); +void STWI_init_Callback_S(); +void STWI_set_Callback_M(void * callback); +void STWI_set_Callback_S(void * callback); +extern void STWI_intr_timer(); + +void STWI_init_all(RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + struct RfuStruct *rfuStructTemp; + struct RfuStruct **rfuStructPtr; + u16 ime_temp; + int ret; + + // If we're copying our interrupt into RAM, DMA it to block1 and use + // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. + // interrupt usually is a pointer to gIntrTable[1] + if (copyInterruptToRam == TRUE) + { + *interrupt = (IntrFunc)(&interruptStruct->block1); + DmaCopy16(3, &IntrSIO32, (void*)(&interruptStruct->block1), 0x960); + + gRfuState.rfuStruct = (struct RfuStruct*)(&interruptStruct->block2); + } + else + { + *interrupt = (IntrFunc)&IntrSIO32; + gRfuState.rfuStruct = (struct RfuStruct*)(&interruptStruct->block1); + } + + rfuStructPtr = (struct RfuStruct**)&gRfuState.rfuStruct; + (*rfuStructPtr)->unk_28 = (void*)&interruptStruct->unk28Data; + (*rfuStructPtr)->unk_24 = (void*)(&interruptStruct->unk24Data); + (*rfuStructPtr)->msMode = 1; + + (*rfuStructPtr)->unk_0 = 0; + (*rfuStructPtr)->unk_4 = 0; + (*rfuStructPtr)->unk_5 = 0; + (*rfuStructPtr)->unk_7 = 0; + (*rfuStructPtr)->unk_8 = 0; + (*rfuStructPtr)->unk_9 = 0; + (*rfuStructPtr)->unk_c = 0; + (*rfuStructPtr)->unk_10 = 0; + + // Don't @ me + rfuStructTemp = *rfuStructPtr; + rfuStructTemp->unk_12 = 0; + rfuStructTemp->unk_15 = 0; + + (*rfuStructPtr)->unk_2c = 0; + + REG_RCNT = 0x100; //TODO: mystery bit? + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + STWI_init_Callback_M(); + STWI_init_Callback_S(); + + IntrEnable(INTR_FLAG_SERIAL); +} + +void STWI_init_timer(IntrFunc *interrupt, int timerSelect) +{ + *interrupt = &STWI_intr_timer; + gRfuState.rfuStruct->timerSelect = timerSelect; + + IntrEnable(INTR_FLAG_TIMER0 << gRfuState.rfuStruct->timerSelect); +} + +void AgbRFU_SoftReset() +{ + struct RfuStruct **rfuStructPtr; + struct RfuStruct *rfuStructTemp; + + REG_RCNT = 0x8000; + REG_RCNT = 0x80A0; // all these bits are undocumented + + { + vu16 *timerL = ®_TMCNT_L(gRfuState.rfuStruct->timerSelect); + vu16 *timerH = ®_TMCNT_H(gRfuState.rfuStruct->timerSelect); + + *timerH = 0; + *timerL = 0; + *timerH = 0x83; + + while (*timerL <= 0x11) + { + REG_RCNT = 0x80A2; + } + + *timerH = 3; + } + REG_RCNT = 0x80A0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + + rfuStructPtr = (struct RfuStruct**)&gRfuState.rfuStruct; + + (*rfuStructPtr)->unk_0 = 0; + (*rfuStructPtr)->unk_4 = 0; + (*rfuStructPtr)->unk_5 = 0; + (*rfuStructPtr)->unk_6 = 0; + (*rfuStructPtr)->unk_7 = 0; + (*rfuStructPtr)->unk_8 = 0; + (*rfuStructPtr)->unk_9 = 0; + (*rfuStructPtr)->unk_c = 0; + (*rfuStructPtr)->unk_10 = 0; + + // Yeah this is the second time, there's probably something in the struct that I'm missing + rfuStructTemp = *rfuStructPtr; + rfuStructTemp->unk_12 = 0; + rfuStructTemp->msMode = 1; + (*rfuStructPtr)->unk_15 = 0; + + (*rfuStructPtr)->unk_2c = 0; +} + +void STWI_set_MS_mode(u8 mode) +{ + gRfuState.rfuStruct->msMode = mode; +} + +u32 STWI_read_status(u8 index) +{ + int result; + switch(index) + { + case 0: + return gRfuState.rfuStruct->unk_12; + case 1: + return gRfuState.rfuStruct->msMode; + case 2: + // something got inlined here? + //TODO: figure this one out + result = (gRfuState.rfuStruct->unk_0); + __asm__("lsl r0, r0, #16"); + __asm__("lsr r0, r0, #16"); + break; + + case 3: + return gRfuState.rfuStruct->unk_6; + break; + default: + return 0xFFFF; + break; + } + return result; +} + +void STWI_init_Callback_M() +{ + STWI_set_Callback_M(0); +} + +void STWI_init_Callback_S() +{ + STWI_set_Callback_S(0); +} + +void STWI_set_Callback_M(void * callback) +{ + gRfuState.rfuStruct->callbackM = callback; +} + +void STWI_set_Callback_S(void * callback) +{ + gRfuState.rfuStruct->callbackS = callback; +} + +void STWI_set_Callback_ID(u32 id) +{ + gRfuState.rfuStruct->callbackID = id; +} + -- cgit v1.2.3 From b420fb39624e10b364e17b593b1bf0d6e347a3ae Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Thu, 7 Sep 2017 03:59:39 -0600 Subject: Decompiled librfu to STWI_send_CP_EndREQ --- src/librfu.c | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 228 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index 2cf5d6dad..1b9846ece 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -2,6 +2,28 @@ #include "main.h" +enum +{ + RFU_RESET = 0x10, + RFU_LINK_STATUS, + RFU_VERSION_STATUS, + RFU_SYSTEM_STATUS, + RFU_SLOT_STATUS, + RFU_CONFIG_STATUS, + RFU_GAME_CONFIG, + RFU_SYSTEM_CONFIG, + RFU_UNK18, + RFU_SC_START, + RFU_SC_POLLING, + RFU_SC_END, + RFU_SP_START, + RFU_SP_POLLING, + RFU_SP_END, + RFU_CP_START, + RFU_CP_POLLING, + RFU_CP_END +}; + typedef struct RfuStruct { s32 unk_0; @@ -24,7 +46,7 @@ typedef struct RfuStruct void * callbackM; void * callbackS; u32 callbackID; - void * unk_24; + u8 * unk_24; void * unk_28; vu8 unk_2c; u8 padding[3]; @@ -49,6 +71,8 @@ void STWI_init_Callback_M(); void STWI_init_Callback_S(); void STWI_set_Callback_M(void * callback); void STWI_set_Callback_S(void * callback); +u16 STWI_init(u8 request); +int STWI_start_Command(); extern void STWI_intr_timer(); void STWI_init_all(RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) @@ -76,7 +100,7 @@ void STWI_init_all(RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 co rfuStructPtr = (struct RfuStruct**)&gRfuState.rfuStruct; (*rfuStructPtr)->unk_28 = (void*)&interruptStruct->unk28Data; - (*rfuStructPtr)->unk_24 = (void*)(&interruptStruct->unk24Data); + (*rfuStructPtr)->unk_24 = (u8*)(&interruptStruct->unk24Data); (*rfuStructPtr)->msMode = 1; (*rfuStructPtr)->unk_0 = 0; @@ -215,3 +239,205 @@ void STWI_set_Callback_ID(u32 id) gRfuState.rfuStruct->callbackID = id; } +u16 STWI_poll_CommandEnd() +{ + while ( gRfuState.rfuStruct->unk_2c == TRUE ); + + return gRfuState.rfuStruct->unk_12; +} + +void STWI_send_ResetREQ() +{ + if (!STWI_init(RFU_RESET)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_LinkStatusREQ() +{ + if (!STWI_init(RFU_LINK_STATUS)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_VersionStatusREQ() +{ + if (!STWI_init(RFU_VERSION_STATUS)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_SystemStatusREQ() +{ + if (!STWI_init(RFU_SYSTEM_STATUS)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_SlotStatusREQ() +{ + if (!STWI_init(RFU_SLOT_STATUS)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_ConfigStatusREQ() +{ + if (!STWI_init(RFU_CONFIG_STATUS)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) +{ + u8 *v5; + int i; + + if (!STWI_init(RFU_GAME_CONFIG)) + { + gRfuState.rfuStruct->unk_4 = 6; //TODO: what is 6 + + //TODO: kinda gross but idk what's going on here + v5 = (u8*)gRfuState.rfuStruct->unk_24; + v5 += 4; + *(u16*)v5 = *(u16*)unk1; + + v5 += 2; + unk1 += 2; + i = 13; + do + { + *v5 = *unk1; + v5++; + unk1++; + i--; + } + while(i >= 0); + + i = 7; + do + { + *v5 = *data; + v5++; + data++; + i--; + } + while(i >= 0); + + STWI_start_Command(); + } +} + +void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) +{ + u8 *v5; + + if (!STWI_init(RFU_SYSTEM_CONFIG)) + { + gRfuState.rfuStruct->unk_4 = 1; //TODO: what is 1 + + //TODO: kinda weird but idk what's going on here + v5 = (u8*)gRfuState.rfuStruct->unk_24; + v5 += 4; + + *v5++ = unk3; + *v5++ = unk2; + *(u16*)v5 = unk1; + STWI_start_Command(); + } +} + +void STWI_send_SC_StartREQ() +{ + if (!STWI_init(RFU_SC_START)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_PollingREQ() +{ + if (!STWI_init(RFU_SC_POLLING)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_EndREQ() +{ + if (!STWI_init(RFU_SC_END)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_StartREQ() +{ + if (!STWI_init(RFU_SP_START)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_PollingREQ() +{ + if (!STWI_init(RFU_SP_POLLING)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_EndREQ() +{ + if (!STWI_init(RFU_SP_END)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_StartREQ(u16 unk1) +{ + if (!STWI_init(RFU_CP_START)) + { + gRfuState.rfuStruct->unk_4 = 1; + *(u32*)(gRfuState.rfuStruct->unk_24 + 4) = unk1; + STWI_start_Command(); + } +} + +void STWI_send_CP_PollingREQ() +{ + if (!STWI_init(RFU_CP_POLLING)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_EndREQ() +{ + if (!STWI_init(RFU_CP_END)) + { + gRfuState.rfuStruct->unk_4 = 0; + STWI_start_Command(); + } +} + -- cgit v1.2.3 From f4a21e5789eac049f6b9788123448b77fa9d7c06 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Sun, 10 Sep 2017 12:04:48 -0600 Subject: Cleanup and formatting fixes from camthesaxman --- src/librfu.c | 632 +++++++++++++++++++++++++++-------------------------------- 1 file changed, 292 insertions(+), 340 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index 1b9846ece..8e450caa0 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -1,443 +1,395 @@ #include "global.h" - #include "main.h" enum { - RFU_RESET = 0x10, - RFU_LINK_STATUS, - RFU_VERSION_STATUS, - RFU_SYSTEM_STATUS, - RFU_SLOT_STATUS, - RFU_CONFIG_STATUS, - RFU_GAME_CONFIG, - RFU_SYSTEM_CONFIG, - RFU_UNK18, - RFU_SC_START, - RFU_SC_POLLING, - RFU_SC_END, - RFU_SP_START, - RFU_SP_POLLING, - RFU_SP_END, - RFU_CP_START, - RFU_CP_POLLING, - RFU_CP_END + RFU_RESET = 0x10, + RFU_LINK_STATUS, + RFU_VERSION_STATUS, + RFU_SYSTEM_STATUS, + RFU_SLOT_STATUS, + RFU_CONFIG_STATUS, + RFU_GAME_CONFIG, + RFU_SYSTEM_CONFIG, + RFU_UNK18, + RFU_SC_START, + RFU_SC_POLLING, + RFU_SC_END, + RFU_SP_START, + RFU_SP_POLLING, + RFU_SP_END, + RFU_CP_START, + RFU_CP_POLLING, + RFU_CP_END }; -typedef struct RfuStruct -{ - s32 unk_0; - u8 unk_4; - u8 unk_5; - u8 unk_6; - u8 unk_7; - u8 unk_8; - u8 unk_9; - u8 timerSelect; - u8 unk_b; - u32 unk_c; - vu8 unk_10; - u8 unk_11; - vu16 unk_12; - vu8 msMode; - u8 unk_15; - u8 unk_16; - u8 unk_17; - void * callbackM; - void * callbackS; - u32 callbackID; - u8 * unk_24; - void * unk_28; - vu8 unk_2c; - u8 padding[3]; -} RfuStruct; - -typedef struct RfuIntrStruct -{ - u8 unk28Data[0x74]; - u8 unk24Data[0x74]; - u8 block1[0x960]; - u8 block2[0x30]; -} RfuIntrStruct; +struct RfuStruct +{ + vs32 unk_0; + u8 unk_4; + u8 unk_5; + u8 unk_6; + u8 unk_7; + u8 unk_8; + u8 unk_9; + u8 timerSelect; + u8 unk_b; + u32 unk_c; + vu8 unk_10; + u8 unk_11; + vu16 unk_12; + vu8 msMode; + u8 unk_15; + u8 unk_16; + u8 unk_17; + void *callbackM; + void *callbackS; + u32 callbackID; + u8 *unk_24; + void *unk_28; + vu8 unk_2c; + u8 padding[3]; +}; -typedef struct RfuState +struct RfuIntrStruct { - RfuStruct *rfuStruct; -} RfuState; + u8 unk28Data[0x74]; + u8 unk24Data[0x74]; + u8 block1[0x960]; + u8 block2[0x30]; +}; -extern IntrFunc IntrSIO32(); -extern struct RfuState gRfuState; -void STWI_init_Callback_M(); -void STWI_init_Callback_S(); +extern IntrFunc IntrSIO32(void); +extern struct RfuStruct *gRfuState; +void STWI_init_Callback_M(void); +void STWI_init_Callback_S(void); void STWI_set_Callback_M(void * callback); void STWI_set_Callback_S(void * callback); u16 STWI_init(u8 request); -int STWI_start_Command(); -extern void STWI_intr_timer(); - -void STWI_init_all(RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) -{ - struct RfuStruct *rfuStructTemp; - struct RfuStruct **rfuStructPtr; - u16 ime_temp; - int ret; - - // If we're copying our interrupt into RAM, DMA it to block1 and use - // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. - // interrupt usually is a pointer to gIntrTable[1] - if (copyInterruptToRam == TRUE) - { - *interrupt = (IntrFunc)(&interruptStruct->block1); - DmaCopy16(3, &IntrSIO32, (void*)(&interruptStruct->block1), 0x960); - - gRfuState.rfuStruct = (struct RfuStruct*)(&interruptStruct->block2); - } - else - { - *interrupt = (IntrFunc)&IntrSIO32; - gRfuState.rfuStruct = (struct RfuStruct*)(&interruptStruct->block1); - } - - rfuStructPtr = (struct RfuStruct**)&gRfuState.rfuStruct; - (*rfuStructPtr)->unk_28 = (void*)&interruptStruct->unk28Data; - (*rfuStructPtr)->unk_24 = (u8*)(&interruptStruct->unk24Data); - (*rfuStructPtr)->msMode = 1; - - (*rfuStructPtr)->unk_0 = 0; - (*rfuStructPtr)->unk_4 = 0; - (*rfuStructPtr)->unk_5 = 0; - (*rfuStructPtr)->unk_7 = 0; - (*rfuStructPtr)->unk_8 = 0; - (*rfuStructPtr)->unk_9 = 0; - (*rfuStructPtr)->unk_c = 0; - (*rfuStructPtr)->unk_10 = 0; - - // Don't @ me - rfuStructTemp = *rfuStructPtr; - rfuStructTemp->unk_12 = 0; - rfuStructTemp->unk_15 = 0; - - (*rfuStructPtr)->unk_2c = 0; - - REG_RCNT = 0x100; //TODO: mystery bit? - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - STWI_init_Callback_M(); - STWI_init_Callback_S(); - - IntrEnable(INTR_FLAG_SERIAL); +int STWI_start_Command(void); +extern void STWI_intr_timer(void); + +void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + // If we're copying our interrupt into RAM, DMA it to block1 and use + // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. + // interrupt usually is a pointer to gIntrTable[1] + if (copyInterruptToRam == TRUE) + { + *interrupt = (IntrFunc)interruptStruct->block1; + DmaCopy16(3, &IntrSIO32, interruptStruct->block1, 0x960); + gRfuState = (struct RfuStruct*)interruptStruct->block2; + } + else + { + *interrupt = (IntrFunc)IntrSIO32; + gRfuState = (struct RfuStruct*)interruptStruct->block1; + } + + gRfuState->unk_28 = interruptStruct->unk28Data; + gRfuState->unk_24 = interruptStruct->unk24Data; + gRfuState->msMode = 1; + gRfuState->unk_0 = 0; + gRfuState->unk_4 = 0; + gRfuState->unk_5 = 0; + gRfuState->unk_7 = 0; + gRfuState->unk_8 = 0; + gRfuState->unk_9 = 0; + gRfuState->unk_c = 0; + gRfuState->unk_10 = 0; + gRfuState->unk_12 = 0; + gRfuState->unk_15 = 0; + gRfuState->unk_2c = 0; + + REG_RCNT = 0x100; //TODO: mystery bit? + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + STWI_init_Callback_M(); + STWI_init_Callback_S(); + + IntrEnable(INTR_FLAG_SERIAL); } void STWI_init_timer(IntrFunc *interrupt, int timerSelect) { - *interrupt = &STWI_intr_timer; - gRfuState.rfuStruct->timerSelect = timerSelect; - - IntrEnable(INTR_FLAG_TIMER0 << gRfuState.rfuStruct->timerSelect); + *interrupt = STWI_intr_timer; + gRfuState->timerSelect = timerSelect; + + IntrEnable(INTR_FLAG_TIMER0 << gRfuState->timerSelect); } -void AgbRFU_SoftReset() -{ - struct RfuStruct **rfuStructPtr; - struct RfuStruct *rfuStructTemp; - - REG_RCNT = 0x8000; - REG_RCNT = 0x80A0; // all these bits are undocumented - - { - vu16 *timerL = ®_TMCNT_L(gRfuState.rfuStruct->timerSelect); - vu16 *timerH = ®_TMCNT_H(gRfuState.rfuStruct->timerSelect); - - *timerH = 0; - *timerL = 0; - *timerH = 0x83; - - while (*timerL <= 0x11) - { - REG_RCNT = 0x80A2; - } - - *timerH = 3; - } - REG_RCNT = 0x80A0; - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - - rfuStructPtr = (struct RfuStruct**)&gRfuState.rfuStruct; - - (*rfuStructPtr)->unk_0 = 0; - (*rfuStructPtr)->unk_4 = 0; - (*rfuStructPtr)->unk_5 = 0; - (*rfuStructPtr)->unk_6 = 0; - (*rfuStructPtr)->unk_7 = 0; - (*rfuStructPtr)->unk_8 = 0; - (*rfuStructPtr)->unk_9 = 0; - (*rfuStructPtr)->unk_c = 0; - (*rfuStructPtr)->unk_10 = 0; - - // Yeah this is the second time, there's probably something in the struct that I'm missing - rfuStructTemp = *rfuStructPtr; - rfuStructTemp->unk_12 = 0; - rfuStructTemp->msMode = 1; - (*rfuStructPtr)->unk_15 = 0; - - (*rfuStructPtr)->unk_2c = 0; +void AgbRFU_SoftReset(void) +{ + vu16 *timerL; + vu16 *timerH; + + REG_RCNT = 0x8000; + REG_RCNT = 0x80A0; // all these bits are undocumented + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->timerSelect); + *timerH = 0; + *timerL = 0; + *timerH = 0x83; + while (*timerL <= 0x11) + REG_RCNT = 0x80A2; + *timerH = 3; + REG_RCNT = 0x80A0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + + gRfuState->unk_0 = 0; + gRfuState->unk_4 = 0; + gRfuState->unk_5 = 0; + gRfuState->unk_6 = 0; + gRfuState->unk_7 = 0; + gRfuState->unk_8 = 0; + gRfuState->unk_9 = 0; + gRfuState->unk_c = 0; + gRfuState->unk_10 = 0; + gRfuState->unk_12 = 0; + gRfuState->msMode = 1; + gRfuState->unk_15 = 0; + gRfuState->unk_2c = 0; } void STWI_set_MS_mode(u8 mode) { - gRfuState.rfuStruct->msMode = mode; + gRfuState->msMode = mode; } -u32 STWI_read_status(u8 index) -{ - int result; - switch(index) - { - case 0: - return gRfuState.rfuStruct->unk_12; - case 1: - return gRfuState.rfuStruct->msMode; - case 2: - // something got inlined here? - //TODO: figure this one out - result = (gRfuState.rfuStruct->unk_0); - __asm__("lsl r0, r0, #16"); - __asm__("lsr r0, r0, #16"); - break; - - case 3: - return gRfuState.rfuStruct->unk_6; - break; - default: - return 0xFFFF; - break; - } - return result; +u16 STWI_read_status(u8 index) +{ + switch (index) + { + case 0: + return gRfuState->unk_12; + case 1: + return gRfuState->msMode; + case 2: + return gRfuState->unk_0; + case 3: + return gRfuState->unk_6; + default: + return 0xFFFF; + } } -void STWI_init_Callback_M() +void STWI_init_Callback_M(void) { - STWI_set_Callback_M(0); + STWI_set_Callback_M(0); } -void STWI_init_Callback_S() +void STWI_init_Callback_S(void) { - STWI_set_Callback_S(0); + STWI_set_Callback_S(0); } -void STWI_set_Callback_M(void * callback) +void STWI_set_Callback_M(void *callback) { - gRfuState.rfuStruct->callbackM = callback; + gRfuState->callbackM = callback; } -void STWI_set_Callback_S(void * callback) +void STWI_set_Callback_S(void *callback) { - gRfuState.rfuStruct->callbackS = callback; + gRfuState->callbackS = callback; } void STWI_set_Callback_ID(u32 id) { - gRfuState.rfuStruct->callbackID = id; + gRfuState->callbackID = id; } -u16 STWI_poll_CommandEnd() +u16 STWI_poll_CommandEnd(void) { - while ( gRfuState.rfuStruct->unk_2c == TRUE ); - - return gRfuState.rfuStruct->unk_12; + while (gRfuState->unk_2c == TRUE) + ; + return gRfuState->unk_12; } -void STWI_send_ResetREQ() +void STWI_send_ResetREQ(void) { - if (!STWI_init(RFU_RESET)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_RESET)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_LinkStatusREQ() +void STWI_send_LinkStatusREQ(void) { - if (!STWI_init(RFU_LINK_STATUS)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_LINK_STATUS)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_VersionStatusREQ() +void STWI_send_VersionStatusREQ(void) { - if (!STWI_init(RFU_VERSION_STATUS)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_VERSION_STATUS)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_SystemStatusREQ() +void STWI_send_SystemStatusREQ(void) { - if (!STWI_init(RFU_SYSTEM_STATUS)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SYSTEM_STATUS)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_SlotStatusREQ() +void STWI_send_SlotStatusREQ(void) { - if (!STWI_init(RFU_SLOT_STATUS)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SLOT_STATUS)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_ConfigStatusREQ() +void STWI_send_ConfigStatusREQ(void) { - if (!STWI_init(RFU_CONFIG_STATUS)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_CONFIG_STATUS)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) { - u8 *v5; - int i; - - if (!STWI_init(RFU_GAME_CONFIG)) - { - gRfuState.rfuStruct->unk_4 = 6; //TODO: what is 6 - - //TODO: kinda gross but idk what's going on here - v5 = (u8*)gRfuState.rfuStruct->unk_24; - v5 += 4; - *(u16*)v5 = *(u16*)unk1; - - v5 += 2; - unk1 += 2; - i = 13; - do - { - *v5 = *unk1; - v5++; - unk1++; - i--; - } - while(i >= 0); - - i = 7; - do - { - *v5 = *data; - v5++; - data++; - i--; - } - while(i >= 0); - - STWI_start_Command(); - } + u8 *v5; + int i; + + if (!STWI_init(RFU_GAME_CONFIG)) + { + gRfuState->unk_4 = 6; //TODO: what is 6 + + //TODO: kinda gross but idk what's going on here + v5 = (u8*)gRfuState->unk_24; + v5 += 4; + *(u16*)v5 = *(u16*)unk1; + + v5 += 2; + unk1 += 2; + + for (i = 0; i < 14; i++) + { + *v5 = *unk1; + v5++; + unk1++; + } + + for (i = 0; i < 8; i++) + { + *v5 = *data; + v5++; + data++; + } + + STWI_start_Command(); + } } void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) { u8 *v5; - if (!STWI_init(RFU_SYSTEM_CONFIG)) - { - gRfuState.rfuStruct->unk_4 = 1; //TODO: what is 1 + if (!STWI_init(RFU_SYSTEM_CONFIG)) + { + gRfuState->unk_4 = 1; //TODO: what is 1 - //TODO: kinda weird but idk what's going on here - v5 = (u8*)gRfuState.rfuStruct->unk_24; - v5 += 4; + //TODO: kinda weird but idk what's going on here + v5 = (u8*)gRfuState->unk_24; + v5 += 4; - *v5++ = unk3; - *v5++ = unk2; - *(u16*)v5 = unk1; - STWI_start_Command(); - } + *v5++ = unk3; + *v5++ = unk2; + *(u16*)v5 = unk1; + STWI_start_Command(); + } } -void STWI_send_SC_StartREQ() +void STWI_send_SC_StartREQ(void) { - if (!STWI_init(RFU_SC_START)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SC_START)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_SC_PollingREQ() +void STWI_send_SC_PollingREQ(void) { - if (!STWI_init(RFU_SC_POLLING)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SC_POLLING)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_SC_EndREQ() +void STWI_send_SC_EndREQ(void) { - if (!STWI_init(RFU_SC_END)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SC_END)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_SP_StartREQ() +void STWI_send_SP_StartREQ(void) { - if (!STWI_init(RFU_SP_START)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SP_START)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_SP_PollingREQ() +void STWI_send_SP_PollingREQ(void) { - if (!STWI_init(RFU_SP_POLLING)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SP_POLLING)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_SP_EndREQ() +void STWI_send_SP_EndREQ(void) { - if (!STWI_init(RFU_SP_END)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_SP_END)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } void STWI_send_CP_StartREQ(u16 unk1) { - if (!STWI_init(RFU_CP_START)) - { - gRfuState.rfuStruct->unk_4 = 1; - *(u32*)(gRfuState.rfuStruct->unk_24 + 4) = unk1; - STWI_start_Command(); - } + if (!STWI_init(RFU_CP_START)) + { + gRfuState->unk_4 = 1; + *(u32*)(gRfuState->unk_24 + 4) = unk1; + STWI_start_Command(); + } } -void STWI_send_CP_PollingREQ() +void STWI_send_CP_PollingREQ(void) { - if (!STWI_init(RFU_CP_POLLING)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_CP_POLLING)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } -void STWI_send_CP_EndREQ() +void STWI_send_CP_EndREQ(void) { - if (!STWI_init(RFU_CP_END)) - { - gRfuState.rfuStruct->unk_4 = 0; - STWI_start_Command(); - } + if (!STWI_init(RFU_CP_END)) + { + gRfuState->unk_4 = 0; + STWI_start_Command(); + } } - -- cgit v1.2.3 From dac306c5e91ad8309bb0246d61204f8670e15955 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Sun, 10 Sep 2017 21:41:56 -0600 Subject: Decompiled librfu to STWI_send_DisconnectREQ --- src/librfu.c | 213 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 177 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index 8e450caa0..67b76b0d9 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -20,13 +20,41 @@ enum RFU_SP_END, RFU_CP_START, RFU_CP_POLLING, - RFU_CP_END + RFU_CP_END, + RFU_UNK22, + RFU_UNK23, + RFU_DATA_TX, + RFU_DATA_TX_AND_CHANGE, + RFU_DATA_RX, + RFU_MS_CHANGE, + RFU_DATA_READY_AND_CHANGE, + RFU_DISCONNECTED_AND_CHANGE, + RFU_UNK2A, + RFU_UNK2B, + RFU_UNK2C, + RFU_UNK2D, + RFU_UNK2E, + RFU_UNK2F, + RFU_DISCONNECT, + RFU_UNK31, + RFU_UNK32, + RFU_UNK33, + RFU_UNK34, + RFU_UNK35, + RFU_UNK36, + RFU_RESUME_RETRANSMIT_AND_CHANGE +}; + +struct RfuPacket +{ + u32 unk_0; + u32 data[0x1C]; }; struct RfuStruct { vs32 unk_0; - u8 unk_4; + u8 txParams; u8 unk_5; u8 unk_6; u8 unk_7; @@ -45,16 +73,16 @@ struct RfuStruct void *callbackM; void *callbackS; u32 callbackID; - u8 *unk_24; - void *unk_28; + struct RfuPacket *txPacket; + struct RfuPacket *rxPacket; vu8 unk_2c; u8 padding[3]; }; struct RfuIntrStruct { - u8 unk28Data[0x74]; - u8 unk24Data[0x74]; + u8 rxPacketAlloc[0x74]; + u8 txPacketAlloc[0x74]; u8 block1[0x960]; u8 block2[0x30]; }; @@ -86,11 +114,11 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b gRfuState = (struct RfuStruct*)interruptStruct->block1; } - gRfuState->unk_28 = interruptStruct->unk28Data; - gRfuState->unk_24 = interruptStruct->unk24Data; + gRfuState->rxPacket = (struct RfuPacket*)interruptStruct->rxPacketAlloc; + gRfuState->txPacket = (struct RfuPacket*)interruptStruct->txPacketAlloc; gRfuState->msMode = 1; gRfuState->unk_0 = 0; - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; gRfuState->unk_5 = 0; gRfuState->unk_7 = 0; gRfuState->unk_8 = 0; @@ -136,7 +164,7 @@ void AgbRFU_SoftReset(void) REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; gRfuState->unk_0 = 0; - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; gRfuState->unk_5 = 0; gRfuState->unk_6 = 0; gRfuState->unk_7 = 0; @@ -208,7 +236,7 @@ void STWI_send_ResetREQ(void) { if (!STWI_init(RFU_RESET)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -217,7 +245,7 @@ void STWI_send_LinkStatusREQ(void) { if (!STWI_init(RFU_LINK_STATUS)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -226,7 +254,7 @@ void STWI_send_VersionStatusREQ(void) { if (!STWI_init(RFU_VERSION_STATUS)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -235,7 +263,7 @@ void STWI_send_SystemStatusREQ(void) { if (!STWI_init(RFU_SYSTEM_STATUS)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -244,7 +272,7 @@ void STWI_send_SlotStatusREQ(void) { if (!STWI_init(RFU_SLOT_STATUS)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -253,7 +281,7 @@ void STWI_send_ConfigStatusREQ(void) { if (!STWI_init(RFU_CONFIG_STATUS)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -265,15 +293,15 @@ void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) if (!STWI_init(RFU_GAME_CONFIG)) { - gRfuState->unk_4 = 6; //TODO: what is 6 + gRfuState->txParams = 6; - //TODO: kinda gross but idk what's going on here - v5 = (u8*)gRfuState->unk_24; - v5 += 4; + //TODO: kinda gross but it was probably written weird + v5 = (u8*)gRfuState->txPacket; + v5 += sizeof(u32); *(u16*)v5 = *(u16*)unk1; - v5 += 2; - unk1 += 2; + v5 += sizeof(u16); + unk1 += sizeof(u16); for (i = 0; i < 14; i++) { @@ -299,11 +327,11 @@ void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) if (!STWI_init(RFU_SYSTEM_CONFIG)) { - gRfuState->unk_4 = 1; //TODO: what is 1 + gRfuState->txParams = 1; - //TODO: kinda weird but idk what's going on here - v5 = (u8*)gRfuState->unk_24; - v5 += 4; + //TODO: kinda weird but I think it was written weird + v5 = (u8*)gRfuState->txPacket; + v5 += sizeof(u32); *v5++ = unk3; *v5++ = unk2; @@ -316,7 +344,7 @@ void STWI_send_SC_StartREQ(void) { if (!STWI_init(RFU_SC_START)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -325,7 +353,7 @@ void STWI_send_SC_PollingREQ(void) { if (!STWI_init(RFU_SC_POLLING)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -334,7 +362,7 @@ void STWI_send_SC_EndREQ(void) { if (!STWI_init(RFU_SC_END)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -343,7 +371,7 @@ void STWI_send_SP_StartREQ(void) { if (!STWI_init(RFU_SP_START)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -352,7 +380,7 @@ void STWI_send_SP_PollingREQ(void) { if (!STWI_init(RFU_SP_POLLING)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -361,7 +389,7 @@ void STWI_send_SP_EndREQ(void) { if (!STWI_init(RFU_SP_END)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -370,8 +398,8 @@ void STWI_send_CP_StartREQ(u16 unk1) { if (!STWI_init(RFU_CP_START)) { - gRfuState->unk_4 = 1; - *(u32*)(gRfuState->unk_24 + 4) = unk1; + gRfuState->txParams = 1; + gRfuState->txPacket->data[0] = unk1; STWI_start_Command(); } } @@ -380,7 +408,7 @@ void STWI_send_CP_PollingREQ(void) { if (!STWI_init(RFU_CP_POLLING)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; STWI_start_Command(); } } @@ -389,7 +417,120 @@ void STWI_send_CP_EndREQ(void) { if (!STWI_init(RFU_CP_END)) { - gRfuState->unk_4 = 0; + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataTxREQ(void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX)) + { + u8 txParams = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + txParams += 1; + + gRfuState->txParams = txParams; + CpuCopy32(in, gRfuState->txPacket->data, gRfuState->txParams * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataTxAndChangeREQ(void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX_AND_CHANGE)) + { + u8 txParams = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + txParams += 1; + + gRfuState->txParams = txParams; + CpuCopy32(in, gRfuState->txPacket->data, gRfuState->txParams * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataRxREQ() +{ + if (!STWI_init(RFU_DATA_RX)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_MS_ChangeREQ() +{ + if (!STWI_init(RFU_MS_CHANGE)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataReadyAndChangeREQ(u8 unk) +{ + if (!STWI_init(RFU_DATA_READY_AND_CHANGE)) + { + if (!unk) + { + gRfuState->txParams = 0; + } + else + { + u8 *packetBytes; + + gRfuState->txParams = 1; + + packetBytes = (u8*)gRfuState->txPacket; + packetBytes += sizeof(u32); + + *packetBytes++ = unk; + *packetBytes++ = 0; + *packetBytes++ = 0; + *packetBytes = 0; + } + + STWI_start_Command(); + } +} + +void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_DISCONNECTED_AND_CHANGE)) + { + u8 *packetBytes; + + gRfuState->txParams = 1; + + packetBytes = (u8*)gRfuState->txPacket; + packetBytes += sizeof(u32); + + *packetBytes++ = unk0; + *packetBytes++ = unk1; + *packetBytes++ = 0; + *packetBytes = 0; + + STWI_start_Command(); + } +} + +void STWI_send_ResumeRetransmitAndChangeREQ() +{ + if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_DisconnectREQ(u8 unk) +{ + if (!STWI_init(RFU_DISCONNECT)) + { + gRfuState->txParams = 1; + gRfuState->txPacket->data[0] = unk; + STWI_start_Command(); } } -- cgit v1.2.3 From 9218c2ce16777bba33fea2b606c5805553d190de Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Sun, 10 Sep 2017 21:46:26 -0600 Subject: Decompile to STWI_send_TestModeREQ --- src/librfu.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index 67b76b0d9..00dde830b 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -36,7 +36,7 @@ enum RFU_UNK2E, RFU_UNK2F, RFU_DISCONNECT, - RFU_UNK31, + RFU_TEST_MODE, RFU_UNK32, RFU_UNK33, RFU_UNK34, @@ -534,3 +534,14 @@ void STWI_send_DisconnectREQ(u8 unk) STWI_start_Command(); } } + +void STWI_send_TestModeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_TEST_MODE)) + { + gRfuState->txParams = 1; + gRfuState->txPacket->data[0] = unk0 | (unk1 << 8); + + STWI_start_Command(); + } +} -- cgit v1.2.3 From e26e1f1275a23e290322059bab1f80f89dac4f8a Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Sun, 10 Sep 2017 21:58:47 -0600 Subject: Use a union to differentiate between 8-bit and 32-bit operations on packets --- src/librfu.c | 72 ++++++++++++++++++++++++++++++++++-------------------------- 1 file changed, 41 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index 00dde830b..5cbe9eb49 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -45,12 +45,23 @@ enum RFU_RESUME_RETRANSMIT_AND_CHANGE }; -struct RfuPacket +struct RfuPacket8 { - u32 unk_0; + u8 data[0x74]; +}; + +struct RfuPacket32 +{ + u32 command; u32 data[0x1C]; }; +union RfuPacket +{ + struct RfuPacket32 rfuPacket32; + struct RfuPacket8 rfuPacket8; +}; + struct RfuStruct { vs32 unk_0; @@ -73,8 +84,8 @@ struct RfuStruct void *callbackM; void *callbackS; u32 callbackID; - struct RfuPacket *txPacket; - struct RfuPacket *rxPacket; + union RfuPacket *txPacket; + union RfuPacket *rxPacket; vu8 unk_2c; u8 padding[3]; }; @@ -114,8 +125,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b gRfuState = (struct RfuStruct*)interruptStruct->block1; } - gRfuState->rxPacket = (struct RfuPacket*)interruptStruct->rxPacketAlloc; - gRfuState->txPacket = (struct RfuPacket*)interruptStruct->txPacketAlloc; + gRfuState->rxPacket = (union RfuPacket*)interruptStruct->rxPacketAlloc; + gRfuState->txPacket = (union RfuPacket*)interruptStruct->txPacketAlloc; gRfuState->msMode = 1; gRfuState->unk_0 = 0; gRfuState->txParams = 0; @@ -288,32 +299,32 @@ void STWI_send_ConfigStatusREQ(void) void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) { - u8 *v5; + u8 *packetBytes; int i; if (!STWI_init(RFU_GAME_CONFIG)) { gRfuState->txParams = 6; - //TODO: kinda gross but it was probably written weird - v5 = (u8*)gRfuState->txPacket; - v5 += sizeof(u32); - *(u16*)v5 = *(u16*)unk1; + //TODO: what is unk1 + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *(u16*)packetBytes = *(u16*)unk1; - v5 += sizeof(u16); + packetBytes += sizeof(u16); unk1 += sizeof(u16); for (i = 0; i < 14; i++) { - *v5 = *unk1; - v5++; + *packetBytes = *unk1; + packetBytes++; unk1++; } for (i = 0; i < 8; i++) { - *v5 = *data; - v5++; + *packetBytes = *data; + packetBytes++; data++; } @@ -323,19 +334,18 @@ void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) { - u8 *v5; - if (!STWI_init(RFU_SYSTEM_CONFIG)) { + u8 *packetBytes; + gRfuState->txParams = 1; - //TODO: kinda weird but I think it was written weird - v5 = (u8*)gRfuState->txPacket; - v5 += sizeof(u32); + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); - *v5++ = unk3; - *v5++ = unk2; - *(u16*)v5 = unk1; + *packetBytes++ = unk3; + *packetBytes++ = unk2; + *(u16*)packetBytes = unk1; STWI_start_Command(); } } @@ -399,7 +409,7 @@ void STWI_send_CP_StartREQ(u16 unk1) if (!STWI_init(RFU_CP_START)) { gRfuState->txParams = 1; - gRfuState->txPacket->data[0] = unk1; + gRfuState->txPacket->rfuPacket32.data[0] = unk1; STWI_start_Command(); } } @@ -431,7 +441,7 @@ void STWI_send_DataTxREQ(void *in, u8 size) txParams += 1; gRfuState->txParams = txParams; - CpuCopy32(in, gRfuState->txPacket->data, gRfuState->txParams * sizeof(u32)); + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); STWI_start_Command(); } } @@ -445,7 +455,7 @@ void STWI_send_DataTxAndChangeREQ(void *in, u8 size) txParams += 1; gRfuState->txParams = txParams; - CpuCopy32(in, gRfuState->txPacket->data, gRfuState->txParams * sizeof(u32)); + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); STWI_start_Command(); } } @@ -482,7 +492,7 @@ void STWI_send_DataReadyAndChangeREQ(u8 unk) gRfuState->txParams = 1; - packetBytes = (u8*)gRfuState->txPacket; + packetBytes = gRfuState->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = unk; @@ -503,7 +513,7 @@ void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) gRfuState->txParams = 1; - packetBytes = (u8*)gRfuState->txPacket; + packetBytes = gRfuState->txPacket->rfuPacket8.data; packetBytes += sizeof(u32); *packetBytes++ = unk0; @@ -529,7 +539,7 @@ void STWI_send_DisconnectREQ(u8 unk) if (!STWI_init(RFU_DISCONNECT)) { gRfuState->txParams = 1; - gRfuState->txPacket->data[0] = unk; + gRfuState->txPacket->rfuPacket32.data[0] = unk; STWI_start_Command(); } @@ -540,7 +550,7 @@ void STWI_send_TestModeREQ(u8 unk0, u8 unk1) if (!STWI_init(RFU_TEST_MODE)) { gRfuState->txParams = 1; - gRfuState->txPacket->data[0] = unk0 | (unk1 << 8); + gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); STWI_start_Command(); } -- cgit v1.2.3 From ce08f34ed54b9e5af9a8d1d6cd780df7207c1dbb Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Sun, 10 Sep 2017 22:22:10 -0600 Subject: Finish with STWI_send_* --- src/librfu.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index 5cbe9eb49..dfb2f7221 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -37,12 +37,18 @@ enum RFU_UNK2F, RFU_DISCONNECT, RFU_TEST_MODE, - RFU_UNK32, - RFU_UNK33, - RFU_UNK34, + RFU_CPR_START, + RFU_CPR_POLLING, + RFU_CPR_END, RFU_UNK35, RFU_UNK36, - RFU_RESUME_RETRANSMIT_AND_CHANGE + RFU_RESUME_RETRANSMIT_AND_CHANGE, + RFU_UNK38, + RFU_UNK39, + RFU_UNK3A, + RFU_UNK3B, + RFU_UNK3C, + RFU_STOP_MODE, //3D }; struct RfuPacket8 @@ -555,3 +561,48 @@ void STWI_send_TestModeREQ(u8 unk0, u8 unk1) STWI_start_Command(); } } + +void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) +{ + u32 *packetData; + u32 arg1; + + if (!STWI_init(RFU_CPR_START)) + { + gRfuState->txParams = 2; + + arg1 = unk1 | (unk0 << 16); + packetData = gRfuState->txPacket->rfuPacket32.data; + packetData[0] = arg1; + packetData[1] = unk2; + + STWI_start_Command(); + } +} + +void STWI_send_CPR_PollingREQ() +{ + if (!STWI_init(RFU_CPR_POLLING)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_CPR_EndREQ() +{ + if (!STWI_init(RFU_CPR_END)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_StopModeREQ() +{ + if (!STWI_init(RFU_STOP_MODE)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} -- cgit v1.2.3 From 3c51ecded9dee7c8d85642709d2e93af34274f39 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Mon, 11 Sep 2017 17:04:13 -0600 Subject: Decompile to STWI_init --- src/librfu.c | 143 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 128 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index dfb2f7221..f1c35b1ec 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -79,16 +79,16 @@ struct RfuStruct u8 unk_9; u8 timerSelect; u8 unk_b; - u32 unk_c; - vu8 unk_10; + int timerState; + vu8 timerActive; u8 unk_11; vu16 unk_12; vu8 msMode; u8 unk_15; u8 unk_16; u8 unk_17; - void *callbackM; - void *callbackS; + void (*callbackM)(); + void (*callbackS)(); u32 callbackID; union RfuPacket *txPacket; union RfuPacket *rxPacket; @@ -112,7 +112,11 @@ void STWI_set_Callback_M(void * callback); void STWI_set_Callback_S(void * callback); u16 STWI_init(u8 request); int STWI_start_Command(void); -extern void STWI_intr_timer(void); +void STWI_intr_timer(void); +void STWI_set_timer(u8 unk); +extern void STWI_stop_timer(void); +extern void STWI_restart_Command(void); +extern void STWI_reset_ClockCounter(void); void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) { @@ -140,8 +144,8 @@ void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, b gRfuState->unk_7 = 0; gRfuState->unk_8 = 0; gRfuState->unk_9 = 0; - gRfuState->unk_c = 0; - gRfuState->unk_10 = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; gRfuState->unk_12 = 0; gRfuState->unk_15 = 0; gRfuState->unk_2c = 0; @@ -187,8 +191,8 @@ void AgbRFU_SoftReset(void) gRfuState->unk_7 = 0; gRfuState->unk_8 = 0; gRfuState->unk_9 = 0; - gRfuState->unk_c = 0; - gRfuState->unk_10 = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; gRfuState->unk_12 = 0; gRfuState->msMode = 1; gRfuState->unk_15 = 0; @@ -466,7 +470,7 @@ void STWI_send_DataTxAndChangeREQ(void *in, u8 size) } } -void STWI_send_DataRxREQ() +void STWI_send_DataRxREQ(void) { if (!STWI_init(RFU_DATA_RX)) { @@ -475,7 +479,7 @@ void STWI_send_DataRxREQ() } } -void STWI_send_MS_ChangeREQ() +void STWI_send_MS_ChangeREQ(void) { if (!STWI_init(RFU_MS_CHANGE)) { @@ -531,7 +535,7 @@ void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) } } -void STWI_send_ResumeRetransmitAndChangeREQ() +void STWI_send_ResumeRetransmitAndChangeREQ(void) { if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) { @@ -580,7 +584,7 @@ void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) } } -void STWI_send_CPR_PollingREQ() +void STWI_send_CPR_PollingREQ(void) { if (!STWI_init(RFU_CPR_POLLING)) { @@ -589,7 +593,7 @@ void STWI_send_CPR_PollingREQ() } } -void STWI_send_CPR_EndREQ() +void STWI_send_CPR_EndREQ(void) { if (!STWI_init(RFU_CPR_END)) { @@ -598,7 +602,7 @@ void STWI_send_CPR_EndREQ() } } -void STWI_send_StopModeREQ() +void STWI_send_StopModeREQ(void) { if (!STWI_init(RFU_STOP_MODE)) { @@ -606,3 +610,112 @@ void STWI_send_StopModeREQ() STWI_start_Command(); } } + +void STWI_intr_timer(void) +{ + switch (gRfuState->timerState) + { + //TODO: Make an enum for these + case 2: + gRfuState->timerActive = 1; + STWI_set_timer(50); + break; + case 1: + case 4: + STWI_stop_timer(); + STWI_restart_Command(); + break; + case 3: + gRfuState->timerActive = 1; + STWI_stop_timer(); + STWI_reset_ClockCounter(); + if (gRfuState->callbackM) + gRfuState->callbackM(255, 0); + break; + } +} + +void STWI_set_timer(u8 unk) +{ + vu16 *timerL; + vu16 *timerH; + + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->timerSelect); + REG_IME = 0; + switch (unk) + { + case 50: + *timerL = 0xFCCB; + gRfuState->timerState = 1; + break; + case 80: + *timerL = 0xFAE0; + gRfuState->timerState = 2; + break; + case 100: + *timerL = 0xF996; + gRfuState->timerState = 3; + break; + case 130: + *timerL = 0xF7AD; + gRfuState->timerState = 4; + break; + } + *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; + REG_IF = INTR_FLAG_TIMER0 << gRfuState->timerSelect; + REG_IME = 1; +} + +void STWI_stop_timer(void) +{ + gRfuState->timerState = 0; + + REG_TMCNT_L(gRfuState->timerSelect) = 0; + REG_TMCNT_H(gRfuState->timerSelect) = 0; +} + +u16 STWI_init(u8 request) +{ + if (!REG_IME) + { + gRfuState->unk_12 = 6; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->unk_12); + return TRUE; + } + else if (gRfuState->unk_2c == TRUE) + { + gRfuState->unk_12 = 2; + gRfuState->unk_2c = FALSE; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->unk_12); + return TRUE; + } + else if(!gRfuState->msMode) + { + gRfuState->unk_12 = 4; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->unk_12, gRfuState); + return TRUE; + } + else + { + gRfuState->unk_2c = TRUE; + gRfuState->unk_6 = request; + gRfuState->unk_0 = 0; + gRfuState->txParams = 0; + gRfuState->unk_5 = 0; + gRfuState->unk_7 = 0; + gRfuState->unk_8 = 0; + gRfuState->unk_9 = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->unk_12 = 0; + gRfuState->unk_15 = 0; + + REG_RCNT = 0x100; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + return FALSE; + } +} -- cgit v1.2.3 From a8a6816f0e6e6c20aa1ae23bf8030153c147b075 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Mon, 11 Sep 2017 17:49:50 -0600 Subject: Decompile STWI_start_command --- src/librfu.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index f1c35b1ec..37b76ec3e 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -73,7 +73,7 @@ struct RfuStruct vs32 unk_0; u8 txParams; u8 unk_5; - u8 unk_6; + u8 activeCommand; u8 unk_7; u8 unk_8; u8 unk_9; @@ -187,7 +187,7 @@ void AgbRFU_SoftReset(void) gRfuState->unk_0 = 0; gRfuState->txParams = 0; gRfuState->unk_5 = 0; - gRfuState->unk_6 = 0; + gRfuState->activeCommand = 0; gRfuState->unk_7 = 0; gRfuState->unk_8 = 0; gRfuState->unk_9 = 0; @@ -215,7 +215,7 @@ u16 STWI_read_status(u8 index) case 2: return gRfuState->unk_0; case 3: - return gRfuState->unk_6; + return gRfuState->activeCommand; default: return 0xFFFF; } @@ -702,7 +702,7 @@ u16 STWI_init(u8 request) else { gRfuState->unk_2c = TRUE; - gRfuState->unk_6 = request; + gRfuState->activeCommand = request; gRfuState->unk_0 = 0; gRfuState->txParams = 0; gRfuState->unk_5 = 0; @@ -719,3 +719,25 @@ u16 STWI_init(u8 request) return FALSE; } } + +int STWI_start_Command() +{ + u16 imeTemp; + + // Yes, it matters that it's casted to a u32... + *(u32*)gRfuState->txPacket->rfuPacket8.data = 0x99660000 | (gRfuState->txParams << 8) | gRfuState->activeCommand; + REG_SIODATA32 = gRfuState->txPacket->rfuPacket32.command; + + gRfuState->unk_0 = 0; + gRfuState->unk_5 = 1; + + imeTemp = REG_IME; + REG_IME = 0; + REG_IE |= (INTR_FLAG_TIMER0 << gRfuState->timerSelect); + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = imeTemp; + + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; + + return 0; +} -- cgit v1.2.3 From dd316b28e017d24567a86e972d780a43d42cd140 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Tue, 12 Sep 2017 20:11:51 -0600 Subject: Decompile up to ARM functions in librfu, split ARM interrupt functions into their own .s --- src/librfu.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c index 37b76ec3e..e647b9178 100644 --- a/src/librfu.c +++ b/src/librfu.c @@ -115,8 +115,8 @@ int STWI_start_Command(void); void STWI_intr_timer(void); void STWI_set_timer(u8 unk); extern void STWI_stop_timer(void); -extern void STWI_restart_Command(void); -extern void STWI_reset_ClockCounter(void); +int STWI_restart_Command(void); +int STWI_reset_ClockCounter(void); void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) { @@ -741,3 +741,48 @@ int STWI_start_Command() return 0; } + +int STWI_restart_Command(void) +{ + if (gRfuState->unk_15 <= 1) + { + gRfuState->unk_15++; + STWI_start_Command(); + } + else + { + if (gRfuState->activeCommand == RFU_MS_CHANGE || gRfuState->activeCommand == RFU_DATA_TX_AND_CHANGE || gRfuState->activeCommand == RFU_UNK35 || gRfuState->activeCommand == RFU_RESUME_RETRANSMIT_AND_CHANGE) + { + gRfuState->unk_12 = 1; + gRfuState->unk_2c = 0; + + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); + } + else + { + gRfuState->unk_12 = 1; + gRfuState->unk_2c = 0; + + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); + + gRfuState->unk_0 = 4; //TODO: what's 4 + } + } + + return 0; +} + +int STWI_reset_ClockCounter() +{ + gRfuState->unk_0 = 5; //TODO: what is 5 + gRfuState->txParams = 0; + gRfuState->unk_5 = 0; + REG_SIODATA32 = (1 << 31); + REG_SIOCNT = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F; + + return 0; +} -- cgit v1.2.3 From c2f1e2fe5355800f2941b4788925649142a9ebdf Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Wed, 20 Sep 2017 15:07:24 -0400 Subject: decompiled up to sub_81C0510 --- src/pokemon_summary_screen.c | 730 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 730 insertions(+) create mode 100755 src/pokemon_summary_screen.c (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c new file mode 100755 index 000000000..12fd52dfb --- /dev/null +++ b/src/pokemon_summary_screen.c @@ -0,0 +1,730 @@ +#include "battle.h" +#include "decompress.h" +#include "global.h" +#include "m4a.h" +#include "main.h" +#include "malloc.h" +#include "palette.h" +#include "pokemon.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "window.h" + +extern struct unkSummaryStruct* gUnknown_0203CF1C; +extern struct BgTemplate gUnknown_0861CBB4; +extern u8 gUnknown_0203CF20; +extern struct MusicPlayerInfo gMPlay_BGM; + +extern void sub_806F2AC(u8 a, u8 b); +void sub_81C488C(u8 a); +extern void do_scheduled_bg_tilemap_copies_to_vram(void); +extern u8 sub_81221EC(); +extern u8 sub_81221AC(); +extern void SetVBlankHBlankCallbacksToNull(); +extern void sub_8121DA0(); +extern void clear_scheduled_bg_copies_to_vram(); +extern void remove_some_task(); +extern void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable); +extern void ShowBg(u8 a); +extern void SetGpuReg(u8 regOffset, u16 value); +extern void schedule_bg_copy_tilemap_to_vram(u8 a); +extern void InitBgsFromTemplates(u8 bgMode, struct BgTemplate *templates, u8 numTemplates); +extern void SetBgTilemapBuffer(u8 bg, void *tilemap); +extern u8 gUnknown_08D9862C; +extern u8 gUnknown_08D98CC8; +extern u8 gUnknown_08D987FC; +extern u8 gUnknown_08D9898C; +extern u8 gUnknown_08D98B28; +extern u8 gUnknown_08D9853C; +extern u8 gUnknown_08D85620; +extern struct CompressedSpriteSheet gUnknown_0861CFBC; +extern struct CompressedSpriteSheet gUnknown_0861D074; +extern struct CompressedSpriteSheet gUnknown_0861D0F8; +extern struct CompressedSpritePalette gUnknown_0861D100; +extern struct CompressedSpritePalette gUnknown_0861D07C; +extern u8 gUnknown_08D97B84; +extern u8 gUnknown_08D97D0C; +extern void reset_temp_tile_data_buffers(); +extern void decompress_and_copy_tile_data_to_vram(u8 a, void* tiledata, u8 b, u8 c, u8 d); +extern u8 free_temp_tile_data_buffers_if_possible(); +extern void sub_8069004(struct BoxPokemon* a, void* b); + +extern u32 ChangeBgX(u8 bg, u32 value, u8 op); + +void sub_81BFAE4(void); +void sub_81BFE24(); +u8 sub_81BFEB0(); +void sub_81C2554(); +void sub_81C1BA0(); +void sub_81C0098(struct Pokemon* a); +u8 sub_81C00F0(struct Pokemon* a); +void sub_81C25E8(); +void sub_81C286C(); +void sub_81C2D9C(u8 a); +void sub_81C0348(); +void sub_81C2AFC(u8 a); +void sub_81C4190(); +void sub_81C42C8(); +u8 sub_81C45F4(void* a, u16* b); +void sub_81C4984(); +void sub_81C4A08(); +void sub_81C4A88(); +void sub_81C4280(); +void sub_81C0510(u8 taskId); +void sub_81C171C(u8 taskId); +void sub_8121E10(); +u8 sub_81B205C(struct Pokemon* a); +void sub_81C1DA4(u8 a, u8 b); +void sub_81C1EFC(u8 a, u8 b, u8 c); +void sub_81C240C(u16 a); +void sub_81C2194(void* a, u8 b, u8 c); +void sub_81C2074(u8 a, u8 b); +void sub_81C2524(); +void sub_81C2228(struct Pokemon* poke); +void sub_81C0484(u8 taskId); +void sub_81C4898(); +void sub_806F47C(u8 a); +u8 GetLRKeysState(); +void sub_81C0604(u8 taskId, s8 a); +void sub_81C0A8C(u8 taskId, s8 a); +void sub_81C48F0(); +void sub_81C0E48(u8 taskId); +void sub_81C0704(u8 taskId); + + +u8 sub_81BFB10(); +u8 sub_81B1250(); + +union unkUnion{ + struct Pokemon mons[6]; + struct BoxPokemon boxMons[6]; +}; + +u8 sub_80D214C(union unkUnion* a, u8 b, u8 c, int d); + +struct pokeSummary{ + u16 species; // 0x0 + u16 species2; // 0x2 + u8 isEgg; // 0x4 + u8 level; // 0x5 + u8 ribbons; // 0x6 + u8 unk7; // 0x7 + u8 altability; // 0x8 + u8 metLocation; // 0x9 + u8 metLevel; // 0xA + u8 metGame; // 0xB + u32 pid; // 0xC + u32 exp; // 0x10 + u16 moves[4]; // 0x14 + u8 pp[4]; // 0x1C + u16 currentHP; // 0x20 + u16 maxHP; // 0x22 + u16 atk; // 0x24 + u16 def; // 0x26 + u16 spatk; // 0x28 + u16 spdef; // 0x2A + u16 speed; // 0x2C + u16 item; // 0x2E + u16 friendship; // 0x30 + u8 OTGender; // 0x32 + u8 nature; // 0x33 + u8 ppBonuses; // 0x34 + u8 sanity; // 0x35 + u8 OTName[8]; // 0x36 + u8 unk3E[9]; // 0x3E + u32 OTID; // 0x48 +}; + +struct unkSummaryStruct{ + union unkUnion* unk0; + void* unk4; + void* unk8; + struct Pokemon currentPoke; + struct pokeSummary summary; + u8 unkTilemap0[0x800]; + u8 unkTilemap0_1[0x800]; + u8 unkTilemap1[0x800]; + u8 unkTilemap1_1[0x800]; + u8 unkTilemap2[0x800]; + u8 unkTilemap2_1[0x800]; + u8 unkTilemap3[0x800]; + u8 unkTilemap3_1[0x800]; + u8 unk40BC; + u8 unk40BD; + u8 unk40BE; + u8 unk40BF; + u8 unk40C0; + u8 unk40C1; + u8 unk40C2; + u8 unk40C3; + u16 unk40C4; + u8 unk40C6; + u8 unk_filler3; + u8 unk40C8; + u8 unk_filler2[0xA]; + u8 unk40D3; + u8 unk_filler5[0x1B]; + u8 unk40EF; + s16 unk40F0; + u8 unk_filler4[6]; +}; + +void sub_81BF8EC(u8 a, void* b, u8 c, u8 d, void* e) +{ + u8 byte; + gUnknown_0203CF1C = AllocZeroed(0x40F8); + gUnknown_0203CF1C->unk40BC = a; + gUnknown_0203CF1C->unk0 = b; + gUnknown_0203CF1C->unk40BE = c; + gUnknown_0203CF1C->unk40BF = d; + gUnknown_0203CF1C->unk4 = e; + if (a == 2) + gUnknown_0203CF1C->unk40BD = 1; + else + gUnknown_0203CF1C->unk40BD = 0; + switch (a) + { + case 0: + case 2: + gUnknown_0203CF1C->unk40C1 = 0; + gUnknown_0203CF1C->unk40C2 = 3; + break; + case 1: + gUnknown_0203CF1C->unk40C1 = 0; + gUnknown_0203CF1C->unk40C2 = 3; + gUnknown_0203CF1C->unk40C8 = 1; + break; + case 3: + gUnknown_0203CF1C->unk40C1 = 2; + gUnknown_0203CF1C->unk40C2 = 3; + gUnknown_0203CF1C->unk40C3 = 1; + break; + } + byte = gUnknown_0203CF1C->unk40C1; + gUnknown_0203CF1C->unk40C0 = byte; + sub_81C488C(0xFF); + if (gBattleSpritesGfx == 0) + sub_806F2AC(0, 0); + SetMainCallback2(sub_81BFAE4); +} + +void sub_81BFA38(void* a, u8 b, u8 c, void* d, u16 e) +{ + sub_81BF8EC(3, a, b, c, d); + gUnknown_0203CF1C->unk40C4 = e; +} + +void sub_81BFA80(u8 a, void* b, u8 c, u8 d, void* e) +{ + sub_81BF8EC(a, b, c, d, e); + gUnknown_0203CF1C->unk40EF = 1; +} + +void sub_81BFAB4(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + do_scheduled_bg_tilemap_copies_to_vram(); + UpdatePaletteFade(); +} + +void sub_81BFAD0(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_81BFAE4() +{ + while(1) + { + if (sub_81221EC() == 1 || sub_81BFB10() == 1 || sub_81221AC() == 1) + break; + } +} + +u8 sub_81BFB10() +{ + switch (gMain.state) + { + case 0: + SetVBlankHBlankCallbacksToNull(); + sub_8121DA0(); + clear_scheduled_bg_copies_to_vram(); + gMain.state++; + break; + case 1: + remove_some_task(); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = 1; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 5: + sub_81BFE24(); + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; + break; + case 6: + if (sub_81BFEB0() != 0) + gMain.state++; + break; + case 7: + sub_81C2554(); + gMain.state++; + break; + case 8: + sub_81C1BA0(); + gMain.state++; + break; + case 9: + sub_81C0098(&gUnknown_0203CF1C->currentPoke); + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; + break; + case 10: + if(sub_81C00F0(&gUnknown_0203CF1C->currentPoke) != 0) + gMain.state++; + break; + case 11: + sub_81C25E8(); + gMain.state++; + break; + case 12: + sub_81C286C(); + gMain.state++; + break; + case 13: + sub_81C2D9C(gUnknown_0203CF1C->unk40C0); + gMain.state++; + break; + case 14: + sub_81C0348(); + gMain.state++; + break; + case 15: + sub_81C2AFC(gUnknown_0203CF1C->unk40C0); + gMain.state++; + break; + case 16: + sub_81C4190(); + sub_81C42C8(); + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; + break; + case 17: + gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &gUnknown_0203CF1C->unk40F0); + if (gUnknown_0203CF1C->unk40D3 != 0xFF) + { + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; + } + break; + case 18: + sub_81C4984(&gUnknown_0203CF1C->currentPoke); + gMain.state++; + break; + case 19: + sub_81C4A08(&gUnknown_0203CF1C->currentPoke); + gMain.state++; + break; + case 20: + sub_81C4A88(); + gMain.state++; + break; + case 21: + sub_81C4280(); + gMain.state++; + break; + case 22: + if (gUnknown_0203CF1C->unk40BC != 3) + CreateTask(sub_81C0510, 0); + else + CreateTask(sub_81C171C, 0); + gMain.state++; + break; + case 23: + BlendPalettes(-1, 16, 0); + gMain.state++; + break; + case 24: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + gMain.state++; + break; + default: + SetVBlankCallback(sub_81BFAD0); + SetMainCallback2(sub_81BFAB4); + return 1; + } + return 0; +} + +void sub_81BFE24() +{ + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, &gUnknown_0861CBB4, 4); + SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap2); + SetBgTilemapBuffer(2, &gUnknown_0203CF1C->unkTilemap1); + SetBgTilemapBuffer(3, &gUnknown_0203CF1C->unkTilemap0); + sub_8121E10(); + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); + schedule_bg_copy_tilemap_to_vram(3); + SetGpuReg(0, 0x1040); + SetGpuReg(0x50, 0); + ShowBg(0); + ShowBg(1); + ShowBg(2); + ShowBg(3); +} + +u8 sub_81BFEB0() +{ + switch (gUnknown_0203CF1C->unk40F0) + { + case 0: + reset_temp_tile_data_buffers(); + decompress_and_copy_tile_data_to_vram(1, &gUnknown_08D97D0C, 0, 0, 0); + gUnknown_0203CF1C->unk40F0++; + break; + case 1: + if (free_temp_tile_data_buffers_if_possible() != 1) + { + LZDecompressWram(&gUnknown_08D9862C, gUnknown_0203CF1C->unkTilemap0); + gUnknown_0203CF1C->unk40F0++; + } + break; + case 2: + LZDecompressWram(&gUnknown_08D98CC8, gUnknown_0203CF1C->unkTilemap0_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 3: + LZDecompressWram(&gUnknown_08D987FC, gUnknown_0203CF1C->unkTilemap1_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 4: + LZDecompressWram(&gUnknown_08D9898C, gUnknown_0203CF1C->unkTilemap2_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 5: + LZDecompressWram(&gUnknown_08D98B28, gUnknown_0203CF1C->unkTilemap3_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 6: + LoadCompressedPalette(&gUnknown_08D9853C, 0, 0x100); + LoadPalette(&gUnknown_08D85620, 0x81, 0x1E); + gUnknown_0203CF1C->unk40F0++; + break; + case 7: + LoadCompressedObjectPic(&gUnknown_0861CFBC); + gUnknown_0203CF1C->unk40F0++; + break; + case 8: + LoadCompressedObjectPic(&gUnknown_0861D074); + gUnknown_0203CF1C->unk40F0++; + break; + case 9: + LoadCompressedObjectPic(&gUnknown_0861D0F8); + gUnknown_0203CF1C->unk40F0++; + break; + case 10: + LoadCompressedObjectPalette(&gUnknown_0861D100); + gUnknown_0203CF1C->unk40F0++; + break; + case 11: + LoadCompressedObjectPalette(&gUnknown_0861D07C); + gUnknown_0203CF1C->unk40F0++; + break; + case 12: + LoadCompressedPalette(&gUnknown_08D97B84, 0x1D0, 0x60); + gUnknown_0203CF1C->unk40F0 = 0; + return 1; + } + return 0; +} + +#ifdef NONMATCHING +void sub_81C0098(struct Pokemon* poke) +{ + if (gUnknown_0203CF1C->unk40BD == 0) + { + struct Pokemon* src = &gUnknown_0203CF1C->unk0->mons[gUnknown_0203CF1C->unk40BE]; + *poke = *src; + } + else + sub_8069004(&gUnknown_0203CF1C->unk0->boxMons[gUnknown_0203CF1C->unk40BE], poke); +} +#else +__attribute__((naked)) +void sub_81C0098(struct Pokemon* poke) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + adds r3, r0, 0\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r1, [r0]\n\ + ldr r2, =0x000040bd\n\ + adds r0, r1, r2\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _081C00D0\n\ + ldr r2, [r1]\n\ + ldr r4, =0x000040be\n\ + adds r0, r1, r4\n\ + ldrb r1, [r0]\n\ + movs r0, 0x64\n\ + muls r1, r0\n\ + adds r1, r2\n\ + adds r0, r3, 0\n\ + movs r2, 0x64\n\ + bl memcpy\n\ + b _081C00E6\n\ + .pool\n\ +_081C00D0:\n\ + ldr r0, [r1]\n\ + ldr r2, =0x000040be\n\ + adds r1, r2\n\ + ldrb r2, [r1]\n\ + lsls r1, r2, 2\n\ + adds r1, r2\n\ + lsls r1, 4\n\ + adds r0, r1\n\ + adds r1, r3, 0\n\ + bl sub_8069004\n\ +_081C00E6:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +u8 sub_81C00F0(struct Pokemon* a) +{ + u32 i; + struct pokeSummary* sum = &gUnknown_0203CF1C->summary; + switch (gUnknown_0203CF1C->unk40F0) + { + + case 0: + sum->species = GetMonData(a, MON_DATA_SPECIES); + sum->species2 = GetMonData(a, MON_DATA_SPECIES2); + sum->exp = GetMonData(a, MON_DATA_EXP); + sum->level = GetMonData(a, MON_DATA_LEVEL); + sum->altability = GetMonData(a, MON_DATA_ALT_ABILITY); + sum->item = GetMonData(a, MON_DATA_HELD_ITEM); + sum->pid = GetMonData(a, MON_DATA_PERSONALITY); + sum->sanity = GetMonData(a, MON_DATA_SANITY_BIT1); + if (sum->sanity != 0) + sum->isEgg = 1; + else + sum->isEgg = GetMonData(a, MON_DATA_IS_EGG); + break; + case 1: + for (i = 0; i < 4; i++) + { + sum->moves[i] = GetMonData(a, MON_DATA_MOVE1+i); + sum->pp[i] = GetMonData(a, MON_DATA_PP1+i); + } + sum->ppBonuses = GetMonData(a, MON_DATA_PP_BONUSES); + break; + case 2: + if ((struct Pokemon*)gUnknown_0203CF1C->unk0 == gPlayerParty || gUnknown_0203CF1C->unk40BC == 2 || gUnknown_0203CF1C->unk40EF == 1) + { + sum->nature = GetNature(a); + sum->currentHP = GetMonData(a, MON_DATA_HP); + sum->maxHP = GetMonData(a, MON_DATA_MAX_HP); + sum->atk = GetMonData(a, MON_DATA_ATK); + sum->def = GetMonData(a, MON_DATA_DEF); + sum->spatk = GetMonData(a, MON_DATA_SPATK); + sum->spdef = GetMonData(a, MON_DATA_SPDEF); + sum->speed = GetMonData(a, MON_DATA_SPD); + } + else + { + sum->nature = GetNature(a); + sum->currentHP = GetMonData(a, MON_DATA_HP); + sum->maxHP = GetMonData(a, MON_DATA_MAX_HP); + sum->atk = GetMonData(a, MON_DATA_ATK2); + sum->def = GetMonData(a, MON_DATA_DEF2); + sum->spatk = GetMonData(a, MON_DATA_SPATK2); + sum->spdef = GetMonData(a, MON_DATA_SPDEF2); + sum->speed = GetMonData(a, MON_DATA_SPD2); + } + break; + case 3: + GetMonData(a, MON_DATA_OT_NAME, &sum->OTName); + ConvertInternationalString((u8*)&sum->OTName, GetMonData(a, MON_DATA_LANGUAGE)); + sum->unk7 = sub_81B205C(a); + sum->OTGender = GetMonData(a, MON_DATA_OT_GENDER); + sum->OTID = GetMonData(a, MON_DATA_OT_ID); + sum->metLocation = GetMonData(a, MON_DATA_MET_LOCATION); + sum->metLevel = GetMonData(a, MON_DATA_MET_LEVEL); + sum->metGame = GetMonData(a, MON_DATA_MET_GAME); + sum->friendship = GetMonData(a, MON_DATA_FRIENDSHIP); + break; + default: + sum->ribbons = GetMonData(a, MON_DATA_RIBBON_COUNT); + return 1; + } + gUnknown_0203CF1C->unk40F0++; + return 0; +} + +void sub_81C0348() +{ + u8 a = gUnknown_0203CF1C->unk40C0 - 2; + if (a > 1) + { + sub_81C1DA4(0, 255); + sub_81C1EFC(0, 255, 0); + } + else + { + sub_81C240C(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 0); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 0); + SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap3); + SetBgTilemapBuffer(2, &gUnknown_0203CF1C->unkTilemap2); + ChangeBgX(2, 0x10000, 1); + ClearWindowTilemap(0x13); + ClearWindowTilemap(0xD); + } + if (gUnknown_0203CF1C->summary.unk7 == 0) + sub_81C2074(0, 0xFF); + else + { + u8 b = gUnknown_0203CF1C->unk40C0 - 2; + if (b > 1) + PutWindowTilemap(0xD); + } + sub_81C2524(); + sub_81C2228(&gUnknown_0203CF1C->currentPoke); +} + +void sub_81C0434() +{ + FreeAllWindowBuffers(); + Free(gUnknown_0203CF1C); +} + +void sub_81C044C(u8 taskId) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_81C0484; +} + +void sub_81C0484(u8 taskId) +{ + if (sub_81221EC() != 1 && gPaletteFade.active == 0) + { + SetMainCallback2(gUnknown_0203CF1C->unk4); + gUnknown_0203CF20 = gUnknown_0203CF1C->unk40BE; + sub_81C4898(); + ResetSpriteData(); + FreeAllSpritePalettes(); + StopCryAndClearCrySongs(); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + if (gBattleSpritesGfx == 0) + sub_806F47C(0); + sub_81C0434(); + DestroyTask(taskId); + } +} + +void sub_81C0510(u8 taskId) +{ + if (sub_81221EC() != 1 && gPaletteFade.active == 0) + { + if (gMain.newKeys & DPAD_UP) + sub_81C0604(taskId, -1); + else if (gMain.newKeys & DPAD_DOWN) + { + sub_81C0604(taskId, 1); + } + else if ((gMain.newKeys & DPAD_LEFT) || GetLRKeysState() == 1) + sub_81C0A8C(taskId, -1); + else if ((gMain.newKeys & DPAD_RIGHT) || GetLRKeysState() == 2) + sub_81C0A8C(taskId, 1); + else if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_0203CF1C->unk40C0 != 1) + { + if (gUnknown_0203CF1C->unk40C0 == 0) + { + sub_81C48F0(); + PlaySE(5); + sub_81C044C(taskId); + } + else + { + PlaySE(5); + sub_81C0E48(taskId); + } + } + } + else if (gMain.newKeys & B_BUTTON) + { + sub_81C48F0(); + PlaySE(5); + sub_81C044C(taskId); + } + } +} + +/* void sub_81C0604(u8 taskId, s8 a) +{ + s8 r4; + s8 r4_2; + if (gUnknown_0203CF1C->unk40C3 == 0) + { + if (gUnknown_0203CF1C->unk40BD == 1) + { + if(gUnknown_0203CF1C->unk40C0 != 0) + { + r4 = 2 * (a != 2); + } + else if (a == 1) + r4 = 1; + else + r4 = 3; + r4_2 = sub_80D214C(gUnknown_0203CF1C->unk0, gUnknown_0203CF1C->unk40BE, gUnknown_0203CF1C->unk40BF, r4); + } + else if (sub_81B1250() == 1) + { + r4_2 = sub_81C09B4(a); + } + else + r4_2 = sub_81C08F8(a); + if (r4_2 != -1) + { + PlaySE(5); + if (gUnknown_0203CF1C->summary.unk7 != 0) + { + sub_81C4204(2, 1); + ClearWindowTilemap(0xD); + schedule_bg_copy_tilemap_to_vram(0); + sub_81C2074(0, 2); + } + gUnknown_0203CF1C->unk40BE = r4_2; + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_81C0704; + } + } +} */ \ No newline at end of file -- cgit v1.2.3 From 70e0a357be6cc1947f9cbbce9101dd3860eb2828 Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Wed, 20 Sep 2017 21:25:48 -0400 Subject: why are these functions bullying me --- src/pokemon_summary_screen.c | 220 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 214 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 12fd52dfb..399900a99 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -92,7 +92,10 @@ void sub_81C0A8C(u8 taskId, s8 a); void sub_81C48F0(); void sub_81C0E48(u8 taskId); void sub_81C0704(u8 taskId); - +s8 sub_81C09B4(s8 a); +s8 sub_81C08F8(s8 a); +void sub_81C4204(u8 a, u8 b); +void sub_81C20F0(u8 taskId); u8 sub_81BFB10(); u8 sub_81B1250(); @@ -165,7 +168,8 @@ struct unkSummaryStruct{ u8 unk40C8; u8 unk_filler2[0xA]; u8 unk40D3; - u8 unk_filler5[0x1B]; + u8 unk40D4; + u8 unk_filler5[0x1A]; u8 unk40EF; s16 unk40F0; u8 unk_filler4[6]; @@ -688,20 +692,23 @@ void sub_81C0510(u8 taskId) } } -/* void sub_81C0604(u8 taskId, s8 a) +#ifdef NONMATCHING +void sub_81C0604(u8 taskId, s8 a) { - s8 r4; s8 r4_2; + int r4; + + if (gUnknown_0203CF1C->unk40C3 == 0) { if (gUnknown_0203CF1C->unk40BD == 1) { if(gUnknown_0203CF1C->unk40C0 != 0) { - r4 = 2 * (a != 2); + r4 = (a ^ 1) ? 2 : 0; } else if (a == 1) - r4 = 1; + r4 = a; else r4 = 3; r4_2 = sub_80D214C(gUnknown_0203CF1C->unk0, gUnknown_0203CF1C->unk40BE, gUnknown_0203CF1C->unk40BF, r4); @@ -727,4 +734,205 @@ void sub_81C0510(u8 taskId) gTasks[taskId].func = sub_81C0704; } } +} +#else +__attribute__((naked)) +void sub_81C0604(u8 taskId, s8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + adds r4, r5, 0\n\ + ldr r1, =gUnknown_0203CF1C\n\ + ldr r3, [r1]\n\ + ldr r2, =0x000040c3\n\ + adds r0, r3, r2\n\ + ldrb r0, [r0]\n\ + adds r6, r1, 0\n\ + cmp r0, 0\n\ + bne _081C06EE\n\ + ldr r1, =0x000040bd\n\ + adds r0, r3, r1\n\ + ldrb r2, [r0]\n\ + cmp r2, 0x1\n\ + bne _081C0678\n\ + adds r1, 0x3\n\ + adds r0, r3, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _081C0654\n\ + lsls r1, r5, 24\n\ + asrs r1, 24\n\ + movs r4, 0x2\n\ + eors r1, r2\n\ + negs r0, r1\n\ + orrs r0, r1\n\ + asrs r0, 31\n\ + ands r4, r0\n\ + b _081C065C\n\ + .pool\n\ +_081C0654:\n\ + movs r4, 0x3\n\ + cmp r5, 0x1\n\ + bne _081C065C\n\ + movs r4, 0x1\n\ +_081C065C:\n\ + ldr r2, [r6]\n\ + ldr r0, [r2]\n\ + ldr r3, =0x000040be\n\ + adds r1, r2, r3\n\ + ldrb r1, [r1]\n\ + adds r3, 0x1\n\ + adds r2, r3\n\ + ldrb r2, [r2]\n\ + adds r3, r4, 0\n\ + bl sub_80D214C\n\ + b _081C0696\n\ + .pool\n\ +_081C0678:\n\ + bl sub_81B1250\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _081C068E\n\ + lsls r0, r5, 24\n\ + asrs r0, 24\n\ + bl sub_81C09B4\n\ + b _081C0696\n\ +_081C068E:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl sub_81C08F8\n\ +_081C0696:\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + beq _081C06EE\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + ldr r5, =gUnknown_0203CF1C\n\ + ldr r0, [r5]\n\ + adds r0, 0x77\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _081C06D4\n\ + movs r0, 0x2\n\ + movs r1, 0x1\n\ + bl sub_81C4204\n\ + movs r0, 0xD\n\ + bl ClearWindowTilemap\n\ + movs r0, 0\n\ + bl schedule_bg_copy_tilemap_to_vram\n\ + movs r0, 0\n\ + movs r1, 0x2\n\ + bl sub_81C2074\n\ +_081C06D4:\n\ + ldr r0, [r5]\n\ + ldr r1, =0x000040be\n\ + adds r0, r1\n\ + movs r2, 0\n\ + strb r4, [r0]\n\ + ldr r1, =gTasks\n\ + lsls r0, r7, 2\n\ + adds r0, r7\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + strh r2, [r0, 0x8]\n\ + ldr r1, =sub_81C0704\n\ + str r1, [r0]\n\ +_081C06EE:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +/* void sub_81C0704(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + StopCryAndClearCrySongs(); + data[0]++; + break; + case 1: + sub_81C4898(); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3]); + data[0]++; + break; + case 2: + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D4]); + data[0]++; + break; + case 3: + sub_81C0098(&gUnknown_0203CF1C->currentPoke); + gUnknown_0203CF1C->unk40F0 = 0; + data[0]++; + break; + case 4: + if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke)) + data[0]++; + break; + case 5: + sub_81C49E0(&gUnknown_0203CF1C->currentPoke); + data[0]++; + break; + case 6: + sub_81C4A08(&gUnknown_0203CF1C->currentPoke); + data[0]++; + break; + case 7: + if (gUnknown_0203CF1C->summary.unk7) + sub_81C2074(10, -2); + sub_81C2228(&gUnknown_0203CF1C->currentPoke); + data[1] = 0; + data[0]++; + break; + case 8: + gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &data[1]); + if (gUnknown_0203CF1C->unk40D3 != 0xFF) + { + gSprites[gUnknown_0203CF1C->unk40D3].data2 = 1; + sub_81C0E24(); + data[1] = 0; + data[0]++; + } + break; + case 9: + sub_81C4280(); + data[0]++; + break; + case 10: + sub_81C25E8(); + data[0]++; + break; + case 11: + sub_81C2D9C(gUnknown_0203CF1C->unk40C0); + sub_81C2524(); + data[0]++; + break; + case 12: + gSprites[gUnknown_0203CF1C->unk40D3].data2 = 0; + data[0]++; + break; + case 13: + if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0) + { + TaskFunc *func; + data[0] = 0; + func = &gTasks[taskId].func; + *func = sub_81C0510; + } + } } */ \ No newline at end of file -- cgit v1.2.3 From ee277bff16c6d118bf9a4af4a27f0b9619d1fb4b Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Fri, 22 Sep 2017 15:17:59 -0400 Subject: decompiled up to sub_81C0A50 --- src/pokemon_summary_screen.c | 599 ++++++++++++++++++++++++++++++------------- 1 file changed, 415 insertions(+), 184 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 399900a99..77d1d1b28 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -6,6 +6,7 @@ #include "malloc.h" #include "palette.h" #include "pokemon.h" +#include "songs.h" #include "sound.h" #include "sprite.h" #include "string_util.h" @@ -16,6 +17,7 @@ extern struct unkSummaryStruct* gUnknown_0203CF1C; extern struct BgTemplate gUnknown_0861CBB4; extern u8 gUnknown_0203CF20; extern struct MusicPlayerInfo gMPlay_BGM; +extern s8 gUnknown_0861CC1C[]; extern void sub_806F2AC(u8 a, u8 b); void sub_81C488C(u8 a); @@ -80,7 +82,7 @@ void sub_81C1DA4(u8 a, u8 b); void sub_81C1EFC(u8 a, u8 b, u8 c); void sub_81C240C(u16 a); void sub_81C2194(void* a, u8 b, u8 c); -void sub_81C2074(u8 a, u8 b); +void sub_81C2074(u16 a, s16 b); void sub_81C2524(); void sub_81C2228(struct Pokemon* poke); void sub_81C0484(u8 taskId); @@ -96,6 +98,7 @@ s8 sub_81C09B4(s8 a); s8 sub_81C08F8(s8 a); void sub_81C4204(u8 a, u8 b); void sub_81C20F0(u8 taskId); +u8 sub_81C0A50(struct Pokemon* mon); u8 sub_81BFB10(); u8 sub_81B1250(); @@ -105,7 +108,7 @@ union unkUnion{ struct BoxPokemon boxMons[6]; }; -u8 sub_80D214C(union unkUnion* a, u8 b, u8 c, int d); +u8 sub_80D214C(union unkUnion* a, u8 b, u8 c, u8 d); struct pokeSummary{ u16 species; // 0x0 @@ -462,62 +465,19 @@ u8 sub_81BFEB0() return 0; } -#ifdef NONMATCHING void sub_81C0098(struct Pokemon* poke) { if (gUnknown_0203CF1C->unk40BD == 0) { - struct Pokemon* src = &gUnknown_0203CF1C->unk0->mons[gUnknown_0203CF1C->unk40BE]; - *poke = *src; + struct Pokemon *pokeMons = gUnknown_0203CF1C->unk0->mons; + *poke = pokeMons[gUnknown_0203CF1C->unk40BE]; } else - sub_8069004(&gUnknown_0203CF1C->unk0->boxMons[gUnknown_0203CF1C->unk40BE], poke); -} -#else -__attribute__((naked)) -void sub_81C0098(struct Pokemon* poke) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - adds r3, r0, 0\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r1, [r0]\n\ - ldr r2, =0x000040bd\n\ - adds r0, r1, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - bne _081C00D0\n\ - ldr r2, [r1]\n\ - ldr r4, =0x000040be\n\ - adds r0, r1, r4\n\ - ldrb r1, [r0]\n\ - movs r0, 0x64\n\ - muls r1, r0\n\ - adds r1, r2\n\ - adds r0, r3, 0\n\ - movs r2, 0x64\n\ - bl memcpy\n\ - b _081C00E6\n\ - .pool\n\ -_081C00D0:\n\ - ldr r0, [r1]\n\ - ldr r2, =0x000040be\n\ - adds r1, r2\n\ - ldrb r2, [r1]\n\ - lsls r1, r2, 2\n\ - adds r1, r2\n\ - lsls r1, 4\n\ - adds r0, r1\n\ - adds r1, r3, 0\n\ - bl sub_8069004\n\ -_081C00E6:\n\ - pop {r4}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided\n"); + { + struct BoxPokemon *boxMons = gUnknown_0203CF1C->unk0->boxMons; + sub_8069004(&boxMons[gUnknown_0203CF1C->unk40BE], poke); + } } -#endif u8 sub_81C00F0(struct Pokemon* a) { @@ -692,36 +652,42 @@ void sub_81C0510(u8 taskId) } } -#ifdef NONMATCHING void sub_81C0604(u8 taskId, s8 a) { s8 r4_2; - int r4; - - + if (gUnknown_0203CF1C->unk40C3 == 0) { if (gUnknown_0203CF1C->unk40BD == 1) { - if(gUnknown_0203CF1C->unk40C0 != 0) + if (gUnknown_0203CF1C->unk40C0 != 0) { - r4 = (a ^ 1) ? 2 : 0; + if (a == 1) + a = 0; + else + a = 2; } - else if (a == 1) - r4 = a; else - r4 = 3; - r4_2 = sub_80D214C(gUnknown_0203CF1C->unk0, gUnknown_0203CF1C->unk40BE, gUnknown_0203CF1C->unk40BF, r4); + { + if (a == 1) + a = 1; + else + a = 3; + } + r4_2 = sub_80D214C(gUnknown_0203CF1C->unk0, gUnknown_0203CF1C->unk40BE, gUnknown_0203CF1C->unk40BF, a); } else if (sub_81B1250() == 1) { r4_2 = sub_81C09B4(a); } else + { r4_2 = sub_81C08F8(a); + } + if (r4_2 != -1) { - PlaySE(5); + PlaySE(SE_SELECT); if (gUnknown_0203CF1C->summary.unk7 != 0) { sub_81C4204(2, 1); @@ -735,128 +701,9 @@ void sub_81C0604(u8 taskId, s8 a) } } } -#else -__attribute__((naked)) -void sub_81C0604(u8 taskId, s8 a) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - lsls r1, 24\n\ - lsrs r5, r1, 24\n\ - adds r4, r5, 0\n\ - ldr r1, =gUnknown_0203CF1C\n\ - ldr r3, [r1]\n\ - ldr r2, =0x000040c3\n\ - adds r0, r3, r2\n\ - ldrb r0, [r0]\n\ - adds r6, r1, 0\n\ - cmp r0, 0\n\ - bne _081C06EE\n\ - ldr r1, =0x000040bd\n\ - adds r0, r3, r1\n\ - ldrb r2, [r0]\n\ - cmp r2, 0x1\n\ - bne _081C0678\n\ - adds r1, 0x3\n\ - adds r0, r3, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _081C0654\n\ - lsls r1, r5, 24\n\ - asrs r1, 24\n\ - movs r4, 0x2\n\ - eors r1, r2\n\ - negs r0, r1\n\ - orrs r0, r1\n\ - asrs r0, 31\n\ - ands r4, r0\n\ - b _081C065C\n\ - .pool\n\ -_081C0654:\n\ - movs r4, 0x3\n\ - cmp r5, 0x1\n\ - bne _081C065C\n\ - movs r4, 0x1\n\ -_081C065C:\n\ - ldr r2, [r6]\n\ - ldr r0, [r2]\n\ - ldr r3, =0x000040be\n\ - adds r1, r2, r3\n\ - ldrb r1, [r1]\n\ - adds r3, 0x1\n\ - adds r2, r3\n\ - ldrb r2, [r2]\n\ - adds r3, r4, 0\n\ - bl sub_80D214C\n\ - b _081C0696\n\ - .pool\n\ -_081C0678:\n\ - bl sub_81B1250\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0x1\n\ - bne _081C068E\n\ - lsls r0, r5, 24\n\ - asrs r0, 24\n\ - bl sub_81C09B4\n\ - b _081C0696\n\ -_081C068E:\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - bl sub_81C08F8\n\ -_081C0696:\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - cmp r0, r1\n\ - beq _081C06EE\n\ - movs r0, 0x5\n\ - bl PlaySE\n\ - ldr r5, =gUnknown_0203CF1C\n\ - ldr r0, [r5]\n\ - adds r0, 0x77\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _081C06D4\n\ - movs r0, 0x2\n\ - movs r1, 0x1\n\ - bl sub_81C4204\n\ - movs r0, 0xD\n\ - bl ClearWindowTilemap\n\ - movs r0, 0\n\ - bl schedule_bg_copy_tilemap_to_vram\n\ - movs r0, 0\n\ - movs r1, 0x2\n\ - bl sub_81C2074\n\ -_081C06D4:\n\ - ldr r0, [r5]\n\ - ldr r1, =0x000040be\n\ - adds r0, r1\n\ - movs r2, 0\n\ - strb r4, [r0]\n\ - ldr r1, =gTasks\n\ - lsls r0, r7, 2\n\ - adds r0, r7\n\ - lsls r0, 3\n\ - adds r0, r1\n\ - strh r2, [r0, 0x8]\n\ - ldr r1, =sub_81C0704\n\ - str r1, [r0]\n\ -_081C06EE:\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided\n"); -} -#endif -/* void sub_81C0704(u8 taskId) +#ifdef NONMATCHING +void sub_81C0704(u8 taskId) { s16 *data = gTasks[taskId].data; @@ -935,4 +782,388 @@ _081C06EE:\n\ *func = sub_81C0510; } } -} */ \ No newline at end of file +} +#else +__attribute__((naked)) +void sub_81C0704(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, r0, 2\n\ + adds r1, r0\n\ + lsls r4, r1, 3\n\ + ldr r6, =gTasks + 0x8\n\ + adds r5, r4, r6\n\ + movs r1, 0\n\ + ldrsh r0, [r5, r1]\n\ + cmp r0, 0xC\n\ + bls _081C071E\n\ + b _081C08BC\n\ +_081C071E:\n\ + lsls r0, 2\n\ + ldr r1, =_081C0730\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .pool\n\ + .align 2, 0\n\ +_081C0730:\n\ + .4byte _081C0764\n\ + .4byte _081C076A\n\ + .4byte _081C0780\n\ + .4byte _081C07A8\n\ + .4byte _081C07C8\n\ + .4byte _081C07E0\n\ + .4byte _081C07F0\n\ + .4byte _081C0800\n\ + .4byte _081C0828\n\ + .4byte _081C086C\n\ + .4byte _081C0872\n\ + .4byte _081C0878\n\ + .4byte _081C0894\n\ +_081C0764:\n\ + bl StopCryAndClearCrySongs\n\ + b _081C08EC\n\ +_081C076A:\n\ + bl sub_81C4898\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + ldr r1, =0x000040d3\n\ + b _081C0786\n\ + .pool\n\ +_081C0780:\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + ldr r1, =0x000040d4\n\ +_081C0786:\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, =gSprites\n\ + adds r0, r1\n\ + bl DestroySpriteAndFreeResources\n\ + b _081C08EC\n\ + .pool\n\ +_081C07A8:\n\ + ldr r4, =gUnknown_0203CF1C\n\ + ldr r0, [r4]\n\ + adds r0, 0xC\n\ + bl sub_81C0098\n\ + ldr r0, [r4]\n\ + ldr r1, =0x000040f0\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strh r1, [r0]\n\ + b _081C08EC\n\ + .pool\n\ +_081C07C8:\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + adds r0, 0xC\n\ + bl sub_81C00F0\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _081C07DA\n\ + b _081C08F2\n\ +_081C07DA:\n\ + b _081C08EC\n\ + .pool\n\ +_081C07E0:\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + adds r0, 0xC\n\ + bl sub_81C49E0\n\ + b _081C08EC\n\ + .pool\n\ +_081C07F0:\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + adds r0, 0xC\n\ + bl sub_81C4A08\n\ + b _081C08EC\n\ + .pool\n\ +_081C0800:\n\ + ldr r4, =gUnknown_0203CF1C\n\ + ldr r0, [r4]\n\ + adds r0, 0x77\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _081C0816\n\ + movs r1, 0x2\n\ + negs r1, r1\n\ + movs r0, 0xA\n\ + bl sub_81C2074\n\ +_081C0816:\n\ + ldr r0, [r4]\n\ + adds r0, 0xC\n\ + bl sub_81C2228\n\ + movs r0, 0\n\ + strh r0, [r5, 0x2]\n\ + b _081C08EC\n\ + .pool\n\ +_081C0828:\n\ + ldr r4, =gUnknown_0203CF1C\n\ + ldr r0, [r4]\n\ + adds r0, 0xC\n\ + adds r1, r5, 0x2\n\ + bl sub_81C45F4\n\ + ldr r1, [r4]\n\ + ldr r2, =0x000040d3\n\ + adds r1, r2\n\ + strb r0, [r1]\n\ + ldr r0, [r4]\n\ + adds r1, r0, r2\n\ + ldrb r0, [r1]\n\ + cmp r0, 0xFF\n\ + beq _081C08F2\n\ + ldr r2, =gSprites\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x32]\n\ + bl sub_81C0E24\n\ + movs r0, 0\n\ + strh r0, [r5, 0x2]\n\ + b _081C08EC\n\ + .pool\n\ +_081C086C:\n\ + bl sub_81C4280\n\ + b _081C08EC\n\ +_081C0872:\n\ + bl sub_81C25E8\n\ + b _081C08EC\n\ +_081C0878:\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + ldr r1, =0x000040c0\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + bl sub_81C2D9C\n\ + bl sub_81C2524\n\ + b _081C08EC\n\ + .pool\n\ +_081C0894:\n\ + ldr r2, =gSprites\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + ldr r1, =0x000040d3\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + movs r1, 0\n\ + strh r1, [r0, 0x32]\n\ + b _081C08EC\n\ + .pool\n\ +_081C08BC:\n\ + bl sub_81221EC\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + bne _081C08F2\n\ + ldr r0, =sub_81C20F0\n\ + bl FuncIsActiveTask\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + bne _081C08F2\n\ + strh r0, [r5]\n\ + adds r0, r6, 0\n\ + subs r0, 0x8\n\ + adds r0, r4, r0\n\ + ldr r1, =sub_81C0510\n\ + str r1, [r0]\n\ + b _081C08F2\n\ + .pool\n\ +_081C08EC:\n\ + ldrh r0, [r5]\n\ + adds r0, 0x1\n\ + strh r0, [r5]\n\ +_081C08F2:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +s8 sub_81C08F8(s8 a) +{ + union unkUnion* r7 = gUnknown_0203CF1C->unk0; + if (gUnknown_0203CF1C->unk40C0 == 0) + { + if (a != -1 || gUnknown_0203CF1C->unk40BE != 0) + { + if (a != 1 || gUnknown_0203CF1C->unk40BE < gUnknown_0203CF1C->unk40BF) + { + return gUnknown_0203CF1C->unk40BE + a; + } + } + return -1; + } + else + { + s8 r5r4 = gUnknown_0203CF1C->unk40BE; + while(1) + { + r5r4 += a; + if (r5r4 < 0 || r5r4 > gUnknown_0203CF1C->unk40BF) + return -1; + else if (GetMonData(&r7->mons[r5r4], MON_DATA_IS_EGG) == 0) + return r5r4; + } + } +} +#else +__attribute__((naked)) +s8 sub_81C08F8(s8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + ldr r1, =gUnknown_0203CF1C\n\ + ldr r2, [r1]\n\ + ldr r7, [r2]\n\ + ldr r3, =0x000040c0\n\ + adds r0, r2, r3\n\ + ldrb r0, [r0]\n\ + adds r5, r1, 0\n\ + cmp r0, 0\n\ + bne _081C0960\n\ + lsls r0, r4, 24\n\ + asrs r3, r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + adds r6, r0, 0\n\ + cmp r3, r1\n\ + bne _081C0928\n\ + ldr r1, =0x000040be\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + beq _081C0988\n\ +_081C0928:\n\ + asrs r0, r6, 24\n\ + cmp r0, 0x1\n\ + bne _081C0940\n\ + ldr r0, [r5]\n\ + ldr r2, =0x000040be\n\ + adds r1, r0, r2\n\ + ldr r3, =0x000040bf\n\ + adds r0, r3\n\ + ldrb r1, [r1]\n\ + ldrb r0, [r0]\n\ + cmp r1, r0\n\ + bcs _081C0988\n\ +_081C0940:\n\ + ldr r0, [r5]\n\ + ldr r1, =0x000040be\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + adds r0, r4\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ + b _081C09AE\n\ + .pool\n\ +_081C0960:\n\ + ldr r3, =0x000040be\n\ + adds r0, r2, r3\n\ + ldrb r5, [r0]\n\ + lsls r6, r4, 24\n\ +_081C0968:\n\ + lsls r0, r5, 24\n\ + asrs r0, 24\n\ + asrs r1, r6, 24\n\ + adds r0, r1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + asrs r4, r0, 24\n\ + cmp r4, 0\n\ + blt _081C0988\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + ldr r1, =0x000040bf\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r4, r0\n\ + ble _081C099C\n\ +_081C0988:\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _081C09AE\n\ + .pool\n\ +_081C099C:\n\ + movs r0, 0x64\n\ + muls r0, r4\n\ + adds r0, r7, r0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _081C0968\n\ + adds r0, r4, 0\n\ +_081C09AE:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif + +s8 sub_81C09B4(s8 a) +{ + union unkUnion* r8 = gUnknown_0203CF1C->unk0; + s8 r5 = 0; + u8 i = 0; + if (gUnknown_0861CC1C[0] != gUnknown_0203CF1C->unk40BE) + { + while(1) + { + i += 1; + if (i > 5) + break; + if (gUnknown_0861CC1C[i] == gUnknown_0203CF1C->unk40BE) + { + r5 = i; + break; + } + } + } + while(1) + { + int b; + s8* c = &gUnknown_0861CC1C[0]; + r5 += a; + if ((u8)(r5) > 5) + { + return -1; + } + else + { + b = c[r5]; + if (sub_81C0A50(&r8->mons[c[r5]]) == 1) + return b; + } + } +} + +u8 sub_81C0A50(struct Pokemon* mon) +{ + if (GetMonData(mon, MON_DATA_SPECIES) == 0) + { + return 0; + } + else if (gUnknown_0203CF1C->unk40BE != 0 || GetMonData(mon, MON_DATA_IS_EGG) == 0) + return 1; + else + return 0; +} \ No newline at end of file -- cgit v1.2.3 From 3d16b884b93323d2329bd9d805e3ac958311ef0a Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Fri, 22 Sep 2017 18:28:18 -0400 Subject: updated branch with fix --- src/pokemon_summary_screen.c | 347 ++++++++----------------------------------- 1 file changed, 62 insertions(+), 285 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 77d1d1b28..d555b8834 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -99,6 +99,8 @@ s8 sub_81C08F8(s8 a); void sub_81C4204(u8 a, u8 b); void sub_81C20F0(u8 taskId); u8 sub_81C0A50(struct Pokemon* mon); +void sub_81C49E0(); +void sub_81C0E24(); u8 sub_81BFB10(); u8 sub_81B1250(); @@ -702,298 +704,73 @@ void sub_81C0604(u8 taskId, s8 a) } } -#ifdef NONMATCHING void sub_81C0704(u8 taskId) { s16 *data = gTasks[taskId].data; - + switch (data[0]) { - case 0: - StopCryAndClearCrySongs(); - data[0]++; - break; - case 1: - sub_81C4898(); - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3]); - data[0]++; - break; - case 2: - DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D4]); - data[0]++; - break; - case 3: - sub_81C0098(&gUnknown_0203CF1C->currentPoke); - gUnknown_0203CF1C->unk40F0 = 0; - data[0]++; - break; - case 4: - if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke)) - data[0]++; - break; - case 5: - sub_81C49E0(&gUnknown_0203CF1C->currentPoke); - data[0]++; - break; - case 6: - sub_81C4A08(&gUnknown_0203CF1C->currentPoke); - data[0]++; - break; - case 7: - if (gUnknown_0203CF1C->summary.unk7) - sub_81C2074(10, -2); - sub_81C2228(&gUnknown_0203CF1C->currentPoke); - data[1] = 0; - data[0]++; - break; - case 8: - gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &data[1]); - if (gUnknown_0203CF1C->unk40D3 != 0xFF) - { - gSprites[gUnknown_0203CF1C->unk40D3].data2 = 1; - sub_81C0E24(); - data[1] = 0; - data[0]++; - } - break; - case 9: - sub_81C4280(); - data[0]++; - break; - case 10: - sub_81C25E8(); - data[0]++; - break; - case 11: - sub_81C2D9C(gUnknown_0203CF1C->unk40C0); - sub_81C2524(); - data[0]++; - break; - case 12: - gSprites[gUnknown_0203CF1C->unk40D3].data2 = 0; - data[0]++; - break; - case 13: - if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0) - { - TaskFunc *func; - data[0] = 0; - func = &gTasks[taskId].func; - *func = sub_81C0510; - } + case 0: + StopCryAndClearCrySongs(); + break; + case 1: + sub_81C4898(); + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D3]); + break; + case 2: + DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D4]); + break; + case 3: + sub_81C0098(&gUnknown_0203CF1C->currentPoke); + gUnknown_0203CF1C->unk40F0 = 0; + break; + case 4: + if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke) == 0) + return; + break; + case 5: + sub_81C49E0(&gUnknown_0203CF1C->currentPoke); + break; + case 6: + sub_81C4A08(&gUnknown_0203CF1C->currentPoke); + break; + case 7: + if (gUnknown_0203CF1C->summary.unk7) + sub_81C2074(10, -2); + sub_81C2228(&gUnknown_0203CF1C->currentPoke); + data[1] = 0; + break; + case 8: + gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &data[1]); + if (gUnknown_0203CF1C->unk40D3 == 0xFF) + return; + gSprites[gUnknown_0203CF1C->unk40D3].data2 = 1; + sub_81C0E24(); + data[1] = 0; + break; + case 9: + sub_81C4280(); + break; + case 10: + sub_81C25E8(); + break; + case 11: + sub_81C2D9C(gUnknown_0203CF1C->unk40C0); + sub_81C2524(); + break; + case 12: + gSprites[gUnknown_0203CF1C->unk40D3].data2 = 0; + break; + default: + if (sub_81221EC() == 0 && FuncIsActiveTask(sub_81C20F0) == 0) + { + data[0] = 0; + gTasks[taskId].func = sub_81C0510; + } + return; } + data[0]++; } -#else -__attribute__((naked)) -void sub_81C0704(u8 taskId) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 2\n\ - adds r1, r0\n\ - lsls r4, r1, 3\n\ - ldr r6, =gTasks + 0x8\n\ - adds r5, r4, r6\n\ - movs r1, 0\n\ - ldrsh r0, [r5, r1]\n\ - cmp r0, 0xC\n\ - bls _081C071E\n\ - b _081C08BC\n\ -_081C071E:\n\ - lsls r0, 2\n\ - ldr r1, =_081C0730\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - mov pc, r0\n\ - .pool\n\ - .align 2, 0\n\ -_081C0730:\n\ - .4byte _081C0764\n\ - .4byte _081C076A\n\ - .4byte _081C0780\n\ - .4byte _081C07A8\n\ - .4byte _081C07C8\n\ - .4byte _081C07E0\n\ - .4byte _081C07F0\n\ - .4byte _081C0800\n\ - .4byte _081C0828\n\ - .4byte _081C086C\n\ - .4byte _081C0872\n\ - .4byte _081C0878\n\ - .4byte _081C0894\n\ -_081C0764:\n\ - bl StopCryAndClearCrySongs\n\ - b _081C08EC\n\ -_081C076A:\n\ - bl sub_81C4898\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - ldr r1, =0x000040d3\n\ - b _081C0786\n\ - .pool\n\ -_081C0780:\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - ldr r1, =0x000040d4\n\ -_081C0786:\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - ldr r1, =gSprites\n\ - adds r0, r1\n\ - bl DestroySpriteAndFreeResources\n\ - b _081C08EC\n\ - .pool\n\ -_081C07A8:\n\ - ldr r4, =gUnknown_0203CF1C\n\ - ldr r0, [r4]\n\ - adds r0, 0xC\n\ - bl sub_81C0098\n\ - ldr r0, [r4]\n\ - ldr r1, =0x000040f0\n\ - adds r0, r1\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - b _081C08EC\n\ - .pool\n\ -_081C07C8:\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - adds r0, 0xC\n\ - bl sub_81C00F0\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _081C07DA\n\ - b _081C08F2\n\ -_081C07DA:\n\ - b _081C08EC\n\ - .pool\n\ -_081C07E0:\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - adds r0, 0xC\n\ - bl sub_81C49E0\n\ - b _081C08EC\n\ - .pool\n\ -_081C07F0:\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - adds r0, 0xC\n\ - bl sub_81C4A08\n\ - b _081C08EC\n\ - .pool\n\ -_081C0800:\n\ - ldr r4, =gUnknown_0203CF1C\n\ - ldr r0, [r4]\n\ - adds r0, 0x77\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _081C0816\n\ - movs r1, 0x2\n\ - negs r1, r1\n\ - movs r0, 0xA\n\ - bl sub_81C2074\n\ -_081C0816:\n\ - ldr r0, [r4]\n\ - adds r0, 0xC\n\ - bl sub_81C2228\n\ - movs r0, 0\n\ - strh r0, [r5, 0x2]\n\ - b _081C08EC\n\ - .pool\n\ -_081C0828:\n\ - ldr r4, =gUnknown_0203CF1C\n\ - ldr r0, [r4]\n\ - adds r0, 0xC\n\ - adds r1, r5, 0x2\n\ - bl sub_81C45F4\n\ - ldr r1, [r4]\n\ - ldr r2, =0x000040d3\n\ - adds r1, r2\n\ - strb r0, [r1]\n\ - ldr r0, [r4]\n\ - adds r1, r0, r2\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFF\n\ - beq _081C08F2\n\ - ldr r2, =gSprites\n\ - adds r1, r0, 0\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0x1\n\ - strh r1, [r0, 0x32]\n\ - bl sub_81C0E24\n\ - movs r0, 0\n\ - strh r0, [r5, 0x2]\n\ - b _081C08EC\n\ - .pool\n\ -_081C086C:\n\ - bl sub_81C4280\n\ - b _081C08EC\n\ -_081C0872:\n\ - bl sub_81C25E8\n\ - b _081C08EC\n\ -_081C0878:\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - ldr r1, =0x000040c0\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - bl sub_81C2D9C\n\ - bl sub_81C2524\n\ - b _081C08EC\n\ - .pool\n\ -_081C0894:\n\ - ldr r2, =gSprites\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - ldr r1, =0x000040d3\n\ - adds r0, r1\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 4\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - movs r1, 0\n\ - strh r1, [r0, 0x32]\n\ - b _081C08EC\n\ - .pool\n\ -_081C08BC:\n\ - bl sub_81221EC\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _081C08F2\n\ - ldr r0, =sub_81C20F0\n\ - bl FuncIsActiveTask\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - cmp r0, 0\n\ - bne _081C08F2\n\ - strh r0, [r5]\n\ - adds r0, r6, 0\n\ - subs r0, 0x8\n\ - adds r0, r4, r0\n\ - ldr r1, =sub_81C0510\n\ - str r1, [r0]\n\ - b _081C08F2\n\ - .pool\n\ -_081C08EC:\n\ - ldrh r0, [r5]\n\ - adds r0, 0x1\n\ - strh r0, [r5]\n\ -_081C08F2:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .syntax divided\n"); -} -#endif #ifdef NONMATCHING s8 sub_81C08F8(s8 a) -- cgit v1.2.3 From 40eb03542bf2eec8944249474b880854691da6ac Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Sat, 23 Sep 2017 20:23:55 -0400 Subject: decompiled up to sub_81C1040 --- src/pokemon_summary_screen.c | 432 ++++++++++++++++++++++++++++--------------- 1 file changed, 288 insertions(+), 144 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index d555b8834..9c4647cf0 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -78,8 +78,8 @@ void sub_81C0510(u8 taskId); void sub_81C171C(u8 taskId); void sub_8121E10(); u8 sub_81B205C(struct Pokemon* a); -void sub_81C1DA4(u8 a, u8 b); -void sub_81C1EFC(u8 a, u8 b, u8 c); +void sub_81C1DA4(u8 a, s16 b); +void sub_81C1EFC(u8 a, s16 b, u16 c); void sub_81C240C(u16 a); void sub_81C2194(void* a, u8 b, u8 c); void sub_81C2074(u16 a, s16 b); @@ -101,6 +101,26 @@ void sub_81C20F0(u8 taskId); u8 sub_81C0A50(struct Pokemon* mon); void sub_81C49E0(); void sub_81C0E24(); +void sub_81C2C38(); +void sub_81C0B8C(u8 taskId); +void sub_81C0CC4(u8 taskId); +void sub_81C2DE4(u8 a); +void sub_81C424C(); +void sub_81C0C68(u8 taskId); +void sub_81C0D44(u8 taskId); +void sub_81C22CC(struct Pokemon* mon); +void sub_81C0F44(u8 taskId); +void sub_81C3E9C(u16 a); +void sub_81C3F44(); +void sub_81C44F0(); +void sub_81C4AF8(u8 a); +void sub_81C1070(s16* a, s8 b, u8* c); +void sub_81C11F4(u8 a); +void sub_81C129C(u8 a); +u8 sub_81C1040(); + + +void SetBgAttribute(u8 bg, u8 attributeId, u8 value); u8 sub_81BFB10(); u8 sub_81B1250(); @@ -110,6 +130,8 @@ union unkUnion{ struct BoxPokemon boxMons[6]; }; + + u8 sub_80D214C(union unkUnion* a, u8 b, u8 c, u8 d); struct pokeSummary{ @@ -167,14 +189,23 @@ struct unkSummaryStruct{ u8 unk40C1; u8 unk40C2; u8 unk40C3; - u16 unk40C4; - u8 unk40C6; - u8 unk_filler3; + union +{ + struct + { + u16 unk40C4; + u8 unk40C6; + u8 unkfiller3; + } fooFiller; + u32 loadThis; +} unionThing; u8 unk40C8; - u8 unk_filler2[0xA]; + u8 unk40C9; + u8 unk_filler2[0x9]; u8 unk40D3; u8 unk40D4; - u8 unk_filler5[0x1A]; + u8 unk40D5; + u8 unk_filler5[0x19]; u8 unk40EF; s16 unk40F0; u8 unk_filler4[6]; @@ -222,7 +253,7 @@ void sub_81BF8EC(u8 a, void* b, u8 c, u8 d, void* e) void sub_81BFA38(void* a, u8 b, u8 c, void* d, u16 e) { sub_81BF8EC(3, a, b, c, d); - gUnknown_0203CF1C->unk40C4 = e; + gUnknown_0203CF1C->unionThing.fooFiller.unk40C4 = e; } void sub_81BFA80(u8 a, void* b, u8 c, u8 d, void* e) @@ -563,7 +594,7 @@ void sub_81C0348() } else { - sub_81C240C(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]); + sub_81C240C(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unionThing.fooFiller.unk40C6]); sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 0); sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 0); SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap3); @@ -772,164 +803,58 @@ void sub_81C0704(u8 taskId) data[0]++; } -#ifdef NONMATCHING s8 sub_81C08F8(s8 a) { - union unkUnion* r7 = gUnknown_0203CF1C->unk0; + struct Pokemon *mons = gUnknown_0203CF1C->unk0->mons; + if (gUnknown_0203CF1C->unk40C0 == 0) { - if (a != -1 || gUnknown_0203CF1C->unk40BE != 0) - { - if (a != 1 || gUnknown_0203CF1C->unk40BE < gUnknown_0203CF1C->unk40BF) - { - return gUnknown_0203CF1C->unk40BE + a; - } - } - return -1; + if (a == -1 && gUnknown_0203CF1C->unk40BE == 0) + return -1; + if (a == 1 && gUnknown_0203CF1C->unk40BE >= gUnknown_0203CF1C->unk40BF) + return -1; + return gUnknown_0203CF1C->unk40BE + a; } else { - s8 r5r4 = gUnknown_0203CF1C->unk40BE; - while(1) + s8 index = gUnknown_0203CF1C->unk40BE; + + do { - r5r4 += a; - if (r5r4 < 0 || r5r4 > gUnknown_0203CF1C->unk40BF) + index += a; + if (index < 0 || index > gUnknown_0203CF1C->unk40BF) return -1; - else if (GetMonData(&r7->mons[r5r4], MON_DATA_IS_EGG) == 0) - return r5r4; - } + } while (GetMonData(&mons[index], MON_DATA_IS_EGG) != 0); + return index; } } -#else -__attribute__((naked)) -s8 sub_81C08F8(s8 a) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - ldr r1, =gUnknown_0203CF1C\n\ - ldr r2, [r1]\n\ - ldr r7, [r2]\n\ - ldr r3, =0x000040c0\n\ - adds r0, r2, r3\n\ - ldrb r0, [r0]\n\ - adds r5, r1, 0\n\ - cmp r0, 0\n\ - bne _081C0960\n\ - lsls r0, r4, 24\n\ - asrs r3, r0, 24\n\ - movs r1, 0x1\n\ - negs r1, r1\n\ - adds r6, r0, 0\n\ - cmp r3, r1\n\ - bne _081C0928\n\ - ldr r1, =0x000040be\n\ - adds r0, r2, r1\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _081C0988\n\ -_081C0928:\n\ - asrs r0, r6, 24\n\ - cmp r0, 0x1\n\ - bne _081C0940\n\ - ldr r0, [r5]\n\ - ldr r2, =0x000040be\n\ - adds r1, r0, r2\n\ - ldr r3, =0x000040bf\n\ - adds r0, r3\n\ - ldrb r1, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r1, r0\n\ - bcs _081C0988\n\ -_081C0940:\n\ - ldr r0, [r5]\n\ - ldr r1, =0x000040be\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - adds r0, r4\n\ - lsls r0, 24\n\ - asrs r0, 24\n\ - b _081C09AE\n\ - .pool\n\ -_081C0960:\n\ - ldr r3, =0x000040be\n\ - adds r0, r2, r3\n\ - ldrb r5, [r0]\n\ - lsls r6, r4, 24\n\ -_081C0968:\n\ - lsls r0, r5, 24\n\ - asrs r0, 24\n\ - asrs r1, r6, 24\n\ - adds r0, r1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - asrs r4, r0, 24\n\ - cmp r4, 0\n\ - blt _081C0988\n\ - ldr r0, =gUnknown_0203CF1C\n\ - ldr r0, [r0]\n\ - ldr r1, =0x000040bf\n\ - adds r0, r1\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - ble _081C099C\n\ -_081C0988:\n\ - movs r0, 0x1\n\ - negs r0, r0\n\ - b _081C09AE\n\ - .pool\n\ -_081C099C:\n\ - movs r0, 0x64\n\ - muls r0, r4\n\ - adds r0, r7, r0\n\ - movs r1, 0x2D\n\ - bl GetMonData\n\ - cmp r0, 0\n\ - bne _081C0968\n\ - adds r0, r4, 0\n\ -_081C09AE:\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .syntax divided\n"); -} -#endif s8 sub_81C09B4(s8 a) { - union unkUnion* r8 = gUnknown_0203CF1C->unk0; + struct Pokemon *mons = gUnknown_0203CF1C->unk0->mons; s8 r5 = 0; - u8 i = 0; - if (gUnknown_0861CC1C[0] != gUnknown_0203CF1C->unk40BE) + u8 i; + + for (i = 0; i < 6; i++) { - while(1) + if (gUnknown_0861CC1C[i] == gUnknown_0203CF1C->unk40BE) { - i += 1; - if (i > 5) - break; - if (gUnknown_0861CC1C[i] == gUnknown_0203CF1C->unk40BE) - { - r5 = i; - break; - } + r5 = i; + break; } } - while(1) + + while (1) { int b; s8* c = &gUnknown_0861CC1C[0]; + r5 += a; - if ((u8)(r5) > 5) - { + if (r5 < 0 || r5 >= 6) return -1; - } - else - { - b = c[r5]; - if (sub_81C0A50(&r8->mons[c[r5]]) == 1) - return b; - } + b = c[r5]; + if (sub_81C0A50(&mons[b]) == 1) + return b; } } @@ -943,4 +868,223 @@ u8 sub_81C0A50(struct Pokemon* mon) return 1; else return 0; -} \ No newline at end of file +} + +void sub_81C0A8C(u8 taskId, s8 b) +{ + struct pokeSummary *summary = &gUnknown_0203CF1C->summary; + s16 *data = gTasks[taskId].data; + + if (summary->isEgg) + return; + if (b == -1 && gUnknown_0203CF1C->unk40C0 == gUnknown_0203CF1C->unk40C1) + return; + if (b == 1 && gUnknown_0203CF1C->unk40C0 == gUnknown_0203CF1C->unk40C2) + return; + PlaySE(SE_SELECT); + sub_81C2C38(gUnknown_0203CF1C->unk40C0); + gUnknown_0203CF1C->unk40C0 += b; + data[0] = 0; + if (b == 1) + SetTaskFuncWithFollowupFunc(taskId, sub_81C0B8C, gTasks[taskId].func); + else + SetTaskFuncWithFollowupFunc(taskId, sub_81C0CC4, gTasks[taskId].func); + sub_81C2DE4(gUnknown_0203CF1C->unk40C0); + sub_81C424C(); +} + +void sub_81C0B8C(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (data[0] == 0) + { + if (gUnknown_0203CF1C->unk40C9 == 0) + { + data[1] = 1; + SetBgAttribute(1, 7, 1); + SetBgAttribute(2, 7, 2); + schedule_bg_copy_tilemap_to_vram(1); + } + else + { + data[1] = 2; + SetBgAttribute(2, 7, 1); + SetBgAttribute(1, 7, 2); + schedule_bg_copy_tilemap_to_vram(2); + } + ChangeBgX(data[1], 0, 0); + SetBgTilemapBuffer(data[1], (u8*)gUnknown_0203CF1C + ((gUnknown_0203CF1C->unk40C0 << 12) + 0xBC)); + ShowBg(1); + ShowBg(2); + } + ChangeBgX(data[1], 0x2000, 1); + data[0] += 32; + if (data[0] > 0xFF) + { + gTasks[taskId].func = sub_81C0C68; + } +} + +void sub_81C0C68(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + gUnknown_0203CF1C->unk40C9 ^= 1; + data[1] = 0; + data[0] = 0; + sub_81C1BA0(); + sub_81C2AFC(gUnknown_0203CF1C->unk40C0); + sub_81C4280(); + sub_81C0E24(); + SwitchTaskToFollowupFunc(taskId); +} + +void sub_81C0CC4(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (data[0] == 0) + { + if (gUnknown_0203CF1C->unk40C9 == 0) + data[1] = 2; + else + data[1] = 1; + ChangeBgX(data[1], 0x10000, 0); + } + ChangeBgX(data[1], 0x2000, 2); + data[0] += 32; + if (data[0] > 0xFF) + gTasks[taskId].func = sub_81C0D44; +} + +void sub_81C0D44(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (gUnknown_0203CF1C->unk40C9 == 0) + { + SetBgAttribute(1, 7, 1); + SetBgAttribute(2, 7, 2); + schedule_bg_copy_tilemap_to_vram(2); + } + else + { + SetBgAttribute(2, 7, 1); + SetBgAttribute(1, 7, 2); + schedule_bg_copy_tilemap_to_vram(1); + } + if (gUnknown_0203CF1C->unk40C0 > 1) + { + SetBgTilemapBuffer(data[1], (u8*)gUnknown_0203CF1C + ((gUnknown_0203CF1C->unk40C0 << 12) + 0xFFFFF0BC)); + ChangeBgX(data[1], 0x10000, 0); + } + ShowBg(1); + ShowBg(2); + gUnknown_0203CF1C->unk40C9 ^= 1; + data[1] = 0; + data[0] = 0; + sub_81C1BA0(); + sub_81C2AFC(gUnknown_0203CF1C->unk40C0); + sub_81C4280(); + sub_81C0E24(); + SwitchTaskToFollowupFunc(taskId); +} + +void sub_81C0E24() +{ + if (gUnknown_0203CF1C->unk40C0 == 1) + sub_81C22CC(&gUnknown_0203CF1C->currentPoke); +} + +void sub_81C0E48(u8 taskId) +{ + u16 move; + gUnknown_0203CF1C->unionThing.fooFiller.unk40C6 = 0; + move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unionThing.fooFiller.unk40C6]; + ClearWindowTilemap(0x13); + if (gSprites[gUnknown_0203CF1C->unk40D5].invisible == 0) + ClearWindowTilemap(0xD); + sub_81C1DA4(9, -3); + sub_81C1EFC(9, -3, move); + if (gUnknown_0203CF1C->unk40C8 == 0) + { + ClearWindowTilemap(5); + PutWindowTilemap(6); + } + sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 0); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 0); + sub_81C3E9C(move); + sub_81C3F44(); + sub_81C44F0(); + schedule_bg_copy_tilemap_to_vram(0); + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); + sub_81C4AF8(8); + gTasks[taskId].func = sub_81C0F44; +} + +void sub_81C0F44(u8 taskId) +{ + u8 id = taskId; + s16 *data = gTasks[taskId].data; + if (sub_81221EC() != 1) + { + if (gMain.newKeys & DPAD_UP) + { + data[0] = 4; + sub_81C1070(data, -1, &gUnknown_0203CF1C->unionThing.fooFiller.unk40C6); + } + else if (gMain.newKeys & DPAD_DOWN) + { + data[0] = 4; + sub_81C1070(data, 1, &gUnknown_0203CF1C->unionThing.fooFiller.unk40C6); + } + else if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_0203CF1C->unk40C8 == 1 || ((int)(gUnknown_0203CF1C->unionThing.loadThis & 0xFFFFFF) == 0x40000)) + { + PlaySE(SE_SELECT); + sub_81C11F4(taskId); + } + else if (sub_81C1040() == 1) + { + PlaySE(SE_SELECT); + sub_81C129C(taskId); + } + else + PlaySE(0x20); + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_81C11F4(id); + } + } +} + +u8 sub_81C1040() +{ + u8 i; + for (i = 1; i <= 3; i++) + { + if (gUnknown_0203CF1C->summary.moves[i] != 0) + return 1; + } + return 0; +} + +/* void sub_81C1070(s16* a, s8 b, u8* c) +{ + s8 i; + s8 d = c*; + PlaySE(SE_SELECT); + i = 0; + while (i <= 3) + { + d += b + if (d > a[0]) + d = 0; + else if (d < 0) + d = data[0]; + if (d == 4) + break; + + } +} */ \ No newline at end of file -- cgit v1.2.3 From 0a88d1042a80bcc703d05f1cf19527272424a03f Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Tue, 3 Oct 2017 15:42:28 -0400 Subject: decompiled up to sub_81C13B0 --- src/pokemon_summary_screen.c | 833 ++++++++++++++++++++++++++----------------- 1 file changed, 502 insertions(+), 331 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 9c4647cf0..549970624 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -18,6 +18,7 @@ extern struct BgTemplate gUnknown_0861CBB4; extern u8 gUnknown_0203CF20; extern struct MusicPlayerInfo gMPlay_BGM; extern s8 gUnknown_0861CC1C[]; +extern u8 gUnknown_08329D22[]; extern void sub_806F2AC(u8 a, u8 b); void sub_81C488C(u8 a); @@ -61,7 +62,7 @@ u8 sub_81BFEB0(); void sub_81C2554(); void sub_81C1BA0(); void sub_81C0098(struct Pokemon* a); -u8 sub_81C00F0(struct Pokemon* a); +bool8 sub_81C00F0(struct Pokemon* a); void sub_81C25E8(); void sub_81C286C(); void sub_81C2D9C(u8 a); @@ -98,7 +99,7 @@ s8 sub_81C09B4(s8 a); s8 sub_81C08F8(s8 a); void sub_81C4204(u8 a, u8 b); void sub_81C20F0(u8 taskId); -u8 sub_81C0A50(struct Pokemon* mon); +bool8 sub_81C0A50(struct Pokemon* mon); void sub_81C49E0(); void sub_81C0E24(); void sub_81C2C38(); @@ -117,24 +118,33 @@ void sub_81C4AF8(u8 a); void sub_81C1070(s16* a, s8 b, u8* c); void sub_81C11F4(u8 a); void sub_81C129C(u8 a); -u8 sub_81C1040(); - +bool8 sub_81C1040(); +void sub_81C4064(); +void sub_81C4C60(u8 a); +void sub_81C12E4(u8 taskId); +void sub_81C4C84(u8 a); +void sub_81C13B0(u8 a, u8 b); +void sub_81C14BC(struct Pokemon *mon, u8 a, u8 b); +void sub_81C15EC(struct BoxPokemon *mon, u8 a, u8 b); +void sub_81C40A0(u8 a, u8 b); +void sub_81C4568(u8 a, u8 b); void SetBgAttribute(u8 bg, u8 attributeId, u8 value); -u8 sub_81BFB10(); +bool8 sub_81BFB10(); u8 sub_81B1250(); -union unkUnion{ +union unkUnion +{ struct Pokemon mons[6]; struct BoxPokemon boxMons[6]; }; - u8 sub_80D214C(union unkUnion* a, u8 b, u8 c, u8 d); -struct pokeSummary{ +struct pokeSummary +{ u16 species; // 0x0 u16 species2; // 0x2 u8 isEgg; // 0x4 @@ -167,12 +177,13 @@ struct pokeSummary{ u32 OTID; // 0x48 }; -struct unkSummaryStruct{ - union unkUnion* unk0; - void* unk4; - void* unk8; - struct Pokemon currentPoke; - struct pokeSummary summary; +struct unkSummaryStruct +{ + /*0x00*/ union unkUnion *unk0; + /*0x04*/ void *unk4; + /*0x08*/ void *unk8; + /*0x0C*/ struct Pokemon currentPoke; + /*0x70*/ struct pokeSummary summary; u8 unkTilemap0[0x800]; u8 unkTilemap0_1[0x800]; u8 unkTilemap1[0x800]; @@ -189,16 +200,9 @@ struct unkSummaryStruct{ u8 unk40C1; u8 unk40C2; u8 unk40C3; - union -{ - struct - { - u16 unk40C4; - u8 unk40C6; - u8 unkfiller3; - } fooFiller; - u32 loadThis; -} unionThing; + u16 unk40C4; + u8 unk40C6; + u8 unk40C7; u8 unk40C8; u8 unk40C9; u8 unk_filler2[0x9]; @@ -211,7 +215,7 @@ struct unkSummaryStruct{ u8 unk_filler4[6]; }; -void sub_81BF8EC(u8 a, void* b, u8 c, u8 d, void* e) +void sub_81BF8EC(u8 a, void *b, u8 c, u8 d, void *e) { u8 byte; gUnknown_0203CF1C = AllocZeroed(0x40F8); @@ -226,21 +230,21 @@ void sub_81BF8EC(u8 a, void* b, u8 c, u8 d, void* e) gUnknown_0203CF1C->unk40BD = 0; switch (a) { - case 0: - case 2: - gUnknown_0203CF1C->unk40C1 = 0; - gUnknown_0203CF1C->unk40C2 = 3; - break; - case 1: - gUnknown_0203CF1C->unk40C1 = 0; - gUnknown_0203CF1C->unk40C2 = 3; - gUnknown_0203CF1C->unk40C8 = 1; - break; - case 3: - gUnknown_0203CF1C->unk40C1 = 2; - gUnknown_0203CF1C->unk40C2 = 3; - gUnknown_0203CF1C->unk40C3 = 1; - break; + case 0: + case 2: + gUnknown_0203CF1C->unk40C1 = 0; + gUnknown_0203CF1C->unk40C2 = 3; + break; + case 1: + gUnknown_0203CF1C->unk40C1 = 0; + gUnknown_0203CF1C->unk40C2 = 3; + gUnknown_0203CF1C->unk40C8 = 1; + break; + case 3: + gUnknown_0203CF1C->unk40C1 = 2; + gUnknown_0203CF1C->unk40C2 = 3; + gUnknown_0203CF1C->unk40C3 = 1; + break; } byte = gUnknown_0203CF1C->unk40C1; gUnknown_0203CF1C->unk40C0 = byte; @@ -250,13 +254,13 @@ void sub_81BF8EC(u8 a, void* b, u8 c, u8 d, void* e) SetMainCallback2(sub_81BFAE4); } -void sub_81BFA38(void* a, u8 b, u8 c, void* d, u16 e) +void sub_81BFA38(void *a, u8 b, u8 c, void *d, u16 e) { sub_81BF8EC(3, a, b, c, d); - gUnknown_0203CF1C->unionThing.fooFiller.unk40C4 = e; + gUnknown_0203CF1C->unk40C4 = e; } -void sub_81BFA80(u8 a, void* b, u8 c, u8 d, void* e) +void sub_81BFA80(u8 a, void *b, u8 c, u8 d, void *e) { sub_81BF8EC(a, b, c, d, e); gUnknown_0203CF1C->unk40EF = 1; @@ -280,138 +284,138 @@ void sub_81BFAD0(void) void sub_81BFAE4() { - while(1) + while (1) { - if (sub_81221EC() == 1 || sub_81BFB10() == 1 || sub_81221AC() == 1) + if (sub_81221EC() == 1 || sub_81BFB10() == TRUE || sub_81221AC() == 1) break; } } -u8 sub_81BFB10() +bool8 sub_81BFB10(void) { - switch (gMain.state) + switch (gMain.state) + { + case 0: + SetVBlankHBlankCallbacksToNull(); + sub_8121DA0(); + clear_scheduled_bg_copies_to_vram(); + gMain.state++; + break; + case 1: + remove_some_task(); + gMain.state++; + break; + case 2: + ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = 1; + gMain.state++; + break; + case 3: + ResetSpriteData(); + gMain.state++; + break; + case 4: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 5: + sub_81BFE24(); + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; + break; + case 6: + if (sub_81BFEB0() != 0) + gMain.state++; + break; + case 7: + sub_81C2554(); + gMain.state++; + break; + case 8: + sub_81C1BA0(); + gMain.state++; + break; + case 9: + sub_81C0098(&gUnknown_0203CF1C->currentPoke); + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; + break; + case 10: + if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke) != 0) + gMain.state++; + break; + case 11: + sub_81C25E8(); + gMain.state++; + break; + case 12: + sub_81C286C(); + gMain.state++; + break; + case 13: + sub_81C2D9C(gUnknown_0203CF1C->unk40C0); + gMain.state++; + break; + case 14: + sub_81C0348(); + gMain.state++; + break; + case 15: + sub_81C2AFC(gUnknown_0203CF1C->unk40C0); + gMain.state++; + break; + case 16: + sub_81C4190(); + sub_81C42C8(); + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; + break; + case 17: + gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &gUnknown_0203CF1C->unk40F0); + if (gUnknown_0203CF1C->unk40D3 != 0xFF) { - case 0: - SetVBlankHBlankCallbacksToNull(); - sub_8121DA0(); - clear_scheduled_bg_copies_to_vram(); - gMain.state++; - break; - case 1: - remove_some_task(); - gMain.state++; - break; - case 2: - ResetPaletteFade(); - gPaletteFade.bufferTransferDisabled = 1; - gMain.state++; - break; - case 3: - ResetSpriteData(); - gMain.state++; - break; - case 4: - FreeAllSpritePalettes(); - gMain.state++; - break; - case 5: - sub_81BFE24(); - gUnknown_0203CF1C->unk40F0 = 0; - gMain.state++; - break; - case 6: - if (sub_81BFEB0() != 0) - gMain.state++; - break; - case 7: - sub_81C2554(); - gMain.state++; - break; - case 8: - sub_81C1BA0(); - gMain.state++; - break; - case 9: - sub_81C0098(&gUnknown_0203CF1C->currentPoke); - gUnknown_0203CF1C->unk40F0 = 0; - gMain.state++; - break; - case 10: - if(sub_81C00F0(&gUnknown_0203CF1C->currentPoke) != 0) - gMain.state++; - break; - case 11: - sub_81C25E8(); - gMain.state++; - break; - case 12: - sub_81C286C(); - gMain.state++; - break; - case 13: - sub_81C2D9C(gUnknown_0203CF1C->unk40C0); - gMain.state++; - break; - case 14: - sub_81C0348(); - gMain.state++; - break; - case 15: - sub_81C2AFC(gUnknown_0203CF1C->unk40C0); - gMain.state++; - break; - case 16: - sub_81C4190(); - sub_81C42C8(); - gUnknown_0203CF1C->unk40F0 = 0; - gMain.state++; - break; - case 17: - gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &gUnknown_0203CF1C->unk40F0); - if (gUnknown_0203CF1C->unk40D3 != 0xFF) - { - gUnknown_0203CF1C->unk40F0 = 0; - gMain.state++; - } - break; - case 18: - sub_81C4984(&gUnknown_0203CF1C->currentPoke); - gMain.state++; - break; - case 19: - sub_81C4A08(&gUnknown_0203CF1C->currentPoke); - gMain.state++; - break; - case 20: - sub_81C4A88(); - gMain.state++; - break; - case 21: - sub_81C4280(); - gMain.state++; - break; - case 22: - if (gUnknown_0203CF1C->unk40BC != 3) - CreateTask(sub_81C0510, 0); - else - CreateTask(sub_81C171C, 0); - gMain.state++; - break; - case 23: - BlendPalettes(-1, 16, 0); - gMain.state++; - break; - case 24: - BeginNormalPaletteFade(-1, 0, 16, 0, 0); - gPaletteFade.bufferTransferDisabled = 0; - gMain.state++; - break; - default: - SetVBlankCallback(sub_81BFAD0); - SetMainCallback2(sub_81BFAB4); - return 1; + gUnknown_0203CF1C->unk40F0 = 0; + gMain.state++; } - return 0; + break; + case 18: + sub_81C4984(&gUnknown_0203CF1C->currentPoke); + gMain.state++; + break; + case 19: + sub_81C4A08(&gUnknown_0203CF1C->currentPoke); + gMain.state++; + break; + case 20: + sub_81C4A88(); + gMain.state++; + break; + case 21: + sub_81C4280(); + gMain.state++; + break; + case 22: + if (gUnknown_0203CF1C->unk40BC != 3) + CreateTask(sub_81C0510, 0); + else + CreateTask(sub_81C171C, 0); + gMain.state++; + break; + case 23: + BlendPalettes(-1, 16, 0); + gMain.state++; + break; + case 24: + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = 0; + gMain.state++; + break; + default: + SetVBlankCallback(sub_81BFAD0); + SetMainCallback2(sub_81BFAB4); + return TRUE; + } + return FALSE; } void sub_81BFE24() @@ -437,68 +441,68 @@ u8 sub_81BFEB0() { switch (gUnknown_0203CF1C->unk40F0) { - case 0: - reset_temp_tile_data_buffers(); - decompress_and_copy_tile_data_to_vram(1, &gUnknown_08D97D0C, 0, 0, 0); - gUnknown_0203CF1C->unk40F0++; - break; - case 1: - if (free_temp_tile_data_buffers_if_possible() != 1) - { - LZDecompressWram(&gUnknown_08D9862C, gUnknown_0203CF1C->unkTilemap0); - gUnknown_0203CF1C->unk40F0++; - } - break; - case 2: - LZDecompressWram(&gUnknown_08D98CC8, gUnknown_0203CF1C->unkTilemap0_1); - gUnknown_0203CF1C->unk40F0++; - break; - case 3: - LZDecompressWram(&gUnknown_08D987FC, gUnknown_0203CF1C->unkTilemap1_1); - gUnknown_0203CF1C->unk40F0++; - break; - case 4: - LZDecompressWram(&gUnknown_08D9898C, gUnknown_0203CF1C->unkTilemap2_1); - gUnknown_0203CF1C->unk40F0++; - break; - case 5: - LZDecompressWram(&gUnknown_08D98B28, gUnknown_0203CF1C->unkTilemap3_1); - gUnknown_0203CF1C->unk40F0++; - break; - case 6: - LoadCompressedPalette(&gUnknown_08D9853C, 0, 0x100); - LoadPalette(&gUnknown_08D85620, 0x81, 0x1E); - gUnknown_0203CF1C->unk40F0++; - break; - case 7: - LoadCompressedObjectPic(&gUnknown_0861CFBC); - gUnknown_0203CF1C->unk40F0++; - break; - case 8: - LoadCompressedObjectPic(&gUnknown_0861D074); - gUnknown_0203CF1C->unk40F0++; - break; - case 9: - LoadCompressedObjectPic(&gUnknown_0861D0F8); - gUnknown_0203CF1C->unk40F0++; - break; - case 10: - LoadCompressedObjectPalette(&gUnknown_0861D100); - gUnknown_0203CF1C->unk40F0++; - break; - case 11: - LoadCompressedObjectPalette(&gUnknown_0861D07C); + case 0: + reset_temp_tile_data_buffers(); + decompress_and_copy_tile_data_to_vram(1, &gUnknown_08D97D0C, 0, 0, 0); + gUnknown_0203CF1C->unk40F0++; + break; + case 1: + if (free_temp_tile_data_buffers_if_possible() != 1) + { + LZDecompressWram(&gUnknown_08D9862C, gUnknown_0203CF1C->unkTilemap0); gUnknown_0203CF1C->unk40F0++; - break; - case 12: - LoadCompressedPalette(&gUnknown_08D97B84, 0x1D0, 0x60); - gUnknown_0203CF1C->unk40F0 = 0; - return 1; + } + break; + case 2: + LZDecompressWram(&gUnknown_08D98CC8, gUnknown_0203CF1C->unkTilemap0_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 3: + LZDecompressWram(&gUnknown_08D987FC, gUnknown_0203CF1C->unkTilemap1_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 4: + LZDecompressWram(&gUnknown_08D9898C, gUnknown_0203CF1C->unkTilemap2_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 5: + LZDecompressWram(&gUnknown_08D98B28, gUnknown_0203CF1C->unkTilemap3_1); + gUnknown_0203CF1C->unk40F0++; + break; + case 6: + LoadCompressedPalette(&gUnknown_08D9853C, 0, 0x100); + LoadPalette(&gUnknown_08D85620, 0x81, 0x1E); + gUnknown_0203CF1C->unk40F0++; + break; + case 7: + LoadCompressedObjectPic(&gUnknown_0861CFBC); + gUnknown_0203CF1C->unk40F0++; + break; + case 8: + LoadCompressedObjectPic(&gUnknown_0861D074); + gUnknown_0203CF1C->unk40F0++; + break; + case 9: + LoadCompressedObjectPic(&gUnknown_0861D0F8); + gUnknown_0203CF1C->unk40F0++; + break; + case 10: + LoadCompressedObjectPalette(&gUnknown_0861D100); + gUnknown_0203CF1C->unk40F0++; + break; + case 11: + LoadCompressedObjectPalette(&gUnknown_0861D07C); + gUnknown_0203CF1C->unk40F0++; + break; + case 12: + LoadCompressedPalette(&gUnknown_08D97B84, 0x1D0, 0x60); + gUnknown_0203CF1C->unk40F0 = 0; + return 1; } return 0; } -void sub_81C0098(struct Pokemon* poke) +void sub_81C0098(struct Pokemon *poke) { if (gUnknown_0203CF1C->unk40BD == 0) { @@ -512,89 +516,87 @@ void sub_81C0098(struct Pokemon* poke) } } -u8 sub_81C00F0(struct Pokemon* a) +bool8 sub_81C00F0(struct Pokemon *a) { u32 i; - struct pokeSummary* sum = &gUnknown_0203CF1C->summary; + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; switch (gUnknown_0203CF1C->unk40F0) { - - case 0: - sum->species = GetMonData(a, MON_DATA_SPECIES); - sum->species2 = GetMonData(a, MON_DATA_SPECIES2); - sum->exp = GetMonData(a, MON_DATA_EXP); - sum->level = GetMonData(a, MON_DATA_LEVEL); - sum->altability = GetMonData(a, MON_DATA_ALT_ABILITY); - sum->item = GetMonData(a, MON_DATA_HELD_ITEM); - sum->pid = GetMonData(a, MON_DATA_PERSONALITY); - sum->sanity = GetMonData(a, MON_DATA_SANITY_BIT1); - if (sum->sanity != 0) - sum->isEgg = 1; - else - sum->isEgg = GetMonData(a, MON_DATA_IS_EGG); - break; - case 1: - for (i = 0; i < 4; i++) - { - sum->moves[i] = GetMonData(a, MON_DATA_MOVE1+i); - sum->pp[i] = GetMonData(a, MON_DATA_PP1+i); - } - sum->ppBonuses = GetMonData(a, MON_DATA_PP_BONUSES); - break; - case 2: - if ((struct Pokemon*)gUnknown_0203CF1C->unk0 == gPlayerParty || gUnknown_0203CF1C->unk40BC == 2 || gUnknown_0203CF1C->unk40EF == 1) - { - sum->nature = GetNature(a); - sum->currentHP = GetMonData(a, MON_DATA_HP); - sum->maxHP = GetMonData(a, MON_DATA_MAX_HP); - sum->atk = GetMonData(a, MON_DATA_ATK); - sum->def = GetMonData(a, MON_DATA_DEF); - sum->spatk = GetMonData(a, MON_DATA_SPATK); - sum->spdef = GetMonData(a, MON_DATA_SPDEF); - sum->speed = GetMonData(a, MON_DATA_SPD); - } - else - { - sum->nature = GetNature(a); - sum->currentHP = GetMonData(a, MON_DATA_HP); - sum->maxHP = GetMonData(a, MON_DATA_MAX_HP); - sum->atk = GetMonData(a, MON_DATA_ATK2); - sum->def = GetMonData(a, MON_DATA_DEF2); - sum->spatk = GetMonData(a, MON_DATA_SPATK2); - sum->spdef = GetMonData(a, MON_DATA_SPDEF2); - sum->speed = GetMonData(a, MON_DATA_SPD2); - } - break; - case 3: - GetMonData(a, MON_DATA_OT_NAME, &sum->OTName); - ConvertInternationalString((u8*)&sum->OTName, GetMonData(a, MON_DATA_LANGUAGE)); - sum->unk7 = sub_81B205C(a); - sum->OTGender = GetMonData(a, MON_DATA_OT_GENDER); - sum->OTID = GetMonData(a, MON_DATA_OT_ID); - sum->metLocation = GetMonData(a, MON_DATA_MET_LOCATION); - sum->metLevel = GetMonData(a, MON_DATA_MET_LEVEL); - sum->metGame = GetMonData(a, MON_DATA_MET_GAME); - sum->friendship = GetMonData(a, MON_DATA_FRIENDSHIP); - break; - default: - sum->ribbons = GetMonData(a, MON_DATA_RIBBON_COUNT); - return 1; + case 0: + sum->species = GetMonData(a, MON_DATA_SPECIES); + sum->species2 = GetMonData(a, MON_DATA_SPECIES2); + sum->exp = GetMonData(a, MON_DATA_EXP); + sum->level = GetMonData(a, MON_DATA_LEVEL); + sum->altability = GetMonData(a, MON_DATA_ALT_ABILITY); + sum->item = GetMonData(a, MON_DATA_HELD_ITEM); + sum->pid = GetMonData(a, MON_DATA_PERSONALITY); + sum->sanity = GetMonData(a, MON_DATA_SANITY_BIT1); + if (sum->sanity != 0) + sum->isEgg = 1; + else + sum->isEgg = GetMonData(a, MON_DATA_IS_EGG); + break; + case 1: + for (i = 0; i < 4; i++) + { + sum->moves[i] = GetMonData(a, MON_DATA_MOVE1+i); + sum->pp[i] = GetMonData(a, MON_DATA_PP1+i); + } + sum->ppBonuses = GetMonData(a, MON_DATA_PP_BONUSES); + break; + case 2: + if ((struct Pokemon*)gUnknown_0203CF1C->unk0 == gPlayerParty || gUnknown_0203CF1C->unk40BC == 2 || gUnknown_0203CF1C->unk40EF == 1) + { + sum->nature = GetNature(a); + sum->currentHP = GetMonData(a, MON_DATA_HP); + sum->maxHP = GetMonData(a, MON_DATA_MAX_HP); + sum->atk = GetMonData(a, MON_DATA_ATK); + sum->def = GetMonData(a, MON_DATA_DEF); + sum->spatk = GetMonData(a, MON_DATA_SPATK); + sum->spdef = GetMonData(a, MON_DATA_SPDEF); + sum->speed = GetMonData(a, MON_DATA_SPD); + } + else + { + sum->nature = GetNature(a); + sum->currentHP = GetMonData(a, MON_DATA_HP); + sum->maxHP = GetMonData(a, MON_DATA_MAX_HP); + sum->atk = GetMonData(a, MON_DATA_ATK2); + sum->def = GetMonData(a, MON_DATA_DEF2); + sum->spatk = GetMonData(a, MON_DATA_SPATK2); + sum->spdef = GetMonData(a, MON_DATA_SPDEF2); + sum->speed = GetMonData(a, MON_DATA_SPD2); + } + break; + case 3: + GetMonData(a, MON_DATA_OT_NAME, &sum->OTName); + ConvertInternationalString((u8*)&sum->OTName, GetMonData(a, MON_DATA_LANGUAGE)); + sum->unk7 = sub_81B205C(a); + sum->OTGender = GetMonData(a, MON_DATA_OT_GENDER); + sum->OTID = GetMonData(a, MON_DATA_OT_ID); + sum->metLocation = GetMonData(a, MON_DATA_MET_LOCATION); + sum->metLevel = GetMonData(a, MON_DATA_MET_LEVEL); + sum->metGame = GetMonData(a, MON_DATA_MET_GAME); + sum->friendship = GetMonData(a, MON_DATA_FRIENDSHIP); + break; + default: + sum->ribbons = GetMonData(a, MON_DATA_RIBBON_COUNT); + return TRUE; } gUnknown_0203CF1C->unk40F0++; - return 0; + return FALSE; } -void sub_81C0348() +void sub_81C0348(void) { - u8 a = gUnknown_0203CF1C->unk40C0 - 2; - if (a > 1) + if (gUnknown_0203CF1C->unk40C0 != 2 && gUnknown_0203CF1C->unk40C0 != 3) { sub_81C1DA4(0, 255); sub_81C1EFC(0, 255, 0); } else { - sub_81C240C(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unionThing.fooFiller.unk40C6]); + sub_81C240C(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]); sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 0); sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 0); SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap3); @@ -604,11 +606,12 @@ void sub_81C0348() ClearWindowTilemap(0xD); } if (gUnknown_0203CF1C->summary.unk7 == 0) + { sub_81C2074(0, 0xFF); + } else { - u8 b = gUnknown_0203CF1C->unk40C0 - 2; - if (b > 1) + if (gUnknown_0203CF1C->unk40C0 != 2 && gUnknown_0203CF1C->unk40C0 != 3) PutWindowTilemap(0xD); } sub_81C2524(); @@ -629,7 +632,7 @@ void sub_81C044C(u8 taskId) void sub_81C0484(u8 taskId) { - if (sub_81221EC() != 1 && gPaletteFade.active == 0) + if (sub_81221EC() != 1 && !gPaletteFade.active) { SetMainCallback2(gUnknown_0203CF1C->unk4); gUnknown_0203CF20 = gUnknown_0203CF1C->unk40BE; @@ -647,18 +650,24 @@ void sub_81C0484(u8 taskId) void sub_81C0510(u8 taskId) { - if (sub_81221EC() != 1 && gPaletteFade.active == 0) + if (sub_81221EC() != 1 && !gPaletteFade.active) { if (gMain.newKeys & DPAD_UP) + { sub_81C0604(taskId, -1); + } else if (gMain.newKeys & DPAD_DOWN) { sub_81C0604(taskId, 1); } else if ((gMain.newKeys & DPAD_LEFT) || GetLRKeysState() == 1) + { sub_81C0A8C(taskId, -1); + } else if ((gMain.newKeys & DPAD_RIGHT) || GetLRKeysState() == 2) + { sub_81C0A8C(taskId, 1); + } else if (gMain.newKeys & A_BUTTON) { if (gUnknown_0203CF1C->unk40C0 != 1) @@ -666,12 +675,12 @@ void sub_81C0510(u8 taskId) if (gUnknown_0203CF1C->unk40C0 == 0) { sub_81C48F0(); - PlaySE(5); + PlaySE(SE_SELECT); sub_81C044C(taskId); } else { - PlaySE(5); + PlaySE(SE_SELECT); sub_81C0E48(taskId); } } @@ -679,7 +688,7 @@ void sub_81C0510(u8 taskId) else if (gMain.newKeys & B_BUTTON) { sub_81C48F0(); - PlaySE(5); + PlaySE(SE_SELECT); sub_81C044C(taskId); } } @@ -756,7 +765,7 @@ void sub_81C0704(u8 taskId) gUnknown_0203CF1C->unk40F0 = 0; break; case 4: - if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke) == 0) + if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke) == FALSE) return; break; case 5: @@ -853,21 +862,19 @@ s8 sub_81C09B4(s8 a) if (r5 < 0 || r5 >= 6) return -1; b = c[r5]; - if (sub_81C0A50(&mons[b]) == 1) + if (sub_81C0A50(&mons[b]) == TRUE) return b; } } -u8 sub_81C0A50(struct Pokemon* mon) +bool8 sub_81C0A50(struct Pokemon* mon) { if (GetMonData(mon, MON_DATA_SPECIES) == 0) - { - return 0; - } + return FALSE; else if (gUnknown_0203CF1C->unk40BE != 0 || GetMonData(mon, MON_DATA_IS_EGG) == 0) - return 1; + return TRUE; else - return 0; + return FALSE; } void sub_81C0A8C(u8 taskId, s8 b) @@ -920,9 +927,7 @@ void sub_81C0B8C(u8 taskId) ChangeBgX(data[1], 0x2000, 1); data[0] += 32; if (data[0] > 0xFF) - { gTasks[taskId].func = sub_81C0C68; - } } void sub_81C0C68(u8 taskId) @@ -996,8 +1001,8 @@ void sub_81C0E24() void sub_81C0E48(u8 taskId) { u16 move; - gUnknown_0203CF1C->unionThing.fooFiller.unk40C6 = 0; - move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unionThing.fooFiller.unk40C6]; + gUnknown_0203CF1C->unk40C6 = 0; + move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; ClearWindowTilemap(0x13); if (gSprites[gUnknown_0203CF1C->unk40D5].invisible == 0) ClearWindowTilemap(0xD); @@ -1024,32 +1029,36 @@ void sub_81C0F44(u8 taskId) { u8 id = taskId; s16 *data = gTasks[taskId].data; + if (sub_81221EC() != 1) { if (gMain.newKeys & DPAD_UP) { data[0] = 4; - sub_81C1070(data, -1, &gUnknown_0203CF1C->unionThing.fooFiller.unk40C6); + sub_81C1070(data, -1, &gUnknown_0203CF1C->unk40C6); } else if (gMain.newKeys & DPAD_DOWN) { data[0] = 4; - sub_81C1070(data, 1, &gUnknown_0203CF1C->unionThing.fooFiller.unk40C6); + sub_81C1070(data, 1, &gUnknown_0203CF1C->unk40C6); } else if (gMain.newKeys & A_BUTTON) { - if (gUnknown_0203CF1C->unk40C8 == 1 || ((int)(gUnknown_0203CF1C->unionThing.loadThis & 0xFFFFFF) == 0x40000)) + if (gUnknown_0203CF1C->unk40C8 == 1 + || (gUnknown_0203CF1C->unk40C4 == 0 && gUnknown_0203CF1C->unk40C6 == 4)) { PlaySE(SE_SELECT); sub_81C11F4(taskId); } - else if (sub_81C1040() == 1) + else if (sub_81C1040() == TRUE) { PlaySE(SE_SELECT); sub_81C129C(taskId); } else - PlaySE(0x20); + { + PlaySE(SE_HAZURE); + } } else if (gMain.newKeys & B_BUTTON) { @@ -1059,32 +1068,194 @@ void sub_81C0F44(u8 taskId) } } -u8 sub_81C1040() +bool8 sub_81C1040(void) { u8 i; - for (i = 1; i <= 3; i++) + for (i = 1; i < 4; i++) { if (gUnknown_0203CF1C->summary.moves[i] != 0) - return 1; + return TRUE; } - return 0; + return FALSE; } -/* void sub_81C1070(s16* a, s8 b, u8* c) +void sub_81C4D18(); + +void sub_81C1070(s16 *a, s8 b, u8 *c) { s8 i; - s8 d = c*; + s8 moveIndex; + u16 move; + PlaySE(SE_SELECT); - i = 0; - while (i <= 3) + moveIndex = *c; + for (i = 0; i < 4; i++) { - d += b - if (d > a[0]) - d = 0; - else if (d < 0) - d = data[0]; - if (d == 4) + moveIndex += b; + if (moveIndex > a[0]) + moveIndex = 0; + else if (moveIndex < 0) + moveIndex = a[0]; + if (moveIndex == 4) + { + move = gUnknown_0203CF1C->unk40C4; break; - + } + move = gUnknown_0203CF1C->summary.moves[moveIndex]; + if (move != 0) + break; + } + sub_81C240C(move); + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); + sub_81C3E9C(move); + if ((*c == 4 && gUnknown_0203CF1C->unk40C4 == 0) || a[1] == 1) + { + ClearWindowTilemap(19); + if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + ClearWindowTilemap(13); + schedule_bg_copy_tilemap_to_vram(0); + sub_81C1DA4(9, -3); + sub_81C1EFC(9, -3, move); + } + if (*c != 4 && moveIndex == 4 && gUnknown_0203CF1C->unk40C4 == 0) + { + ClearWindowTilemap(14); + ClearWindowTilemap(15); + schedule_bg_copy_tilemap_to_vram(0); + sub_81C1DA4(0, 3); + sub_81C1EFC(0, 3, 0); + } + *c = moveIndex; + if (c == &gUnknown_0203CF1C->unk40C6) + sub_81C4D18(8); + else + sub_81C4D18(18); +} + +void sub_81C11F4(u8 taskId) +{ + sub_81C4C60(8); + ClearWindowTilemap(6); + PutWindowTilemap(5); + sub_81C3E9C(0); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 1); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 1); + sub_81C4064(); + if (gUnknown_0203CF1C->unk40C6 != 4) + { + ClearWindowTilemap(14); + ClearWindowTilemap(15); + sub_81C1DA4(0, 3); + sub_81C1EFC(0, 3, 0); } + schedule_bg_copy_tilemap_to_vram(0); + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); + gTasks[taskId].func = sub_81C0510; +} + +void sub_81C129C(u8 taskId) +{ + gUnknown_0203CF1C->unk40C7 = gUnknown_0203CF1C->unk40C6; + sub_81C4C84(1); + sub_81C4AF8(18); + gTasks[taskId].func = sub_81C12E4; +} + +void sub_81C12E4(u8 taskId) +{ + u8 a = taskId; + s16* data = gTasks[taskId].data; + if (sub_81221EC() != 1) + { + if (gMain.newKeys & DPAD_UP) + { + data[0] = 3; + sub_81C1070(&data[0], -1, &gUnknown_0203CF1C->unk40C7); + } + else if (gMain.newKeys & DPAD_DOWN) + { + data[0] = 3; + sub_81C1070(&data[0], 1, &gUnknown_0203CF1C->unk40C7); + } + else if (gMain.newKeys & A_BUTTON) + { + if (gUnknown_0203CF1C->unk40C6 == gUnknown_0203CF1C->unk40C7) + { + sub_81C13B0(taskId, 0); + } + else + sub_81C13B0(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + sub_81C13B0(a, 0); + } +} + +void sub_81C13B0(u8 taskId, u8 b) +{ + u16 move; + PlaySE(SE_SELECT); + sub_81C4C84(0); + sub_81C4C60(18); + if (b == 1) + { + if (gUnknown_0203CF1C->unk40BD == 0) + { + struct Pokemon *why = gUnknown_0203CF1C->unk0->mons; + sub_81C14BC(&why[gUnknown_0203CF1C->unk40BE], gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); + } + else + { + struct BoxPokemon *why = gUnknown_0203CF1C->unk0->boxMons; + sub_81C15EC(&why[gUnknown_0203CF1C->unk40BE], gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); + } + sub_81C0098(&gUnknown_0203CF1C->currentPoke); + sub_81C40A0(gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); + sub_81C4568(gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); + gUnknown_0203CF1C->unk40C6 = gUnknown_0203CF1C->unk40C7; + } + move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; + sub_81C3E9C(move); + sub_81C240C(move); + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); + gTasks[taskId].func = sub_81C0F44; +} + +struct struct_moveSwap +{ + u16 field_0; + u16 field_2; + u8 field_4; + u8 field_5; + u8 field_6; + u16* ptr_8; + u16* ptr_C; + u8* ptr_10; + u8* ptr_14; + u8* ptr_18; + u16* ptr_1C; + u8* ptr_20; + u8* ptr_24; +}; + +/* void sub_81C14BC(struct Pokemon *mon, u8 a, u8 b) +{ + struct struct_moveSwap sp; + u8 r2; + sp.ptr_8 = &gUnknown_0203CF1C->summary.moves[a]; + sp.ptr_1C = &sp.field_2; + sp.field_2 = gUnknown_0203CF1C->summary.moves[a]; + sp.ptr_C = &gUnknown_0203CF1C->summary.moves[b]; + sp.field_0 = gUnknown_0203CF1C->summary.moves[b]; + sp.ptr_10 = &gUnknown_0203CF1C->summary.pp[a]; + sp.ptr_24 = &sp.field_5; + sp.field_5 = gUnknown_0203CF1C->summary.pp[a]; + sp.ptr_14 = &gUnknown_0203CF1C->summary.pp[b]; + sp.ptr_20 = &sp.field_4; + sp.field_4 = gUnknown_0203CF1C->summary.pp[b]; + sp.ptr_18 = &gUnknown_0203CF1C->summary.ppBonuses; + sp.field_6 = gUnknown_0203CF1C->summary.ppBonuses; } */ \ No newline at end of file -- cgit v1.2.3 From ddc2e96825c38e0ac05e602c07fc870d3464f139 Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Wed, 4 Oct 2017 13:27:50 -0400 Subject: egg pls save me --- src/pokemon_summary_screen.c | 87 ++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 549970624..9a478dabb 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1224,38 +1224,63 @@ void sub_81C13B0(u8 taskId, u8 b) gTasks[taskId].func = sub_81C0F44; } -struct struct_moveSwap -{ - u16 field_0; - u16 field_2; - u8 field_4; - u8 field_5; - u8 field_6; - u16* ptr_8; - u16* ptr_C; - u8* ptr_10; - u8* ptr_14; - u8* ptr_18; - u16* ptr_1C; - u8* ptr_20; - u8* ptr_24; -}; -/* void sub_81C14BC(struct Pokemon *mon, u8 a, u8 b) +/* void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId) { - struct struct_moveSwap sp; + u16* moveToPtr; + u8 r8; u8 r2; - sp.ptr_8 = &gUnknown_0203CF1C->summary.moves[a]; - sp.ptr_1C = &sp.field_2; - sp.field_2 = gUnknown_0203CF1C->summary.moves[a]; - sp.ptr_C = &gUnknown_0203CF1C->summary.moves[b]; - sp.field_0 = gUnknown_0203CF1C->summary.moves[b]; - sp.ptr_10 = &gUnknown_0203CF1C->summary.pp[a]; - sp.ptr_24 = &sp.field_5; - sp.field_5 = gUnknown_0203CF1C->summary.pp[a]; - sp.ptr_14 = &gUnknown_0203CF1C->summary.pp[b]; - sp.ptr_20 = &sp.field_4; - sp.field_4 = gUnknown_0203CF1C->summary.pp[b]; - sp.ptr_18 = &gUnknown_0203CF1C->summary.ppBonuses; - sp.field_6 = gUnknown_0203CF1C->summary.ppBonuses; + u8 r12; + u8 r1; + u16 localMoveTo; + u16 localMoveFrom; + u8 localPpTo; + u8 localPpFrom; + u8 localPpBonuses; + + u16* moveFromPtr; + u8* ppFromPtr; + u8* ppToPtr; + u8* ppBonusesPtr; + + moveFromPtr = &gUnknown_0203CF1C->summary.moves[swappingFromId]; + localMoveFrom = *moveFromPtr; + + moveToPtr = &gUnknown_0203CF1C->summary.moves[swappingToId]; + localMoveTo = *moveToPtr; + + ppFromPtr = &gUnknown_0203CF1C->summary.pp[swappingFromId]; + localPpFrom = *ppFromPtr; + ppToPtr = &gUnknown_0203CF1C->summary.pp[swappingToId]; + localPpTo = *ppToPtr; + + ppBonusesPtr = &gUnknown_0203CF1C->summary.ppBonuses; + localPpBonuses = *ppBonusesPtr; + + r8 = gUnknown_08329D22[swappingFromId]; + r2 = (int)(localPpBonuses & r8) >> (swappingFromId << 1); + r12 = gUnknown_08329D22[swappingToId]; + r1 = (int)(localPpBonuses & r12) >> (swappingToId << 1); + localPpBonuses &= ~r8; + localPpBonuses &= ~r12; + r2 = r2 << (swappingToId << 1); + r1 = r1 << (swappingFromId << 1); + r2 += r1; + localPpBonuses |= r2; + + SetMonData(mon, swappingFromId + MON_DATA_MOVE1, moveToPtr); + SetMonData(mon, swappingToId + MON_DATA_MOVE1, moveFromPtr); + + SetMonData(mon, swappingFromId + MON_DATA_PP1, ppToPtr); + SetMonData(mon, swappingToId + MON_DATA_PP1, ppFromPtr); + + SetMonData(mon, MON_DATA_PP_BONUSES, &localPpBonuses); + + *moveFromPtr = localMoveTo; + *moveToPtr = localMoveFrom; + + *ppFromPtr = localPpTo; + *ppToPtr = localPpFrom; + + *ppBonusesPtr = localPpBonuses; } */ \ No newline at end of file -- cgit v1.2.3 From 9d4acb9635b3b74d5ae4edee70d673f49c0aab74 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 9 Oct 2017 15:40:08 +0200 Subject: some work on international string util --- src/coins.c | 2 +- src/international_string_util.c | 57 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/international_string_util.c (limited to 'src') diff --git a/src/coins.c b/src/coins.c index 4ee601b22..9c2d35168 100644 --- a/src/coins.c +++ b/src/coins.c @@ -5,12 +5,12 @@ #include "text_window.h" #include "string_util.h" #include "menu.h" +#include "international_string_util.h" #define MAX_COINS 9999 EWRAM_DATA u8 sCoinsWindowId = 0; -extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth); extern void sub_819746C(u8 windowId, bool8 copyToVram); extern const u8 gText_Coins[]; diff --git a/src/international_string_util.c b/src/international_string_util.c new file mode 100644 index 000000000..c77b4f8ff --- /dev/null +++ b/src/international_string_util.c @@ -0,0 +1,57 @@ +#include "global.h" +#include "international_string_util.h" +#include "text.h" + +extern s32 convert_pixel_width_to_tile_width(s32 a0); // script menu + +s32 GetStringCenterAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth) +{ + return GetStringCenterAlignXOffsetWithLetterSpacing(fontId, str, totalWidth, 0); +} + +s32 GetStringRightAlignXOffset(s32 fontId, const u8 *str, s32 totalWidth) +{ + return GetStringWidthDifference(fontId, str, totalWidth, 0); +} + +s32 GetStringCenterAlignXOffsetWithLetterSpacing(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing) +{ + return GetStringWidthDifference(fontId, str, totalWidth, letterSpacing) / 2; +} + +s32 GetStringWidthDifference(s32 fontId, const u8 *str, s32 totalWidth, s32 letterSpacing) +{ + s32 stringWidth = GetStringWidth(fontId, str, letterSpacing); + if (totalWidth > stringWidth) + return totalWidth - stringWidth; + else + return 0; +} + +s32 GetMaxWidthInMenuTable(const u8 **str, s32 arg1) +{ + s32 i, var; + + for (var = 0, i = 0; i < arg1; i++) + { + s32 stringWidth = GetStringWidth(1, str[i * 2], 0); + if (stringWidth > var) + var = stringWidth; + } + + return convert_pixel_width_to_tile_width(var); +} + +s32 sub_81DB3D8(const u8 **str, u8* arg1, s32 arg2) +{ + s32 i, var; + + for (var = 0, i = 0; i < arg2; i++) + { + s32 stringWidth = GetStringWidth(1, str[arg1[i] * 2], 0); + if (stringWidth > var) + var = stringWidth; + } + + return convert_pixel_width_to_tile_width(var); +} -- cgit v1.2.3 From d361f7030abb3441bfe61e95c3803297454acbb8 Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Mon, 9 Oct 2017 13:17:13 -0400 Subject: decompiled up to sub_81C20F0 --- src/pokemon_summary_screen.c | 1016 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 976 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 9a478dabb..2c7c5e11c 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1,4 +1,5 @@ #include "battle.h" +#include "bg.h" #include "decompress.h" #include "global.h" #include "m4a.h" @@ -19,6 +20,13 @@ extern u8 gUnknown_0203CF20; extern struct MusicPlayerInfo gMPlay_BGM; extern s8 gUnknown_0861CC1C[]; extern u8 gUnknown_08329D22[]; +extern u8 gUnknown_0203CF21; +extern u16 gSpecialVar_0x8005; +extern struct unkStruct_61CC04 gUnknown_0861CC04; +extern struct unkStruct_61CC04 gUnknown_0861CC10; +extern struct unkStruct_61CC04 gUnknown_0861CBEC; +extern struct unkStruct_61CC04 gUnknown_0861CBF8; +extern u16 gUnknown_08DC3CD4[]; extern void sub_806F2AC(u8 a, u8 b); void sub_81C488C(u8 a); @@ -33,7 +41,6 @@ extern void ResetBgsAndClearDma3BusyFlags(u32 leftoverFireRedLeafGreenVariable); extern void ShowBg(u8 a); extern void SetGpuReg(u8 regOffset, u16 value); extern void schedule_bg_copy_tilemap_to_vram(u8 a); -extern void InitBgsFromTemplates(u8 bgMode, struct BgTemplate *templates, u8 numTemplates); extern void SetBgTilemapBuffer(u8 bg, void *tilemap); extern u8 gUnknown_08D9862C; extern u8 gUnknown_08D98CC8; @@ -53,6 +60,7 @@ extern void reset_temp_tile_data_buffers(); extern void decompress_and_copy_tile_data_to_vram(u8 a, void* tiledata, u8 b, u8 c, u8 d); extern u8 free_temp_tile_data_buffers_if_possible(); extern void sub_8069004(struct BoxPokemon* a, void* b); +extern void sub_81C1E20(u8 taskId); extern u32 ChangeBgX(u8 bg, u32 value, u8 op); @@ -79,10 +87,10 @@ void sub_81C0510(u8 taskId); void sub_81C171C(u8 taskId); void sub_8121E10(); u8 sub_81B205C(struct Pokemon* a); -void sub_81C1DA4(u8 a, s16 b); -void sub_81C1EFC(u8 a, s16 b, u16 c); +void sub_81C1DA4(u16 a, s16 b); +void sub_81C1EFC(u16 a, s16 b, u16 c); void sub_81C240C(u16 a); -void sub_81C2194(void* a, u8 b, u8 c); +void sub_81C2194(u16 *a, u16 b, u8 c); void sub_81C2074(u16 a, s16 b); void sub_81C2524(); void sub_81C2228(struct Pokemon* poke); @@ -128,6 +136,13 @@ void sub_81C14BC(struct Pokemon *mon, u8 a, u8 b); void sub_81C15EC(struct BoxPokemon *mon, u8 a, u8 b); void sub_81C40A0(u8 a, u8 b); void sub_81C4568(u8 a, u8 b); +void sub_81C174C(u8 taskId); +u8 sub_81C18A8(); +void sub_81C18F4(u8 a); +u8 sub_81B6D14(u16 a); +void sub_81C1940(u8 taskId); +void sub_81C4154(); +void sub_81C1F80(u8 taskId); void SetBgAttribute(u8 bg, u8 attributeId, u8 value); @@ -184,14 +199,14 @@ struct unkSummaryStruct /*0x08*/ void *unk8; /*0x0C*/ struct Pokemon currentPoke; /*0x70*/ struct pokeSummary summary; - u8 unkTilemap0[0x800]; - u8 unkTilemap0_1[0x800]; - u8 unkTilemap1[0x800]; - u8 unkTilemap1_1[0x800]; - u8 unkTilemap2[0x800]; - u8 unkTilemap2_1[0x800]; - u8 unkTilemap3[0x800]; - u8 unkTilemap3_1[0x800]; + u16 unkTilemap0[0x400]; + u16 unkTilemap0_1[0x400]; + u16 unkTilemap1[0x400]; + u16 unkTilemap1_1[0x400]; + u16 unkTilemap2[0x400]; + u16 unkTilemap2_1[0x400]; + u16 unkTilemap3[0x400]; + u16 unkTilemap3_1[0x400]; u8 unk40BC; u8 unk40BD; u8 unk40BE; @@ -597,8 +612,8 @@ void sub_81C0348(void) else { sub_81C240C(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]); - sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 0); - sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 0); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap2[0], 3, 0); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap3[0], 1, 0); SetBgTilemapBuffer(1, &gUnknown_0203CF1C->unkTilemap3); SetBgTilemapBuffer(2, &gUnknown_0203CF1C->unkTilemap2); ChangeBgX(2, 0x10000, 1); @@ -1013,8 +1028,8 @@ void sub_81C0E48(u8 taskId) ClearWindowTilemap(5); PutWindowTilemap(6); } - sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 0); - sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 0); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap2[0], 3, 0); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap3[0], 1, 0); sub_81C3E9C(move); sub_81C3F44(); sub_81C44F0(); @@ -1139,8 +1154,8 @@ void sub_81C11F4(u8 taskId) ClearWindowTilemap(6); PutWindowTilemap(5); sub_81C3E9C(0); - sub_81C2194(&gUnknown_0203CF1C->unkTilemap2, 3, 1); - sub_81C2194(&gUnknown_0203CF1C->unkTilemap3, 1, 1); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap2[0], 3, 1); + sub_81C2194(&gUnknown_0203CF1C->unkTilemap3[0], 1, 1); sub_81C4064(); if (gUnknown_0203CF1C->unk40C6 != 4) { @@ -1225,24 +1240,20 @@ void sub_81C13B0(u8 taskId, u8 b) } -/* void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId) +#ifdef NONMATCHING +void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId) { - u16* moveToPtr; - u8 r8; - u8 r2; - u8 r12; - u8 r1; u16 localMoveTo; u16 localMoveFrom; u8 localPpTo; u8 localPpFrom; u8 localPpBonuses; - u16* moveFromPtr; + u16* moveToPtr; u8* ppFromPtr; u8* ppToPtr; u8* ppBonusesPtr; - + moveFromPtr = &gUnknown_0203CF1C->summary.moves[swappingFromId]; localMoveFrom = *moveFromPtr; @@ -1251,28 +1262,31 @@ void sub_81C13B0(u8 taskId, u8 b) ppFromPtr = &gUnknown_0203CF1C->summary.pp[swappingFromId]; localPpFrom = *ppFromPtr; + ppToPtr = &gUnknown_0203CF1C->summary.pp[swappingToId]; localPpTo = *ppToPtr; ppBonusesPtr = &gUnknown_0203CF1C->summary.ppBonuses; localPpBonuses = *ppBonusesPtr; - r8 = gUnknown_08329D22[swappingFromId]; - r2 = (int)(localPpBonuses & r8) >> (swappingFromId << 1); - r12 = gUnknown_08329D22[swappingToId]; - r1 = (int)(localPpBonuses & r12) >> (swappingToId << 1); - localPpBonuses &= ~r8; - localPpBonuses &= ~r12; - r2 = r2 << (swappingToId << 1); - r1 = r1 << (swappingFromId << 1); - r2 += r1; - localPpBonuses |= r2; +{ + u8 bitsFrom, bitsTo; + + bitsFrom = (localPpBonuses & gUnknown_08329D22[swappingFromId]) >> (swappingFromId << 1); + bitsTo = (localPpBonuses & gUnknown_08329D22[swappingToId]) >> (swappingToId << 1); - SetMonData(mon, swappingFromId + MON_DATA_MOVE1, moveToPtr); - SetMonData(mon, swappingToId + MON_DATA_MOVE1, moveFromPtr); - SetMonData(mon, swappingFromId + MON_DATA_PP1, ppToPtr); - SetMonData(mon, swappingToId + MON_DATA_PP1, ppFromPtr); + localPpBonuses &= ~(gUnknown_08329D22[swappingFromId]); + localPpBonuses &= ~(gUnknown_08329D22[swappingToId]); + + localPpBonuses |= ((bitsFrom << (swappingToId << 1)) + (bitsTo << (swappingToId << 1))); +} + + SetMonData(mon, swappingFromId + MON_DATA_MOVE1, &localMoveTo); + SetMonData(mon, swappingToId + MON_DATA_MOVE1, &localMoveFrom); + + SetMonData(mon, swappingFromId + MON_DATA_PP1, &localPpTo); + SetMonData(mon, swappingToId + MON_DATA_PP1, &localPpFrom); SetMonData(mon, MON_DATA_PP_BONUSES, &localPpBonuses); @@ -1283,4 +1297,926 @@ void sub_81C13B0(u8 taskId, u8 b) *ppToPtr = localPpFrom; *ppBonusesPtr = localPpBonuses; +} +#else +__attribute__((naked)) +void sub_81C14BC(struct Pokemon *mon, u8 swappingFromId, u8 swappingToId) +{ + 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, 0x28\n\ + adds r7, r0, 0\n\ + adds r4, r1, 0\n\ + adds r6, r2, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r2, [r0]\n\ + lsls r0, r4, 1\n\ + mov r10, r0\n\ + adds r1, r2, 0\n\ + adds r1, 0x84\n\ + adds r0, r1, r0\n\ + str r0, [sp, 0x8]\n\ + ldrh r0, [r0]\n\ + mov r3, sp\n\ + adds r3, 0x2\n\ + str r3, [sp, 0x1C]\n\ + strh r0, [r3]\n\ + lsls r0, r6, 1\n\ + mov r9, r0\n\ + add r1, r9\n\ + str r1, [sp, 0xC]\n\ + ldrh r1, [r1]\n\ + mov r0, sp\n\ + strh r1, [r0]\n\ + adds r1, r2, 0\n\ + adds r1, 0x8C\n\ + adds r3, r1, r4\n\ + str r3, [sp, 0x10]\n\ + ldrb r0, [r3]\n\ + mov r3, sp\n\ + adds r3, 0x5\n\ + str r3, [sp, 0x24]\n\ + strb r0, [r3]\n\ + adds r1, r6\n\ + str r1, [sp, 0x14]\n\ + ldrb r0, [r1]\n\ + mov r1, sp\n\ + adds r1, 0x4\n\ + str r1, [sp, 0x20]\n\ + strb r0, [r1]\n\ + adds r2, 0xA4\n\ + str r2, [sp, 0x18]\n\ + ldrb r0, [r2]\n\ + mov r5, sp\n\ + adds r5, 0x6\n\ + strb r0, [r5]\n\ + ldr r1, =gUnknown_08329D22\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + mov r8, r0\n\ + ldrb r0, [r5]\n\ + adds r2, r0, 0\n\ + mov r3, r8\n\ + ands r2, r3\n\ + mov r3, r10\n\ + asrs r2, r3\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r1, r6, r1\n\ + ldrb r1, [r1]\n\ + mov r12, r1\n\ + adds r1, r0, 0\n\ + mov r3, r12\n\ + ands r1, r3\n\ + mov r3, r9\n\ + asrs r1, r3\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r3, r8\n\ + bics r0, r3\n\ + strb r0, [r5]\n\ + ldrb r0, [r5]\n\ + mov r3, r12\n\ + bics r0, r3\n\ + strb r0, [r5]\n\ + mov r0, r9\n\ + lsls r2, r0\n\ + mov r3, r10\n\ + lsls r1, r3\n\ + adds r2, r1\n\ + ldrb r0, [r5]\n\ + orrs r0, r2\n\ + strb r0, [r5]\n\ + adds r1, r4, 0\n\ + adds r1, 0xD\n\ + adds r0, r7, 0\n\ + mov r2, sp\n\ + bl SetMonData\n\ + adds r1, r6, 0\n\ + adds r1, 0xD\n\ + adds r0, r7, 0\n\ + ldr r2, [sp, 0x1C]\n\ + bl SetMonData\n\ + adds r4, 0x11\n\ + adds r0, r7, 0\n\ + adds r1, r4, 0\n\ + ldr r2, [sp, 0x20]\n\ + bl SetMonData\n\ + adds r6, 0x11\n\ + adds r0, r7, 0\n\ + adds r1, r6, 0\n\ + ldr r2, [sp, 0x24]\n\ + bl SetMonData\n\ + adds r0, r7, 0\n\ + movs r1, 0x15\n\ + adds r2, r5, 0\n\ + bl SetMonData\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + ldr r1, [sp, 0x8]\n\ + strh r0, [r1]\n\ + ldr r3, [sp, 0x1C]\n\ + ldrh r0, [r3]\n\ + ldr r1, [sp, 0xC]\n\ + strh r0, [r1]\n\ + ldr r3, [sp, 0x20]\n\ + ldrb r0, [r3]\n\ + ldr r1, [sp, 0x10]\n\ + strb r0, [r1]\n\ + ldr r3, [sp, 0x24]\n\ + ldrb r0, [r3]\n\ + ldr r1, [sp, 0x14]\n\ + strb r0, [r1]\n\ + ldrb r0, [r5]\n\ + ldr r3, [sp, 0x18]\n\ + strb r0, [r3]\n\ + add sp, 0x28\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\ + .pool\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void sub_81C15EC(struct BoxPokemon *mon, u8 swappingFromId, u8 swappingToId) +{ + u16 localMoveTo; + u16 localMoveFrom; + u8 localPpTo; + u8 localPpFrom; + u8 localPpBonuses; + u16* moveFromPtr; + u16* moveToPtr; + u8* ppFromPtr; + u8* ppToPtr; + u8* ppBonusesPtr; + + moveFromPtr = &gUnknown_0203CF1C->summary.moves[swappingFromId]; + localMoveFrom = *moveFromPtr; + + moveToPtr = &gUnknown_0203CF1C->summary.moves[swappingToId]; + localMoveTo = *moveToPtr; + + ppFromPtr = &gUnknown_0203CF1C->summary.pp[swappingFromId]; + localPpFrom = *ppFromPtr; + + ppToPtr = &gUnknown_0203CF1C->summary.pp[swappingToId]; + localPpTo = *ppToPtr; + + ppBonusesPtr = &gUnknown_0203CF1C->summary.ppBonuses; + localPpBonuses = *ppBonusesPtr; + +{ + u8 bitsFrom, bitsTo; + + bitsFrom = (localPpBonuses & gUnknown_08329D22[swappingFromId]) >> (swappingFromId << 1); + bitsTo = (localPpBonuses & gUnknown_08329D22[swappingToId]) >> (swappingToId << 1); + + + localPpBonuses &= ~(gUnknown_08329D22[swappingFromId]); + localPpBonuses &= ~(gUnknown_08329D22[swappingToId]); + + localPpBonuses |= ((bitsFrom << (swappingToId << 1)) + (bitsTo << (swappingToId << 1))); +} + + SetBoxMonData(mon, swappingFromId + MON_DATA_MOVE1, &localMoveTo); + SetBoxMonData(mon, swappingToId + MON_DATA_MOVE1, &localMoveFrom); + + SetBoxMonData(mon, swappingFromId + MON_DATA_PP1, &localPpTo); + SetBoxMonData(mon, swappingToId + MON_DATA_PP1, &localPpFrom); + + SetBoxMonData(mon, MON_DATA_PP_BONUSES, &localPpBonuses); + + *moveFromPtr = localMoveTo; + *moveToPtr = localMoveFrom; + + *ppFromPtr = localPpTo; + *ppToPtr = localPpFrom; + + *ppBonusesPtr = localPpBonuses; +} +#else +__attribute__((naked)) +void sub_81C15EC(struct BoxPokemon *mon, u8 swappingFromId, u8 swappingToId) +{ + 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, 0x28\n\ + adds r7, r0, 0\n\ + adds r4, r1, 0\n\ + adds r6, r2, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r2, [r0]\n\ + lsls r0, r4, 1\n\ + mov r10, r0\n\ + adds r1, r2, 0\n\ + adds r1, 0x84\n\ + adds r0, r1, r0\n\ + str r0, [sp, 0x8]\n\ + ldrh r0, [r0]\n\ + mov r3, sp\n\ + adds r3, 0x2\n\ + str r3, [sp, 0x1C]\n\ + strh r0, [r3]\n\ + lsls r0, r6, 1\n\ + mov r9, r0\n\ + add r1, r9\n\ + str r1, [sp, 0xC]\n\ + ldrh r1, [r1]\n\ + mov r0, sp\n\ + strh r1, [r0]\n\ + adds r1, r2, 0\n\ + adds r1, 0x8C\n\ + adds r3, r1, r4\n\ + str r3, [sp, 0x10]\n\ + ldrb r0, [r3]\n\ + mov r3, sp\n\ + adds r3, 0x5\n\ + str r3, [sp, 0x24]\n\ + strb r0, [r3]\n\ + adds r1, r6\n\ + str r1, [sp, 0x14]\n\ + ldrb r0, [r1]\n\ + mov r1, sp\n\ + adds r1, 0x4\n\ + str r1, [sp, 0x20]\n\ + strb r0, [r1]\n\ + adds r2, 0xA4\n\ + str r2, [sp, 0x18]\n\ + ldrb r0, [r2]\n\ + mov r5, sp\n\ + adds r5, 0x6\n\ + strb r0, [r5]\n\ + ldr r1, =gUnknown_08329D22\n\ + adds r0, r4, r1\n\ + ldrb r0, [r0]\n\ + mov r8, r0\n\ + ldrb r0, [r5]\n\ + adds r2, r0, 0\n\ + mov r3, r8\n\ + ands r2, r3\n\ + mov r3, r10\n\ + asrs r2, r3\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r1, r6, r1\n\ + ldrb r1, [r1]\n\ + mov r12, r1\n\ + adds r1, r0, 0\n\ + mov r3, r12\n\ + ands r1, r3\n\ + mov r3, r9\n\ + asrs r1, r3\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + mov r3, r8\n\ + bics r0, r3\n\ + strb r0, [r5]\n\ + ldrb r0, [r5]\n\ + mov r3, r12\n\ + bics r0, r3\n\ + strb r0, [r5]\n\ + mov r0, r9\n\ + lsls r2, r0\n\ + mov r3, r10\n\ + lsls r1, r3\n\ + adds r2, r1\n\ + ldrb r0, [r5]\n\ + orrs r0, r2\n\ + strb r0, [r5]\n\ + adds r1, r4, 0\n\ + adds r1, 0xD\n\ + adds r0, r7, 0\n\ + mov r2, sp\n\ + bl SetBoxMonData\n\ + adds r1, r6, 0\n\ + adds r1, 0xD\n\ + adds r0, r7, 0\n\ + ldr r2, [sp, 0x1C]\n\ + bl SetBoxMonData\n\ + adds r4, 0x11\n\ + adds r0, r7, 0\n\ + adds r1, r4, 0\n\ + ldr r2, [sp, 0x20]\n\ + bl SetBoxMonData\n\ + adds r6, 0x11\n\ + adds r0, r7, 0\n\ + adds r1, r6, 0\n\ + ldr r2, [sp, 0x24]\n\ + bl SetBoxMonData\n\ + adds r0, r7, 0\n\ + movs r1, 0x15\n\ + adds r2, r5, 0\n\ + bl SetBoxMonData\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + ldr r1, [sp, 0x8]\n\ + strh r0, [r1]\n\ + ldr r3, [sp, 0x1C]\n\ + ldrh r0, [r3]\n\ + ldr r1, [sp, 0xC]\n\ + strh r0, [r1]\n\ + ldr r3, [sp, 0x20]\n\ + ldrb r0, [r3]\n\ + ldr r1, [sp, 0x10]\n\ + strb r0, [r1]\n\ + ldr r3, [sp, 0x24]\n\ + ldrb r0, [r3]\n\ + ldr r1, [sp, 0x14]\n\ + strb r0, [r1]\n\ + ldrb r0, [r5]\n\ + ldr r3, [sp, 0x18]\n\ + strb r0, [r3]\n\ + add sp, 0x28\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\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_81C171C(u8 taskId) +{ + sub_81C44F0(); + sub_81C4AF8(8); + gTasks[taskId].func = sub_81C174C; +} + +void sub_81C174C(u8 taskId) +{ + s16* data = gTasks[taskId].data; + + if (sub_81221EC() != 1) + { + if (gPaletteFade.active != 1) + { + if (gMain.newKeys & DPAD_UP) + { + data[0] = 4; + sub_81C1070(data, -1, &gUnknown_0203CF1C->unk40C6); + } + else if (gMain.newKeys & DPAD_DOWN) + { + data[0] = 4; + sub_81C1070(data, 1, &gUnknown_0203CF1C->unk40C6); + } + else if (gMain.newKeys & DPAD_LEFT || GetLRKeysState() == 1) + { + sub_81C0A8C(taskId, -1); + } + else if (gMain.newKeys & DPAD_RIGHT || GetLRKeysState() == 2) + { + sub_81C0A8C(taskId, 1); + } + else if (gMain.newKeys & A_BUTTON) + { + if (sub_81C18A8() == 1) + { + sub_81C48F0(); + PlaySE(SE_SELECT); + gUnknown_0203CF21 = gUnknown_0203CF1C->unk40C6; + gSpecialVar_0x8005 = gUnknown_0203CF21; + sub_81C044C(taskId); + } + else + { + PlaySE(0x20); + sub_81C18F4(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + u32 var1; + sub_81C48F0(); + PlaySE(SE_SELECT); + gUnknown_0203CF21 = 4; + gSpecialVar_0x8005 = 4; + sub_81C044C(taskId); + } + } + } +} + +u8 sub_81C18A8() +{ + if (gUnknown_0203CF1C->unk40C6 == 4 || gUnknown_0203CF1C->unk40C4 == 0 || sub_81B6D14(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]) != 1) + return 1; + else + return 0; +} + +void sub_81C18F4(u8 taskId) +{ + ClearWindowTilemap(14); + ClearWindowTilemap(15); + schedule_bg_copy_tilemap_to_vram(0); + sub_81C1DA4(0, 3); + sub_81C1EFC(0, 3, 0); + sub_81C4154(); + gTasks[taskId].func = sub_81C1940; +} + +void sub_81C1940(u8 taskId) +{ + s16* data = gTasks[taskId].data; + u16 move; + if (FuncIsActiveTask(sub_81C1E20) != 1) + { + if (gMain.newKeys & DPAD_UP) + { + data[1] = 1; + data[0] = 4; + sub_81C1070(&data[0], -1, &gUnknown_0203CF1C->unk40C6); + data[1] = 0; + gTasks[taskId].func = sub_81C174C; + } + else if (gMain.newKeys & DPAD_DOWN) + { + data[1] = 1; + data[0] = 4; + sub_81C1070(&data[0], 1, &gUnknown_0203CF1C->unk40C6); + data[1] = 0; + gTasks[taskId].func = sub_81C174C; + } + else if (gMain.newKeys & DPAD_LEFT || GetLRKeysState() == 1) + { + if (gUnknown_0203CF1C->unk40C0 != 2) + { + + ClearWindowTilemap(19); + if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + ClearWindowTilemap(13); + move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; + gTasks[taskId].func = sub_81C174C; + sub_81C0A8C(taskId, -1); + sub_81C1DA4(9, -2); + sub_81C1EFC(9, -2, move); + } + } + else if (gMain.newKeys & DPAD_RIGHT || GetLRKeysState() == 2) + { + if (gUnknown_0203CF1C->unk40C0 != 3) + { + ClearWindowTilemap(19); + if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + ClearWindowTilemap(13); + move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; + gTasks[taskId].func = sub_81C174C; + sub_81C0A8C(taskId, 1); + sub_81C1DA4(9, -2); + sub_81C1EFC(9, -2, move); + } + } + else if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + ClearWindowTilemap(19); + if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + ClearWindowTilemap(13); + move = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; + sub_81C3E9C(move); + schedule_bg_copy_tilemap_to_vram(0); + sub_81C1DA4(9, -3); + sub_81C1EFC(9, -3, move); + gTasks[taskId].func = sub_81C174C; + } + } +} + +u8 sub_81C1B94() +{ + return gUnknown_0203CF21; +} + +void sub_81C1BA0() +{ + u16 *alloced = Alloc(32); + u8 i; + for (i = 0; i < 4; i++) + { + u8 j = i << 1; + if (i < gUnknown_0203CF1C->unk40C1) + { + alloced[j+0] = 0x40; + alloced[j+1] = 0x40; + alloced[j+8] = 0x50; + alloced[j+9] = 0x50; + } + else if (i > gUnknown_0203CF1C->unk40C2) + { + alloced[j+0] = 0x4A; + alloced[j+1] = 0x4A; + alloced[j+8] = 0x5A; + alloced[j+9] = 0x5A; + } + else if (i < gUnknown_0203CF1C->unk40C0) + { + alloced[j+0] = 0x46; + alloced[j+1] = 0x47; + alloced[j+8] = 0x56; + alloced[j+9] = 0x57; + } + else if (i == gUnknown_0203CF1C->unk40C0) + { + if (i != gUnknown_0203CF1C->unk40C2) + { + alloced[j+0] = 0x41; + alloced[j+1] = 0x42; + alloced[j+8] = 0x51; + alloced[j+9] = 0x52; + } + else + { + alloced[j+0] = 0x4B; + alloced[j+1] = 0x4C; + alloced[j+8] = 0x5B; + alloced[j+9] = 0x5C; + } + } + else if (i != gUnknown_0203CF1C->unk40C2) + { + alloced[j+0] = 0x43; + alloced[j+1] = 0x44; + alloced[j+8] = 0x53; + alloced[j+9] = 0x54; + } + else + { + alloced[j+0] = 0x48; + alloced[j+1] = 0x49; + alloced[j+8] = 0x58; + alloced[j+9] = 0x59; + } + } + CopyToBgTilemapBufferRect_ChangePalette(3, alloced, 11, 0, 8, 2, 16); + schedule_bg_copy_tilemap_to_vram(3); + Free(alloced); +} + +struct unkStruct_61CC04 +{ + u8 *ptr; + u8 field_4; + u8 field_5; + u8 field_6; + u8 field_7; + u8 field_8; + u8 field_9; +}; + +#ifdef NONMATCHING +void sub_81C1CB0(struct unkStruct_61CC04 *a, u16 *b, u8 c, u8 d) +{ + u8 *alloced = Alloc(a->field_6 * (a->field_7 << 1)); + CpuFill16(a->field_4, alloced, a->field_7*a->field_6); + if (a->field_6 != c) + { + if (!d) + { + for (d;d < a->field_7; d++) + { + CpuCopy16(&a->ptr + ((c + a->field_6*d)), alloced + ((a->field_6*d) << 1), (a->field_6 - c) * 2); + } + } + else + { + for (d = 0;d < a->field_7; d++) + { + CpuCopy16(&a->ptr + (a->field_6*d), alloced + ((c + a->field_6*d) << 1), (a->field_6 - c) * 2); + } + } + } + d = 0; + while (d < a->field_7) + { + CpuCopy16(alloced + ((a->field_6*d) << 1), b + ((((a->field_9 + d) << 5) + a->field_8) << 1), a->field_6 * 2); + d++; + } + Free(alloced); +} +#else +__attribute__((naked)) +void sub_81C1CB0(struct unkStruct_61CC04 *a, u16 *b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x4\n\ + adds r4, r0, 0\n\ + mov r8, r1\n\ + lsls r2, 24\n\ + lsrs r6, r2, 24\n\ + lsls r3, 24\n\ + lsrs r5, r3, 24\n\ + ldrb r1, [r4, 0x6]\n\ + ldrb r0, [r4, 0x7]\n\ + lsls r0, 1\n\ + muls r0, r1\n\ + bl Alloc\n\ + adds r7, r0, 0\n\ + mov r1, sp\n\ + ldrh r0, [r4, 0x4]\n\ + strh r0, [r1]\n\ + ldrb r1, [r4, 0x7]\n\ + ldrb r0, [r4, 0x6]\n\ + adds r2, r1, 0\n\ + muls r2, r0\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + orrs r2, r0\n\ + mov r0, sp\n\ + adds r1, r7, 0\n\ + bl CpuSet\n\ + ldrb r0, [r4, 0x6]\n\ + cmp r0, r6\n\ + beq _081C1D60\n\ + cmp r5, 0\n\ + bne _081C1D30\n\ + movs r5, 0\n\ + ldrb r0, [r4, 0x7]\n\ + cmp r5, r0\n\ + bcs _081C1D60\n\ +_081C1D00:\n\ + ldrb r2, [r4, 0x6]\n\ + adds r1, r2, 0\n\ + muls r1, r5\n\ + adds r3, r6, r1\n\ + lsls r3, 1\n\ + ldr r0, [r4]\n\ + adds r0, r3\n\ + lsls r1, 1\n\ + adds r1, r7, r1\n\ + subs r2, r6\n\ + ldr r3, =0x001fffff\n\ + ands r2, r3\n\ + bl CpuSet\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldrb r3, [r4, 0x7]\n\ + cmp r5, r3\n\ + bcc _081C1D00\n\ + b _081C1D60\n\ + .pool\n\ +_081C1D30:\n\ + movs r5, 0\n\ + ldrb r0, [r4, 0x7]\n\ + cmp r5, r0\n\ + bcs _081C1D60\n\ +_081C1D38:\n\ + ldrb r2, [r4, 0x6]\n\ + adds r1, r2, 0\n\ + muls r1, r5\n\ + lsls r3, r1, 1\n\ + ldr r0, [r4]\n\ + adds r0, r3\n\ + adds r1, r6, r1\n\ + lsls r1, 1\n\ + adds r1, r7, r1\n\ + subs r2, r6\n\ + ldr r3, =0x001fffff\n\ + ands r2, r3\n\ + bl CpuSet\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldrb r3, [r4, 0x7]\n\ + cmp r5, r3\n\ + bcc _081C1D38\n\ +_081C1D60:\n\ + movs r5, 0\n\ + b _081C1D8A\n\ + .pool\n\ +_081C1D68:\n\ + ldrb r2, [r4, 0x6]\n\ + adds r0, r2, 0\n\ + muls r0, r5\n\ + lsls r0, 1\n\ + adds r0, r7, r0\n\ + ldrb r1, [r4, 0x9]\n\ + adds r1, r5\n\ + lsls r1, 5\n\ + ldrb r3, [r4, 0x8]\n\ + adds r1, r3\n\ + lsls r1, 1\n\ + add r1, r8\n\ + bl CpuSet\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ +_081C1D8A:\n\ + ldrb r0, [r4, 0x7]\n\ + cmp r5, r0\n\ + bcc _081C1D68\n\ + adds r0, r7, 0\n\ + bl Free\n\ + add sp, 0x4\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif + +void sub_81C1DA4(u16 a, s16 b) +{ + if (b > gUnknown_0861CC04.field_6) + b = gUnknown_0861CC04.field_6; + if (b == 0 || b == gUnknown_0861CC04.field_6) + { + sub_81C1CB0(&gUnknown_0861CC04, &gUnknown_0203CF1C->unkTilemap2[0], b, 1); + } + else + { + u8 taskId = FindTaskIdByFunc(sub_81C1E20); + if (taskId == 0xFF) + { + taskId = CreateTask(sub_81C1E20, 8); + } + gTasks[taskId].data[0] = b; + gTasks[taskId].data[1] = a; + } +} + +void sub_81C1E20(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + data[1] += data[0]; + if (data[1] < 0) + { + data[1] = 0; + } + else if (data[1] > gUnknown_0861CC04.field_6) + { + data[1] = gUnknown_0861CC04.field_6; + } + sub_81C1CB0(&gUnknown_0861CC04, &gUnknown_0203CF1C->unkTilemap2[0], data[1], 1); + if (data[1] <= 0 || data[1] >= gUnknown_0861CC04.field_6) + { + if (data[0] < 0) + { + if (gUnknown_0203CF1C->unk40C0 == 2) + PutWindowTilemap(14); + + } + else + { + if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + PutWindowTilemap(13); + PutWindowTilemap(19); + } + schedule_bg_copy_tilemap_to_vram(0); + DestroyTask(taskId); + } + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); +} + +void sub_81C1EFC(u16 a, s16 b, u16 move) +{ + if (b > gUnknown_0861CC10.field_6) + b = gUnknown_0861CC10.field_6; + if (b == 0 || b == gUnknown_0861CC10.field_6) + sub_81C1CB0(&gUnknown_0861CC10, &gUnknown_0203CF1C->unkTilemap3[0], b, 1); + else + { + u8 taskId = FindTaskIdByFunc(sub_81C1F80); + if (taskId == 0xFF) + taskId = CreateTask(sub_81C1F80, 8); + gTasks[taskId].data[0] = b; + gTasks[taskId].data[1] = a; + gTasks[taskId].data[2] = move; + } +} + +void sub_81C1F80(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + data[1] += data[0]; + if (data[1] < 0) + { + data[1] = 0; + } + else if (data[1] > gUnknown_0861CC10.field_6) + { + data[1] = gUnknown_0861CC10.field_6; + } + sub_81C1CB0(&gUnknown_0861CC10, &gUnknown_0203CF1C->unkTilemap3[0], data[1], 1); + if (data[1] <= 0 || data[1] >= gUnknown_0861CC10.field_6) + { + if (data[0] < 0) + { + if (gUnknown_0203CF1C->unk40C0 == 3 && FuncIsActiveTask(sub_81C0B8C) == 0) + PutWindowTilemap(15); + sub_81C240C(data[2]); + } + else + { + if (!gSprites[gUnknown_0203CF1C->unk40D5].invisible) + { + PutWindowTilemap(13); + } + PutWindowTilemap(19); + } + schedule_bg_copy_tilemap_to_vram(0); + DestroyTask(taskId); + } + schedule_bg_copy_tilemap_to_vram(1); + schedule_bg_copy_tilemap_to_vram(2); +} + +void sub_81C2074(u16 a, s16 b) +{ + if (b > gUnknown_0861CBEC.field_6) + b = gUnknown_0861CBEC.field_6; + if (b == 0 || b == gUnknown_0861CBEC.field_6) + { + sub_81C1CB0(&gUnknown_0861CBEC, &gUnknown_0203CF1C->unkTilemap0[0], b, 0); + sub_81C1CB0(&gUnknown_0861CBF8, &gUnknown_0203CF1C->unkTilemap0[0], b, 0); + } + else + { + u8 taskId = CreateTask(sub_81C20F0, 8); + gTasks[taskId].data[0] = b; + gTasks[taskId].data[1] = a; + } +} + +void sub_81C20F0(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + data[1] += data[0]; + if (data[1] < 0) + data[1] = 0; + else if (data[1] > gUnknown_0861CBEC.field_6) + data[1] = gUnknown_0861CBEC.field_6; + sub_81C1CB0(&gUnknown_0861CBEC, &gUnknown_0203CF1C->unkTilemap0[0], data[1], 0); + sub_81C1CB0(&gUnknown_0861CBF8, &gUnknown_0203CF1C->unkTilemap0[0], data[1], 0); + schedule_bg_copy_tilemap_to_vram(3); + if (data[1] <= 0 || data[1] >= gUnknown_0861CBEC.field_6) + { + if (data[0] < 0) + { + sub_81C4A88(); + PutWindowTilemap(13); + schedule_bg_copy_tilemap_to_vram(0); + } + DestroyTask(taskId); + } +} + +/* void sub_81C2194(u16 *a, u16 b, u8 c) +{ + u16 i; + int var; + b *= 0x1000; + var = 0x56A; + + if (c == 0) + { + for (i = 0; i < 20; i++) + { + a[(i + var) << 1] = gUnknown_08DC3CD4[i] + b; + a[((i + var) << 1) + 0x40] = gUnknown_08DC3CD4[i] + b; + a[((i + var) << 1) + 0x80] = gUnknown_08DC3CD4[i + 20] + b; + } + } + else + { + for (i = 0; i < 20; i++) + { + a[(i + var)] = gUnknown_08DC3CD4[i + 20] + b; + a[((i + var)) + 0x40] = gUnknown_08DC3CD4[i + 40] + b; + a[((i + var)) + 0x80] = gUnknown_08DC3CD4[i + 40] + b; + } + } } */ \ No newline at end of file -- cgit v1.2.3 From f6f81f34b19730039e54eccb38511cdffd1b5217 Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Mon, 9 Oct 2017 16:49:14 -0400 Subject: decompiled up to sub_81C228C --- src/pokemon_summary_screen.c | 111 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 5733e1d90..4c748073e 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -63,6 +63,7 @@ extern void sub_8069004(struct BoxPokemon* a, void* b); extern void sub_81C1E20(u8 taskId); extern u32 ChangeBgX(u8 bg, u32 value, u8 op); +extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f); void sub_81BFAE4(void); void sub_81BFE24(); @@ -2194,7 +2195,9 @@ void sub_81C20F0(u8 taskId) } } -/* void sub_81C2194(u16 *a, u16 b, u8 c) +// somebody send help this is a complete fucking mess +#ifdef NONMATCHING +void sub_81C2194(u16 *a, u16 b, u8 c) { u16 i; int var; @@ -2219,4 +2222,108 @@ void sub_81C20F0(u8 taskId) a[((i + var)) + 0x80] = gUnknown_08DC3CD4[i + 40] + b; } } -} */ \ No newline at end of file +} +#else +__attribute__((naked)) +void sub_81C2194(u16 *a, u16 b, u8 c) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + adds r6, r0, 0\n\ + lsls r2, 24\n\ + lsls r1, 28\n\ + lsrs r4, r1, 16\n\ + ldr r7, =0x0000056a\n\ + cmp r2, 0\n\ + bne _081C21E4\n\ + movs r3, 0\n\ + ldr r5, =gUnknown_08DC3CD4\n\ +_081C21A8:\n\ + adds r2, r7, r3\n\ + lsls r2, 1\n\ + adds r2, r6\n\ + lsls r0, r3, 1\n\ + adds r0, r5\n\ + ldrh r1, [r0]\n\ + adds r1, r4, r1\n\ + strh r1, [r2]\n\ + adds r0, r2, 0\n\ + adds r0, 0x40\n\ + strh r1, [r0]\n\ + adds r2, 0x80\n\ + adds r0, r3, 0\n\ + adds r0, 0x14\n\ + lsls r0, 1\n\ + adds r0, r5\n\ + ldrh r0, [r0]\n\ + adds r0, r4, r0\n\ + strh r0, [r2]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x13\n\ + bls _081C21A8\n\ + b _081C221C\n\ + .pool\n\ +_081C21E4:\n\ + movs r3, 0\n\ + ldr r5, =gUnknown_08DC3CD4\n\ +_081C21E8:\n\ + adds r1, r7, r3\n\ + lsls r1, 1\n\ + adds r1, r6\n\ + adds r0, r3, 0\n\ + adds r0, 0x14\n\ + lsls r0, 1\n\ + adds r0, r5\n\ + ldrh r0, [r0]\n\ + adds r0, r4, r0\n\ + strh r0, [r1]\n\ + adds r2, r1, 0\n\ + adds r2, 0x40\n\ + adds r0, r3, 0\n\ + adds r0, 0x28\n\ + lsls r0, 1\n\ + adds r0, r5\n\ + ldrh r0, [r0]\n\ + adds r0, r4, r0\n\ + strh r0, [r2]\n\ + adds r1, 0x80\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x13\n\ + bls _081C21E8\n\ +_081C221C:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_81C2228(struct Pokemon *mon) +{ + if (!CheckPartyPokerus(mon, 0) && CheckPartyHasHadPokerus(mon, 0)) + { + gUnknown_0203CF1C->unkTilemap0[0x223] = 0x2C; + gUnknown_0203CF1C->unkTilemap0_1[0x223] = 0x2C; + } + else + { + gUnknown_0203CF1C->unkTilemap0[0x223] = 0x81A; + gUnknown_0203CF1C->unkTilemap0_1[0x223] = 0x81A; + } + schedule_bg_copy_tilemap_to_vram(3); +} + +void sub_81C228C(u8 a) +{ + if (a == 0) + sub_8199C30(3, 1, 4, 8, 8, 0); + else + sub_8199C30(3, 1, 4, 8, 8, 5); + schedule_bg_copy_tilemap_to_vram(3); +} \ No newline at end of file -- cgit v1.2.3 From 8d31a46c6fbc2dedd39ec9e9687f372ac102303d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 12 Oct 2017 15:59:43 -0400 Subject: sub_8121478 --- src/mail.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/mail.c (limited to 'src') diff --git a/src/mail.c b/src/mail.c new file mode 100644 index 000000000..a21a297b6 --- /dev/null +++ b/src/mail.c @@ -0,0 +1,127 @@ + +// Includes +#include "global.h" +#include "main.h" +#include "species.h" +#include "malloc.h" +#include "easy_chat.h" +#include "mail_data.h" +#include "mail.h" + +// Static type declarations + +struct UnkMailStruct +{ + u8 unk_0_0:2; + u8 unk_0_2:2; + u8 unk_0_4:4; +}; + +struct MailLayout +{ + u8 var0; + u8 var1; + u8 var2; + u8 var3_0:4; + u8 var3_4:4; + struct UnkMailStruct *var4; + u32 var8; +}; + +struct Unk203A134 +{ + /*0x0000*/ u8 filler_0000[0x20c]; + /*0x020C*/ MainCallback callback; + /*0x0210*/ u8 filler_0210[4]; + /*0x0214*/ struct MailStruct *mail; + /*0x0218*/ bool8 flag; + /*0x0219*/ u8 filler_0219[1]; + /*0x021a*/ u8 mailType; + /*0x021b*/ u8 unk_021b; + /*0x021c*/ u8 unk_021c; + /*0x021d*/ u8 language; + /*0x021e*/ bool8 playerIsSender; + /*0x0220*/ void (*parserSingle)(u8 *dest, u16 word); + /*0x0224*/ void (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2); + /*0x0228*/ const struct MailLayout *layout; + /*0x022c*/ u8 filler_022C[0x2000]; +}; + +struct MailGraphics +{ + u16 (*palette)[]; + u8 (*tiles)[]; + u8 (*tileMap)[]; + u16 var0C; + u16 var0E; + u16 color10; + u16 color12; +}; + +// Static RAM declarations + +EWRAM_DATA struct Unk203A134 *gUnknown_0203A134; + +// Static ROM declarations + +void sub_81219F0(void); + +// .rodata + +extern const struct MailLayout gUnknown_0859F3B4[]; +extern const struct MailLayout gUnknown_0859F458[]; + +// .text + +void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) { + u16 buffer[2]; + u16 species; + + gUnknown_0203A134 = calloc(1, sizeof(struct Unk203A134)); + gUnknown_0203A134->language = LANGUAGE_ENGLISH; + gUnknown_0203A134->playerIsSender = TRUE; + gUnknown_0203A134->parserSingle = CopyEasyChatWord; + gUnknown_0203A134->parserMultiple = ConvertEasyChatWordsToString; + if (mail->itemId >= ITEM_ORANGE_MAIL && mail->itemId <= ITEM_RETRO_MAIL) { + gUnknown_0203A134->mailType = mail->itemId - ITEM_ORANGE_MAIL; + } + else + { + gUnknown_0203A134->mailType = 0; + flag = FALSE; + } + switch (gUnknown_0203A134->playerIsSender) + { + case FALSE: + default: + gUnknown_0203A134->layout = &gUnknown_0859F3B4[gUnknown_0203A134->mailType]; + break; + case TRUE: + gUnknown_0203A134->layout = &gUnknown_0859F458[gUnknown_0203A134->mailType]; + break; + } + species = sub_80D45E8(mail->species, buffer); + if (species >= SPECIES_BULBASAUR && species < NUM_SPECIES) + { + switch (gUnknown_0203A134->mailType) + { + default: + gUnknown_0203A134->unk_021b = 0; + break; + case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL: + gUnknown_0203A134->unk_021b = 1; + break; + case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL: + gUnknown_0203A134->unk_021b = 2; + break; + } + } + else + { + gUnknown_0203A134->unk_021b = 0; + } + gUnknown_0203A134->mail = mail; + gUnknown_0203A134->callback = callback; + gUnknown_0203A134->flag = flag; + SetMainCallback2(sub_81219F0); +} -- cgit v1.2.3 From 52af334b89e6549aea04614b7e9eccbc084b6eb8 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 12 Oct 2017 22:59:01 -0400 Subject: sub_81215EC --- src/mail.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index a21a297b6..2e859f6ea 100644 --- a/src/mail.c +++ b/src/mail.c @@ -2,6 +2,16 @@ // Includes #include "global.h" #include "main.h" +#include "rom4.h" +#include "task.h" +#include "unknown_task.h" +#include "palette.h" +#include "menu.h" +#include "text.h" +#include "text_window.h" +#include "gpu_regs.h" +#include "bg.h" +#include "pokemon_icon.h" #include "species.h" #include "malloc.h" #include "easy_chat.h" @@ -32,7 +42,7 @@ struct Unk203A134 { /*0x0000*/ u8 filler_0000[0x20c]; /*0x020C*/ MainCallback callback; - /*0x0210*/ u8 filler_0210[4]; + /*0x0210*/ MainCallback callback2; /*0x0214*/ struct MailStruct *mail; /*0x0218*/ bool8 flag; /*0x0219*/ u8 filler_0219[1]; @@ -44,7 +54,8 @@ struct Unk203A134 /*0x0220*/ void (*parserSingle)(u8 *dest, u16 word); /*0x0224*/ void (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2); /*0x0228*/ const struct MailLayout *layout; - /*0x022c*/ u8 filler_022C[0x2000]; + /*0x022c*/ u8 bg1TilemapBuffer[0x1000]; + /*0x122c*/ u8 bg2TilemapBuffer[0x1000]; }; struct MailGraphics @@ -65,9 +76,17 @@ EWRAM_DATA struct Unk203A134 *gUnknown_0203A134; // Static ROM declarations void sub_81219F0(void); +void sub_8121A1C(void); +void sub_8121B1C(void); +void sub_8121C50(void); +void sub_8121C98(void); // .rodata +extern const struct BgTemplate gUnknown_0859F290[]; +extern const struct WindowTemplate gUnknown_0859F29C; +extern const u16 gUnknown_0859F2B0[][2]; +extern const struct MailGraphics gUnknown_0859F2B8[]; extern const struct MailLayout gUnknown_0859F3B4[]; extern const struct MailLayout gUnknown_0859F458[]; @@ -125,3 +144,134 @@ void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) { gUnknown_0203A134->flag = flag; SetMainCallback2(sub_81219F0); } + +bool8 sub_81215EC(void) +{ + u16 icon; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + remove_some_task(); + SetGpuReg(REG_OFFSET_DISPCNT, 0x0000); + break; + case 1: + CpuFill16(0, (void *)OAM, OAM_SIZE); + break; + case 2: + ResetPaletteFade(); + break; + case 3: + ResetTasks(); + break; + case 4: + ResetSpriteData(); + break; + case 5: + FreeAllSpritePalettes(); + reset_temp_tile_data_buffers(); + SetGpuReg(REG_OFFSET_BG0HOFS, 0x0000); + SetGpuReg(REG_OFFSET_BG0VOFS, 0x0000); + SetGpuReg(REG_OFFSET_BG1HOFS, 0x0000); + SetGpuReg(REG_OFFSET_BG1VOFS, 0x0000); + SetGpuReg(REG_OFFSET_BG2VOFS, 0x0000); + SetGpuReg(REG_OFFSET_BG2HOFS, 0x0000); + SetGpuReg(REG_OFFSET_BG3HOFS, 0x0000); + SetGpuReg(REG_OFFSET_BG3VOFS, 0x0000); + SetGpuReg(REG_OFFSET_BLDCNT, 0x0000); + SetGpuReg(REG_OFFSET_BLDALPHA, 0x0000); + break; + case 6: + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, gUnknown_0859F290, 3); + SetBgTilemapBuffer(1, gUnknown_0203A134->bg1TilemapBuffer); + SetBgTilemapBuffer(2, gUnknown_0203A134->bg2TilemapBuffer); + break; + case 7: + InitWindows(&gUnknown_0859F29C); + DeactivateAllTextPrinters(); + break; + case 8: + decompress_and_copy_tile_data_to_vram(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tiles, 0, 0, 0); + break; + case 9: + if (free_temp_tile_data_buffers_if_possible()) + { + return FALSE; + } + break; + case 10: + FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(2, 1, 0, 0, 30, 20); + CopyToBgTilemapBuffer(1, gUnknown_0859F2B8[gUnknown_0203A134->mailType].tileMap, 0, 0); + break; + case 11: + CopyBgTilemapBufferToVram(0); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(2); + break; + case 12: + LoadPalette(sub_8098C64(), 240, 32); + gPlttBufferUnfaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10; + gPlttBufferFaded[250] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color10; + gPlttBufferUnfaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12; + gPlttBufferFaded[251] = gUnknown_0859F2B8[gUnknown_0203A134->mailType].color12; + LoadPalette(gUnknown_0859F2B8[gUnknown_0203A134->mailType].palette, 0, 32); + gPlttBufferUnfaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferFaded[10] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][0]; + gPlttBufferUnfaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; + gPlttBufferFaded[11] = gUnknown_0859F2B0[gSaveBlock2Ptr->playerGender][1]; + break; + case 13: + if (gUnknown_0203A134->flag) + { + sub_8121A1C(); + } + break; + case 14: + if (gUnknown_0203A134->flag) + { + sub_8121B1C(); + RunTextPrinters(); + } + break; + case 15: + if (sub_8087598() == TRUE) + { + return FALSE; + } + break; + case 16: + SetVBlankCallback(sub_8121C50); + gPaletteFade.bufferTransferDisabled = TRUE; + break; + case 17: + icon = sub_80D2E84(gUnknown_0203A134->mail->species); + switch (gUnknown_0203A134->unk_021b) + { + case 1: + sub_80D2F68(icon); + gUnknown_0203A134->unk_021c = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0); + break; + case 2: + sub_80D2F68(icon); + gUnknown_0203A134->unk_021c = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0); + break; + } + break; + case 18: + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(1); + ShowBg(2); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + gPaletteFade.bufferTransferDisabled = FALSE; + gUnknown_0203A134->callback2 = sub_8121C98; + return TRUE; + default: + return FALSE; + } + gMain.state ++; + return FALSE; +} -- cgit v1.2.3 From aa3af7a3a7106a14033c574977c082361f24907a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 12 Oct 2017 23:05:36 -0400 Subject: sub_81219F0 --- src/mail.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index 2e859f6ea..0f0530c04 100644 --- a/src/mail.c +++ b/src/mail.c @@ -7,6 +7,7 @@ #include "unknown_task.h" #include "palette.h" #include "menu.h" +#include "menu_helpers.h" #include "text.h" #include "text_window.h" #include "gpu_regs.h" @@ -79,6 +80,7 @@ void sub_81219F0(void); void sub_8121A1C(void); void sub_8121B1C(void); void sub_8121C50(void); +void sub_8121C64(void); void sub_8121C98(void); // .rodata @@ -275,3 +277,15 @@ bool8 sub_81215EC(void) gMain.state ++; return FALSE; } + +void sub_81219F0(void) +{ + do + { + if (sub_81215EC() == TRUE) + { + SetMainCallback2(sub_8121C64); + break; + } + } while (sub_81221AC() != TRUE); +} -- cgit v1.2.3 From 3c4478b370e5ad472c38b8c31ae17c5b49cb8083 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 13 Oct 2017 00:11:55 -0400 Subject: Decompile data --- src/mail.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 182 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index 0f0530c04..3febf1d08 100644 --- a/src/mail.c +++ b/src/mail.c @@ -26,6 +26,8 @@ struct UnkMailStruct u8 unk_0_0:2; u8 unk_0_2:2; u8 unk_0_4:4; + u8 unk_1_0:4; + u8 unk_1_4:1; }; struct MailLayout @@ -35,8 +37,8 @@ struct MailLayout u8 var2; u8 var3_0:4; u8 var3_4:4; - struct UnkMailStruct *var4; - u32 var8; + u32 var4; + const struct UnkMailStruct *var8; }; struct Unk203A134 @@ -61,9 +63,9 @@ struct Unk203A134 struct MailGraphics { - u16 (*palette)[]; - u8 (*tiles)[]; - u8 (*tileMap)[]; + const u16 *palette; + const u8 *tiles; + const u8 *tileMap; u16 var0C; u16 var0E; u16 color10; @@ -85,12 +87,180 @@ void sub_8121C98(void); // .rodata -extern const struct BgTemplate gUnknown_0859F290[]; -extern const struct WindowTemplate gUnknown_0859F29C; -extern const u16 gUnknown_0859F2B0[][2]; -extern const struct MailGraphics gUnknown_0859F2B8[]; -extern const struct MailLayout gUnknown_0859F3B4[]; -extern const struct MailLayout gUnknown_0859F458[]; +const struct BgTemplate gUnknown_0859F290[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 31, + .priority = 0 + }, { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .priority = 1 + }, { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 29, + .priority = 2 + } +}; + +const struct WindowTemplate gUnknown_0859F29C[] = { + { + .priority = 0, + .tilemapLeft = 2, + .tilemapTop = 3, + .width = 26, + .height = 15, + .paletteNum = 15, + .baseBlock = 1 + }, { + .priority = -1 + } +}; + +const u8 gUnknown_0859F2AC[] = { + 0, + 10, + 11 +}; + +const u16 gUnknown_0859F2B0[][2] = { + { 0x6ACD, 0x51A5 }, + { 0x45FC, 0x38D4 } +}; + +extern const u16 gUnknown_08DBE818[]; +extern const u16 gUnknown_08DBE838[]; +extern const u16 gUnknown_08DBE858[]; +extern const u16 gUnknown_08DBE878[]; +extern const u16 gUnknown_08DBE898[]; +extern const u16 gUnknown_08DBE8B8[]; +extern const u16 gUnknown_08DBE8D8[]; +extern const u16 gUnknown_08DBE8F8[]; +extern const u16 gUnknown_08DBE918[]; +extern const u16 gUnknown_08DBE938[]; +extern const u16 gUnknown_08DBE958[]; +extern const u16 gUnknown_08DBE978[]; +extern const u8 gUnknown_08DBE998[]; +extern const u8 gUnknown_08DBFBA4[]; +extern const u8 gUnknown_08DBEB38[]; +extern const u8 gUnknown_08DBFC7C[]; +extern const u8 gUnknown_08DBEC74[]; +extern const u8 gUnknown_08DBFD5C[]; +extern const u8 gUnknown_08DBEE84[]; +extern const u8 gUnknown_08DBFE68[]; +extern const u8 gUnknown_08DBEF5C[]; +extern const u8 gUnknown_08DBFF44[]; +extern const u8 gUnknown_08DBF154[]; +extern const u8 gUnknown_08DC0034[]; +extern const u8 gUnknown_08DBF2D4[]; +extern const u8 gUnknown_08DC0114[]; +extern const u8 gUnknown_08DBF37C[]; +extern const u8 gUnknown_08DC01F4[]; +extern const u8 gUnknown_08DBF50C[]; +extern const u8 gUnknown_08DC0300[]; +extern const u8 gUnknown_08DBF64C[]; +extern const u8 gUnknown_08DC03F0[]; +extern const u8 gUnknown_08DBF7B4[]; +extern const u8 gUnknown_08DC04E8[]; +extern const u8 gUnknown_08DBF904[]; +extern const u8 gUnknown_08DC0600[]; + +const struct MailGraphics gUnknown_0859F2B8[] = { + { + gUnknown_08DBE818, gUnknown_08DBE998, gUnknown_08DBFBA4, 0x02c0, 0x0000, 0x294a, 0x6739 + }, { + gUnknown_08DBE838, gUnknown_08DBEB38, gUnknown_08DBFC7C, 0x02e0, 0x0000, 0x7fff, 0x4631 + }, { + gUnknown_08DBE858, gUnknown_08DBEC74, gUnknown_08DBFD5C, 0x0400, 0x0000, 0x294a, 0x6739 + }, { + gUnknown_08DBE878, gUnknown_08DBEE84, gUnknown_08DBFE68, 0x01e0, 0x0000, 0x7fff, 0x4631 + }, { + gUnknown_08DBE898, gUnknown_08DBEF5C, gUnknown_08DBFF44, 0x02e0, 0x0000, 0x7fff, 0x4631 + }, { + gUnknown_08DBE8B8, gUnknown_08DBF154, gUnknown_08DC0034, 0x0300, 0x0000, 0x294a, 0x6739 + }, { + gUnknown_08DBE8D8, gUnknown_08DBF2D4, gUnknown_08DC0114, 0x0140, 0x0000, 0x7fff, 0x4631 + }, { + gUnknown_08DBE8F8, gUnknown_08DBF37C, gUnknown_08DC01F4, 0x0300, 0x0000, 0x7fff, 0x4631 + }, { + gUnknown_08DBE918, gUnknown_08DBF50C, gUnknown_08DC0300, 0x0220, 0x0000, 0x294a, 0x6739 + }, { + gUnknown_08DBE938, gUnknown_08DBF64C, gUnknown_08DC03F0, 0x0340, 0x0000, 0x294a, 0x6739 + }, { + gUnknown_08DBE958, gUnknown_08DBF7B4, gUnknown_08DC04E8, 0x02a0, 0x0000, 0x294a, 0x6739 + }, { + gUnknown_08DBE978, gUnknown_08DBF904, gUnknown_08DC0600, 0x0520, 0x0000, 0x294a, 0x6739 + } +}; + +const struct UnkMailStruct Unknown_0859F3A8[] = { + { .unk_0_0 = 3, .unk_1_4 = TRUE }, + { .unk_0_0 = 3, .unk_1_4 = TRUE }, + { .unk_0_0 = 3, .unk_1_4 = TRUE } +}; + +const struct MailLayout gUnknown_0859F3B4[] = { + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x08, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x2, 0x0, 0x00, Unknown_0859F3A8 } +}; + +const struct UnkMailStruct Unknown_0859F444[] = { + { .unk_0_0 = 2, .unk_1_4 = TRUE }, + { .unk_0_0 = 2, .unk_1_4 = TRUE }, + { .unk_0_0 = 2, .unk_1_4 = TRUE }, + { .unk_0_0 = 2, .unk_1_4 = TRUE }, + { .unk_0_0 = 1, .unk_1_4 = TRUE } +}; + +const struct MailLayout gUnknown_0859F458[] = { + { 0x05, 0x07, 0x58, 0xb, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0a, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0c, 0x68, 0x5, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x05, 0x60, 0x8, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0a, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x70, 0x5, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0c, 0x68, 0x9, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0d, 0x68, 0xd, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x11, 0x68, 0xf, 0x0, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x60, 0x5, 0x0, 0x1e, Unknown_0859F444 } +}; + +const u16 Unknown_0859F4E8[] = { + 0x00, 0x4000, 0x00, 0x00 +}; + +const u16 Unknown_0859F4F0[] = { + 0x00, 0x00, -1, 0x00 +}; + +const u16 Unknown_0859F4F8[] = { + 0x04, 0x00, -1, 0x00 +}; + +const u16 Unknown_0859F500[] = { + 0x00, 0x40, -1, 0x00 +}; + +const u16 *const gUnknown_0859F508[] = { + Unknown_0859F4F0, + Unknown_0859F4F8, + Unknown_0859F500 +}; // .text @@ -191,7 +361,7 @@ bool8 sub_81215EC(void) SetBgTilemapBuffer(2, gUnknown_0203A134->bg2TilemapBuffer); break; case 7: - InitWindows(&gUnknown_0859F29C); + InitWindows(gUnknown_0859F29C); DeactivateAllTextPrinters(); break; case 8: -- cgit v1.2.3 From 74c59af856216332b6c73cbc382edff3518a0eab Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 13 Oct 2017 08:47:26 -0400 Subject: sub_8121A1C --- src/mail.c | 50 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index 3febf1d08..0c3e85cc3 100644 --- a/src/mail.c +++ b/src/mail.c @@ -10,6 +10,9 @@ #include "menu_helpers.h" #include "text.h" #include "text_window.h" +#include "string_util.h" +#include "international_string_util.h" +#include "strings.h" #include "gpu_regs.h" #include "bg.h" #include "pokemon_icon.h" @@ -23,11 +26,11 @@ struct UnkMailStruct { - u8 unk_0_0:2; - u8 unk_0_2:2; - u8 unk_0_4:4; - u8 unk_1_0:4; - u8 unk_1_4:1; + u32 unk_0_0:2; + u32 unk_0_2:2; + u32 unk_0_4:4; + u32 unk_1_0:4; + u32 unk_1_4:1; }; struct MailLayout @@ -43,12 +46,13 @@ struct MailLayout struct Unk203A134 { - /*0x0000*/ u8 filler_0000[0x20c]; + /*0x0000*/ u8 strbuf[8][64]; + /*0x0200*/ u8 playerName[12]; /*0x020C*/ MainCallback callback; /*0x0210*/ MainCallback callback2; /*0x0214*/ struct MailStruct *mail; /*0x0218*/ bool8 flag; - /*0x0219*/ u8 filler_0219[1]; + /*0x0219*/ u8 unk_0219; /*0x021a*/ u8 mailType; /*0x021b*/ u8 unk_021b; /*0x021c*/ u8 unk_021c; @@ -115,9 +119,8 @@ const struct WindowTemplate gUnknown_0859F29C[] = { .height = 15, .paletteNum = 15, .baseBlock = 1 - }, { - .priority = -1 - } + }, + DUMMY_WIN_TEMPLATE }; const u8 gUnknown_0859F2AC[] = { @@ -240,6 +243,8 @@ const struct MailLayout gUnknown_0859F458[] = { { 0x05, 0x09, 0x60, 0x5, 0x0, 0x1e, Unknown_0859F444 } }; +// What the heck are these meant to be? Call them u16 for now. + const u16 Unknown_0859F4E8[] = { 0x00, 0x4000, 0x00, 0x00 }; @@ -459,3 +464,28 @@ void sub_81219F0(void) } } while (sub_81221AC() != TRUE); } + +void sub_8121A1C(void) +{ + u16 i; + u8 total; + u8 *ptr; + + total = 0; + for (i = 0; i < gUnknown_0203A134->layout->var0; i ++) + { + ConvertEasyChatWordsToString(gUnknown_0203A134->strbuf[i], &gUnknown_0203A134->mail->words[total], gUnknown_0203A134->layout->var8[i].unk_0_0, 1); + total += gUnknown_0203A134->layout->var8[i].unk_0_0; + } + ptr = StringCopy(gUnknown_0203A134->playerName, gUnknown_0203A134->mail->playerName); + if (!gUnknown_0203A134->playerIsSender) + { + StringCopy(ptr, gText_FromSpace); + gUnknown_0203A134->unk_0219 = gUnknown_0203A134->layout->var2 - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60); + } + else + { + sub_81DB52C(gUnknown_0203A134->playerName); + gUnknown_0203A134->unk_0219 = gUnknown_0203A134->layout->var2; + } +} -- cgit v1.2.3 From c78679ae66c71836b23e59e001c45235117cab2f Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 13 Oct 2017 17:22:50 +0200 Subject: rom3 decomp start --- src/battle_2.c | 3 - src/battle_controllers.c | 928 +++++++++++++++++++++++++++++++++++++++++++++++ src/battle_util.c | 2 +- 3 files changed, 929 insertions(+), 4 deletions(-) create mode 100644 src/battle_controllers.c (limited to 'src') diff --git a/src/battle_2.c b/src/battle_2.c index c4da02e36..734b8c308 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -207,9 +207,6 @@ extern const u8 BattleScript_ActionSwitch[]; extern const u8 BattleScript_PrintFailedToRunString[]; // functions -extern void HandleLinkBattleSetup(void); // rom_3 -extern void SetUpBattleVarsAndBirchZigzagoon(void); // rom_3 -extern void sub_8032768(void); // rom_3 extern void dp12_8087EA4(void); extern void sub_80356D0(void); extern void GetFrontierTrainerName(u8* dst, u16 trainerId); // battle tower diff --git a/src/battle_controllers.c b/src/battle_controllers.c new file mode 100644 index 000000000..cfa4aae71 --- /dev/null +++ b/src/battle_controllers.c @@ -0,0 +1,928 @@ +#include "global.h" +#include "battle.h" +#include "battle_controllers.h" +#include "link.h" +#include "task.h" +#include "battle_ai_script_commands.h" +#include "battle_anim.h" +#include "pokemon.h" +#include "species.h" +#include "recorded_battle.h" +#include "util.h" + +extern u32 gBattleTypeFlags; +extern u32 gBattleExecBuffer; +extern void (*gBattleMainFunc)(void); +extern void (*gBattleBankFunc[BATTLE_BANKS_COUNT])(void); +extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; +extern u8 gActionSelectionCursor[BATTLE_BANKS_COUNT]; +extern u8 gMoveSelectionCursor[BATTLE_BANKS_COUNT]; +extern u8 gNoOfAllBanks; +extern u8 gActiveBank; +extern u8 gUnknown_0202428C; +extern u32 gUnknown_02022FF4; +extern u8 gUnknown_0203C7B4; +extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; +extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200]; +extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200]; +extern u8 gUnknown_02022D08; +extern u8 gUnknown_02022D09; +extern u8 gUnknown_02022D0A; +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u8 gAbsentBankFlags; +extern u8 gEffectBank; + +extern void task00_08081A90(u8 taskId); // cable_club +extern void sub_81B8D64(u8 bank, u8 arg1); // party_menu + +// this file's funcionts +static void sub_8033244(void); +static void SetControllersVariablesInLinkBattle(void); +static void SetControllersVariables(void); +static void sub_8033050(void); +void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data); +static void Task_HandleSendLinkBuffersData(u8 taskId); +static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId); + +void HandleLinkBattleSetup(void) +{ + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + if (gLinkVSyncDisabled) + sub_800B488(); + if (!gReceivedRemoteLinkPlayers) + sub_8009734(); + CreateTask(task00_08081A90, 0); + sub_8033244(); + } +} + +void SetUpBattleVarsAndBirchZigzagoon(void) +{ + s32 i; + + gBattleMainFunc = nullsub_20; + + for (i = 0; i < BATTLE_BANKS_COUNT; i++) + { + gBattleBankFunc[i] = nullsub_21; + gBanksByIdentity[i] = 0xFF; + gActionSelectionCursor[i] = 0; + gMoveSelectionCursor[i] = 0; + } + + HandleLinkBattleSetup(); + gBattleExecBuffer = 0; + ClearBattleAnimationVars(); + ClearBattleMonForms(); + BattleAI_HandleItemUseBeforeAISetup(0xF); + + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) + { + ZeroEnemyPartyMons(); + CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, 0, 0); + i = 0; + SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &i); + } + + gUnknown_02022FF4 = 0; + gUnknown_0202428C = 0; +} + +void sub_8032768(void) +{ + s32 i; + u8 *data; + + if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) + sub_8184DA4(1); + else + sub_8184DA4(2); + + if (!(gBattleTypeFlags & BATTLE_TYPE_RECORDED)) + sub_8185EB8(); + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + SetControllersVariablesInLinkBattle(); + else + SetControllersVariables(); + + sub_8033050(); + + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + sub_81B8D64(i, 0); + } + + for (i = 0; i < sizeof(gBattleStruct->field_1A4); i++) + *(gBattleStruct->field_1A4 + i) = 0; + + for (i = 0; i < sizeof(gBattleStruct->field_204); i++) + *(gBattleStruct->field_204 + i) = 0; +} + +static void SetControllersVariables(void) +{ + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + { + gBattleMainFunc = BeginBattleIntro; + + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + { + gBattleBankFunc[0] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToPlayerPartnerBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_PLAYER_MON2; + + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + } + else + { + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToPlayerPartnerBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_PLAYER_MON2; + + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + } + + gNoOfAllBanks = 4; + + sub_81B8D64(0, 0); + sub_81B8D64(1, 0); + sub_81B8D64(2, 1); + sub_81B8D64(3, 1); + + gBattlePartyID[0] = 0; + gBattlePartyID[1] = 0; + gBattlePartyID[2] = 3; + gBattlePartyID[3] = 3; + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + gBattleMainFunc = BeginBattleIntro; + + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + gBattleBankFunc[0] = SetBankFuncToSafariBufferRunCommand; + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + gBattleBankFunc[0] = SetBankFuncToWallyBufferRunCommand; + else + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gNoOfAllBanks = 2; + + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + { + if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + { + if (gBattleTypeFlags & BATTLE_TYPE_x80000000) + { + gBattleMainFunc = BeginBattleIntro; + + gBattleBankFunc[0] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToRecordedOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gNoOfAllBanks = 2; + } + else // see how the banks are switched + { + gBattleBankFunc[1] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[0] = SetBankFuncToRecordedOpponentBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1; + + gNoOfAllBanks = 2; + } + } + else + { + gBattleBankFunc[0] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + } + } + } + else + { + gBattleMainFunc = BeginBattleIntro; + + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_PLAYER_MON2; + + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + + gNoOfAllBanks = 4; + + if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + { + gBattleMainFunc = BeginBattleIntro; + + gBattleBankFunc[0] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[0] = 0; + + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = 1; + + gBattleBankFunc[2] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[2] = 2; + + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[3] = 3; + + gNoOfAllBanks = 4; + + sub_81B8D64(0, 0); + sub_81B8D64(1, 0); + sub_81B8D64(2, 1); + sub_81B8D64(3, 1); + + gBattlePartyID[0] = 0; + gBattlePartyID[1] = 0; + gBattlePartyID[2] = 3; + gBattlePartyID[3] = 3; + } + else if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + u8 var; // multiplayer Id in a recorded battle? + + for (var = gUnknown_0203C7B4, i = 0; i < BATTLE_BANKS_COUNT; i++) + { + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + sub_81B8D64(gLinkPlayers[i].lp_field_18, 0); + break; + case 1: + case 2: + sub_81B8D64(gLinkPlayers[i].lp_field_18, 1); + break; + } + + if (i == var) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToRecordedPlayerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON1; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[var].lp_field_18 & 1)) + || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[var].lp_field_18 & 1))) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToRecordedPlayerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON1; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_PLAYER_MON2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToRecordedOpponentBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_OPPONENT_MON1; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = IDENTITY_OPPONENT_MON2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleBankFunc[0] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[2] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_PLAYER_MON2; + + if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + { + gBattleBankFunc[1] = SetBankFuncToRecordedOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[3] = SetBankFuncToRecordedOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + } + else + { + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + } + } + else + { + gBattleBankFunc[1] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[3] = SetBankFuncToRecordedPlayerBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_PLAYER_MON2; + + if (gBattleTypeFlags & BATTLE_TYPE_x2000000) + { + gBattleBankFunc[0] = SetBankFuncToRecordedOpponentBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToRecordedOpponentBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_OPPONENT_MON2; + } + else + { + gBattleBankFunc[0] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_OPPONENT_MON2; + } + } + } + } +} + +static void SetControllersVariablesInLinkBattle(void) +{ + s32 i; + u8 multiplayerId; + + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = BeginBattleIntro; + + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gNoOfAllBanks = 2; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1; + + gNoOfAllBanks = 2; + } + } + else if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI) && gBattleTypeFlags & BATTLE_TYPE_DOUBLE) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = BeginBattleIntro; + + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_PLAYER_MON2; + + gBattleBankFunc[3] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + + gNoOfAllBanks = 4; + } + else + { + gBattleBankFunc[1] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[0] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[3] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_PLAYER_MON2; + + gBattleBankFunc[2] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_OPPONENT_MON2; + + gNoOfAllBanks = 4; + } + } + else if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + { + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + { + gBattleMainFunc = BeginBattleIntro; + + gBattleBankFunc[0] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToLinkPartnerBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_PLAYER_MON2; + + gBattleBankFunc[3] = SetBankFuncToOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + + gNoOfAllBanks = 4; + } + else + { + gBattleBankFunc[0] = SetBankFuncToLinkPartnerBufferRunCommand; + gBanksByIdentity[0] = IDENTITY_PLAYER_MON1; + + gBattleBankFunc[1] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[1] = IDENTITY_OPPONENT_MON1; + + gBattleBankFunc[2] = SetBankFuncToPlayerBufferRunCommand; + gBanksByIdentity[2] = IDENTITY_PLAYER_MON2; + + gBattleBankFunc[3] = SetBankFuncToLinkOpponentBufferRunCommand; + gBanksByIdentity[3] = IDENTITY_OPPONENT_MON2; + + gNoOfAllBanks = 4; + } + + sub_81B8D64(0, 0); + sub_81B8D64(1, 0); + sub_81B8D64(2, 1); + sub_81B8D64(3, 1); + gBattlePartyID[0] = 0; + gBattlePartyID[1] = 0; + gBattlePartyID[2] = 3; + gBattlePartyID[3] = 3; + } + else + { + multiplayerId = GetMultiplayerId(); + + if (gBattleTypeFlags & BATTLE_TYPE_WILD) + gBattleMainFunc = BeginBattleIntro; + + for (i = 0; i < BATTLE_BANKS_COUNT; i++) + { + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + sub_81B8D64(gLinkPlayers[i].lp_field_18, 0); + break; + case 1: + case 2: + sub_81B8D64(gLinkPlayers[i].lp_field_18, 1); + break; + } + + if (i == multiplayerId) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToPlayerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[multiplayerId].lp_field_18 & 1)) + || ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[multiplayerId].lp_field_18 & 1))) + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkPartnerBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 0; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 2; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + else + { + gBattleBankFunc[gLinkPlayers[i].lp_field_18] = SetBankFuncToLinkOpponentBufferRunCommand; + switch (gLinkPlayers[i].lp_field_18) + { + case 0: + case 3: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 1; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 0; + break; + case 1: + case 2: + gBanksByIdentity[gLinkPlayers[i].lp_field_18] = 3; + gBattlePartyID[gLinkPlayers[i].lp_field_18] = 3; + break; + } + } + } + } + + gNoOfAllBanks = 4; + } +} + +static void sub_8033050(void) +{ + s32 i, j; + + if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + for (i = 0; i < gNoOfAllBanks; i++) + { + for (j = 0; j < 6; j++) + { + if (i < 2) + { + if (GET_BANK_SIDE2(i) == SIDE_PLAYER) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0) + { + gBattlePartyID[i] = j; + break; + } + } + } + else + { + if (GET_BANK_SIDE2(i) == SIDE_PLAYER) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != SPECIES_NONE // Probably a typo by Game Freak. The rest use SPECIES2. + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_NONE + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != SPECIES_EGG + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0 + && gBattlePartyID[i - 2] != j) + { + gBattlePartyID[i] = j; + break; + } + } + } + } + } + + if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + gBattlePartyID[1] = 0, gBattlePartyID[3] = 3; + } +} + +void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) +{ + s32 i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + PrepareBufferDataTransferLink(bufferId, size, data); + } + else + { + switch (bufferId) + { + case 0: + for (i = 0; i < size; i++) + { + gBattleBufferA[gActiveBank][i] = *data; + data++; + } + break; + case 1: + for (i = 0; i < size; i++) + { + gBattleBufferB[gActiveBank][i] = *data; + data++; + } + break; + } + } +} + +static void sub_8033244(void) +{ + gUnknown_02022D08 = CreateTask(Task_HandleSendLinkBuffersData, 0); + gTasks[gUnknown_02022D08].data[11] = 0; + gTasks[gUnknown_02022D08].data[12] = 0; + gTasks[gUnknown_02022D08].data[13] = 0; + gTasks[gUnknown_02022D08].data[14] = 0; + gTasks[gUnknown_02022D08].data[15] = 0; + + gUnknown_02022D09 = CreateTask(Task_HandleCopyReceivedLinkBuffersData, 0); + gTasks[gUnknown_02022D09].data[12] = 0; + gTasks[gUnknown_02022D09].data[13] = 0; + gTasks[gUnknown_02022D09].data[14] = 0; + gTasks[gUnknown_02022D09].data[15] = 0; + + gUnknown_02022D0A = 0; +} + +enum +{ + LINK_BUFF_BUFFER_ID, + LINK_BUFF_ACTIVE_BANK, + LINK_BUFF_ATTACKER, + LINK_BUFF_TARGET, + LINK_BUFF_SIZE_LO, + LINK_BUFF_SIZE_HI, + LINK_BUFF_ABSENT_BANK_FLAGS, + LINK_BUFF_EFFECT_BANK, + LINK_BUFF_DATA +}; + +void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data) +{ + s32 alignedSize; + s32 i; + + alignedSize = size - size % 4 + 4; + if (gTasks[gUnknown_02022D08].data[14] + alignedSize + LINK_BUFF_DATA + 1 > BATTLE_BUFFER_LINK_SIZE) + { + gTasks[gUnknown_02022D08].data[12] = gTasks[gUnknown_02022D08].data[14]; + gTasks[gUnknown_02022D08].data[14] = 0; + } + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_BUFFER_ID] = bufferId; + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ACTIVE_BANK] = gActiveBank; + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ATTACKER] = gBankAttacker; + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_TARGET] = gBankTarget; + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_SIZE_LO] = alignedSize; + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_SIZE_HI] = (alignedSize & 0x0000FF00) >> 8; + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_ABSENT_BANK_FLAGS] = gAbsentBankFlags; + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_EFFECT_BANK] = gEffectBank; + + for (i = 0; i < size; i++) + gLinkBattleSendBuffer[gTasks[gUnknown_02022D08].data[14] + LINK_BUFF_DATA + i] = data[i]; + + gTasks[gUnknown_02022D08].data[14] = gTasks[gUnknown_02022D08].data[14] + alignedSize + LINK_BUFF_DATA; +} + +static void Task_HandleSendLinkBuffersData(u8 taskId) +{ + u16 var; + u16 blockSize; + + switch (gTasks[taskId].data[11]) + { + case 0: + gTasks[taskId].data[10] = 100; + gTasks[taskId].data[11]++; + break; + case 1: + gTasks[taskId].data[10]--; + if (gTasks[taskId].data[10] == 0) + gTasks[taskId].data[11]++; + break; + case 2: + if (gLinkVSyncDisabled) + { + gTasks[taskId].data[11]++; + } + else + { + if (gBattleTypeFlags & BATTLE_TYPE_BATTLE_TOWER) + var = 2; + else + var = (gBattleTypeFlags & BATTLE_TYPE_MULTI) ? 4 : 2; + + if (sub_800ABAC() >= var) + { + if (sub_800ABBC()) + { + sub_800A620(); + gTasks[taskId].data[11]++; + } + else + { + gTasks[taskId].data[11]++; + } + } + } + break; + case 3: + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[13] == 0) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + blockSize = (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8)) + LINK_BUFF_DATA; + SendBlock(bitmask_all_link_players_but_self(), &gLinkBattleSendBuffer[gTasks[taskId].data[15]], blockSize); + gTasks[taskId].data[11]++; + } + else + { + gTasks[taskId].data[13]--; + break; + } + } + break; + case 4: + if (sub_800A520()) + { + blockSize = gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleSendBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8); + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA; + gTasks[taskId].data[11] = 3; + } + break; + case 5: + gTasks[taskId].data[13]--; + if (gTasks[taskId].data[13] == 0) + { + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[11] = 3; + } + break; + } +} + +// fix me +void sub_8033648(void) +{ + u8 i; + s32 j; + u16 r6; + u8 *recvBuffer; + u8 *dest; + u8 *src; + + if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & BATTLE_TYPE_20)) + { + sub_8011BD0(); + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (GetBlockReceivedStatus() & gBitTable[i]) + { + ResetBlockReceivedFlag(i); + recvBuffer = (u8 *)gBlockRecvBuffer[i]; + #ifndef NONMATCHING + asm(""); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; + #endif + r6 = gBlockRecvBuffer[i][2]; + + if (gTasks[gUnknown_02022D09].data[14] + 9 + r6 > 0x1000) + { + gTasks[gUnknown_02022D09].data[12] = gTasks[gUnknown_02022D09].data[14]; + gTasks[gUnknown_02022D09].data[14] = 0; + } + + dest = &gLinkBattleRecvBuffer[gTasks[gUnknown_02022D09].data[14]]; + src = recvBuffer; + + for (j = 0; j < r6 + 8; j++) + dest[j] = src[j]; + + gTasks[gUnknown_02022D09].data[14] = gTasks[gUnknown_02022D09].data[14] + r6 + 8; + } + } + } +} + +static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) +{ + u16 blockSize; + u8 bank; + u8 var; + + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + bank = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_ACTIVE_BANK]; + blockSize = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_LO] | (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_SIZE_HI] << 8); + + switch (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 0]) + { + case 0: + if (gBattleExecBuffer & gBitTable[bank]) + return; + + memcpy(gBattleBufferA[bank], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 8], blockSize); + sub_803F850(bank); + + if (!(gBattleTypeFlags & BATTLE_TYPE_WILD)) + { + gBankAttacker = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 2]; + gBankTarget = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 3]; + gAbsentBankFlags = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 6]; + gEffectBank = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 7]; + } + break; + case 1: + memcpy(gBattleBufferB[bank], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 8], blockSize); + break; + case 2: + var = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA]; + gBattleExecBuffer &= ~(gBitTable[bank] << (var * 4)); + break; + } + + gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA; + } +} diff --git a/src/battle_util.c b/src/battle_util.c index c6762dd99..636e27bdf 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -353,7 +353,7 @@ void sub_803F850(u8 arg0) { s32 i; - for (i = 0; i < sub_8009FCC(); i++) + for (i = 0; i < GetLinkPlayerCount(); i++) gBattleExecBuffer |= gBitTable[arg0] << (i << 2); gBattleExecBuffer &= ~(0x10000000 << arg0); -- cgit v1.2.3 From cc847132496af6034a56838e6e8e7575bbda7648 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 13 Oct 2017 11:47:17 -0400 Subject: sub_8121B1C --- src/mail.c | 113 ++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 42 deletions(-) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index 0c3e85cc3..48dc7eba0 100644 --- a/src/mail.c +++ b/src/mail.c @@ -27,10 +27,8 @@ struct UnkMailStruct { u32 unk_0_0:2; - u32 unk_0_2:2; - u32 unk_0_4:4; - u32 unk_1_0:4; - u32 unk_1_4:1; + u32 unk_0_2:6; + u32 unk_1:8; }; struct MailLayout @@ -38,9 +36,8 @@ struct MailLayout u8 var0; u8 var1; u8 var2; - u8 var3_0:4; - u8 var3_4:4; - u32 var4; + u8 var3; + u8 var4; const struct UnkMailStruct *var8; }; @@ -52,7 +49,7 @@ struct Unk203A134 /*0x0210*/ MainCallback callback2; /*0x0214*/ struct MailStruct *mail; /*0x0218*/ bool8 flag; - /*0x0219*/ u8 unk_0219; + /*0x0219*/ u8 signatureWidth; /*0x021a*/ u8 mailType; /*0x021b*/ u8 unk_021b; /*0x021c*/ u8 unk_021c; @@ -200,47 +197,47 @@ const struct MailGraphics gUnknown_0859F2B8[] = { }; const struct UnkMailStruct Unknown_0859F3A8[] = { - { .unk_0_0 = 3, .unk_1_4 = TRUE }, - { .unk_0_0 = 3, .unk_1_4 = TRUE }, - { .unk_0_0 = 3, .unk_1_4 = TRUE } + { .unk_0_0 = 3, .unk_1 = 16 }, + { .unk_0_0 = 3, .unk_1 = 16 }, + { .unk_0_0 = 3, .unk_1 = 16 } }; const struct MailLayout gUnknown_0859F3B4[] = { - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x08, 0x00, 0x2, 0x0, 0x04, Unknown_0859F3A8 }, - { 0x03, 0x00, 0x00, 0x2, 0x0, 0x00, Unknown_0859F3A8 } + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x08, 0x00, 0x02, 0x04, Unknown_0859F3A8 }, + { 0x03, 0x00, 0x00, 0x02, 0x00, Unknown_0859F3A8 } }; const struct UnkMailStruct Unknown_0859F444[] = { - { .unk_0_0 = 2, .unk_1_4 = TRUE }, - { .unk_0_0 = 2, .unk_1_4 = TRUE }, - { .unk_0_0 = 2, .unk_1_4 = TRUE }, - { .unk_0_0 = 2, .unk_1_4 = TRUE }, - { .unk_0_0 = 1, .unk_1_4 = TRUE } + { .unk_0_0 = 2, .unk_1 = 16 }, + { .unk_0_0 = 2, .unk_1 = 16 }, + { .unk_0_0 = 2, .unk_1 = 16 }, + { .unk_0_0 = 2, .unk_1 = 16 }, + { .unk_0_0 = 1, .unk_1 = 16 } }; const struct MailLayout gUnknown_0859F458[] = { - { 0x05, 0x07, 0x58, 0xb, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0a, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0c, 0x68, 0x5, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x05, 0x60, 0x8, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0a, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x70, 0x5, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0c, 0x68, 0x9, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x0d, 0x68, 0xd, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x60, 0x9, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x11, 0x68, 0xf, 0x0, 0x1e, Unknown_0859F444 }, - { 0x05, 0x09, 0x60, 0x5, 0x0, 0x1e, Unknown_0859F444 } + { 0x05, 0x07, 0x58, 0x0b, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0c, 0x68, 0x05, 0x1e, Unknown_0859F444 }, + { 0x05, 0x05, 0x60, 0x08, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0a, 0x60, 0x09, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x70, 0x05, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0c, 0x68, 0x09, 0x1e, Unknown_0859F444 }, + { 0x05, 0x0d, 0x68, 0x0d, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x60, 0x09, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x60, 0x09, 0x1e, Unknown_0859F444 }, + { 0x05, 0x11, 0x68, 0x0f, 0x1e, Unknown_0859F444 }, + { 0x05, 0x09, 0x60, 0x05, 0x1e, Unknown_0859F444 } }; // What the heck are these meant to be? Call them u16 for now. @@ -481,11 +478,43 @@ void sub_8121A1C(void) if (!gUnknown_0203A134->playerIsSender) { StringCopy(ptr, gText_FromSpace); - gUnknown_0203A134->unk_0219 = gUnknown_0203A134->layout->var2 - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60); + gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->var2 - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60); } else { sub_81DB52C(gUnknown_0203A134->playerName); - gUnknown_0203A134->unk_0219 = gUnknown_0203A134->layout->var2; + gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->var2; } } + +void sub_8121B1C(void) +{ + u16 i; + u8 strbuf[0x20]; + u8 y; + u8 *bufptr; + s32 box_x; + s32 box_y; + + y = 0; + PutWindowTilemap(0); + PutWindowTilemap(1); + FillWindowPixelBuffer(0, 0); + FillWindowPixelBuffer(1, 0); + for (i = 0; i < gUnknown_0203A134->layout->var0; i ++) + { + if (gUnknown_0203A134->strbuf[i][0] == EOS || gUnknown_0203A134->strbuf[i][0] == CHAR_SPACE) + { + continue; + } + box_print(0, 1, gUnknown_0203A134->layout->var8[i].unk_0_2 + gUnknown_0203A134->layout->var4, y + gUnknown_0203A134->layout->var3, gUnknown_0859F2AC, 0, gUnknown_0203A134->strbuf[i]); + y += gUnknown_0203A134->layout->var8[i].unk_1; + } + bufptr = StringCopy(strbuf, gText_FromSpace); + StringCopy(bufptr, gUnknown_0203A134->playerName); + box_x = GetStringCenterAlignXOffset(1, strbuf, gUnknown_0203A134->signatureWidth) + 0x68; + box_y = gUnknown_0203A134->layout->var1 + 0x58; + box_print(0, 1, box_x, box_y, gUnknown_0859F2AC, 0, strbuf); + CopyWindowToVram(0, 3); + CopyWindowToVram(1, 3); +} -- cgit v1.2.3 From 32168adbc884f49da522b77900ea9a131df96f15 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 13 Oct 2017 12:03:15 -0400 Subject: Remaining functions --- src/mail.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 68 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index 48dc7eba0..bcb08b49d 100644 --- a/src/mail.c +++ b/src/mail.c @@ -51,8 +51,8 @@ struct Unk203A134 /*0x0218*/ bool8 flag; /*0x0219*/ u8 signatureWidth; /*0x021a*/ u8 mailType; - /*0x021b*/ u8 unk_021b; - /*0x021c*/ u8 unk_021c; + /*0x021b*/ u8 animsActive; + /*0x021c*/ u8 monIconSprite; /*0x021d*/ u8 language; /*0x021e*/ bool8 playerIsSender; /*0x0220*/ void (*parserSingle)(u8 *dest, u16 word); @@ -85,6 +85,8 @@ void sub_8121B1C(void); void sub_8121C50(void); void sub_8121C64(void); void sub_8121C98(void); +void sub_8121CC0(void); +void sub_8121D00(void); // .rodata @@ -299,19 +301,19 @@ void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) { switch (gUnknown_0203A134->mailType) { default: - gUnknown_0203A134->unk_021b = 0; + gUnknown_0203A134->animsActive = 0; break; case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL: - gUnknown_0203A134->unk_021b = 1; + gUnknown_0203A134->animsActive = 1; break; case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL: - gUnknown_0203A134->unk_021b = 2; + gUnknown_0203A134->animsActive = 2; break; } } else { - gUnknown_0203A134->unk_021b = 0; + gUnknown_0203A134->animsActive = 0; } gUnknown_0203A134->mail = mail; gUnknown_0203A134->callback = callback; @@ -422,15 +424,15 @@ bool8 sub_81215EC(void) break; case 17: icon = sub_80D2E84(gUnknown_0203A134->mail->species); - switch (gUnknown_0203A134->unk_021b) + switch (gUnknown_0203A134->animsActive) { case 1: sub_80D2F68(icon); - gUnknown_0203A134->unk_021c = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0); + gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x60, 0x80, 0, 0); break; case 2: sub_80D2F68(icon); - gUnknown_0203A134->unk_021c = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0); + gUnknown_0203A134->monIconSprite = sub_80D2D78(icon, SpriteCallbackDummy, 0x28, 0x80, 0, 0); break; } break; @@ -518,3 +520,60 @@ void sub_8121B1C(void) CopyWindowToVram(0, 3); CopyWindowToVram(1, 3); } + +void sub_8121C50(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void sub_8121C64(void) +{ + if (gUnknown_0203A134->animsActive != 0) + { + AnimateSprites(); + BuildOamBuffer(); + } + gUnknown_0203A134->callback2(); +} + +void sub_8121C98(void) +{ + if (!UpdatePaletteFade()) + { + gUnknown_0203A134->callback2 = sub_8121CC0; + } +} + +void sub_8121CC0(void) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gUnknown_0203A134->callback2 = sub_8121D00; + } +} + +void sub_8121D00(void) +{ + if (!UpdatePaletteFade()) + { + SetMainCallback2(gUnknown_0203A134->callback); + switch (gUnknown_0203A134->animsActive) + { + case 1: + case 2: + sub_80D2FF0(sub_80D2E84(gUnknown_0203A134->mail->species)); + sub_80D2EF8(&gSprites[gUnknown_0203A134->monIconSprite]); + } + memset(gUnknown_0203A134, 0, sizeof(*gUnknown_0203A134)); + ResetPaletteFade(); + UnsetBgTilemapBuffer(0); + UnsetBgTilemapBuffer(1); + ResetBgsAndClearDma3BusyFlags(0); + FreeAllWindowBuffers(); + free(gUnknown_0203A134); + gUnknown_0203A134 = NULL; + } +} -- cgit v1.2.3 From dea018323f6a16d964359df8d9628e8f21740ba9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 13 Oct 2017 12:05:18 -0400 Subject: Struct pointer in EWRAM --- src/mail.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index bcb08b49d..8d84e3c20 100644 --- a/src/mail.c +++ b/src/mail.c @@ -75,7 +75,7 @@ struct MailGraphics // Static RAM declarations -EWRAM_DATA struct Unk203A134 *gUnknown_0203A134; +static EWRAM_DATA struct Unk203A134 *gUnknown_0203A134 = NULL; // Static ROM declarations -- cgit v1.2.3 From 1112af4e1905135a7bc2dd53353b52762ff7d49a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 13 Oct 2017 12:19:51 -0400 Subject: Field labels --- src/mail.c | 84 ++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 41 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/mail.c b/src/mail.c index 8d84e3c20..a39142892 100644 --- a/src/mail.c +++ b/src/mail.c @@ -26,22 +26,35 @@ struct UnkMailStruct { - u32 unk_0_0:2; - u32 unk_0_2:6; - u32 unk_1:8; + u32 numEasyChatWords:2; + u32 xOffset:6; + u32 lineHeight:8; }; struct MailLayout { - u8 var0; - u8 var1; - u8 var2; - u8 var3; - u8 var4; + u8 numSubStructs; + u8 signatureYPos; + u8 signatureWidth; + u8 wordsXPos; + u8 wordsYPos; const struct UnkMailStruct *var8; }; -struct Unk203A134 +struct MailGraphics +{ + const u16 *palette; + const u8 *tiles; + const u8 *tileMap; + u16 var0C; + u16 var0E; + u16 color10; + u16 color12; +}; + +// Static RAM declarations + +static EWRAM_DATA struct { /*0x0000*/ u8 strbuf[8][64]; /*0x0200*/ u8 playerName[12]; @@ -60,22 +73,7 @@ struct Unk203A134 /*0x0228*/ const struct MailLayout *layout; /*0x022c*/ u8 bg1TilemapBuffer[0x1000]; /*0x122c*/ u8 bg2TilemapBuffer[0x1000]; -}; - -struct MailGraphics -{ - const u16 *palette; - const u8 *tiles; - const u8 *tileMap; - u16 var0C; - u16 var0E; - u16 color10; - u16 color12; -}; - -// Static RAM declarations - -static EWRAM_DATA struct Unk203A134 *gUnknown_0203A134 = NULL; +} *gUnknown_0203A134 = NULL; // Static ROM declarations @@ -199,9 +197,9 @@ const struct MailGraphics gUnknown_0859F2B8[] = { }; const struct UnkMailStruct Unknown_0859F3A8[] = { - { .unk_0_0 = 3, .unk_1 = 16 }, - { .unk_0_0 = 3, .unk_1 = 16 }, - { .unk_0_0 = 3, .unk_1 = 16 } + { .numEasyChatWords = 3, .lineHeight = 16 }, + { .numEasyChatWords = 3, .lineHeight = 16 }, + { .numEasyChatWords = 3, .lineHeight = 16 } }; const struct MailLayout gUnknown_0859F3B4[] = { @@ -220,11 +218,11 @@ const struct MailLayout gUnknown_0859F3B4[] = { }; const struct UnkMailStruct Unknown_0859F444[] = { - { .unk_0_0 = 2, .unk_1 = 16 }, - { .unk_0_0 = 2, .unk_1 = 16 }, - { .unk_0_0 = 2, .unk_1 = 16 }, - { .unk_0_0 = 2, .unk_1 = 16 }, - { .unk_0_0 = 1, .unk_1 = 16 } + { .numEasyChatWords = 2, .lineHeight = 16 }, + { .numEasyChatWords = 2, .lineHeight = 16 }, + { .numEasyChatWords = 2, .lineHeight = 16 }, + { .numEasyChatWords = 2, .lineHeight = 16 }, + { .numEasyChatWords = 1, .lineHeight = 16 } }; const struct MailLayout gUnknown_0859F458[] = { @@ -272,7 +270,7 @@ void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) { u16 buffer[2]; u16 species; - gUnknown_0203A134 = calloc(1, sizeof(struct Unk203A134)); + gUnknown_0203A134 = calloc(1, sizeof(*gUnknown_0203A134)); gUnknown_0203A134->language = LANGUAGE_ENGLISH; gUnknown_0203A134->playerIsSender = TRUE; gUnknown_0203A134->parserSingle = CopyEasyChatWord; @@ -471,21 +469,21 @@ void sub_8121A1C(void) u8 *ptr; total = 0; - for (i = 0; i < gUnknown_0203A134->layout->var0; i ++) + for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++) { - ConvertEasyChatWordsToString(gUnknown_0203A134->strbuf[i], &gUnknown_0203A134->mail->words[total], gUnknown_0203A134->layout->var8[i].unk_0_0, 1); - total += gUnknown_0203A134->layout->var8[i].unk_0_0; + ConvertEasyChatWordsToString(gUnknown_0203A134->strbuf[i], &gUnknown_0203A134->mail->words[total], gUnknown_0203A134->layout->var8[i].numEasyChatWords, 1); + total += gUnknown_0203A134->layout->var8[i].numEasyChatWords; } ptr = StringCopy(gUnknown_0203A134->playerName, gUnknown_0203A134->mail->playerName); if (!gUnknown_0203A134->playerIsSender) { StringCopy(ptr, gText_FromSpace); - gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->var2 - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60); + gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth - (StringLength(gUnknown_0203A134->playerName) * 8 - 0x60); } else { sub_81DB52C(gUnknown_0203A134->playerName); - gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->var2; + gUnknown_0203A134->signatureWidth = gUnknown_0203A134->layout->signatureWidth; } } @@ -503,19 +501,19 @@ void sub_8121B1C(void) PutWindowTilemap(1); FillWindowPixelBuffer(0, 0); FillWindowPixelBuffer(1, 0); - for (i = 0; i < gUnknown_0203A134->layout->var0; i ++) + for (i = 0; i < gUnknown_0203A134->layout->numSubStructs; i ++) { if (gUnknown_0203A134->strbuf[i][0] == EOS || gUnknown_0203A134->strbuf[i][0] == CHAR_SPACE) { continue; } - box_print(0, 1, gUnknown_0203A134->layout->var8[i].unk_0_2 + gUnknown_0203A134->layout->var4, y + gUnknown_0203A134->layout->var3, gUnknown_0859F2AC, 0, gUnknown_0203A134->strbuf[i]); - y += gUnknown_0203A134->layout->var8[i].unk_1; + box_print(0, 1, gUnknown_0203A134->layout->var8[i].xOffset + gUnknown_0203A134->layout->wordsYPos, y + gUnknown_0203A134->layout->wordsXPos, gUnknown_0859F2AC, 0, gUnknown_0203A134->strbuf[i]); + y += gUnknown_0203A134->layout->var8[i].lineHeight; } bufptr = StringCopy(strbuf, gText_FromSpace); StringCopy(bufptr, gUnknown_0203A134->playerName); box_x = GetStringCenterAlignXOffset(1, strbuf, gUnknown_0203A134->signatureWidth) + 0x68; - box_y = gUnknown_0203A134->layout->var1 + 0x58; + box_y = gUnknown_0203A134->layout->signatureYPos + 0x58; box_print(0, 1, box_x, box_y, gUnknown_0859F2AC, 0, strbuf); CopyWindowToVram(0, 3); CopyWindowToVram(1, 3); -- cgit v1.2.3 From 20d158cf4a17e8d362cdafbf13906c59d9916e24 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 13 Oct 2017 19:46:27 +0200 Subject: start decompiling emitters --- src/battle_controllers.c | 254 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) (limited to 'src') diff --git a/src/battle_controllers.c b/src/battle_controllers.c index cfa4aae71..58a595730 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -9,6 +9,8 @@ #include "species.h" #include "recorded_battle.h" #include "util.h" +#include "abilities.h" +#include "battle_message.h" extern u32 gBattleTypeFlags; extern u32 gBattleExecBuffer; @@ -25,6 +27,7 @@ extern u8 gUnknown_0203C7B4; extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; extern u8 gBattleBufferA[BATTLE_BANKS_COUNT][0x200]; extern u8 gBattleBufferB[BATTLE_BANKS_COUNT][0x200]; +extern u8 gBattleBuffersTransferData[0x100]; extern u8 gUnknown_02022D08; extern u8 gUnknown_02022D09; extern u8 gUnknown_02022D0A; @@ -32,6 +35,9 @@ extern u8 gBankAttacker; extern u8 gBankTarget; extern u8 gAbsentBankFlags; extern u8 gEffectBank; +extern u16 gBattleWeather; + +extern const struct BattleMove gBattleMoves[]; extern void task00_08081A90(u8 taskId); // cable_club extern void sub_81B8D64(u8 bank, u8 arg1); // party_menu @@ -926,3 +932,251 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA; } } + +void EmitGetMonData(u8 bufferId, u8 arg1, u8 arg2) +{ + gBattleBuffersTransferData[0] = CONTROLLER_GETMONDATA; + gBattleBuffersTransferData[1] = arg1; + gBattleBuffersTransferData[2] = arg2; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitGetRawMonData(u8 bufferId, u8 monId, u8 bytes) +{ + gBattleBuffersTransferData[0] = CONTROLLER_GETRAWMONDATA; + gBattleBuffersTransferData[1] = monId; + gBattleBuffersTransferData[2] = bytes; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitSetMonData(u8 bufferId, u8 request, u8 c, u8 bytes, void *data) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_SETMONDATA; + gBattleBuffersTransferData[1] = request; + gBattleBuffersTransferData[2] = c; + for (i = 0; i < bytes; i++) + gBattleBuffersTransferData[3 + i] = *(u8*)(data++); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 3 + bytes); +} + +void EmitSetRawMonData(u8 bufferId, u8 monId, u8 bytes, void *data) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_SETRAWMONDATA; + gBattleBuffersTransferData[1] = monId; + gBattleBuffersTransferData[2] = bytes; + for (i = 0; i < bytes; i++) + gBattleBuffersTransferData[3 + i] = *(u8*)(data++); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, bytes + 3); +} + +void EmitLoadMonSprite(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_LOADMONSPRITE; + gBattleBuffersTransferData[1] = 4; + gBattleBuffersTransferData[2] = 4; + gBattleBuffersTransferData[3] = 4; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit) +{ + gBattleBuffersTransferData[0] = CONTROLLER_SWITCHINANIM; + gBattleBuffersTransferData[1] = partyId; + gBattleBuffersTransferData[2] = dontClearSubstituteBit; + gBattleBuffersTransferData[3] = 5; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +// TODO: change Poke to Mon to be consistent +void EmitReturnPokeToBall(u8 bufferId, u8 arg1) +{ + gBattleBuffersTransferData[0] = CONTROLLER_RETURNPOKETOBALL; + gBattleBuffersTransferData[1] = arg1; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2); +} + +void EmitDrawTrainerPic(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_DRAWTRAINERPIC; + gBattleBuffersTransferData[1] = 7; + gBattleBuffersTransferData[2] = 7; + gBattleBuffersTransferData[3] = 7; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitTrainerSlide(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDE; + gBattleBuffersTransferData[1] = 8; + gBattleBuffersTransferData[2] = 8; + gBattleBuffersTransferData[3] = 8; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitTrainerSlideBack(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_TRAINERSLIDEBACK; + gBattleBuffersTransferData[1] = 9; + gBattleBuffersTransferData[2] = 9; + gBattleBuffersTransferData[3] = 9; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitFaintAnimation(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_FAINTANIMATION; + gBattleBuffersTransferData[1] = 10; + gBattleBuffersTransferData[2] = 10; + gBattleBuffersTransferData[3] = 10; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd11(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_11; + gBattleBuffersTransferData[1] = 11; + gBattleBuffersTransferData[2] = 11; + gBattleBuffersTransferData[3] = 11; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd12(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_12; + gBattleBuffersTransferData[1] = 12; + gBattleBuffersTransferData[2] = 12; + gBattleBuffersTransferData[3] = 12; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitBallThrow(u8 bufferId, u8 caseId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_BALLTHROW; + gBattleBuffersTransferData[1] = caseId; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2); +} + +void EmitPause(u8 bufferId, u8 toWait, void *data) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_PAUSE; + gBattleBuffersTransferData[1] = toWait; + for (i = 0; i < toWait * 3; i++) + gBattleBuffersTransferData[2 + i] = *(u8*)(data++); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, toWait * 3 + 2); +} + +void EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 dmg, u8 friendship, struct DisableStruct *disableStructPtr, u8 multihit) +{ + gBattleBuffersTransferData[0] = CONTROLLER_MOVEANIMATION; + gBattleBuffersTransferData[1] = move; + gBattleBuffersTransferData[2] = (move & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = turnOfMove; + gBattleBuffersTransferData[4] = movePower; + gBattleBuffersTransferData[5] = (movePower & 0xFF00) >> 8; + gBattleBuffersTransferData[6] = dmg; + gBattleBuffersTransferData[7] = (dmg & 0x0000FF00) >> 8; + gBattleBuffersTransferData[8] = (dmg & 0x00FF0000) >> 16; + gBattleBuffersTransferData[9] = (dmg & 0xFF000000) >> 24; + gBattleBuffersTransferData[10] = friendship; + gBattleBuffersTransferData[11] = multihit; + if (WEATHER_HAS_EFFECT2) + { + gBattleBuffersTransferData[12] = gBattleWeather; + gBattleBuffersTransferData[13] = (gBattleWeather & 0xFF00) >> 8; + } + else + { + gBattleBuffersTransferData[12] = 0; + gBattleBuffersTransferData[13] = 0; + } + gBattleBuffersTransferData[14] = 0; + gBattleBuffersTransferData[15] = 0; + memcpy(&gBattleBuffersTransferData[16], disableStructPtr, sizeof(struct DisableStruct)); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 16 + sizeof(struct DisableStruct)); +} + +extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; +extern u16 gCurrentMove; +extern u16 gLastUsedMove; +extern u16 gLastUsedItem; +extern u8 gBattleOutcome; +extern u8 gLastUsedAbility; +extern u8 gStringBank; + +void EmitPrintString(u8 bufferId, u16 stringID) +{ + s32 i; + struct StringInfoBattle* stringInfo; + + gBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRING; + gBattleBuffersTransferData[1] = gBattleOutcome; + gBattleBuffersTransferData[2] = stringID; + gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; + + stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); + stringInfo->currentMove = gCurrentMove; + stringInfo->lastMove = gLastUsedMove; + stringInfo->lastItem = gLastUsedItem; + stringInfo->lastAbility = gLastUsedAbility; + stringInfo->scrActive = gBattleScripting.bank; + stringInfo->unk1605E = gBattleStruct->field_52; + stringInfo->hpScale = gBattleStruct->hpScale; + stringInfo->StringBank = gStringBank; + stringInfo->moveType = gBattleMoves[gCurrentMove].type; + + for (i = 0; i < BATTLE_BANKS_COUNT; i++) + stringInfo->abilities[i] = gBattleMons[i].ability; + for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++) + { + stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; + stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; + stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; + } + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); +} + +void EmitPrintStringPlayerOnly(u8 bufferId, u16 stringID) +{ + s32 i; + struct StringInfoBattle* stringInfo; + + gBattleBuffersTransferData[0] = CONTROLLER_PRINTSTRINGPLAYERONLY; + gBattleBuffersTransferData[1] = 17; + gBattleBuffersTransferData[2] = stringID; + gBattleBuffersTransferData[3] = (stringID & 0xFF00) >> 8; + + stringInfo = (struct StringInfoBattle*)(&gBattleBuffersTransferData[4]); + stringInfo->currentMove = gCurrentMove; + stringInfo->lastMove = gLastUsedMove; + stringInfo->lastItem = gLastUsedItem; + stringInfo->lastAbility = gLastUsedAbility; + stringInfo->scrActive = gBattleScripting.bank; + stringInfo->unk1605E = gBattleStruct->field_52; + + for (i = 0; i < BATTLE_BANKS_COUNT; i++) + stringInfo->abilities[i] = gBattleMons[i].ability; + for (i = 0; i < TEXT_BUFF_ARRAY_COUNT; i++) + { + stringInfo->textBuffs[0][i] = gBattleTextBuff1[i]; + stringInfo->textBuffs[1][i] = gBattleTextBuff2[i]; + stringInfo->textBuffs[2][i] = gBattleTextBuff3[i]; + } + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(struct StringInfoBattle) + 4); +} + +void EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2) +{ + gBattleBuffersTransferData[0] = CONTROLLER_CHOOSEACTION; + gBattleBuffersTransferData[1] = arg1; + gBattleBuffersTransferData[2] = arg2; + gBattleBuffersTransferData[3] = (arg2 & 0xFF00) >> 8; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} -- cgit v1.2.3 From 14e41d6c508e5c425dff8f2c4933ae4c8b7ab762 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Oct 2017 11:34:26 +0200 Subject: rom3 is decompiled --- src/battle_2.c | 4 +- src/battle_ai_switch_items.c | 18 +- src/battle_controllers.c | 407 +++++++++++++++++++++++++++++++++++++++++-- src/battle_script_commands.c | 34 ++-- 4 files changed, 416 insertions(+), 47 deletions(-) (limited to 'src') diff --git a/src/battle_2.c b/src/battle_2.c index 7db3fd38e..16c07114a 100644 --- a/src/battle_2.c +++ b/src/battle_2.c @@ -4080,7 +4080,7 @@ static void HandleTurnActionSelectionState(void) if (gBattleMons[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].status2 & STATUS2_MULTIPLETURNS || gBattleMons[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)].status2 & STATUS2_RECHARGE) { - Emit_x32(0); + EmitCmd50(0); MarkBufferBankForExecution(gActiveBank); return; } @@ -4108,7 +4108,7 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBankAction(GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON), 3); } - Emit_x32(0); + EmitCmd50(0); MarkBufferBankForExecution(gActiveBank); return; } diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 661759a98..d86be6fad 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -39,7 +39,7 @@ static bool8 ShouldSwitchIfPerishSong(void) && gDisableStructs[gActiveBank].perishSong1 == 0) { *(gBattleStruct->field_294 + gActiveBank) = 6; - EmitCmd_x21(1, 2, 0); + EmitCmd33(1, 2, 0); return TRUE; } @@ -121,7 +121,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) { // we found a mon *(gBattleStruct->field_294 + gActiveBank) = i; - EmitCmd_x21(1, 2, 0); + EmitCmd33(1, 2, 0); return TRUE; } } @@ -221,7 +221,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) { // we found a mon *(gBattleStruct->field_294 + gActiveBank) = i; - EmitCmd_x21(1, 2, 0); + EmitCmd33(1, 2, 0); return TRUE; } } @@ -241,13 +241,13 @@ static bool8 ShouldSwitchIfNaturalCure(void) if ((gUnknown_02024250[gActiveBank] == 0 || gUnknown_02024250[gActiveBank] == 0xFFFF) && Random() & 1) { *(gBattleStruct->field_294 + gActiveBank) = 6; - EmitCmd_x21(1, 2, 0); + EmitCmd33(1, 2, 0); return TRUE; } else if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0 && Random() & 1) { *(gBattleStruct->field_294 + gActiveBank) = 6; - EmitCmd_x21(1, 2, 0); + EmitCmd33(1, 2, 0); return TRUE; } @@ -258,7 +258,7 @@ static bool8 ShouldSwitchIfNaturalCure(void) if (Random() & 1) { *(gBattleStruct->field_294 + gActiveBank) = 6; - EmitCmd_x21(1, 2, 0); + EmitCmd33(1, 2, 0); return TRUE; } @@ -426,7 +426,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % moduloPercent == 0) { *(gBattleStruct->field_294 + gActiveBank) = i; - EmitCmd_x21(1, 2, 0); + EmitCmd33(1, 2, 0); return TRUE; } } @@ -611,7 +611,7 @@ void AI_TrySwitchOrUseItem(void) } } - EmitCmd_x21(1, 0, (gActiveBank ^ BIT_SIDE) << 8); + EmitCmd33(1, 0, (gActiveBank ^ BIT_SIDE) << 8); } #define TYPE_FORESIGHT 0xFE @@ -940,7 +940,7 @@ static bool8 ShouldUseItem(void) if (shouldUse) { - EmitCmd_x21(1, 1, 0); + EmitCmd33(1, 1, 0); *(gBattleStruct->field_C0 + (gActiveBank / 2) * 2) = item; gBattleResources->battleHistory->trainerItems[i] = 0; return shouldUse; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 58a595730..9ac18c72f 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -36,6 +36,13 @@ extern u8 gBankTarget; extern u8 gAbsentBankFlags; extern u8 gEffectBank; extern u16 gBattleWeather; +extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; +extern u16 gCurrentMove; +extern u16 gLastUsedMove; +extern u16 gLastUsedItem; +extern u8 gBattleOutcome; +extern u8 gLastUsedAbility; +extern u8 gStringBank; extern const struct BattleMove gBattleMoves[]; @@ -43,11 +50,10 @@ extern void task00_08081A90(u8 taskId); // cable_club extern void sub_81B8D64(u8 bank, u8 arg1); // party_menu // this file's funcionts -static void sub_8033244(void); +static void CreateTasksForSendRecvLinkBuffers(void); static void SetControllersVariablesInLinkBattle(void); static void SetControllersVariables(void); -static void sub_8033050(void); -void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data); +static void SetBattlePartyIds(void); static void Task_HandleSendLinkBuffersData(u8 taskId); static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId); @@ -60,7 +66,7 @@ void HandleLinkBattleSetup(void) if (!gReceivedRemoteLinkPlayers) sub_8009734(); CreateTask(task00_08081A90, 0); - sub_8033244(); + CreateTasksForSendRecvLinkBuffers(); } } @@ -114,7 +120,7 @@ void sub_8032768(void) else SetControllersVariables(); - sub_8033050(); + SetBattlePartyIds(); if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI)) { @@ -602,7 +608,7 @@ static void SetControllersVariablesInLinkBattle(void) } } -static void sub_8033050(void) +static void SetBattlePartyIds(void) { s32 i, j; @@ -672,7 +678,7 @@ static void sub_8033050(void) } } -void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) +static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) { s32 i; @@ -702,7 +708,7 @@ void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) } } -static void sub_8033244(void) +static void CreateTasksForSendRecvLinkBuffers(void) { gUnknown_02022D08 = CreateTask(Task_HandleSendLinkBuffersData, 0); gTasks[gUnknown_02022D08].data[11] = 0; @@ -993,10 +999,9 @@ void EmitSwitchInAnim(u8 bufferId, u8 partyId, bool8 dontClearSubstituteBit) PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); } -// TODO: change Poke to Mon to be consistent -void EmitReturnPokeToBall(u8 bufferId, u8 arg1) +void EmitReturnMonToBall(u8 bufferId, u8 arg1) { - gBattleBuffersTransferData[0] = CONTROLLER_RETURNPOKETOBALL; + gBattleBuffersTransferData[0] = CONTROLLER_RETURNMONTOBALL; gBattleBuffersTransferData[1] = arg1; PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2); } @@ -1103,14 +1108,6 @@ void EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 movePower, s32 PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 16 + sizeof(struct DisableStruct)); } -extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT]; -extern u16 gCurrentMove; -extern u16 gLastUsedMove; -extern u16 gLastUsedItem; -extern u8 gBattleOutcome; -extern u8 gLastUsedAbility; -extern u8 gStringBank; - void EmitPrintString(u8 bufferId, u16 stringID) { s32 i; @@ -1180,3 +1177,375 @@ void EmitChooseAction(u8 bufferId, u8 arg1, u16 arg2) gBattleBuffersTransferData[3] = (arg2 & 0xFF00) >> 8; PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); } + +void EmitCmd19(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_19; + gBattleBuffersTransferData[1] = 19; + gBattleBuffersTransferData[2] = 19; + gBattleBuffersTransferData[3] = 19; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitChooseMove(u8 bufferId, bool8 isDoubleBattle, bool8 NoPpNumber, struct ChooseMoveStruct *movePpData) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_CHOOSEMOVE; + gBattleBuffersTransferData[1] = isDoubleBattle; + gBattleBuffersTransferData[2] = NoPpNumber; + gBattleBuffersTransferData[3] = 0; + for (i = 0; i < sizeof(*movePpData); i++) + gBattleBuffersTransferData[4 + i] = *((u8*)(movePpData) + i); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(*movePpData) + 4); +} + +void EmitOpenBag(u8 bufferId, u8 *arg1) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_OPENBAG; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[1 + i] = arg1[i]; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitChoosePokemon(u8 bufferId, u8 caseId, u8 arg2, u8 abilityId, u8* arg4) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_CHOOSEPOKEMON; + gBattleBuffersTransferData[1] = caseId; + gBattleBuffersTransferData[2] = arg2; + gBattleBuffersTransferData[3] = abilityId; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[4 + i] = arg4[i]; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 8); // but only 7 bytes were written +} + +void EmitCmd23(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_23; + gBattleBuffersTransferData[1] = 23; + gBattleBuffersTransferData[2] = 23; + gBattleBuffersTransferData[3] = 23; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +// why is the argument u16 if it's being cast to s16 anyway? +void EmitHealthBarUpdate(u8 bufferId, u16 hpValue) +{ + gBattleBuffersTransferData[0] = CONTROLLER_HEALTHBARUPDATE; + gBattleBuffersTransferData[1] = 0; + gBattleBuffersTransferData[2] = (s16)hpValue; + gBattleBuffersTransferData[3] = ((s16)hpValue & 0xFF00) >> 8; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +// why is the argument u16 if it's being cast to s16 anyway? +void EmitExpUpdate(u8 bufferId, u8 partyId, u16 expPoints) +{ + gBattleBuffersTransferData[0] = CONTROLLER_EXPUPDATE; + gBattleBuffersTransferData[1] = partyId; + gBattleBuffersTransferData[2] = (s16)expPoints; + gBattleBuffersTransferData[3] = ((s16)expPoints & 0xFF00) >> 8; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitStatusIconUpdate(u8 bufferId, u32 status1, u32 status2) +{ + gBattleBuffersTransferData[0] = CONTROLLER_STATUSICONUPDATE; + gBattleBuffersTransferData[1] = status1; + gBattleBuffersTransferData[2] = (status1 & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = (status1 & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = (status1 & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = status2; + gBattleBuffersTransferData[6] = (status2 & 0x0000FF00) >> 8; + gBattleBuffersTransferData[7] = (status2 & 0x00FF0000) >> 16; + gBattleBuffersTransferData[8] = (status2 & 0xFF000000) >> 24; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 9); +} + +void EmitStatusAnimation(u8 bufferId, bool8 status2, u32 status) +{ + gBattleBuffersTransferData[0] = CONTROLLER_STATUSANIMATION; + gBattleBuffersTransferData[1] = status2; + gBattleBuffersTransferData[2] = status; + gBattleBuffersTransferData[3] = (status & 0x0000FF00) >> 8; + gBattleBuffersTransferData[4] = (status & 0x00FF0000) >> 16; + gBattleBuffersTransferData[5] = (status & 0xFF000000) >> 24; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 6); +} + +void EmitStatusXor(u8 bufferId, u8 b) +{ + gBattleBuffersTransferData[0] = CONTROLLER_STATUSXOR; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2); +} + +void EmitDataTransfer(u8 bufferId, u16 size, void *data) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_DATATRANSFER; + gBattleBuffersTransferData[1] = 29; + gBattleBuffersTransferData[2] = size; + gBattleBuffersTransferData[3] = (size & 0xFF00) >> 8; + for (i = 0; i < size; i++) + gBattleBuffersTransferData[4 + i] = *(u8*)(data++); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, size + 4); +} + +void EmitDMA3Transfer(u8 bufferId, void *dst, u16 size, void *data) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_DMA3TRANSFER; + gBattleBuffersTransferData[1] = (u32)(dst); + gBattleBuffersTransferData[2] = ((u32)(dst) & 0x0000FF00) >> 8; + gBattleBuffersTransferData[3] = ((u32)(dst) & 0x00FF0000) >> 16; + gBattleBuffersTransferData[4] = ((u32)(dst) & 0xFF000000) >> 24; + gBattleBuffersTransferData[5] = size; + gBattleBuffersTransferData[6] = (size & 0xFF00) >> 8; + for (i = 0; i < size; i++) + gBattleBuffersTransferData[7 + i] = *(u8*)(data++); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, size + 7); +} + +void EmitPlayBGM(u8 bufferId, u16 songId, void *unusedDumbDataParameter) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_31; + gBattleBuffersTransferData[1] = songId; + gBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; + for (i = 0; i < songId; i++) // ???? + gBattleBuffersTransferData[3 + i] = *(u8*)(unusedDumbDataParameter++); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, songId + 3); +} + +void EmitCmd32(u8 bufferId, u16 size, void *data) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_32; + gBattleBuffersTransferData[1] = size; + gBattleBuffersTransferData[2] = (size & 0xFF00) >> 8; + for (i = 0; i < size; i++) + gBattleBuffersTransferData[3 + i] = *(u8*)(data++); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, size + 3); +} + +void EmitCmd33(u8 bufferId, u8 arg1, u16 arg2) +{ + gBattleBuffersTransferData[0] = CONTROLLER_33; + gBattleBuffersTransferData[1] = arg1; + gBattleBuffersTransferData[2] = arg2; + gBattleBuffersTransferData[3] = (arg2 & 0xFF00) >> 8; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd34(u8 bufferId, u8 b, u8 *c) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_34; + gBattleBuffersTransferData[1] = b; + for (i = 0; i < 3; i++) + gBattleBuffersTransferData[2 + i] = c[i]; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 5); +} + +void EmitCmd35(u8 bufferId, u16 b) +{ + gBattleBuffersTransferData[0] = CONTROLLER_35; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd36(u8 bufferId, u16 b) +{ + gBattleBuffersTransferData[0] = CONTROLLER_36; + gBattleBuffersTransferData[1] = b; + gBattleBuffersTransferData[2] = (b & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd37(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_37; + gBattleBuffersTransferData[1] = 37; + gBattleBuffersTransferData[2] = 37; + gBattleBuffersTransferData[3] = 37; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd38(u8 bufferId, u8 b) +{ + gBattleBuffersTransferData[0] = CONTROLLER_38; + gBattleBuffersTransferData[1] = b; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2); +} + +void EmitCmd39(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_39; + gBattleBuffersTransferData[1] = 39; + gBattleBuffersTransferData[2] = 39; + gBattleBuffersTransferData[3] = 39; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd40(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_40; + gBattleBuffersTransferData[1] = 40; + gBattleBuffersTransferData[2] = 40; + gBattleBuffersTransferData[3] = 40; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitHitAnimation(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_HITANIMATION; + gBattleBuffersTransferData[1] = 41; + gBattleBuffersTransferData[2] = 41; + gBattleBuffersTransferData[3] = 41; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd42(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_42; + gBattleBuffersTransferData[1] = 42; + gBattleBuffersTransferData[2] = 42; + gBattleBuffersTransferData[3] = 42; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitEffectivenessSound(u8 bufferId, u16 songId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_EFFECTIVENESSSOUND; + gBattleBuffersTransferData[1] = songId; + gBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = 0; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitPlayFanfareOrBGM(u8 bufferId, u16 songId, bool8 playBGM) +{ + gBattleBuffersTransferData[0] = CONTROLLER_PLAYFANFAREORBGM; + gBattleBuffersTransferData[1] = songId; + gBattleBuffersTransferData[2] = (songId & 0xFF00) >> 8; + gBattleBuffersTransferData[3] = playBGM; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitFaintingCry(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_FAINTINGCRY; + gBattleBuffersTransferData[1] = 45; + gBattleBuffersTransferData[2] = 45; + gBattleBuffersTransferData[3] = 45; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitIntroSlide(u8 bufferId, u8 terrainId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_INTROSLIDE; + gBattleBuffersTransferData[1] = terrainId; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2); +} + +void EmitIntroTrainerBallThrow(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_INTROTRAINERBALLTHROW; + gBattleBuffersTransferData[1] = 47; + gBattleBuffersTransferData[2] = 47; + gBattleBuffersTransferData[3] = 47; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 arg2) +{ + s32 i; + + gBattleBuffersTransferData[0] = CONTROLLER_DRAWPARTYSTATUSSUMMARY; + gBattleBuffersTransferData[1] = arg2 & 0x7F; + gBattleBuffersTransferData[2] = (arg2 & 0x80) >> 7; + gBattleBuffersTransferData[3] = 48; + for (i = 0; i < (s32)(sizeof(struct HpAndStatus) * 6); i++) + gBattleBuffersTransferData[4 + i] = *(i + (u8*)(hpAndStatus)); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, sizeof(struct HpAndStatus) * 6 + 4); +} + +void EmitCmd49(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_49; + gBattleBuffersTransferData[1] = 49; + gBattleBuffersTransferData[2] = 49; + gBattleBuffersTransferData[3] = 49; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitCmd50(u8 bufferId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_50; + gBattleBuffersTransferData[1] = 50; + gBattleBuffersTransferData[2] = 50; + gBattleBuffersTransferData[3] = 50; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible) +{ + gBattleBuffersTransferData[0] = CONTROLLER_SPRITEINVISIBILITY; + gBattleBuffersTransferData[1] = isInvisible; + gBattleBuffersTransferData[2] = 51; + gBattleBuffersTransferData[3] = 51; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitBattleAnimation(u8 bufferId, u8 animationId, u16 argument) +{ + gBattleBuffersTransferData[0] = CONTROLLER_BATTLEANIMATION; + gBattleBuffersTransferData[1] = animationId; + gBattleBuffersTransferData[2] = argument; + gBattleBuffersTransferData[3] = (argument & 0xFF00) >> 8; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 4); +} + +void EmitLinkStandbyMsg(u8 bufferId, u8 arg1, bool32 arg2) +{ + bool8 arg2_ = arg2; + gBattleBuffersTransferData[0] = CONTROLLER_LINKSTANDBYMSG; + gBattleBuffersTransferData[1] = arg1; + + if (arg2_) + gBattleBuffersTransferData[3] = gBattleBuffersTransferData[2] = sub_81850DC(&gBattleBuffersTransferData[4]); + else + gBattleBuffersTransferData[3] = gBattleBuffersTransferData[2] = 0; + + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, gBattleBuffersTransferData[2] + 4); +} + +void EmitResetActionMoveSelection(u8 bufferId, u8 caseId) +{ + gBattleBuffersTransferData[0] = CONTROLLER_RESETACTIONMOVESELECTION; + gBattleBuffersTransferData[1] = caseId; + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, 2); +} + +void EmitCmd55(u8 bufferId, u8 arg1) +{ + gBattleBuffersTransferData[0] = CONTROLLER_55; + gBattleBuffersTransferData[1] = arg1; + gBattleBuffersTransferData[2] = gSaveBlock2Ptr->field_CA9_b; + gBattleBuffersTransferData[3] = gSaveBlock2Ptr->field_CA9_b; + gBattleBuffersTransferData[5] = gBattleBuffersTransferData[4] = sub_81850DC(&gBattleBuffersTransferData[6]); + PrepareBufferDataTransfer(bufferId, gBattleBuffersTransferData, gBattleBuffersTransferData[4] + 6); +} diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index fb6a8272b..a1e5767ad 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -349,7 +349,7 @@ static void atk51_switch_handle_order(void); static void atk52_switch_in_effects(void); static void atk53_trainer_slide(void); static void atk54_effectiveness_sound(void); -static void atk55_play_sound(void); +static void atk55_play_fanfare(void); static void atk56_fainting_cry(void); static void atk57(void); static void atk58_return_to_ball(void); @@ -601,7 +601,7 @@ void (* const gBattleScriptingCommandsTable[])(void) = atk52_switch_in_effects, atk53_trainer_slide, atk54_effectiveness_sound, - atk55_play_sound, + atk55_play_fanfare, atk56_fainting_cry, atk57, atk58_return_to_ball, @@ -5308,7 +5308,7 @@ static void atk4B_return_atk_to_ball(void) gActiveBank = gBankAttacker; if (!(gHitMarker & HITMARKER_FAINTED(gActiveBank))) { - EmitReturnPokeToBall(0, 0); + EmitReturnMonToBall(0, 0); MarkBufferBankForExecution(gActiveBank); } gBattlescriptCurrInstr++; @@ -5627,7 +5627,7 @@ static void atk50_openpartyscreen(void) { gAbsentBankFlags |= gBitTable[gActiveBank]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); - Emit_x2A(0); + EmitCmd42(0); MarkBufferBankForExecution(gActiveBank); } else if (!gSpecialStatuses[gActiveBank].flag40) @@ -5649,7 +5649,7 @@ static void atk50_openpartyscreen(void) { gAbsentBankFlags |= gBitTable[gActiveBank]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); - Emit_x2A(0); + EmitCmd42(0); MarkBufferBankForExecution(gActiveBank); } else if (!gSpecialStatuses[gActiveBank].flag40) @@ -5670,7 +5670,7 @@ static void atk50_openpartyscreen(void) { gAbsentBankFlags |= gBitTable[gActiveBank]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); - Emit_x2A(0); + EmitCmd42(0); MarkBufferBankForExecution(gActiveBank); } else if (!gSpecialStatuses[gActiveBank].flag40) @@ -5692,7 +5692,7 @@ static void atk50_openpartyscreen(void) { gAbsentBankFlags |= gBitTable[gActiveBank]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); - Emit_x2A(0); + EmitCmd42(0); MarkBufferBankForExecution(gActiveBank); } else if (!gSpecialStatuses[gActiveBank].flag40) @@ -5755,7 +5755,7 @@ static void atk50_openpartyscreen(void) { gAbsentBankFlags |= gBitTable[gActiveBank]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); - Emit_x2A(0); + EmitCmd42(0); MarkBufferBankForExecution(gActiveBank); } else if (!gSpecialStatuses[gActiveBank].flag40) @@ -5771,7 +5771,7 @@ static void atk50_openpartyscreen(void) { gAbsentBankFlags |= gBitTable[gActiveBank]; gHitMarker &= ~(HITMARKER_FAINTED(gActiveBank)); - Emit_x2A(0); + EmitCmd42(0); MarkBufferBankForExecution(gActiveBank); } else if (!gSpecialStatuses[gActiveBank].flag40) @@ -6031,10 +6031,10 @@ static void atk54_effectiveness_sound(void) gBattlescriptCurrInstr += 3; } -static void atk55_play_sound(void) +static void atk55_play_fanfare(void) { gActiveBank = gBankAttacker; - EmitPlaySound(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1), 0); + EmitPlayFanfareOrBGM(0, BS2ScriptRead16(gBattlescriptCurrInstr + 1), FALSE); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 3; @@ -6052,7 +6052,7 @@ static void atk56_fainting_cry(void) static void atk57(void) { gActiveBank = GetBankByIdentity(0); - Emit_x37(0, gBattleOutcome); + EmitCmd55(0, gBattleOutcome); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 1; @@ -6061,7 +6061,7 @@ static void atk57(void) static void atk58_return_to_ball(void) { gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); - EmitReturnPokeToBall(0, 1); + EmitReturnMonToBall(0, 1); MarkBufferBankForExecution(gActiveBank); gBattlescriptCurrInstr += 2; @@ -7137,7 +7137,7 @@ static void atk76_various(void) gDisableStructs[1].truantUnknownBit = 1; break; case 13: - EmitCmd13(0); + EmitCmd19(0); MarkBufferBankForExecution(gActiveBank); break; case 14: @@ -7162,7 +7162,7 @@ static void atk76_various(void) gActiveBank = 1; if (gBattleMons[gActiveBank].hp != 0) { - EmitReturnPokeToBall(0, 0); + EmitReturnMonToBall(0, 0); MarkBufferBankForExecution(gActiveBank); } break; @@ -7172,7 +7172,7 @@ static void atk76_various(void) gActiveBank = 3; if (gBattleMons[gActiveBank].hp != 0) { - EmitReturnPokeToBall(0, 0); + EmitReturnMonToBall(0, 0); MarkBufferBankForExecution(gActiveBank); } } @@ -7197,7 +7197,7 @@ static void atk76_various(void) gBattleOutcome = BATTLE_OPPONENT_TELEPORTED; break; case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC: - EmitPlaySound(0, BGM_KACHI1, 1); + EmitPlayFanfareOrBGM(0, BGM_KACHI1, TRUE); MarkBufferBankForExecution(gActiveBank); break; } -- cgit v1.2.3 From 752ce9b90d756e01766c12136169eefe335ac016 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Oct 2017 16:55:25 +0200 Subject: start working on battle anim --- src/battle_anim.c | 650 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/decompress.c | 2 +- src/sprite.c | 2 +- 3 files changed, 652 insertions(+), 2 deletions(-) create mode 100644 src/battle_anim.c (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c new file mode 100644 index 000000000..6c316157f --- /dev/null +++ b/src/battle_anim.c @@ -0,0 +1,650 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "sprite.h" +#include "contest.h" +#include "m4a.h" +#include "pokemon.h" +#include "battle_interface.h" +#include "task.h" +#include "decompress.h" +#include "sound.h" +#include "dma3.h" +#include "bg.h" +#include "gpu_regs.h" +#include "palette.h" + +// sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. +#define GET_TRUE_SPRITE_INDEX(i) ((i - 10000)) +#define SCRIPT_READ_32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) +#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) +#define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) +#define SCRIPT_READ_16_(ptr) ((ptr)[0] + ((ptr)[1] << 8)) + +#define ANIM_SPRITE_INDEX_COUNT 8 +#define ANIM_ARGS_COUNT 8 + +extern u8 gBankAttacker; +extern u8 gBankTarget; +extern u16 gBattle_WIN0H; +extern u16 gBattle_WIN0V; +extern u16 gBattle_WIN1H; +extern u16 gBattle_WIN1V; +extern u16 gBattle_BG1_X; +extern u16 gBattle_BG1_Y; +extern u16 gBattle_BG2_X; +extern u16 gBattle_BG2_Y; +extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; +extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT]; +extern struct MusicPlayerInfo gMPlay_BGM; +extern struct MusicPlayerInfo gMPlay_SE1; +extern struct MusicPlayerInfo gMPlay_SE2; + +EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL; +EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL; +EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; +EWRAM_DATA s8 gAnimFramesToWait = 0; +EWRAM_DATA bool8 gAnimScriptActive = FALSE; +EWRAM_DATA u8 gAnimVisualTaskCount = 0; +EWRAM_DATA u8 gAnimSoundTaskCount = 0; +EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; +EWRAM_DATA u32 gAnimMoveDmg = 0; +EWRAM_DATA u16 gAnimMovePower = 0; +EWRAM_DATA u16 gAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; +EWRAM_DATA u8 gAnimFriendship = 0; +EWRAM_DATA u16 gWeatherMoveAnim = 0; +EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; +EWRAM_DATA u16 gSoundAnimFramesToWait = 0; +EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; +EWRAM_DATA u8 gUnknown_02038432 = 0; +EWRAM_DATA u8 gUnknown_02038433 = 0; +EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. +EWRAM_DATA u8 gAnimBankAttacker = 0; +EWRAM_DATA u8 gAnimBankTarget = 0; +EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0}; +EWRAM_DATA u8 gUnknown_02038440 = 0; + +extern void (* const sScriptCmdTable[])(void); +extern const u16 gUnknown_082C8D64[]; +extern const u8 * const gBattleAnims_Moves[]; +extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; +extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; + +extern void sub_80A8278(void); // rom_80A5C6C.s +extern void sub_80A6B30(struct UnknownAnimStruct2*); // rom_80A5C6C.s +extern void sub_80A6B90(struct UnknownAnimStruct2*, u32 arg1); // rom_80A5C6C.s +extern u8 sub_80A82E4(u8 bank); // rom_80A5C6C.s +extern u8 sub_80A5C6C(u8 bank, u8 attributeId); // rom_80A5C6C.s +extern bool8 AnimBankSpriteExists(u8 bank); // rom_80A5C6C.s + +// this file's functions +void RunAnimScriptCommand(void); +void task_pA_ma0A_obj_to_bg_pal(u8 taskId); +void sub_80A46A0(void); + +void ClearBattleAnimationVars(void) +{ + s32 i; + + gAnimFramesToWait = 0; + gAnimScriptActive = FALSE; + gAnimVisualTaskCount = 0; + gAnimSoundTaskCount = 0; + gAnimDisableStructPtr = NULL; + gAnimMoveDmg = 0; + gAnimMovePower = 0; + gAnimFriendship = 0; + + // clear index array. + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + gAnimSpriteIndexArray[i] |= 0xFFFF; + + // clear anim args. + for (i = 0; i < ANIM_ARGS_COUNT; i++) + gBattleAnimArgs[i] = 0; + + gMonAnimTaskIdArray[0] = 0xFF; + gMonAnimTaskIdArray[1] = 0xFF; + gUnknown_02038432 = 0; + gUnknown_02038433 = 0; + gAnimMoveIndex = 0; + gAnimBankAttacker = 0; + gAnimBankTarget = 0; + gUnknown_02038440 = 0; +} + +void DoMoveAnim(u16 move) +{ + gAnimBankAttacker = gBankAttacker; + gAnimBankTarget = gBankTarget; + DoBattleAnim(gBattleAnims_Moves, move, TRUE); +} + +void DoBattleAnim(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim) +{ + s32 i; + + if (!IsContest()) + { + sub_80A8278(); + sub_8072A88(0); + for (i = 0; i < BATTLE_BANKS_COUNT; i++) + { + if (GetBankSide(i) != 0) + gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_SPECIES); + else + gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_SPECIES); + } + } + else + { + for (i = 0; i < 4; i++) + gAnimSpeciesByBanks[i] = gContestResources->field_18->field_0; + } + + if (!isMoveAnim) + gAnimMoveIndex = 0; + else + gAnimMoveIndex = tableId; + + for (i = 0; i < ANIM_ARGS_COUNT; i++) + gBattleAnimArgs[i] = 0; + + gMonAnimTaskIdArray[0] = 0xFF; + gMonAnimTaskIdArray[1] = 0xFF; + gBattleAnimScriptPtr = animsTable[tableId]; + gAnimScriptActive = TRUE; + gAnimFramesToWait = 0; + gAnimScriptCallback = RunAnimScriptCommand; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + gAnimSpriteIndexArray[i] |= 0xFFFF; + + if (isMoveAnim) + { + for (i = 0; gUnknown_082C8D64[i] != 0xFFFF; i++) + { + if (tableId == gUnknown_082C8D64[i]) + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 128); + break; + } + } + } + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + gBattle_WIN1H = 0; + gBattle_WIN1V = 0; +} + +void DestroyAnimSprite(struct Sprite *sprite) +{ + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + gAnimVisualTaskCount--; +} + +void DestroyAnimVisualTask(u8 taskId) +{ + DestroyTask(taskId); + gAnimVisualTaskCount--; +} + +void DestroyAnimSoundTask(u8 taskId) +{ + DestroyTask(taskId); + gAnimSoundTaskCount--; +} + +/*static*/ void AddSpriteIndex(u16 index) +{ + s32 i; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + { + if (gAnimSpriteIndexArray[i] == 0xFFFF) + { + gAnimSpriteIndexArray[i] = index; + return; + } + } +} + +/*static*/ void ClearSpriteIndex(u16 index) +{ + s32 i; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + { + if (gAnimSpriteIndexArray[i] == index) + { + gAnimSpriteIndexArray[i] |= 0xFFFF; + return; + } + } +} + +/*static*/ void WaitAnimFrameCount(void) +{ + if (gAnimFramesToWait <= 0) + { + gAnimScriptCallback = RunAnimScriptCommand; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait--; + } +} + +/*static*/ void RunAnimScriptCommand(void) +{ + do + { + sScriptCmdTable[gBattleAnimScriptPtr[0]](); + } while (gAnimFramesToWait == 0 && gAnimScriptActive); +} + +/*static*/ void ScriptCmd_loadspritegfx(void) +{ + u16 index; + + gBattleAnimScriptPtr++; + index = SCRIPT_READ_16(gBattleAnimScriptPtr); + LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); + LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); + gBattleAnimScriptPtr += 2; + AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); + gAnimFramesToWait = 1; + gAnimScriptCallback = WaitAnimFrameCount; +} + +/*static*/ void ScriptCmd_unloadspritegfx(void) +{ + u16 index; + + gBattleAnimScriptPtr++; + index = SCRIPT_READ_16(gBattleAnimScriptPtr); + FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); + gBattleAnimScriptPtr += 2; + ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); +} + +/*static*/ void ScriptCmd_createsprite(void) +{ + s32 i; + const struct SpriteTemplate *template; + u8 argVar; + u8 argsCount; + s16 subpriority; + + gBattleAnimScriptPtr++; + template = (const struct SpriteTemplate *)(SCRIPT_READ_32_(gBattleAnimScriptPtr)); + gBattleAnimScriptPtr += 4; + + argVar = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + argsCount = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + for (i = 0; i < argsCount; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 2; + } + + if (argVar & 0x80) + { + argVar ^= 0x80; + if (argVar >= 0x40) + argVar -= 0x40; + else + argVar *= -1; + + subpriority = sub_80A82E4(gAnimBankTarget) + (s8)(argVar); + } + else + { + if (argVar >= 0x40) + argVar -= 0x40; + else + argVar *= -1; + + subpriority = sub_80A82E4(gAnimBankAttacker) + (s8)(argVar); + } + + if (subpriority < 3) + subpriority = 3; + + CreateSpriteAndAnimate(template, sub_80A5C6C(gAnimBankTarget, 2), sub_80A5C6C(gAnimBankTarget, 3), subpriority); + gAnimVisualTaskCount++; +} + +/*static*/ void ScriptCmd_createvisualtask(void) +{ + TaskFunc taskFunc; + u8 taskPriority; + u8 taskId; + u8 numArgs; + s32 i; + + gBattleAnimScriptPtr++; + + taskFunc = (TaskFunc)SCRIPT_READ_32_(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 4; + + taskPriority = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + numArgs = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + for (i = 0; i < numArgs; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr += 2; + } + + taskId = CreateTask(taskFunc, taskPriority); + taskFunc(taskId); + gAnimVisualTaskCount++; +} + +/*static*/ void ScriptCmd_delay(void) +{ + gBattleAnimScriptPtr++; + gAnimFramesToWait = gBattleAnimScriptPtr[0]; + if (gAnimFramesToWait == 0) + gAnimFramesToWait = -1; + gBattleAnimScriptPtr++; + gAnimScriptCallback = WaitAnimFrameCount; +} + +// wait for visual tasks to finish. +/*static*/ void ScriptCmd_waitforvisualfinish(void) +{ + if (gAnimVisualTaskCount == 0) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +/*static*/ void ScriptCmd_hang1(void) +{ +} + +/*static*/ void ScriptCmd_hang2(void) +{ +} + +/*static*/ void ScriptCmd_end(void) +{ + s32 i; + bool32 continuousAnim = FALSE; + + // keep waiting as long as there is animations to be done. + if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 + || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF) + { + gSoundAnimFramesToWait = 0; + gAnimFramesToWait = 1; + return; + } + + // finish the sound effects. + if (IsSEPlaying()) + { + if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. + { + gAnimFramesToWait = 1; + return; + } + else + { + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + } + } + + // the SE has halted, so set the SE Frame Counter to 0 and continue. + gSoundAnimFramesToWait = 0; + + for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) + { + if (gAnimSpriteIndexArray[i] != 0xFFFF) + { + FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); + gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. + } + } + + if (!continuousAnim) // may have been used for debug? + { + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 256); + if (!IsContest()) + { + sub_80A8278(); + sub_8072A88(1); + } + gAnimScriptActive = FALSE; + } +} + +/*static*/ void ScriptCmd_playse(void) +{ + gBattleAnimScriptPtr++; + PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr)); + gBattleAnimScriptPtr += 2; +} + +#define t1_MONBG_BANK 0 +#define t1_MON_IN_BG2 1 +#define t1_CREATE_ANOTHER_TASK 2 +#define t1_IS_SECONDMON_BG 3 + +#define t2_BANK_SPRITE_ID 0 +#define t2_MON_IN_BG2 5 +#define t2_MONBG_BANK 6 + +/*static*/ void sub_80A40F4(u8 taskId) +{ + u8 newTaskId; + + s16 *selfData = gTasks[taskId].data; + u8 bankSpriteId = gBankSpriteIds[selfData[t1_MONBG_BANK]]; + gSprites[bankSpriteId].invisible = 1; + + if (!selfData[t1_CREATE_ANOTHER_TASK]) + { + DestroyAnimVisualTask(taskId); + return; + } + + newTaskId = CreateTask(task_pA_ma0A_obj_to_bg_pal, 10); + gTasks[newTaskId].data[t2_BANK_SPRITE_ID] = bankSpriteId; + gTasks[newTaskId].data[1] = gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x; + gTasks[newTaskId].data[2] = gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y; + + if (!selfData[t1_MON_IN_BG2]) + { + gTasks[newTaskId].data[3] = gBattle_BG1_X; + gTasks[newTaskId].data[4] = gBattle_BG1_Y; + } + else + { + gTasks[newTaskId].data[3] = gBattle_BG2_X; + gTasks[newTaskId].data[4] = gBattle_BG2_Y; + } + + gTasks[newTaskId].data[t2_MON_IN_BG2] = selfData[t1_MON_IN_BG2]; + gTasks[newTaskId].data[t2_MONBG_BANK] = selfData[t1_MONBG_BANK]; + gMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId; + DestroyAnimVisualTask(taskId); +} + +/*static*/ void ScriptCmd_monbg(void) +{ + bool8 toBG_2; + u8 taskId; + u8 bank; + u8 animBank; + + gBattleAnimScriptPtr++; + + animBank = gBattleAnimScriptPtr[0]; + if (animBank & ANIM_BANK_TARGET) + bank = gAnimBankTarget; + else + bank = gAnimBankAttacker; + + if (IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + taskId = CreateTask(sub_80A40F4, 10); + gAnimVisualTaskCount++; + gTasks[taskId].data[t1_MONBG_BANK] = bank; + gTasks[taskId].data[t1_MON_IN_BG2] = toBG_2; + gTasks[taskId].data[t1_CREATE_ANOTHER_TASK] = TRUE; + gTasks[taskId].data[t1_IS_SECONDMON_BG] = 0; + + } + + bank ^= BIT_MON; + if (IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + taskId = CreateTask(sub_80A40F4, 10); + gAnimVisualTaskCount++; + gTasks[taskId].data[0] = bank; + gTasks[taskId].data[1] = toBG_2; + gTasks[taskId].data[t1_CREATE_ANOTHER_TASK] = TRUE; + gTasks[taskId].data[t1_IS_SECONDMON_BG] = 1; + } + + gBattleAnimScriptPtr++; + gAnimFramesToWait = 1; + gAnimScriptCallback = WaitAnimFrameCount; +} + +bool8 IsAnimBankSpriteVisible(u8 bank) +{ + if (IsContest()) + { + if (bank == gAnimBankAttacker) + return TRUE; + else + return FALSE; + } + if (!AnimBankSpriteExists(bank)) + return FALSE; + if (IsContest()) + return TRUE; // this line wont ever be reached. + if (!gBattleSpritesDataPtr->bankData[bank].invisible || !gSprites[gBankSpriteIds[bank]].invisible) + return TRUE; + + return FALSE; +} + +void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible) +{ + struct UnknownAnimStruct2 unknownStruct; + u8 bankSpriteId; + + if (!toBG_2) + { + u8 bankIdentity; + + if (IsContest() == TRUE) + { + RequestDma3Fill(0, (void*)(VRAM + 0x8000), 0x2000, 1); + RequestDma3Fill(0xFF, (void*)(VRAM + 0xF000), 0x1000, 0); + } + else + { + RequestDma3Fill(0, (void*)(VRAM + 0x4000), 0x2000, 1); + RequestDma3Fill(0xFF, (void*)(VRAM + 0xe000), 0x1000, 0); + } + + sub_80A6B30(&unknownStruct); + CpuFill16(0, unknownStruct.unk0, 0x1000); + CpuFill16(0xFF, unknownStruct.unk4, 0x800); + + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 2); + SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); + SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0); + + bankSpriteId = gBankSpriteIds[bank]; + + gBattle_BG1_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20; + if (IsContest() && IsSpeciesNotUnown(gContestResources->field_18->field_0)) + gBattle_BG1_X--; + + gBattle_BG1_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20; + if (setSpriteInvisible) + gSprites[gBankSpriteIds[bank]].invisible = 1; + + SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X); + SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y); + + LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], unknownStruct.unk8 * 16, 0x20); + CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + unknownStruct.unk8 * 32), 0x20); + + if (IsContest()) + bankIdentity = 0; + else + bankIdentity = GetBankIdentity(bank); + + sub_8118FBC(1, 0, 0, bankIdentity, unknownStruct.unk8, unknownStruct.unk0, unknownStruct.unk4, unknownStruct.unkA); + + if (IsContest()) + sub_80A46A0(); + } + else + { + RequestDma3Fill(0, (void*)(VRAM + 0x6000), 0x2000, 1); + RequestDma3Fill(0, (void*)(VRAM + 0xF000), 0x1000, 1); + sub_80A6B90(&unknownStruct, 2); + CpuFill16(0, unknownStruct.unk0 + 0x1000, 0x1000); + CpuFill16(0, unknownStruct.unk4 + 0x400, 0x800); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1); + SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0); + + bankSpriteId = gBankSpriteIds[bank]; + + gBattle_BG2_X = -(gSprites[bankSpriteId].pos1.x + gSprites[bankSpriteId].pos2.x) + 0x20; + gBattle_BG2_Y = -(gSprites[bankSpriteId].pos1.y + gSprites[bankSpriteId].pos2.y) + 0x20; + + if (setSpriteInvisible) + gSprites[gBankSpriteIds[bank]].invisible = 1; + + SetGpuReg(REG_OFFSET_BG2HOFS, gBattle_BG2_X); + SetGpuReg(REG_OFFSET_BG2VOFS, gBattle_BG2_Y); + + LoadPalette(&gPlttBufferUnfaded[0x100 + bank * 16], 0x90, 0x20); + CpuCopy32(&gPlttBufferUnfaded[0x100 + bank * 16], (void*)(BG_PLTT + 0x120), 0x20); + + sub_8118FBC(2, 0, 0, GetBankIdentity(bank), unknownStruct.unk8, unknownStruct.unk0 + 0x1000, unknownStruct.unk4 + 0x400, unknownStruct.unkA); + } +} + diff --git a/src/decompress.c b/src/decompress.c index 2863ff1f5..9210799ec 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -465,7 +465,7 @@ u32 sub_8034974(void* ptr) return (ptr_[3] << 16) | (ptr_[2] << 8) | (ptr_[1]); } -bool8 LoadCompressedObjectPicUsingHeap(struct CompressedSpriteSheet* src) +bool8 LoadCompressedObjectPicUsingHeap(const struct CompressedSpriteSheet* src) { struct SpriteSheet dest; void* buffer; diff --git a/src/sprite.c b/src/sprite.c index 17b0f181a..daa019019 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -594,7 +594,7 @@ u8 CreateSpriteAt(u8 index, const struct SpriteTemplate *template, s16 x, s16 y, return index; } -u8 CreateSpriteAndAnimate(struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) +u8 CreateSpriteAndAnimate(const struct SpriteTemplate *template, s16 x, s16 y, u8 subpriority) { u8 i; -- cgit v1.2.3 From 7cf9693551ebf79212878c08245e13337d43ad52 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 14 Oct 2017 14:26:25 -0400 Subject: Decompile special pointers --- src/egg_hatch.c | 2 +- src/safari_zone.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/egg_hatch.c b/src/egg_hatch.c index a1f187b85..589e8901d 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -462,7 +462,7 @@ static void VBlankCB_EggHatch(void) TransferPlttBuffer(); } -static void EggHatch(void) +void EggHatch(void) { ScriptContext2_Enable(); CreateTask(Task_EggHatch, 10); diff --git a/src/safari_zone.c b/src/safari_zone.c index a1ec38920..77c6bbd61 100644 --- a/src/safari_zone.c +++ b/src/safari_zone.c @@ -139,7 +139,7 @@ static void ClearAllPokeblockFeeders(void) memset(sPokeblockFeeders, 0, sizeof(sPokeblockFeeders)); } -static void GetPokeblockFeederInFront(void) +void GetPokeblockFeederInFront(void) { s16 x, y; u16 i; -- cgit v1.2.3 From ebb2999c03e7f9291bf905d644ddc03991e4280e Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sat, 14 Oct 2017 23:37:44 +0200 Subject: more of battle anim done --- src/battle_anim.c | 640 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 637 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c index 6c316157f..7a2b7902c 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -13,13 +13,18 @@ #include "bg.h" #include "gpu_regs.h" #include "palette.h" +#include "main.h" // sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. #define GET_TRUE_SPRITE_INDEX(i) ((i - 10000)) + #define SCRIPT_READ_32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) -#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) #define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) +#define SCRIPT_READ_PTR(ptr) ((const u8*)(SCRIPT_READ_32(ptr))) + #define SCRIPT_READ_16_(ptr) ((ptr)[0] + ((ptr)[1] << 8)) +#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) +#define SCRIPT_READ_PTR_(ptr) ((const u8*)(SCRIPT_READ_32_(ptr))) #define ANIM_SPRITE_INDEX_COUNT 8 #define ANIM_ARGS_COUNT 8 @@ -56,7 +61,7 @@ EWRAM_DATA u16 gWeatherMoveAnim = 0; EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; EWRAM_DATA u16 gSoundAnimFramesToWait = 0; EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; -EWRAM_DATA u8 gUnknown_02038432 = 0; +EWRAM_DATA u8 gAnimMoveTurn = 0; EWRAM_DATA u8 gUnknown_02038433 = 0; EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. EWRAM_DATA u8 gAnimBankAttacker = 0; @@ -69,6 +74,7 @@ extern const u16 gUnknown_082C8D64[]; extern const u8 * const gBattleAnims_Moves[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; +extern const struct BattleAnimBackground gBattleAnimBackgroundTable[]; extern void sub_80A8278(void); // rom_80A5C6C.s extern void sub_80A6B30(struct UnknownAnimStruct2*); // rom_80A5C6C.s @@ -76,11 +82,18 @@ extern void sub_80A6B90(struct UnknownAnimStruct2*, u32 arg1); // rom_80A5C6C.s extern u8 sub_80A82E4(u8 bank); // rom_80A5C6C.s extern u8 sub_80A5C6C(u8 bank, u8 attributeId); // rom_80A5C6C.s extern bool8 AnimBankSpriteExists(u8 bank); // rom_80A5C6C.s +extern void sub_80A6C68(u8 arg0); // rom_80A5C6C.s +extern u8 sub_80A6D94(void); // this file's functions void RunAnimScriptCommand(void); void task_pA_ma0A_obj_to_bg_pal(u8 taskId); void sub_80A46A0(void); +void sub_80A4980(u8 taskId); +void sub_80A4BB0(u8 taskId); +void Task_FadeToBg(u8 taskId); +void LoadDefaultBg(void); +void LoadMoveBg(u16 bgId); void ClearBattleAnimationVars(void) { @@ -105,7 +118,7 @@ void ClearBattleAnimationVars(void) gMonAnimTaskIdArray[0] = 0xFF; gMonAnimTaskIdArray[1] = 0xFF; - gUnknown_02038432 = 0; + gAnimMoveTurn = 0; gUnknown_02038433 = 0; gAnimMoveIndex = 0; gAnimBankAttacker = 0; @@ -648,3 +661,624 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible) } } +/*static*/ void sub_80A46A0(void) +{ + s32 i, j; + struct UnknownAnimStruct2 unknownStruct; + u16 *ptr; + + if (IsSpeciesNotUnown(gContestResources->field_18->field_0)) + { + sub_80A6B30(&unknownStruct); + ptr = unknownStruct.unk4; + for (i = 0; i < 8; i++) + { + for (j = 0; j < 4; j++) + { + u16 temp = ptr[j + i * 32]; + + ptr[j + i * 32] = ptr[7 - j + i * 32]; + ptr[7 - j + i * 32] = temp; + } + } + for (i = 0; i < 8; i++) + { + for (j = 0; j < 8; j++) + ptr[j + i * 32] ^= 0x400; + } + } +} + +void sub_80A4720(u16 a, u16 *b, u32 c, u8 d) +{ + s32 i, j; + s32 var; + + if (d == 0) + var = 32; + else + var = 64; + a <<= 12; + for (i = 0; i < var; i++) + { + for (j = 0; j < 32; j++) + b[j + i * 32] = ((b[j + i * 32] & 0xFFF) | a) + c; + } +} + +void sub_80A477C(bool8 to_BG2) +{ + struct UnknownAnimStruct2 unknownStruct; + sub_80A6B30(&unknownStruct); + + if (!to_BG2 || IsContest()) + { + sub_80A6C68(1); + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + } + else + { + sub_80A6C68(2); + gBattle_BG2_X = 0; + gBattle_BG2_Y = 0; + } +} + +/*static*/ void task_pA_ma0A_obj_to_bg_pal(u8 taskId) +{ + u8 r4; + u8 r6; + s16 r3; + s16 r2; + struct UnknownAnimStruct2 unknownStruct; + + r4 = gTasks[taskId].data[0]; + r6 = gTasks[taskId].data[6]; + sub_80A6B30(&unknownStruct); + r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x); + r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y); + + if (gTasks[taskId].data[5] == 0) + { + u16 *src; + u16 *dst; + + gBattle_BG1_X = r3 + gTasks[taskId].data[3]; + gBattle_BG1_Y = r2 + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + r6 * 16; + dst = gPlttBufferFaded + 0x100 + unknownStruct.unk8 * 16 - 256; + CpuCopy32(src, dst, 0x20); + } + else + { + u16 *src; + u16 *dst; + + gBattle_BG2_X = r3 + gTasks[taskId].data[3]; + gBattle_BG2_Y = r2 + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + r6 * 16; + dst = gPlttBufferFaded + 0x100 - 112; + CpuCopy32(src, dst, 0x20); + } +} + +/*static*/ void ScriptCmd_clearmonbg(void) +{ + u8 animBankId; + u8 bank; + u8 taskId; + + gBattleAnimScriptPtr++; + animBankId = gBattleAnimScriptPtr[0]; + + if (animBankId == ANIM_BANK_ATTACKER) + animBankId = ANIM_BANK_ATK_PARTNER; + else if (animBankId == ANIM_BANK_TARGET) + animBankId = ANIM_BANK_DEF_PARTNER; + + if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + if (gMonAnimTaskIdArray[0] != 0xFF) + gSprites[gBankSpriteIds[bank]].invisible = 0; + if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF) + gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0; + else + animBankId = 0; + + taskId = CreateTask(sub_80A4980, 5); + gTasks[taskId].data[0] = animBankId; + gTasks[taskId].data[2] = bank; + + gBattleAnimScriptPtr++; +} + +/*static*/ void sub_80A4980(u8 taskId) +{ + gTasks[taskId].data[1]++; + if (gTasks[taskId].data[1] != 1) + { + u8 to_BG2; + u8 identity = GetBankIdentity(gTasks[taskId].data[2]); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + to_BG2 = FALSE; + else + to_BG2 = TRUE; + + if (gMonAnimTaskIdArray[0] != 0xFF) + { + sub_80A477C(to_BG2); + DestroyTask(gMonAnimTaskIdArray[0]); + gMonAnimTaskIdArray[0] = 0xFF; + } + if (gTasks[taskId].data[0] > 1) + { + sub_80A477C(to_BG2 ^ 1); + DestroyTask(gMonAnimTaskIdArray[1]); + gMonAnimTaskIdArray[1] = 0xFF; + } + DestroyTask(taskId); + } +} + +/*static*/ void ScriptCmd_monbg_22(void) +{ + bool8 toBG_2; + u8 bank; + u8 animBankId; + + gBattleAnimScriptPtr++; + + animBankId = gBattleAnimScriptPtr[0]; + + if (animBankId == ANIM_BANK_ATTACKER) + animBankId = ANIM_BANK_ATK_PARTNER; + else if (animBankId == ANIM_BANK_TARGET) + animBankId = ANIM_BANK_DEF_PARTNER; + + if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + if (IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + } + + bank ^= BIT_MON; + if (animBankId > 1 && IsAnimBankSpriteVisible(bank)) + { + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + sub_80A438C(bank, toBG_2, FALSE); + } + + gBattleAnimScriptPtr++; +} + +/*static*/ void ScriptCmd_clearmonbg_23(void) +{ + u8 animBankId; + u8 bank; + u8 taskId; + + gBattleAnimScriptPtr++; + animBankId = gBattleAnimScriptPtr[0]; + + if (animBankId == ANIM_BANK_ATTACKER) + animBankId = ANIM_BANK_ATK_PARTNER; + else if (animBankId == ANIM_BANK_TARGET) + animBankId = ANIM_BANK_DEF_PARTNER; + + if (animBankId == ANIM_BANK_ATTACKER || animBankId == ANIM_BANK_ATK_PARTNER) + bank = gAnimBankAttacker; + else + bank = gAnimBankTarget; + + if (IsAnimBankSpriteVisible(bank)) + gSprites[gBankSpriteIds[bank]].invisible = 0; + if (animBankId > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON)) + gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0; + else + animBankId = 0; + + taskId = CreateTask(sub_80A4BB0, 5); + gTasks[taskId].data[0] = animBankId; + gTasks[taskId].data[2] = bank; + + gBattleAnimScriptPtr++; +} + +/*static*/ void sub_80A4BB0(u8 taskId) +{ + gTasks[taskId].data[1]++; + if (gTasks[taskId].data[1] != 1) + { + bool8 toBG_2; + u8 bank = gTasks[taskId].data[2]; + u8 identity = GetBankIdentity(bank); + if (identity == IDENTITY_OPPONENT_MON1 || identity == IDENTITY_PLAYER_MON2 || IsContest()) + toBG_2 = FALSE; + else + toBG_2 = TRUE; + + if (IsAnimBankSpriteVisible(bank)) + sub_80A477C(toBG_2); + if (gTasks[taskId].data[0] > 1 && IsAnimBankSpriteVisible(bank ^ BIT_MON)) + sub_80A477C(toBG_2 ^ 1); + + DestroyTask(taskId); + } +} + +#undef t1_MONBG_BANK +#undef t1_MON_IN_BG2 +#undef t1_CREATE_ANOTHER_TASK +#undef t1_IS_SECONDMON_BG + +#undef t2_BANK_SPRITE_ID +#undef t2_MON_IN_BG2 +#undef t2_MONBG_BANK + +/*static*/ void ScriptCmd_setalpha(void) +{ + u16 half1, half2; + + gBattleAnimScriptPtr++; + half1 = *(gBattleAnimScriptPtr++); + half2 = *(gBattleAnimScriptPtr++) << 8; + SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); + SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2); +} + +/*static*/ void ScriptCmd_setbldcnt(void) +{ + u16 half1, half2; + + gBattleAnimScriptPtr++; + half1 = *(gBattleAnimScriptPtr++); + half2 = *(gBattleAnimScriptPtr++) << 8; + SetGpuReg(REG_OFFSET_BLDCNT, half1 | half2); +} + +/*static*/ void ScriptCmd_blendoff(void) +{ + gBattleAnimScriptPtr++; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); +} + +/*static*/ void ScriptCmd_call(void) +{ + gBattleAnimScriptPtr++; + gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4; + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); +} + +/*static*/ void ScriptCmd_return(void) +{ + gBattleAnimScriptPtr = gBattleAnimScriptRetAddr; +} + +/*static*/ void ScriptCmd_setarg(void) +{ + const u8 *addr = gBattleAnimScriptPtr; + u16 value; + u8 argId; + + gBattleAnimScriptPtr++; + argId = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + value = SCRIPT_READ_16(gBattleAnimScriptPtr); + gBattleAnimScriptPtr = addr + 4; + gBattleAnimArgs[argId] = value; +} + +/*static*/ void ScriptCmd_choosetwoturnanim(void) +{ + gBattleAnimScriptPtr++; + if (gAnimMoveTurn & 1) + gBattleAnimScriptPtr += 4; + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); +} + +/*static*/ void ScriptCmd_jumpifmoveturn(void) +{ + u8 toCheck; + gBattleAnimScriptPtr++; + toCheck = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + + if (toCheck == gAnimMoveTurn) + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + else + gBattleAnimScriptPtr += 4; +} + +/*static*/ void ScriptCmd_jump(void) +{ + gBattleAnimScriptPtr++; + gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); +} + +// Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior. +bool8 IsContest(void) +{ + if (!gMain.inBattle) + return TRUE; + else + return FALSE; +} + +#define tBackgroundId data[0] +#define tState data[10] + +/*static*/ void ScriptCmd_fadetobg(void) +{ + u8 backgroundId; + u8 taskId; + + gBattleAnimScriptPtr++; + backgroundId = gBattleAnimScriptPtr[0]; + gBattleAnimScriptPtr++; + taskId = CreateTask(Task_FadeToBg, 5); + gTasks[taskId].tBackgroundId = backgroundId; + gUnknown_02038433 = 1; +} + +/*static*/ void ScriptCmd_fadetobgfromset(void) +{ + u8 bg1, bg2, bg3; + u8 taskId; + + gBattleAnimScriptPtr++; + bg1 = gBattleAnimScriptPtr[0]; + bg2 = gBattleAnimScriptPtr[1]; + bg3 = gBattleAnimScriptPtr[2]; + gBattleAnimScriptPtr += 3; + taskId = CreateTask(Task_FadeToBg, 5); + + if (IsContest()) + gTasks[taskId].tBackgroundId = bg3; + else if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + gTasks[taskId].tBackgroundId = bg2; + else + gTasks[taskId].tBackgroundId = bg1; + + gUnknown_02038433 = 1; +} + +/*static*/ void Task_FadeToBg(u8 taskId) +{ + if (gTasks[taskId].tState == 0) + { + BeginHardwarePaletteFade(0xE8, 0, 0, 16, 0); + gTasks[taskId].tState++; + return; + } + if (gPaletteFade.active) + return; + if (gTasks[taskId].tState == 1) + { + gTasks[taskId].tState++; + gUnknown_02038433 = 2; + } + else if (gTasks[taskId].tState == 2) + { + s16 bgId = (u16)gTasks[taskId].tBackgroundId; + + if (bgId == -1) + LoadDefaultBg(); + else + LoadMoveBg(bgId); + + BeginHardwarePaletteFade(0xE8, 0, 16, 0, 1); + gTasks[taskId].tState++; + return; + } + if (gPaletteFade.active) + return; + if (gTasks[taskId].tState == 3) + { + DestroyTask(taskId); + gUnknown_02038433 = 0; + } +} + +extern u8 gDecompressionBuffer[]; + +/*static*/ void LoadMoveBg(u16 bgId) +{ + if (IsContest()) + { + void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; + void *dmaSrc; + void *dmaDest; + + LZDecompressWram(tilemap, gDecompressionBuffer); + sub_80A4720(sub_80A6D94(), (void*)(gDecompressionBuffer), 0x100, 0); + dmaSrc = gDecompressionBuffer; + dmaDest = (void *)(VRAM + 0xD000); + DmaCopy32(3, dmaSrc, dmaDest, 0x800); + LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x2000)); + LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, sub_80A6D94() * 16, 32); + } + else + { + LZDecompressVram(gBattleAnimBackgroundTable[bgId].tilemap, (void *)(VRAM + 0xD000)); + LZDecompressVram(gBattleAnimBackgroundTable[bgId].image, (void *)(VRAM + 0x8000)); + LoadCompressedPalette(gBattleAnimBackgroundTable[bgId].palette, 32, 32); + } +} + +/*static*/ void LoadDefaultBg(void) +{ + if (IsContest()) + LoadContestBgAfterMoveAnim(); + else + LoadFittingBackgroundForBattle(); +} + +/*static*/ void ScriptCmd_restorebg(void) +{ + u8 taskId; + + gBattleAnimScriptPtr++; + taskId = CreateTask(Task_FadeToBg, 5); + gTasks[taskId].data[0] = 0xFFFF; + gUnknown_02038433 = 1; +} + +/*static*/ void ScriptCmd_waitbgfadeout(void) +{ + if (gUnknown_02038433 == 2) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +/*static*/ void ScriptCmd_waitbgfadein(void) +{ + if (gUnknown_02038433 == 0) + { + gBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } +} + +/*static*/ void ScriptCmd_changebg(void) +{ + gBattleAnimScriptPtr++; + LoadMoveBg(gBattleAnimScriptPtr[0]); + gBattleAnimScriptPtr++; +} + +s8 BattleAnimAdjustPanning(s8 pan) +{ + if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + pan = 63; + else + pan = -64; + } + else if (IsContest()) + { + if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != 63) + pan *= -1; + } + else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) + { + if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) + { + if (pan == 63) + pan = -64; + else if (pan != -64) + pan *= -1; + } + } + else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT) + { + if (pan == -64) + pan = 63; + } + else + { + pan *= -1; + } + + if (pan > 63) + pan = 63; + else if (pan < -64) + pan = -64; + + return pan; +} + +s8 BattleAnimAdjustPanning2(s8 pan) +{ + if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) + pan = 63; + else + pan = -64; + } + else + { + if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER || IsContest()) + pan = -pan; + } + return pan; +} + +s16 sub_80A52EC(s16 a) +{ + s16 var = a; + + if (var > 63) + var = 63; + else if (var < -64) + var = -64; + + return var; +} + +s16 sub_80A5314(s16 a, s16 b, s16 c) +{ + u16 var; + + if (a < b) + var = ((c < 0) ? -c : c); + else if (a > b) + var = -((c < 0) ? -c : c); + else + var = 0; + + return var; +} + +/*static*/ void ScriptCmd_playsewithpan(void) +{ + u16 songId; + s8 pan; + + gBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(gBattleAnimScriptPtr); + pan = gBattleAnimScriptPtr[2]; + PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan)); + gBattleAnimScriptPtr += 3; +} + +/*static*/ void ScriptCmd_setpan(void) +{ + s8 pan; + + gBattleAnimScriptPtr++; + pan = gBattleAnimScriptPtr[0]; + SE12PanpotControl(BattleAnimAdjustPanning(pan)); + gBattleAnimScriptPtr++; +} -- cgit v1.2.3 From dd0f19476c3a15514e3d08855cee3266fdbdf2ed Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 15 Oct 2017 23:21:59 +0200 Subject: battle anim file is decompiled --- src/battle_anim.c | 1018 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 793 insertions(+), 225 deletions(-) (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c index 7a2b7902c..13b74a84a 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -18,16 +18,11 @@ // sprites start at 10000 and thus must be subtracted of 10000 to account for the true index. #define GET_TRUE_SPRITE_INDEX(i) ((i - 10000)) -#define SCRIPT_READ_32(ptr) ((ptr)[0] | (ptr)[1] << 8 | (ptr)[2] << 16 | (ptr)[3] << 24) #define SCRIPT_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) +#define SCRIPT_READ_32(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) #define SCRIPT_READ_PTR(ptr) ((const u8*)(SCRIPT_READ_32(ptr))) -#define SCRIPT_READ_16_(ptr) ((ptr)[0] + ((ptr)[1] << 8)) -#define SCRIPT_READ_32_(ptr) (((ptr)[0]) + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) -#define SCRIPT_READ_PTR_(ptr) ((const u8*)(SCRIPT_READ_32_(ptr))) - #define ANIM_SPRITE_INDEX_COUNT 8 -#define ANIM_ARGS_COUNT 8 extern u8 gBankAttacker; extern u8 gBankTarget; @@ -44,32 +39,8 @@ extern u8 gBankSpriteIds[BATTLE_BANKS_COUNT]; extern struct MusicPlayerInfo gMPlay_BGM; extern struct MusicPlayerInfo gMPlay_SE1; extern struct MusicPlayerInfo gMPlay_SE2; +extern u8 gDecompressionBuffer[]; -EWRAM_DATA const u8 *gBattleAnimScriptPtr = NULL; -EWRAM_DATA const u8 *gBattleAnimScriptRetAddr = NULL; -EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; -EWRAM_DATA s8 gAnimFramesToWait = 0; -EWRAM_DATA bool8 gAnimScriptActive = FALSE; -EWRAM_DATA u8 gAnimVisualTaskCount = 0; -EWRAM_DATA u8 gAnimSoundTaskCount = 0; -EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; -EWRAM_DATA u32 gAnimMoveDmg = 0; -EWRAM_DATA u16 gAnimMovePower = 0; -EWRAM_DATA u16 gAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; -EWRAM_DATA u8 gAnimFriendship = 0; -EWRAM_DATA u16 gWeatherMoveAnim = 0; -EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; -EWRAM_DATA u16 gSoundAnimFramesToWait = 0; -EWRAM_DATA u8 gMonAnimTaskIdArray[2] = {0}; -EWRAM_DATA u8 gAnimMoveTurn = 0; -EWRAM_DATA u8 gUnknown_02038433 = 0; -EWRAM_DATA u16 gAnimMoveIndex = 0; // set but unused. -EWRAM_DATA u8 gAnimBankAttacker = 0; -EWRAM_DATA u8 gAnimBankTarget = 0; -EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0}; -EWRAM_DATA u8 gUnknown_02038440 = 0; - -extern void (* const sScriptCmdTable[])(void); extern const u16 gUnknown_082C8D64[]; extern const u8 * const gBattleAnims_Moves[]; extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; @@ -83,17 +54,150 @@ extern u8 sub_80A82E4(u8 bank); // rom_80A5C6C.s extern u8 sub_80A5C6C(u8 bank, u8 attributeId); // rom_80A5C6C.s extern bool8 AnimBankSpriteExists(u8 bank); // rom_80A5C6C.s extern void sub_80A6C68(u8 arg0); // rom_80A5C6C.s +extern u8 GetAnimBankSpriteId(u8 wantedBank); // rom_80A5C6C.s extern u8 sub_80A6D94(void); +extern u8 sub_80A8364(u8); +extern bool8 IsDoubleBattle(void); // this file's functions -void RunAnimScriptCommand(void); -void task_pA_ma0A_obj_to_bg_pal(u8 taskId); -void sub_80A46A0(void); -void sub_80A4980(u8 taskId); -void sub_80A4BB0(u8 taskId); -void Task_FadeToBg(u8 taskId); -void LoadDefaultBg(void); -void LoadMoveBg(u16 bgId); +static void ScriptCmd_loadspritegfx(void); +static void ScriptCmd_unloadspritegfx(void); +static void ScriptCmd_createsprite(void); +static void ScriptCmd_createvisualtask(void); +static void ScriptCmd_delay(void); +static void ScriptCmd_waitforvisualfinish(void); +static void ScriptCmd_hang1(void); +static void ScriptCmd_hang2(void); +static void ScriptCmd_end(void); +static void ScriptCmd_playse(void); +static void ScriptCmd_monbg(void); +static void ScriptCmd_clearmonbg(void); +static void ScriptCmd_setalpha(void); +static void ScriptCmd_blendoff(void); +static void ScriptCmd_call(void); +static void ScriptCmd_return(void); +static void ScriptCmd_setarg(void); +static void ScriptCmd_choosetwoturnanim(void); +static void ScriptCmd_jumpifmoveturn(void); +static void ScriptCmd_jump(void); +static void ScriptCmd_fadetobg(void); +static void ScriptCmd_restorebg(void); +static void ScriptCmd_waitbgfadeout(void); +static void ScriptCmd_waitbgfadein(void); +static void ScriptCmd_changebg(void); +static void ScriptCmd_playsewithpan(void); +static void ScriptCmd_setpan(void); +static void ScriptCmd_panse_1B(void); +static void ScriptCmd_loopsewithpan(void); +static void ScriptCmd_waitplaysewithpan(void); +static void ScriptCmd_setbldcnt(void); +static void ScriptCmd_createsoundtask(void); +static void ScriptCmd_waitsound(void); +static void ScriptCmd_jumpargeq(void); +static void ScriptCmd_monbg_22(void); +static void ScriptCmd_clearmonbg_23(void); +static void ScriptCmd_jumpifcontest(void); +static void ScriptCmd_fadetobgfromset(void); +static void ScriptCmd_panse_26(void); +static void ScriptCmd_panse_27(void); +static void ScriptCmd_monbgprio_28(void); +static void ScriptCmd_monbgprio_29(void); +static void ScriptCmd_monbgprio_2A(void); +static void ScriptCmd_invisible(void); +static void ScriptCmd_visible(void); +static void ScriptCmd_doublebattle_2D(void); +static void ScriptCmd_doublebattle_2E(void); +static void ScriptCmd_stopsound(void); + +static void RunAnimScriptCommand(void); +static void task_pA_ma0A_obj_to_bg_pal(u8 taskId); +static void sub_80A46A0(void); +static void sub_80A4980(u8 taskId); +static void sub_80A4BB0(u8 taskId); +static void Task_FadeToBg(u8 taskId); +static void Task_PanFromInitialToTarget(u8 taskId); +static void Task_LoopAndPlaySE(u8 taskId); +static void Task_WaitAndPlaySE(u8 taskId); +static void LoadDefaultBg(void); +static void LoadMoveBg(u16 bgId); + +// ewram +EWRAM_DATA static const u8 *sBattleAnimScriptPtr = NULL; +EWRAM_DATA static const u8 *sBattleAnimScriptRetAddr = NULL; +EWRAM_DATA void (*gAnimScriptCallback)(void) = NULL; +EWRAM_DATA static s8 gAnimFramesToWait = 0; +EWRAM_DATA bool8 gAnimScriptActive = FALSE; +EWRAM_DATA u8 gAnimVisualTaskCount = 0; +EWRAM_DATA u8 gAnimSoundTaskCount = 0; +EWRAM_DATA struct DisableStruct *gAnimDisableStructPtr = NULL; +EWRAM_DATA u32 gAnimMoveDmg = 0; +EWRAM_DATA u16 gAnimMovePower = 0; +EWRAM_DATA static u16 sAnimSpriteIndexArray[ANIM_SPRITE_INDEX_COUNT] = {0}; +EWRAM_DATA u8 gAnimFriendship = 0; +EWRAM_DATA u16 gWeatherMoveAnim = 0; +EWRAM_DATA s16 gBattleAnimArgs[ANIM_ARGS_COUNT] = {0}; +EWRAM_DATA static u16 sSoundAnimFramesToWait = 0; +EWRAM_DATA static u8 sMonAnimTaskIdArray[2] = {0}; +EWRAM_DATA u8 gAnimMoveTurn = 0; +EWRAM_DATA static u8 sAnimBackgroundFadeState = 0; +EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused. +EWRAM_DATA u8 gAnimBankAttacker = 0; +EWRAM_DATA u8 gAnimBankTarget = 0; +EWRAM_DATA u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT] = {0}; +EWRAM_DATA u8 gUnknown_02038440 = 0; + +// const rom data +static void (* const sScriptCmdTable[])(void) = +{ + ScriptCmd_loadspritegfx, + ScriptCmd_unloadspritegfx, + ScriptCmd_createsprite, + ScriptCmd_createvisualtask, + ScriptCmd_delay, + ScriptCmd_waitforvisualfinish, + ScriptCmd_hang1, + ScriptCmd_hang2, + ScriptCmd_end, + ScriptCmd_playse, + ScriptCmd_monbg, + ScriptCmd_clearmonbg, + ScriptCmd_setalpha, + ScriptCmd_blendoff, + ScriptCmd_call, + ScriptCmd_return, + ScriptCmd_setarg, + ScriptCmd_choosetwoturnanim, + ScriptCmd_jumpifmoveturn, + ScriptCmd_jump, + ScriptCmd_fadetobg, + ScriptCmd_restorebg, + ScriptCmd_waitbgfadeout, + ScriptCmd_waitbgfadein, + ScriptCmd_changebg, + ScriptCmd_playsewithpan, + ScriptCmd_setpan, + ScriptCmd_panse_1B, + ScriptCmd_loopsewithpan, + ScriptCmd_waitplaysewithpan, + ScriptCmd_setbldcnt, + ScriptCmd_createsoundtask, + ScriptCmd_waitsound, + ScriptCmd_jumpargeq, + ScriptCmd_monbg_22, + ScriptCmd_clearmonbg_23, + ScriptCmd_jumpifcontest, + ScriptCmd_fadetobgfromset, + ScriptCmd_panse_26, + ScriptCmd_panse_27, + ScriptCmd_monbgprio_28, + ScriptCmd_monbgprio_29, + ScriptCmd_monbgprio_2A, + ScriptCmd_invisible, + ScriptCmd_visible, + ScriptCmd_doublebattle_2D, + ScriptCmd_doublebattle_2E, + ScriptCmd_stopsound +}; void ClearBattleAnimationVars(void) { @@ -110,17 +214,17 @@ void ClearBattleAnimationVars(void) // clear index array. for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] |= 0xFFFF; // clear anim args. for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; + sMonAnimTaskIdArray[0] = 0xFF; + sMonAnimTaskIdArray[1] = 0xFF; gAnimMoveTurn = 0; - gUnknown_02038433 = 0; - gAnimMoveIndex = 0; + sAnimBackgroundFadeState = 0; + sAnimMoveIndex = 0; gAnimBankAttacker = 0; gAnimBankTarget = 0; gUnknown_02038440 = 0; @@ -156,22 +260,22 @@ void DoBattleAnim(const u8 *const animsTable[], u16 tableId, bool8 isMoveAnim) } if (!isMoveAnim) - gAnimMoveIndex = 0; + sAnimMoveIndex = 0; else - gAnimMoveIndex = tableId; + sAnimMoveIndex = tableId; for (i = 0; i < ANIM_ARGS_COUNT; i++) gBattleAnimArgs[i] = 0; - gMonAnimTaskIdArray[0] = 0xFF; - gMonAnimTaskIdArray[1] = 0xFF; - gBattleAnimScriptPtr = animsTable[tableId]; + sMonAnimTaskIdArray[0] = 0xFF; + sMonAnimTaskIdArray[1] = 0xFF; + sBattleAnimScriptPtr = animsTable[tableId]; gAnimScriptActive = TRUE; gAnimFramesToWait = 0; gAnimScriptCallback = RunAnimScriptCommand; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) - gAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] |= 0xFFFF; if (isMoveAnim) { @@ -210,35 +314,35 @@ void DestroyAnimSoundTask(u8 taskId) gAnimSoundTaskCount--; } -/*static*/ void AddSpriteIndex(u16 index) +static void AddSpriteIndex(u16 index) { s32 i; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { - if (gAnimSpriteIndexArray[i] == 0xFFFF) + if (sAnimSpriteIndexArray[i] == 0xFFFF) { - gAnimSpriteIndexArray[i] = index; + sAnimSpriteIndexArray[i] = index; return; } } } -/*static*/ void ClearSpriteIndex(u16 index) +static void ClearSpriteIndex(u16 index) { s32 i; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { - if (gAnimSpriteIndexArray[i] == index) + if (sAnimSpriteIndexArray[i] == index) { - gAnimSpriteIndexArray[i] |= 0xFFFF; + sAnimSpriteIndexArray[i] |= 0xFFFF; return; } } } -/*static*/ void WaitAnimFrameCount(void) +static void WaitAnimFrameCount(void) { if (gAnimFramesToWait <= 0) { @@ -251,41 +355,41 @@ void DestroyAnimSoundTask(u8 taskId) } } -/*static*/ void RunAnimScriptCommand(void) +static void RunAnimScriptCommand(void) { do { - sScriptCmdTable[gBattleAnimScriptPtr[0]](); + sScriptCmdTable[sBattleAnimScriptPtr[0]](); } while (gAnimFramesToWait == 0 && gAnimScriptActive); } -/*static*/ void ScriptCmd_loadspritegfx(void) +static void ScriptCmd_loadspritegfx(void) { u16 index; - gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + index = SCRIPT_READ_16(sBattleAnimScriptPtr); LoadCompressedObjectPicUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)]); LoadCompressedObjectPaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(index)]); - gBattleAnimScriptPtr += 2; + sBattleAnimScriptPtr += 2; AddSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); gAnimFramesToWait = 1; gAnimScriptCallback = WaitAnimFrameCount; } -/*static*/ void ScriptCmd_unloadspritegfx(void) +static void ScriptCmd_unloadspritegfx(void) { u16 index; - gBattleAnimScriptPtr++; - index = SCRIPT_READ_16(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + index = SCRIPT_READ_16(sBattleAnimScriptPtr); FreeSpriteTilesByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); FreeSpritePaletteByTag(gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(index)].tag); - gBattleAnimScriptPtr += 2; + sBattleAnimScriptPtr += 2; ClearSpriteIndex(GET_TRUE_SPRITE_INDEX(index)); } -/*static*/ void ScriptCmd_createsprite(void) +static void ScriptCmd_createsprite(void) { s32 i; const struct SpriteTemplate *template; @@ -293,19 +397,19 @@ void DestroyAnimSoundTask(u8 taskId) u8 argsCount; s16 subpriority; - gBattleAnimScriptPtr++; - template = (const struct SpriteTemplate *)(SCRIPT_READ_32_(gBattleAnimScriptPtr)); - gBattleAnimScriptPtr += 4; + sBattleAnimScriptPtr++; + template = (const struct SpriteTemplate *)(SCRIPT_READ_32(sBattleAnimScriptPtr)); + sBattleAnimScriptPtr += 4; - argVar = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + argVar = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; - argsCount = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + argsCount = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; for (i = 0; i < argsCount; i++) { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 2; + gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 2; } if (argVar & 0x80) @@ -335,7 +439,7 @@ void DestroyAnimSoundTask(u8 taskId) gAnimVisualTaskCount++; } -/*static*/ void ScriptCmd_createvisualtask(void) +static void ScriptCmd_createvisualtask(void) { TaskFunc taskFunc; u8 taskPriority; @@ -343,21 +447,21 @@ void DestroyAnimSoundTask(u8 taskId) u8 numArgs; s32 i; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; - taskFunc = (TaskFunc)SCRIPT_READ_32_(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 4; + taskFunc = (TaskFunc)SCRIPT_READ_32(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 4; - taskPriority = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + taskPriority = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; - numArgs = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + numArgs = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; for (i = 0; i < numArgs; i++) { - gBattleAnimArgs[i] = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr += 2; + gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 2; } taskId = CreateTask(taskFunc, taskPriority); @@ -365,22 +469,22 @@ void DestroyAnimSoundTask(u8 taskId) gAnimVisualTaskCount++; } -/*static*/ void ScriptCmd_delay(void) +static void ScriptCmd_delay(void) { - gBattleAnimScriptPtr++; - gAnimFramesToWait = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + gAnimFramesToWait = sBattleAnimScriptPtr[0]; if (gAnimFramesToWait == 0) gAnimFramesToWait = -1; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimScriptCallback = WaitAnimFrameCount; } // wait for visual tasks to finish. -/*static*/ void ScriptCmd_waitforvisualfinish(void) +static void ScriptCmd_waitforvisualfinish(void) { if (gAnimVisualTaskCount == 0) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 0; } else @@ -389,24 +493,24 @@ void DestroyAnimSoundTask(u8 taskId) } } -/*static*/ void ScriptCmd_hang1(void) +static void ScriptCmd_hang1(void) { } -/*static*/ void ScriptCmd_hang2(void) +static void ScriptCmd_hang2(void) { } -/*static*/ void ScriptCmd_end(void) +static void ScriptCmd_end(void) { s32 i; bool32 continuousAnim = FALSE; // keep waiting as long as there is animations to be done. if (gAnimVisualTaskCount != 0 || gAnimSoundTaskCount != 0 - || gMonAnimTaskIdArray[0] != 0xFF || gMonAnimTaskIdArray[1] != 0xFF) + || sMonAnimTaskIdArray[0] != 0xFF || sMonAnimTaskIdArray[1] != 0xFF) { - gSoundAnimFramesToWait = 0; + sSoundAnimFramesToWait = 0; gAnimFramesToWait = 1; return; } @@ -414,7 +518,7 @@ void DestroyAnimSoundTask(u8 taskId) // finish the sound effects. if (IsSEPlaying()) { - if (++gSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. + if (++sSoundAnimFramesToWait <= 90) // wait 90 frames, then halt the sound effect. { gAnimFramesToWait = 1; return; @@ -427,15 +531,15 @@ void DestroyAnimSoundTask(u8 taskId) } // the SE has halted, so set the SE Frame Counter to 0 and continue. - gSoundAnimFramesToWait = 0; + sSoundAnimFramesToWait = 0; for (i = 0; i < ANIM_SPRITE_INDEX_COUNT; i++) { - if (gAnimSpriteIndexArray[i] != 0xFFFF) + if (sAnimSpriteIndexArray[i] != 0xFFFF) { - FreeSpriteTilesByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - FreeSpritePaletteByTag(gBattleAnimPicTable[gAnimSpriteIndexArray[i]].tag); - gAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. + FreeSpriteTilesByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); + FreeSpritePaletteByTag(gBattleAnimPicTable[sAnimSpriteIndexArray[i]].tag); + sAnimSpriteIndexArray[i] |= 0xFFFF; // set terminator. } } @@ -451,11 +555,11 @@ void DestroyAnimSoundTask(u8 taskId) } } -/*static*/ void ScriptCmd_playse(void) +static void ScriptCmd_playse(void) { - gBattleAnimScriptPtr++; - PlaySE(SCRIPT_READ_16(gBattleAnimScriptPtr)); - gBattleAnimScriptPtr += 2; + sBattleAnimScriptPtr++; + PlaySE(SCRIPT_READ_16(sBattleAnimScriptPtr)); + sBattleAnimScriptPtr += 2; } #define t1_MONBG_BANK 0 @@ -467,7 +571,7 @@ void DestroyAnimSoundTask(u8 taskId) #define t2_MON_IN_BG2 5 #define t2_MONBG_BANK 6 -/*static*/ void sub_80A40F4(u8 taskId) +static void sub_80A40F4(u8 taskId) { u8 newTaskId; @@ -499,20 +603,20 @@ void DestroyAnimSoundTask(u8 taskId) gTasks[newTaskId].data[t2_MON_IN_BG2] = selfData[t1_MON_IN_BG2]; gTasks[newTaskId].data[t2_MONBG_BANK] = selfData[t1_MONBG_BANK]; - gMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId; + sMonAnimTaskIdArray[selfData[t1_IS_SECONDMON_BG]] = newTaskId; DestroyAnimVisualTask(taskId); } -/*static*/ void ScriptCmd_monbg(void) +static void ScriptCmd_monbg(void) { bool8 toBG_2; u8 taskId; u8 bank; u8 animBank; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; - animBank = gBattleAnimScriptPtr[0]; + animBank = sBattleAnimScriptPtr[0]; if (animBank & ANIM_BANK_TARGET) bank = gAnimBankTarget; else @@ -554,7 +658,7 @@ void DestroyAnimSoundTask(u8 taskId) gTasks[taskId].data[t1_IS_SECONDMON_BG] = 1; } - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 1; gAnimScriptCallback = WaitAnimFrameCount; } @@ -661,7 +765,7 @@ void sub_80A438C(u8 bank, bool8 toBG_2, bool8 setSpriteInvisible) } } -/*static*/ void sub_80A46A0(void) +static void sub_80A46A0(void) { s32 i, j; struct UnknownAnimStruct2 unknownStruct; @@ -725,7 +829,7 @@ void sub_80A477C(bool8 to_BG2) } } -/*static*/ void task_pA_ma0A_obj_to_bg_pal(u8 taskId) +static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) { u8 r4; u8 r6; @@ -763,14 +867,14 @@ void sub_80A477C(bool8 to_BG2) } } -/*static*/ void ScriptCmd_clearmonbg(void) +static void ScriptCmd_clearmonbg(void) { u8 animBankId; u8 bank; u8 taskId; - gBattleAnimScriptPtr++; - animBankId = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + animBankId = sBattleAnimScriptPtr[0]; if (animBankId == ANIM_BANK_ATTACKER) animBankId = ANIM_BANK_ATK_PARTNER; @@ -782,9 +886,9 @@ void sub_80A477C(bool8 to_BG2) else bank = gAnimBankTarget; - if (gMonAnimTaskIdArray[0] != 0xFF) + if (sMonAnimTaskIdArray[0] != 0xFF) gSprites[gBankSpriteIds[bank]].invisible = 0; - if (animBankId > 1 && gMonAnimTaskIdArray[1] != 0xFF) + if (animBankId > 1 && sMonAnimTaskIdArray[1] != 0xFF) gSprites[gBankSpriteIds[bank ^ BIT_MON]].invisible = 0; else animBankId = 0; @@ -793,10 +897,10 @@ void sub_80A477C(bool8 to_BG2) gTasks[taskId].data[0] = animBankId; gTasks[taskId].data[2] = bank; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; } -/*static*/ void sub_80A4980(u8 taskId) +static void sub_80A4980(u8 taskId) { gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] != 1) @@ -808,31 +912,31 @@ void sub_80A477C(bool8 to_BG2) else to_BG2 = TRUE; - if (gMonAnimTaskIdArray[0] != 0xFF) + if (sMonAnimTaskIdArray[0] != 0xFF) { sub_80A477C(to_BG2); - DestroyTask(gMonAnimTaskIdArray[0]); - gMonAnimTaskIdArray[0] = 0xFF; + DestroyTask(sMonAnimTaskIdArray[0]); + sMonAnimTaskIdArray[0] = 0xFF; } if (gTasks[taskId].data[0] > 1) { sub_80A477C(to_BG2 ^ 1); - DestroyTask(gMonAnimTaskIdArray[1]); - gMonAnimTaskIdArray[1] = 0xFF; + DestroyTask(sMonAnimTaskIdArray[1]); + sMonAnimTaskIdArray[1] = 0xFF; } DestroyTask(taskId); } } -/*static*/ void ScriptCmd_monbg_22(void) +static void ScriptCmd_monbg_22(void) { bool8 toBG_2; u8 bank; u8 animBankId; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; - animBankId = gBattleAnimScriptPtr[0]; + animBankId = sBattleAnimScriptPtr[0]; if (animBankId == ANIM_BANK_ATTACKER) animBankId = ANIM_BANK_ATK_PARTNER; @@ -867,17 +971,17 @@ void sub_80A477C(bool8 to_BG2) sub_80A438C(bank, toBG_2, FALSE); } - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; } -/*static*/ void ScriptCmd_clearmonbg_23(void) +static void ScriptCmd_clearmonbg_23(void) { u8 animBankId; u8 bank; u8 taskId; - gBattleAnimScriptPtr++; - animBankId = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + animBankId = sBattleAnimScriptPtr[0]; if (animBankId == ANIM_BANK_ATTACKER) animBankId = ANIM_BANK_ATK_PARTNER; @@ -900,10 +1004,10 @@ void sub_80A477C(bool8 to_BG2) gTasks[taskId].data[0] = animBankId; gTasks[taskId].data[2] = bank; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; } -/*static*/ void sub_80A4BB0(u8 taskId) +static void sub_80A4BB0(u8 taskId) { gTasks[taskId].data[1]++; if (gTasks[taskId].data[1] != 1) @@ -934,85 +1038,85 @@ void sub_80A477C(bool8 to_BG2) #undef t2_MON_IN_BG2 #undef t2_MONBG_BANK -/*static*/ void ScriptCmd_setalpha(void) +static void ScriptCmd_setalpha(void) { u16 half1, half2; - gBattleAnimScriptPtr++; - half1 = *(gBattleAnimScriptPtr++); - half2 = *(gBattleAnimScriptPtr++) << 8; + sBattleAnimScriptPtr++; + half1 = *(sBattleAnimScriptPtr++); + half2 = *(sBattleAnimScriptPtr++) << 8; SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); SetGpuReg(REG_OFFSET_BLDALPHA, half1 | half2); } -/*static*/ void ScriptCmd_setbldcnt(void) +static void ScriptCmd_setbldcnt(void) { u16 half1, half2; - gBattleAnimScriptPtr++; - half1 = *(gBattleAnimScriptPtr++); - half2 = *(gBattleAnimScriptPtr++) << 8; + sBattleAnimScriptPtr++; + half1 = *(sBattleAnimScriptPtr++); + half2 = *(sBattleAnimScriptPtr++) << 8; SetGpuReg(REG_OFFSET_BLDCNT, half1 | half2); } -/*static*/ void ScriptCmd_blendoff(void) +static void ScriptCmd_blendoff(void) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); } -/*static*/ void ScriptCmd_call(void) +static void ScriptCmd_call(void) { - gBattleAnimScriptPtr++; - gBattleAnimScriptRetAddr = gBattleAnimScriptPtr + 4; - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + sBattleAnimScriptRetAddr = sBattleAnimScriptPtr + 4; + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); } -/*static*/ void ScriptCmd_return(void) +static void ScriptCmd_return(void) { - gBattleAnimScriptPtr = gBattleAnimScriptRetAddr; + sBattleAnimScriptPtr = sBattleAnimScriptRetAddr; } -/*static*/ void ScriptCmd_setarg(void) +static void ScriptCmd_setarg(void) { - const u8 *addr = gBattleAnimScriptPtr; + const u8 *addr = sBattleAnimScriptPtr; u16 value; u8 argId; - gBattleAnimScriptPtr++; - argId = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; - value = SCRIPT_READ_16(gBattleAnimScriptPtr); - gBattleAnimScriptPtr = addr + 4; + sBattleAnimScriptPtr++; + argId = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + value = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr = addr + 4; gBattleAnimArgs[argId] = value; } -/*static*/ void ScriptCmd_choosetwoturnanim(void) +static void ScriptCmd_choosetwoturnanim(void) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; if (gAnimMoveTurn & 1) - gBattleAnimScriptPtr += 4; - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr += 4; + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); } -/*static*/ void ScriptCmd_jumpifmoveturn(void) +static void ScriptCmd_jumpifmoveturn(void) { u8 toCheck; - gBattleAnimScriptPtr++; - toCheck = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; + toCheck = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; if (toCheck == gAnimMoveTurn) - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); else - gBattleAnimScriptPtr += 4; + sBattleAnimScriptPtr += 4; } -/*static*/ void ScriptCmd_jump(void) +static void ScriptCmd_jump(void) { - gBattleAnimScriptPtr++; - gBattleAnimScriptPtr = SCRIPT_READ_PTR_(gBattleAnimScriptPtr); + sBattleAnimScriptPtr++; + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); } // Uses of this function that rely on a TRUE return are expecting inBattle to not be ticked as defined in contest behavior. As a result, if misused, this function cannot reliably discern between field and contest status and could result in undefined behavior. @@ -1027,29 +1131,29 @@ bool8 IsContest(void) #define tBackgroundId data[0] #define tState data[10] -/*static*/ void ScriptCmd_fadetobg(void) +static void ScriptCmd_fadetobg(void) { u8 backgroundId; u8 taskId; - gBattleAnimScriptPtr++; - backgroundId = gBattleAnimScriptPtr[0]; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; + backgroundId = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; taskId = CreateTask(Task_FadeToBg, 5); gTasks[taskId].tBackgroundId = backgroundId; - gUnknown_02038433 = 1; + sAnimBackgroundFadeState = 1; } -/*static*/ void ScriptCmd_fadetobgfromset(void) +static void ScriptCmd_fadetobgfromset(void) { u8 bg1, bg2, bg3; u8 taskId; - gBattleAnimScriptPtr++; - bg1 = gBattleAnimScriptPtr[0]; - bg2 = gBattleAnimScriptPtr[1]; - bg3 = gBattleAnimScriptPtr[2]; - gBattleAnimScriptPtr += 3; + sBattleAnimScriptPtr++; + bg1 = sBattleAnimScriptPtr[0]; + bg2 = sBattleAnimScriptPtr[1]; + bg3 = sBattleAnimScriptPtr[2]; + sBattleAnimScriptPtr += 3; taskId = CreateTask(Task_FadeToBg, 5); if (IsContest()) @@ -1059,10 +1163,10 @@ bool8 IsContest(void) else gTasks[taskId].tBackgroundId = bg1; - gUnknown_02038433 = 1; + sAnimBackgroundFadeState = 1; } -/*static*/ void Task_FadeToBg(u8 taskId) +static void Task_FadeToBg(u8 taskId) { if (gTasks[taskId].tState == 0) { @@ -1075,11 +1179,11 @@ bool8 IsContest(void) if (gTasks[taskId].tState == 1) { gTasks[taskId].tState++; - gUnknown_02038433 = 2; + sAnimBackgroundFadeState = 2; } else if (gTasks[taskId].tState == 2) { - s16 bgId = (u16)gTasks[taskId].tBackgroundId; + s16 bgId = gTasks[taskId].tBackgroundId; if (bgId == -1) LoadDefaultBg(); @@ -1095,17 +1199,15 @@ bool8 IsContest(void) if (gTasks[taskId].tState == 3) { DestroyTask(taskId); - gUnknown_02038433 = 0; + sAnimBackgroundFadeState = 0; } } -extern u8 gDecompressionBuffer[]; - -/*static*/ void LoadMoveBg(u16 bgId) +static void LoadMoveBg(u16 bgId) { if (IsContest()) { - void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; + const void *tilemap = gBattleAnimBackgroundTable[bgId].tilemap; void *dmaSrc; void *dmaDest; @@ -1125,7 +1227,7 @@ extern u8 gDecompressionBuffer[]; } } -/*static*/ void LoadDefaultBg(void) +static void LoadDefaultBg(void) { if (IsContest()) LoadContestBgAfterMoveAnim(); @@ -1133,21 +1235,24 @@ extern u8 gDecompressionBuffer[]; LoadFittingBackgroundForBattle(); } -/*static*/ void ScriptCmd_restorebg(void) +static void ScriptCmd_restorebg(void) { u8 taskId; - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; taskId = CreateTask(Task_FadeToBg, 5); - gTasks[taskId].data[0] = 0xFFFF; - gUnknown_02038433 = 1; + gTasks[taskId].tBackgroundId = -1; + sAnimBackgroundFadeState = 1; } -/*static*/ void ScriptCmd_waitbgfadeout(void) +#undef tBackgroundId +#undef tState + +static void ScriptCmd_waitbgfadeout(void) { - if (gUnknown_02038433 == 2) + if (sAnimBackgroundFadeState == 2) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 0; } else @@ -1156,11 +1261,11 @@ extern u8 gDecompressionBuffer[]; } } -/*static*/ void ScriptCmd_waitbgfadein(void) +static void ScriptCmd_waitbgfadein(void) { - if (gUnknown_02038433 == 0) + if (sAnimBackgroundFadeState == 0) { - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; gAnimFramesToWait = 0; } else @@ -1169,11 +1274,11 @@ extern u8 gDecompressionBuffer[]; } } -/*static*/ void ScriptCmd_changebg(void) +static void ScriptCmd_changebg(void) { - gBattleAnimScriptPtr++; - LoadMoveBg(gBattleAnimScriptPtr[0]); - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; + LoadMoveBg(sBattleAnimScriptPtr[0]); + sBattleAnimScriptPtr++; } s8 BattleAnimAdjustPanning(s8 pan) @@ -1247,38 +1352,501 @@ s16 sub_80A52EC(s16 a) return var; } -s16 sub_80A5314(s16 a, s16 b, s16 c) +s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan) { - u16 var; + s16 ret; - if (a < b) - var = ((c < 0) ? -c : c); - else if (a > b) - var = -((c < 0) ? -c : c); + if (sourcePan < targetPan) + ret = ((incrementPan < 0) ? -incrementPan : incrementPan); + else if (sourcePan > targetPan) + ret = -((incrementPan < 0) ? -incrementPan : incrementPan); else - var = 0; + ret = 0; - return var; + return ret; } -/*static*/ void ScriptCmd_playsewithpan(void) +static void ScriptCmd_playsewithpan(void) { u16 songId; s8 pan; - gBattleAnimScriptPtr++; - songId = SCRIPT_READ_16(gBattleAnimScriptPtr); - pan = gBattleAnimScriptPtr[2]; + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + pan = sBattleAnimScriptPtr[2]; PlaySE12WithPanning(songId, BattleAnimAdjustPanning(pan)); - gBattleAnimScriptPtr += 3; + sBattleAnimScriptPtr += 3; } -/*static*/ void ScriptCmd_setpan(void) +static void ScriptCmd_setpan(void) { s8 pan; - gBattleAnimScriptPtr++; - pan = gBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + pan = sBattleAnimScriptPtr[0]; SE12PanpotControl(BattleAnimAdjustPanning(pan)); - gBattleAnimScriptPtr++; + sBattleAnimScriptPtr++; +} + +#define tInitialPan data[0] +#define tTargetPan data[1] +#define tIncrementPan data[2] +#define tFramesToWait data[3] +#define tCurrentPan data[4] +#define tFrameCounter data[8] + +static void ScriptCmd_panse_1B(void) +{ + u16 songNum; + s8 currentPanArg, incrementPan, incrementPanArg, currentPan, targetPan; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songNum = SCRIPT_READ_16(sBattleAnimScriptPtr); + currentPanArg = sBattleAnimScriptPtr[2]; + incrementPan = sBattleAnimScriptPtr[3]; + incrementPanArg = sBattleAnimScriptPtr[4]; + framesToWait = sBattleAnimScriptPtr[5]; + + currentPan = BattleAnimAdjustPanning(currentPanArg); + targetPan = BattleAnimAdjustPanning(incrementPan); + incrementPan = CalculatePanIncrement(currentPan, targetPan, incrementPanArg); + taskId = CreateTask(Task_PanFromInitialToTarget, 1); + gTasks[taskId].tInitialPan = currentPan; + gTasks[taskId].tTargetPan = targetPan; + gTasks[taskId].tIncrementPan = incrementPan; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tCurrentPan = currentPan; + + PlaySE12WithPanning(songNum, currentPan); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 6; +} + +void Task_PanFromInitialToTarget(u8 taskId) +{ + bool32 destroyTask = FALSE; + if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) + { + s16 pan; + s16 initialPanning, targetPanning, currentPan, incrementPan; + + gTasks[taskId].tFrameCounter = 0; + initialPanning = gTasks[taskId].tInitialPan; + targetPanning = gTasks[taskId].tTargetPan; + currentPan = gTasks[taskId].tCurrentPan; + incrementPan = gTasks[taskId].tIncrementPan; + pan = currentPan + incrementPan; + gTasks[taskId].tCurrentPan = pan; + + if (incrementPan == 0) // If we're not incrementing, just cancel the task immediately + { + destroyTask = TRUE; + } + else if (initialPanning < targetPanning) // Panning increasing + { + if (pan >= targetPanning) // Target reached + destroyTask = TRUE; + } + else // Panning decreasing + { + if (pan <= targetPanning) // Target reached + destroyTask = TRUE; + } + + if (destroyTask) + { + pan = targetPanning; + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + + SE12PanpotControl(pan); + } +} + +static void ScriptCmd_panse_26(void) +{ + u16 songId; + s8 currentPan, targetPan, incrementPan; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + currentPan = sBattleAnimScriptPtr[2]; + targetPan = sBattleAnimScriptPtr[3]; + incrementPan = sBattleAnimScriptPtr[4]; + framesToWait = sBattleAnimScriptPtr[5]; + + taskId = CreateTask(Task_PanFromInitialToTarget, 1); + gTasks[taskId].tInitialPan = currentPan; + gTasks[taskId].tTargetPan = targetPan; + gTasks[taskId].tIncrementPan = incrementPan; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tCurrentPan = currentPan; + + PlaySE12WithPanning(songId, currentPan); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 6; +} + +static void ScriptCmd_panse_27(void) +{ + u16 songId; + s8 targetPanArg, incrementPanArg, currentPanArg, currentPan, targetPan, incrementPan; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + currentPanArg = sBattleAnimScriptPtr[2]; + targetPanArg = sBattleAnimScriptPtr[3]; + incrementPanArg = sBattleAnimScriptPtr[4]; + framesToWait = sBattleAnimScriptPtr[5]; + + currentPan = BattleAnimAdjustPanning2(currentPanArg); + targetPan = BattleAnimAdjustPanning2(targetPanArg); + incrementPan = BattleAnimAdjustPanning2(incrementPanArg); + + taskId = CreateTask(Task_PanFromInitialToTarget, 1); + gTasks[taskId].tInitialPan = currentPan; + gTasks[taskId].tTargetPan = targetPan; + gTasks[taskId].tIncrementPan = incrementPan; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tCurrentPan = currentPan; + + PlaySE12WithPanning(songId, currentPan); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 6; +} + +#undef tInitialPan +#undef tTargetPan +#undef tIncrementPan +#undef tFramesToWait +#undef tCurrentPan +#undef tFrameCounter + +#define tSongId data[0] +#define tPanning data[1] +#define tFramesToWait data[2] +#define tNumberOfPlays data[3] +#define tFrameCounter data[8] + +static void ScriptCmd_loopsewithpan(void) +{ + u16 songId; + s8 panningArg, panning; + u8 framesToWait, numberOfPlays; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + panningArg = sBattleAnimScriptPtr[2]; + framesToWait = sBattleAnimScriptPtr[3]; + numberOfPlays = sBattleAnimScriptPtr[4]; + panning = BattleAnimAdjustPanning(panningArg); + + taskId = CreateTask(Task_LoopAndPlaySE, 1); + gTasks[taskId].tSongId = songId; + gTasks[taskId].tPanning = panning; + gTasks[taskId].tFramesToWait = framesToWait; + gTasks[taskId].tNumberOfPlays = numberOfPlays; + gTasks[taskId].tFrameCounter = framesToWait; + gTasks[taskId].func(taskId); + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 5; +} + +static void Task_LoopAndPlaySE(u8 taskId) +{ + if (gTasks[taskId].tFrameCounter++ >= gTasks[taskId].tFramesToWait) + { + u16 songId; + s8 panning; + u8 numberOfPlays; + + gTasks[taskId].tFrameCounter = 0; + songId = gTasks[taskId].tSongId; + panning = gTasks[taskId].tPanning; + numberOfPlays = --gTasks[taskId].tNumberOfPlays; + PlaySE12WithPanning(songId, panning); + if (numberOfPlays == 0) + { + DestroyTask(taskId); + gAnimSoundTaskCount--; + } + } +} + +#undef tSongId +#undef tPanning +#undef tFramesToWait +#undef tNumberOfPlays +#undef tFrameCounter + +#define tSongId data[0] +#define tPanning data[1] +#define tFramesToWait data[2] + +static void ScriptCmd_waitplaysewithpan(void) +{ + u16 songId; + s8 panningArg, panning; + u8 framesToWait; + u8 taskId; + + sBattleAnimScriptPtr++; + songId = SCRIPT_READ_16(sBattleAnimScriptPtr); + panningArg = sBattleAnimScriptPtr[2]; + framesToWait = sBattleAnimScriptPtr[3]; + panning = BattleAnimAdjustPanning(panningArg); + + taskId = CreateTask(Task_WaitAndPlaySE, 1); + gTasks[taskId].tSongId = songId; + gTasks[taskId].tPanning = panning; + gTasks[taskId].tFramesToWait = framesToWait; + + gAnimSoundTaskCount++; + sBattleAnimScriptPtr += 4; +} + +static void Task_WaitAndPlaySE(u8 taskId) +{ + if (gTasks[taskId].tFramesToWait-- <= 0) + { + PlaySE12WithPanning(gTasks[taskId].tSongId, gTasks[taskId].tPanning); + DestroyTask(taskId); + gAnimSoundTaskCount--; + } +} + +#undef tSongId +#undef tPanning +#undef tFramesToWait + +static void ScriptCmd_createsoundtask(void) +{ + TaskFunc func; + u8 numArgs, taskId; + s32 i; + + sBattleAnimScriptPtr++; + func = (TaskFunc)SCRIPT_READ_32(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 4; + numArgs = sBattleAnimScriptPtr[0]; + sBattleAnimScriptPtr++; + for (i = 0; i < numArgs; i++) + { + gBattleAnimArgs[i] = SCRIPT_READ_16(sBattleAnimScriptPtr); + sBattleAnimScriptPtr += 2; + } + taskId = CreateTask(func, 1); + func(taskId); + gAnimSoundTaskCount++; +} + +static void ScriptCmd_waitsound(void) +{ + if (gAnimSoundTaskCount != 0) + { + sSoundAnimFramesToWait = 0; + gAnimFramesToWait = 1; + } + else if (IsSEPlaying()) + { + if (++sSoundAnimFramesToWait > 90) + { + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + sSoundAnimFramesToWait = 0; + } + else + { + gAnimFramesToWait = 1; + } + } + else + { + sSoundAnimFramesToWait = 0; + sBattleAnimScriptPtr++; + gAnimFramesToWait = 0; + } +} + +static void ScriptCmd_jumpargeq(void) +{ + u8 argId; + s16 valueToCheck; + + sBattleAnimScriptPtr++; + argId = sBattleAnimScriptPtr[0]; + valueToCheck = SCRIPT_READ_16(sBattleAnimScriptPtr + 1); + + if (valueToCheck == gBattleAnimArgs[argId]) + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr + 3); + else + sBattleAnimScriptPtr += 7; +} + +static void ScriptCmd_jumpifcontest(void) +{ + sBattleAnimScriptPtr++; + if (IsContest()) + sBattleAnimScriptPtr = SCRIPT_READ_PTR(sBattleAnimScriptPtr); + else + sBattleAnimScriptPtr += 4; +} + +static void ScriptCmd_monbgprio_28(void) +{ + u8 wantedBank; + u8 bank; + u8 bankIdentity; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + + if (wantedBank != ANIM_BANK_ATTACKER) + bank = gAnimBankTarget; + else + bank = gAnimBankAttacker; + + bankIdentity = GetBankIdentity(bank); + if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2)) + { + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + } +} + +static void ScriptCmd_monbgprio_29(void) +{ + sBattleAnimScriptPtr++; + if (!IsContest()) + { + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + } +} + +static void ScriptCmd_monbgprio_2A(void) +{ + u8 wantedBank; + u8 bankIdentity; + u8 bank; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + if (GetBankSide(gAnimBankAttacker) != GetBankSide(gAnimBankTarget)) + { + if (wantedBank != ANIM_BANK_ATTACKER) + bank = gAnimBankTarget; + else + bank = gAnimBankAttacker; + + bankIdentity = GetBankIdentity(bank); + if (!IsContest() && (bankIdentity == IDENTITY_PLAYER_MON1 || bankIdentity == IDENTITY_OPPONENT_MON2)) + { + SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); + SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 2); + } + } +} + +static void ScriptCmd_invisible(void) +{ + u8 spriteId; + + spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]); + if (spriteId != 0xFF) + gSprites[spriteId].invisible = 1; + + sBattleAnimScriptPtr += 2; +} + +static void ScriptCmd_visible(void) +{ + u8 spriteId; + + spriteId = GetAnimBankSpriteId(sBattleAnimScriptPtr[1]); + if (spriteId != 0xFF) + gSprites[spriteId].invisible = 0; + + sBattleAnimScriptPtr += 2; +} + +static void ScriptCmd_doublebattle_2D(void) +{ + u8 wantedBank; + u8 r4; + u8 spriteId; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + if (!IsContest() && IsDoubleBattle() + && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)) + { + if (wantedBank == ANIM_BANK_ATTACKER) + { + r4 = sub_80A8364(gAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); + } + else + { + r4 = sub_80A8364(gAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); + } + if (spriteId != 0xFF) + { + gSprites[spriteId].invisible = FALSE; + if (r4 == 2) + gSprites[spriteId].oam.priority = 3; + + if (r4 == 1) + sub_80A477C(FALSE); + else + sub_80A477C(TRUE); + } + } +} + +static void ScriptCmd_doublebattle_2E(void) +{ + u8 wantedBank; + u8 r4; + u8 spriteId; + + wantedBank = sBattleAnimScriptPtr[1]; + sBattleAnimScriptPtr += 2; + if (!IsContest() && IsDoubleBattle() + && GetBankSide(gAnimBankAttacker) == GetBankSide(gAnimBankTarget)) + { + if (wantedBank == ANIM_BANK_ATTACKER) + { + r4 = sub_80A8364(gAnimBankAttacker); + spriteId = GetAnimBankSpriteId(0); + } + else + { + r4 = sub_80A8364(gAnimBankTarget); + spriteId = GetAnimBankSpriteId(1); + } + + if (spriteId != 0xFF && r4 == 2) + gSprites[spriteId].oam.priority = 2; + } +} + +static void ScriptCmd_stopsound(void) +{ + m4aMPlayStop(&gMPlay_SE1); + m4aMPlayStop(&gMPlay_SE2); + sBattleAnimScriptPtr++; } -- cgit v1.2.3 From 4b45282dd37266cc7d263a6fd4a5223f8e92b5be Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 16 Oct 2017 18:12:27 +0200 Subject: start working on battle interface --- src/battle_interface.c | 615 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 615 insertions(+) create mode 100644 src/battle_interface.c (limited to 'src') diff --git a/src/battle_interface.c b/src/battle_interface.c new file mode 100644 index 000000000..4f0c6cfd0 --- /dev/null +++ b/src/battle_interface.c @@ -0,0 +1,615 @@ +#include "global.h" +#include "battle.h" +#include "pokemon.h" +#include "battle_interface.h" +#include "sprite.h" + +extern bool8 IsDoubleBattle(void); +extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; + +// this file's functions +void sub_8072924(struct Sprite *sprite); +void sub_80728B4(struct Sprite *sprite); +const u32 *GetHealthboxElementGfxPtr(u8 elementId); + +// const rom data +const struct OamData gUnknown_0832C138 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +extern const struct SubspriteTable gUnknown_0832C28C[2]; + +static const struct SpriteTemplate gUnknown_0832C140[2] = +{ + { + .tileTag = 0xD6FF, + .paletteTag = 0xD6FF, + .oam = &gUnknown_0832C138, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + { + .tileTag = 0xd700, + .paletteTag = 0xD6FF, + .oam = &gUnknown_0832C138, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + } +}; + +static const struct SpriteTemplate gUnknown_0832C170[2] = +{ + { + .tileTag = 0xd701, + .paletteTag = 0xD6FF, + .oam = &gUnknown_0832C138, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + { + .tileTag = 0xd702, + .paletteTag = 0xD6FF, + .oam = &gUnknown_0832C138, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + } +}; + +static const struct SpriteTemplate gUnknown_0832C1A0 = +{ + .tileTag = 0xd70b, + .paletteTag = 0xd6ff, + .oam = &gUnknown_0832C138, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +const struct OamData gUnknown_0832C1B8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate gUnknown_0832C1C0[4] = +{ + { + .tileTag = 0xd704, + .paletteTag = 0xd704, + .oam = &gUnknown_0832C1B8, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80728B4 + }, + { + .tileTag = 0xd705, + .paletteTag = 0xd704, + .oam = &gUnknown_0832C1B8, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80728B4 + }, + { + .tileTag = 0xd706, + .paletteTag = 0xd704, + .oam = &gUnknown_0832C1B8, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80728B4 + }, + { + .tileTag = 0xd707, + .paletteTag = 0xd704, + .oam = &gUnknown_0832C1B8, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80728B4 + } +}; + +u8 sub_8072304(void) +{ + return 9; +} + +#ifdef NONMATCHING +void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) +{ + s8 i, j; + s8 array[4]; + + for (i = 0; i < 4; i++) + array[i] = 0; + + i = 3; + while (1) + { + if (arg0 < 0) + break; + + array[i] = arg0 % 10; + arg0 /= 10; + i--; + } + + for (j = i; j > -1; j--) + { + array[j] = -1; + } + + if (array[3] == -1) + array[3] = 0; + + if (arg2 == 0) + { + for (i = 0; i < 4; i++) + { + if (array[i] == -1) + { + arg1[i] &= 0xFC00; + arg1[i] |= 0x1E; + + arg1[i + 0x20] &= 0xFC00; + arg1[i + 0x20] |= 0x1E; + } + else + { + arg1[i] &= 0xFC00; + arg1[i] |= array[i] + 0x14; + + arg1[i + 0x20] &= 0xFC00; + arg1[i + 0x20] |= array[i] + 0x34; + } + } + } + else + { + for (i = 0; i < 4; i++) + { + if (array[i] == -1) + { + arg1[i] &= 0xFC00; + arg1[i] |= 0x1E; + + arg1[i + 0x20] &= 0xFC00; + arg1[i + 0x20] |= 0x1E; + } + else + { + arg1[i] &= 0xFC00; + arg1[i] |= array[i] + 0x14; + + arg1[i + 0x20] &= 0xFC00; + arg1[i + 0x20] |= array[i] + 0x34; + } + } + } +} + +#else +__attribute__((naked)) +void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) +{ + 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\ + adds r7, r1, 0\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r10, r2\n\ + movs r3, 0\n\ + movs r2, 0\n\ +_08072324:\n\ + lsls r0, r3, 24\n\ + asrs r0, 24\n\ + mov r3, sp\n\ + adds r1, r3, r0\n\ + strb r2, [r1]\n\ + adds r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _08072324\n\ + movs r3, 0x3\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + mov r9, r0\n\ + mov r8, sp\n\ +_08072344:\n\ + lsls r0, r5, 16\n\ + asrs r6, r0, 16\n\ + cmp r6, 0\n\ + ble _08072372\n\ + lsls r4, r3, 24\n\ + asrs r4, 24\n\ + mov r1, sp\n\ + adds r5, r1, r4\n\ + adds r0, r6, 0\n\ + movs r1, 0xA\n\ + bl __modsi3\n\ + strb r0, [r5]\n\ + adds r0, r6, 0\n\ + movs r1, 0xA\n\ + bl __divsi3\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + subs r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r3, r4, 24\n\ + b _08072344\n\ +_08072372:\n\ + lsls r1, r3, 24\n\ + asrs r0, r1, 24\n\ + cmp r0, r9\n\ + ble _08072396\n\ + movs r4, 0xFF\n\ + movs r3, 0x1\n\ + negs r3, r3\n\ +_08072380:\n\ + asrs r2, r1, 24\n\ + mov r5, sp\n\ + adds r1, r5, r2\n\ + ldrb r0, [r1]\n\ + orrs r0, r4\n\ + strb r0, [r1]\n\ + subs r2, 0x1\n\ + lsls r1, r2, 24\n\ + asrs r0, r1, 24\n\ + cmp r0, r3\n\ + bgt _08072380\n\ +_08072396:\n\ + mov r1, r8\n\ + ldrb r0, [r1, 0x3]\n\ + cmp r0, 0xFF\n\ + bne _080723A2\n\ + movs r0, 0\n\ + strb r0, [r1, 0x3]\n\ +_080723A2:\n\ + mov r2, r10\n\ + cmp r2, 0\n\ + bne _08072432\n\ + movs r3, 0\n\ + movs r1, 0\n\ + movs r6, 0xFC\n\ + lsls r6, 8\n\ + movs r5, 0x1E\n\ + mov r12, r5\n\ +_080723B4:\n\ + lsls r1, 24\n\ + asrs r2, r1, 24\n\ + mov r0, sp\n\ + adds r5, r0, r2\n\ + ldrb r0, [r5]\n\ + mov r8, r1\n\ + cmp r0, 0xFF\n\ + bne _080723EA\n\ + lsls r1, r2, 1\n\ + adds r1, r7\n\ + ldrh r2, [r1]\n\ + adds r0, r6, 0\n\ + ands r0, r2\n\ + mov r2, r12\n\ + orrs r0, r2\n\ + strh r0, [r1]\n\ + lsls r3, 24\n\ + asrs r1, r3, 23\n\ + adds r1, r7\n\ + adds r1, 0x40\n\ + ldrh r2, [r1]\n\ + adds r0, r6, 0\n\ + ands r0, r2\n\ + mov r5, r12\n\ + orrs r0, r5\n\ + strh r0, [r1]\n\ + b _0807241A\n\ +_080723EA:\n\ + lsls r2, 1\n\ + adds r2, r7\n\ + ldrh r0, [r2]\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x14\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + lsls r4, r3, 24\n\ + asrs r3, r4, 24\n\ + lsls r2, r3, 1\n\ + adds r2, r7\n\ + adds r2, 0x40\n\ + ldrh r0, [r2]\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + mov r5, sp\n\ + adds r0, r5, r3\n\ + ldrb r0, [r0]\n\ + adds r0, 0x34\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + adds r3, r4, 0\n\ +_0807241A:\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + add r0, r8\n\ + lsrs r1, r0, 24\n\ + movs r2, 0x80\n\ + lsls r2, 17\n\ + adds r0, r3, r2\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _080723B4\n\ + b _08072496\n\ +_08072432:\n\ + movs r3, 0\n\ + movs r4, 0xFC\n\ + lsls r4, 8\n\ + movs r6, 0x1E\n\ +_0807243A:\n\ + lsls r1, r3, 24\n\ + asrs r2, r1, 24\n\ + mov r3, sp\n\ + adds r5, r3, r2\n\ + ldrb r0, [r5]\n\ + adds r3, r1, 0\n\ + cmp r0, 0xFF\n\ + bne _08072466\n\ + lsls r1, r2, 1\n\ + adds r1, r7\n\ + ldrh r2, [r1]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strh r0, [r1]\n\ + adds r1, 0x40\n\ + ldrh r2, [r1]\n\ + adds r0, r4, 0\n\ + ands r0, r2\n\ + orrs r0, r6\n\ + strh r0, [r1]\n\ + b _08072488\n\ +_08072466:\n\ + lsls r2, 1\n\ + adds r2, r7\n\ + ldrh r0, [r2]\n\ + adds r1, r4, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x14\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ + adds r2, 0x40\n\ + ldrh r0, [r2]\n\ + adds r1, r4, 0\n\ + ands r1, r0\n\ + ldrb r0, [r5]\n\ + adds r0, 0x34\n\ + orrs r1, r0\n\ + strh r1, [r2]\n\ +_08072488:\n\ + movs r5, 0x80\n\ + lsls r5, 17\n\ + adds r0, r3, r5\n\ + lsrs r3, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _0807243A\n\ +_08072496:\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\ + .syntax divided"); +} + +#endif // NONMATCHING + +void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2) +{ + arg2[4] = 0x1E; + sub_8072308(arg1, arg2, 0); + sub_8072308(arg0, arg2 + 5, 1); +} + +u8 CreateBankHealthboxSprites(u8 bank) +{ + s16 data6 = 0; + u8 healthboxSpriteId_1, healthboxSpriteId_2; + u8 unkSpriteId; + struct Sprite *unkSpritePtr; + + if (!IsDoubleBattle()) + { + if (GetBankSide(bank) == SIDE_PLAYER) + { + healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C140[0], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C140[0], 240, 160, 1); + + gSprites[healthboxSpriteId_1].oam.shape = 0; + + gSprites[healthboxSpriteId_2].oam.shape = 0; + gSprites[healthboxSpriteId_2].oam.tileNum += 64; + } + else + { + healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C170[0], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C170[0], 240, 160, 1); + + gSprites[healthboxSpriteId_2].oam.tileNum += 32; + + data6 = 2; + } + gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; + gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + gSprites[healthboxSpriteId_2].callback = sub_8072924; + } + else + { + if (GetBankSide(bank) == SIDE_PLAYER) + { + healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C140[GetBankIdentity(bank) / 2], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C140[GetBankIdentity(bank) / 2], 240, 160, 1); + + gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; + + gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + gSprites[healthboxSpriteId_2].oam.tileNum += 32; + gSprites[healthboxSpriteId_2].callback = sub_8072924; + + data6 = 1; + } + else + { + healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C170[GetBankIdentity(bank) / 2], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C170[GetBankIdentity(bank) / 2], 240, 160, 1); + + gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; + + gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + gSprites[healthboxSpriteId_2].oam.tileNum += 32; + gSprites[healthboxSpriteId_2].callback = sub_8072924; + + data6 = 2; + } + } + + unkSpriteId = CreateSpriteAtEnd(&gUnknown_0832C1C0[gBanksByIdentity[bank]], 140, 60, 0); + unkSpritePtr = &gSprites[unkSpriteId]; + SetSubspriteTables(unkSpritePtr, &gUnknown_0832C28C[GetBankSide(bank)]); + unkSpritePtr->subspriteMode = 2; + unkSpritePtr->oam.priority = 1; + + CpuCopy32(GetHealthboxElementGfxPtr(1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64); + + gSprites[healthboxSpriteId_1].data5 = unkSpriteId; + gSprites[healthboxSpriteId_1].data6 = bank; + gSprites[healthboxSpriteId_1].invisible = 1; + + gSprites[healthboxSpriteId_2].invisible = 1; + + unkSpritePtr->data5 = healthboxSpriteId_1; + unkSpritePtr->data6 = data6; + unkSpritePtr->invisible = 1; + + return healthboxSpriteId_1; +} + +u8 CreateSafariPlayerHealthboxSprites(void) +{ + u8 healthboxSpriteId_1, healthboxSpriteId_2; + + healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C1A0, 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C1A0, 240, 160, 1); + + gSprites[healthboxSpriteId_1].oam.shape = 0; + gSprites[healthboxSpriteId_2].oam.shape = 0; + + gSprites[healthboxSpriteId_2].oam.tileNum += 64; + + gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; + gSprites[healthboxSpriteId_2].data5 = healthboxSpriteId_1; + + gSprites[healthboxSpriteId_2].callback = sub_8072924; + + return healthboxSpriteId_1; +} + +extern const u32 gHealthboxElementsGfxTable[][8]; + +const u32 *GetHealthboxElementGfxPtr(u8 elementId) +{ + return gHealthboxElementsGfxTable[elementId]; +} + +void sub_80728B4(struct Sprite *sprite) +{ + u8 var = sprite->data5; + + switch (sprite->data6) + { + case 0: + sprite->pos1.x = gSprites[var].pos1.x + 16; + sprite->pos1.y = gSprites[var].pos1.y; + break; + case 1: + sprite->pos1.x = gSprites[var].pos1.x + 16; + sprite->pos1.y = gSprites[var].pos1.y; + break; + case 2: + default: + sprite->pos1.x = gSprites[var].pos1.x + 8; + sprite->pos1.y = gSprites[var].pos1.y; + break; + } + + sprite->pos2.x = gSprites[var].pos2.x; + sprite->pos2.y = gSprites[var].pos2.y; +} + +void sub_8072924(struct Sprite *sprite) +{ + u8 otherSpriteId = sprite->data5; + + sprite->pos1.x = gSprites[otherSpriteId].pos1.x + 64; + sprite->pos1.y = gSprites[otherSpriteId].pos1.y; + + sprite->pos2.x = gSprites[otherSpriteId].pos2.x; + sprite->pos2.y = gSprites[otherSpriteId].pos2.y; +} + +void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, u32 maxVal, u32 currVal, bool32 isDoubleBattle) +{ + gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId = healthboxSpriteId; + gBattleSpritesDataPtr->battleBars[bank].maxValue = maxVal; + gBattleSpritesDataPtr->battleBars[bank].currentValue = currVal; + gBattleSpritesDataPtr->battleBars[bank].isDoubleBattle = isDoubleBattle; + gBattleSpritesDataPtr->battleBars[bank].field_10 = -32768; +} -- cgit v1.2.3 From 0ffc5652fd746816a763e4e0ec83c08f2f53222c Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 18 Oct 2017 00:00:46 +0200 Subject: hp printing in healthboxes done I hope --- src/battle_interface.c | 309 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) (limited to 'src') diff --git a/src/battle_interface.c b/src/battle_interface.c index 4f0c6cfd0..e8ab8e478 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -3,6 +3,9 @@ #include "pokemon.h" #include "battle_interface.h" #include "sprite.h" +#include "window.h" +#include "string_util.h" +#include "text.h" extern bool8 IsDoubleBattle(void); extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; @@ -11,6 +14,12 @@ extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; void sub_8072924(struct Sprite *sprite); void sub_80728B4(struct Sprite *sprite); const u32 *GetHealthboxElementGfxPtr(u8 elementId); +u32 AddTextPrinterAndCreateWindowOnHealthbox(u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId); +void sub_8075198(void *objVram, u32 windowTileData, u32 arg2); +void RemoveWindow_(u32 windowId); +void sub_8075170(void *dest, u32 arg1, u32 arg2); +void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); +void sub_807513C(void *dest, u32 arg1, u32 arg2); // const rom data const struct OamData gUnknown_0832C138 = @@ -144,6 +153,9 @@ static const struct SpriteTemplate gUnknown_0832C1C0[4] = } }; +extern const u8 gUnknown_0832C3C4[0x14]; +extern const u8 gUnknown_0832C3D8[0x14]; + u8 sub_8072304(void) { return 9; @@ -613,3 +625,300 @@ void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, u32 maxVal, u32 currVal, gBattleSpritesDataPtr->battleBars[bank].isDoubleBattle = isDoubleBattle; gBattleSpritesDataPtr->battleBars[bank].field_10 = -32768; } + +void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) +{ + gSprites[healthboxSpriteId].invisible = 1; + gSprites[gSprites[healthboxSpriteId].data5].invisible = 1; + gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 1; +} + +void SetHealthboxSpriteVisible(u8 healthboxSpriteId) +{ + gSprites[healthboxSpriteId].invisible = 0; + gSprites[gSprites[healthboxSpriteId].data5].invisible = 0; + gSprites[gSprites[healthboxSpriteId].oam.affineParam].invisible = 0; +} + +static void UpdateSpritePos(u8 spriteId, s16 x, s16 y) +{ + gSprites[spriteId].pos1.x = x; + gSprites[spriteId].pos1.y = y; +} + +void DestoryHealthboxSprite(u8 healthboxSpriteId) +{ + DestroySprite(&gSprites[gSprites[healthboxSpriteId].oam.affineParam]); + DestroySprite(&gSprites[gSprites[healthboxSpriteId].data5]); + DestroySprite(&gSprites[healthboxSpriteId]); +} + +void nullsub_30(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly) +{ + +} + +extern u8 gNoOfAllBanks; +extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT]; + +void UpdateOamPriorityInAllHealthboxes(u8 priority) +{ + s32 i; + + for (i = 0; i < gNoOfAllBanks; i++) + { + u8 healthboxSpriteId_1 = gHealthBoxesIds[i]; + u8 healthboxSpriteId_2 = gSprites[gHealthBoxesIds[i]].oam.affineParam; + u8 healthboxSpriteId_3 = gSprites[gHealthBoxesIds[i]].data5; + + gSprites[healthboxSpriteId_1].oam.priority = priority; + gSprites[healthboxSpriteId_2].oam.priority = priority; + gSprites[healthboxSpriteId_3].oam.priority = priority; + } +} + +void SetBankHealthboxSpritePos(u8 bank) +{ + s16 x = 0, y = 0; + + if (!IsDoubleBattle()) + { + if (GetBankSide(bank) != SIDE_PLAYER) + x = 44, y = 30; + else + x = 158, y = 88; + } + else + { + switch (GetBankIdentity(bank)) + { + case IDENTITY_PLAYER_MON1: + x = 159, y = 76; + break; + case IDENTITY_PLAYER_MON2: + x = 171, y = 101; + break; + case IDENTITY_OPPONENT_MON1: + x = 44, y = 19; + break; + case IDENTITY_OPPONENT_MON2: + x = 32, y = 44; + break; + } + } + + UpdateSpritePos(gHealthBoxesIds[bank], x, y); +} + +void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) +{ + u32 windowId, windowTileData, spriteTileNum; + u8 text[16]; + u32 xPos, var1; + void *objVram; + + text[0] = 0xF9; + text[1] = 5; + + xPos = (u32) ConvertIntToDecimalStringN(text + 2, lvl, STR_CONV_MODE_LEFT_ALIGN, 3); + // Alright, that part was unmatchable. It's basically doing: + // xPos = 5 * (3 - (u32)(&text[2])); + xPos--; + xPos--; + xPos -= ((u32)(text)); + var1 = (3 - xPos); + xPos = 4 * var1; + xPos += var1; + + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, xPos, 3, 2, &windowId); + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; + + if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + { + objVram = (void*)(OBJ_VRAM0); + if (!IsDoubleBattle()) + objVram += spriteTileNum + 0x820; + else + objVram += spriteTileNum + 0x420; + } + else + { + objVram = (void*)(OBJ_VRAM0); + objVram += spriteTileNum + 0x400; + } + sub_8075198(objVram, windowTileData, 3); + RemoveWindow_(windowId); +} + +void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) +{ + u32 windowId, windowTileData, spriteTileNum; + u8 text[32]; + void *objVram; + + if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER && !IsDoubleBattle()) + { + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; + if (maxOrCurrent) // singles, max + { + ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 2, &windowId); + objVram = (void*)(OBJ_VRAM0); + objVram += spriteTileNum + 0xB40; + sub_8075170(objVram, windowTileData, 2); + RemoveWindow_(windowId); + } + else // singles, current + { + ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); + text[3] = CHAR_SLASH; + text[4] = EOS; + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, 2, &windowId); + objVram = (void*)(OBJ_VRAM0); + objVram += spriteTileNum + 0x3E0; + sub_8075170(objVram, windowTileData, 1); + objVram = (void*)(OBJ_VRAM0); + objVram += spriteTileNum + 0xB00; + sub_8075170(objVram, windowTileData + 0x20, 2); + RemoveWindow_(windowId); + } + + } + else + { + u8 bank; + + memcpy(text, gUnknown_0832C3C4, sizeof(gUnknown_0832C3C4)); + bank = gSprites[healthboxSpriteId].data6; + if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT) + { + UpdateHpTextInHealthboxInDoubles(healthboxSpriteId, value, maxOrCurrent); + } + else + { + u32 var; + u8 i; + + if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + { + if (!maxOrCurrent) + var = 29; + else + var = 89; + } + else + { + if (!maxOrCurrent) + var = 20; + else + var = 48; + } + + ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3); + RenderTextFont9(gMonSpritesGfxPtr->fontPixels, 9, text); + + for (i = 0; i < 3; i++) + { + CpuCopy32(&gMonSpritesGfxPtr->fontPixels[i * 64 + 32], + (void*)((OBJ_VRAM0) + 32 * (gSprites[healthboxSpriteId].oam.tileNum + var + i)), + 0x20); + } + } + } +} + +extern const u8 gText_Slash[]; + +void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) +{ + u32 windowId, windowTileData, spriteTileNum; + u8 text[32]; + void *objVram; + + if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + { + if (gBattleSpritesDataPtr->bankData[gSprites[healthboxSpriteId].data6].hpNumbersNoBars) // don't print text if only bars are visible + { + spriteTileNum = gSprites[gSprites[healthboxSpriteId].data5].oam.tileNum * 32; + objVram = (void*)(OBJ_VRAM0) + spriteTileNum; + + if (maxOrCurrent) // doubles, max hp + { + ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 0, &windowId); + sub_8075170((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2); + RemoveWindow_(windowId); + CpuCopy32(GetHealthboxElementGfxPtr(0x74), + (void*)(OBJ_VRAM0 + 0x680) + (gSprites[healthboxSpriteId].oam.tileNum * 32), + 0x20); + } + else + { + ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); + text[3] = CHAR_SLASH; + text[4] = EOS; + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, 0, &windowId); + sub_807513C(objVram, 0, 3); + sub_8075170((void*)(OBJ_VRAM0 + 0x60) + spriteTileNum, windowTileData, 3); + RemoveWindow_(windowId); + } + } + } + else + { + u8 bank; + + memcpy(text, gUnknown_0832C3D8, sizeof(gUnknown_0832C3D8)); + bank = gSprites[healthboxSpriteId].data6; + + if (gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) // don't print text if only bars are visible + { + u8 var = 4; + u8 r7; + u8 *txtPtr; + u8 i; + + if (!maxOrCurrent) + var = 0; + + r7 = gSprites[healthboxSpriteId].data5; + txtPtr = ConvertIntToDecimalStringN(text + 6, value, STR_CONV_MODE_RIGHT_ALIGN, 3); + if (!maxOrCurrent) + StringCopy(txtPtr, gText_Slash); + RenderTextFont9(gMonSpritesGfxPtr->fontPixels, 9, text); + + for (i = var; i < var + 3; i++) + { + if (i < 3) + { + CpuCopy32(&gMonSpritesGfxPtr->fontPixels[((i - var) * 64) + 32], + (void*)((OBJ_VRAM0) + 32 * (1 + gSprites[r7].oam.tileNum + i)), + 0x20); + } + else + { + CpuCopy32(&gMonSpritesGfxPtr->fontPixels[((i - var) * 64) + 32], + (void*)((OBJ_VRAM0 + 0x20) + 32 * (i + gSprites[r7].oam.tileNum)), + 0x20); + } + } + + if (!maxOrCurrent) + { + CpuCopy32(&gMonSpritesGfxPtr->fontPixels[224], + (void*)((OBJ_VRAM0) + ((gSprites[r7].oam.tileNum + 4) * 32)), + 0x20); + CpuFill32(0, (void*)((OBJ_VRAM0) + (gSprites[r7].oam.tileNum * 32)), 0x20); + } + else + { + if (GetBankSide(bank) == SIDE_PLAYER) // impossible to reach part, because the bank is from the opponent's side + { + CpuCopy32(GetHealthboxElementGfxPtr(0x74), + (void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * 32), + 0x20); + } + } + } + } +} -- cgit v1.2.3 From 6e56211f40d7a191afd91bcf41d63178e26b5199 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 18 Oct 2017 21:42:00 +0200 Subject: more of battle interface done --- src/battle_interface.c | 674 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 667 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/battle_interface.c b/src/battle_interface.c index e8ab8e478..9080b3905 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -6,9 +6,24 @@ #include "window.h" #include "string_util.h" #include "text.h" +#include "battle_controllers.h" +#include "sound.h" +#include "songs.h" +#include "decompress.h" +#include "task.h" +#include "util.h" +#include "gpu_regs.h" +#include "battle_message.h" +#include "species.h" extern bool8 IsDoubleBattle(void); extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; +extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; +extern u8 gNoOfAllBanks; +extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT]; + +extern const u8 * const gNatureNamePointers[]; +extern const u8 gText_Slash[]; // this file's functions void sub_8072924(struct Sprite *sprite); @@ -20,6 +35,13 @@ void RemoveWindow_(u32 windowId); void sub_8075170(void *dest, u32 arg1, u32 arg2); void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void sub_807513C(void *dest, u32 arg1, u32 arg2); +void UpdateStatusIconInHealthbox(u8 healthboxSpriteId); +void sub_80741C8(struct Sprite *sprite); +void sub_8073E08(u8 taskId); +void sub_8073F98(u8 taskId); +void sub_8073E64(u8 taskId); +void sub_8074158(struct Sprite *sprite); +void sub_8074090(struct Sprite *sprite); // const rom data const struct OamData gUnknown_0832C138 = @@ -155,6 +177,15 @@ static const struct SpriteTemplate gUnknown_0832C1C0[4] = extern const u8 gUnknown_0832C3C4[0x14]; extern const u8 gUnknown_0832C3D8[0x14]; +extern const u32 gHealthboxElementsGfxTable[][8]; +extern const struct CompressedSpriteSheet gUnknown_0832C334; +extern const struct SpriteSheet gUnknown_0832C34C; +extern const struct SpritePalette gUnknown_0832C33C; +extern const struct SpritePalette gUnknown_0832C344; +extern const struct SpriteTemplate gUnknown_0832C364[2]; +extern const struct SpriteTemplate gUnknown_0832C394[2]; +extern const struct SubspriteTable gUnknown_0832C2C4; +extern const struct SubspriteTable gUnknown_0832C2CC; u8 sub_8072304(void) { @@ -574,8 +605,6 @@ u8 CreateSafariPlayerHealthboxSprites(void) return healthboxSpriteId_1; } -extern const u32 gHealthboxElementsGfxTable[][8]; - const u32 *GetHealthboxElementGfxPtr(u8 elementId) { return gHealthboxElementsGfxTable[elementId]; @@ -658,9 +687,6 @@ void nullsub_30(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly) } -extern u8 gNoOfAllBanks; -extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT]; - void UpdateOamPriorityInAllHealthboxes(u8 priority) { s32 i; @@ -827,8 +853,6 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) } } -extern const u8 gText_Slash[]; - void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { u32 windowId, windowTileData, spriteTileNum; @@ -922,3 +946,639 @@ void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrC } } } + +void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) +{ + u8 text[20]; + s32 j, var2; + u8 *fontPixels; + u8 i, var, nature, healthboxSpriteId_2; + + memcpy(text, gUnknown_0832C3C4, sizeof(gUnknown_0832C3C4)); + fontPixels = &gMonSpritesGfxPtr->fontPixels[0x520 + (GetBankIdentity(gSprites[healthboxSpriteId].data6) * 384)]; + var = 5; + nature = GetNature(mon); + StringCopy(text + 6, gNatureNamePointers[nature]); + RenderTextFont9(fontPixels, 9, text); + + for (j = 6, i = 0; i < var; i++, j++) + { + u8 elementId; + + if ((text[j] >= 55 && text[j] <= 74) || (text[j] >= 135 && text[j] <= 154)) + elementId = 44; + else if ((text[j] >= 75 && text[j] <= 79) || (text[j] >= 155 && text[j] <= 159)) + elementId = 45; + else + elementId = 43; + + CpuCopy32(GetHealthboxElementGfxPtr(elementId), fontPixels + (i * 64), 0x20); + } + + for (j = 1; j < var + 1; j++) + { + var2 = (gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * 32; + CpuCopy32(fontPixels, (void*)(OBJ_VRAM0) + (var2), 0x20); + fontPixels += 0x20; + + var2 = (8 + gSprites[healthboxSpriteId].oam.tileNum + (j - (j / 8 * 8)) + (j / 8 * 64)) * 32; + CpuCopy32(fontPixels, (void*)(OBJ_VRAM0) + (var2), 0x20); + fontPixels += 0x20; + } + + healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5; + ConvertIntToDecimalStringN(text + 6, gBattleStruct->field_7C, STR_CONV_MODE_RIGHT_ALIGN, 2); + ConvertIntToDecimalStringN(text + 9, gBattleStruct->field_7B, STR_CONV_MODE_RIGHT_ALIGN, 2); + text[5] = CHAR_SPACE; + text[8] = CHAR_SLASH; + RenderTextFont9(gMonSpritesGfxPtr->fontPixels, 9, text); + + j = healthboxSpriteId_2; // needed to match for some reason + for (j = 0; j < 5; j++) + { + if (j <= 1) + { + CpuCopy32(&gMonSpritesGfxPtr->fontPixels[0x40 * j + 0x20], + (void*)(OBJ_VRAM0) + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + j) * 32, + 32); + } + else + { + CpuCopy32(&gMonSpritesGfxPtr->fontPixels[0x40 * j + 0x20], + (void*)(OBJ_VRAM0 + 0xC0) + (j + gSprites[healthboxSpriteId_2].oam.tileNum) * 32, + 32); + } + } +} + +void SwapHpBarsWithHpText(void) +{ + s32 i; + u8 spriteId; + + for (i = 0; i < gNoOfAllBanks; i++) + { + if (gSprites[gHealthBoxesIds[i]].callback == SpriteCallbackDummy + && GetBankSide(i) != SIDE_OPPONENT + && (IsDoubleBattle() || GetBankSide(i) != SIDE_PLAYER)) + { + bool8 noBars; + + gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars ^= 1; + noBars = gBattleSpritesDataPtr->bankData[i].hpNumbersNoBars; + if (GetBankSide(i) == SIDE_PLAYER) + { + if (!IsDoubleBattle()) + continue; + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + continue; + + if (noBars == TRUE) // bars to text + { + spriteId = gSprites[gHealthBoxesIds[i]].data5; + + CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), 0); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); + } + else // text to bars + { + UpdateStatusIconInHealthbox(gHealthBoxesIds[i]); + UpdateHealthboxAttribute(gHealthBoxesIds[i], &gPlayerParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR); + CpuCopy32(GetHealthboxElementGfxPtr(0x75), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthBoxesIds[i]].oam.tileNum * 32), 32); + } + } + else + { + if (noBars == TRUE) // bars to text + { + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + { + sub_80730D4(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]]); + } + else + { + spriteId = gSprites[gHealthBoxesIds[i]].data5; + + CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), 0); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); + } + } + else // text to bars + { + UpdateStatusIconInHealthbox(gHealthBoxesIds[i]); + UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR); + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) + UpdateHealthboxAttribute(gHealthBoxesIds[i], &gEnemyParty[gBattlePartyID[i]], HEALTHBOX_NICK); + } + } + gSprites[gHealthBoxesIds[i]].data7 ^= 1; + } + } +} + +u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 arg2, bool8 isBattleStart) +{ + bool8 isOpponent; + s16 bar_X, bar_Y, bar_pos2_X, bar_data0; + s32 i, j, var; + u8 barSpriteId; + u8 ballIconSpritesIds[6]; + u8 taskId; + + if (!arg2 || GetBankIdentity(bank) != IDENTITY_OPPONENT_MON2) + { + if (GetBankSide(bank) == SIDE_PLAYER) + { + isOpponent = FALSE; + bar_X = 136, bar_Y = 96; + bar_pos2_X = 100; + bar_data0 = -5; + } + else + { + isOpponent = TRUE; + + if (!arg2 || !IsDoubleBattle()) + bar_X = 104, bar_Y = 40; + else + bar_X = 104, bar_Y = 16; + + bar_pos2_X = -100; + bar_data0 = 5; + } + } + else + { + isOpponent = TRUE; + bar_X = 104, bar_Y = 40; + bar_pos2_X = -100; + bar_data0 = 5; + } + + LoadCompressedObjectPicUsingHeap(&gUnknown_0832C334); + LoadSpriteSheet(&gUnknown_0832C34C); + LoadSpritePalette(&gUnknown_0832C33C); + LoadSpritePalette(&gUnknown_0832C344); + + barSpriteId = CreateSprite(&gUnknown_0832C364[isOpponent], bar_X, bar_Y, 10); + SetSubspriteTables(&gSprites[barSpriteId], &gUnknown_0832C2C4); + gSprites[barSpriteId].pos2.x = bar_pos2_X; + gSprites[barSpriteId].data0 = bar_data0; + + if (isOpponent) + { + gSprites[barSpriteId].pos1.x -= 96; + gSprites[barSpriteId].oam.matrixNum = 8; + } + else + { + gSprites[barSpriteId].pos1.x += 96; + } + + for (i = 0; i < 6; i++) + { + ballIconSpritesIds[i] = CreateSpriteAtEnd(&gUnknown_0832C394[isOpponent], bar_X, bar_Y - 4, 9); + + if (!isBattleStart) + gSprites[ballIconSpritesIds[i]].callback = sub_80741C8; + + if (!isOpponent) + { + gSprites[ballIconSpritesIds[i]].pos2.x = 0; + gSprites[ballIconSpritesIds[i]].pos2.y = 0; + } + + gSprites[ballIconSpritesIds[i]].data0 = barSpriteId; + + if (!isOpponent) + { + gSprites[ballIconSpritesIds[i]].pos1.x += 10 * i + 24; + gSprites[ballIconSpritesIds[i]].data1 = i * 7 + 10; + gSprites[ballIconSpritesIds[i]].pos2.x = 120; + } + else + { + gSprites[ballIconSpritesIds[i]].pos1.x -= 10 * (5 - i) + 24; + gSprites[ballIconSpritesIds[i]].data1 = (6 - i) * 7 + 10; + gSprites[ballIconSpritesIds[i]].pos2.x = -120; + } + + gSprites[ballIconSpritesIds[i]].data2 = isOpponent; + } + + if (GetBankSide(bank) == SIDE_PLAYER) + { + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + for (i = 0; i < 6; i++) + { + if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg + { + gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; + gSprites[ballIconSpritesIds[i]].data7 = 1; + } + else if (partyInfo[i].hp == 0) // fainted mon + { + gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; + } + else if (partyInfo[i].status != 0) // mon with major status + { + gSprites[ballIconSpritesIds[i]].oam.tileNum += 2; + } + } + } + else + { + for (i = 0, var = 5, j = 0; j < 6; j++) + { + if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg + { + gSprites[ballIconSpritesIds[var]].oam.tileNum += 1; + gSprites[ballIconSpritesIds[var]].data7 = 1; + var--; + continue; + } + else if (partyInfo[j].hp == 0) // fainted mon + { + gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; + } + else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_2A0 & gBitTable[j]) // hmm...? + { + gSprites[ballIconSpritesIds[i]].oam.tileNum += 3; + } + else if (partyInfo[j].status != 0) // mon with major status + { + gSprites[ballIconSpritesIds[i]].oam.tileNum += 2; + } + i++; + } + } + } + else + { + if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) + { + for (var = 5, i = 0; i < 6; i++) + { + if (partyInfo[i].hp == 0xFFFF) // empty slot or an egg + { + gSprites[ballIconSpritesIds[var]].oam.tileNum += 1; + gSprites[ballIconSpritesIds[var]].data7 = 1; + } + else if (partyInfo[i].hp == 0) // fainted mon + { + gSprites[ballIconSpritesIds[var]].oam.tileNum += 3; + } + else if (partyInfo[i].status != 0) // mon with major status + { + gSprites[ballIconSpritesIds[var]].oam.tileNum += 2; + } + var--; + } + } + else + { + for (var = 0, i = 0, j = 0; j < 6; j++) + { + if (partyInfo[j].hp == 0xFFFF) // empty slot or an egg + { + gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; + gSprites[ballIconSpritesIds[i]].data7 = 1; + i++; + continue; + } + else if (partyInfo[j].hp == 0) // fainted mon + { + gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3; + } + else if (gBattleTypeFlags & BATTLE_TYPE_ARENA && gBattleStruct->field_2A1 & gBitTable[j]) // hmm...? + { + gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 3; + } + else if (partyInfo[j].status != 0) // mon with major status + { + gSprites[ballIconSpritesIds[5 - var]].oam.tileNum += 2; + } + var++; + } + } + } + + taskId = CreateTask(TaskDummy, 5); + gTasks[taskId].data[0] = bank; + gTasks[taskId].data[1] = barSpriteId; + + for (i = 0; i < 6; i++) + gTasks[taskId].data[3 + i] = ballIconSpritesIds[i]; + + gTasks[taskId].data[10] = isBattleStart; + + if (isBattleStart) + { + gBattleSpritesDataPtr->animationData->field_9_x1C++; + } + + PlaySE12WithPanning(SE_TB_START, 0); + return taskId; +} + +void sub_8073C30(u8 taskId) +{ + u8 sp[6]; + u8 r7; + u8 r10; + u8 bank; + s32 i; + + r7 = gTasks[taskId].data[10]; + r10 = gTasks[taskId].data[1]; + bank = gTasks[taskId].data[0]; + + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + + SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40); + SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); + + gTasks[taskId].data[15] = 16; + + for (i = 0; i < 6; i++) + gSprites[sp[i]].oam.objMode = 1; + + gSprites[r10].oam.objMode = 1; + + if (r7 != 0) + { + for (i = 0; i < 6; i++) + { + if (GetBankSide(bank) != SIDE_PLAYER) + { + gSprites[sp[5 - i]].data1 = 7 * i; + gSprites[sp[5 - i]].data3 = 0; + gSprites[sp[5 - i]].data4 = 0; + gSprites[sp[5 - i]].callback = sub_8074158; + } + else + { + gSprites[sp[i]].data1 = 7 * i; + gSprites[sp[i]].data3 = 0; + gSprites[sp[i]].data4 = 0; + gSprites[sp[i]].callback = sub_8074158; + } + } + gSprites[r10].data0 /= 2; + gSprites[r10].data1 = 0; + gSprites[r10].callback = sub_8074090; + SetSubspriteTables(&gSprites[r10], &gUnknown_0832C2CC); + gTasks[taskId].func = sub_8073E08; + } + else + { + gTasks[taskId].func = sub_8073F98; + } +} + +void sub_8073E08(u8 taskId) +{ + u16 temp = gTasks[taskId].data[11]++; + + if (!(temp & 1)) + { + gTasks[taskId].data[15]--; + if (gTasks[taskId].data[15] < 0) + return; + + SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8)); + } + if (gTasks[taskId].data[15] == 0) + gTasks[taskId].func = sub_8073E64; +} + +void sub_8073E64(u8 taskId) +{ + u8 sp[6]; + s32 i; + + u8 bank = gTasks[taskId].data[0]; + gTasks[taskId].data[15]--; + if (gTasks[taskId].data[15] == -1) + { + u8 var = gTasks[taskId].data[1]; + + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + + gBattleSpritesDataPtr->animationData->field_9_x1C--; + if (!gBattleSpritesDataPtr->animationData->field_9_x1C) + { + DestroySpriteAndFreeResources(&gSprites[var]); + DestroySpriteAndFreeResources(&gSprites[sp[0]]); + } + else + { + FreeSpriteOamMatrix(&gSprites[var]); + DestroySprite(&gSprites[var]); + FreeSpriteOamMatrix(&gSprites[sp[0]]); + DestroySprite(&gSprites[sp[0]]); + } + + for (i = 1; i < 6; i++) + DestroySprite(&gSprites[sp[i]]); + } + else if (gTasks[taskId].data[15] == -3) + { + gBattleSpritesDataPtr->healthBoxesData[bank].flag_x1 = 0; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + DestroyTask(taskId); + } +} + +void sub_8073F98(u8 taskId) +{ + u8 sp[6]; + s32 i; + + u8 bank = gTasks[taskId].data[0]; + gTasks[taskId].data[15]--; + if (gTasks[taskId].data[15] >= 0) + { + SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[15]) | ((16 - gTasks[taskId].data[15]) << 8)); + } + else if (gTasks[taskId].data[15] == -1) + { + u8 var = gTasks[taskId].data[1]; + + for (i = 0; i < 6; i++) + sp[i] = gTasks[taskId].data[3 + i]; + + DestroySpriteAndFreeResources(&gSprites[var]); + DestroySpriteAndFreeResources(&gSprites[sp[0]]); + + for (i = 1; i < 6; i++) + DestroySprite(&gSprites[sp[i]]); + } + else if (gTasks[taskId].data[15] == -3) + { + gBattleSpritesDataPtr->healthBoxesData[bank].flag_x1 = 0; + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + DestroyTask(taskId); + } +} + +void sub_8074078(struct Sprite *sprite) +{ + if (sprite->pos2.x != 0) + sprite->pos2.x += sprite->data0; +} + +void sub_8074090(struct Sprite *sprite) +{ + sprite->data1 += 32; + if (sprite->data0 > 0) + sprite->pos2.x += sprite->data1 >> 4; + else + sprite->pos2.x -= sprite->data1 >> 4; + sprite->data1 &= 0xF; +} + +void sub_80740C4(struct Sprite *sprite) +{ + u8 var1; + u16 var2; + s8 pan; + + if (sprite->data1 > 0) + { + sprite->data1--; + return; + } + var1 = sprite->data2; + var2 = sprite->data3; + var2 += 56; + sprite->data3 = var2 & 0xFFF0; + if (var1 != 0) + { + sprite->pos2.x += var2 >> 4; + if (sprite->pos2.x > 0) + sprite->pos2.x = 0; + } + else + { + sprite->pos2.x -= var2 >> 4; + if (sprite->pos2.x < 0) + sprite->pos2.x = 0; + } + if (sprite->pos2.x == 0) + { + pan = 63; + if (var1 != 0) + pan = -64; + if (sprite->data7 != 0) + PlaySE2WithPanning(SE_TB_KARA, pan); + else + PlaySE1WithPanning(SE_TB_KON, pan); + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_8074158(struct Sprite *sprite) +{ + u8 var1; + u16 var2; + + if (sprite->data1 > 0) + { + sprite->data1--; + return; + } + var1 = sprite->data2; + var2 = sprite->data3; + var2 += 56; + sprite->data3 = var2 & 0xFFF0; + if (var1 != 0) + sprite->pos2.x += var2 >> 4; + else + sprite->pos2.x -= var2 >> 4; + if (sprite->pos2.x + sprite->pos1.x > 248 + || sprite->pos2.x + sprite->pos1.x < -8) + { + sprite->invisible = TRUE; + sprite->callback = SpriteCallbackDummy; + } +} + +void sub_80741C8(struct Sprite *sprite) +{ + u8 barSpriteId = sprite->data0; + + sprite->pos2.x = gSprites[barSpriteId].pos2.x; + sprite->pos2.y = gSprites[barSpriteId].pos2.y; +} + +extern const u8 gText_HighlightDarkGrey[]; +extern const u8 gText_DynColor2[]; +extern const u8 gText_DynColor2Male[]; +extern const u8 gText_DynColor1Female[]; +extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; + +void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) +{ + u8 nickname[POKEMON_NAME_LENGTH + 1]; + void *ptr; + const u8 *genderTxt; + u32 windowId, windowTileData, spriteTileNum; + u16 species; + u8 gender; + + StringCopy(gDisplayedStringBattle, gText_HighlightDarkGrey); + GetMonData(mon, MON_DATA_NICKNAME, nickname); + StringGetEnd10(nickname); + ptr = StringAppend(gDisplayedStringBattle, nickname); + + gender = GetMonGender(mon); + species = GetMonData(mon, MON_DATA_SPECIES); + + if ((species == SPECIES_NIDORAN_F || species == SPECIES_NIDORAN_M) && StringCompare(nickname, gSpeciesNames[species]) == 0) + gender = 100; + + // AddTextPrinterAndCreateWindowOnHealthbox's arguments are the same in all 3 cases. + // It's possible they may have been different in early development phases. + switch (gender) + { + default: + StringCopy(ptr, gText_DynColor2); + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, 2, &windowId); + break; + case MON_MALE: + StringCopy(ptr, gText_DynColor2Male); + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, 2, &windowId); + break; + case MON_FEMALE: + StringCopy(ptr, gText_DynColor1Female); + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gDisplayedStringBattle, 0, 3, 2, &windowId); + break; + } + + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; + + if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + { + sub_8075198((void*)(0x6010040 + spriteTileNum), windowTileData, 6); + ptr = (void*)(OBJ_VRAM0); + if (!IsDoubleBattle()) + ptr += spriteTileNum + 0x800; + else + ptr += spriteTileNum + 0x400; + sub_8075198(ptr, windowTileData + 0xC0, 1); + } + else + { + sub_8075198((void*)(0x6010020 + spriteTileNum), windowTileData, 7); + } + + RemoveWindow_(windowId); +} -- cgit v1.2.3 From 25a9c851cf421f83054687cdf17ea5b3ca9e746b Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 18 Oct 2017 23:05:14 +0200 Subject: more of battle interface done again --- src/battle_interface.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 203 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/battle_interface.c b/src/battle_interface.c index 9080b3905..bab2c5122 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -15,6 +15,10 @@ #include "gpu_regs.h" #include "battle_message.h" #include "species.h" +#include "pokedex.h" +#include "palette.h" +#include "international_string_util.h" +#include "safari_zone.h" extern bool8 IsDoubleBattle(void); extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; @@ -29,9 +33,9 @@ extern const u8 gText_Slash[]; void sub_8072924(struct Sprite *sprite); void sub_80728B4(struct Sprite *sprite); const u32 *GetHealthboxElementGfxPtr(u8 elementId); -u32 AddTextPrinterAndCreateWindowOnHealthbox(u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId); +u32 AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId); void sub_8075198(void *objVram, u32 windowTileData, u32 arg2); -void RemoveWindow_(u32 windowId); +void RemoveWindowOnHealthbox(u32 windowId); void sub_8075170(void *dest, u32 arg1, u32 arg2); void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); void sub_807513C(void *dest, u32 arg1, u32 arg2); @@ -42,6 +46,7 @@ void sub_8073F98(u8 taskId); void sub_8073E64(u8 taskId); void sub_8074158(struct Sprite *sprite); void sub_8074090(struct Sprite *sprite); +u8 GetStatusIconForBankId(u8 statusElementId, u8 bank); // const rom data const struct OamData gUnknown_0832C138 = @@ -186,6 +191,7 @@ extern const struct SpriteTemplate gUnknown_0832C364[2]; extern const struct SpriteTemplate gUnknown_0832C394[2]; extern const struct SubspriteTable gUnknown_0832C2C4; extern const struct SubspriteTable gUnknown_0832C2CC; +extern const u16 gBattleInterfaceStatusIcons_DynPals[]; u8 sub_8072304(void) { @@ -773,7 +779,7 @@ void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) objVram += spriteTileNum + 0x400; } sub_8075198(objVram, windowTileData, 3); - RemoveWindow_(windowId); + RemoveWindowOnHealthbox(windowId); } void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) @@ -792,7 +798,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) objVram = (void*)(OBJ_VRAM0); objVram += spriteTileNum + 0xB40; sub_8075170(objVram, windowTileData, 2); - RemoveWindow_(windowId); + RemoveWindowOnHealthbox(windowId); } else // singles, current { @@ -806,7 +812,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) objVram = (void*)(OBJ_VRAM0); objVram += spriteTileNum + 0xB00; sub_8075170(objVram, windowTileData + 0x20, 2); - RemoveWindow_(windowId); + RemoveWindowOnHealthbox(windowId); } } @@ -871,7 +877,7 @@ void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrC ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 0, &windowId); sub_8075170((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2); - RemoveWindow_(windowId); + RemoveWindowOnHealthbox(windowId); CpuCopy32(GetHealthboxElementGfxPtr(0x74), (void*)(OBJ_VRAM0 + 0x680) + (gSprites[healthboxSpriteId].oam.tileNum * 32), 0x20); @@ -884,7 +890,7 @@ void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrC windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 4, 5, 0, &windowId); sub_807513C(objVram, 0, 3); sub_8075170((void*)(OBJ_VRAM0 + 0x60) + spriteTileNum, windowTileData, 3); - RemoveWindow_(windowId); + RemoveWindowOnHealthbox(windowId); } } } @@ -1580,5 +1586,194 @@ void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) sub_8075198((void*)(0x6010020 + spriteTileNum), windowTileData, 7); } - RemoveWindow_(windowId); + RemoveWindowOnHealthbox(windowId); +} + +void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) +{ + u8 bank, healthboxSpriteId_2; + + if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + return; + if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) + return; + + bank = gSprites[healthboxSpriteId].data6; + if (GetBankSide(bank) == SIDE_PLAYER) + return; + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT)) + return; + + healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5; + + if (noStatus) + CpuCopy32(GetHealthboxElementGfxPtr(0x46), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); + else + CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); +} + +void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) +{ + s32 i; + u8 bank, healthboxSpriteId_2; + u32 status, pltAdder; + const u32 *statusGfxPtr; + s16 tileNumAdder; + u8 statusPalId; + + bank = gSprites[healthboxSpriteId].data6; + healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5; + if (GetBankSide(bank) == SIDE_PLAYER) + { + status = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_STATUS); + if (!IsDoubleBattle()) + tileNumAdder = 0x1A; + else + tileNumAdder = 0x12; + } + else + { + status = GetMonData(&gEnemyParty[gBattlePartyID[bank]], MON_DATA_STATUS); + tileNumAdder = 0x11; + } + + if (status & STATUS_SLEEP) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x1B, bank)); + statusPalId = 2; + } + else if (status & STATUS_PSN_ANY) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x15, bank)); + statusPalId = 0; + } + else if (status & STATUS_BURN) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x21, bank)); + statusPalId = 4; + } + else if (status & STATUS_FREEZE) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x1E, bank)); + statusPalId = 3; + } + else if (status & STATUS_PARALYSIS) + { + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x18, bank)); + statusPalId = 1; + } + else + { + statusGfxPtr = GetHealthboxElementGfxPtr(0x27); + + for (i = 0; i < 3; i++) + CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * 32), 32); + + if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) + CpuCopy32(GetHealthboxElementGfxPtr(1), (void *)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 64); + + TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE); + return; + } + + pltAdder = gSprites[healthboxSpriteId].oam.paletteNum * 16; + pltAdder += bank + 12; + + FillPalette(gBattleInterfaceStatusIcons_DynPals[statusPalId], pltAdder + 0x100, 2); + CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2); + CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * 32), 96); + if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT) + { + if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) + { + CpuCopy32(GetHealthboxElementGfxPtr(0), (void*)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(0x41), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 1) * 32), 32); + } + } + TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE); +} + +u8 GetStatusIconForBankId(u8 statusElementId, u8 bank) +{ + u8 ret = statusElementId; + + switch (statusElementId) + { + case 21: + if (bank == 0) + ret = 21; + else if (bank == 1) + ret = 71; + else if (bank == 2) + ret = 86; + else + ret = 101; + break; + case 24: + if (bank == 0) + ret = 24; + else if (bank == 1) + ret = 74; + else if (bank == 2) + ret = 89; + else + ret = 104; + break; + case 27: + if (bank == 0) + ret = 27; + else if (bank == 1) + ret = 77; + else if (bank == 2) + ret = 92; + else + ret = 107; + break; + case 30: + if (bank == 0) + ret = 30; + else if (bank == 1) + ret = 80; + else if (bank == 2) + ret = 95; + else + ret = 110; + break; + case 33: + if (bank == 0) + ret = 33; + else if (bank == 1) + ret = 83; + else if (bank == 2) + ret = 98; + else + ret = 113; + break; + } + return ret; +} + +extern const u8 gText_SafariBalls[]; +extern const u8 gText_SafariBallLeft[]; + +void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) +{ + u32 windowId, windowTileData, spriteTileNum; + + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, 2, &windowId); + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; + sub_8075198((void*)(OBJ_VRAM0 + 0x40) + spriteTileNum, windowTileData, 6); + sub_8075198((void*)(OBJ_VRAM0 + 0x800) + spriteTileNum, windowTileData + 0xC0, 2); + RemoveWindowOnHealthbox(windowId); +} + +void UpdateLeftNoOfBallsTextOnHealthbox(healthboxSpriteId) +{ + u8 text[20]; + u8 *txtPtr; + u32 windowId, windowTileData, spriteTileNum; + + txtPtr = StringCopy(text, gText_SafariBallLeft); + ConvertIntToDecimalStringN(txtPtr, gNumSafariBalls, STR_CONV_MODE_LEFT_ALIGN, 2); + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, GetStringRightAlignXOffset(0, 1)); } -- cgit v1.2.3 From ee6bdc9068794652f929783e2ef326e542521327 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 18 Oct 2017 23:52:21 +0200 Subject: more battle interface --- src/battle_interface.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/battle_interface.c b/src/battle_interface.c index bab2c5122..27a82d49d 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -35,6 +35,7 @@ void sub_80728B4(struct Sprite *sprite); const u32 *GetHealthboxElementGfxPtr(u8 elementId); u32 AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId); void sub_8075198(void *objVram, u32 windowTileData, u32 arg2); +void sub_80751E4(void *objVram, u32 windowTileData, u32 arg2); void RemoveWindowOnHealthbox(u32 windowId); void sub_8075170(void *dest, u32 arg1, u32 arg2); void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); @@ -47,6 +48,7 @@ void sub_8073E64(u8 taskId); void sub_8074158(struct Sprite *sprite); void sub_8074090(struct Sprite *sprite); u8 GetStatusIconForBankId(u8 statusElementId, u8 bank); +void sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3); // const rom data const struct OamData gUnknown_0832C138 = @@ -1767,13 +1769,91 @@ void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) RemoveWindowOnHealthbox(windowId); } -void UpdateLeftNoOfBallsTextOnHealthbox(healthboxSpriteId) +void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) { - u8 text[20]; + u8 text[16]; u8 *txtPtr; u32 windowId, windowTileData, spriteTileNum; txtPtr = StringCopy(text, gText_SafariBallLeft); ConvertIntToDecimalStringN(txtPtr, gNumSafariBalls, STR_CONV_MODE_LEFT_ALIGN, 2); - windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, GetStringRightAlignXOffset(0, 1)); + + windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, GetStringRightAlignXOffset(0, text, 0x2F), 3, 2, &windowId); + spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; + sub_80751E4((void*)(OBJ_VRAM0 + 0x2C0) + spriteTileNum, windowTileData, 2); + sub_80751E4((void*)(OBJ_VRAM0 + 0xA00) + spriteTileNum, windowTileData + 0x40, 4); + RemoveWindowOnHealthbox(windowId); +} + +extern void LoadBattleBarGfx(u8 arg0); + +void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId) +{ + u32 maxHp, currHp; + u8 bank = gSprites[healthboxSpriteId].data6; + + if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) + GetBankSide(bank); // pointless function call + + if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) + { + u8 isDoubles; + + if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) + UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); + if (elementId == HEALTHBOX_CURRENT_HP || elementId == HEALTHBOX_ALL) + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_HP), 0); + if (elementId == HEALTHBOX_MAX_HP || elementId == HEALTHBOX_ALL) + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_MAX_HP), 1); + if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) + { + LoadBattleBarGfx(0); + maxHp = GetMonData(mon, MON_DATA_MAX_HP); + currHp = GetMonData(mon, MON_DATA_HP); + SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, FALSE); + sub_8074AA0(bank, healthboxSpriteId, 0, 0); + } + isDoubles = IsDoubleBattle(); + if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL)) + { + u16 species; + u32 exp, currLevelExp, currExpBarValue, maxExpBarValue; + u8 level; + + LoadBattleBarGfx(3); + species = GetMonData(mon, MON_DATA_SPECIES); + level = GetMonData(mon, MON_DATA_LEVEL); + exp = GetMonData(mon, MON_DATA_EXP); + currLevelExp = gExperienceTables[gBaseStats[species].growthRate][level]; + currExpBarValue = exp - currLevelExp; + maxExpBarValue = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; + SetBattleBarStruct(bank, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles); + sub_8074AA0(bank, healthboxSpriteId, 1, 0); + } + if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) + UpdateNickInHealthbox(healthboxSpriteId, mon); + if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL) + UpdateStatusIconInHealthbox(healthboxSpriteId); + if (elementId == HEALTHBOX_SAFARI_ALL_TEXT) + UpdateSafariBallsTextOnHealthbox(healthboxSpriteId); + if (elementId == HEALTHBOX_SAFARI_ALL_TEXT || elementId == HEALTHBOX_SAFARI_BALLS_TEXT) + UpdateLeftNoOfBallsTextOnHealthbox(healthboxSpriteId); + } + else + { + if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) + UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); + if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) + { + LoadBattleBarGfx(0); + maxHp = GetMonData(mon, MON_DATA_MAX_HP); + currHp = GetMonData(mon, MON_DATA_HP); + SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, FALSE); + sub_8074AA0(bank, healthboxSpriteId, 0, 0); + } + if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) + UpdateNickInHealthbox(healthboxSpriteId, mon); + if (elementId == HEALTHBOX_STATUS_ICON || elementId == HEALTHBOX_ALL) + UpdateStatusIconInHealthbox(healthboxSpriteId); + } } -- cgit v1.2.3 From 11f9a27640a9f921c6dc1858261d9a609a6599ca Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Wed, 18 Oct 2017 19:25:08 -0400 Subject: decompiled up to sub_81C3D54 --- src/pokemon_summary_screen.c | 1356 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 1354 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 4c748073e..a44102b4b 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2,18 +2,41 @@ #include "battle.h" #include "bg.h" #include "decompress.h" +#include "item.h" +#include "items.h" +#include "link.h" #include "m4a.h" #include "main.h" #include "malloc.h" +#include "moves.h" #include "palette.h" #include "pokemon.h" #include "songs.h" #include "sound.h" +#include "species.h" #include "sprite.h" #include "string_util.h" #include "task.h" +#include "text.h" #include "window.h" +struct contestMove +{ + u8 effect; + u8 type; + u8 comboID; + u8 combo[4]; +}; + +struct contestEffect +{ + u8 type; + u8 appeal; + u8 jam; +}; + + + extern struct unkSummaryStruct* gUnknown_0203CF1C; extern struct BgTemplate gUnknown_0861CBB4; extern u8 gUnknown_0203CF20; @@ -27,6 +50,21 @@ extern struct unkStruct_61CC04 gUnknown_0861CC10; extern struct unkStruct_61CC04 gUnknown_0861CBEC; extern struct unkStruct_61CC04 gUnknown_0861CBF8; extern u16 gUnknown_08DC3CD4[]; +extern struct contestMove gContestMoves[]; +extern struct contestEffect gContestEffects[]; +extern struct WindowTemplate gUnknown_0861CC24; +extern struct TextColor gUnknown_0861CD2C[]; +extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; +extern u8 gText_MaleSymbol[]; +extern u8 gText_FemaleSymbol[]; +extern u8 gUnknown_0861CDD3[]; +extern void (*const gUnknown_0861CE54[])(); +extern void (*const gUnknown_0861CE64[])(u8 taskId); +extern struct WindowTemplate gUnknown_0861CCCC; +extern u8 gUnknown_0861CE74[]; +extern u8 gUnknown_0861CE7B[]; +extern struct WindowTemplate gUnknown_0861CCEC; +extern struct WindowTemplate gUnknown_0861CD14; extern void sub_806F2AC(u8 a, u8 b); void sub_81C488C(u8 a); @@ -61,9 +99,81 @@ extern void decompress_and_copy_tile_data_to_vram(u8 a, void* tiledata, u8 b, u8 extern u8 free_temp_tile_data_buffers_if_possible(); extern void sub_8069004(struct BoxPokemon* a, void* b); extern void sub_81C1E20(u8 taskId); +extern u8 *GetMonNickname(struct Pokemon *mon, u8 *dest); +extern u16 SpeciesToPokedexNum(u16 species); +extern u8 gText_UnkCtrlF908Clear01[]; +extern u8 gText_LevelSymbol[]; +extern u8 gText_PkmnInfo[]; +extern u8 gText_PkmnSkills[]; +extern u8 gText_BattleMoves[]; +extern u8 gText_ContestMoves[]; +extern u8 gText_Cancel2[]; +extern u8 gText_Info[]; +extern u8 gText_Switch[]; +extern u8 gText_RentalPkmn[]; +extern u8 gText_TypeSlash[]; +extern u8 gText_HP4[]; +extern u8 gText_Attack3[]; +extern u8 gText_Defense3[]; +extern u8 gText_SpAtk4[]; +extern u8 gText_SpDef4[]; +extern u8 gText_Speed2[]; +extern u8 gText_ExpPoints[]; +extern u8 gText_NextLv[]; +extern u8 gText_Status[]; +extern u8 gText_Power[]; +extern u8 gText_Accuracy2[]; +extern u8 gText_Appeal[]; +extern u8 gText_Jam[]; +extern u8 gText_OTSlash[]; +extern u8 gText_UnkCtrlF907F908[]; +extern u8 gAbilityNames[][13]; +extern u8 *gAbilityDescriptionPointers[]; +extern u8 gText_XNature[]; +extern u8 gText_XNatureHatchedAtYZ[]; +extern u8 gText_XNatureHatchedSomewhereAt[]; +extern u8 gText_XNatureMetAtYZ[]; +extern u8 gText_XNatureMetSomewhereAt[]; +extern u8 gText_XNatureFatefulEncounter[]; +extern u8 gText_XNatureProbablyMetAt[]; +extern u8 gText_XNatureObtainedInTrade[]; +extern u8 *gNatureNamePointers[]; +extern u8 gText_EmptyString5[]; +extern u32 gBattleTypeFlags; +extern u8 gText_FiveMarks[]; +extern u8 gText_EggWillTakeALongTime[]; +extern u8 gText_EggAboutToHatch[]; +extern u8 gText_EggWillHatchSoon[]; +extern u8 gText_EggWillTakeSomeTime[]; +extern u8 gText_PeculiarEggNicePlace[]; +extern u8 gText_PeculiarEggTrade[]; +extern u8 gText_EggFromTraveler[]; +extern u8 gText_EggFromHotSprings[]; +extern u8 gText_OddEggFoundByCouple[]; +extern u8 gText_None[]; +extern u8 gText_RibbonsVar1[]; +extern u8 gUnknown_0861CE82[]; +extern u8 gUnknown_0861CE8E[]; +extern u8 gMoveNames[][13]; +extern u8 gText_OneDash[]; +extern u8 gText_TwoDashes[]; +extern u8 gText_ThreeDashes[]; +extern u8 gUnknown_0861CE97[]; +extern struct BattleMove gBattleMoves[]; extern u32 ChangeBgX(u8 bg, u32 value, u8 op); extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f); +extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str); +extern s32 GetStringCenterAlignXOffset(u8 fontId, u8 *str, s32 totalWidth); +extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth); +extern u8 sub_81A6BF4(); +extern u8 sub_81B9E94(); +extern void sub_81AFBF0(); +extern u8 sub_81AFC0C(u8 a, u8 *b); +extern void sub_81AFC28(u8 *a, u8 *b); +extern void sub_8124610(u8 *a, u8 b); +extern int sub_80F0020(); +extern u8 sub_814FC20(u8 a, u8 b); void sub_81BFAE4(void); void sub_81BFE24(); @@ -111,7 +221,7 @@ void sub_81C20F0(u8 taskId); bool8 sub_81C0A50(struct Pokemon* mon); void sub_81C49E0(); void sub_81C0E24(); -void sub_81C2C38(); +void sub_81C2C38(u8 a); void sub_81C0B8C(u8 taskId); void sub_81C0CC4(u8 taskId); void sub_81C2DE4(u8 a); @@ -144,6 +254,34 @@ u8 sub_81B6D14(u16 a); void sub_81C1940(u8 taskId); void sub_81C4154(); void sub_81C1F80(u8 taskId); +void sub_81C2628(); +void sub_81C2794(); +void sub_81C27DC(struct Pokemon *mon, u16 a); +void sub_81C2D68(u8 a); +void sub_81C335C(); +void sub_81C33CC(); +void sub_81C3428(); +void sub_81C349C(); +void sub_81C2EC4(); +void sub_81C2F5C(); +void sub_81C2FD8(); +void sub_81C302C(); +void sub_81C307C(); +void sub_81C3194(); +void sub_81C31C0(); +u8 sub_81C3304(); +void sub_81C31F0(u8 *a); +u8 sub_81C3220(); +u8 sub_81C32BC(); +void sub_81C35E4(); +void sub_81C3690(); +void sub_81C3710(); +void sub_81C37D8(); +void sub_81C3808(); +void sub_81C3890(); +void sub_81C38C0(); +void sub_81C3B08(u8 a); +void sub_81C3E2C(u8 a); void SetBgAttribute(u8 bg, u8 attributeId, u8 value); @@ -221,7 +359,8 @@ struct unkSummaryStruct u8 unk40C7; u8 unk40C8; u8 unk40C9; - u8 unk_filler2[0x9]; + u8 unk40CA; + u8 unk40CB[8]; u8 unk40D3; u8 unk40D4; u8 unk40D5; @@ -2326,4 +2465,1217 @@ void sub_81C228C(u8 a) else sub_8199C30(3, 1, 4, 8, 8, 5); schedule_bg_copy_tilemap_to_vram(3); +} + +void sub_81C22CC(struct Pokemon *unused) +{ + s64 r6r7; + struct pokeSummary *summary = &gUnknown_0203CF1C->summary; + u16 *r9; + u8 i; + + if (summary->level < MAX_MON_LEVEL) + { + u32 r1 = gExperienceTables[gBaseStats[summary->species].growthRate][summary->level + 1] - gExperienceTables[gBaseStats[summary->species].growthRate][summary->level]; + u32 r4 = summary->exp - gExperienceTables[gBaseStats[summary->species].growthRate][summary->level]; + + r6r7 = r4 * 64 / r1; + if (r6r7 == 0 && r4 != 0) + r6r7 = 1; + } + else + { + r6r7 = 0; + } + + r9 = &gUnknown_0203CF1C->unkTilemap1_1[0x255]; + for (i = 0; i < 8; i++) + { + if (r6r7 > 7) + r9[i] = 0x206A; + else + r9[i] = 0x2062 + (r6r7 % 8); + r6r7 -= 8; + if (r6r7 < 0) + r6r7 = 0; + } + + if (GetBgTilemapBuffer(1) == gUnknown_0203CF1C->unkTilemap1) + schedule_bg_copy_tilemap_to_vram(1); + else + schedule_bg_copy_tilemap_to_vram(2); +} + +void sub_81C240C(u16 move) +{ + u16* r5 = &gUnknown_0203CF1C->unkTilemap3_1[0]; + u8 i; + u8 r4; + if (move != MOVE_NONE) + { + r4 = gContestEffects[gContestMoves[move].effect].appeal; + if (r4 != 0xFF) + r4 /= 10; + for (i = 0;i < 8; i++) + { + if (r4 != 0xFF && i < r4) + { + r5[((i>>2)*32)+(i&3)+0x1E6] = 0x103A; + } + else + r5[((i>>2)*32)+(i&3)+0x1E6] = 0x1039; + } + r4 = gContestEffects[gContestMoves[move].effect].jam; + if (r4 != 0xFF) + r4 /= 10; + for (i = 0;i < 8; i++) + { + if (r4 != 0xFF && i < r4) + { + r5[((i>>2)*32)+(i&3)+0x226] = 0x103C; + } + else + r5[((i>>2)*32)+(i&3)+0x226] = 0x103D; + } + } +} + +void sub_81C2524() +{ + if (gUnknown_0203CF1C->summary.isEgg != 0) + ChangeBgX(3, 0x10000, 0); + else + ChangeBgX(3, 0, 0); +} + +void sub_81C2554() +{ + u8 i; + InitWindows(&gUnknown_0861CC24); + DeactivateAllTextPrinters(); + for (i = 0; i < 20; i++) + FillWindowPixelBuffer(i, 0); + for (i = 0; i < 8; i++) + gUnknown_0203CF1C->unk40CB[i] |= 0xFF; +} + +void sub_81C25A4(u8 a, u8 *b, u8 c, u8 d, u8 e, u8 f) +{ + AddTextPrinterParametrized2(a, 1, c, d, 0, e, &gUnknown_0861CD2C[f], 0, b); +} + +void sub_81C25E8() +{ + FillWindowPixelBuffer(17, 0); + FillWindowPixelBuffer(18, 0); + FillWindowPixelBuffer(19, 0); + if (gUnknown_0203CF1C->summary.isEgg == 0) + sub_81C2628(); + else + sub_81C2794(); + schedule_bg_copy_tilemap_to_vram(0); +} + +void sub_81C2628() +{ + u8 strArray[16]; + struct Pokemon *mon = &gUnknown_0203CF1C->currentPoke; + struct pokeSummary *summary = &gUnknown_0203CF1C->summary; + u16 r5 = SpeciesToPokedexNum(summary->species); + if (r5 != 0xFFFF) + { + StringCopy(gStringVar1, &gText_UnkCtrlF908Clear01[0]); + ConvertIntToDecimalStringN(gStringVar2, r5, 2, 3); + StringAppend(gStringVar1, gStringVar2); + if (IsMonShiny(mon) == 0) + { + sub_81C25A4(17, gStringVar1, 0, 1, 0, 1); + sub_81C228C(0); + } + else + { + sub_81C25A4(17, gStringVar1, 0, 1, 0, 7); + sub_81C228C(1); + } + PutWindowTilemap(17); + } + else + { + ClearWindowTilemap(17); + if (IsMonShiny(mon) == 0) + sub_81C228C(0); + else + sub_81C228C(1); + } + StringCopy(gStringVar1, &gText_LevelSymbol[0]); + ConvertIntToDecimalStringN(gStringVar2, summary->level, 0, 3); + StringAppend(gStringVar1, gStringVar2); + sub_81C25A4(19, gStringVar1, 0x18, 17, 0, 1); + GetMonNickname(mon, gStringVar1); + sub_81C25A4(18, gStringVar1, 0, 1, 0, 1); + strArray[0] = CHAR_SLASH; + StringCopy(&strArray[1], &gSpeciesNames[summary->species2][0]); + sub_81C25A4(19, &strArray[0], 0, 1, 0, 1); + sub_81C27DC(mon, summary->species2); + PutWindowTilemap(18); + PutWindowTilemap(19); +} + +void sub_81C2794() +{ + GetMonNickname(&gUnknown_0203CF1C->currentPoke, gStringVar1); + sub_81C25A4(18, gStringVar1, 0, 1, 0, 1); + PutWindowTilemap(18); + ClearWindowTilemap(17); + ClearWindowTilemap(19); +} + +void sub_81C27DC(struct Pokemon *mon, u16 a) +{ + if (a != SPECIES_NIDORAN_M && a != SPECIES_NIDORAN_F) + { + u8 gender = GetMonGender(mon); + switch (gender) + { + case 0: + sub_81C25A4(0x13, &gText_MaleSymbol[0], 0x39, 17, 0, 3); + break; + case 0xFE: + sub_81C25A4(0x13, &gText_FemaleSymbol[0], 0x39, 17, 0, 4); + break; + } + } +} + +void sub_81C2838(u8 a, u8 b, u32 c) +{ + BlitBitmapToWindow(a, (b) ? &gUnknown_0861CDD3[0] : &gUnknown_0861CDD3[0] - 0x80, c, 0, 16, 16); +} + +void sub_81C286C() +{ + int r4; + int r2; + int temp; + sub_81C25A4(0, gText_PkmnInfo, 2, 1, 0, 1); + sub_81C25A4(1, gText_PkmnSkills, 2, 1, 0, 1); + sub_81C25A4(2, gText_BattleMoves, 2, 1, 0, 1); + sub_81C25A4(3, gText_ContestMoves, 2, 1, 0, 1); + r4 = GetStringRightAlignXOffset(1, gText_Cancel2, 0x3E); + r2 = r4 - 16; + if (r2 < 0) + r2 = 0; + sub_81C2838(4, 0, r2); + sub_81C25A4(4, gText_Cancel2, r4, 1, 0, 0); + r4 = GetStringRightAlignXOffset(1, gText_Info, 0x3E); + r2 = r4 - 16; + if (r2 < 0) + r2 = 0; + sub_81C2838(5, 0, r2); + sub_81C25A4(5, gText_Info, r4, 1, 0, 0); + r4 = GetStringRightAlignXOffset(1, gText_Switch, 0x3E); + r2 = r4 - 16; + if (r2 < 0) + r2 = 0; + sub_81C2838(6, 0, r2); + sub_81C25A4(6, gText_Switch, r4, 1, 0, 0); + sub_81C25A4(8, gText_RentalPkmn, 0, 1, 0, 1); + sub_81C25A4(9, gText_TypeSlash, 0, 1, 0, 0); + temp = 6; + temp += GetStringCenterAlignXOffset(1, gText_HP4, 42); + sub_81C25A4(10, gText_HP4, temp, 1, 0, 1); + temp = 6; + temp += GetStringCenterAlignXOffset(1, gText_Attack3, 42); + sub_81C25A4(10, gText_Attack3, temp, 17, 0, 1); + temp = 6; + temp += GetStringCenterAlignXOffset(1, gText_Defense3, 42); + sub_81C25A4(10, gText_Defense3, temp, 33, 0, 1); + temp = 2; + temp += GetStringCenterAlignXOffset(1, gText_SpAtk4, 36); + sub_81C25A4(11, gText_SpAtk4, temp, 1, 0, 1); + temp = 2; + temp += GetStringCenterAlignXOffset(1, gText_SpDef4, 36); + sub_81C25A4(11, gText_SpDef4, temp, 17, 0, 1); + temp = 2; + temp += GetStringCenterAlignXOffset(1, gText_Speed2, 36); + sub_81C25A4(11, gText_Speed2, temp, 33, 0, 1); + sub_81C25A4(12, gText_ExpPoints, 6, 1, 0, 1); + sub_81C25A4(12, gText_NextLv, 6, 17, 0, 1); + sub_81C25A4(13, gText_Status, 2, 1, 0, 1); + sub_81C25A4(14, gText_Power, 0, 1, 0, 1); + sub_81C25A4(14, gText_Accuracy2, 0, 17, 0, 1); + sub_81C25A4(15, gText_Appeal, 0, 1, 0, 1); + sub_81C25A4(15, gText_Jam, 0, 17, 0, 1); +} + +void sub_81C2AFC(u8 a) +{ + u8 i; + ClearWindowTilemap(0); + ClearWindowTilemap(1); + ClearWindowTilemap(2); + ClearWindowTilemap(3); + switch (a) + { + case 0: + PutWindowTilemap(0); + PutWindowTilemap(4); + if (sub_81A6BF4() == 1 || sub_81B9E94() == 1) + PutWindowTilemap(8); + PutWindowTilemap(9); + break; + case 1: + PutWindowTilemap(1); + PutWindowTilemap(10); + PutWindowTilemap(11); + PutWindowTilemap(12); + break; + case 2: + PutWindowTilemap(2); + if (gUnknown_0203CF1C->unk40BC == 3) + { + if(!(gUnknown_0203CF1C->unk40C4 == 0 && gUnknown_0203CF1C->unk40C6 == 4)) + PutWindowTilemap(14); + } + else + PutWindowTilemap(5); + break; + case 3: + PutWindowTilemap(3); + if (gUnknown_0203CF1C->unk40BC == 3) + { + if(!(gUnknown_0203CF1C->unk40C4 == 0 && gUnknown_0203CF1C->unk40C6 == 4)) + PutWindowTilemap(15); + } + else + PutWindowTilemap(5); + break; + } + for (i = 0; i < 8; i++) + { + PutWindowTilemap(gUnknown_0203CF1C->unk40CB[i]); + } + schedule_bg_copy_tilemap_to_vram(0); +} + +void sub_81C2C38(u8 a) +{ + u8 i; + switch (a) + { + case 0: + ClearWindowTilemap(4); + if (sub_81A6BF4() == 1 || sub_81B9E94() == 1) + ClearWindowTilemap(8); + ClearWindowTilemap(9); + break; + case 1: + ClearWindowTilemap(10); + ClearWindowTilemap(11); + ClearWindowTilemap(12); + break; + case 2: + if (gUnknown_0203CF1C->unk40BC == 3) + { + if(!(gUnknown_0203CF1C->unk40C4 == 0 && gUnknown_0203CF1C->unk40C6 == 4)) + ClearWindowTilemap(14); + } + else + ClearWindowTilemap(5); + break; + case 3: + if (gUnknown_0203CF1C->unk40BC == 3) + { + if(!(gUnknown_0203CF1C->unk40C4 == 0 && gUnknown_0203CF1C->unk40C6 == 4)) + ClearWindowTilemap(15); + } + else + ClearWindowTilemap(5); + break; + } + for (i = 0; i < 8; i++) + sub_81C2D68(i); + schedule_bg_copy_tilemap_to_vram(0); +} + + + +#ifdef NONMATCHING +u8 sub_81C2D2C(struct WindowTemplate *template, u8 a) +{ + u8 *r4 = gUnknown_0203CF1C->unk40CB; + if (r4[a] == 0xFF) + { + r4[a] = AddWindow(&template[a]); + FillWindowPixelBuffer(r4[a], 0); + } + return r4[a]; +} +#else +__attribute__((naked)) +u8 sub_81C2D2C(struct WindowTemplate *template, u8 a) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + adds r3, r0, 0\n\ + lsls r1, 24\n\ + lsrs r2, r1, 24\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r4, =0x000040cb\n\ + adds r1, r2, r4\n\ + ldr r0, [r0]\n\ + adds r4, r0, r1\n\ + ldrb r0, [r4]\n\ + cmp r0, 0xFF\n\ + bne _081C2D56\n\ + lsls r0, r2, 3\n\ + adds r0, r3, r0\n\ + bl AddWindow\n\ + strb r0, [r4]\n\ + ldrb r0, [r4]\n\ + movs r1, 0\n\ + bl FillWindowPixelBuffer\n\ +_081C2D56:\n\ + ldrb r0, [r4]\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +#ifdef NONMATCHING +void sub_81C2D68(u8 a) +{ + u8 *r4 = gUnknown_0203CF1C->unk40CB; + if (r4[a] != 0xFF) + { + ClearWindowTilemap(r4[a]); + RemoveWindow(r4[a]); + r4[a] = 0xFF; + } +} +#else +__attribute__((naked)) +void sub_81C2D68(u8 a) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + ldr r1, =gUnknown_0203CF1C\n\ + ldr r2, =0x000040cb\n\ + adds r0, r2\n\ + ldr r1, [r1]\n\ + adds r4, r1, r0\n\ + ldrb r0, [r4]\n\ + cmp r0, 0xFF\n\ + beq _081C2D8C\n\ + bl ClearWindowTilemap\n\ + ldrb r0, [r4]\n\ + bl RemoveWindow\n\ + movs r0, 0xFF\n\ + strb r0, [r4]\n\ +_081C2D8C:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_81C2D9C(u8 a) +{ + u16 i; + for (i = 0; i < 8; i++) + { + if (gUnknown_0203CF1C->unk40CB[i] != 0xFF) + FillWindowPixelBuffer(gUnknown_0203CF1C->unk40CB[i], 0); + } + gUnknown_0861CE54[a](); +} + +void sub_81C2DE4(u8 a) +{ + CreateTask(gUnknown_0861CE64[a], 16); +} + +void sub_81C2E00() +{ + if (gUnknown_0203CF1C->summary.isEgg) + { + sub_81C335C(); + sub_81C33CC(); + sub_81C3428(); + sub_81C349C(); + } + else + { + sub_81C2EC4(); + sub_81C2F5C(); + sub_81C2FD8(); + sub_81C302C(); + sub_81C307C(); + sub_81C3194(); + } +} + +void sub_81C2E40(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 dataa = data[0] - 1; + switch (dataa) + { + case 0: + sub_81C2EC4(); + break; + case 1: + sub_81C2F5C(); + break; + case 2: + sub_81C2FD8(); + break; + case 3: + sub_81C302C(); + break; + case 4: + sub_81C307C(); + break; + case 5: + sub_81C3194(); + break; + case 6: + DestroyTask(taskId); + return; + } + data[0]++; +} + +void sub_81C2EC4() +{ + u8 r5; + int r2; + if (sub_81A6BF4() != 1 && sub_81B9E94() != 1) + { + r5 = sub_81C2D2C(&gUnknown_0861CCCC, 0); + sub_81C25A4(r5, gText_OTSlash, 0, 1, 0, 1); + r2 = GetStringWidth(1, gText_OTSlash, 0); + if (gUnknown_0203CF1C->summary.OTGender == 0) + sub_81C25A4(r5, gUnknown_0203CF1C->summary.OTName, r2, 1, 0, 5); + else + sub_81C25A4(r5, gUnknown_0203CF1C->summary.OTName, r2, 1, 0, 6); + } +} + +void sub_81C2F5C() +{ + int r4; + if (sub_81A6BF4() != 1 && sub_81B9E94() != 1) + { + ConvertIntToDecimalStringN(StringCopy(gStringVar1, gText_UnkCtrlF907F908), (u16)gUnknown_0203CF1C->summary.OTID, 2, 5); + r4 = GetStringRightAlignXOffset(1, gStringVar1, 0x38); + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 1), gStringVar1, r4, 1, 0, 1); + } +} + +void sub_81C2FD8() +{ + u8 ability = GetAbilityBySpecies(gUnknown_0203CF1C->summary.species, gUnknown_0203CF1C->summary.altability); + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 2), gAbilityNames[ability], 0, 1, 0, 1); +} + +void sub_81C302C() +{ + u8 ability = GetAbilityBySpecies(gUnknown_0203CF1C->summary.species, gUnknown_0203CF1C->summary.altability); + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 2), gAbilityDescriptionPointers[ability], 0, 17, 0, 0); +} + +void sub_81C307C() +{ + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + u8 *text; + sub_81AFBF0(); + sub_81AFC0C(0, gUnknown_0861CE74); + sub_81AFC0C(1, gUnknown_0861CE7B); + sub_81C31C0(); + if (sub_81A6BF4() == 1 || sub_81B9E94() == 1 || sub_81C3304() == 1) + sub_81AFC28(gStringVar4, gText_XNature); + else + { + u8 *alloced1 = Alloc(32); + u8 *alloced2 = Alloc(32); + sub_81C31F0(alloced1); + if (sum->metLocation <= 0xD4) + { + sub_8124610(alloced2, sum->metLocation); + sub_81AFC0C(4, alloced2); + } + if (sub_81C3220() == 1) + { + if (sum->metLevel == 0) + text = (sum->metLocation > 0xD4) ? gText_XNatureHatchedSomewhereAt : gText_XNatureHatchedAtYZ; + else + text = (sum->metLocation > 0xD4) ? gText_XNatureMetSomewhereAt : gText_XNatureMetAtYZ; + } + else if (sum->metLocation == 0xFF) + text = gText_XNatureFatefulEncounter; + else if (sum->metLocation != 0xFE && sub_81C32BC()) + text = (sum->metLocation > 0xD4) ? gText_XNatureObtainedInTrade : gText_XNatureProbablyMetAt; + else + text = gText_XNatureObtainedInTrade; + sub_81AFC28(gStringVar4, text); + Free(alloced1); + Free(alloced2); + } +} + +void sub_81C3194() +{ + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 3), gStringVar4, 0, 1, 0, 0); +} + +void sub_81C31C0() +{ + struct unkSummaryStruct *sumStruct = gUnknown_0203CF1C; + sub_81AFC0C(2, gNatureNamePointers[sumStruct->summary.nature]); + sub_81AFC0C(5, gText_EmptyString5); +} + +void sub_81C31F0(u8 *a) +{ + u8 level = gUnknown_0203CF1C->summary.metLevel; + if (level == 0) + level = 5; + ConvertIntToDecimalStringN(a, level, 0, 3); + sub_81AFC0C(3, a); +} + +u8 sub_81C3220() +{ + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + u32 r4; + u8 r5; + if (gUnknown_0203CF1C->unk0 == (union unkUnion *)&gEnemyParty) + { + u8 multiID = GetMultiplayerId()^1; + r4 = (u16)gLinkPlayers[multiID].trainerId; + r5 = gLinkPlayers[multiID].gender; + StringCopy(gStringVar1, gLinkPlayers[multiID].name); + } + else + { + r4 = sub_80F0020() & 0xFFFF; + r5 = gSaveBlock2Ptr->playerGender; + StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); + } + if (r5 != sum->OTGender || r4 != (sum->OTID & 0xFFFF) || StringCompareWithoutExtCtrlCodes(gStringVar1, sum->OTName)) + { + return 0; + } + return 1; +} + +u8 sub_81C32BC() +{ + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + u8 r0 = sum->metGame - 1; + if (r0 <= 4) + return 1; + return 0; +} + +u8 sub_81C32E0() +{ + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + u8 r0 = sum->metGame - 1; + if (r0 <= 2) + return 1; + return 0; +} + +u8 sub_81C3304() +{ + if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) && gMain.inBattle) + { + if (gUnknown_0203CF1C->unk40BE == 1 || gUnknown_0203CF1C->unk40BE == 4 || gUnknown_0203CF1C->unk40BE == 5) + return 1; + } + return 0; +} + +#ifdef NONMATCHING +void sub_81C335C() +{ + u8 r4 = sub_81C2D2C(&gUnknown_0861CCCC, 0); + u32 r5 = GetStringWidth(1, gText_OTSlash, 0); + sub_81C25A4(r4, gText_OTSlash, 0, 1, 0, 1); + sub_81C25A4(r4, gText_FiveMarks, r5, 1, 0, 1); +} +#else +__attribute__((naked)) +void sub_81C335C() +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5,r6}\n\ + sub sp, 0x8\n\ + ldr r0, =gUnknown_0861CCCC\n\ + movs r1, 0\n\ + bl sub_81C2D2C\n\ + adds r4, r0, 0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + ldr r0, =gText_OTSlash\n\ + mov r8, r0\n\ + movs r0, 0x1\n\ + mov r1, r8\n\ + movs r2, 0\n\ + bl GetStringWidth\n\ + adds r5, r0, 0\n\ + movs r0, 0\n\ + mov r9, r0\n\ + str r0, [sp]\n\ + movs r6, 0x1\n\ + str r6, [sp, 0x4]\n\ + adds r0, r4, 0\n\ + mov r1, r8\n\ + movs r2, 0\n\ + movs r3, 0x1\n\ + bl sub_81C25A4\n\ + ldr r1, =gText_FiveMarks\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + mov r0, r9\n\ + str r0, [sp]\n\ + str r6, [sp, 0x4]\n\ + adds r0, r4, 0\n\ + adds r2, r5, 0\n\ + movs r3, 0x1\n\ + bl sub_81C25A4\n\ + add sp, 0x8\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_81C33CC() +{ + int r4; + StringCopy(gStringVar1, gText_UnkCtrlF907F908); + StringAppend(gStringVar1, gText_FiveMarks); + r4 = GetStringRightAlignXOffset(1, gStringVar1, 0x38); + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 1), gStringVar1, r4, 1, 0, 1); +} + +void sub_81C3428() +{ + u8 *text; + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + if (gUnknown_0203CF1C->summary.sanity == 1) + text = gText_EggWillTakeALongTime; + else if (sum->friendship <= 5) + text = gText_EggAboutToHatch; + else if (sum->friendship <= 10) + text = gText_EggWillHatchSoon; + else if (sum->friendship <= 40) + text = gText_EggWillTakeSomeTime; + else + text = gText_EggWillTakeALongTime; + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 2), text, 0, 1, 0, 0); +} + +void sub_81C349C() +{ + u8 *text; + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + if (gUnknown_0203CF1C->summary.sanity != 1) + { + if (sum->metLocation == 0xFF) + text = gText_PeculiarEggNicePlace; + else if (sub_81C32BC() == 0 || sub_81C3220() == 0) + text = gText_PeculiarEggTrade; + else if (sum->metLocation == 0xFD) + text = (sub_81C32E0() == 1) ? gText_EggFromHotSprings : gText_EggFromTraveler; + else + text = gText_OddEggFoundByCouple; + } + else + text = gText_OddEggFoundByCouple; + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 3), text, 0, 1, 0, 0); +} + +void sub_81C3530() +{ + sub_81C35E4(); + sub_81C3690(); + sub_81C3710(); + sub_81C37D8(); + sub_81C3808(); + sub_81C3890(); + sub_81C38C0(); +} + +void sub_81C3554(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 dataa = data[0] - 1; + switch (dataa) + { + case 0: + sub_81C35E4(); + break; + case 1: + sub_81C3690(); + break; + case 2: + sub_81C3710(); + break; + case 3: + sub_81C37D8(); + break; + case 4: + sub_81C3808(); + break; + case 5: + sub_81C3890(); + break; + case 6: + sub_81C38C0(); + break; + case 7: + DestroyTask(taskId); + return; + } + data[0]++; +} + +void sub_81C35E4() +{ + u8 *text; + int offset; + if (gUnknown_0203CF1C->summary.item == ITEM_ENIGMA_BERRY && sub_81B1250() == 1 && (gUnknown_0203CF1C->unk40BE == 1 || gUnknown_0203CF1C->unk40BE == 4 || gUnknown_0203CF1C->unk40BE == 5)) + { + text = (u8*)ItemId_GetItem(ITEM_ENIGMA_BERRY); + } + else if (gUnknown_0203CF1C->summary.item == ITEM_NONE) + text = gText_None; + else + { + CopyItemName(gUnknown_0203CF1C->summary.item, gStringVar1); + text = gStringVar1; + } + offset = GetStringCenterAlignXOffset(1, text, 0x48) + 6; + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCEC, 0), text, offset, 1, 0, 0); +} + +void sub_81C3690() +{ + u8 *text; + int offset; + if (gUnknown_0203CF1C->summary.ribbons == 0) + text = gText_None; + else + { + ConvertIntToDecimalStringN(gStringVar1, gUnknown_0203CF1C->summary.ribbons, 1, 2); + StringExpandPlaceholders(gStringVar4, gText_RibbonsVar1); + text = gStringVar4; + } + offset = GetStringCenterAlignXOffset(1, text, 0x46) + 6; + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCEC, 1), text, offset, 1, 0, 0); +} + +void sub_81C3710() +{ + u8 *alloced1 = Alloc(8); + u8 *alloced2 = Alloc(8); + u8 *alloced3 = Alloc(8); + u8 *alloced4 = Alloc(8); + ConvertIntToDecimalStringN(alloced1, gUnknown_0203CF1C->summary.currentHP, 1, 3); + ConvertIntToDecimalStringN(alloced2, gUnknown_0203CF1C->summary.maxHP, 1, 3); + ConvertIntToDecimalStringN(alloced3, gUnknown_0203CF1C->summary.atk, 1, 7); + ConvertIntToDecimalStringN(alloced4, gUnknown_0203CF1C->summary.def, 1, 7); + sub_81AFBF0(); + sub_81AFC0C(0, alloced1); + sub_81AFC0C(1, alloced2); + sub_81AFC0C(2, alloced3); + sub_81AFC0C(3, alloced4); + sub_81AFC28(gStringVar4, gUnknown_0861CE82); + Free(alloced1); + Free(alloced2); + Free(alloced3); + Free(alloced4); +} + +void sub_81C37D8() +{ + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCEC, 2), gStringVar4, 4, 1, 0, 0); +} + +void sub_81C3808() +{ + ConvertIntToDecimalStringN(gStringVar1, gUnknown_0203CF1C->summary.spatk, 1, 3); + ConvertIntToDecimalStringN(gStringVar2, gUnknown_0203CF1C->summary.spdef, 1, 3); + ConvertIntToDecimalStringN(gStringVar3, gUnknown_0203CF1C->summary.speed, 1, 3); + sub_81AFBF0(); + sub_81AFC0C(0, gStringVar1); + sub_81AFC0C(1, gStringVar2); + sub_81AFC0C(2, gStringVar3); + sub_81AFC28(gStringVar4, gUnknown_0861CE8E); +} + +void sub_81C3890() +{ + sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCEC, 3), gStringVar4, 2, 1, 0, 0); +} + +void sub_81C38C0() +{ + struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + u8 r6 = sub_81C2D2C(&gUnknown_0861CCEC, 4); + int offset; + u32 expToNextLevel; + ConvertIntToDecimalStringN(gStringVar1, sum->exp, 1, 7); + offset = GetStringRightAlignXOffset(1, gStringVar1, 0x2A) + 2; + sub_81C25A4(r6, gStringVar1, offset, 1, 0, 0); + if (sum->level < MAX_MON_LEVEL) + expToNextLevel = gExperienceTables[gBaseStats[sum->species].growthRate][sum->level + 1] - sum->exp; + else + expToNextLevel = 0; + ConvertIntToDecimalStringN(gStringVar1, expToNextLevel, 1, 6); + offset = GetStringRightAlignXOffset(1, gStringVar1, 0x2A) + 2; + sub_81C25A4(r6, gStringVar1, offset, 17, 0, 0); +} + +void sub_81C3984() +{ + sub_81C3B08(0); + sub_81C3B08(1); + sub_81C3B08(2); + sub_81C3B08(3); + if (gUnknown_0203CF1C->unk40BC == 3) + { + sub_81C3F44(); + if (gUnknown_0203CF1C->unk40C6 == 4) + { + if (gUnknown_0203CF1C->unk40C4 != 0) + sub_81C3E9C(gUnknown_0203CF1C->unk40C4); + } + else + sub_81C3E9C(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]); + } +} + +void sub_81C39F0(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 dataa = data[0] - 1; + + switch (dataa) + { + case 0: + sub_81C3B08(0); + break; + case 1: + sub_81C3B08(1); + break; + case 2: + sub_81C3B08(2); + break; + case 3: + sub_81C3B08(3); + break; + case 4: + if (gUnknown_0203CF1C->unk40BC == 3) + sub_81C3F44(); + break; + case 5: + if (gUnknown_0203CF1C->unk40BC == 3) + { + if (gUnknown_0203CF1C->unk40C6 == 4) + data[1] = gUnknown_0203CF1C->unk40C4; + else + data[1] = gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]; + } + break; + case 6: + if (gUnknown_0203CF1C->unk40BC == 3) + { + if (!(gUnknown_0203CF1C->unk40C4 == 0 && gUnknown_0203CF1C->unk40C6 == 4)) + sub_81C3E9C(data[1]); + } + break; + case 7: + DestroyTask(taskId); + return; + } + data[0]++; +} + +#ifdef NONMATCHING +void sub_81C3B08(u8 a) +{ + struct unkSummaryStruct *r10 = gUnknown_0203CF1C; + u8 r8 = sub_81C2D2C(&gUnknown_0861CD14, 0); + u8 sp = sub_81C2D2C(&gUnknown_0861CD14, 1); + u8 r6; + u8 r5; + u8 *text; + int offset; + u16 move; + if (r10->summary.moves[a] != 0) + { + move = r10->summary.moves[a]; + r6 = CalculatePPWithBonus(move, r10->summary.ppBonuses, a); + sub_81C25A4(r8, gMoveNames[move], 0, (a<<4) + 1, 0, 1); + ConvertIntToDecimalStringN(gStringVar1, r10->summary.pp[a], 1, 2); + ConvertIntToDecimalStringN(gStringVar2, r6, 1, 2); + sub_81AFBF0(); + sub_81AFC0C(0, gStringVar1); + sub_81AFC0C(1, gStringVar2); + sub_81AFC28(gStringVar4, gUnknown_0861CE97); + text = gStringVar4; + r5 = sub_814FC20(r10->summary.pp[a], r6) + 9; + offset = GetStringRightAlignXOffset(1, text, 0x2C); + } + else + { + sub_81C25A4(r8, gText_OneDash, 0, (a<<4) + 1, 0, 1); + text = gText_TwoDashes; + r5 = 12; + offset = GetStringCenterAlignXOffset(1, text, 0x2C); + } + sub_81C25A4(sp, text, offset, (a<<4), 0, r5); +} +#else +__attribute__((naked)) +void sub_81C3B08(u8 a) +{ + 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, 0xC\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r0, =gUnknown_0203CF1C\n\ + ldr r0, [r0]\n\ + mov r10, r0\n\ + ldr r4, =gUnknown_0861CD14\n\ + adds r0, r4, 0\n\ + movs r1, 0\n\ + bl sub_81C2D2C\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + adds r0, r4, 0\n\ + movs r1, 0x1\n\ + bl sub_81C2D2C\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x8]\n\ + lsls r1, r7, 1\n\ + mov r0, r10\n\ + adds r0, 0x84\n\ + adds r0, r1\n\ + ldrh r5, [r0]\n\ + cmp r5, 0\n\ + beq _081C3C00\n\ + mov r0, r10\n\ + adds r0, 0xA4\n\ + ldrb r1, [r0]\n\ + adds r0, r5, 0\n\ + adds r2, r7, 0\n\ + bl CalculatePPWithBonus\n\ + adds r6, r0, 0\n\ + lsls r6, 24\n\ + lsrs r6, 24\n\ + movs r0, 0xD\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r0, =gMoveNames\n\ + adds r1, r0\n\ + lsls r0, r7, 4\n\ + mov r9, r0\n\ + mov r3, r9\n\ + adds r3, 0x1\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + movs r0, 0x1\n\ + str r0, [sp, 0x4]\n\ + mov r0, r8\n\ + movs r2, 0\n\ + bl sub_81C25A4\n\ + ldr r0, =gStringVar1\n\ + mov r8, r0\n\ + mov r5, r10\n\ + adds r5, 0x8C\n\ + adds r5, r7\n\ + ldrb r1, [r5]\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + ldr r4, =gStringVar2\n\ + adds r0, r4, 0\n\ + adds r1, r6, 0\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + bl sub_81AFBF0\n\ + movs r0, 0\n\ + mov r1, r8\n\ + bl sub_81AFC0C\n\ + movs r0, 0x1\n\ + adds r1, r4, 0\n\ + bl sub_81AFC0C\n\ + ldr r4, =gStringVar4\n\ + ldr r1, =gUnknown_0861CE97\n\ + adds r0, r4, 0\n\ + bl sub_81AFC28\n\ + adds r7, r4, 0\n\ + ldrb r0, [r5]\n\ + adds r1, r6, 0\n\ + bl sub_814FC20\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r5, r0, 0\n\ + adds r5, 0x9\n\ + movs r0, 0x1\n\ + adds r1, r7, 0\n\ + movs r2, 0x2C\n\ + bl GetStringRightAlignXOffset\n\ + mov r4, r9\n\ + b _081C3C26\n\ + .pool\n\ +_081C3C00:\n\ + ldr r1, =gText_OneDash\n\ + lsls r4, r7, 4\n\ + adds r3, r4, 0x1\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + str r5, [sp]\n\ + movs r0, 0x1\n\ + str r0, [sp, 0x4]\n\ + mov r0, r8\n\ + movs r2, 0\n\ + bl sub_81C25A4\n\ + ldr r7, =gText_TwoDashes\n\ + movs r5, 0xC\n\ + movs r0, 0x1\n\ + adds r1, r7, 0\n\ + movs r2, 0x2C\n\ + bl GetStringCenterAlignXOffset\n\ +_081C3C26:\n\ + lsls r2, r0, 24\n\ + lsrs r2, 24\n\ + adds r3, r4, 0x1\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + movs r0, 0\n\ + str r0, [sp]\n\ + lsls r0, r5, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + ldr r0, [sp, 0x8]\n\ + adds r1, r7, 0\n\ + bl sub_81C25A4\n\ + add sp, 0xC\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\ + .pool\n\ + .syntax divided\n"); +} +#endif + +void sub_81C3C5C(u16 move) +{ + u8 *text; + if (move != 0) + { + FillWindowPixelRect(14, 0, 0x35, 0, 0x13, 0x20); + if (gBattleMoves[move].power <= 1) + text = gText_ThreeDashes; + else + { + ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].power, 1, 3); + text = gStringVar1; + } + sub_81C25A4(14, text, 0x35, 1, 0, 0); + if (gBattleMoves[move].accuracy == 0) + text = gText_ThreeDashes; + else + { + ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].accuracy, 1, 3); + text = gStringVar1; + } + sub_81C25A4(14, text, 0x35, 17, 0, 0); + } +} + +void sub_81C3D08() +{ + sub_81C3B08(0); + sub_81C3B08(1); + sub_81C3B08(2); + sub_81C3B08(3); + if (gUnknown_0203CF1C->unk40BC == 3) + { + sub_81C3F44(); + sub_81C3E2C(gUnknown_0203CF1C->unk40C6); + } +} + +void sub_81C3D54(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s16 dataa = data[0] - 1; + + switch (dataa) + { + case 0: + sub_81C3B08(0); + break; + case 1: + sub_81C3B08(1); + break; + case 2: + sub_81C3B08(2); + break; + case 3: + sub_81C3B08(3); + break; + case 4: + if (gUnknown_0203CF1C->unk40BC == 3) + sub_81C3F44(); + break; + case 5: + if (gUnknown_0203CF1C->unk40BC == 3) + { + if (!(gUnknown_0203CF1C->unk40C4 == 0 && gUnknown_0203CF1C->unk40C6 == 4)) + sub_81C3E2C(gUnknown_0203CF1C->unk40C6); + } + break; + case 6: + DestroyTask(taskId); + return; + } + data[0]++; } \ No newline at end of file -- cgit v1.2.3 From 79a947ed16f55b7fd045813d27659c087c211669 Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Wed, 18 Oct 2017 19:52:33 -0400 Subject: git made me --- src/pokemon_summary_screen.c | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index a44102b4b..c5b197026 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -154,7 +154,6 @@ extern u8 gText_None[]; extern u8 gText_RibbonsVar1[]; extern u8 gUnknown_0861CE82[]; extern u8 gUnknown_0861CE8E[]; -extern u8 gMoveNames[][13]; extern u8 gText_OneDash[]; extern u8 gText_TwoDashes[]; extern u8 gText_ThreeDashes[]; -- cgit v1.2.3 From 7a515ea1f968e09213509e2d4c4547c7d8a35a9d Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Wed, 18 Oct 2017 20:05:26 -0400 Subject: fixed --- src/pokemon_summary_screen.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index c5b197026..3e6342f36 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -171,8 +171,8 @@ extern void sub_81AFBF0(); extern u8 sub_81AFC0C(u8 a, u8 *b); extern void sub_81AFC28(u8 *a, u8 *b); extern void sub_8124610(u8 *a, u8 b); -extern int sub_80F0020(); -extern u8 sub_814FC20(u8 a, u8 b); +extern int GetPlayerIDAsU32(); +extern u8 GetCurrentPpToMaxPpState(u8 a, u8 b); void sub_81BFAE4(void); void sub_81BFE24(); @@ -3065,7 +3065,7 @@ u8 sub_81C3220() } else { - r4 = sub_80F0020() & 0xFFFF; + r4 = GetPlayerIDAsU32() & 0xFFFF; r5 = gSaveBlock2Ptr->playerGender; StringCopy(gStringVar1, gSaveBlock2Ptr->playerName); } @@ -3443,7 +3443,7 @@ void sub_81C3B08(u8 a) sub_81AFC0C(1, gStringVar2); sub_81AFC28(gStringVar4, gUnknown_0861CE97); text = gStringVar4; - r5 = sub_814FC20(r10->summary.pp[a], r6) + 9; + r5 = GetCurrentPpToMaxPpState(r10->summary.pp[a], r6) + 9; offset = GetStringRightAlignXOffset(1, text, 0x2C); } else @@ -3547,7 +3547,7 @@ void sub_81C3B08(u8 a) adds r7, r4, 0\n\ ldrb r0, [r5]\n\ adds r1, r6, 0\n\ - bl sub_814FC20\n\ + bl GetCurrentPpToMaxPpState\n\ lsls r0, 24\n\ lsrs r0, 24\n\ adds r5, r0, 0\n\ -- cgit v1.2.3 From 11bead31e90aca72f85352b684670a76a5aa7a16 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 19 Oct 2017 15:28:41 +0200 Subject: battle interface is done --- src/battle_interface.c | 822 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 727 insertions(+), 95 deletions(-) (limited to 'src') diff --git a/src/battle_interface.c b/src/battle_interface.c index 27a82d49d..7d176a9af 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1,12 +1,12 @@ #include "global.h" #include "battle.h" #include "pokemon.h" +#include "battle_controllers.h" #include "battle_interface.h" #include "sprite.h" #include "window.h" #include "string_util.h" #include "text.h" -#include "battle_controllers.h" #include "sound.h" #include "songs.h" #include "decompress.h" @@ -20,6 +20,21 @@ #include "international_string_util.h" #include "safari_zone.h" +enum +{ + HEALTH_BAR, + EXP_BAR +}; + +struct TestingBar +{ + s32 maxValue; + s32 currValue; + s32 field_8; + u32 unkC_0:5; + u32 unk10; +}; + extern bool8 IsDoubleBattle(void); extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; @@ -27,31 +42,62 @@ extern u8 gNoOfAllBanks; extern u8 gHealthBoxesIds[BATTLE_BANKS_COUNT]; extern const u8 * const gNatureNamePointers[]; +extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; + +// strings extern const u8 gText_Slash[]; +extern const u8 gText_HighlightDarkGrey[]; +extern const u8 gText_DynColor2[]; +extern const u8 gText_DynColor2Male[]; +extern const u8 gText_DynColor1Female[]; +extern const u8 gText_SafariBalls[]; +extern const u8 gText_SafariBallLeft[]; + +// graphics +extern const u8 gBattleInterface_BallStatusBarGfx[]; +extern const u8 gBattleInterface_BallDisplayGfx[]; +extern const u16 gBattleInterface_BallStatusBarPal[]; +extern const u16 gBattleInterface_BallDisplayPal[]; +extern const u8 gHealthboxElementsGfxTable[][32]; + +extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, const u8 *str); // menu.h +extern void LoadBattleBarGfx(u8 arg0); // this file's functions -void sub_8072924(struct Sprite *sprite); -void sub_80728B4(struct Sprite *sprite); -const u32 *GetHealthboxElementGfxPtr(u8 elementId); -u32 AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId); -void sub_8075198(void *objVram, u32 windowTileData, u32 arg2); -void sub_80751E4(void *objVram, u32 windowTileData, u32 arg2); -void RemoveWindowOnHealthbox(u32 windowId); -void sub_8075170(void *dest, u32 arg1, u32 arg2); -void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); -void sub_807513C(void *dest, u32 arg1, u32 arg2); -void UpdateStatusIconInHealthbox(u8 healthboxSpriteId); -void sub_80741C8(struct Sprite *sprite); -void sub_8073E08(u8 taskId); -void sub_8073F98(u8 taskId); -void sub_8073E64(u8 taskId); -void sub_8074158(struct Sprite *sprite); -void sub_8074090(struct Sprite *sprite); -u8 GetStatusIconForBankId(u8 statusElementId, u8 bank); -void sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3); + +static const u8 *GetHealthboxElementGfxPtr(u8 elementId); +static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId); + +static void RemoveWindowOnHealthbox(u32 windowId); +static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); +static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId); + +static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2); +static void sub_80751E4(void *dest, u8 *windowTileData, u32 arg2); +static void sub_8075170(void *dest, u8 *windowTileData, u32 arg2); +static void sub_807513C(void *dest, u32 arg1, u32 arg2); + +static void sub_8073E08(u8 taskId); +static void sub_8073F98(u8 taskId); +static void sub_8073E64(u8 taskId); + +static void sub_8072924(struct Sprite *sprite); +static void sub_80728B4(struct Sprite *sprite); +static void sub_8074158(struct Sprite *sprite); +static void sub_8074090(struct Sprite *sprite); +static void sub_8074078(struct Sprite *sprite); +static void sub_80740C4(struct Sprite *sprite); +static void sub_80741C8(struct Sprite *sprite); + +static u8 GetStatusIconForBankId(u8 statusElementId, u8 bank); +static s32 sub_8074DB8(s32 maxValue, s32 currValue, s32 arg2, s32 *arg3, u8 arg4, u16 arg5); +static u8 GetScaledExpFraction(s32 currValue, s32 arg1, s32 maxValue, u8 scale); +static void sub_8074B9C(u8 bank, u8 whichBar); +static u8 sub_8074E8C(s32 maxValue, s32 currValue, s32 arg2, s32 *arg3, u8 *arg4, u8 arg5); +static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2); // const rom data -const struct OamData gUnknown_0832C138 = +static const struct OamData gUnknown_0832C138 = { .y = 0, .affineMode = 0, @@ -68,8 +114,6 @@ const struct OamData gUnknown_0832C138 = .affineParam = 0, }; -extern const struct SubspriteTable gUnknown_0832C28C[2]; - static const struct SpriteTemplate gUnknown_0832C140[2] = { { @@ -125,7 +169,7 @@ static const struct SpriteTemplate gUnknown_0832C1A0 = .callback = SpriteCallbackDummy }; -const struct OamData gUnknown_0832C1B8 = +static const struct OamData gUnknown_0832C1B8 = { .y = 0, .affineMode = 0, @@ -182,26 +226,247 @@ static const struct SpriteTemplate gUnknown_0832C1C0[4] = } }; -extern const u8 gUnknown_0832C3C4[0x14]; -extern const u8 gUnknown_0832C3D8[0x14]; -extern const u32 gHealthboxElementsGfxTable[][8]; -extern const struct CompressedSpriteSheet gUnknown_0832C334; -extern const struct SpriteSheet gUnknown_0832C34C; -extern const struct SpritePalette gUnknown_0832C33C; -extern const struct SpritePalette gUnknown_0832C344; -extern const struct SpriteTemplate gUnknown_0832C364[2]; -extern const struct SpriteTemplate gUnknown_0832C394[2]; -extern const struct SubspriteTable gUnknown_0832C2C4; -extern const struct SubspriteTable gUnknown_0832C2CC; -extern const u16 gBattleInterfaceStatusIcons_DynPals[]; - -u8 sub_8072304(void) +static const struct Subsprite gUnknown_0832C220[] = +{ + {240, 0, 1, 3, 0, 1}, + {48, 0, 0, 2, 32, 1}, + {240, 32, 1, 1, 48, 1}, + {16, 32, 1, 1, 52, 1}, + {48, 32, 1, 1, 56, 1} +}; + +static const struct Subsprite gUnknown_0832C234[] = +{ + {240, 0, 1, 3, 64, 1}, + {48, 0, 0, 2, 96, 1}, + {240, 32, 1, 1, 112, 1}, + {16, 32, 1, 1, 116, 1}, + {48, 32, 1, 1, 120, 1} +}; + +static const struct Subsprite gUnknown_0832C248[] = +{ + {240, 0, 1, 3, 0, 1}, + {48, 0, 0, 2, 32, 1} +}; + +static const struct Subsprite gUnknown_0832C250[] = +{ + {240, 0, 1, 3, 0, 1}, + {48, 0, 0, 2, 32, 1} +}; + +static const struct Subsprite gUnknown_0832C258[] = +{ + {240, 0, 1, 1, 0, 1}, + {16, 0, 1, 1, 4, 1} +}; + +static const struct Subsprite gUnknown_0832C260[] = +{ + {240, 0, 1, 1, 0, 1}, + {16, 0, 1, 1, 4, 1}, + {224, 0, 0, 0, 8, 1} +}; + +static const struct SubspriteTable gUnknown_0832C26C[] = +{ + {ARRAY_COUNT(gUnknown_0832C220), gUnknown_0832C220}, + {ARRAY_COUNT(gUnknown_0832C248), gUnknown_0832C248}, + {ARRAY_COUNT(gUnknown_0832C234), gUnknown_0832C234}, + {ARRAY_COUNT(gUnknown_0832C250), gUnknown_0832C250} +}; + +static const struct SubspriteTable gUnknown_0832C28C[] = +{ + {ARRAY_COUNT(gUnknown_0832C258), gUnknown_0832C258}, + {ARRAY_COUNT(gUnknown_0832C260), gUnknown_0832C260} +}; + +static const struct Subsprite gUnknown_0832C29C[] = +{ + {160, 0, 1, 1, 0, 1}, + {192, 0, 1, 1, 4, 1}, + {224, 0, 1, 1, 8, 1}, + {0, 0, 1, 1, 12, 1} +}; + +static const struct Subsprite gUnknown_0832C2AC[] = +{ + {160, 0, 1, 1, 0, 1}, + {192, 0, 1, 1, 4, 1}, + {224, 0, 1, 1, 8, 1}, + {0, 0, 1, 1, 8, 1}, + {32, 0, 1, 1, 8, 1}, + {64, 0, 1, 1, 12, 1} +}; + +static const struct SubspriteTable gUnknown_0832C2C4[] = +{ + {ARRAY_COUNT(gUnknown_0832C29C), gUnknown_0832C29C} +}; + +static const struct SubspriteTable gUnknown_0832C2CC[] = +{ + {ARRAY_COUNT(gUnknown_0832C2AC), gUnknown_0832C2AC} +}; + +// unused unknown data +static const u16 gUnknown_0832C2D4[] = +{ + 0x0000, 0x0000, 0x3333, 0x3333, 0x4444, 0x4444, 0x2222, 0x2222, + 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, + + 0x0000, 0x0000, 0x3333, 0x3333, 0x4444, 0x4444, 0x2222, 0x2222, + 0x7777, 0x7777, 0x7777, 0x7717, 0x1777, 0x7177, 0x7777, 0x7771, + + 0x0000, 0x0000, 0x3333, 0x3333, 0x4444, 0x4444, 0x2222, 0x2222, + 0x7777, 0x7777, 0x7777, 0x7111, 0x7777, 0x7171, 0x7777, 0x7111, +}; + +static const struct CompressedSpriteSheet gUnknown_0832C334 = +{ + gBattleInterface_BallStatusBarGfx, 0x200, 0xD70C +}; + +static const struct SpritePalette gUnknown_0832C33C = +{ + gBattleInterface_BallStatusBarPal, 0xD710 +}; + +static const struct SpritePalette gUnknown_0832C344 = +{ + gBattleInterface_BallDisplayPal, 0xD712 +}; + +static const struct SpriteSheet gUnknown_0832C34C = +{ + gBattleInterface_BallDisplayGfx, 0x80, 0xD714 +}; + +static const struct OamData gUnknown_0832C354 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 3, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct OamData gUnknown_0832C35C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate gUnknown_0832C364[2] = +{ + { + .tileTag = 0xd70c, + .paletteTag = 0xd710, + .oam = &gUnknown_0832C138, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8074078 + }, + { + .tileTag = 0xd70c, + .paletteTag = 0xd710, + .oam = &gUnknown_0832C138, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_8074078 + } +}; + +static const struct SpriteTemplate gUnknown_0832C394[2] = +{ + { + .tileTag = 0xd714, + .paletteTag = 0xd712, + .oam = &gUnknown_0832C35C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80740C4 + }, + { + .tileTag = 0xd714, + .paletteTag = 0xd712, + .oam = &gUnknown_0832C35C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80740C4 + } +}; + +// possibly text +static const u8 gUnknown_0832C3C4[] = +{ + 0xfc, 0x01, 0x01, 0xfc, 0x02, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +// possibly text +static const u8 gUnknown_0832C3D8[] = +{ + 0xfc, 0x01, 0x01, 0xfc, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + +enum +{ + PAL_STATUS_PSN, + PAL_STATUS_PAR, + PAL_STATUS_SLP, + PAL_STATUS_FRZ, + PAL_STATUS_BRN +}; + +static const u16 sStatusIconPalettes[] = +{ + 0x6198, // PAL_STATUS_PSN + 0xEF7, // PAL_STATUS_PAR + 0x4694, // PAL_STATUS_SLP + 0x72D1, // PAL_STATUS_FRZ + 0x29DC // PAL_STATUS_BRN +}; + +static const struct WindowTemplate sHealthboxWindowTemplate = {0, 0, 0, 8, 2, 0, 0}; // width = 8, height = 2 + +// code + +static s32 DummiedOutFunction(s16 unused1, s16 unused2, s32 unused3) { return 9; } #ifdef NONMATCHING -void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) +static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) { s8 i, j; s8 array[4]; @@ -276,7 +541,7 @@ void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) #else __attribute__((naked)) -void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) +static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -613,12 +878,12 @@ u8 CreateSafariPlayerHealthboxSprites(void) return healthboxSpriteId_1; } -const u32 *GetHealthboxElementGfxPtr(u8 elementId) +static const u8 *GetHealthboxElementGfxPtr(u8 elementId) { return gHealthboxElementsGfxTable[elementId]; } -void sub_80728B4(struct Sprite *sprite) +static void sub_80728B4(struct Sprite *sprite) { u8 var = sprite->data5; @@ -643,7 +908,7 @@ void sub_80728B4(struct Sprite *sprite) sprite->pos2.y = gSprites[var].pos2.y; } -void sub_8072924(struct Sprite *sprite) +static void sub_8072924(struct Sprite *sprite) { u8 otherSpriteId = sprite->data5; @@ -654,12 +919,12 @@ void sub_8072924(struct Sprite *sprite) sprite->pos2.y = gSprites[otherSpriteId].pos2.y; } -void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, u32 maxVal, u32 currVal, bool32 isDoubleBattle) +void SetBattleBarStruct(u8 bank, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 field_C) { gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId = healthboxSpriteId; gBattleSpritesDataPtr->battleBars[bank].maxValue = maxVal; gBattleSpritesDataPtr->battleBars[bank].currentValue = currVal; - gBattleSpritesDataPtr->battleBars[bank].isDoubleBattle = isDoubleBattle; + gBattleSpritesDataPtr->battleBars[bank].field_C = field_C; gBattleSpritesDataPtr->battleBars[bank].field_10 = -32768; } @@ -744,9 +1009,10 @@ void SetBankHealthboxSpritePos(u8 bank) UpdateSpritePos(gHealthBoxesIds[bank], x, y); } -void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) +static void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) { - u32 windowId, windowTileData, spriteTileNum; + u32 windowId, spriteTileNum; + u8 *windowTileData; u8 text[16]; u32 xPos, var1; void *objVram; @@ -786,7 +1052,8 @@ void UpdateLvlInHealthbox(u8 healthboxSpriteId, u8 lvl) void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { - u32 windowId, windowTileData, spriteTileNum; + u32 windowId, spriteTileNum; + u8 *windowTileData; u8 text[32]; void *objVram; @@ -861,9 +1128,10 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) } } -void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) +static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { - u32 windowId, windowTileData, spriteTileNum; + u32 windowId, spriteTileNum; + u8 *windowTileData; u8 text[32]; void *objVram; @@ -955,7 +1223,7 @@ void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 maxOrC } } -void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) +static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) { u8 text[20]; s32 j, var2; @@ -1131,7 +1399,7 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar LoadSpritePalette(&gUnknown_0832C344); barSpriteId = CreateSprite(&gUnknown_0832C364[isOpponent], bar_X, bar_Y, 10); - SetSubspriteTables(&gSprites[barSpriteId], &gUnknown_0832C2C4); + SetSubspriteTables(&gSprites[barSpriteId], gUnknown_0832C2C4); gSprites[barSpriteId].pos2.x = bar_pos2_X; gSprites[barSpriteId].data0 = bar_data0; @@ -1339,7 +1607,7 @@ void sub_8073C30(u8 taskId) gSprites[r10].data0 /= 2; gSprites[r10].data1 = 0; gSprites[r10].callback = sub_8074090; - SetSubspriteTables(&gSprites[r10], &gUnknown_0832C2CC); + SetSubspriteTables(&gSprites[r10], gUnknown_0832C2CC); gTasks[taskId].func = sub_8073E08; } else @@ -1348,7 +1616,7 @@ void sub_8073C30(u8 taskId) } } -void sub_8073E08(u8 taskId) +static void sub_8073E08(u8 taskId) { u16 temp = gTasks[taskId].data[11]++; @@ -1364,7 +1632,7 @@ void sub_8073E08(u8 taskId) gTasks[taskId].func = sub_8073E64; } -void sub_8073E64(u8 taskId) +static void sub_8073E64(u8 taskId) { u8 sp[6]; s32 i; @@ -1404,7 +1672,7 @@ void sub_8073E64(u8 taskId) } } -void sub_8073F98(u8 taskId) +static void sub_8073F98(u8 taskId) { u8 sp[6]; s32 i; @@ -1437,13 +1705,13 @@ void sub_8073F98(u8 taskId) } } -void sub_8074078(struct Sprite *sprite) +static void sub_8074078(struct Sprite *sprite) { if (sprite->pos2.x != 0) sprite->pos2.x += sprite->data0; } -void sub_8074090(struct Sprite *sprite) +static void sub_8074090(struct Sprite *sprite) { sprite->data1 += 32; if (sprite->data0 > 0) @@ -1453,7 +1721,7 @@ void sub_8074090(struct Sprite *sprite) sprite->data1 &= 0xF; } -void sub_80740C4(struct Sprite *sprite) +static void sub_80740C4(struct Sprite *sprite) { u8 var1; u16 var2; @@ -1493,7 +1761,7 @@ void sub_80740C4(struct Sprite *sprite) } } -void sub_8074158(struct Sprite *sprite) +static void sub_8074158(struct Sprite *sprite) { u8 var1; u16 var2; @@ -1519,7 +1787,7 @@ void sub_8074158(struct Sprite *sprite) } } -void sub_80741C8(struct Sprite *sprite) +static void sub_80741C8(struct Sprite *sprite) { u8 barSpriteId = sprite->data0; @@ -1527,18 +1795,13 @@ void sub_80741C8(struct Sprite *sprite) sprite->pos2.y = gSprites[barSpriteId].pos2.y; } -extern const u8 gText_HighlightDarkGrey[]; -extern const u8 gText_DynColor2[]; -extern const u8 gText_DynColor2Male[]; -extern const u8 gText_DynColor1Female[]; -extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; - -void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) +static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) { u8 nickname[POKEMON_NAME_LENGTH + 1]; void *ptr; const u8 *genderTxt; - u32 windowId, windowTileData, spriteTileNum; + u32 windowId, spriteTileNum; + u8 *windowTileData; u16 species; u8 gender; @@ -1591,7 +1854,7 @@ void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) RemoveWindowOnHealthbox(windowId); } -void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) +static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) { u8 bank, healthboxSpriteId_2; @@ -1614,12 +1877,12 @@ void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); } -void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) +static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) { s32 i; u8 bank, healthboxSpriteId_2; u32 status, pltAdder; - const u32 *statusGfxPtr; + const u8 *statusGfxPtr; s16 tileNumAdder; u8 statusPalId; @@ -1642,27 +1905,27 @@ void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) if (status & STATUS_SLEEP) { statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x1B, bank)); - statusPalId = 2; + statusPalId = PAL_STATUS_SLP; } else if (status & STATUS_PSN_ANY) { statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x15, bank)); - statusPalId = 0; + statusPalId = PAL_STATUS_PSN; } else if (status & STATUS_BURN) { statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x21, bank)); - statusPalId = 4; + statusPalId = PAL_STATUS_BRN; } else if (status & STATUS_FREEZE) { statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x1E, bank)); - statusPalId = 3; + statusPalId = PAL_STATUS_FRZ; } else if (status & STATUS_PARALYSIS) { statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x18, bank)); - statusPalId = 1; + statusPalId = PAL_STATUS_PAR; } else { @@ -1681,7 +1944,7 @@ void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) pltAdder = gSprites[healthboxSpriteId].oam.paletteNum * 16; pltAdder += bank + 12; - FillPalette(gBattleInterfaceStatusIcons_DynPals[statusPalId], pltAdder + 0x100, 2); + FillPalette(sStatusIconPalettes[statusPalId], pltAdder + 0x100, 2); CpuCopy16(gPlttBufferUnfaded + 0x100 + pltAdder, (void*)(OBJ_PLTT + pltAdder * 2), 2); CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * 32), 96); if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT) @@ -1695,7 +1958,7 @@ void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE); } -u8 GetStatusIconForBankId(u8 statusElementId, u8 bank) +static u8 GetStatusIconForBankId(u8 statusElementId, u8 bank) { u8 ret = statusElementId; @@ -1755,12 +2018,10 @@ u8 GetStatusIconForBankId(u8 statusElementId, u8 bank) return ret; } -extern const u8 gText_SafariBalls[]; -extern const u8 gText_SafariBallLeft[]; - -void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) +static void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) { - u32 windowId, windowTileData, spriteTileNum; + u32 windowId, spriteTileNum; + u8 *windowTileData; windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(gText_SafariBalls, 0, 3, 2, &windowId); spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; @@ -1769,11 +2030,12 @@ void UpdateSafariBallsTextOnHealthbox(u8 healthboxSpriteId) RemoveWindowOnHealthbox(windowId); } -void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) +static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) { u8 text[16]; u8 *txtPtr; - u32 windowId, windowTileData, spriteTileNum; + u32 windowId, spriteTileNum; + u8 *windowTileData; txtPtr = StringCopy(text, gText_SafariBallLeft); ConvertIntToDecimalStringN(txtPtr, gNumSafariBalls, STR_CONV_MODE_LEFT_ALIGN, 2); @@ -1785,11 +2047,9 @@ void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) RemoveWindowOnHealthbox(windowId); } -extern void LoadBattleBarGfx(u8 arg0); - void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId) { - u32 maxHp, currHp; + s32 maxHp, currHp; u8 bank = gSprites[healthboxSpriteId].data6; if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) @@ -1810,14 +2070,15 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem LoadBattleBarGfx(0); maxHp = GetMonData(mon, MON_DATA_MAX_HP); currHp = GetMonData(mon, MON_DATA_HP); - SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, FALSE); - sub_8074AA0(bank, healthboxSpriteId, 0, 0); + SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, 0); + sub_8074AA0(bank, healthboxSpriteId, HEALTH_BAR, 0); } isDoubles = IsDoubleBattle(); if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL)) { u16 species; - u32 exp, currLevelExp, currExpBarValue, maxExpBarValue; + u32 exp, currLevelExp; + s32 currExpBarValue, maxExpBarValue; u8 level; LoadBattleBarGfx(3); @@ -1828,7 +2089,7 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem currExpBarValue = exp - currLevelExp; maxExpBarValue = gExperienceTables[gBaseStats[species].growthRate][level + 1] - currLevelExp; SetBattleBarStruct(bank, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles); - sub_8074AA0(bank, healthboxSpriteId, 1, 0); + sub_8074AA0(bank, healthboxSpriteId, EXP_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); @@ -1848,8 +2109,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem LoadBattleBarGfx(0); maxHp = GetMonData(mon, MON_DATA_MAX_HP); currHp = GetMonData(mon, MON_DATA_HP); - SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, FALSE); - sub_8074AA0(bank, healthboxSpriteId, 0, 0); + SetBattleBarStruct(bank, healthboxSpriteId, maxHp, currHp, 0); + sub_8074AA0(bank, healthboxSpriteId, HEALTH_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); @@ -1857,3 +2118,374 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem UpdateStatusIconInHealthbox(healthboxSpriteId); } } + +s32 sub_8074AA0(u8 bank, u8 healthboxSpriteId, u8 whichBar, u8 arg3) +{ + s32 var; + + if (whichBar == HEALTH_BAR) // health bar + { + var = sub_8074DB8(gBattleSpritesDataPtr->battleBars[bank].maxValue, + gBattleSpritesDataPtr->battleBars[bank].currentValue, + gBattleSpritesDataPtr->battleBars[bank].field_C, + &gBattleSpritesDataPtr->battleBars[bank].field_10, + 6, 1); + } + else // exp bar + { + u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[bank].currentValue, + gBattleSpritesDataPtr->battleBars[bank].field_C, + gBattleSpritesDataPtr->battleBars[bank].maxValue, 8); + if (expFraction == 0) + expFraction = 1; + expFraction = abs(gBattleSpritesDataPtr->battleBars[bank].field_C / expFraction); + + var = sub_8074DB8(gBattleSpritesDataPtr->battleBars[bank].maxValue, + gBattleSpritesDataPtr->battleBars[bank].currentValue, + gBattleSpritesDataPtr->battleBars[bank].field_C, + &gBattleSpritesDataPtr->battleBars[bank].field_10, + 8, expFraction); + } + + if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars)) + sub_8074B9C(bank, whichBar); + + if (var == -1) + gBattleSpritesDataPtr->battleBars[bank].field_10 = 0; + + return var; +} + +static void sub_8074B9C(u8 bank, u8 whichBar) +{ + u8 array[7]; + u8 subRet, level; + u8 barElementId; + u8 i; + + switch (whichBar) + { + case HEALTH_BAR: + subRet = sub_8074E8C(gBattleSpritesDataPtr->battleBars[bank].maxValue, + gBattleSpritesDataPtr->battleBars[bank].currentValue, + gBattleSpritesDataPtr->battleBars[bank].field_C, + &gBattleSpritesDataPtr->battleBars[bank].field_10, + array, 6); + barElementId = 3; + if (subRet <= 0x18) + { + barElementId = 0x38; + if (subRet > 9) + barElementId = 0x2F; + } + for (i = 0; i < 6; i++) + { + u8 healthboxSpriteId_2 = gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].data5; + if (i < 2) + CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, + (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 2 + i) * 32), 32); + else + CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, + (void*)(OBJ_VRAM0 + 64 + (i + gSprites[healthboxSpriteId_2].oam.tileNum) * 32), 32); + } + break; + case EXP_BAR: + sub_8074E8C(gBattleSpritesDataPtr->battleBars[bank].maxValue, + gBattleSpritesDataPtr->battleBars[bank].currentValue, + gBattleSpritesDataPtr->battleBars[bank].field_C, + &gBattleSpritesDataPtr->battleBars[bank].field_10, + array, 8); + level = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_LEVEL); + if (level == MAX_MON_LEVEL) + { + for (i = 0; i < 8; i++) + array[i] = 0; + } + for (i = 0; i < 8; i++) + { + if (i < 4) + CpuCopy32(GetHealthboxElementGfxPtr(0xC) + array[i] * 32, + (void*)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].oam.tileNum + 0x24 + i) * 32), 32); + else + CpuCopy32(GetHealthboxElementGfxPtr(0xC) + array[i] * 32, + (void*)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].oam.tileNum) * 32), 32); + } + break; + } +} + +static s32 sub_8074DB8(s32 maxValue, s32 currValue, s32 arg2, s32 *arg3, u8 arg4, u16 arg5) +{ + s32 r6; + s32 ret; + arg4 <<= 3; + + if (*arg3 == -32768) + { + if (maxValue < arg4) + *arg3 = currValue << 8; + else + *arg3 = currValue; + } + + currValue -= arg2; + if (currValue < 0) + currValue = 0; + else if (currValue > maxValue) + currValue = maxValue; + + if (maxValue < arg4) + { + s32 var = *arg3 >> 8; + + r6 = *arg3; + if (currValue == var && (r6 & 0xFF) == 0) + return -1; + } + else + { + r6 = *arg3; + if (currValue == r6) + return -1; + } + + if (maxValue < arg4) + { + s32 var = (maxValue << 8) / arg4; + + if (arg2 < 0) + { + *arg3 = r6 + var; + ret = *arg3 >> 8; + if (ret >= currValue) + { + *arg3 = currValue << 8; + ret = currValue; + } + } + else + { + *arg3 = r6 - var; + ret = *arg3 >> 8; + if ((*arg3 & 0xFF) > 0) + ret++; + if (ret <= currValue) + { + *arg3 = currValue << 8; + ret = currValue; + } + } + } + else + { + if (arg2 < 0) + { + *arg3 += arg5; + if (*arg3 > currValue) + *arg3 = currValue; + ret = *arg3; + } + else + { + *arg3 -= arg5; + if (*arg3 < currValue) + *arg3 = currValue; + ret = *arg3; + } + } + + return ret; +} + +static u8 sub_8074E8C(s32 maxValue, s32 currValue, s32 arg2, s32 *arg3, u8 *arg4, u8 arg5) +{ + s32 r5 = currValue - arg2; + u8 ret; + u8 i; + u8 r2; + + if (r5 < 0) + r5 = 0; + else if (r5 > maxValue) + r5 = maxValue; + + ret = arg5 << 3; + + for (i = 0; i < arg5; i++) + arg4[i] = 0; + + if (maxValue < ret) + r2 = (*arg3 * ret / maxValue) >> 8; + else + r2 = *arg3 * ret / maxValue; + + ret = r2; + + if (ret == 0 && r5 > 0) + { + arg4[0] = 1; + ret = 1; + } + else + { + for (i = 0; i < arg5; i++) + { + if (r2 >= 8) + { + arg4[i] = 8; + } + else + { + arg4[i] = r2; + break; + } + r2 -= 8; + } + } + + return ret; +} + +static s16 sub_8074F28(struct TestingBar *barInfo, s32 *arg1, u16 *arg2, s32 arg3) +{ + s16 ret, var; + + ret = sub_8074DB8(barInfo->maxValue, + barInfo->currValue, + barInfo->field_8, + arg1, 6, 1); + sub_8074F88(barInfo, arg1, arg2); + + if (barInfo->maxValue < 0x30) + var = *arg1 >> 8; + else + var = *arg1; + + DummiedOutFunction(barInfo->maxValue, var, arg3); + + return ret; +} + +static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2) +{ + u8 sp8[6]; + u16 sp10[6]; + u8 i; + + sub_8074E8C(barInfo->maxValue, barInfo->currValue, + barInfo->field_8, arg1, sp8, 6); + + for (i = 0; i < 6; i++) + sp10[i] = (barInfo->unkC_0 << 12) | (barInfo->unk10 + sp8[i]); + + CpuCopy16(sp10, arg2, sizeof(sp10)); +} + +static u8 GetScaledExpFraction(s32 currValue, s32 arg1, s32 maxValue, u8 scale) +{ + s32 r5, result; + s8 r4, r0; + + scale *= 8; + r5 = currValue - arg1; + + if (r5 < 0) + r5 = 0; + else if (r5 > maxValue) + r5 = maxValue; + + r4 = currValue * scale / maxValue; + r0 = r5 * scale / maxValue; + result = r4 - r0; + + return abs(result); +} + +u8 GetScaledHPFraction(s16 hp, s16 maxhp, u8 scale) +{ + u8 result = hp * scale / maxhp; + + if (result == 0 && hp > 0) + return 1; + + return result; +} + +u8 GetHPBarLevel(s16 hp, s16 maxhp) +{ + s32 result; + + if (hp == maxhp) + { + result = 4; + } + else + { + u8 fraction = GetScaledHPFraction(hp, maxhp, 48); + if (fraction > 24) + result = 3; + else if (fraction > 9) + result = 2; + else if (fraction > 0) + result = 1; + else + result = 0; + } + + return result; +} + +static u8* AddTextPrinterAndCreateWindowOnHealthbox(const u8 *str, u32 x, u32 y, u32 arg3, u32 *windowId) +{ + u16 winId; + struct TextColor color; + struct WindowTemplate winTemplate = sHealthboxWindowTemplate; + + winId = AddWindow(&winTemplate); + FillWindowPixelBuffer(winId, (arg3 << 4) | (arg3)); + + color.fgColor = arg3; + color.bgColor = 1; + color.shadowColor = 3; + + AddTextPrinterParametrized2(winId, 0, x, y, 0, 0, &color, -1, str); + + *windowId = winId; + return (u8*)(GetWindowAttribute(winId, WINDOW_TILE_DATA)); +} + +static void RemoveWindowOnHealthbox(u32 windowId) +{ + RemoveWindow(windowId); +} + +static void sub_807513C(void *dest, u32 arg1, u32 arg2) +{ + CpuFill32(0x11111111 * arg1, dest, arg2 * 32); +} + +static void sub_8075170(void *dest, u8 *windowTileData, u32 arg2) +{ + CpuCopy32(windowTileData + 256, dest, arg2 * 32); +} + +static void sub_8075198(void *dest, u8 *windowTileData, s32 arg2) +{ + CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); + + if (arg2 > 0) + { + do + { + CpuCopy32(windowTileData + 20, dest + 20, 12); + dest += 32, windowTileData+= 32; + arg2--; + } while (arg2 != 0); + } +} + +static void sub_80751E4(void *dest, u8 *windowTileData, u32 arg2) +{ + CpuCopy32(windowTileData, dest, arg2 * 32); + CpuCopy32(windowTileData + 256, dest + 256, arg2 * 32); +} -- cgit v1.2.3 From 9ccc472b97b1a7f85703f813665cb4a30f7891b6 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 19 Oct 2017 18:25:48 +0200 Subject: label some functions --- src/battle_interface.c | 456 ++++++++++++++++++++++++++++++--------------- src/reshow_battle_screen.c | 4 +- 2 files changed, 305 insertions(+), 155 deletions(-) (limited to 'src') diff --git a/src/battle_interface.c b/src/battle_interface.c index 7d176a9af..a21e72bcf 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -26,6 +26,12 @@ enum EXP_BAR }; +enum +{ + HP_CURRENT, + HP_MAX +}; + struct TestingBar { s32 maxValue; @@ -35,7 +41,128 @@ struct TestingBar u32 unk10; }; -extern bool8 IsDoubleBattle(void); +enum +{ + HEALTHBOX_GFX_0, + HEALTHBOX_GFX_1, + HEALTHBOX_GFX_2, + HEALTHBOX_GFX_3, + HEALTHBOX_GFX_4, + HEALTHBOX_GFX_5, + HEALTHBOX_GFX_6, + HEALTHBOX_GFX_7, + HEALTHBOX_GFX_8, + HEALTHBOX_GFX_9, + HEALTHBOX_GFX_10, + HEALTHBOX_GFX_11, + HEALTHBOX_GFX_12, + HEALTHBOX_GFX_13, + HEALTHBOX_GFX_14, + HEALTHBOX_GFX_15, + HEALTHBOX_GFX_16, + HEALTHBOX_GFX_17, + HEALTHBOX_GFX_18, + HEALTHBOX_GFX_19, + HEALTHBOX_GFX_20, + HEALTHBOX_GFX_STATUS_PSN_BANK0, + HEALTHBOX_GFX_22, + HEALTHBOX_GFX_23, + HEALTHBOX_GFX_STATUS_PRZ_BANK0, + HEALTHBOX_GFX_25, + HEALTHBOX_GFX_26, + HEALTHBOX_GFX_STATUS_SLP_BANK0, + HEALTHBOX_GFX_28, + HEALTHBOX_GFX_29, + HEALTHBOX_GFX_STATUS_FRZ_BANK0, + HEALTHBOX_GFX_31, + HEALTHBOX_GFX_32, + HEALTHBOX_GFX_STATUS_BRN_BANK0, + HEALTHBOX_GFX_34, + HEALTHBOX_GFX_35, + HEALTHBOX_GFX_36, + HEALTHBOX_GFX_37, + HEALTHBOX_GFX_38, + HEALTHBOX_GFX_39, + HEALTHBOX_GFX_40, + HEALTHBOX_GFX_41, + HEALTHBOX_GFX_42, + HEALTHBOX_GFX_43, + HEALTHBOX_GFX_44, + HEALTHBOX_GFX_45, + HEALTHBOX_GFX_46, + HEALTHBOX_GFX_47, + HEALTHBOX_GFX_48, + HEALTHBOX_GFX_49, + HEALTHBOX_GFX_50, + HEALTHBOX_GFX_51, + HEALTHBOX_GFX_52, + HEALTHBOX_GFX_53, + HEALTHBOX_GFX_54, + HEALTHBOX_GFX_55, + HEALTHBOX_GFX_56, + HEALTHBOX_GFX_57, + HEALTHBOX_GFX_58, + HEALTHBOX_GFX_59, + HEALTHBOX_GFX_60, + HEALTHBOX_GFX_61, + HEALTHBOX_GFX_62, + HEALTHBOX_GFX_63, + HEALTHBOX_GFX_64, + HEALTHBOX_GFX_65, + HEALTHBOX_GFX_66, + HEALTHBOX_GFX_67, + HEALTHBOX_GFX_68, + HEALTHBOX_GFX_69, + HEALTHBOX_GFX_70, + HEALTHBOX_GFX_STATUS_PSN_BANK1, + HEALTHBOX_GFX_72, + HEALTHBOX_GFX_73, + HEALTHBOX_GFX_STATUS_PRZ_BANK1, + HEALTHBOX_GFX_75, + HEALTHBOX_GFX_76, + HEALTHBOX_GFX_STATUS_SLP_BANK1, + HEALTHBOX_GFX_78, + HEALTHBOX_GFX_79, + HEALTHBOX_GFX_STATUS_FRZ_BANK1, + HEALTHBOX_GFX_81, + HEALTHBOX_GFX_82, + HEALTHBOX_GFX_STATUS_BRN_BANK1, + HEALTHBOX_GFX_84, + HEALTHBOX_GFX_85, + HEALTHBOX_GFX_STATUS_PSN_BANK2, + HEALTHBOX_GFX_87, + HEALTHBOX_GFX_88, + HEALTHBOX_GFX_STATUS_PRZ_BANK2, + HEALTHBOX_GFX_90, + HEALTHBOX_GFX_91, + HEALTHBOX_GFX_STATUS_SLP_BANK2, + HEALTHBOX_GFX_93, + HEALTHBOX_GFX_94, + HEALTHBOX_GFX_STATUS_FRZ_BANK2, + HEALTHBOX_GFX_96, + HEALTHBOX_GFX_97, + HEALTHBOX_GFX_STATUS_BRN_BANK2, + HEALTHBOX_GFX_99, + HEALTHBOX_GFX_100, + HEALTHBOX_GFX_STATUS_PSN_BANK3, + HEALTHBOX_GFX_102, + HEALTHBOX_GFX_103, + HEALTHBOX_GFX_STATUS_PRZ_BANK3, + HEALTHBOX_GFX_105, + HEALTHBOX_GFX_106, + HEALTHBOX_GFX_STATUS_SLP_BANK3, + HEALTHBOX_GFX_108, + HEALTHBOX_GFX_109, + HEALTHBOX_GFX_STATUS_FRZ_BANK3, + HEALTHBOX_GFX_111, + HEALTHBOX_GFX_112, + HEALTHBOX_GFX_STATUS_BRN_BANK3, + HEALTHBOX_GFX_114, + HEALTHBOX_GFX_115, + HEALTHBOX_GFX_116, + HEALTHBOX_GFX_117, +}; + extern u8 gBanksByIdentity[BATTLE_BANKS_COUNT]; extern u16 gBattlePartyID[BATTLE_BANKS_COUNT]; extern u8 gNoOfAllBanks; @@ -60,6 +187,8 @@ extern const u16 gBattleInterface_BallStatusBarPal[]; extern const u16 gBattleInterface_BallDisplayPal[]; extern const u8 gHealthboxElementsGfxTable[][32]; +// functions +extern bool8 IsDoubleBattle(void); extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor *color, s8 speed, const u8 *str); // menu.h extern void LoadBattleBarGfx(u8 arg0); @@ -85,9 +214,9 @@ static void sub_8072924(struct Sprite *sprite); static void sub_80728B4(struct Sprite *sprite); static void sub_8074158(struct Sprite *sprite); static void sub_8074090(struct Sprite *sprite); -static void sub_8074078(struct Sprite *sprite); -static void sub_80740C4(struct Sprite *sprite); -static void sub_80741C8(struct Sprite *sprite); +static void SpriteCB_StatusSummaryBar(struct Sprite *sprite); +static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite); +static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite); static u8 GetStatusIconForBankId(u8 statusElementId, u8 bank); static s32 sub_8074DB8(s32 maxValue, s32 currValue, s32 arg2, s32 *arg3, u8 arg4, u16 arg5); @@ -114,11 +243,11 @@ static const struct OamData gUnknown_0832C138 = .affineParam = 0, }; -static const struct SpriteTemplate gUnknown_0832C140[2] = +static const struct SpriteTemplate sHealthboxPlayerSpriteTemplates[2] = { { - .tileTag = 0xD6FF, - .paletteTag = 0xD6FF, + .tileTag = TAG_HEALTHBOX_PLAYER1_TILE, + .paletteTag = TAG_HEALTHBOX_PAL, .oam = &gUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, @@ -126,8 +255,8 @@ static const struct SpriteTemplate gUnknown_0832C140[2] = .callback = SpriteCallbackDummy }, { - .tileTag = 0xd700, - .paletteTag = 0xD6FF, + .tileTag = TAG_HEALTHBOX_PLAYER2_TILE, + .paletteTag = TAG_HEALTHBOX_PAL, .oam = &gUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, @@ -136,11 +265,11 @@ static const struct SpriteTemplate gUnknown_0832C140[2] = } }; -static const struct SpriteTemplate gUnknown_0832C170[2] = +static const struct SpriteTemplate sHealthboxOpponentSpriteTemplates[2] = { { - .tileTag = 0xd701, - .paletteTag = 0xD6FF, + .tileTag = TAG_HEALTHBOX_OPPONENT1_TILE, + .paletteTag = TAG_HEALTHBOX_PAL, .oam = &gUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, @@ -148,8 +277,8 @@ static const struct SpriteTemplate gUnknown_0832C170[2] = .callback = SpriteCallbackDummy }, { - .tileTag = 0xd702, - .paletteTag = 0xD6FF, + .tileTag = TAG_HEALTHBOX_OPPONENT2_TILE, + .paletteTag = TAG_HEALTHBOX_PAL, .oam = &gUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, @@ -158,10 +287,10 @@ static const struct SpriteTemplate gUnknown_0832C170[2] = } }; -static const struct SpriteTemplate gUnknown_0832C1A0 = +static const struct SpriteTemplate sHealthboxSafariSpriteTemplate = { - .tileTag = 0xd70b, - .paletteTag = 0xd6ff, + .tileTag = TAG_HEALTHBOX_SAFARI_TILE, + .paletteTag = TAG_HEALTHBOX_PAL, .oam = &gUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, @@ -226,7 +355,7 @@ static const struct SpriteTemplate gUnknown_0832C1C0[4] = } }; -static const struct Subsprite gUnknown_0832C220[] = +static const struct Subsprite sUnknown_0832C220[] = { {240, 0, 1, 3, 0, 1}, {48, 0, 0, 2, 32, 1}, @@ -235,7 +364,7 @@ static const struct Subsprite gUnknown_0832C220[] = {48, 32, 1, 1, 56, 1} }; -static const struct Subsprite gUnknown_0832C234[] = +static const struct Subsprite sUnknown_0832C234[] = { {240, 0, 1, 3, 64, 1}, {48, 0, 0, 2, 96, 1}, @@ -244,46 +373,47 @@ static const struct Subsprite gUnknown_0832C234[] = {48, 32, 1, 1, 120, 1} }; -static const struct Subsprite gUnknown_0832C248[] = +static const struct Subsprite sUnknown_0832C248[] = { {240, 0, 1, 3, 0, 1}, {48, 0, 0, 2, 32, 1} }; -static const struct Subsprite gUnknown_0832C250[] = +static const struct Subsprite sUnknown_0832C250[] = { {240, 0, 1, 3, 0, 1}, {48, 0, 0, 2, 32, 1} }; -static const struct Subsprite gUnknown_0832C258[] = +static const struct Subsprite sUnknown_0832C258[] = { {240, 0, 1, 1, 0, 1}, {16, 0, 1, 1, 4, 1} }; -static const struct Subsprite gUnknown_0832C260[] = +static const struct Subsprite sUnknown_0832C260[] = { {240, 0, 1, 1, 0, 1}, {16, 0, 1, 1, 4, 1}, {224, 0, 0, 0, 8, 1} }; -static const struct SubspriteTable gUnknown_0832C26C[] = +// unused subsprite table +static const struct SubspriteTable sUnknown_0832C26C[] = { - {ARRAY_COUNT(gUnknown_0832C220), gUnknown_0832C220}, - {ARRAY_COUNT(gUnknown_0832C248), gUnknown_0832C248}, - {ARRAY_COUNT(gUnknown_0832C234), gUnknown_0832C234}, - {ARRAY_COUNT(gUnknown_0832C250), gUnknown_0832C250} + {ARRAY_COUNT(sUnknown_0832C220), sUnknown_0832C220}, + {ARRAY_COUNT(sUnknown_0832C248), sUnknown_0832C248}, + {ARRAY_COUNT(sUnknown_0832C234), sUnknown_0832C234}, + {ARRAY_COUNT(sUnknown_0832C250), sUnknown_0832C250} }; -static const struct SubspriteTable gUnknown_0832C28C[] = +static const struct SubspriteTable sUnknown_0832C28C[] = { - {ARRAY_COUNT(gUnknown_0832C258), gUnknown_0832C258}, - {ARRAY_COUNT(gUnknown_0832C260), gUnknown_0832C260} + {ARRAY_COUNT(sUnknown_0832C258), sUnknown_0832C258}, + {ARRAY_COUNT(sUnknown_0832C260), sUnknown_0832C260} }; -static const struct Subsprite gUnknown_0832C29C[] = +static const struct Subsprite sStatusSummaryBar_Subsprites_0[] = { {160, 0, 1, 1, 0, 1}, {192, 0, 1, 1, 4, 1}, @@ -301,9 +431,9 @@ static const struct Subsprite gUnknown_0832C2AC[] = {64, 0, 1, 1, 12, 1} }; -static const struct SubspriteTable gUnknown_0832C2C4[] = +static const struct SubspriteTable sStatusSummaryBar_SubspriteTable[] = { - {ARRAY_COUNT(gUnknown_0832C29C), gUnknown_0832C29C} + {ARRAY_COUNT(sStatusSummaryBar_Subsprites_0), sStatusSummaryBar_Subsprites_0} }; static const struct SubspriteTable gUnknown_0832C2CC[] = @@ -324,27 +454,28 @@ static const u16 gUnknown_0832C2D4[] = 0x7777, 0x7777, 0x7777, 0x7111, 0x7777, 0x7171, 0x7777, 0x7111, }; -static const struct CompressedSpriteSheet gUnknown_0832C334 = +static const struct CompressedSpriteSheet sStatusSummaryBarSpriteSheet = { - gBattleInterface_BallStatusBarGfx, 0x200, 0xD70C + gBattleInterface_BallStatusBarGfx, 0x200, TAG_STATUS_SUMMARY_BAR_TILE }; -static const struct SpritePalette gUnknown_0832C33C = +static const struct SpritePalette sStatusSummaryBarSpritePal = { - gBattleInterface_BallStatusBarPal, 0xD710 + gBattleInterface_BallStatusBarPal, TAG_STATUS_SUMMARY_BAR_PAL }; -static const struct SpritePalette gUnknown_0832C344 = +static const struct SpritePalette sStatusSummaryBallsSpritePal = { - gBattleInterface_BallDisplayPal, 0xD712 + gBattleInterface_BallDisplayPal, TAG_STATUS_SUMMARY_BALLS_PAL }; -static const struct SpriteSheet gUnknown_0832C34C = +static const struct SpriteSheet sStatusSummaryBallsSpriteSheet = { - gBattleInterface_BallDisplayGfx, 0x80, 0xD714 + gBattleInterface_BallDisplayGfx, 0x80, TAG_STATUS_SUMMARY_BALLS_TILE }; -static const struct OamData gUnknown_0832C354 = +// unused oam data +static const struct OamData sUnknown_0832C354 = { .y = 0, .affineMode = 0, @@ -361,7 +492,7 @@ static const struct OamData gUnknown_0832C354 = .affineParam = 0, }; -static const struct OamData gUnknown_0832C35C = +static const struct OamData sOamData_StatusSummayBalls = { .y = 0, .affineMode = 0, @@ -378,47 +509,47 @@ static const struct OamData gUnknown_0832C35C = .affineParam = 0, }; -static const struct SpriteTemplate gUnknown_0832C364[2] = +static const struct SpriteTemplate sStatusSummaryBarSpriteTemplates[2] = { { - .tileTag = 0xd70c, - .paletteTag = 0xd710, + .tileTag = TAG_STATUS_SUMMARY_BAR_TILE, + .paletteTag = TAG_STATUS_SUMMARY_BAR_PAL, .oam = &gUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8074078 + .callback = SpriteCB_StatusSummaryBar }, { - .tileTag = 0xd70c, - .paletteTag = 0xd710, + .tileTag = TAG_STATUS_SUMMARY_BAR_TILE, + .paletteTag = TAG_STATUS_SUMMARY_BAR_PAL, .oam = &gUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_8074078 + .callback = SpriteCB_StatusSummaryBar } }; -static const struct SpriteTemplate gUnknown_0832C394[2] = +static const struct SpriteTemplate sStatusSummaryBallsSpriteTemplates[2] = { { - .tileTag = 0xd714, - .paletteTag = 0xd712, - .oam = &gUnknown_0832C35C, + .tileTag = TAG_STATUS_SUMMARY_BALLS_TILE, + .paletteTag = TAG_STATUS_SUMMARY_BALLS_PAL, + .oam = &sOamData_StatusSummayBalls, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80740C4 + .callback = SpriteCB_StatusSummaryBallsOnBattleStart }, { - .tileTag = 0xd714, - .paletteTag = 0xd712, - .oam = &gUnknown_0832C35C, + .tileTag = TAG_STATUS_SUMMARY_BALLS_TILE, + .paletteTag = TAG_STATUS_SUMMARY_BALLS_PAL, + .oam = &sOamData_StatusSummayBalls, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80740C4 + .callback = SpriteCB_StatusSummaryBallsOnBattleStart } }; @@ -469,57 +600,66 @@ static s32 DummiedOutFunction(s16 unused1, s16 unused2, s32 unused3) static void sub_8072308(s16 arg0, u16 *arg1, u8 arg2) { s8 i, j; - s8 array[4]; + u8 array[4]; + u8 *arrayPtr; + s32 r9, vaaa; for (i = 0; i < 4; i++) array[i] = 0; i = 3; + r9 = -1; + arrayPtr = array; while (1) { - if (arg0 < 0) + if (arg0 > 0) + { + array[i] = arg0 % 10; + arg0 = arg0 / 10; + i--; + } + else + { break; - - array[i] = arg0 % 10; - arg0 /= 10; - i--; + } } - for (j = i; j > -1; j--) + for (; i > -1; i--) { - array[j] = -1; + array[i] = 0xFF; } - if (array[3] == -1) - array[3] = 0; + if (arrayPtr[3] == 0xFF) + arrayPtr[3] = 0; if (arg2 == 0) { - for (i = 0; i < 4; i++) + for (i = 0, j = 0; i < 4; i++) { - if (array[i] == -1) + if (array[j] == 0xFF) { - arg1[i] &= 0xFC00; - arg1[i] |= 0x1E; + arg1[j] &= 0xFC00; + arg1[j] |= 0x1E; arg1[i + 0x20] &= 0xFC00; arg1[i + 0x20] |= 0x1E; } else { - arg1[i] &= 0xFC00; - arg1[i] |= array[i] + 0x14; + arg1[j] &= 0xFC00; + arg1[j] |= array[j] + 0x14; arg1[i + 0x20] &= 0xFC00; arg1[i + 0x20] |= array[i] + 0x34; } + j++; } } else { for (i = 0; i < 4; i++) { - if (array[i] == -1) + if (array[i] == 0xFF) { arg1[i] &= 0xFC00; arg1[i] |= 0x1E; @@ -775,6 +915,11 @@ void sub_80724A8(s16 arg0, s16 arg1, u16 *arg2) sub_8072308(arg0, arg2 + 5, 1); } +// because the healthbox is too large to fit into one sprite, it is divided into two sprites +// healthboxSpriteId_1 or healthboxSpriteId refers to the 'main' healthbox +// healthboxSpriteId_2 refers to the other part +// there's also one other sprite that appears to be a black square? dont fully understand its role + u8 CreateBankHealthboxSprites(u8 bank) { s16 data6 = 0; @@ -786,8 +931,8 @@ u8 CreateBankHealthboxSprites(u8 bank) { if (GetBankSide(bank) == SIDE_PLAYER) { - healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C140[0], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C140[0], 240, 160, 1); + healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], 240, 160, 1); gSprites[healthboxSpriteId_1].oam.shape = 0; @@ -796,8 +941,8 @@ u8 CreateBankHealthboxSprites(u8 bank) } else { - healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C170[0], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C170[0], 240, 160, 1); + healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[0], 240, 160, 1); gSprites[healthboxSpriteId_2].oam.tileNum += 32; @@ -811,8 +956,8 @@ u8 CreateBankHealthboxSprites(u8 bank) { if (GetBankSide(bank) == SIDE_PLAYER) { - healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C140[GetBankIdentity(bank) / 2], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C140[GetBankIdentity(bank) / 2], 240, 160, 1); + healthboxSpriteId_1 = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1); gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; @@ -824,8 +969,8 @@ u8 CreateBankHealthboxSprites(u8 bank) } else { - healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C170[GetBankIdentity(bank) / 2], 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C170[GetBankIdentity(bank) / 2], 240, 160, 1); + healthboxSpriteId_1 = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBankIdentity(bank) / 2], 240, 160, 1); gSprites[healthboxSpriteId_1].oam.affineParam = healthboxSpriteId_2; @@ -839,11 +984,11 @@ u8 CreateBankHealthboxSprites(u8 bank) unkSpriteId = CreateSpriteAtEnd(&gUnknown_0832C1C0[gBanksByIdentity[bank]], 140, 60, 0); unkSpritePtr = &gSprites[unkSpriteId]; - SetSubspriteTables(unkSpritePtr, &gUnknown_0832C28C[GetBankSide(bank)]); + SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBankSide(bank)]); unkSpritePtr->subspriteMode = 2; unkSpritePtr->oam.priority = 1; - CpuCopy32(GetHealthboxElementGfxPtr(1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void*)(OBJ_VRAM0 + unkSpritePtr->oam.tileNum * 32), 64); gSprites[healthboxSpriteId_1].data5 = unkSpriteId; gSprites[healthboxSpriteId_1].data6 = bank; @@ -862,8 +1007,8 @@ u8 CreateSafariPlayerHealthboxSprites(void) { u8 healthboxSpriteId_1, healthboxSpriteId_2; - healthboxSpriteId_1 = CreateSprite(&gUnknown_0832C1A0, 240, 160, 1); - healthboxSpriteId_2 = CreateSpriteAtEnd(&gUnknown_0832C1A0, 240, 160, 1); + healthboxSpriteId_1 = CreateSprite(&sHealthboxSafariSpriteTemplate, 240, 160, 1); + healthboxSpriteId_2 = CreateSpriteAtEnd(&sHealthboxSafariSpriteTemplate, 240, 160, 1); gSprites[healthboxSpriteId_1].oam.shape = 0; gSprites[healthboxSpriteId_2].oam.shape = 0; @@ -955,7 +1100,7 @@ void DestoryHealthboxSprite(u8 healthboxSpriteId) DestroySprite(&gSprites[healthboxSpriteId]); } -void nullsub_30(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly) +void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly) { } @@ -1060,7 +1205,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER && !IsDoubleBattle()) { spriteTileNum = gSprites[healthboxSpriteId].oam.tileNum * 32; - if (maxOrCurrent) // singles, max + if (maxOrCurrent != HP_CURRENT) // singles, max { ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 2, &windowId); @@ -1102,14 +1247,14 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) if (GetBankSide(gSprites[healthboxSpriteId].data6) == SIDE_PLAYER) { - if (!maxOrCurrent) + if (maxOrCurrent == HP_CURRENT) var = 29; else var = 89; } else { - if (!maxOrCurrent) + if (maxOrCurrent == HP_CURRENT) var = 20; else var = 48; @@ -1142,13 +1287,13 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 spriteTileNum = gSprites[gSprites[healthboxSpriteId].data5].oam.tileNum * 32; objVram = (void*)(OBJ_VRAM0) + spriteTileNum; - if (maxOrCurrent) // doubles, max hp + if (maxOrCurrent != HP_CURRENT) // doubles, max hp { ConvertIntToDecimalStringN(text, value, STR_CONV_MODE_RIGHT_ALIGN, 3); windowTileData = AddTextPrinterAndCreateWindowOnHealthbox(text, 0, 5, 0, &windowId); sub_8075170((void*)(OBJ_VRAM0) + spriteTileNum + 0xC0, windowTileData, 2); RemoveWindowOnHealthbox(windowId); - CpuCopy32(GetHealthboxElementGfxPtr(0x74), + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116), (void*)(OBJ_VRAM0 + 0x680) + (gSprites[healthboxSpriteId].oam.tileNum * 32), 0x20); } @@ -1178,7 +1323,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 u8 *txtPtr; u8 i; - if (!maxOrCurrent) + if (maxOrCurrent == HP_CURRENT) var = 0; r7 = gSprites[healthboxSpriteId].data5; @@ -1203,7 +1348,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 } } - if (!maxOrCurrent) + if (maxOrCurrent == HP_CURRENT) { CpuCopy32(&gMonSpritesGfxPtr->fontPixels[224], (void*)((OBJ_VRAM0) + ((gSprites[r7].oam.tileNum + 4) * 32)), @@ -1214,7 +1359,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 { if (GetBankSide(bank) == SIDE_PLAYER) // impossible to reach part, because the bank is from the opponent's side { - CpuCopy32(GetHealthboxElementGfxPtr(0x74), + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_116), (void*)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * 32), 0x20); } @@ -1314,14 +1459,14 @@ void SwapHpBarsWithHpText(void) spriteId = gSprites[gHealthBoxesIds[i]].data5; CpuFill32(0, (void*)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); - UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), 0); - UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gPlayerParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX); } else // text to bars { UpdateStatusIconInHealthbox(gHealthBoxesIds[i]); UpdateHealthboxAttribute(gHealthBoxesIds[i], &gPlayerParty[gBattlePartyID[i]], HEALTHBOX_HEALTH_BAR); - CpuCopy32(GetHealthboxElementGfxPtr(0x75), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthBoxesIds[i]].oam.tileNum * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_117), (void*)(OBJ_VRAM0 + 0x680 + gSprites[gHealthBoxesIds[i]].oam.tileNum * 32), 32); } } else @@ -1337,8 +1482,8 @@ void SwapHpBarsWithHpText(void) spriteId = gSprites[gHealthBoxesIds[i]].data5; CpuFill32(0, (void *)(OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * 32), 0x100); - UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), 0); - UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), 1); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_HP), HP_CURRENT); + UpdateHpTextInHealthboxInDoubles(gHealthBoxesIds[i], GetMonData(&gEnemyParty[gBattlePartyID[i]], MON_DATA_MAX_HP), HP_MAX); } } else // text to bars @@ -1393,13 +1538,13 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar bar_data0 = 5; } - LoadCompressedObjectPicUsingHeap(&gUnknown_0832C334); - LoadSpriteSheet(&gUnknown_0832C34C); - LoadSpritePalette(&gUnknown_0832C33C); - LoadSpritePalette(&gUnknown_0832C344); + LoadCompressedObjectPicUsingHeap(&sStatusSummaryBarSpriteSheet); + LoadSpriteSheet(&sStatusSummaryBallsSpriteSheet); + LoadSpritePalette(&sStatusSummaryBarSpritePal); + LoadSpritePalette(&sStatusSummaryBallsSpritePal); - barSpriteId = CreateSprite(&gUnknown_0832C364[isOpponent], bar_X, bar_Y, 10); - SetSubspriteTables(&gSprites[barSpriteId], gUnknown_0832C2C4); + barSpriteId = CreateSprite(&sStatusSummaryBarSpriteTemplates[isOpponent], bar_X, bar_Y, 10); + SetSubspriteTables(&gSprites[barSpriteId], sStatusSummaryBar_SubspriteTable); gSprites[barSpriteId].pos2.x = bar_pos2_X; gSprites[barSpriteId].data0 = bar_data0; @@ -1415,10 +1560,10 @@ u8 CreatePartyStatusSummarySprites(u8 bank, struct HpAndStatus *partyInfo, u8 ar for (i = 0; i < 6; i++) { - ballIconSpritesIds[i] = CreateSpriteAtEnd(&gUnknown_0832C394[isOpponent], bar_X, bar_Y - 4, 9); + ballIconSpritesIds[i] = CreateSpriteAtEnd(&sStatusSummaryBallsSpriteTemplates[isOpponent], bar_X, bar_Y - 4, 9); if (!isBattleStart) - gSprites[ballIconSpritesIds[i]].callback = sub_80741C8; + gSprites[ballIconSpritesIds[i]].callback = SpriteCB_StatusSummaryBallsOnSwitchout; if (!isOpponent) { @@ -1705,7 +1850,7 @@ static void sub_8073F98(u8 taskId) } } -static void sub_8074078(struct Sprite *sprite) +static void SpriteCB_StatusSummaryBar(struct Sprite *sprite) { if (sprite->pos2.x != 0) sprite->pos2.x += sprite->data0; @@ -1721,7 +1866,7 @@ static void sub_8074090(struct Sprite *sprite) sprite->data1 &= 0xF; } -static void sub_80740C4(struct Sprite *sprite) +static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite) { u8 var1; u16 var2; @@ -1732,10 +1877,12 @@ static void sub_80740C4(struct Sprite *sprite) sprite->data1--; return; } + var1 = sprite->data2; var2 = sprite->data3; var2 += 56; sprite->data3 = var2 & 0xFFF0; + if (var1 != 0) { sprite->pos2.x += var2 >> 4; @@ -1748,15 +1895,18 @@ static void sub_80740C4(struct Sprite *sprite) if (sprite->pos2.x < 0) sprite->pos2.x = 0; } + if (sprite->pos2.x == 0) { pan = 63; if (var1 != 0) pan = -64; + if (sprite->data7 != 0) PlaySE2WithPanning(SE_TB_KARA, pan); else PlaySE1WithPanning(SE_TB_KON, pan); + sprite->callback = SpriteCallbackDummy; } } @@ -1787,7 +1937,7 @@ static void sub_8074158(struct Sprite *sprite) } } -static void sub_80741C8(struct Sprite *sprite) +static void SpriteCB_StatusSummaryBallsOnSwitchout(struct Sprite *sprite) { u8 barSpriteId = sprite->data0; @@ -1872,7 +2022,7 @@ static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) healthboxSpriteId_2 = gSprites[healthboxSpriteId].data5; if (noStatus) - CpuCopy32(GetHealthboxElementGfxPtr(0x46), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_70), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); else CpuFill32(0, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 8) * 32), 32); } @@ -1904,38 +2054,38 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) if (status & STATUS_SLEEP) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x1B, bank)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_SLP_BANK0, bank)); statusPalId = PAL_STATUS_SLP; } else if (status & STATUS_PSN_ANY) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x15, bank)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PSN_BANK0, bank)); statusPalId = PAL_STATUS_PSN; } else if (status & STATUS_BURN) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x21, bank)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_BRN_BANK0, bank)); statusPalId = PAL_STATUS_BRN; } else if (status & STATUS_FREEZE) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x1E, bank)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_FRZ_BANK0, bank)); statusPalId = PAL_STATUS_FRZ; } else if (status & STATUS_PARALYSIS) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(0x18, bank)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBankId(HEALTHBOX_GFX_STATUS_PRZ_BANK0, bank)); statusPalId = PAL_STATUS_PAR; } else { - statusGfxPtr = GetHealthboxElementGfxPtr(0x27); + statusGfxPtr = GetHealthboxElementGfxPtr(HEALTHBOX_GFX_39); for (i = 0; i < 3; i++) CpuCopy32(statusGfxPtr, (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * 32), 32); if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) - CpuCopy32(GetHealthboxElementGfxPtr(1), (void *)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 64); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 64); TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE); return; @@ -1951,8 +2101,8 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) { if (!gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) { - CpuCopy32(GetHealthboxElementGfxPtr(0), (void*)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 32); - CpuCopy32(GetHealthboxElementGfxPtr(0x41), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 1) * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void*)(OBJ_VRAM0 + gSprites[healthboxSpriteId_2].oam.tileNum * 32), 32); + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void*)(OBJ_VRAM0 + (gSprites[healthboxSpriteId_2].oam.tileNum + 1) * 32), 32); } } TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE); @@ -1964,55 +2114,55 @@ static u8 GetStatusIconForBankId(u8 statusElementId, u8 bank) switch (statusElementId) { - case 21: + case HEALTHBOX_GFX_STATUS_PSN_BANK0: if (bank == 0) - ret = 21; + ret = HEALTHBOX_GFX_STATUS_PSN_BANK0; else if (bank == 1) - ret = 71; + ret = HEALTHBOX_GFX_STATUS_PSN_BANK1; else if (bank == 2) - ret = 86; + ret = HEALTHBOX_GFX_STATUS_PSN_BANK2; else - ret = 101; + ret = HEALTHBOX_GFX_STATUS_PSN_BANK3; break; - case 24: + case HEALTHBOX_GFX_STATUS_PRZ_BANK0: if (bank == 0) - ret = 24; + ret = HEALTHBOX_GFX_STATUS_PRZ_BANK0; else if (bank == 1) - ret = 74; + ret = HEALTHBOX_GFX_STATUS_PRZ_BANK1; else if (bank == 2) - ret = 89; + ret = HEALTHBOX_GFX_STATUS_PRZ_BANK2; else - ret = 104; + ret = HEALTHBOX_GFX_STATUS_PRZ_BANK3; break; - case 27: + case HEALTHBOX_GFX_STATUS_SLP_BANK0: if (bank == 0) - ret = 27; + ret = HEALTHBOX_GFX_STATUS_SLP_BANK0; else if (bank == 1) - ret = 77; + ret = HEALTHBOX_GFX_STATUS_SLP_BANK1; else if (bank == 2) - ret = 92; + ret = HEALTHBOX_GFX_STATUS_SLP_BANK2; else - ret = 107; + ret = HEALTHBOX_GFX_STATUS_SLP_BANK3; break; - case 30: + case HEALTHBOX_GFX_STATUS_FRZ_BANK0: if (bank == 0) - ret = 30; + ret = HEALTHBOX_GFX_STATUS_FRZ_BANK0; else if (bank == 1) - ret = 80; + ret = HEALTHBOX_GFX_STATUS_FRZ_BANK1; else if (bank == 2) - ret = 95; + ret = HEALTHBOX_GFX_STATUS_FRZ_BANK2; else - ret = 110; + ret = HEALTHBOX_GFX_STATUS_FRZ_BANK3; break; - case 33: + case HEALTHBOX_GFX_STATUS_BRN_BANK0: if (bank == 0) - ret = 33; + ret = HEALTHBOX_GFX_STATUS_BRN_BANK0; else if (bank == 1) - ret = 83; + ret = HEALTHBOX_GFX_STATUS_BRN_BANK1; else if (bank == 2) - ret = 98; + ret = HEALTHBOX_GFX_STATUS_BRN_BANK2; else - ret = 113; + ret = HEALTHBOX_GFX_STATUS_BRN_BANK3; break; } return ret; @@ -2062,9 +2212,9 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem if (elementId == HEALTHBOX_LEVEL || elementId == HEALTHBOX_ALL) UpdateLvlInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_LEVEL)); if (elementId == HEALTHBOX_CURRENT_HP || elementId == HEALTHBOX_ALL) - UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_HP), 0); + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_HP), HP_CURRENT); if (elementId == HEALTHBOX_MAX_HP || elementId == HEALTHBOX_ALL) - UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_MAX_HP), 1); + UpdateHpTextInHealthbox(healthboxSpriteId, GetMonData(mon, MON_DATA_MAX_HP), HP_MAX); if (elementId == HEALTHBOX_HEALTH_BAR || elementId == HEALTHBOX_ALL) { LoadBattleBarGfx(0); @@ -2204,10 +2354,10 @@ static void sub_8074B9C(u8 bank, u8 whichBar) for (i = 0; i < 8; i++) { if (i < 4) - CpuCopy32(GetHealthboxElementGfxPtr(0xC) + array[i] * 32, + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32, (void*)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].oam.tileNum + 0x24 + i) * 32), 32); else - CpuCopy32(GetHealthboxElementGfxPtr(0xC) + array[i] * 32, + CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32, (void*)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[bank].healthboxSpriteId].oam.tileNum) * 32), 32); } break; diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index 25c2ca658..343ddb9c0 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -336,9 +336,9 @@ static void CreateHealthboxSprite(u8 bank) UpdateHealthboxAttribute(gHealthBoxesIds[bank], &gPlayerParty[gBattlePartyID[bank]], HEALTHBOX_ALL); if (GetBankIdentity(bank) == IDENTITY_OPPONENT_MON2 || GetBankIdentity(bank) == IDENTITY_PLAYER_MON2) - nullsub_30(gHealthBoxesIds[bank], TRUE); + DummyBattleInterfaceFunc(gHealthBoxesIds[bank], TRUE); else - nullsub_30(gHealthBoxesIds[bank], FALSE); + DummyBattleInterfaceFunc(gHealthBoxesIds[bank], FALSE); if (GetBankSide(bank) != SIDE_PLAYER) { -- cgit v1.2.3 From 36035518dcd36c915b8b8f3461881ea813933454 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 20 Oct 2017 00:01:17 +0200 Subject: review battle anim changes --- src/battle_anim.c | 56 +++++++++++++++++++++++++++---------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c index 13b74a84a..8b858f34a 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -831,26 +831,24 @@ void sub_80A477C(bool8 to_BG2) static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) { - u8 r4; - u8 r6; - s16 r3; - s16 r2; + u8 spriteId, palIndex; + s16 x, y; struct UnknownAnimStruct2 unknownStruct; - r4 = gTasks[taskId].data[0]; - r6 = gTasks[taskId].data[6]; + spriteId = gTasks[taskId].data[0]; + palIndex = gTasks[taskId].data[6]; sub_80A6B30(&unknownStruct); - r3 = gTasks[taskId].data[1] - (gSprites[r4].pos1.x + gSprites[r4].pos2.x); - r2 = gTasks[taskId].data[2] - (gSprites[r4].pos1.y + gSprites[r4].pos2.y); + x = gTasks[taskId].data[1] - (gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x); + y = gTasks[taskId].data[2] - (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y); if (gTasks[taskId].data[5] == 0) { u16 *src; u16 *dst; - gBattle_BG1_X = r3 + gTasks[taskId].data[3]; - gBattle_BG1_Y = r2 + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + r6 * 16; + gBattle_BG1_X = x + gTasks[taskId].data[3]; + gBattle_BG1_Y = y + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + palIndex * 16; dst = gPlttBufferFaded + 0x100 + unknownStruct.unk8 * 16 - 256; CpuCopy32(src, dst, 0x20); } @@ -859,9 +857,9 @@ static void task_pA_ma0A_obj_to_bg_pal(u8 taskId) u16 *src; u16 *dst; - gBattle_BG2_X = r3 + gTasks[taskId].data[3]; - gBattle_BG2_Y = r2 + gTasks[taskId].data[4]; - src = gPlttBufferFaded + 0x100 + r6 * 16; + gBattle_BG2_X = x + gTasks[taskId].data[3]; + gBattle_BG2_Y = y + gTasks[taskId].data[4]; + src = gPlttBufferFaded + 0x100 + palIndex * 16; dst = gPlttBufferFaded + 0x100 - 112; CpuCopy32(src, dst, 0x20); } @@ -1232,7 +1230,7 @@ static void LoadDefaultBg(void) if (IsContest()) LoadContestBgAfterMoveAnim(); else - LoadFittingBackgroundForBattle(); + DrawMainBattleBackground(); } static void ScriptCmd_restorebg(void) @@ -1286,39 +1284,39 @@ s8 BattleAnimAdjustPanning(s8 pan) if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) { if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) - pan = 63; + pan = PAN_ATTACKER_OPPONENT; else - pan = -64; + pan = PAN_ATTACKER_PLAYER; } else if (IsContest()) { - if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != 63) + if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != PAN_ATTACKER_OPPONENT) pan *= -1; } else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) { if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) { - if (pan == 63) - pan = -64; - else if (pan != -64) + if (pan == PAN_ATTACKER_OPPONENT) + pan = PAN_ATTACKER_PLAYER; + else if (pan != PAN_ATTACKER_PLAYER) pan *= -1; } } else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT) { - if (pan == -64) - pan = 63; + if (pan == PAN_ATTACKER_PLAYER) + pan = PAN_ATTACKER_OPPONENT; } else { pan *= -1; } - if (pan > 63) - pan = 63; - else if (pan < -64) - pan = -64; + if (pan > PAN_ATTACKER_OPPONENT) + pan = PAN_ATTACKER_OPPONENT; + else if (pan < PAN_ATTACKER_PLAYER) + pan = PAN_ATTACKER_PLAYER; return pan; } @@ -1328,9 +1326,9 @@ s8 BattleAnimAdjustPanning2(s8 pan) if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) { if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) - pan = 63; + pan = PAN_ATTACKER_OPPONENT; else - pan = -64; + pan = PAN_ATTACKER_PLAYER; } else { -- cgit v1.2.3 From cda5c5f925024acca194837007b9f88597ce4db8 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 20 Oct 2017 18:52:01 +0200 Subject: start working on walda phrase --- src/walda_phrase.c | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 src/walda_phrase.c (limited to 'src') diff --git a/src/walda_phrase.c b/src/walda_phrase.c new file mode 100644 index 000000000..1da2bddce --- /dev/null +++ b/src/walda_phrase.c @@ -0,0 +1,185 @@ +#include "global.h" +#include "string_util.h" +#include "event_data.h" +#include "naming_screen.h" +#include "main.h" +#include "text.h" +#include "new_game.h" + +extern void (*gFieldCallback)(void); + +extern const u8 gText_Peekaboo[]; + +extern u8 *GetWaldaPhrasePtr(void); +extern bool32 IsWaldaPhraseEmpty(void); +extern void sub_80AF168(void); +extern void c2_exit_to_overworld_2_switch(void); +extern void SetWaldaPhrase(const u8 *src); +extern void SetWaldaWallpaperPatternId(u8 patternId); +extern void SetWaldaWallpaperIconId(u8 iconId); +extern void SetWaldaWallpaperColors(u16 backgroundColor, u16 foregroundColor); +extern void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked); + +// this file's functions +void CB2_HandleGivenWaldaPhrase(void); +u32 GetWaldaPhraseInputCase(u8 *inputPtr); +bool32 TryCalculateWallpaper(u16* backgroundClr, u16 *foregroundClr, u8 *iconId, u8 *patternId, u16 trainerId, u8 *phrase); +void sub_81D9D5C(u8 *array, u8 *letterTableIds, s32 arg2, s32 arg3, s32 arg4); +s32 sub_81D9DAC(u8 *array, s32 arg1, s32 arg2); +void sub_81D9C90(u8 *array, s32 arg1, s32 arg2); +void sub_81D9CDC(u8 *array, s32 arg1, u8 arg2); + +// only consonants are allowed, no vowels, some lowercase letters are missing +static const u8 sWaldaLettersTable[] = +{ + CHAR_B, CHAR_C, CHAR_D, CHAR_F, CHAR_G, CHAR_H, CHAR_J, CHAR_K, CHAR_L, CHAR_M, CHAR_N, CHAR_P, CHAR_Q, CHAR_R, CHAR_S, CHAR_T, CHAR_V, CHAR_W, CHAR_Z, + CHAR_b, CHAR_c, CHAR_d, CHAR_f, CHAR_g, CHAR_h, CHAR_j, CHAR_k, CHAR_m, CHAR_n, CHAR_p, CHAR_q, CHAR_s +}; + +enum +{ + PHRASE_GIVEN_NEW, + PHRASE_NO_CHANGE, + PHRASE_FIRST_ATTEMPT +}; + +void DoWaldaNamingScreen(void) +{ + StringCopy(gStringVar2, GetWaldaPhrasePtr()); + DoNamingScreen(NAMING_SCREEN_WALDA, gStringVar2, 0, 0, 0, CB2_HandleGivenWaldaPhrase); +} + +void CB2_HandleGivenWaldaPhrase(void) +{ + gSpecialVar_0x8004 = GetWaldaPhraseInputCase(gStringVar2); + + switch (gSpecialVar_0x8004) + { + case PHRASE_FIRST_ATTEMPT: + if (IsWaldaPhraseEmpty()) + SetWaldaPhrase(gText_Peekaboo); + else + gSpecialVar_0x8004 = PHRASE_NO_CHANGE; + break; + case PHRASE_GIVEN_NEW: + SetWaldaPhrase(gStringVar2); + break; + case PHRASE_NO_CHANGE: + break; + } + + StringCopy(gStringVar1, GetWaldaPhrasePtr()); + gFieldCallback = sub_80AF168; + SetMainCallback2(c2_exit_to_overworld_2_switch); +} + +u32 GetWaldaPhraseInputCase(u8 *inputPtr) +{ + if (inputPtr[0] == EOS) + return PHRASE_FIRST_ATTEMPT; + if (StringCompare(inputPtr, GetWaldaPhrasePtr()) == 0) + return PHRASE_NO_CHANGE; + + return PHRASE_GIVEN_NEW; +} + +u16 TryGetWallpaperWithWaldaPhrase(void) +{ + u16 backgroundClr, foregroundClr; + u8 patternId, iconId; + u16 trainerId = ReadUnalignedWord(gSaveBlock2Ptr->playerTrainerId); + gScriptResult = TryCalculateWallpaper(&backgroundClr, &foregroundClr, &iconId, &patternId, trainerId, GetWaldaPhrasePtr()); + + if (gScriptResult) + { + SetWaldaWallpaperPatternId(patternId); + SetWaldaWallpaperIconId(iconId); + SetWaldaWallpaperColors(backgroundClr, foregroundClr); + } + + SetWaldaWallpaperLockedOrUnlocked(gScriptResult); + return (bool8)(gScriptResult); +} + +u8 GetLetterTableId(u8 letter) +{ + s32 i; + + for (i = 0; i < ARRAY_COUNT(sWaldaLettersTable); i++) + { + if (sWaldaLettersTable[i] == letter) + return i; + } + + return ARRAY_COUNT(sWaldaLettersTable); +} + +bool32 TryCalculateWallpaper(u16* backgroundClr, u16 *foregroundClr, u8 *iconId, u8 *patternId, u16 trainerId, u8 *phrase) +{ + s32 i; + ALIGNED(2) u8 array[12]; + u8 charsByTableId[16]; + u16 *ptr; + + if (StringLength(phrase) != 15) + return FALSE; + + for (i = 0; i < 15; i++) + { + charsByTableId[i] = GetLetterTableId(phrase[i]); + if (charsByTableId[i] == ARRAY_COUNT(sWaldaLettersTable)) + return FALSE; + } + + for (i = 0; i < 14; i++) + { + sub_81D9D5C(array, charsByTableId, (5 * i), 3 + (8 * i), 5); + } + + sub_81D9D5C(array, charsByTableId, 70, 115, 2); + + if (sub_81D9DAC(array, 0, 3) != sub_81D9DAC(charsByTableId, 117, 3)) + return FALSE; + + sub_81D9C90(array, 9, 21); + sub_81D9C90(array, 8, array[8] & 0xF); + sub_81D9CDC(array, 8, array[8] >> 4); + + if (array[6] != (array[0] ^ array[2] ^ array[4] ^ (trainerId >> 8))) + return FALSE; + + if (array[7] != (array[1] ^ array[3] ^ array[5] ^ (trainerId & 0xFF))) + return FALSE; + + ptr = (u16*)(&array[0]); + *backgroundClr = *ptr; + + ptr = (u16*)(&array[2]); + *foregroundClr = *ptr; + + *iconId = array[4]; + *patternId = array[5]; + + return TRUE; +} + +void sub_81D9C90(u8 *array, s32 arg1, s32 arg2) +{ + s32 i, j; + u8 var1, var2; + + for (i = arg2 - 1; i != -1; i--) + { + var1 = (array[0] & 0x80) >> 7; + + var1++;var1--; // needed to match + + for (j = arg1 - 1; j >= 0; j--) + { + var2 = array[j] & 0x80; + array[j] <<= 1; + array[j] |= var1; + var1 = var2 >> 7; + } + } +} -- cgit v1.2.3 From ccd7e8b3b1d942b2e1289611639f4e9a188cdc20 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 20 Oct 2017 19:24:46 +0200 Subject: battle interface review changes --- src/battle_anim.c | 28 +++++++++---------- src/battle_interface.c | 73 ++++++++++++++++++++++---------------------------- 2 files changed, 46 insertions(+), 55 deletions(-) (limited to 'src') diff --git a/src/battle_anim.c b/src/battle_anim.c index 765733d39..023272017 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -1284,39 +1284,39 @@ s8 BattleAnimAdjustPanning(s8 pan) if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) { if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) - pan = PAN_ATTACKER_OPPONENT; + pan = PAN_SIDE_OPPONENT; else - pan = PAN_ATTACKER_PLAYER; + pan = PAN_SIDE_PLAYER; } else if (IsContest()) { - if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != PAN_ATTACKER_OPPONENT) + if (gAnimBankAttacker != gAnimBankTarget || gAnimBankAttacker != 2 || pan != PAN_SIDE_OPPONENT) pan *= -1; } else if (GetBankSide(gAnimBankAttacker) == SIDE_PLAYER) { if (GetBankSide(gAnimBankTarget) == SIDE_PLAYER) { - if (pan == PAN_ATTACKER_OPPONENT) - pan = PAN_ATTACKER_PLAYER; - else if (pan != PAN_ATTACKER_PLAYER) + if (pan == PAN_SIDE_OPPONENT) + pan = PAN_SIDE_PLAYER; + else if (pan != PAN_SIDE_PLAYER) pan *= -1; } } else if (GetBankSide(gAnimBankTarget) == SIDE_OPPONENT) { - if (pan == PAN_ATTACKER_PLAYER) - pan = PAN_ATTACKER_OPPONENT; + if (pan == PAN_SIDE_PLAYER) + pan = PAN_SIDE_OPPONENT; } else { pan *= -1; } - if (pan > PAN_ATTACKER_OPPONENT) - pan = PAN_ATTACKER_OPPONENT; - else if (pan < PAN_ATTACKER_PLAYER) - pan = PAN_ATTACKER_PLAYER; + if (pan > PAN_SIDE_OPPONENT) + pan = PAN_SIDE_OPPONENT; + else if (pan < PAN_SIDE_PLAYER) + pan = PAN_SIDE_PLAYER; return pan; } @@ -1326,9 +1326,9 @@ s8 BattleAnimAdjustPanning2(s8 pan) if (!IsContest() && gBattleSpritesDataPtr->healthBoxesData[gAnimBankAttacker].flag_x10) { if (GetBankSide(gAnimBankAttacker) != SIDE_PLAYER) - pan = PAN_ATTACKER_OPPONENT; + pan = PAN_SIDE_OPPONENT; else - pan = PAN_ATTACKER_PLAYER; + pan = PAN_SIDE_PLAYER; } else { diff --git a/src/battle_interface.c b/src/battle_interface.c index a21e72bcf..9241db1d9 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -19,6 +19,7 @@ #include "palette.h" #include "international_string_util.h" #include "safari_zone.h" +#include "battle_anim.h" enum { @@ -226,7 +227,7 @@ static u8 sub_8074E8C(s32 maxValue, s32 currValue, s32 arg2, s32 *arg3, u8 *arg4 static void sub_8074F88(struct TestingBar *barInfo, s32 *arg1, u16 *arg2); // const rom data -static const struct OamData gUnknown_0832C138 = +static const struct OamData sUnknown_0832C138 = { .y = 0, .affineMode = 0, @@ -248,7 +249,7 @@ static const struct SpriteTemplate sHealthboxPlayerSpriteTemplates[2] = { .tileTag = TAG_HEALTHBOX_PLAYER1_TILE, .paletteTag = TAG_HEALTHBOX_PAL, - .oam = &gUnknown_0832C138, + .oam = &sUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -257,7 +258,7 @@ static const struct SpriteTemplate sHealthboxPlayerSpriteTemplates[2] = { .tileTag = TAG_HEALTHBOX_PLAYER2_TILE, .paletteTag = TAG_HEALTHBOX_PAL, - .oam = &gUnknown_0832C138, + .oam = &sUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -270,7 +271,7 @@ static const struct SpriteTemplate sHealthboxOpponentSpriteTemplates[2] = { .tileTag = TAG_HEALTHBOX_OPPONENT1_TILE, .paletteTag = TAG_HEALTHBOX_PAL, - .oam = &gUnknown_0832C138, + .oam = &sUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -279,7 +280,7 @@ static const struct SpriteTemplate sHealthboxOpponentSpriteTemplates[2] = { .tileTag = TAG_HEALTHBOX_OPPONENT2_TILE, .paletteTag = TAG_HEALTHBOX_PAL, - .oam = &gUnknown_0832C138, + .oam = &sUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -291,14 +292,14 @@ static const struct SpriteTemplate sHealthboxSafariSpriteTemplate = { .tileTag = TAG_HEALTHBOX_SAFARI_TILE, .paletteTag = TAG_HEALTHBOX_PAL, - .oam = &gUnknown_0832C138, + .oam = &sUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct OamData gUnknown_0832C1B8 = +static const struct OamData sUnknown_0832C1B8 = { .y = 0, .affineMode = 0, @@ -315,12 +316,12 @@ static const struct OamData gUnknown_0832C1B8 = .affineParam = 0, }; -static const struct SpriteTemplate gUnknown_0832C1C0[4] = +static const struct SpriteTemplate sUnknown_0832C1C0[4] = { { .tileTag = 0xd704, .paletteTag = 0xd704, - .oam = &gUnknown_0832C1B8, + .oam = &sUnknown_0832C1B8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -329,7 +330,7 @@ static const struct SpriteTemplate gUnknown_0832C1C0[4] = { .tileTag = 0xd705, .paletteTag = 0xd704, - .oam = &gUnknown_0832C1B8, + .oam = &sUnknown_0832C1B8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -338,7 +339,7 @@ static const struct SpriteTemplate gUnknown_0832C1C0[4] = { .tileTag = 0xd706, .paletteTag = 0xd704, - .oam = &gUnknown_0832C1B8, + .oam = &sUnknown_0832C1B8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -347,7 +348,7 @@ static const struct SpriteTemplate gUnknown_0832C1C0[4] = { .tileTag = 0xd707, .paletteTag = 0xd704, - .oam = &gUnknown_0832C1B8, + .oam = &sUnknown_0832C1B8, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -421,7 +422,7 @@ static const struct Subsprite sStatusSummaryBar_Subsprites_0[] = {0, 0, 1, 1, 12, 1} }; -static const struct Subsprite gUnknown_0832C2AC[] = +static const struct Subsprite sUnknown_0832C2AC[] = { {160, 0, 1, 1, 0, 1}, {192, 0, 1, 1, 4, 1}, @@ -436,23 +437,13 @@ static const struct SubspriteTable sStatusSummaryBar_SubspriteTable[] = {ARRAY_COUNT(sStatusSummaryBar_Subsprites_0), sStatusSummaryBar_Subsprites_0} }; -static const struct SubspriteTable gUnknown_0832C2CC[] = +static const struct SubspriteTable sUnknown_0832C2CC[] = { - {ARRAY_COUNT(gUnknown_0832C2AC), gUnknown_0832C2AC} + {ARRAY_COUNT(sUnknown_0832C2AC), sUnknown_0832C2AC} }; -// unused unknown data -static const u16 gUnknown_0832C2D4[] = -{ - 0x0000, 0x0000, 0x3333, 0x3333, 0x4444, 0x4444, 0x2222, 0x2222, - 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, 0x7777, - - 0x0000, 0x0000, 0x3333, 0x3333, 0x4444, 0x4444, 0x2222, 0x2222, - 0x7777, 0x7777, 0x7777, 0x7717, 0x1777, 0x7177, 0x7777, 0x7771, - - 0x0000, 0x0000, 0x3333, 0x3333, 0x4444, 0x4444, 0x2222, 0x2222, - 0x7777, 0x7777, 0x7777, 0x7111, 0x7777, 0x7171, 0x7777, 0x7111, -}; +// unused unknown image +static const u8 sUnknown_0832C2D4[] = INCBIN_U8("graphics/battle_interface/unknown_32C2D4.4bpp"); static const struct CompressedSpriteSheet sStatusSummaryBarSpriteSheet = { @@ -492,7 +483,7 @@ static const struct OamData sUnknown_0832C354 = .affineParam = 0, }; -static const struct OamData sOamData_StatusSummayBalls = +static const struct OamData sOamData_StatusSummaryBalls = { .y = 0, .affineMode = 0, @@ -514,7 +505,7 @@ static const struct SpriteTemplate sStatusSummaryBarSpriteTemplates[2] = { .tileTag = TAG_STATUS_SUMMARY_BAR_TILE, .paletteTag = TAG_STATUS_SUMMARY_BAR_PAL, - .oam = &gUnknown_0832C138, + .oam = &sUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -523,7 +514,7 @@ static const struct SpriteTemplate sStatusSummaryBarSpriteTemplates[2] = { .tileTag = TAG_STATUS_SUMMARY_BAR_TILE, .paletteTag = TAG_STATUS_SUMMARY_BAR_PAL, - .oam = &gUnknown_0832C138, + .oam = &sUnknown_0832C138, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -536,7 +527,7 @@ static const struct SpriteTemplate sStatusSummaryBallsSpriteTemplates[2] = { .tileTag = TAG_STATUS_SUMMARY_BALLS_TILE, .paletteTag = TAG_STATUS_SUMMARY_BALLS_PAL, - .oam = &sOamData_StatusSummayBalls, + .oam = &sOamData_StatusSummaryBalls, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -545,7 +536,7 @@ static const struct SpriteTemplate sStatusSummaryBallsSpriteTemplates[2] = { .tileTag = TAG_STATUS_SUMMARY_BALLS_TILE, .paletteTag = TAG_STATUS_SUMMARY_BALLS_PAL, - .oam = &sOamData_StatusSummayBalls, + .oam = &sOamData_StatusSummaryBalls, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -554,7 +545,7 @@ static const struct SpriteTemplate sStatusSummaryBallsSpriteTemplates[2] = }; // possibly text -static const u8 gUnknown_0832C3C4[] = +static const u8 sUnknown_0832C3C4[] = { 0xfc, 0x01, 0x01, 0xfc, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -562,7 +553,7 @@ static const u8 gUnknown_0832C3C4[] = }; // possibly text -static const u8 gUnknown_0832C3D8[] = +static const u8 sUnknown_0832C3D8[] = { 0xfc, 0x01, 0x01, 0xfc, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -982,7 +973,7 @@ u8 CreateBankHealthboxSprites(u8 bank) } } - unkSpriteId = CreateSpriteAtEnd(&gUnknown_0832C1C0[gBanksByIdentity[bank]], 140, 60, 0); + unkSpriteId = CreateSpriteAtEnd(&sUnknown_0832C1C0[gBanksByIdentity[bank]], 140, 60, 0); unkSpritePtr = &gSprites[unkSpriteId]; SetSubspriteTables(unkSpritePtr, &sUnknown_0832C28C[GetBankSide(bank)]); unkSpritePtr->subspriteMode = 2; @@ -1234,7 +1225,7 @@ void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent) { u8 bank; - memcpy(text, gUnknown_0832C3C4, sizeof(gUnknown_0832C3C4)); + memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4)); bank = gSprites[healthboxSpriteId].data6; if (IsDoubleBattle() == TRUE || GetBankSide(bank) == SIDE_OPPONENT) { @@ -1313,7 +1304,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 { u8 bank; - memcpy(text, gUnknown_0832C3D8, sizeof(gUnknown_0832C3D8)); + memcpy(text, sUnknown_0832C3D8, sizeof(sUnknown_0832C3D8)); bank = gSprites[healthboxSpriteId].data6; if (gBattleSpritesDataPtr->bankData[bank].hpNumbersNoBars) // don't print text if only bars are visible @@ -1375,7 +1366,7 @@ static void sub_80730D4(u8 healthboxSpriteId, struct Pokemon *mon) u8 *fontPixels; u8 i, var, nature, healthboxSpriteId_2; - memcpy(text, gUnknown_0832C3C4, sizeof(gUnknown_0832C3C4)); + memcpy(text, sUnknown_0832C3C4, sizeof(sUnknown_0832C3C4)); fontPixels = &gMonSpritesGfxPtr->fontPixels[0x520 + (GetBankIdentity(gSprites[healthboxSpriteId].data6) * 384)]; var = 5; nature = GetNature(mon); @@ -1752,7 +1743,7 @@ void sub_8073C30(u8 taskId) gSprites[r10].data0 /= 2; gSprites[r10].data1 = 0; gSprites[r10].callback = sub_8074090; - SetSubspriteTables(&gSprites[r10], gUnknown_0832C2CC); + SetSubspriteTables(&gSprites[r10], sUnknown_0832C2CC); gTasks[taskId].func = sub_8073E08; } else @@ -1898,9 +1889,9 @@ static void SpriteCB_StatusSummaryBallsOnBattleStart(struct Sprite *sprite) if (sprite->pos2.x == 0) { - pan = 63; + pan = PAN_SIDE_OPPONENT; if (var1 != 0) - pan = -64; + pan = PAN_SIDE_PLAYER; if (sprite->data7 != 0) PlaySE2WithPanning(SE_TB_KARA, pan); -- cgit v1.2.3 From 8c85a273461557bde4b42630ba3a56701c8f4d81 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 20 Oct 2017 20:39:00 +0200 Subject: walda phrase is done --- src/walda_phrase.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/walda_phrase.c b/src/walda_phrase.c index 1da2bddce..21f39f784 100644 --- a/src/walda_phrase.c +++ b/src/walda_phrase.c @@ -1,4 +1,5 @@ #include "global.h" +#include "walda_phrase.h" #include "string_util.h" #include "event_data.h" #include "naming_screen.h" @@ -21,13 +22,13 @@ extern void SetWaldaWallpaperColors(u16 backgroundColor, u16 foregroundColor); extern void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked); // this file's functions -void CB2_HandleGivenWaldaPhrase(void); -u32 GetWaldaPhraseInputCase(u8 *inputPtr); -bool32 TryCalculateWallpaper(u16* backgroundClr, u16 *foregroundClr, u8 *iconId, u8 *patternId, u16 trainerId, u8 *phrase); -void sub_81D9D5C(u8 *array, u8 *letterTableIds, s32 arg2, s32 arg3, s32 arg4); -s32 sub_81D9DAC(u8 *array, s32 arg1, s32 arg2); -void sub_81D9C90(u8 *array, s32 arg1, s32 arg2); -void sub_81D9CDC(u8 *array, s32 arg1, u8 arg2); +static void CB2_HandleGivenWaldaPhrase(void); +static u32 GetWaldaPhraseInputCase(u8 *inputPtr); +static bool32 TryCalculateWallpaper(u16* backgroundClr, u16 *foregroundClr, u8 *iconId, u8 *patternId, u16 trainerId, u8 *phrase); +static void sub_81D9D5C(u8 *array, u8 *letterTableIds, u32 arg2, u32 arg3, u32 loopCount); +static u32 sub_81D9DAC(u8 *array, u32 arg1, u32 loopCount); +static void sub_81D9C90(u8 *array, s32 arg1, s32 arg2); +static void sub_81D9CDC(u8 *array, u32 loopCount, u8 arg2); // only consonants are allowed, no vowels, some lowercase letters are missing static const u8 sWaldaLettersTable[] = @@ -49,7 +50,7 @@ void DoWaldaNamingScreen(void) DoNamingScreen(NAMING_SCREEN_WALDA, gStringVar2, 0, 0, 0, CB2_HandleGivenWaldaPhrase); } -void CB2_HandleGivenWaldaPhrase(void) +static void CB2_HandleGivenWaldaPhrase(void) { gSpecialVar_0x8004 = GetWaldaPhraseInputCase(gStringVar2); @@ -73,7 +74,7 @@ void CB2_HandleGivenWaldaPhrase(void) SetMainCallback2(c2_exit_to_overworld_2_switch); } -u32 GetWaldaPhraseInputCase(u8 *inputPtr) +static u32 GetWaldaPhraseInputCase(u8 *inputPtr) { if (inputPtr[0] == EOS) return PHRASE_FIRST_ATTEMPT; @@ -101,7 +102,7 @@ u16 TryGetWallpaperWithWaldaPhrase(void) return (bool8)(gScriptResult); } -u8 GetLetterTableId(u8 letter) +static u8 GetLetterTableId(u8 letter) { s32 i; @@ -114,7 +115,7 @@ u8 GetLetterTableId(u8 letter) return ARRAY_COUNT(sWaldaLettersTable); } -bool32 TryCalculateWallpaper(u16* backgroundClr, u16 *foregroundClr, u8 *iconId, u8 *patternId, u16 trainerId, u8 *phrase) +static bool32 TryCalculateWallpaper(u16* backgroundClr, u16 *foregroundClr, u8 *iconId, u8 *patternId, u16 trainerId, u8 *phrase) { s32 i; ALIGNED(2) u8 array[12]; @@ -163,7 +164,7 @@ bool32 TryCalculateWallpaper(u16* backgroundClr, u16 *foregroundClr, u8 *iconId, return TRUE; } -void sub_81D9C90(u8 *array, s32 arg1, s32 arg2) +static void sub_81D9C90(u8 *array, s32 arg1, s32 arg2) { s32 i, j; u8 var1, var2; @@ -172,7 +173,7 @@ void sub_81D9C90(u8 *array, s32 arg1, s32 arg2) { var1 = (array[0] & 0x80) >> 7; - var1++;var1--; // needed to match + var1++; var1--; // needed to match for (j = arg1 - 1; j >= 0; j--) { @@ -183,3 +184,65 @@ void sub_81D9C90(u8 *array, s32 arg1, s32 arg2) } } } + +static void sub_81D9CDC(u8 *array, u32 loopCount, u8 arg2) +{ + u32 i; + + arg2 |= (arg2 << 4); + + for (i = 0; i < loopCount; i++) + { + array[i] ^= arg2; + } +} + +static bool8 sub_81D9D0C(u8 *array, u32 arg1) +{ + u32 arrayId = arg1 >> 3; + u32 bits = 0x80 >> (7 & arg1); + + return ((array[arrayId] & bits) != 0); +} + +static void sub_81D9D28(u8 *array, u32 arg1) +{ + u32 arrayId = arg1 >> 3; + u8 bits = 0x80 >> (7 & arg1); + + array[arrayId] |= bits; +} + +static void sub_81D9D40(u8 *array, u32 arg1) +{ + u32 arrayId = arg1 >> 3; + u8 bits = ~(0x80 >> (7 & arg1)); + + array[arrayId] &= bits; +} + +static void sub_81D9D5C(u8 *array, u8 *letterTableIds, u32 arg2, u32 arg3, u32 loopCount) +{ + u32 i; + + for (i = 0; i < loopCount; i++) + { + if (sub_81D9D0C(letterTableIds, arg3 + i)) + sub_81D9D28(array, arg2 + i); + else + sub_81D9D40(array, arg2 + i); + } +} + +static u32 sub_81D9DAC(u8 *array, u32 arg1, u32 loopCount) +{ + u32 ret, i; + + for (ret = 0, i = 0; i < loopCount; i++) + { + ret <<= 1; + ret |= sub_81D9D0C(array, arg1 + i); + } + + return ret; +} -- cgit v1.2.3 From 31e0b468c7f859e72e758f3f0fc1051ab887d9a5 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 20 Oct 2017 20:46:26 +0200 Subject: move from raq scene to walda phrase --- src/walda_phrase.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src') diff --git a/src/walda_phrase.c b/src/walda_phrase.c index 21f39f784..7e06d1319 100644 --- a/src/walda_phrase.c +++ b/src/walda_phrase.c @@ -44,6 +44,15 @@ enum PHRASE_FIRST_ATTEMPT }; +u16 TryBufferWaldaPhrase(void) +{ + if (IsWaldaPhraseEmpty()) + return FALSE; + + StringCopy(gStringVar1, GetWaldaPhrasePtr()); + return TRUE; +} + void DoWaldaNamingScreen(void) { StringCopy(gStringVar2, GetWaldaPhrasePtr()); -- cgit v1.2.3 From c63acde25054bf61a9fb955bbabd704b7521faec Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Fri, 20 Oct 2017 16:18:29 -0400 Subject: updating --- src/pokemon_summary_screen.c | 78 ++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 39 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 3e6342f36..4ab36392d 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -20,7 +20,7 @@ #include "text.h" #include "window.h" -struct contestMove +struct ContestMove { u8 effect; u8 type; @@ -28,7 +28,7 @@ struct contestMove u8 combo[4]; }; -struct contestEffect +struct ContestEffect { u8 type; u8 appeal; @@ -37,7 +37,7 @@ struct contestEffect -extern struct unkSummaryStruct* gUnknown_0203CF1C; +extern struct UnkSummaryStruct* gUnknown_0203CF1C; extern struct BgTemplate gUnknown_0861CBB4; extern u8 gUnknown_0203CF20; extern struct MusicPlayerInfo gMPlay_BGM; @@ -50,8 +50,8 @@ extern struct unkStruct_61CC04 gUnknown_0861CC10; extern struct unkStruct_61CC04 gUnknown_0861CBEC; extern struct unkStruct_61CC04 gUnknown_0861CBF8; extern u16 gUnknown_08DC3CD4[]; -extern struct contestMove gContestMoves[]; -extern struct contestEffect gContestEffects[]; +extern struct ContestMove gContestMoves[]; +extern struct ContestEffect gContestEffects[]; extern struct WindowTemplate gUnknown_0861CC24; extern struct TextColor gUnknown_0861CD2C[]; extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; @@ -289,14 +289,14 @@ u8 sub_81B1250(); union unkUnion { - struct Pokemon mons[6]; - struct BoxPokemon boxMons[6]; + struct Pokemon mon[6]; + struct BoxPokemon boxMon[6]; }; u8 sub_80D214C(union unkUnion* a, u8 b, u8 c, u8 d); -struct pokeSummary +struct PokeSummary { u16 species; // 0x0 u16 species2; // 0x2 @@ -304,7 +304,7 @@ struct pokeSummary u8 level; // 0x5 u8 ribbons; // 0x6 u8 unk7; // 0x7 - u8 altability; // 0x8 + u8 altAbility; // 0x8 u8 metLocation; // 0x9 u8 metLevel; // 0xA u8 metGame; // 0xB @@ -330,13 +330,13 @@ struct pokeSummary u32 OTID; // 0x48 }; -struct unkSummaryStruct +struct UnkSummaryStruct { /*0x00*/ union unkUnion *unk0; /*0x04*/ void *unk4; /*0x08*/ void *unk8; /*0x0C*/ struct Pokemon currentPoke; - /*0x70*/ struct pokeSummary summary; + /*0x70*/ struct PokeSummary summary; u16 unkTilemap0[0x400]; u16 unkTilemap0_1[0x400]; u16 unkTilemap1[0x400]; @@ -583,8 +583,8 @@ void sub_81BFE24() schedule_bg_copy_tilemap_to_vram(1); schedule_bg_copy_tilemap_to_vram(2); schedule_bg_copy_tilemap_to_vram(3); - SetGpuReg(0, 0x1040); - SetGpuReg(0x50, 0); + SetGpuReg(REG_OFFSET_DISPCNT, 0x1040); + SetGpuReg(REG_OFFSET_BLDCNT, 0); ShowBg(0); ShowBg(1); ShowBg(2); @@ -660,20 +660,20 @@ void sub_81C0098(struct Pokemon *poke) { if (gUnknown_0203CF1C->unk40BD == 0) { - struct Pokemon *pokeMons = gUnknown_0203CF1C->unk0->mons; - *poke = pokeMons[gUnknown_0203CF1C->unk40BE]; + struct Pokemon *partyMon = gUnknown_0203CF1C->unk0->mon; + *poke = partyMon[gUnknown_0203CF1C->unk40BE]; } else { - struct BoxPokemon *boxMons = gUnknown_0203CF1C->unk0->boxMons; - sub_8069004(&boxMons[gUnknown_0203CF1C->unk40BE], poke); + struct BoxPokemon *boxMon = gUnknown_0203CF1C->unk0->boxMon; + sub_8069004(&boxMon[gUnknown_0203CF1C->unk40BE], poke); } } bool8 sub_81C00F0(struct Pokemon *a) { u32 i; - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; switch (gUnknown_0203CF1C->unk40F0) { case 0: @@ -681,7 +681,7 @@ bool8 sub_81C00F0(struct Pokemon *a) sum->species2 = GetMonData(a, MON_DATA_SPECIES2); sum->exp = GetMonData(a, MON_DATA_EXP); sum->level = GetMonData(a, MON_DATA_LEVEL); - sum->altability = GetMonData(a, MON_DATA_ALT_ABILITY); + sum->altAbility = GetMonData(a, MON_DATA_ALT_ABILITY); sum->item = GetMonData(a, MON_DATA_HELD_ITEM); sum->pid = GetMonData(a, MON_DATA_PERSONALITY); sum->sanity = GetMonData(a, MON_DATA_SANITY_BIT1); @@ -968,7 +968,7 @@ void sub_81C0704(u8 taskId) s8 sub_81C08F8(s8 a) { - struct Pokemon *mons = gUnknown_0203CF1C->unk0->mons; + struct Pokemon *mon = gUnknown_0203CF1C->unk0->mon; if (gUnknown_0203CF1C->unk40C0 == 0) { @@ -987,14 +987,14 @@ s8 sub_81C08F8(s8 a) index += a; if (index < 0 || index > gUnknown_0203CF1C->unk40BF) return -1; - } while (GetMonData(&mons[index], MON_DATA_IS_EGG) != 0); + } while (GetMonData(&mon[index], MON_DATA_IS_EGG) != 0); return index; } } s8 sub_81C09B4(s8 a) { - struct Pokemon *mons = gUnknown_0203CF1C->unk0->mons; + struct Pokemon *mon = gUnknown_0203CF1C->unk0->mon; s8 r5 = 0; u8 i; @@ -1016,7 +1016,7 @@ s8 sub_81C09B4(s8 a) if (r5 < 0 || r5 >= 6) return -1; b = c[r5]; - if (sub_81C0A50(&mons[b]) == TRUE) + if (sub_81C0A50(&mon[b]) == TRUE) return b; } } @@ -1033,7 +1033,7 @@ bool8 sub_81C0A50(struct Pokemon* mon) void sub_81C0A8C(u8 taskId, s8 b) { - struct pokeSummary *summary = &gUnknown_0203CF1C->summary; + struct PokeSummary *summary = &gUnknown_0203CF1C->summary; s16 *data = gTasks[taskId].data; if (summary->isEgg) @@ -1357,12 +1357,12 @@ void sub_81C13B0(u8 taskId, u8 b) { if (gUnknown_0203CF1C->unk40BD == 0) { - struct Pokemon *why = gUnknown_0203CF1C->unk0->mons; + struct Pokemon *why = gUnknown_0203CF1C->unk0->mon; sub_81C14BC(&why[gUnknown_0203CF1C->unk40BE], gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); } else { - struct BoxPokemon *why = gUnknown_0203CF1C->unk0->boxMons; + struct BoxPokemon *why = gUnknown_0203CF1C->unk0->boxMon; sub_81C15EC(&why[gUnknown_0203CF1C->unk40BE], gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); } sub_81C0098(&gUnknown_0203CF1C->currentPoke); @@ -2469,7 +2469,7 @@ void sub_81C228C(u8 a) void sub_81C22CC(struct Pokemon *unused) { s64 r6r7; - struct pokeSummary *summary = &gUnknown_0203CF1C->summary; + struct PokeSummary *summary = &gUnknown_0203CF1C->summary; u16 *r9; u8 i; @@ -2579,7 +2579,7 @@ void sub_81C2628() { u8 strArray[16]; struct Pokemon *mon = &gUnknown_0203CF1C->currentPoke; - struct pokeSummary *summary = &gUnknown_0203CF1C->summary; + struct PokeSummary *summary = &gUnknown_0203CF1C->summary; u16 r5 = SpeciesToPokedexNum(summary->species); if (r5 != 0xFFFF) { @@ -2981,19 +2981,19 @@ void sub_81C2F5C() void sub_81C2FD8() { - u8 ability = GetAbilityBySpecies(gUnknown_0203CF1C->summary.species, gUnknown_0203CF1C->summary.altability); + u8 ability = GetAbilityBySpecies(gUnknown_0203CF1C->summary.species, gUnknown_0203CF1C->summary.altAbility); sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 2), gAbilityNames[ability], 0, 1, 0, 1); } void sub_81C302C() { - u8 ability = GetAbilityBySpecies(gUnknown_0203CF1C->summary.species, gUnknown_0203CF1C->summary.altability); + u8 ability = GetAbilityBySpecies(gUnknown_0203CF1C->summary.species, gUnknown_0203CF1C->summary.altAbility); sub_81C25A4(sub_81C2D2C(&gUnknown_0861CCCC, 2), gAbilityDescriptionPointers[ability], 0, 17, 0, 0); } void sub_81C307C() { - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 *text; sub_81AFBF0(); sub_81AFC0C(0, gUnknown_0861CE74); @@ -3037,7 +3037,7 @@ void sub_81C3194() void sub_81C31C0() { - struct unkSummaryStruct *sumStruct = gUnknown_0203CF1C; + struct UnkSummaryStruct *sumStruct = gUnknown_0203CF1C; sub_81AFC0C(2, gNatureNamePointers[sumStruct->summary.nature]); sub_81AFC0C(5, gText_EmptyString5); } @@ -3053,7 +3053,7 @@ void sub_81C31F0(u8 *a) u8 sub_81C3220() { - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u32 r4; u8 r5; if (gUnknown_0203CF1C->unk0 == (union unkUnion *)&gEnemyParty) @@ -3078,7 +3078,7 @@ u8 sub_81C3220() u8 sub_81C32BC() { - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 r0 = sum->metGame - 1; if (r0 <= 4) return 1; @@ -3087,7 +3087,7 @@ u8 sub_81C32BC() u8 sub_81C32E0() { - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 r0 = sum->metGame - 1; if (r0 <= 2) return 1; @@ -3179,7 +3179,7 @@ void sub_81C33CC() void sub_81C3428() { u8 *text; - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; if (gUnknown_0203CF1C->summary.sanity == 1) text = gText_EggWillTakeALongTime; else if (sum->friendship <= 5) @@ -3196,7 +3196,7 @@ void sub_81C3428() void sub_81C349C() { u8 *text; - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; if (gUnknown_0203CF1C->summary.sanity != 1) { if (sum->metLocation == 0xFF) @@ -3339,7 +3339,7 @@ void sub_81C3890() void sub_81C38C0() { - struct pokeSummary *sum = &gUnknown_0203CF1C->summary; + struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 r6 = sub_81C2D2C(&gUnknown_0861CCEC, 4); int offset; u32 expToNextLevel; @@ -3423,7 +3423,7 @@ void sub_81C39F0(u8 taskId) #ifdef NONMATCHING void sub_81C3B08(u8 a) { - struct unkSummaryStruct *r10 = gUnknown_0203CF1C; + struct UnkSummaryStruct *r10 = gUnknown_0203CF1C; u8 r8 = sub_81C2D2C(&gUnknown_0861CD14, 0); u8 sp = sub_81C2D2C(&gUnknown_0861CD14, 1); u8 r6; -- cgit v1.2.3 From 2a60aefed6d00d94adc7d1aa67871dc66f71f18a Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Fri, 20 Oct 2017 16:28:38 -0400 Subject: updating --- src/pokemon_summary_screen.c | 50 ++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 4ab36392d..57f4340b8 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -203,7 +203,7 @@ void sub_81C240C(u16 a); void sub_81C2194(u16 *a, u16 b, u8 c); void sub_81C2074(u16 a, s16 b); void sub_81C2524(); -void sub_81C2228(struct Pokemon* poke); +void sub_81C2228(struct Pokemon* mon); void sub_81C0484(u8 taskId); void sub_81C4898(); void sub_806F47C(u8 a); @@ -287,14 +287,14 @@ void SetBgAttribute(u8 bg, u8 attributeId, u8 value); bool8 sub_81BFB10(); u8 sub_81B1250(); -union unkUnion +union UnkUnion { struct Pokemon mon[6]; struct BoxPokemon boxMon[6]; }; -u8 sub_80D214C(union unkUnion* a, u8 b, u8 c, u8 d); +u8 sub_80D214C(union UnkUnion* a, u8 b, u8 c, u8 d); struct PokeSummary { @@ -332,10 +332,10 @@ struct PokeSummary struct UnkSummaryStruct { - /*0x00*/ union unkUnion *unk0; + /*0x00*/ union UnkUnion *unk0; /*0x04*/ void *unk4; /*0x08*/ void *unk8; - /*0x0C*/ struct Pokemon currentPoke; + /*0x0C*/ struct Pokemon currentMon; /*0x70*/ struct PokeSummary summary; u16 unkTilemap0[0x400]; u16 unkTilemap0_1[0x400]; @@ -490,12 +490,12 @@ bool8 sub_81BFB10(void) gMain.state++; break; case 9: - sub_81C0098(&gUnknown_0203CF1C->currentPoke); + sub_81C0098(&gUnknown_0203CF1C->currentMon); gUnknown_0203CF1C->unk40F0 = 0; gMain.state++; break; case 10: - if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke) != 0) + if (sub_81C00F0(&gUnknown_0203CF1C->currentMon) != 0) gMain.state++; break; case 11: @@ -525,7 +525,7 @@ bool8 sub_81BFB10(void) gMain.state++; break; case 17: - gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &gUnknown_0203CF1C->unk40F0); + gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &gUnknown_0203CF1C->unk40F0); if (gUnknown_0203CF1C->unk40D3 != 0xFF) { gUnknown_0203CF1C->unk40F0 = 0; @@ -533,11 +533,11 @@ bool8 sub_81BFB10(void) } break; case 18: - sub_81C4984(&gUnknown_0203CF1C->currentPoke); + sub_81C4984(&gUnknown_0203CF1C->currentMon); gMain.state++; break; case 19: - sub_81C4A08(&gUnknown_0203CF1C->currentPoke); + sub_81C4A08(&gUnknown_0203CF1C->currentMon); gMain.state++; break; case 20: @@ -656,17 +656,17 @@ u8 sub_81BFEB0() return 0; } -void sub_81C0098(struct Pokemon *poke) +void sub_81C0098(struct Pokemon *mon) { if (gUnknown_0203CF1C->unk40BD == 0) { struct Pokemon *partyMon = gUnknown_0203CF1C->unk0->mon; - *poke = partyMon[gUnknown_0203CF1C->unk40BE]; + *mon = partyMon[gUnknown_0203CF1C->unk40BE]; } else { struct BoxPokemon *boxMon = gUnknown_0203CF1C->unk0->boxMon; - sub_8069004(&boxMon[gUnknown_0203CF1C->unk40BE], poke); + sub_8069004(&boxMon[gUnknown_0203CF1C->unk40BE], mon); } } @@ -769,7 +769,7 @@ void sub_81C0348(void) PutWindowTilemap(0xD); } sub_81C2524(); - sub_81C2228(&gUnknown_0203CF1C->currentPoke); + sub_81C2228(&gUnknown_0203CF1C->currentMon); } void sub_81C0434() @@ -915,27 +915,27 @@ void sub_81C0704(u8 taskId) DestroySpriteAndFreeResources(&gSprites[gUnknown_0203CF1C->unk40D4]); break; case 3: - sub_81C0098(&gUnknown_0203CF1C->currentPoke); + sub_81C0098(&gUnknown_0203CF1C->currentMon); gUnknown_0203CF1C->unk40F0 = 0; break; case 4: - if (sub_81C00F0(&gUnknown_0203CF1C->currentPoke) == FALSE) + if (sub_81C00F0(&gUnknown_0203CF1C->currentMon) == FALSE) return; break; case 5: - sub_81C49E0(&gUnknown_0203CF1C->currentPoke); + sub_81C49E0(&gUnknown_0203CF1C->currentMon); break; case 6: - sub_81C4A08(&gUnknown_0203CF1C->currentPoke); + sub_81C4A08(&gUnknown_0203CF1C->currentMon); break; case 7: if (gUnknown_0203CF1C->summary.unk7) sub_81C2074(10, -2); - sub_81C2228(&gUnknown_0203CF1C->currentPoke); + sub_81C2228(&gUnknown_0203CF1C->currentMon); data[1] = 0; break; case 8: - gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentPoke, &data[1]); + gUnknown_0203CF1C->unk40D3 = sub_81C45F4(&gUnknown_0203CF1C->currentMon, &data[1]); if (gUnknown_0203CF1C->unk40D3 == 0xFF) return; gSprites[gUnknown_0203CF1C->unk40D3].data2 = 1; @@ -1149,7 +1149,7 @@ void sub_81C0D44(u8 taskId) void sub_81C0E24() { if (gUnknown_0203CF1C->unk40C0 == 1) - sub_81C22CC(&gUnknown_0203CF1C->currentPoke); + sub_81C22CC(&gUnknown_0203CF1C->currentMon); } void sub_81C0E48(u8 taskId) @@ -1365,7 +1365,7 @@ void sub_81C13B0(u8 taskId, u8 b) struct BoxPokemon *why = gUnknown_0203CF1C->unk0->boxMon; sub_81C15EC(&why[gUnknown_0203CF1C->unk40BE], gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); } - sub_81C0098(&gUnknown_0203CF1C->currentPoke); + sub_81C0098(&gUnknown_0203CF1C->currentMon); sub_81C40A0(gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); sub_81C4568(gUnknown_0203CF1C->unk40C6, gUnknown_0203CF1C->unk40C7); gUnknown_0203CF1C->unk40C6 = gUnknown_0203CF1C->unk40C7; @@ -2578,7 +2578,7 @@ void sub_81C25E8() void sub_81C2628() { u8 strArray[16]; - struct Pokemon *mon = &gUnknown_0203CF1C->currentPoke; + struct Pokemon *mon = &gUnknown_0203CF1C->currentMon; struct PokeSummary *summary = &gUnknown_0203CF1C->summary; u16 r5 = SpeciesToPokedexNum(summary->species); if (r5 != 0xFFFF) @@ -2622,7 +2622,7 @@ void sub_81C2628() void sub_81C2794() { - GetMonNickname(&gUnknown_0203CF1C->currentPoke, gStringVar1); + GetMonNickname(&gUnknown_0203CF1C->currentMon, gStringVar1); sub_81C25A4(18, gStringVar1, 0, 1, 0, 1); PutWindowTilemap(18); ClearWindowTilemap(17); @@ -3056,7 +3056,7 @@ u8 sub_81C3220() struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u32 r4; u8 r5; - if (gUnknown_0203CF1C->unk0 == (union unkUnion *)&gEnemyParty) + if (gUnknown_0203CF1C->unk0 == (union UnkUnion *)&gEnemyParty) { u8 multiID = GetMultiplayerId()^1; r4 = (u16)gLinkPlayers[multiID].trainerId; -- cgit v1.2.3 From 77ef72f782e9d86d4b9e7eebaa9ca186570b5e61 Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Fri, 20 Oct 2017 16:31:12 -0400 Subject: updating --- src/pokemon_summary_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 57f4340b8..05cd0b2d1 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -372,7 +372,7 @@ struct UnkSummaryStruct void sub_81BF8EC(u8 a, void *b, u8 c, u8 d, void *e) { u8 byte; - gUnknown_0203CF1C = AllocZeroed(0x40F8); + gUnknown_0203CF1C = AllocZeroed(sizeof(struct UnkSummaryStruct)); gUnknown_0203CF1C->unk40BC = a; gUnknown_0203CF1C->unk0 = b; gUnknown_0203CF1C->unk40BE = c; -- cgit v1.2.3 From ae53458622db5321f10092fe1585474813b0edcd Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 21 Oct 2017 00:44:17 -0400 Subject: decompile clear_save_data_screen. --- src/clear_save_data_screen.c | 212 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100755 src/clear_save_data_screen.c (limited to 'src') diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c new file mode 100755 index 000000000..4e3b12992 --- /dev/null +++ b/src/clear_save_data_screen.c @@ -0,0 +1,212 @@ +#include "global.h" +#include "task.h" +#include "menu.h" +#include "text.h" +#include "sound.h" +#include "main.h" +#include "save.h" +#include "palette.h" +#include "gpu_regs.h" +#include "bg.h" +#include "text_window.h" +#include "songs.h" + +extern void CreateYesNoMenu(const struct WindowTemplate *windowTemplate, u16 borderFirstTileNum, u8 borderPalette, u8 initialCursorPos); // menu.s +extern s8 sub_8198C58(void); // menu.s + +extern u8 gText_ClearAllSaveData[]; +extern u8 gText_ClearingData[]; + +extern u16 gUnknown_0860F074[]; + +static void Task_DoClearSaveDataScreenYesNo(u8); +static void Task_ClearSaveDataScreenYesNoChoice(u8); +static void Task_ClearSaveData(u8); +static bool8 SetupClearSaveDataScreen(void); +static void CB2_FadeAndDoReset(void); +static void InitClearSaveDataScreenWindows(void); + +static const struct BgTemplate sClearSaveBgTemplates[2] = +{ + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0, + }, + { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0, + }, +}; + +static const struct WindowTemplate sClearSaveTextWindow[] = +{ + { + .priority = 0, + .tilemapLeft = 3, + .tilemapTop = 15, + .width = 26, + .height = 4, + .paletteNum = 15, + .baseBlock = 11, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate sClearSaveYesNo[] = +{ + { + .priority = 0, + .tilemapLeft = 3, + .tilemapTop = 2, + .width = 5, + .height = 4, + .paletteNum = 15, + .baseBlock = 115, + } +}; + +void CB2_InitClearSaveDataScreen(void) +{ + if(SetupClearSaveDataScreen()) + CreateTask(Task_DoClearSaveDataScreenYesNo, 0); +} + +static void Task_DoClearSaveDataScreenYesNo(u8 taskId) +{ + SetWindowBorderStyle(0, 0, 2, 14); + PrintTextOnWindow(0, 1, gText_ClearAllSaveData, 0, 1, 0, 0); + CreateYesNoMenu(sClearSaveYesNo, 2, 14, 1); + gTasks[taskId].func = Task_ClearSaveDataScreenYesNoChoice; +} + +static void Task_ClearSaveDataScreenYesNoChoice(u8 taskId) +{ + switch(sub_8198C58()) + { + case 0: + FillWindowPixelBuffer(0, 17); + PrintTextOnWindow(0, 1, gText_ClearingData, 0, 1, 0, 0); + gTasks[taskId].func = Task_ClearSaveData; + break; + case 1: + case -1: + PlaySE(SE_SELECT); + DestroyTask(taskId); + SetMainCallback2(CB2_FadeAndDoReset); + } +} + +static void Task_ClearSaveData(u8 taskId) +{ + ClearSaveData(); + DestroyTask(taskId); + SetMainCallback2(CB2_FadeAndDoReset); +} + +static void MainCB(void) +{ + RunTasks(); + UpdatePaletteFade(); +} + +static void VBlankCB(void) +{ + TransferPlttBuffer(); +} + +static bool8 SetupClearSaveDataScreen(void) +{ + u16 i; + + switch(gMain.state) + { + case 0: + default: + SetVBlankCallback(NULL); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG0HOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG0VOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG3HOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG3VOFS, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_WIN0H, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_WIN0V, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_WININ, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_WINOUT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BLDCNT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BLDALPHA, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BLDY, DISPCNT_MODE_0); + DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *)OAM, OAM_SIZE); + DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); + ResetPaletteFade(); + gPlttBufferUnfaded[0] = 0x7fff; + gPlttBufferFaded[0] = 0x7fff; + gPlttBufferUnfaded[1] = 0x3945; + gPlttBufferFaded[1] = 0x3945; + for (i = 0; i < 0x10; i++) + ((u16 *)(VRAM + 0x20))[i] = 0x1111; + + for (i = 0; i < 0x400; i++) + ((u16 *)(VRAM + 0xF000))[i] = 0x0001; + ResetTasks(); + ResetSpriteData(); + ResetBgsAndClearDma3BusyFlags(0); + InitBgsFromTemplates(0, sClearSaveBgTemplates, ARRAY_COUNT(sClearSaveBgTemplates)); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); + ShowBg(0); + ShowBg(3); + SetGpuReg(REG_OFFSET_BLDCNT, DISPCNT_MODE_0); + InitClearSaveDataScreenWindows(); + BeginNormalPaletteFade(0x0000FFFF, 0, 0x10, 0, 0xFFFF); + EnableInterrupts(1); + SetVBlankCallback(VBlankCB); + gMain.state = 1; + break; + case 1: + UpdatePaletteFade(); + if(!gPaletteFade.active) + { + SetMainCallback2(MainCB); + return TRUE; + } + } + return FALSE; +} + +static void CB2_FadeAndDoReset(void) +{ + switch(gMain.state) + { + case 0: + default: + BeginNormalPaletteFade(0x0000FFFF, 0, 0, 0x10, 0xFFFF); + gMain.state = 1; + break; + case 1: + UpdatePaletteFade(); + if(!gPaletteFade.active) + { + FreeAllWindowBuffers(); + DoSoftReset(); + } + } +} + +static void InitClearSaveDataScreenWindows(void) +{ + InitWindows(sClearSaveTextWindow); + DeactivateAllTextPrinters(); + FillWindowPixelBuffer(0, 0); + sub_80987D4(0, 0, 2, 224); + LoadPalette(gUnknown_0860F074, 0xF0, 0x20); +} -- cgit v1.2.3 From fd464a546c3c6b975430085cfd506eea3d8f674f Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Sat, 21 Oct 2017 14:11:32 -0400 Subject: updating --- src/pokemon_summary_screen.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 05cd0b2d1..7a7b6604e 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -281,6 +281,7 @@ void sub_81C3890(); void sub_81C38C0(); void sub_81C3B08(u8 a); void sub_81C3E2C(u8 a); +void sub_81C4D18(); void SetBgAttribute(u8 bg, u8 attributeId, u8 value); @@ -1233,8 +1234,6 @@ bool8 sub_81C1040(void) return FALSE; } -void sub_81C4D18(); - void sub_81C1070(s16 *a, s8 b, u8 *c) { s8 i; -- cgit v1.2.3 From 482b42a295a80952cea75a8176183692b8e8d120 Mon Sep 17 00:00:00 2001 From: shinyquagsire23 Date: Sat, 21 Oct 2017 13:42:31 -0600 Subject: Split librfu into separate C files in its own directory, rfu_initializeAPI matching except for register differences --- src/librfu.c | 788 ------------------------------------------------------ src/librfu_intr.c | 4 + src/librfu_rfu.c | 109 ++++++++ src/librfu_stwi.c | 687 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 800 insertions(+), 788 deletions(-) delete mode 100644 src/librfu.c create mode 100644 src/librfu_intr.c create mode 100644 src/librfu_rfu.c create mode 100644 src/librfu_stwi.c (limited to 'src') diff --git a/src/librfu.c b/src/librfu.c deleted file mode 100644 index e647b9178..000000000 --- a/src/librfu.c +++ /dev/null @@ -1,788 +0,0 @@ -#include "global.h" -#include "main.h" - -enum -{ - RFU_RESET = 0x10, - RFU_LINK_STATUS, - RFU_VERSION_STATUS, - RFU_SYSTEM_STATUS, - RFU_SLOT_STATUS, - RFU_CONFIG_STATUS, - RFU_GAME_CONFIG, - RFU_SYSTEM_CONFIG, - RFU_UNK18, - RFU_SC_START, - RFU_SC_POLLING, - RFU_SC_END, - RFU_SP_START, - RFU_SP_POLLING, - RFU_SP_END, - RFU_CP_START, - RFU_CP_POLLING, - RFU_CP_END, - RFU_UNK22, - RFU_UNK23, - RFU_DATA_TX, - RFU_DATA_TX_AND_CHANGE, - RFU_DATA_RX, - RFU_MS_CHANGE, - RFU_DATA_READY_AND_CHANGE, - RFU_DISCONNECTED_AND_CHANGE, - RFU_UNK2A, - RFU_UNK2B, - RFU_UNK2C, - RFU_UNK2D, - RFU_UNK2E, - RFU_UNK2F, - RFU_DISCONNECT, - RFU_TEST_MODE, - RFU_CPR_START, - RFU_CPR_POLLING, - RFU_CPR_END, - RFU_UNK35, - RFU_UNK36, - RFU_RESUME_RETRANSMIT_AND_CHANGE, - RFU_UNK38, - RFU_UNK39, - RFU_UNK3A, - RFU_UNK3B, - RFU_UNK3C, - RFU_STOP_MODE, //3D -}; - -struct RfuPacket8 -{ - u8 data[0x74]; -}; - -struct RfuPacket32 -{ - u32 command; - u32 data[0x1C]; -}; - -union RfuPacket -{ - struct RfuPacket32 rfuPacket32; - struct RfuPacket8 rfuPacket8; -}; - -struct RfuStruct -{ - vs32 unk_0; - u8 txParams; - u8 unk_5; - u8 activeCommand; - u8 unk_7; - u8 unk_8; - u8 unk_9; - u8 timerSelect; - u8 unk_b; - int timerState; - vu8 timerActive; - u8 unk_11; - vu16 unk_12; - vu8 msMode; - u8 unk_15; - u8 unk_16; - u8 unk_17; - void (*callbackM)(); - void (*callbackS)(); - u32 callbackID; - union RfuPacket *txPacket; - union RfuPacket *rxPacket; - vu8 unk_2c; - u8 padding[3]; -}; - -struct RfuIntrStruct -{ - u8 rxPacketAlloc[0x74]; - u8 txPacketAlloc[0x74]; - u8 block1[0x960]; - u8 block2[0x30]; -}; - -extern IntrFunc IntrSIO32(void); -extern struct RfuStruct *gRfuState; -void STWI_init_Callback_M(void); -void STWI_init_Callback_S(void); -void STWI_set_Callback_M(void * callback); -void STWI_set_Callback_S(void * callback); -u16 STWI_init(u8 request); -int STWI_start_Command(void); -void STWI_intr_timer(void); -void STWI_set_timer(u8 unk); -extern void STWI_stop_timer(void); -int STWI_restart_Command(void); -int STWI_reset_ClockCounter(void); - -void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) -{ - // If we're copying our interrupt into RAM, DMA it to block1 and use - // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. - // interrupt usually is a pointer to gIntrTable[1] - if (copyInterruptToRam == TRUE) - { - *interrupt = (IntrFunc)interruptStruct->block1; - DmaCopy16(3, &IntrSIO32, interruptStruct->block1, 0x960); - gRfuState = (struct RfuStruct*)interruptStruct->block2; - } - else - { - *interrupt = (IntrFunc)IntrSIO32; - gRfuState = (struct RfuStruct*)interruptStruct->block1; - } - - gRfuState->rxPacket = (union RfuPacket*)interruptStruct->rxPacketAlloc; - gRfuState->txPacket = (union RfuPacket*)interruptStruct->txPacketAlloc; - gRfuState->msMode = 1; - gRfuState->unk_0 = 0; - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; - gRfuState->unk_7 = 0; - gRfuState->unk_8 = 0; - gRfuState->unk_9 = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->unk_12 = 0; - gRfuState->unk_15 = 0; - gRfuState->unk_2c = 0; - - REG_RCNT = 0x100; //TODO: mystery bit? - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - STWI_init_Callback_M(); - STWI_init_Callback_S(); - - IntrEnable(INTR_FLAG_SERIAL); -} - -void STWI_init_timer(IntrFunc *interrupt, int timerSelect) -{ - *interrupt = STWI_intr_timer; - gRfuState->timerSelect = timerSelect; - - IntrEnable(INTR_FLAG_TIMER0 << gRfuState->timerSelect); -} - -void AgbRFU_SoftReset(void) -{ - vu16 *timerL; - vu16 *timerH; - - REG_RCNT = 0x8000; - REG_RCNT = 0x80A0; // all these bits are undocumented - timerL = ®_TMCNT_L(gRfuState->timerSelect); - timerH = ®_TMCNT_H(gRfuState->timerSelect); - *timerH = 0; - *timerL = 0; - *timerH = 0x83; - while (*timerL <= 0x11) - REG_RCNT = 0x80A2; - *timerH = 3; - REG_RCNT = 0x80A0; - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - - gRfuState->unk_0 = 0; - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; - gRfuState->activeCommand = 0; - gRfuState->unk_7 = 0; - gRfuState->unk_8 = 0; - gRfuState->unk_9 = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->unk_12 = 0; - gRfuState->msMode = 1; - gRfuState->unk_15 = 0; - gRfuState->unk_2c = 0; -} - -void STWI_set_MS_mode(u8 mode) -{ - gRfuState->msMode = mode; -} - -u16 STWI_read_status(u8 index) -{ - switch (index) - { - case 0: - return gRfuState->unk_12; - case 1: - return gRfuState->msMode; - case 2: - return gRfuState->unk_0; - case 3: - return gRfuState->activeCommand; - default: - return 0xFFFF; - } -} - -void STWI_init_Callback_M(void) -{ - STWI_set_Callback_M(0); -} - -void STWI_init_Callback_S(void) -{ - STWI_set_Callback_S(0); -} - -void STWI_set_Callback_M(void *callback) -{ - gRfuState->callbackM = callback; -} - -void STWI_set_Callback_S(void *callback) -{ - gRfuState->callbackS = callback; -} - -void STWI_set_Callback_ID(u32 id) -{ - gRfuState->callbackID = id; -} - -u16 STWI_poll_CommandEnd(void) -{ - while (gRfuState->unk_2c == TRUE) - ; - return gRfuState->unk_12; -} - -void STWI_send_ResetREQ(void) -{ - if (!STWI_init(RFU_RESET)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_LinkStatusREQ(void) -{ - if (!STWI_init(RFU_LINK_STATUS)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_VersionStatusREQ(void) -{ - if (!STWI_init(RFU_VERSION_STATUS)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_SystemStatusREQ(void) -{ - if (!STWI_init(RFU_SYSTEM_STATUS)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_SlotStatusREQ(void) -{ - if (!STWI_init(RFU_SLOT_STATUS)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_ConfigStatusREQ(void) -{ - if (!STWI_init(RFU_CONFIG_STATUS)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) -{ - u8 *packetBytes; - int i; - - if (!STWI_init(RFU_GAME_CONFIG)) - { - gRfuState->txParams = 6; - - //TODO: what is unk1 - packetBytes = gRfuState->txPacket->rfuPacket8.data; - packetBytes += sizeof(u32); - *(u16*)packetBytes = *(u16*)unk1; - - packetBytes += sizeof(u16); - unk1 += sizeof(u16); - - for (i = 0; i < 14; i++) - { - *packetBytes = *unk1; - packetBytes++; - unk1++; - } - - for (i = 0; i < 8; i++) - { - *packetBytes = *data; - packetBytes++; - data++; - } - - STWI_start_Command(); - } -} - -void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) -{ - if (!STWI_init(RFU_SYSTEM_CONFIG)) - { - u8 *packetBytes; - - gRfuState->txParams = 1; - - packetBytes = gRfuState->txPacket->rfuPacket8.data; - packetBytes += sizeof(u32); - - *packetBytes++ = unk3; - *packetBytes++ = unk2; - *(u16*)packetBytes = unk1; - STWI_start_Command(); - } -} - -void STWI_send_SC_StartREQ(void) -{ - if (!STWI_init(RFU_SC_START)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_SC_PollingREQ(void) -{ - if (!STWI_init(RFU_SC_POLLING)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_SC_EndREQ(void) -{ - if (!STWI_init(RFU_SC_END)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_SP_StartREQ(void) -{ - if (!STWI_init(RFU_SP_START)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_SP_PollingREQ(void) -{ - if (!STWI_init(RFU_SP_POLLING)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_SP_EndREQ(void) -{ - if (!STWI_init(RFU_SP_END)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_CP_StartREQ(u16 unk1) -{ - if (!STWI_init(RFU_CP_START)) - { - gRfuState->txParams = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk1; - STWI_start_Command(); - } -} - -void STWI_send_CP_PollingREQ(void) -{ - if (!STWI_init(RFU_CP_POLLING)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_CP_EndREQ(void) -{ - if (!STWI_init(RFU_CP_END)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_DataTxREQ(void *in, u8 size) -{ - if (!STWI_init(RFU_DATA_TX)) - { - u8 txParams = (size / sizeof(u32)); - if (size & (sizeof(u32) - 1)) - txParams += 1; - - gRfuState->txParams = txParams; - CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); - STWI_start_Command(); - } -} - -void STWI_send_DataTxAndChangeREQ(void *in, u8 size) -{ - if (!STWI_init(RFU_DATA_TX_AND_CHANGE)) - { - u8 txParams = (size / sizeof(u32)); - if (size & (sizeof(u32) - 1)) - txParams += 1; - - gRfuState->txParams = txParams; - CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); - STWI_start_Command(); - } -} - -void STWI_send_DataRxREQ(void) -{ - if (!STWI_init(RFU_DATA_RX)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_MS_ChangeREQ(void) -{ - if (!STWI_init(RFU_MS_CHANGE)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_DataReadyAndChangeREQ(u8 unk) -{ - if (!STWI_init(RFU_DATA_READY_AND_CHANGE)) - { - if (!unk) - { - gRfuState->txParams = 0; - } - else - { - u8 *packetBytes; - - gRfuState->txParams = 1; - - packetBytes = gRfuState->txPacket->rfuPacket8.data; - packetBytes += sizeof(u32); - - *packetBytes++ = unk; - *packetBytes++ = 0; - *packetBytes++ = 0; - *packetBytes = 0; - } - - STWI_start_Command(); - } -} - -void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) -{ - if (!STWI_init(RFU_DISCONNECTED_AND_CHANGE)) - { - u8 *packetBytes; - - gRfuState->txParams = 1; - - packetBytes = gRfuState->txPacket->rfuPacket8.data; - packetBytes += sizeof(u32); - - *packetBytes++ = unk0; - *packetBytes++ = unk1; - *packetBytes++ = 0; - *packetBytes = 0; - - STWI_start_Command(); - } -} - -void STWI_send_ResumeRetransmitAndChangeREQ(void) -{ - if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_DisconnectREQ(u8 unk) -{ - if (!STWI_init(RFU_DISCONNECT)) - { - gRfuState->txParams = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk; - - STWI_start_Command(); - } -} - -void STWI_send_TestModeREQ(u8 unk0, u8 unk1) -{ - if (!STWI_init(RFU_TEST_MODE)) - { - gRfuState->txParams = 1; - gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); - - STWI_start_Command(); - } -} - -void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) -{ - u32 *packetData; - u32 arg1; - - if (!STWI_init(RFU_CPR_START)) - { - gRfuState->txParams = 2; - - arg1 = unk1 | (unk0 << 16); - packetData = gRfuState->txPacket->rfuPacket32.data; - packetData[0] = arg1; - packetData[1] = unk2; - - STWI_start_Command(); - } -} - -void STWI_send_CPR_PollingREQ(void) -{ - if (!STWI_init(RFU_CPR_POLLING)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_CPR_EndREQ(void) -{ - if (!STWI_init(RFU_CPR_END)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_send_StopModeREQ(void) -{ - if (!STWI_init(RFU_STOP_MODE)) - { - gRfuState->txParams = 0; - STWI_start_Command(); - } -} - -void STWI_intr_timer(void) -{ - switch (gRfuState->timerState) - { - //TODO: Make an enum for these - case 2: - gRfuState->timerActive = 1; - STWI_set_timer(50); - break; - case 1: - case 4: - STWI_stop_timer(); - STWI_restart_Command(); - break; - case 3: - gRfuState->timerActive = 1; - STWI_stop_timer(); - STWI_reset_ClockCounter(); - if (gRfuState->callbackM) - gRfuState->callbackM(255, 0); - break; - } -} - -void STWI_set_timer(u8 unk) -{ - vu16 *timerL; - vu16 *timerH; - - timerL = ®_TMCNT_L(gRfuState->timerSelect); - timerH = ®_TMCNT_H(gRfuState->timerSelect); - REG_IME = 0; - switch (unk) - { - case 50: - *timerL = 0xFCCB; - gRfuState->timerState = 1; - break; - case 80: - *timerL = 0xFAE0; - gRfuState->timerState = 2; - break; - case 100: - *timerL = 0xF996; - gRfuState->timerState = 3; - break; - case 130: - *timerL = 0xF7AD; - gRfuState->timerState = 4; - break; - } - *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; - REG_IF = INTR_FLAG_TIMER0 << gRfuState->timerSelect; - REG_IME = 1; -} - -void STWI_stop_timer(void) -{ - gRfuState->timerState = 0; - - REG_TMCNT_L(gRfuState->timerSelect) = 0; - REG_TMCNT_H(gRfuState->timerSelect) = 0; -} - -u16 STWI_init(u8 request) -{ - if (!REG_IME) - { - gRfuState->unk_12 = 6; - if (gRfuState->callbackM) - gRfuState->callbackM(request, gRfuState->unk_12); - return TRUE; - } - else if (gRfuState->unk_2c == TRUE) - { - gRfuState->unk_12 = 2; - gRfuState->unk_2c = FALSE; - if (gRfuState->callbackM) - gRfuState->callbackM(request, gRfuState->unk_12); - return TRUE; - } - else if(!gRfuState->msMode) - { - gRfuState->unk_12 = 4; - if (gRfuState->callbackM) - gRfuState->callbackM(request, gRfuState->unk_12, gRfuState); - return TRUE; - } - else - { - gRfuState->unk_2c = TRUE; - gRfuState->activeCommand = request; - gRfuState->unk_0 = 0; - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; - gRfuState->unk_7 = 0; - gRfuState->unk_8 = 0; - gRfuState->unk_9 = 0; - gRfuState->timerState = 0; - gRfuState->timerActive = 0; - gRfuState->unk_12 = 0; - gRfuState->unk_15 = 0; - - REG_RCNT = 0x100; - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - return FALSE; - } -} - -int STWI_start_Command() -{ - u16 imeTemp; - - // Yes, it matters that it's casted to a u32... - *(u32*)gRfuState->txPacket->rfuPacket8.data = 0x99660000 | (gRfuState->txParams << 8) | gRfuState->activeCommand; - REG_SIODATA32 = gRfuState->txPacket->rfuPacket32.command; - - gRfuState->unk_0 = 0; - gRfuState->unk_5 = 1; - - imeTemp = REG_IME; - REG_IME = 0; - REG_IE |= (INTR_FLAG_TIMER0 << gRfuState->timerSelect); - REG_IE |= INTR_FLAG_SERIAL; - REG_IME = imeTemp; - - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; - - return 0; -} - -int STWI_restart_Command(void) -{ - if (gRfuState->unk_15 <= 1) - { - gRfuState->unk_15++; - STWI_start_Command(); - } - else - { - if (gRfuState->activeCommand == RFU_MS_CHANGE || gRfuState->activeCommand == RFU_DATA_TX_AND_CHANGE || gRfuState->activeCommand == RFU_UNK35 || gRfuState->activeCommand == RFU_RESUME_RETRANSMIT_AND_CHANGE) - { - gRfuState->unk_12 = 1; - gRfuState->unk_2c = 0; - - if (gRfuState->callbackM) - gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); - } - else - { - gRfuState->unk_12 = 1; - gRfuState->unk_2c = 0; - - if (gRfuState->callbackM) - gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); - - gRfuState->unk_0 = 4; //TODO: what's 4 - } - } - - return 0; -} - -int STWI_reset_ClockCounter() -{ - gRfuState->unk_0 = 5; //TODO: what is 5 - gRfuState->txParams = 0; - gRfuState->unk_5 = 0; - REG_SIODATA32 = (1 << 31); - REG_SIOCNT = 0; - REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; - REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F; - - return 0; -} diff --git a/src/librfu_intr.c b/src/librfu_intr.c new file mode 100644 index 000000000..bdf8b072a --- /dev/null +++ b/src/librfu_intr.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "main.h" + +//TODO: decompile asm/librfu_intr.s to here diff --git a/src/librfu_rfu.c b/src/librfu_rfu.c new file mode 100644 index 000000000..cf3fe12ad --- /dev/null +++ b/src/librfu_rfu.c @@ -0,0 +1,109 @@ +#include "global.h" +#include "main.h" + +#include "librfu.h" + +struct RfuUnk1 +{ + u8 unk_0[0x14]; + u32 unk_14; + u32 unk_18; + struct RfuIntrStruct unk_1c; +}; + +struct RfuUnk2 +{ + u8 unk_0[0x68]; + u32 unk_68; + u32 unk_6c; + u8 unk_70[0x70]; +}; + +struct RfuUnk3 +{ + u32 unk_0; + u32 unk_4; + u8 unk_8[0xD4]; + u32 unk_dc; +}; + +extern u32 *gUnknown_03007890; +extern u32 *gUnknown_03007894; +extern struct RfuUnk3* gUnknown_03007898; +extern struct RfuUnk2* gUnknown_03007880[4]; +extern struct RfuUnk1* gUnknown_03007870[4]; +extern void* sub_82E53F4; +extern void rfu_STC_clearAPIVariables(void); + +// Nonmatching, only register differences +/*u16 rfu_initializeAPI(u32 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + u16 i; + u16 *v13; + u16 *v12; + u16 num; + + if (((u32)unk0 & 0xF000000) == 0x2000000 && copyInterruptToRam) + { + return 2; + } + + if ((u32)unk0 & 3) + return 2; + + // Nintendo pls, just use a ternary for once + if (copyInterruptToRam) + { + // An assert/debug print may have existed before, ie + // printf("%s %u < %u", "somefile.c:12345", unk1, num) + // to push this into r3? + num = 0xe64; + if (unk1 < num) + return 1; + } + + if (copyInterruptToRam == FALSE) + { + num = 0x504; // same as above, this should be r3 not r0 + if (unk1 < num) + return 1; + } + gUnknown_03007890 = unk0; + gUnknown_03007894 = unk0 + (0xB4 / sizeof(u32)); + gUnknown_03007898 = (struct RfuUnk3*)(unk0 + (0xDC / sizeof(u32))); + gUnknown_03007880[0] = (struct RfuUnk2*)(unk0 + (0x1BC / sizeof(u32))); + gUnknown_03007870[0] = (struct RfuUnk1*)(unk0 + (0x37C / sizeof(u32))); + + for (i = 1; i < 4; i++, num) + { + gUnknown_03007880[i] = (struct RfuUnk2*)&gUnknown_03007880[i-1]->unk_70; + gUnknown_03007870[i] = (struct RfuUnk1*)&gUnknown_03007870[i-1]->unk_1c; + } + + gUnknown_03007898->unk_dc = (u32)&gUnknown_03007870[3]->unk_1c; + STWI_init_all(&gUnknown_03007870[3]->unk_1c, interrupt, copyInterruptToRam); + rfu_STC_clearAPIVariables(); + + for (i = 0; i < 4; i++) + { + gUnknown_03007880[i]->unk_68 = 0; + gUnknown_03007880[i]->unk_6c = 0; + gUnknown_03007870[i]->unk_14 = 0; + gUnknown_03007870[i]->unk_18 = 0; + } + + // Not matching, register differences + v12 = (u16*)((u32)&sub_82E53F4 & ~1); + v13 = (u16*)gUnknown_03007898->unk_8; + + for (i = 47; i != 0xFFFF; i--) + { + *v13 = *v12; + ++v12; + ++v13; + } + + gUnknown_03007898->unk_4 = (u32)(&gUnknown_03007898->unk_8[1]); + + return 0; +}*/ diff --git a/src/librfu_stwi.c b/src/librfu_stwi.c new file mode 100644 index 000000000..21d38bb38 --- /dev/null +++ b/src/librfu_stwi.c @@ -0,0 +1,687 @@ +#include "global.h" +#include "librfu.h" + +extern IntrFunc IntrSIO32(void); + +extern void STWI_stop_timer(void); + +void STWI_init_Callback_M(void); +void STWI_init_Callback_S(void); +void STWI_set_Callback_M(void * callback); +void STWI_set_Callback_S(void * callback); +u16 STWI_init(u8 request); +int STWI_start_Command(void); +void STWI_intr_timer(void); +void STWI_set_timer(u8 unk); + +int STWI_restart_Command(void); +int STWI_reset_ClockCounter(void); + +void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam) +{ + // If we're copying our interrupt into RAM, DMA it to block1 and use + // block2 for our RfuStruct, otherwise block1 holds the RfuStruct. + // interrupt usually is a pointer to gIntrTable[1] + if (copyInterruptToRam == TRUE) + { + *interrupt = (IntrFunc)interruptStruct->block1; + DmaCopy16(3, &IntrSIO32, interruptStruct->block1, 0x960); + gRfuState = (struct RfuStruct*)interruptStruct->block2; + } + else + { + *interrupt = (IntrFunc)IntrSIO32; + gRfuState = (struct RfuStruct*)interruptStruct->block1; + } + + gRfuState->rxPacket = (union RfuPacket*)interruptStruct->rxPacketAlloc; + gRfuState->txPacket = (union RfuPacket*)interruptStruct->txPacketAlloc; + gRfuState->msMode = 1; + gRfuState->unk_0 = 0; + gRfuState->txParams = 0; + gRfuState->unk_5 = 0; + gRfuState->unk_7 = 0; + gRfuState->unk_8 = 0; + gRfuState->unk_9 = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->unk_12 = 0; + gRfuState->unk_15 = 0; + gRfuState->unk_2c = 0; + + REG_RCNT = 0x100; //TODO: mystery bit? + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + STWI_init_Callback_M(); + STWI_init_Callback_S(); + + IntrEnable(INTR_FLAG_SERIAL); +} + +void STWI_init_timer(IntrFunc *interrupt, int timerSelect) +{ + *interrupt = STWI_intr_timer; + gRfuState->timerSelect = timerSelect; + + IntrEnable(INTR_FLAG_TIMER0 << gRfuState->timerSelect); +} + +void AgbRFU_SoftReset(void) +{ + vu16 *timerL; + vu16 *timerH; + + REG_RCNT = 0x8000; + REG_RCNT = 0x80A0; // all these bits are undocumented + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->timerSelect); + *timerH = 0; + *timerL = 0; + *timerH = 0x83; + while (*timerL <= 0x11) + REG_RCNT = 0x80A2; + *timerH = 3; + REG_RCNT = 0x80A0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + + gRfuState->unk_0 = 0; + gRfuState->txParams = 0; + gRfuState->unk_5 = 0; + gRfuState->activeCommand = 0; + gRfuState->unk_7 = 0; + gRfuState->unk_8 = 0; + gRfuState->unk_9 = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->unk_12 = 0; + gRfuState->msMode = 1; + gRfuState->unk_15 = 0; + gRfuState->unk_2c = 0; +} + +void STWI_set_MS_mode(u8 mode) +{ + gRfuState->msMode = mode; +} + +u16 STWI_read_status(u8 index) +{ + switch (index) + { + case 0: + return gRfuState->unk_12; + case 1: + return gRfuState->msMode; + case 2: + return gRfuState->unk_0; + case 3: + return gRfuState->activeCommand; + default: + return 0xFFFF; + } +} + +void STWI_init_Callback_M(void) +{ + STWI_set_Callback_M(0); +} + +void STWI_init_Callback_S(void) +{ + STWI_set_Callback_S(0); +} + +void STWI_set_Callback_M(void *callback) +{ + gRfuState->callbackM = callback; +} + +void STWI_set_Callback_S(void *callback) +{ + gRfuState->callbackS = callback; +} + +void STWI_set_Callback_ID(u32 id) +{ + gRfuState->callbackID = id; +} + +u16 STWI_poll_CommandEnd(void) +{ + while (gRfuState->unk_2c == TRUE) + ; + return gRfuState->unk_12; +} + +void STWI_send_ResetREQ(void) +{ + if (!STWI_init(RFU_RESET)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_LinkStatusREQ(void) +{ + if (!STWI_init(RFU_LINK_STATUS)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_VersionStatusREQ(void) +{ + if (!STWI_init(RFU_VERSION_STATUS)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_SystemStatusREQ(void) +{ + if (!STWI_init(RFU_SYSTEM_STATUS)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_SlotStatusREQ(void) +{ + if (!STWI_init(RFU_SLOT_STATUS)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_ConfigStatusREQ(void) +{ + if (!STWI_init(RFU_CONFIG_STATUS)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_GameConfigREQ(u8 * unk1, u8 *data) +{ + u8 *packetBytes; + int i; + + if (!STWI_init(RFU_GAME_CONFIG)) + { + gRfuState->txParams = 6; + + //TODO: what is unk1 + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + *(u16*)packetBytes = *(u16*)unk1; + + packetBytes += sizeof(u16); + unk1 += sizeof(u16); + + for (i = 0; i < 14; i++) + { + *packetBytes = *unk1; + packetBytes++; + unk1++; + } + + for (i = 0; i < 8; i++) + { + *packetBytes = *data; + packetBytes++; + data++; + } + + STWI_start_Command(); + } +} + +void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3) +{ + if (!STWI_init(RFU_SYSTEM_CONFIG)) + { + u8 *packetBytes; + + gRfuState->txParams = 1; + + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + + *packetBytes++ = unk3; + *packetBytes++ = unk2; + *(u16*)packetBytes = unk1; + STWI_start_Command(); + } +} + +void STWI_send_SC_StartREQ(void) +{ + if (!STWI_init(RFU_SC_START)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_PollingREQ(void) +{ + if (!STWI_init(RFU_SC_POLLING)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_SC_EndREQ(void) +{ + if (!STWI_init(RFU_SC_END)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_StartREQ(void) +{ + if (!STWI_init(RFU_SP_START)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_PollingREQ(void) +{ + if (!STWI_init(RFU_SP_POLLING)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_SP_EndREQ(void) +{ + if (!STWI_init(RFU_SP_END)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_StartREQ(u16 unk1) +{ + if (!STWI_init(RFU_CP_START)) + { + gRfuState->txParams = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk1; + STWI_start_Command(); + } +} + +void STWI_send_CP_PollingREQ(void) +{ + if (!STWI_init(RFU_CP_POLLING)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_CP_EndREQ(void) +{ + if (!STWI_init(RFU_CP_END)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataTxREQ(void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX)) + { + u8 txParams = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + txParams += 1; + + gRfuState->txParams = txParams; + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataTxAndChangeREQ(void *in, u8 size) +{ + if (!STWI_init(RFU_DATA_TX_AND_CHANGE)) + { + u8 txParams = (size / sizeof(u32)); + if (size & (sizeof(u32) - 1)) + txParams += 1; + + gRfuState->txParams = txParams; + CpuCopy32(in, gRfuState->txPacket->rfuPacket32.data, gRfuState->txParams * sizeof(u32)); + STWI_start_Command(); + } +} + +void STWI_send_DataRxREQ(void) +{ + if (!STWI_init(RFU_DATA_RX)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_MS_ChangeREQ(void) +{ + if (!STWI_init(RFU_MS_CHANGE)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_DataReadyAndChangeREQ(u8 unk) +{ + if (!STWI_init(RFU_DATA_READY_AND_CHANGE)) + { + if (!unk) + { + gRfuState->txParams = 0; + } + else + { + u8 *packetBytes; + + gRfuState->txParams = 1; + + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + + *packetBytes++ = unk; + *packetBytes++ = 0; + *packetBytes++ = 0; + *packetBytes = 0; + } + + STWI_start_Command(); + } +} + +void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_DISCONNECTED_AND_CHANGE)) + { + u8 *packetBytes; + + gRfuState->txParams = 1; + + packetBytes = gRfuState->txPacket->rfuPacket8.data; + packetBytes += sizeof(u32); + + *packetBytes++ = unk0; + *packetBytes++ = unk1; + *packetBytes++ = 0; + *packetBytes = 0; + + STWI_start_Command(); + } +} + +void STWI_send_ResumeRetransmitAndChangeREQ(void) +{ + if (!STWI_init(RFU_RESUME_RETRANSMIT_AND_CHANGE)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_DisconnectREQ(u8 unk) +{ + if (!STWI_init(RFU_DISCONNECT)) + { + gRfuState->txParams = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk; + + STWI_start_Command(); + } +} + +void STWI_send_TestModeREQ(u8 unk0, u8 unk1) +{ + if (!STWI_init(RFU_TEST_MODE)) + { + gRfuState->txParams = 1; + gRfuState->txPacket->rfuPacket32.data[0] = unk0 | (unk1 << 8); + + STWI_start_Command(); + } +} + +void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2) +{ + u32 *packetData; + u32 arg1; + + if (!STWI_init(RFU_CPR_START)) + { + gRfuState->txParams = 2; + + arg1 = unk1 | (unk0 << 16); + packetData = gRfuState->txPacket->rfuPacket32.data; + packetData[0] = arg1; + packetData[1] = unk2; + + STWI_start_Command(); + } +} + +void STWI_send_CPR_PollingREQ(void) +{ + if (!STWI_init(RFU_CPR_POLLING)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_CPR_EndREQ(void) +{ + if (!STWI_init(RFU_CPR_END)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_send_StopModeREQ(void) +{ + if (!STWI_init(RFU_STOP_MODE)) + { + gRfuState->txParams = 0; + STWI_start_Command(); + } +} + +void STWI_intr_timer(void) +{ + switch (gRfuState->timerState) + { + //TODO: Make an enum for these + case 2: + gRfuState->timerActive = 1; + STWI_set_timer(50); + break; + case 1: + case 4: + STWI_stop_timer(); + STWI_restart_Command(); + break; + case 3: + gRfuState->timerActive = 1; + STWI_stop_timer(); + STWI_reset_ClockCounter(); + if (gRfuState->callbackM) + gRfuState->callbackM(255, 0); + break; + } +} + +void STWI_set_timer(u8 unk) +{ + vu16 *timerL; + vu16 *timerH; + + timerL = ®_TMCNT_L(gRfuState->timerSelect); + timerH = ®_TMCNT_H(gRfuState->timerSelect); + REG_IME = 0; + switch (unk) + { + case 50: + *timerL = 0xFCCB; + gRfuState->timerState = 1; + break; + case 80: + *timerL = 0xFAE0; + gRfuState->timerState = 2; + break; + case 100: + *timerL = 0xF996; + gRfuState->timerState = 3; + break; + case 130: + *timerL = 0xF7AD; + gRfuState->timerState = 4; + break; + } + *timerH = TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_1024CLK; + REG_IF = INTR_FLAG_TIMER0 << gRfuState->timerSelect; + REG_IME = 1; +} + +void STWI_stop_timer(void) +{ + gRfuState->timerState = 0; + + REG_TMCNT_L(gRfuState->timerSelect) = 0; + REG_TMCNT_H(gRfuState->timerSelect) = 0; +} + +u16 STWI_init(u8 request) +{ + if (!REG_IME) + { + gRfuState->unk_12 = 6; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->unk_12); + return TRUE; + } + else if (gRfuState->unk_2c == TRUE) + { + gRfuState->unk_12 = 2; + gRfuState->unk_2c = FALSE; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->unk_12); + return TRUE; + } + else if(!gRfuState->msMode) + { + gRfuState->unk_12 = 4; + if (gRfuState->callbackM) + gRfuState->callbackM(request, gRfuState->unk_12, gRfuState); + return TRUE; + } + else + { + gRfuState->unk_2c = TRUE; + gRfuState->activeCommand = request; + gRfuState->unk_0 = 0; + gRfuState->txParams = 0; + gRfuState->unk_5 = 0; + gRfuState->unk_7 = 0; + gRfuState->unk_8 = 0; + gRfuState->unk_9 = 0; + gRfuState->timerState = 0; + gRfuState->timerActive = 0; + gRfuState->unk_12 = 0; + gRfuState->unk_15 = 0; + + REG_RCNT = 0x100; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + return FALSE; + } +} + +int STWI_start_Command() +{ + u16 imeTemp; + + // Yes, it matters that it's casted to a u32... + *(u32*)gRfuState->txPacket->rfuPacket8.data = 0x99660000 | (gRfuState->txParams << 8) | gRfuState->activeCommand; + REG_SIODATA32 = gRfuState->txPacket->rfuPacket32.command; + + gRfuState->unk_0 = 0; + gRfuState->unk_5 = 1; + + imeTemp = REG_IME; + REG_IME = 0; + REG_IE |= (INTR_FLAG_TIMER0 << gRfuState->timerSelect); + REG_IE |= INTR_FLAG_SERIAL; + REG_IME = imeTemp; + + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_MULTI_BUSY | SIO_115200_BPS; + + return 0; +} + +int STWI_restart_Command(void) +{ + if (gRfuState->unk_15 <= 1) + { + gRfuState->unk_15++; + STWI_start_Command(); + } + else + { + if (gRfuState->activeCommand == RFU_MS_CHANGE || gRfuState->activeCommand == RFU_DATA_TX_AND_CHANGE || gRfuState->activeCommand == RFU_UNK35 || gRfuState->activeCommand == RFU_RESUME_RETRANSMIT_AND_CHANGE) + { + gRfuState->unk_12 = 1; + gRfuState->unk_2c = 0; + + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); + } + else + { + gRfuState->unk_12 = 1; + gRfuState->unk_2c = 0; + + if (gRfuState->callbackM) + gRfuState->callbackM(gRfuState->activeCommand, gRfuState->unk_12); + + gRfuState->unk_0 = 4; //TODO: what's 4 + } + } + + return 0; +} + +int STWI_reset_ClockCounter() +{ + gRfuState->unk_0 = 5; //TODO: what is 5 + gRfuState->txParams = 0; + gRfuState->unk_5 = 0; + REG_SIODATA32 = (1 << 31); + REG_SIOCNT = 0; + REG_SIOCNT = SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS; + REG_SIOCNT = (SIO_INTR_ENABLE | SIO_32BIT_MODE | SIO_115200_BPS) + 0x7F; + + return 0; +} -- cgit v1.2.3 From a43d6d4a53717d26480872ed5e0c1e806170091a Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sat, 21 Oct 2017 23:20:50 -0400 Subject: review changes --- src/clear_save_data_screen.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/clear_save_data_screen.c b/src/clear_save_data_screen.c index 4e3b12992..3192e0e11 100755 --- a/src/clear_save_data_screen.c +++ b/src/clear_save_data_screen.c @@ -11,9 +11,6 @@ #include "text_window.h" #include "songs.h" -extern void CreateYesNoMenu(const struct WindowTemplate *windowTemplate, u16 borderFirstTileNum, u8 borderPalette, u8 initialCursorPos); // menu.s -extern s8 sub_8198C58(void); // menu.s - extern u8 gText_ClearAllSaveData[]; extern u8 gText_ClearingData[]; @@ -134,17 +131,17 @@ static bool8 SetupClearSaveDataScreen(void) default: SetVBlankCallback(NULL); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG0HOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG0VOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG3HOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BG3VOFS, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_WIN0H, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_WIN0V, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_WININ, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_WINOUT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BLDCNT, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BLDALPHA, DISPCNT_MODE_0); - SetGpuReg(REG_OFFSET_BLDY, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BG0HOFS, 0); + SetGpuReg(REG_OFFSET_BG0VOFS, 0); + SetGpuReg(REG_OFFSET_BG3HOFS, 0); + SetGpuReg(REG_OFFSET_BG3VOFS, 0); + SetGpuReg(REG_OFFSET_WIN0H, 0); + SetGpuReg(REG_OFFSET_WIN0V, 0); + SetGpuReg(REG_OFFSET_WININ, 0); + SetGpuReg(REG_OFFSET_WINOUT, 0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); DmaFill16(3, 0, (void *)VRAM, VRAM_SIZE); DmaFill32(3, 0, (void *)OAM, OAM_SIZE); DmaFill16(3, 0, (void *)(PLTT + 2), PLTT_SIZE - 2); @@ -165,7 +162,7 @@ static bool8 SetupClearSaveDataScreen(void) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP); ShowBg(0); ShowBg(3); - SetGpuReg(REG_OFFSET_BLDCNT, DISPCNT_MODE_0); + SetGpuReg(REG_OFFSET_BLDCNT, 0); InitClearSaveDataScreenWindows(); BeginNormalPaletteFade(0x0000FFFF, 0, 0x10, 0, 0xFFFF); EnableInterrupts(1); -- cgit v1.2.3 From 52d368a29a1680e0c0df1bb24d6979204fe2c518 Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Sun, 22 Oct 2017 15:01:34 -0400 Subject: all done --- src/pokemon_summary_screen.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 7a7b6604e..724e345a4 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -45,10 +45,10 @@ extern s8 gUnknown_0861CC1C[]; extern u8 gUnknown_08329D22[]; extern u8 gUnknown_0203CF21; extern u16 gSpecialVar_0x8005; -extern struct unkStruct_61CC04 gUnknown_0861CC04; -extern struct unkStruct_61CC04 gUnknown_0861CC10; -extern struct unkStruct_61CC04 gUnknown_0861CBEC; -extern struct unkStruct_61CC04 gUnknown_0861CBF8; +extern struct UnkStruct_61CC04 gUnknown_0861CC04; +extern struct UnkStruct_61CC04 gUnknown_0861CC10; +extern struct UnkStruct_61CC04 gUnknown_0861CBEC; +extern struct UnkStruct_61CC04 gUnknown_0861CBF8; extern u16 gUnknown_08DC3CD4[]; extern struct ContestMove gContestMoves[]; extern struct ContestEffect gContestEffects[]; @@ -1862,12 +1862,12 @@ void sub_81C174C(u8 taskId) } } -u8 sub_81C18A8() +bool8 sub_81C18A8() { if (gUnknown_0203CF1C->unk40C6 == 4 || gUnknown_0203CF1C->unk40C4 == 0 || sub_81B6D14(gUnknown_0203CF1C->summary.moves[gUnknown_0203CF1C->unk40C6]) != 1) - return 1; + return TRUE; else - return 0; + return FALSE; } void sub_81C18F4(u8 taskId) @@ -2017,7 +2017,7 @@ void sub_81C1BA0() Free(alloced); } -struct unkStruct_61CC04 +struct UnkStruct_61CC04 { u8 *ptr; u8 field_4; @@ -2029,7 +2029,7 @@ struct unkStruct_61CC04 }; #ifdef NONMATCHING -void sub_81C1CB0(struct unkStruct_61CC04 *a, u16 *b, u8 c, u8 d) +void sub_81C1CB0(struct UnkStruct_61CC04 *a, u16 *b, u8 c, u8 d) { u8 *alloced = Alloc(a->field_6 * (a->field_7 << 1)); CpuFill16(a->field_4, alloced, a->field_7*a->field_6); @@ -2060,7 +2060,7 @@ void sub_81C1CB0(struct unkStruct_61CC04 *a, u16 *b, u8 c, u8 d) } #else __attribute__((naked)) -void sub_81C1CB0(struct unkStruct_61CC04 *a, u16 *b, u8 c, u8 d) +void sub_81C1CB0(struct UnkStruct_61CC04 *a, u16 *b, u8 c, u8 d) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -2645,7 +2645,7 @@ void sub_81C27DC(struct Pokemon *mon, u16 a) } } -void sub_81C2838(u8 a, u8 b, u32 c) +void sub_81C2838(u8 a, bool8 b, u32 c) { BlitBitmapToWindow(a, (b) ? &gUnknown_0861CDD3[0] : &gUnknown_0861CDD3[0] - 0x80, c, 0, 16, 16); } @@ -3075,32 +3075,32 @@ u8 sub_81C3220() return 1; } -u8 sub_81C32BC() +bool8 sub_81C32BC() { struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 r0 = sum->metGame - 1; if (r0 <= 4) - return 1; - return 0; + return TRUE; + return FALSE; } -u8 sub_81C32E0() +bool8 sub_81C32E0() { struct PokeSummary *sum = &gUnknown_0203CF1C->summary; u8 r0 = sum->metGame - 1; if (r0 <= 2) - return 1; - return 0; + return TRUE; + return FALSE; } -u8 sub_81C3304() +bool8 sub_81C3304() { if ((gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) && gMain.inBattle) { if (gUnknown_0203CF1C->unk40BE == 1 || gUnknown_0203CF1C->unk40BE == 4 || gUnknown_0203CF1C->unk40BE == 5) - return 1; + return TRUE; } - return 0; + return FALSE; } #ifdef NONMATCHING -- cgit v1.2.3 From 72dcfeddd7a47eda5e397066d91f2f18024363dd Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Sun, 22 Oct 2017 15:12:48 -0400 Subject: all done(I hope) --- src/pokemon_summary_screen.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 724e345a4..b2f18090b 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -247,7 +247,7 @@ void sub_81C15EC(struct BoxPokemon *mon, u8 a, u8 b); void sub_81C40A0(u8 a, u8 b); void sub_81C4568(u8 a, u8 b); void sub_81C174C(u8 taskId); -u8 sub_81C18A8(); +bool8 sub_81C18A8(); void sub_81C18F4(u8 a); u8 sub_81B6D14(u16 a); void sub_81C1940(u8 taskId); @@ -268,10 +268,10 @@ void sub_81C302C(); void sub_81C307C(); void sub_81C3194(); void sub_81C31C0(); -u8 sub_81C3304(); +bool8 sub_81C3304(); void sub_81C31F0(u8 *a); u8 sub_81C3220(); -u8 sub_81C32BC(); +bool8 sub_81C32BC(); void sub_81C35E4(); void sub_81C3690(); void sub_81C3710(); @@ -1835,7 +1835,7 @@ void sub_81C174C(u8 taskId) } else if (gMain.newKeys & A_BUTTON) { - if (sub_81C18A8() == 1) + if (sub_81C18A8() == TRUE) { sub_81C48F0(); PlaySE(SE_SELECT); @@ -2998,7 +2998,7 @@ void sub_81C307C() sub_81AFC0C(0, gUnknown_0861CE74); sub_81AFC0C(1, gUnknown_0861CE7B); sub_81C31C0(); - if (sub_81A6BF4() == 1 || sub_81B9E94() == 1 || sub_81C3304() == 1) + if (sub_81A6BF4() == 1 || sub_81B9E94() == 1 || sub_81C3304() == TRUE) sub_81AFC28(gStringVar4, gText_XNature); else { @@ -3203,7 +3203,7 @@ void sub_81C349C() else if (sub_81C32BC() == 0 || sub_81C3220() == 0) text = gText_PeculiarEggTrade; else if (sum->metLocation == 0xFD) - text = (sub_81C32E0() == 1) ? gText_EggFromHotSprings : gText_EggFromTraveler; + text = (sub_81C32E0() == TRUE) ? gText_EggFromHotSprings : gText_EggFromTraveler; else text = gText_OddEggFoundByCouple; } -- cgit v1.2.3 From c042e5148b9fa3a51a4010922c3f9cd6ba11b51e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 22 Oct 2017 18:55:07 -0400 Subject: Decoration + decoration_inventory (#89) * SetDecorationInventoriesPointers * ClearDecorationInventories * CheckHasDecoration * DecorationAdd * DecorationCheckSpace * DecorationRemove * sub_8161A38 * CountDecorations; Funcion renaming * Disassemble decoration data structs, tilemaps, and descriptions * sub_8126968 * sub_81269D4 * through sub_8126A88 * through sub_8126B2C * sub_8126B80 * sub_8126C08 * sub_8126C48 * sub_8126CA4 * sub_8126D10 * sub_8126E44 * sub_8126E8C * sub_8126F68 * sub_8127058 * sub_8127088 * sub_81270E8 * through sub_8127208 * through sub_8127268 * sub_8127284 * through sub_81272F8 * sub_8127330 * through sub_8127480 * sub_81274A0 * sub_8127500; makefile now tells scaninc to scan headers * Actual real fix to mapfile being in build/emerald instead of wd * through sub_812759C * through sub_812764C * through sub_8127744 * through sub_81277BC * sub_81277E8 * sub_8127814 * through sub_81279C4 * through sub_8127ACC * sub_8127B04 * sub_8127B54 * sub_8127B90 * sub_8127D38 * sub_8127E18 * sub_8127F68 * sub_8128060 * ConfigureCameraObjectForPlacingDecoration * SetUpPlacingDecorationPlayerAvatar * sub_812826C * through sub_8128414 * through sub_81284F4 * sub_812853C * sub_8128950 * through sub_8128AAC * through sub_8128BBC * c1_overworld_prev_quest * sub_8128C64 * sub_8128CD4 * sub_8128D10 * sub_8128DB4 * through sub_8128E18 * through sub_8129068 * sub_8129088 * through sub_81291E8 * sub_812925C * sub_81292D0 * sub_81292E8 * gpu_pal_decompress_alloc_tag_and_upload * AddDecorationIconObjectFromIconTable * GetDecorationIconPicOrPalette * AddDecorationIconObjectFromFieldObject * AddDecorationIconObject * through sub_8129708 * sub_81297F8 * sub_81298EC * SetUpPuttingAwayDecorationPlayerAvatar * sub_8129ABC * sub_8129B34 * sub_8129BCC * through sub_8129C74 * through sub_8129D8C * sub_8129E0C * sub_8129E74 * sub_8129F20 * sub_8129FC8 * sub_812A040 * nonmatching sub_812A0E8 * through sub_812A22C * sub_812A25C * sub_812A2C4 * through sub_812A39C * Remaining fns in decoration.s * Decompile decoration headers * Decompile all remaining decoration data that had already been disassembled * Disassemble two data objects * Suggest structure of list menu template * decompile through decoration list menu template * Disassemble decoration icon graphics table * Rip icon gfx * Decompile deco icon table * Decompile more data related to drawing decorations * Decompile gUnknown_085A7250 structs * Decompile two sprite templates * Decompile remaining data in decoration.s * Decompile decoration ewram * deco -> decor --- src/decoration.c | 2793 +++++++++++++++++++++++++++++++++++++++ src/decoration_inventory.c | 189 +++ src/international_string_util.c | 8 +- src/start_menu.c | 2 +- src/tv.c | 2 +- 5 files changed, 2988 insertions(+), 6 deletions(-) create mode 100644 src/decoration.c create mode 100644 src/decoration_inventory.c (limited to 'src') diff --git a/src/decoration.c b/src/decoration.c new file mode 100644 index 000000000..b2f4125ef --- /dev/null +++ b/src/decoration.c @@ -0,0 +1,2793 @@ + +// Includes +#include "global.h" +#include "decompress.h" +#include "malloc.h" +#include "string_util.h" +#include "international_string_util.h" +#include "script.h" +#include "task.h" +#include "main.h" +#include "palette.h" +#include "songs.h" +#include "overworld.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "field_weather.h" +#include "field_player_avatar.h" +#include "field_camera.h" +#include "field_screen.h" +#include "field_map_obj.h" +#include "list_menu.h" +#include "menu_helpers.h" +#include "new_menu_helpers.h" +#include "menu_indicators.h" +#include "sound.h" +#include "event_scripts.h" +#include "event_data.h" +#include "region_map.h" +#include "player_pc.h" +#include "strings.h" +#include "tv.h" +#include "secret_base.h" +#include "tilesets.h" +#include "item_icon.h" +#include "trader.h" +#include "map_object_constants.h" +#include "decoration_inventory.h" +#include "decoration.h" +#include "graphics.h" + +// Static type declarations + +struct UnkStruct_0203A18C { + struct ListMenuItem unk_000[41]; + u8 unk_148[41][24]; + u8 unk_520; + u8 unk_521; + u8 unk_522; +}; + +struct UnkStruct_0203A190 { + /*0x000; 0x0203a190*/ const struct Decoration *decoration; + /*0x004; 0x0203a194*/ u16 tiles[0x40]; + /*0x084; 0x0203a214*/ u8 image[0x800]; + /*0x884; 0x0203aa14*/ u16 palette[16]; +}; + +struct UnkStruct_0203AA44 { + u8 idx; + u8 width; + u8 height; + u16 flagId; +}; + +// Static RAM declarations + +EWRAM_DATA u8 *gUnknown_0203A14C = NULL; +EWRAM_DATA u8 gUnknown_0203A150 = 0; +EWRAM_DATA u8 gUnknown_0203A151 = 0; +EWRAM_DATA u8 gUnknown_0203A152[16] = {}; +EWRAM_DATA u8 gUnknown_0203A162[12] = {}; +EWRAM_DATA u16 gUnknown_0203A16E = 0; +EWRAM_DATA u16 gUnknown_0203A170 = 0; +EWRAM_DATA u8 gUnknown_0203A172 = 0; +EWRAM_DATA u8 gUnknown_0203A173 = 0; +EWRAM_DATA u32 filler_0203a174[2] = {}; +EWRAM_DATA struct DecorPCPointers gUnknown_0203A17C = {}; +EWRAM_DATA u8 gUnknown_0203A188[4] = {}; +EWRAM_DATA struct UnkStruct_0203A18C *gUnknown_0203A18C = NULL; +EWRAM_DATA struct UnkStruct_0203A190 gUnknown_0203A190 = {}; +EWRAM_DATA u16 gUnknown_0203AA34 = 0; +EWRAM_DATA u16 gUnknown_0203AA36 = 0; +EWRAM_DATA u8 gUnknown_0203AA38 = 0; +EWRAM_DATA u8 gUnknown_0203AA39 = 0; +EWRAM_DATA u8 gUnknown_0203AA3A = 0; +EWRAM_DATA struct OamData gUnknown_0203AA3C = {}; +EWRAM_DATA struct UnkStruct_0203AA44 gUnknown_0203AA44[16] = {}; +EWRAM_DATA u8 gUnknown_0203AAC4 = 0; + +// Static ROM declarations + +void sub_8126B80(u8 taskId); +void sub_8126C08(void); +void sub_8126C48(u8 taskId); +void sub_8126CA4(u8 taskId); +void sub_8126D10(u8 taskId); +void sub_8126DA4(u8 taskId); +void sub_8126D6C(u8 taskId); +void sub_8126DCC(u8 taskId); +void sub_8126DFC(u8 taskId); +void sub_8126E8C(u8 taskId); +void sub_8126F68(u8 winid, u8 decorCat, u8 x, u8 y, bool8 flag, u8 speed); +void sub_8127058(u8 *str, bool8 flag); +void sub_8127088(u8 taskId); +void sub_81270E8(u8 taskId); +void sub_8127180(u8 taskId); +void sub_812719C(u8 taskId); +void sub_81271CC(u8 taskId); +void sub_8127268(u8 taskId); +void sub_8127454(u8 *dest, u16 decorId); +void sub_8127480(u32 a0, bool8 flag, struct ListMenu *menu); +void sub_81274A0(u8 a0, s32 a1, u8 a2); +void sub_8127620(u8 taskId); +void sub_812764C(u8 taskId); +void sub_8127744(u32 a0); +void sub_81277A8(void); +bool8 sub_81277BC(u8 idx); +bool8 sub_81277E8(u8 idx); +void sub_81279B4(u8 taskId); +void sub_812759C(u8 taskId); +void sub_8127718(u8 decorCat); +void sub_8127A30(u8 taskId); +void sub_8127A8C(u8 taskId); +void sub_8127F68(u8 taskId); +void sub_8128060(u8 taskId); +void ConfigureCameraObjectForPlacingDecoration(struct UnkStruct_0203A190 *data, u8 decor); +void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_0203A190 *data); +void sub_812826C(u8 taskId); +void sub_81283BC(u8 taskId); +void sub_8128414(u8 taskId); +void sub_8128950(u8 taskId); +void sub_81289D0(u8 taskId); +void sub_81289F0(u8 taskId); +void sub_8128AAC(u8 taskId); +void sub_8128B80(u8 taskId); +void sub_8128BA0(u8 taskId); +void sub_8128BBC(u8 taskId); +void c1_overworld_prev_quest(u8 taskId); +void sub_8128CD4(void); +void sub_8128DE0(void); +void sub_8128FD8(u8 taskId); +void sub_8129020(u8 taskId); +void sub_81292D0(struct Sprite *sprite); +void sub_81292E8(struct Sprite *sprite); +u8 gpu_pal_decompress_alloc_tag_and_upload(struct UnkStruct_0203A190 *data, u8 decor); +const u8 *GetDecorationIconPicOrPalette(u16 decor, u8 mode); +bool8 sub_81299AC(u8 taskId); +void sub_8129ABC(u8 taskId); +void sub_8129B34(u8 taskId); +void sub_8129BCC(u8 taskId); +void sub_8129BF8(u8 taskId); +void sub_8129C74(u8 taskId); +void sub_8129D64(u8 taskId); +void sub_812A0E8(u8 taskId); +void sub_812A1A0(u8 taskId); +void sub_812A1C0(u8 taskId); +void sub_812A1F0(u8 taskId); +void sub_812A210(u8 taskId); +void sub_812A22C(u8 taskId); +void sub_812A25C(u8 taskId); +void sub_812A334(void); +void sub_812A36C(struct Sprite *sprite); +void sub_812A39C(void); +void sub_812A3C8(void); +void sub_812A3D4(u8 taskId); +void sub_812A458(u8 taskId); +void sub_812A478(u8 taskId); + +// .rodata + +#include "data/decoration/tiles.h" +#include "data/decoration/description.h" +#include "data/decoration/header.h" + +const u8 *const gUnknown_085A6B28[] = { + gUnknown_085EA859, + gUnknown_085EA85E, + gUnknown_085EA864, + gUnknown_085EA86A, + gUnknown_085EA873, + gUnknown_085EA877, + gUnknown_085EA87E, + gUnknown_085EA883 +}; + +const struct MenuAction gUnknown_085A6B48[] = { + { + gUnknown_085EA7B1, {.void_u8=sub_8126C48} + }, { + gUnknown_085EA7BA, {.void_u8=sub_8126CA4} + }, { + gUnknown_085EA7C3, {.void_u8=sub_8126D10} + }, { + gText_Cancel, {.void_u8=sub_8126D6C} + } +}; + +const u8 *const gUnknown_085A6B68[] = { + gUnknown_085EA7CF, + gUnknown_085EA7F5, + gUnknown_085EA81C, + gText_GoBackPrevMenu +}; + +void (*const gUnknown_085A6B78[][2])(u8 taskId) = { + { + sub_8127F68, sub_8127A8C + }, { + sub_812A3D4, sub_8127A8C + }, { + sub_8133DA0, sub_8127A8C + } +}; + +const struct WindowTemplate gUnknown_085A6B90[4] = { + { 0, 1, 1, 18, 8, 15, 0x0001 }, + { 0, 1, 1, 13, 18, 13, 0x0091 }, + { 0, 17, 1, 12, 2, 15, 0x017b }, + { 0, 16, 13, 13, 6, 15, 0x0193 } +}; + +const u16 gUnknown_085A6BB0[] = { + 0x532e, 0x7fff, 0x318c, 0x675a, + 0x739c, 0x6318, 0x0000, 0x77bd, + 0x6318, 0x4a52, 0x001f, 0x0016, + 0x631f, 0x7d4a, 0x58c6, 0x7f18 +}; + +const struct ListMenuTemplate gUnknown_085A6BD0 = { + NULL, + sub_8127480, + sub_81274A0, + 0, 0, + 0, 0, 8, 0, + 9, 2, 1, 3, FALSE, 0, FALSE, 7 +}; + +#include "data/decoration/icon.h" +#include "data/decoration/tilemaps.h" + +const struct { + u8 shape; + u8 size; + u8 x; + u8 y; +} gUnknown_085A7250[] = { + {0x00, 0x01, 0x78, 0x4e}, + {0x01, 0x02, 0x80, 0x4e}, + {0x01, 0x03, 0x90, 0x56}, + {0x01, 0x03, 0x90, 0x46}, + {0x00, 0x02, 0x80, 0x46}, + {0x02, 0x02, 0x78, 0x46}, + {0x02, 0x03, 0x80, 0x56}, + {0x02, 0x03, 0x80, 0x36}, + {0x00, 0x03, 0x90, 0x46}, + {0x01, 0x03, 0x90, 0x46} +}; + +const union AnimCmd gUnknown_085A7278[] = { + ANIMCMD_FRAME(0, 0, FALSE, FALSE), + ANIMCMD_END +}; + +const union AnimCmd *const gUnknown_085A7280[] = { + gUnknown_085A7278 +}; + +const struct SpriteFrameImage gUnknown_085A7284 = { + (const u8 *)&gUnknown_0203A190.image, 0x800 +}; + +const struct SpriteTemplate gUnknown_085A728C = { + 0xffff, + 0x0be5, + &gUnknown_0203AA3C, + gUnknown_085A7280, + &gUnknown_085A7284, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct SpriteTemplate gUnknown_085A72A4 = { + 0x0000, + 0x0000, + &gUnknown_0203AA3C, + gUnknown_085A7280, + NULL, + gDummySpriteAffineAnimTable, + SpriteCallbackDummy +}; + +const struct SpritePalette gUnknown_085A72BC = { + (const u16 *)&gUnknown_0203A190.palette, 0x0be5 +}; + +const struct YesNoFuncTable gUnknown_085A72C4 = { + sub_81289F0, + sub_8128FD8 +}; + +const struct YesNoFuncTable gUnknown_085A72CC = { + sub_8128BA0, + sub_8128FD8 +}; + +const struct YesNoFuncTable gUnknown_085A72D4[] = { + { + sub_81283BC, + sub_8128414 + }, { + sub_8129BCC, + sub_8129BF8 + } +}; + +const u8 gUnknown_085A72E4[] = { + 0x04, 0x04, 0x04, 0x04, 0x00, 0x03, 0x03, 0x00 +}; + +const u8 gUnknown_085A72EC[] = { + 0x04, 0x04, 0x04, 0x04, 0x00, 0x04, 0x03, 0x00 +}; + +const u16 gUnknown_085A72F4[] = { + 0x04, 0x08, 0x10, 0x20, 0x10, 0x08, 0x10, 0x20, 0x40, 0x20 +}; + +const u16 Unknown_085A7308[] = { + 0x530e, 0x5b5f, 0x4b1f, 0x3a5b, + 0x210f, 0x3d27, 0x30e5, 0x28a3, + 0x1c82, 0x779b, 0x2f1f, 0x2e77, + 0x2d9f, 0x2118, 0x7fff, 0x0000 +}; + +const u16 Unknown_085A7328[] = { + 0x530e, 0x677f, 0x4a9b, 0x3a19, + 0x296f, 0x398c, 0x20e5, 0x29b4, + 0x1cc9, 0x6f39, 0x2f1f, 0x2e77, + 0x2d9f, 0x2118, 0x7fff, 0x0000 +}; + +const struct YesNoFuncTable gUnknown_085A7348 = { + sub_812A1C0, + sub_8129B34 +}; + +const struct YesNoFuncTable gUnknown_085A7350 = { + sub_812A210, + sub_8129B34 +}; + +const u8 Unknown_085A7358[] = INCBIN_U8("graphics/misc/decoration_unk_85a7358.4bpp"); + +const struct SpritePalette gUnknown_085A73D8 = { + Unknown_085A7308, 8 +}; + +const struct SpritePalette gUnknown_085A73E0 = { + Unknown_085A7328, 8 +}; + +const struct OamData Unknown_085A73E8 = { + .size = 1, .priority = 1 +}; + +const union AnimCmd Unknown_085A73F0[] = { + ANIMCMD_FRAME(0, 0, 0), + ANIMCMD_END +}; + +const union AnimCmd *const Unknown_085A73F8[] = { + Unknown_085A73F0 +}; + +const struct SpriteFrameImage Unknown_085A73FC = { + Unknown_085A7358, 0x80 +}; + +const struct SpriteTemplate gUnknown_085A7404 = { + 0xFFFF, + 8, + &Unknown_085A73E8, + Unknown_085A73F8, + &Unknown_085A73FC, + gDummySpriteAffineAnimTable, + sub_812A36C +}; + +const struct YesNoFuncTable gUnknown_085A741C = { + sub_812A478, + sub_8127A30 +}; + +// .text + +void sub_8126968(void) +{ + if (gUnknown_0203A173 < 8) + { + gUnknown_0203A14C = gDecorationInventories[gUnknown_0203A173].items; + } + if (gUnknown_0203A17C.isPlayerRoom == FALSE) + { + gUnknown_0203A17C.items = gSaveBlock1Ptr->secretBases[0].decorations; + gUnknown_0203A17C.pos = gSaveBlock1Ptr->secretBases[0].decorationPos; + } + if (gUnknown_0203A17C.isPlayerRoom == TRUE) + { + gUnknown_0203A17C.items = gSaveBlock1Ptr->playerRoomDecor; + gUnknown_0203A17C.pos = gSaveBlock1Ptr->playerRoomDecorPos; + } +} + +u8 sub_81269D4(u8 idx) +{ + u8 *winidx; + struct WindowTemplate template; + + winidx = &gUnknown_0203A188[idx]; + if (idx == 0) + { + template = gUnknown_085A6B90[0]; + template.width = GetMaxWidthInMenuTable(gUnknown_085A6B48, 4); + if (template.width > 18) + { + template.width = 18; + } + *winidx = AddWindow(&template); + } + else + { + *winidx = AddWindow(&gUnknown_085A6B90[idx]); + } + SetWindowBorderStyle(*winidx, 0, 0x214, 0xe); + schedule_bg_copy_tilemap_to_vram(0); + return *winidx; +} + +void sub_8126A58(u8 idx) +{ + sub_8198070(gUnknown_0203A188[idx], FALSE); + ClearWindowTilemap(gUnknown_0203A188[idx]); + RemoveWindow(gUnknown_0203A188[idx]); + schedule_bg_copy_tilemap_to_vram(0); +} + +void sub_8126A88(void) +{ + u8 idx; + + idx = sub_81269D4(0); + PrintMenuTable(idx, 4, gUnknown_085A6B48); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(idx, 4, gUnknown_0203A150); +} + +void sub_8126ABC(void) +{ + gUnknown_0203A150 = 0; + ScriptContext2_Enable(); + sub_8126A88(); + sub_8126C08(); +} + +void sub_8126AD8(u8 taskId) +{ + sub_8126ABC(); + gUnknown_0203A17C.items = gSaveBlock1Ptr->secretBases[0].decorations; + gUnknown_0203A17C.pos = gSaveBlock1Ptr->secretBases[0].decorationPos; + gUnknown_0203A17C.size = sizeof(gSaveBlock1Ptr->secretBases[0].decorations); + gUnknown_0203A17C.isPlayerRoom = FALSE; + gTasks[taskId].func = sub_8126B80; +} + +void sub_8126B2C(u8 taskId) +{ + sub_8126ABC(); + gUnknown_0203A17C.items = gSaveBlock1Ptr->playerRoomDecor; + gUnknown_0203A17C.pos = gSaveBlock1Ptr->playerRoomDecorPos; + gUnknown_0203A17C.size = sizeof(gSaveBlock1Ptr->playerRoomDecor); + gUnknown_0203A17C.isPlayerRoom = TRUE; + gTasks[taskId].func = sub_8126B80; +} + +void sub_8126B80(u8 taskId) +{ + u8 menuPos; + + if (!gPaletteFade.active) + { + menuPos = GetMenuCursorPos(); + switch (ProcessMenuInput()) + { + default: + PlaySE(SE_SELECT); + gUnknown_085A6B48[gUnknown_0203A150].func.void_u8(taskId); + break; + case -2: + gUnknown_0203A150 = GetMenuCursorPos(); + if ((s8)menuPos != gUnknown_0203A150) + { + sub_8126C08(); + } + break; + case -1: + PlaySE(SE_SELECT); + sub_8126D6C(taskId); + break; + } + } +} + +void sub_8126C08(void) +{ + FillWindowPixelBuffer(0, 0x11); + AddTextPrinterParametrized(0, 1, gUnknown_085A6B68[gUnknown_0203A150], 0, 0, 2, 1, 3); +} + +void sub_8126C48(u8 taskId) +{ + if (CountDecorations() == 0) + { + StringExpandPlaceholders(gStringVar4, gText_NoDecorations); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8126DA4); + } + else + { + gTasks[taskId].data[11] = 0; + gUnknown_0203A173 = DECORCAT_DESK; + sub_8126DCC(taskId); + } +} + +void sub_8126CA4(u8 taskId) +{ + if (!sub_81299AC(taskId)) + { + StringExpandPlaceholders(gStringVar4, gText_NoDecorationsInUse); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8126DA4); + } + else + { + sub_8126A58(0); + sub_8197434(0, 0); + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_8129ABC; + } +} + +void sub_8126D10(u8 taskId) +{ + if (CountDecorations() == 0) + { + StringExpandPlaceholders(gStringVar4, gText_NoDecorations); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8126DA4); + } + else + { + gTasks[taskId].data[11] = 1; + gUnknown_0203A173 = DECORCAT_DESK; + sub_8126DCC(taskId); + } +} + +void sub_8126D6C(u8 taskId) +{ + sub_8126A58(0); + if (!gUnknown_0203A17C.isPlayerRoom) + { + ScriptContext1_SetupScript(gUnknown_0823B4E8); + DestroyTask(taskId); + } + else + { + sub_816B060(taskId); + } +} + +void sub_8126DA4(u8 taskId) +{ + sub_8126C08(); + gTasks[taskId].func = sub_8126B80; +} + +void sub_8126DCC(u8 taskId) +{ + LoadPalette(gUnknown_085A6BB0, 0xd0, 0x20); + sub_8197434(0, 0); + sub_8126A58(0); + sub_8126DFC(taskId); +} + +void sub_8126DFC(u8 taskId) +{ + u8 winIdx; + + winIdx = sub_81269D4(1); + sub_8126E8C(taskId); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(winIdx, 9, gUnknown_0203A173); + gTasks[taskId].func = sub_8127088; +} + +void sub_8126E44(u8 taskId) +{ + FillWindowPixelBuffer(gUnknown_0203A188[1], 0x11); + sub_8126E8C(taskId); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(gUnknown_0203A188[1], 9, gUnknown_0203A173); + gTasks[taskId].func = sub_8127088; +} + +void sub_8126E8C(u8 taskId) +{ + s16 *data; + u8 r5; + bool8 r8; + u8 i; + bool8 fl; + + data = gTasks[taskId].data; + r5 = gUnknown_0203A188[1]; + fl = gUnknown_0203A17C.isPlayerRoom; + r8 = FALSE; + if (fl == TRUE && data[11] == 0) + { + r8 = TRUE; + } + for (i = 0; i < 8; i ++) + { + if (r8 == TRUE && i != DECORCAT_DOLL && i != DECORCAT_CUSHION) + { + sub_8126F68(r5, i, 8, i << 4, TRUE, 0xFF); + } + else + { + sub_8126F68(r5, i, 8, i << 4, FALSE, 0xFF); + } + } + PrintTextOnWindow(r5, 1, gTasks[taskId].data[11] == 2 ? gText_Exit : gText_Cancel, 8, (i << 4) + 1, 0, 0); + schedule_bg_copy_tilemap_to_vram(0); +} + +void sub_8126F68(u8 winid, u8 decorCat, u8 x, u8 y, bool8 flag, u8 speed) +{ + u8 width; + u8 *strbuf; + + width = x == 8 ? 0x68 : 0x60; + y ++; + sub_8127058(gStringVar4, flag); + strbuf = StringLength(gStringVar4) + gStringVar4; + StringCopy(strbuf, gUnknown_085A6B28[decorCat]); + PrintTextOnWindow(winid, 1, gStringVar4, x, y, speed, NULL); + strbuf = ConvertIntToDecimalStringN(strbuf, CountDecorationCategoryN(decorCat), STR_CONV_MODE_RIGHT_ALIGN, 2); + *strbuf++ = CHAR_SLASH; + ConvertIntToDecimalStringN(strbuf, gDecorationInventories[decorCat].size, STR_CONV_MODE_RIGHT_ALIGN, 2); + x = GetStringRightAlignXOffset(1, gStringVar4, width); + PrintTextOnWindow(winid, 1, gStringVar4, x, y, speed, NULL); +} + +void sub_8127058(u8 *str, bool8 flag) +{ + StringCopy(str, gText_Color161Shadow161); + if (flag == TRUE) + { + str[2] = 0x04; // RED + str[5] = 0x05; // LIGHT_RED + } + else + { + str[2] = 0x02; // DARK_GREY + str[5] = 0x03; // LIGHT_GREY + } +} + +void sub_8127088(u8 taskId) +{ + s8 input; + + if (!gPaletteFade.active) + { + input = ProcessMenuInput(); + switch (input) + { + case -1: + case 8: + PlaySE(SE_SELECT); + sub_812719C(taskId); + break; + case -2: + break; + default: + PlaySE(SE_SELECT); + gUnknown_0203A173 = input; + sub_81270E8(taskId); + break; + } + } +} + +void sub_81270E8(u8 taskId) +{ + gUnknown_0203A151 = CountDecorationCategoryN(gUnknown_0203A173); + if (gUnknown_0203A151 != 0) + { + CondenseDecorationCategoryN(gUnknown_0203A173); + gUnknown_0203A14C = gDecorationInventories[gUnknown_0203A173].items; + sub_81279B4(taskId); + gUnknown_0203A170 = 0; + gUnknown_0203A16E = 0; + gTasks[taskId].func = sub_8127620; + } + else + { + sub_8126A58(1); + StringExpandPlaceholders(gStringVar4, gText_NoDecorations); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8127180); + } +} + +void sub_8127180(u8 taskId) +{ + sub_8197434(0, 0); + sub_8126DFC(taskId); +} + +void sub_812719C(u8 taskId) +{ + if (gTasks[taskId].data[11] != 2) + { + sub_81271CC(taskId); + } + else + { + sub_8127268(taskId); + } +} + +void sub_81271CC(u8 taskId) +{ + sub_8126A58(1); + sub_8126A88(); + sub_81973C4(0, 0); + sub_8126C08(); + gTasks[taskId].func = sub_8126B80; +} + +void sub_8127208(u8 taskId) +{ + LoadPalette(gUnknown_085A6BB0, 0xd0, 0x20); + sub_8197434(0, 0); + gTasks[taskId].data[11] = 2; + gUnknown_0203A173 = DECORCAT_DESK; + sub_8126DFC(taskId); +} + +void sub_8127250(u8 *dest, u8 decorCat) +{ + StringCopy(dest, gUnknown_085A6B28[decorCat]); +} + +void sub_8127268(u8 taskId) +{ + sub_8126A58(1); + sub_8133E1C(taskId); +} + +void sub_8127284(void) +{ + gUnknown_0203A18C->unk_520 = gUnknown_0203A151 + 1; + if (gUnknown_0203A18C->unk_520 > 8) + { + gUnknown_0203A18C->unk_521 = 8; + } + else + { + gUnknown_0203A18C->unk_521 = gUnknown_0203A18C->unk_520; + } +} + +void sub_81272C8(void) +{ + sub_812225C(&gUnknown_0203A170, &gUnknown_0203A16E, gUnknown_0203A18C->unk_521, gUnknown_0203A18C->unk_520); +} + +void sub_81272F8(void) +{ + sub_8122298(&gUnknown_0203A170, &gUnknown_0203A16E, gUnknown_0203A18C->unk_521, gUnknown_0203A18C->unk_520, 8); +} + +void sub_8127330(u8 taskId) +{ + s16 *data; + u16 i; + + data = gTasks[taskId].data; + if ((gUnknown_0203A173 < DECORCAT_DOLL || gUnknown_0203A173 > DECORCAT_CUSHION) && gUnknown_0203A17C.isPlayerRoom == TRUE && data[11] == 0) + { + sub_8127058(gStringVar1, TRUE); + } + else + { + sub_8127058(gStringVar1, FALSE); + } + for (i = 0; i < gUnknown_0203A18C->unk_520 - 1; i ++) + { + sub_8127454(gUnknown_0203A18C->unk_148[i], gUnknown_0203A14C[i]); + gUnknown_0203A18C->unk_000[i].unk_00 = gUnknown_0203A18C->unk_148[i]; + gUnknown_0203A18C->unk_000[i].unk_04 = i; + } + StringCopy(gUnknown_0203A18C->unk_148[i], gText_Cancel); + gUnknown_0203A18C->unk_000[i].unk_00 = gUnknown_0203A18C->unk_148[i]; + gUnknown_0203A18C->unk_000[i].unk_04 = -2; + gUnknown_03006310 = gUnknown_085A6BD0; + gUnknown_03006310.unk_10 = gUnknown_0203A188[1]; + gUnknown_03006310.unk_0c = gUnknown_0203A18C->unk_520; + gUnknown_03006310.unk_00 = gUnknown_0203A18C->unk_000; + gUnknown_03006310.unk_0e = gUnknown_0203A18C->unk_521; +} + +void sub_8127454(u8 *dest, u16 decorId) +{ + StringCopy(dest, gStringVar1); + StringAppend(dest, gDecorations[decorId].name); +} + +void sub_8127480(u32 a0, bool8 flag, struct ListMenu *menu) +{ + if (flag != TRUE) + { + PlaySE(SE_SELECT); + } + sub_8127744(a0); +} + +void sub_81274A0(u8 a0, s32 a1, u8 a2) +{ + if (a1 != -2) + { + if (sub_81277BC(a1 + 1) == TRUE) + { + blit_move_info_icon(a0, 0x18, 0x5c, a2 + 2); + } + else if (sub_81277E8(a1 + 1) == TRUE) + { + blit_move_info_icon(a0, 0x19, 0x5c, a2 + 2); + } + } +} + +void sub_8127500(void) +{ + if (gUnknown_0203A18C->unk_522 == 0xFF) + { + gUnknown_0203A18C->unk_522 = AddScrollIndicatorArrowPairParametrized(0x02, 0x3c, 0x0c, 0x94, gUnknown_0203A18C->unk_520 - gUnknown_0203A18C->unk_521, 0x6e, 0x6e, &gUnknown_0203A170); + } +} + +void sub_8127554(void) +{ + if (gUnknown_0203A18C->unk_522 != 0xFF) + { + RemoveScrollIndicatorArrowPair(gUnknown_0203A18C->unk_522); + gUnknown_0203A18C->unk_522 = 0xFF; + } +} + +void sub_8127580(u8 taskId) +{ + sub_81269D4(1); + sub_812759C(taskId); +} + +void sub_812759C(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + sub_81269D4(3); + sub_8127718(gUnknown_0203A173); + gUnknown_0203A18C = calloc(1, sizeof(struct UnkStruct_0203A18C)); + gUnknown_0203A18C->unk_522 = 0xFF; + sub_8127284(); + sub_81272C8(); + sub_81272F8(); + sub_8127330(taskId); + data[13] = ListMenuInit(&gUnknown_03006310, gUnknown_0203A170, gUnknown_0203A16E); + sub_8127500(); +} + +void sub_8127620(u8 taskId) +{ + sub_812759C(taskId); + gTasks[taskId].func = sub_812764C; +} + +void sub_812764C(u8 taskId) +{ + s16 *data; + s32 input; + + data = gTasks[taskId].data; + if (!gPaletteFade.active) + { + input = ListMenuHandleInput(data[13]); + get_coro_args_x18_x1A(data[13], &gUnknown_0203A170, &gUnknown_0203A16E); + switch (input) + { + case -1: + break; + case -2: + PlaySE(SE_SELECT); + gUnknown_085A6B78[data[11]][1](taskId); + break; + default: + PlaySE(SE_SELECT); + gUnknown_0203A172 = input; + sub_8127554(); + sub_81AE6C8(data[13], &gUnknown_0203A170, &gUnknown_0203A16E); + sub_8126A58(1); + sub_81277A8(); + free(gUnknown_0203A18C); + gUnknown_085A6B78[data[11]][0](taskId); + break; + } + } +} + +void sub_8127718(u8 decorCat) +{ + sub_8126F68(sub_81269D4(2), decorCat, 0, 0, 0, 0); +} + +void sub_8127744(u32 a0) +{ + u8 winidx; + const u8 *txt; + + winidx = gUnknown_0203A188[3]; + FillWindowPixelBuffer(winidx, 0x11); + if (a0 >= gUnknown_0203A151) + { + txt = gText_GoBackPrevMenu; + } + else + { + txt = gDecorations[gUnknown_0203A14C[a0]].description; + } + PrintTextOnWindow(winidx, 1, txt, 0, 1, 0, 0); +} + +void sub_81277A8(void) +{ + sub_8126A58(3); + sub_8126A58(2); +} + +bool8 sub_81277BC(u8 idx) +{ + u8 i; + + for (i = 0; i < 16; i ++) + { + if (gUnknown_0203A152[i] == idx) + { + return TRUE; + } + } + return FALSE; +} + +bool8 sub_81277E8(u8 idx) +{ + u8 i; + + for (i = 0; i < 12; i ++) + { + if (gUnknown_0203A162[i] == idx) + { + return TRUE; + } + } + return FALSE; +} + +void sub_8127814(u8 taskId) +{ + u16 i; + u16 j; + u16 k; + u16 cnt; + + cnt = 0; + memset(gUnknown_0203A152, 0, 16); + memset(gUnknown_0203A162, 0, 12); + for (i = 0; i < 16; i ++) + { + if (gSaveBlock1Ptr->secretBases[0].decorations[i] != DECOR_NONE) + { + for (j = 0; j < gDecorationInventories[gUnknown_0203A173].size; j ++) + { + if (gUnknown_0203A14C[j] == gSaveBlock1Ptr->secretBases[0].decorations[i]) + { + for (k = 0; k < cnt && gUnknown_0203A152[k] != j + 1; k ++); + if (k == cnt) + { + gUnknown_0203A152[cnt] = j + 1; + cnt ++; + break; + } + } + } + } + } + cnt = 0; + for (i = 0; i < 12; i ++) + { + if (gSaveBlock1Ptr->playerRoomDecor[i] != DECOR_NONE) + { + for (j = 0; j < gDecorationInventories[gUnknown_0203A173].size; j ++) + { + if (gUnknown_0203A14C[j] == gSaveBlock1Ptr->playerRoomDecor[i] && sub_81277BC(j + 1) != TRUE) + { + for (k = 0; k < cnt && gUnknown_0203A162[k] != j + 1; k ++); + if (k == cnt) + { + gUnknown_0203A162[cnt] = j + 1; + cnt ++; + break; + } + } + } + } + } +} + +void sub_81279B4(u8 taskId) +{ + sub_8127814(taskId); +} + +bool8 sub_81279C4(void) +{ + u16 i; + for (i = 0; i < 16; i ++) + { + if (gUnknown_0203A152[i] == gUnknown_0203A170 + gUnknown_0203A16E + 1) + { + return FALSE; + } + if (i < 12 && gUnknown_0203A162[i] == gUnknown_0203A170 + gUnknown_0203A16E + 1) + { + return FALSE; + } + } + return TRUE; +} + +void sub_8127A14(u8 taskId) +{ + sub_81269D4(1); + sub_8127620(taskId); +} + +void sub_8127A30(u8 taskId) +{ + sub_8197434(0, 0); + gTasks[taskId].func = sub_8127A14; +} + +void sub_8127A5C(u8 taskId) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + sub_8197434(0, 0); + sub_81269D4(1); + sub_8127620(taskId); + } +} + +void sub_8127A8C(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + sub_8127554(); + sub_81277A8(); + sub_81AE6C8(data[13], NULL, NULL); + free(gUnknown_0203A18C); + sub_8126E44(taskId); +} + +void sub_8127ACC(u8 taskId) +{ + gTasks[taskId].data[3] = gSaveBlock1Ptr->pos.x; + gTasks[taskId].data[4] = gSaveBlock1Ptr->pos.y; + PlayerGetDestCoords(&gTasks[taskId].data[0], &gTasks[taskId].data[1]); +} + +void sub_8127B04(u8 taskId) +{ + DrawWholeMapView(); + Overworld_SetWarpDestination(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1, gTasks[taskId].data[3], gTasks[taskId].data[4]); + warp_in(); +} + +u16 sub_8127B54(u8 decor, u8 a1) +{ + u16 resp; + + resp = -1; + switch (decor) + { + case DECOR_STAND: + resp = gUnknown_085A72E4[a1] << 12; + return resp; + case DECOR_SLIDE: + resp = gUnknown_085A72EC[a1] << 12; + return resp; + default: + return resp; + } +} + +void sub_8127B90(u16 mapX, u16 mapY, u8 decWidth, u8 decHeight, u16 decor) +{ + u16 i; + u16 j; + u16 behavior; + u16 flags; + u16 v0; + u16 v1; + s16 decLeft; + s16 decBottom; + + for (i = 0; i < decHeight; i ++) + { + decBottom = mapY - decHeight + 1 + i; + for (j = 0; j < decWidth; j ++) + { + decLeft = mapX + j; + behavior = GetBehaviorByMetatileId(0x200 + gDecorations[decor].tiles[i * decWidth + j]); + if (MetatileBehavior_IsMB_B9(behavior) == TRUE || (gDecorations[decor].permission != DECORPERM_PASS_FLOOR && (behavior >> 12))) + { + flags = 0xc00; + } + else + { + flags = 0x000; + } + if (gDecorations[decor].permission != DECORPERM_NA_WALL && MetatileBehavior_IsMB_B7(MapGridGetMetatileBehaviorAt(decLeft, decBottom)) == TRUE) + { + v0 = 1; + } + else + { + v0 = 0; + } + v1 = sub_8127B54(gDecorations[decor].id, i * decWidth + j); + if (v1 != 0xFFFF) + { + MapGridSetMetatileEntryAt(decLeft, decBottom, (gDecorations[decor].tiles[i * decWidth + j] + (0x200 | v0)) | flags | v1); + } + else + { + MapGridSetMetatileIdAt(decLeft, decBottom, (gDecorations[decor].tiles[i * decWidth + j] + (0x200 | v0)) | flags); + } + } + } +} + +void sub_8127D38(u16 mapX, u16 mapY, u16 decor) +{ + switch (gDecorations[decor].shape) + { + case DECORSHAPE_1x1: + sub_8127B90(mapX, mapY, 1, 1, decor); + break; + case DECORSHAPE_2x1: + sub_8127B90(mapX, mapY, 2, 1, decor); + break; + case DECORSHAPE_3x1: // unused + sub_8127B90(mapX, mapY, 3, 1, decor); + break; + case DECORSHAPE_4x2: + sub_8127B90(mapX, mapY, 4, 2, decor); + break; + case DECORSHAPE_2x2: + sub_8127B90(mapX, mapY, 2, 2, decor); + break; + case DECORSHAPE_1x2: + sub_8127B90(mapX, mapY, 1, 2, decor); + break; + case DECORSHAPE_1x3: // unused + sub_8127B90(mapX, mapY, 1, 3, decor); + break; + case DECORSHAPE_2x4: + sub_8127B90(mapX, mapY, 2, 4, decor); + break; + case DECORSHAPE_3x3: + sub_8127B90(mapX, mapY, 3, 3, decor); + break; + case DECORSHAPE_3x2: + sub_8127B90(mapX, mapY, 3, 2, decor); + break; + } +} + +void sub_8127E18(void) +{ + u8 i; + u8 j; + + for (i = 0; i < 14; i ++) + { + if (FlagGet(0xAE + i) == TRUE) + { + FlagClear(0xAE + i); + for (j = 0; j < gMapHeader.events->mapObjectCount; j ++) + { + if (gMapHeader.events->mapObjects[j].flagId == 0xAE + i) + { + break; + } + } + VarSet(0x3F20 + gMapHeader.events->mapObjects[j].graphicsId, gUnknown_0203A190.decoration->tiles[0]); + gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId; + gSpecialVar_0x8006 = gUnknown_0203AA34; + gSpecialVar_0x8007 = gUnknown_0203AA36; + show_sprite(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + sub_808EBA8(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); + sub_808F254(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + break; + } + } +} + +bool8 sub_8127F38(void) +{ + u16 i; + + for (i = 0; i < gUnknown_0203A17C.size; i ++) + { + if (gUnknown_0203A17C.items[i] == DECOR_NONE) + { + return TRUE; + } + } + return FALSE; +} + +void sub_8127F68(u8 taskId) +{ + if (gUnknown_0203A17C.isPlayerRoom == TRUE && gUnknown_0203A173 != DECORCAT_DOLL && gUnknown_0203A173 != DECORCAT_CUSHION) + { + StringExpandPlaceholders(gStringVar4, gText_CantPlaceInRoom); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8127A5C); + } + else if (sub_81279C4() == TRUE) + { + if (sub_8127F38() == TRUE) + { + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_8128060; + } + else + { + ConvertIntToDecimalStringN(gStringVar1, gUnknown_0203A17C.size, STR_CONV_MODE_RIGHT_ALIGN, 2); + if (gUnknown_0203A17C.isPlayerRoom == FALSE) { + StringExpandPlaceholders(gStringVar4, gText_NoMoreDecorations); + } + else + { + StringExpandPlaceholders(gStringVar4, gText_NoMoreDecorations2); + } + DisplayItemMessageOnField(taskId, gStringVar4, sub_8127A5C); + } + } + else + { + StringExpandPlaceholders(gStringVar4, gText_InUseAlready); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8127A5C); + } +} + +void sub_8128060(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + if (!gPaletteFade.active) + { + sub_8127ACC(taskId); + gTasks[taskId].data[2] = 1; + } + break; + case 1: + gPaletteFade.bufferTransferDisabled = TRUE; + ConfigureCameraObjectForPlacingDecoration(&gUnknown_0203A190, gUnknown_0203A14C[gUnknown_0203A172]); + sub_812826C(taskId); + SetUpPlacingDecorationPlayerAvatar(taskId, &gUnknown_0203A190); + pal_fill_black(); + gPaletteFade.bufferTransferDisabled = FALSE; + gTasks[taskId].data[2] = 2; + break; + case 2: + if (sub_80ABDFC() == TRUE) + { + gTasks[taskId].data[12] = 0; + sub_8128FD8(taskId); + } + break; + } +} + +void ConfigureCameraObjectForPlacingDecoration(struct UnkStruct_0203A190 *data, u8 decor) +{ + gUnknown_0203AA38 = gSprites[gUnknown_03005DD0.unk4].data0; + gUnknown_03005DD0.unk4 = gpu_pal_decompress_alloc_tag_and_upload(data, decor); + gSprites[gUnknown_03005DD0.unk4].oam.priority = 1; + gSprites[gUnknown_03005DD0.unk4].callback = sub_81292D0; + gSprites[gUnknown_03005DD0.unk4].pos1.x = gUnknown_085A7250[data->decoration->shape].x; + gSprites[gUnknown_03005DD0.unk4].pos1.y = gUnknown_085A7250[data->decoration->shape].y; +} + +void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_0203A190 *data) +{ + u8 v0; + + v0 = 16 * (u8)gTasks[taskId].data[5] + gUnknown_085A7250[data->decoration->shape].x - 8 * ((u8)gTasks[taskId].data[5] - 1); + if (data->decoration->shape == DECORSHAPE_3x1 || data->decoration->shape == DECORSHAPE_3x3 || data->decoration->shape == DECORSHAPE_3x2) + { + v0 -= 8; + } + if (gSaveBlock2Ptr->playerGender == MALE) + { + gUnknown_0203AA39 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, v0, 0x48, 0); + } + else + { + gUnknown_0203AA39 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, v0, 0x48, 0); + } + gSprites[gUnknown_0203AA39].oam.priority = 1; + DestroySprite(&gSprites[gUnknown_0203AA38]); + gUnknown_0203AA38 = gUnknown_03005DD0.unk4; +} + +void sub_812826C(u8 taskId) +{ + switch (gDecorations[gUnknown_0203A14C[gUnknown_0203A172]].shape) + { + case DECORSHAPE_1x1: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_2x1: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_3x1: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 1; + break; + case DECORSHAPE_4x2: + gTasks[taskId].data[5] = 4; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_2x2: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_1x2: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 2; + break; + case DECORSHAPE_1x3: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 3; + gTasks[taskId].data[1]++; + break; + case DECORSHAPE_2x4: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 4; + break; + case DECORSHAPE_3x3: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 3; + break; + case DECORSHAPE_3x2: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 2; + break; + } +} + +void sub_81283BC(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_0203AA38].data7 = 1; + gSprites[gUnknown_0203AA39].data7 = 1; + sub_8128DE0(); + sub_8128950(taskId); +} + +void sub_8128414(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_0203AA38].data7 = 1; + gSprites[gUnknown_0203AA39].data7 = 1; + sub_8128DE0(); + StringExpandPlaceholders(gStringVar4, gText_CancelDecorating); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8128B80); +} + +bool8 sub_8128484(u8 behaviorAt, u16 behaviorBy) +{ + if (MetatileBehavior_IsMB_B3(behaviorAt) != TRUE || behaviorBy != 0) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_81284AC(u8 taskId, s16 x, s16 y, u16 decor) +{ + if (x == gTasks[taskId].data[3] + 7 && y == gTasks[taskId].data[4] + 7 && decor != DECOR_NONE) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_81284F4(u16 behaviorAt, const struct Decoration *decoration) +{ + if (MetatileBehavior_IsMB_B3(behaviorAt) != TRUE) + { + if (decoration->id == DECOR_SOLID_BOARD && MetatileBehavior_IsMB_C2(behaviorAt) == TRUE) + { + return TRUE; + } + if (MetatileBehavior_IsNormal(behaviorAt)) + { + return TRUE; + } + } + return FALSE; +} + +bool8 sub_812853C(u8 taskId, const struct Decoration *decoration) +{ + u8 i; + u8 j; + u8 behaviorAt; + u16 behaviorBy; + u8 mapY; + u8 mapX; + s16 curY; + s16 curX; + mapY = gTasks[taskId].data[6]; + mapX = gTasks[taskId].data[5]; + + switch (decoration->permission) + { + case DECORPERM_SOLID_FLOOR: + case DECORPERM_PASS_FLOOR: + for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; + if (!sub_81284F4(behaviorAt, decoration)) + { + return FALSE; + } + if (!sub_81284AC(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + if (behaviorAt != 0 && behaviorAt != 16) + { + return FALSE; + } + } + } + break; + case DECORPERM_BEHIND_FLOOR: + for (i=0; itiles[(mapY - 1 - i) * mapX + j]) & 0xf000; + if (!MetatileBehavior_IsNormal(behaviorAt) && !sub_8128484(behaviorAt, behaviorBy)) + { + return FALSE; + } + if (!sub_81284AC(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + { + return FALSE; + } + } + } + curY = gTasks[taskId].data[1] - mapY + 1; + for (j=0; jtiles[j]) & 0xf000; + if (!MetatileBehavior_IsNormal(behaviorAt) && !MetatileBehavior_IsMB_B7(behaviorAt)) + { + return FALSE; + } + if (!sub_81284AC(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + behaviorAt = GetFieldObjectIdByXYZ(curX, curY, 0); + if (behaviorAt != 0 && behaviorAt != 16) + { + return FALSE; + } + } + break; + case DECORPERM_NA_WALL: + for (i=0; ishape == DECORSHAPE_1x2) + { + if (!MetatileBehavior_IsMB_C3(behaviorAt)) + { + return FALSE; + } + } + else if (!MetatileBehavior_IsMB_B5(behaviorAt)) + { + if (!MetatileBehavior_IsMB_C3(behaviorAt)) + { + return FALSE; + } + } + if (GetFieldObjectIdByXYZ(curX, curY, 0) != 16) + { + return FALSE; + } + } + break; + } + return TRUE; +} + +void sub_8128950(u8 taskId) +{ + if (sub_812853C(taskId, &gDecorations[gUnknown_0203A14C[gUnknown_0203A172]]) == TRUE) + { + StringExpandPlaceholders(gStringVar4, gText_PlaceItHere); + DisplayItemMessageOnField(taskId, gStringVar4, sub_81289D0); + } + else + { + PlaySE(SE_HAZURE); + StringExpandPlaceholders(gStringVar4, gText_CantBePlacedHere); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8129020); + } +} + +void sub_81289D0(u8 taskId) +{ + sub_8197930(); + sub_8121F68(taskId, &gUnknown_085A72C4); +} + +void sub_81289F0(u8 taskId) +{ + sub_8197434(0, 0); + sub_8128AAC(taskId); + if (gDecorations[gUnknown_0203A14C[gUnknown_0203A172]].permission != DECORPERM_SOLID_MAT) + { + sub_8127D38(gTasks[taskId].data[0], gTasks[taskId].data[1], gUnknown_0203A14C[gUnknown_0203A172]); + } + else + { + gUnknown_0203AA34 = gTasks[taskId].data[0] - 7; + gUnknown_0203AA36 = gTasks[taskId].data[1] - 7; + ScriptContext1_SetupScript(gUnknown_08275D1F); + } + gSprites[gUnknown_0203AA38].pos1.y += 2; + if (gMapHeader.regionMapSectionId == REGION_MAP_SECRET_BASE) + { + TV_PutSecretBaseVisitOnTheAir(); + } + sub_8128BBC(taskId); +} + +void sub_8128AAC(u8 taskId) +{ + u16 i; + + for (i = 0; i < gUnknown_0203A17C.size; i ++) + { + if (gUnknown_0203A17C.items[i] == DECOR_NONE) + { + gUnknown_0203A17C.items[i] = gUnknown_0203A14C[gUnknown_0203A172]; + gUnknown_0203A17C.pos[i] = ((gTasks[taskId].data[0] - 7) << 4) + (gTasks[taskId].data[1] - 7); + break; + } + } + if (!gUnknown_0203A17C.isPlayerRoom) + { + for (i = 0; i < 16; i ++) + { + if (gUnknown_0203A152[i] == 0) + { + gUnknown_0203A152[i] = gUnknown_0203A172 + 1; + break; + } + } + } + else + { + for (i = 0; i < 12; i ++) + { + if (gUnknown_0203A162[i] == 0) + { + gUnknown_0203A162[i] = gUnknown_0203A172 + 1; + break; + } + } + } +} + +void sub_8128B80(u8 taskId) +{ + sub_8197930(); + sub_8121F68(taskId, &gUnknown_085A72CC); +} + +void sub_8128BA0(u8 taskId) +{ + sub_8197434(0, 0); + sub_8128BBC(taskId); +} + +void sub_8128BBC(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = c1_overworld_prev_quest; +} + +void c1_overworld_prev_quest(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + ScriptContext2_Enable(); + if (!gPaletteFade.active) + { + sub_8127B04(taskId); + gTasks[taskId].data[2] = 1; + } + break; + case 1: + sub_812A3C8(); + FreeSpritePaletteByTag(0xbe5); + gFieldCallback = sub_8128CD4; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + break; + } +} + +void sub_8128C64(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + switch (data[2]) + { + case 0: + sub_80E9578(); + data[2] ++; + break; + case 1: + ScriptContext1_SetupScript(gUnknown_08275D0C); + data[2] ++; + break; + case 2: + ScriptContext2_Enable(); + data[2] ++; + break; + case 3: + if (sub_80ABDFC() == TRUE) + { + gTasks[taskId].func = sub_812764C; + } + break; + } +} + +void sub_8128CD4(void) +{ + u8 taskId; + + ScriptContext2_Enable(); + pal_fill_black(); + taskId = CreateTask(sub_8128C64, 8); + sub_8127580(taskId); + gTasks[taskId].data[2] = 0; +} + +bool8 sub_8128D10(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + if (gUnknown_0203AA3A == DIR_SOUTH && data[1] - data[6] - 6 < 0) + { + data[1] ++; + return FALSE; + } + if (gUnknown_0203AA3A == DIR_NORTH && data[1] - 7 >= gMapHeader.mapData->height) + { + data[1] --; + return FALSE; + } + if (gUnknown_0203AA3A == DIR_WEST && data[0] - 7 < 0) + { + data[0] ++; + return FALSE; + } + if (gUnknown_0203AA3A == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) + { + data[0] --; + return FALSE; + } + return TRUE; +} + +bool8 sub_8128DB4(void) +{ + u16 heldKeys; + + heldKeys = gMain.heldKeys & 0x0F0; + if (heldKeys != DPAD_UP && heldKeys != DPAD_DOWN && heldKeys != DPAD_LEFT && heldKeys != DPAD_RIGHT) + { + return FALSE; + } + return TRUE; +} + +void sub_8128DE0(void) +{ + gUnknown_0203AA3A = 0; + gSprites[gUnknown_0203AA38].data2 = 0; + gSprites[gUnknown_0203AA38].data3 = 0; +} + +void sub_8128E18(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + if (!gSprites[gUnknown_0203AA38].data4) + { + if (data[10] == 1) + { + gUnknown_085A72D4[data[12]].yesFunc(taskId); + return; + } else if (data[10] == 2) + { + gUnknown_085A72D4[data[12]].noFunc(taskId); + return; + } + if ((gMain.heldKeys & 0x0F0) == DPAD_UP) + { + gUnknown_0203AA3A = DIR_SOUTH; + gSprites[gUnknown_0203AA38].data2 = 0; + gSprites[gUnknown_0203AA38].data3 = -2; + data[1]--; + } + if ((gMain.heldKeys & 0x0F0) == DPAD_DOWN) + { + gUnknown_0203AA3A = DIR_NORTH; + gSprites[gUnknown_0203AA38].data2 = 0; + gSprites[gUnknown_0203AA38].data3 = 2; + data[1]++; + } + if ((gMain.heldKeys & 0x0F0) == DPAD_LEFT) + { + gUnknown_0203AA3A = DIR_WEST; + gSprites[gUnknown_0203AA38].data2 = -2; + gSprites[gUnknown_0203AA38].data3 = 0; + data[0]--; + } + if ((gMain.heldKeys & 0x0F0) == DPAD_RIGHT) + { + gUnknown_0203AA3A = DIR_EAST; + gSprites[gUnknown_0203AA38].data2 = 2; + gSprites[gUnknown_0203AA38].data3 = 0; + data[0]++; + } + if (!sub_8128DB4() || !sub_8128D10(taskId)) + { + sub_8128DE0(); + } + } + if (gUnknown_0203AA3A) + { + gSprites[gUnknown_0203AA38].data4++; + gSprites[gUnknown_0203AA38].data4 &= 7; + } + if (!data[10]) + { + if (gMain.newKeys & A_BUTTON) + { + data[10] = A_BUTTON; + } + if (gMain.newKeys & B_BUTTON) + { + data[10] = B_BUTTON; + } + } +} + +void sub_8128FD8(u8 taskId) +{ + sub_8197434(0, 1); + gSprites[gUnknown_0203AA38].data7 = 0; + gTasks[taskId].data[10] = 0; + gTasks[taskId].func = sub_8128E18; +} + +void sub_8129020(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + sub_8128FD8(taskId); + } +} + +void sub_8129048(struct UnkStruct_0203A190 *data) +{ + CpuFill16(0, data, sizeof(*data)); +} + +void sub_8129068(u16 *dest, u16 pal) +{ + CpuFastCopy(&((u16 *)gTilesetPointer_SecretBase->palettes)[pal << 4], dest, 32); +} + +void sub_8129088(u8 *dest, u16 tile) +{ + u8 buffer[32]; + u16 mode; + u16 i; + + mode = tile >> 10; + if (tile != 0) + { + tile &= 0x03FF; + } + CpuFastCopy(&((u8 *)gTilesetPointer_SecretBase->tiles)[tile << 5], buffer, 32); + switch (mode) + { + case 0: + CpuFastCopy(buffer, dest, 32); + break; + case 1: + for (i = 0; i < 8; i ++) + { + dest[4 * i] = (buffer[4 * (i + 1) - 1] >> 4) + ((buffer[4 * (i + 1) - 1] & 0x0F) << 4); + dest[4 * i + 1] = (buffer[4 * (i + 1) - 2] >> 4) + ((buffer[4 * (i + 1) - 2] & 0x0F) << 4); + dest[4 * i + 2] = (buffer[4 * (i + 1) - 3] >> 4) + ((buffer[4 * (i + 1) - 3] & 0x0F) << 4); + dest[4 * i + 3] = (buffer[4 * (i + 1) - 4] >> 4) + ((buffer[4 * (i + 1) - 4] & 0x0F) << 4); + } + break; + case 2: + for (i = 0; i < 8; i ++) + { + dest[4 * i] = buffer[4 * (7 - i)]; + dest[4 * i + 1] = buffer[4 * (7 - i) + 1]; + dest[4 * i + 2] = buffer[4 * (7 - i) + 2]; + dest[4 * i + 3] = buffer[4 * (7 - i) + 3]; + } + break; + case 3: + for (i = 0; i < 32; i ++) + { + dest[i] = (buffer[31 - i] >> 4) + ((buffer[31 - i] & 0x0F) << 4); + } + break; + } +} + +void sub_81291A4(struct UnkStruct_0203A190 *data) +{ + u16 i; + for (i = 0; i < 64; i ++) + { + sub_8129088(&data->image[i * 32], data->tiles[i]); + } +} + +u16 sub_81291CC(u16 tile) +{ + return ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[tile] & 0xFFF; +} + +void sub_81291E8(struct UnkStruct_0203A190 *data) +{ + u8 i; + u8 shape; + + shape = data->decoration->shape; + for (i = 0; i < gUnknown_085A71B0[shape].size; i ++) + { + data->tiles[gUnknown_085A71B0[shape].tiles[i]] = sub_81291CC(data->decoration->tiles[gUnknown_085A71B0[shape].y[i]] * 8 + gUnknown_085A71B0[shape].x[i]); + } +} + +void sub_812925C(u8 decoShape) +{ + gUnknown_0203AA3C.y = 0; + gUnknown_0203AA3C.affineMode = ST_OAM_AFFINE_OFF; + gUnknown_0203AA3C.objMode = ST_OAM_OBJ_NORMAL; + gUnknown_0203AA3C.mosaic = 0; + gUnknown_0203AA3C.bpp = ST_OAM_4BPP; + gUnknown_0203AA3C.shape = gUnknown_085A7250[decoShape].shape; + gUnknown_0203AA3C.x = 0; + gUnknown_0203AA3C.matrixNum = 0; + gUnknown_0203AA3C.size = gUnknown_085A7250[decoShape].size; + gUnknown_0203AA3C.tileNum = 0; + gUnknown_0203AA3C.priority = 0; + gUnknown_0203AA3C.paletteNum = 0; +} + +void sub_81292D0(struct Sprite *sprite) +{ + sprite->data2 = 0; + sprite->data3 = 0; + sprite->data4 = 0; + sprite->data5 = 0; + sprite->data6 = 0; + sprite->data7 = 0; + sprite->callback = sub_81292E8; +} + +void sub_81292E8(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data6 < 15) + { + sprite->invisible = FALSE; + } + else + { + sprite->invisible = TRUE; + } + sprite->data6 ++; + sprite->data6 &= 0x1F; + } + else + { + sprite->invisible = FALSE; + } +} + +u8 gpu_pal_decompress_alloc_tag_and_upload(struct UnkStruct_0203A190 *data, u8 decor) +{ + sub_8129048(data); + data->decoration = &gDecorations[decor]; + if (data->decoration->permission == DECORPERM_SOLID_MAT) + { + return AddPseudoFieldObject(data->decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); + } + FreeSpritePaletteByTag(0xBE5); + sub_81291E8(data); + sub_812925C(data->decoration->shape); + sub_81291A4(data); + sub_8129068(data->palette, ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[(data->decoration->tiles[0] * 8) + 7] >> 12); + LoadSpritePalette(&gUnknown_085A72BC); + return CreateSprite(&gUnknown_085A728C, 0, 0, 0); +} + +u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor) +{ + struct SpriteSheet sheet; + struct CompressedSpritePalette palette; + struct SpriteTemplate *template; + u8 spriteId; + + if (!AllocItemIconTemporaryBuffers()) + { + return MAX_SPRITES; + } + LZDecompressWram(GetDecorationIconPicOrPalette(decor, 0), gUnknown_0203CEBC); + CopyItemIconPicTo4x4Buffer(gUnknown_0203CEBC, gUnknown_0203CEC0); + sheet.data = gUnknown_0203CEC0; + sheet.size = 0x200; + sheet.tag = tilesTag; + LoadSpriteSheet(&sheet); + palette.data = GetDecorationIconPicOrPalette(decor, 1); + palette.tag = paletteTag; + LoadCompressedObjectPalette(&palette); + template = malloc(sizeof(struct SpriteTemplate)); + *template = gUnknown_08614FF4; + template->tileTag = tilesTag; + template->paletteTag = paletteTag; + spriteId = CreateSprite(template, 0, 0, 0); + FreeItemIconTemporaryBuffers(); + free(template); + return spriteId; +} + +const u8 *GetDecorationIconPicOrPalette(u16 decor, u8 mode) +{ + if (decor > 120) + { + decor = DECOR_NONE; + } + return gUnknown_085A6BE8[decor][mode]; +} + +u8 AddDecorationIconObjectFromFieldObject(u16 tilesTag, u16 paletteTag, u8 decor) +{ + u8 spriteId; + struct SpriteSheet sheet; + struct SpritePalette palette; + struct SpriteTemplate *template; + + sub_8129048(&gUnknown_0203A190); + gUnknown_0203A190.decoration = &gDecorations[decor]; + if (gUnknown_0203A190.decoration->permission != DECORPERM_SOLID_MAT) + { + sub_81291E8(&gUnknown_0203A190); + sub_812925C(gUnknown_0203A190.decoration->shape); + sub_81291A4(&gUnknown_0203A190); + sub_8129068(gUnknown_0203A190.palette, ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[(gUnknown_0203A190.decoration->tiles[0] * 8) + 7] >> 12); + sheet.data = gUnknown_0203A190.image; + sheet.size = gUnknown_085A72F4[gUnknown_0203A190.decoration->shape] << 5; + sheet.tag = tilesTag; + LoadSpriteSheet(&sheet); + palette.data = gUnknown_0203A190.palette; + palette.tag = paletteTag; + LoadSpritePalette(&palette); + template = Alloc(sizeof(struct SpriteTemplate)); + *template = gUnknown_085A72A4; + template->tileTag = tilesTag; + template->paletteTag = paletteTag; + spriteId = CreateSprite(template, 0, 0, 0); + free(template); + } + else + { + spriteId = AddPseudoFieldObject(gUnknown_0203A190.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); + } + return spriteId; +} + +u8 AddDecorationIconObject(u8 decor, s16 x, s16 y, u8 priority, u16 tilesTag, u16 paletteTag) +{ + u8 spriteId; + + if (decor > 120) + { + spriteId = AddDecorationIconObjectFromIconTable(tilesTag, paletteTag, DECOR_NONE); + if (spriteId == MAX_SPRITES) + { + return MAX_SPRITES; + } + gSprites[spriteId].pos2.x = x + 4; + gSprites[spriteId].pos2.y = y + 4; + } + else if (gUnknown_085A6BE8[decor][0] == NULL) + { + spriteId = AddDecorationIconObjectFromFieldObject(tilesTag, paletteTag, decor); + if (spriteId == MAX_SPRITES) + { + return MAX_SPRITES; + } + gSprites[spriteId].pos2.x = x; + if (decor == DECOR_SILVER_SHIELD || decor == DECOR_GOLD_SHIELD) + { + gSprites[spriteId].pos2.y = y - 4; + } + else + { + gSprites[spriteId].pos2.y = y; + } + } + else + { + spriteId = AddDecorationIconObjectFromIconTable(tilesTag, paletteTag, decor); + if (spriteId == MAX_SPRITES) + { + return MAX_SPRITES; + } + gSprites[spriteId].pos2.x = x + 4; + gSprites[spriteId].pos2.y = y + 4; + } + gSprites[spriteId].oam.priority = priority; + return spriteId; +} + +void sub_81296EC(u8 idx) +{ + gUnknown_0203A17C.items[idx] = 0; + gUnknown_0203A17C.pos[idx] = 0; +} + +void sub_8129708(void) +{ + u16 i; + + gSpecialVar_0x8005 = 0; + gScriptResult = 0; + if (gSpecialVar_0x8004 == gUnknown_0203AAC4) + { + gScriptResult = 1; + } + else if (gDecorations[gUnknown_0203A17C.items[gUnknown_0203AA44[gSpecialVar_0x8004].idx]].permission == DECORPERM_SOLID_MAT) + { + gSpecialVar_0x8005 = gUnknown_0203AA44[gSpecialVar_0x8004].flagId; + sub_81296EC(gUnknown_0203AA44[gSpecialVar_0x8004].idx); + for (i = 0; i < gMapHeader.events->mapObjectCount; i ++) + { + if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005) + { + gSpecialVar_0x8006 = gMapHeader.events->mapObjects[i].localId; + break; + } + } + } +} + +void sub_81297AC(void) +{ + u8 i; + + for (i = 0; i < gMapHeader.events->mapObjectCount; i ++) + { + if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8004) + { + gSpecialVar_0x8005 = gMapHeader.events->mapObjects[i].localId; + break; + } + } +} + +void sub_81297F8(void) +{ + u8 i; + u8 y; + u8 x; + int posX; + int posY; + u8 perm; + + for (i = 0; i < gUnknown_0203AAC4; i ++) + { + perm = gDecorations[gUnknown_0203A17C.items[gUnknown_0203AA44[i].idx]].permission; + posX = gUnknown_0203A17C.pos[gUnknown_0203AA44[i].idx] >> 4; + posY = gUnknown_0203A17C.pos[gUnknown_0203AA44[i].idx] & 0x0F; + if (perm != DECORPERM_SOLID_MAT) + { + for (y = 0; y < gUnknown_0203AA44[i].height; y ++) + { + for (x = 0; x < gUnknown_0203AA44[i].width; x ++) + { + MapGridSetMetatileEntryAt(posX + 7 + x, posY + 7 - y, gMapHeader.mapData->map[posX + x + gMapHeader.mapData->width * (posY - y)] | 0x3000); + } + } + sub_81296EC(gUnknown_0203AA44[i].idx); + } + } +} + +void sub_81298EC(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + sub_81297F8(); + gTasks[taskId].data[2] = 1; + break; + case 1: + if (!gPaletteFade.active) { + DrawWholeMapView(); + ScriptContext1_SetupScript(gUnknown_08275D2E); + sub_8197434(0, 1); + gTasks[taskId].data[2] = 2; + } + break; + case 2: + ScriptContext2_Enable(); + sub_8127814(taskId); + pal_fill_black(); + gTasks[taskId].data[2] = 3; + break; + case 3: + if (sub_80ABDFC() == TRUE) + { + StringExpandPlaceholders(gStringVar4, gText_DecorationReturnedToPC); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8129D64); + if (gMapHeader.regionMapSectionId == REGION_MAP_SECRET_BASE) + { + TV_PutSecretBaseVisitOnTheAir(); + } + } + break; + } +} + + +bool8 sub_81299AC(u8 taskId) +{ + u16 i; + + for (i = 0; i < gUnknown_0203A17C.size; i ++) + { + if (gUnknown_0203A17C.items[i] != DECOR_NONE) + { + return TRUE; + } + } + return FALSE; +} + +void SetUpPuttingAwayDecorationPlayerAvatar(void) +{ + player_get_direction_lower_nybble(); + gUnknown_0203AA38 = gSprites[gUnknown_03005DD0.unk4].data0; + sub_812A39C(); + gUnknown_03005DD0.unk4 = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0); + if (gSaveBlock2Ptr->playerGender == MALE) + { + gUnknown_0203AA39 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0); + } + else + { + gUnknown_0203AA39 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, 0x88, 0x48, 0); + } + gSprites[gUnknown_0203AA39].oam.priority = 1; + DestroySprite(&gSprites[gUnknown_0203AA38]); + gUnknown_0203AA38 = gUnknown_03005DD0.unk4; + gSprites[gUnknown_0203AA38].oam.priority = 1; +} + +void sub_8129ABC(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + switch (data[2]) + { + case 0: + if (!gPaletteFade.active) + { + sub_8127ACC(taskId); + data[2] = 1; + data[6] = 1; + data[5] = 1; + } + break; + case 1: + SetUpPuttingAwayDecorationPlayerAvatar(); + pal_fill_black(); + data[2] = 2; + break; + case 2: + if (sub_80ABDFC() == TRUE) + { + data[12] = 1; + sub_8129B34(taskId); + } + break; + } +} + +void sub_8129B34(u8 taskId) +{ + sub_8197434(0, 1); + gSprites[gUnknown_0203AA38].data7 = 0; + gSprites[gUnknown_0203AA38].invisible = FALSE; + gSprites[gUnknown_0203AA38].callback = sub_812A36C; + gSprites[gUnknown_0203AA39].pos1.x = 0x88; + gSprites[gUnknown_0203AA39].pos1.y = 0x48; + gTasks[taskId].data[10] = 0; + gTasks[taskId].func = sub_8128E18; +} + +void sub_8129BCC(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_8128DE0(); + sub_8129C74(taskId); +} + +void sub_8129BF8(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_8128DE0(); + gSprites[gUnknown_0203AA38].invisible = FALSE; + gSprites[gUnknown_0203AA38].callback = SpriteCallbackDummy; + StringExpandPlaceholders(gStringVar4, gText_StopPuttingAwayDecorations); + DisplayItemMessageOnField(taskId, gStringVar4, sub_812A1F0); +} + +void sub_8129C74(u8 taskId) +{ + s16 *data; + u8 behavior; + + sub_812A0E8(taskId); + if (gUnknown_0203AAC4 != 0) + { + StringExpandPlaceholders(gStringVar4, gText_ReturnDecorationToPC); + DisplayItemMessageOnField(taskId, gStringVar4, sub_812A1A0); + } + else + { + data = gTasks[taskId].data; + behavior = MapGridGetMetatileBehaviorAt(data[0], data[1]); + if (MetatileBehavior_IsSecretBasePC(behavior) == TRUE || MetatileBehavior_IsMB_C5(behavior) == TRUE) + { + gSprites[gUnknown_0203AA38].invisible = FALSE; + gSprites[gUnknown_0203AA38].callback = SpriteCallbackDummy; + StringExpandPlaceholders(gStringVar4, gText_StopPuttingAwayDecorations); + DisplayItemMessageOnField(taskId, gStringVar4, sub_812A1F0); + } + else + { + StringExpandPlaceholders(gStringVar4, gText_NoDecorationHere); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8129D64); + } + } +} + +void sub_8129D64(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + sub_8129B34(taskId); + } +} + +void sub_8129D8C(u8 decor, struct UnkStruct_0203AA44 *data) +{ + if (gDecorations[decor].shape == DECORSHAPE_1x1) + { + data->width = 1; + data->height = 1; + } else if (gDecorations[decor].shape == DECORSHAPE_2x1) + { + data->width = 2; + data->height = 1; + } else if (gDecorations[decor].shape == DECORSHAPE_3x1) + { + data->width = 3; + data->height = 1; + } else if (gDecorations[decor].shape == DECORSHAPE_4x2) + { + data->width = 4; + data->height = 2; + } else if (gDecorations[decor].shape == DECORSHAPE_2x2) + { + data->width = 2; + data->height = 2; + } else if (gDecorations[decor].shape == DECORSHAPE_1x2) + { + data->width = 1; + data->height = 2; + } else if (gDecorations[decor].shape == DECORSHAPE_1x3) + { + data->width = 1; + data->height = 3; + } else if (gDecorations[decor].shape == DECORSHAPE_2x4) + { + data->width = 2; + data->height = 4; + } else if (gDecorations[decor].shape == DECORSHAPE_3x3) + { + data->width = 3; + data->height = 3; + } else if (gDecorations[decor].shape == DECORSHAPE_3x2) + { + data->width = 3; + data->height = 2; + } +} + +void sub_8129E0C(u8 x, u8 y) +{ + gSprites[gUnknown_0203AA38].invisible = TRUE; + gSprites[gUnknown_0203AA38].callback = SpriteCallbackDummy; + gSprites[gUnknown_0203AA39].pos1.x = (x << 4) + 0x88; + gSprites[gUnknown_0203AA39].pos1.y = (y << 4) + 0x48; +} + +bool8 sub_8129E74(u8 taskId, u8 idx, struct UnkStruct_0203AA44 *data) +{ + u8 x; + u8 y; + u8 xOff; + u8 yOff; + u8 ht; + + x = gTasks[taskId].data[0] - 7; + y = gTasks[taskId].data[1] - 7; + xOff = gUnknown_0203A17C.pos[idx] >> 4; + yOff = gUnknown_0203A17C.pos[idx] & 0x0F; + ht = data->height; + if (gUnknown_0203A17C.items[idx] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(xOff + 7, yOff + 7) == 0x28C) + { + ht --; + } + if (x >= xOff && x < xOff + data->width && y > yOff - ht && y <= yOff) + { + sub_8129E0C(data->width - (x - xOff + 1), yOff - y); + return TRUE; + } + return FALSE; +} + +void sub_8129F20(void) +{ + u8 xOff; + u8 yOff; + u16 i; + + xOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[gUnknown_0203AAC4].idx] >> 4; + yOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[gUnknown_0203AAC4].idx] & 0x0F; + for (i = 0; i < 0x40; i ++) + { + if (gSaveBlock1Ptr->mapObjectTemplates[i].x == xOff && gSaveBlock1Ptr->mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1Ptr->mapObjectTemplates[i].flagId)) + { + gUnknown_0203AA44[gUnknown_0203AAC4].flagId = gSaveBlock1Ptr->mapObjectTemplates[i].flagId; + break; + } + } +} + +bool8 sub_8129FC8(u8 taskId) +{ + u16 i; + + for (i = 0; i < gUnknown_0203A17C.size; i ++) + { + if (gUnknown_0203A17C.items[i] != 0) + { + if (gDecorations[gUnknown_0203A17C.items[i]].permission == DECORPERM_SOLID_MAT) + { + sub_8129D8C(gUnknown_0203A17C.items[i], gUnknown_0203AA44); + if (sub_8129E74(taskId, i, gUnknown_0203AA44) == TRUE) + { + gUnknown_0203AA44->idx = i; + sub_8129F20(); + gUnknown_0203AAC4 = 1; + return TRUE; + } + } + } + } + return FALSE; +} + +void sub_812A040(u8 left, u8 top, u8 right, u8 bottom) +{ + u8 i; + u8 xOff; + u8 yOff; + u8 decorIdx; + + for (i = 0; i < gUnknown_0203A17C.size; i ++) + { + decorIdx = gUnknown_0203A17C.items[i]; + xOff = gUnknown_0203A17C.pos[i] >> 4; + yOff = gUnknown_0203A17C.pos[i] & 0x0F; + if (decorIdx != 0 && gDecorations[decorIdx].permission == DECORPERM_SOLID_MAT && left <= xOff && top <= yOff && right >= xOff && bottom >= yOff) + { + gUnknown_0203AA44[gUnknown_0203AAC4].idx = i; + sub_8129F20(); + gUnknown_0203AAC4++; + } + } +} + +#ifdef NONMATCHING +void sub_812A0E8(u8 taskId) +{ + u8 i; + u8 xOff; + u8 yOff; + u8 decor; + register u8 decor asm("r1"); + struct UnkStruct_0203AA44 *data; + + gUnknown_0203AAC4 = 0; + if (sub_8129FC8(taskId) != TRUE) + { + for (i = 0; i < gUnknown_0203A17C.size; i ++) + { + decor = gUnknown_0203A17C.items[i]; + if (decor != DECOR_NONE) + { + data = &gUnknown_0203AA44[0]; + sub_8129D8C(decor, data); + if (sub_8129E74(taskId, i, data) == TRUE) + { + data->idx = i; + gUnknown_0203AAC4 ++; + break; + } + } + } + if (gUnknown_0203AAC4 != 0) + { + xOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[0].idx] >> 4; + yOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[0].idx] & 0x0F; + sub_812A040(xOff, yOff - gUnknown_0203AA44[0].height + 1, xOff + gUnknown_0203AA44[0].width - 1, yOff); // Arithmetic register swap at the r2 argument: `add r2, r0, r2` instead of `add r2, r2, r0` + } + } +} +#else +__attribute__((naked)) void sub_812A0E8(u8 taskId) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r6, r0, 24\n" + "\tldr r4, =gUnknown_0203AAC4\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r4]\n" + "\tadds r0, r6, 0\n" + "\tbl sub_8129FC8\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbeq _0812A18C\n" + "\tmovs r5, 0\n" + "\tldr r0, =gUnknown_0203A17C\n" + "\tldrb r1, [r0, 0x8]\n" + "\tcmp r5, r1\n" + "\tbcs _0812A15A\n" + "\tadds r7, r4, 0\n" + "_0812A10E:\n" + "\tldr r0, [r0]\n" + "\tadds r0, r5\n" + "\tldrb r1, [r0]\n" + "\tcmp r1, 0\n" + "\tbeq _0812A14C\n" + "\tldr r4, =gUnknown_0203AA44\n" + "\tadds r0, r1, 0\n" + "\tadds r1, r4, 0\n" + "\tbl sub_8129D8C\n" + "\tadds r0, r6, 0\n" + "\tadds r1, r5, 0\n" + "\tadds r2, r4, 0\n" + "\tbl sub_8129E74\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbne _0812A14C\n" + "\tstrb r5, [r4]\n" + "\tldrb r0, [r7]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r7]\n" + "\tb _0812A15A\n" + "\t.pool\n" + "_0812A14C:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldr r0, =gUnknown_0203A17C\n" + "\tldrb r1, [r0, 0x8]\n" + "\tcmp r5, r1\n" + "\tbcc _0812A10E\n" + "_0812A15A:\n" + "\tldr r0, =gUnknown_0203AAC4\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _0812A18C\n" + "\tldr r0, =gUnknown_0203A17C\n" + "\tldr r2, =gUnknown_0203AA44\n" + "\tldrb r1, [r2]\n" + "\tldr r0, [r0, 0x4]\n" + "\tadds r0, r1\n" + "\tldrb r1, [r0]\n" + "\tlsrs r0, r1, 4\n" + "\tmovs r3, 0xF\n" + "\tands r3, r1\n" + "\tldrb r1, [r2, 0x2]\n" + "\tsubs r1, r3, r1\n" + "\tadds r1, 0x1\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tldrb r2, [r2, 0x1]\n" + "\tadds r2, r0\n" + "\tsubs r2, 0x1\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tbl sub_812A040\n" + "_0812A18C:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.pool"); +} +#endif + +void sub_812A1A0(u8 taskId) +{ + sub_8197930(); + sub_8121F68(taskId, &gUnknown_085A7348); +} + +void sub_812A1C0(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_81298EC; +} + +void sub_812A1F0(u8 taskId) +{ + sub_8197930(); + sub_8121F68(taskId, &gUnknown_085A7350); +} + +void sub_812A210(u8 taskId) +{ + sub_8197434(0, 0); + sub_812A22C(taskId); +} + +void sub_812A22C(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_812A25C; +} + +void sub_812A25C(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + if (!gPaletteFade.active) + { + sub_8127B04(taskId); + gTasks[taskId].data[2] = 1; + } + break; + case 1: + sub_812A3C8(); + gFieldCallback = sub_812A334; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + break; + } +} + +void sub_812A2C4(u8 taskId) +{ + s16 *data; + + data = gTasks[taskId].data; + switch (data[2]) + { + case 0: + sub_80E9578(); + data[2] ++; + break; + case 1: + ScriptContext1_SetupScript(gUnknown_08275D0C); + data[2] ++; + break; + case 2: + ScriptContext2_Enable(); + data[2] ++; + break; + case 3: + if (sub_80ABDFC() == TRUE) + { + gTasks[taskId].func = sub_8126B80; + } + break; + } +} + +void sub_812A334(void) +{ + u8 taskId; + + pal_fill_black(); + sub_81973C4(0, 1); + sub_8126ABC(); + taskId = CreateTask(sub_812A2C4, 8); + gTasks[taskId].data[2] = 0; +} + +void sub_812A36C(struct Sprite *sprite) +{ + sprite->data0 ++; + sprite->data0 &= 0x1F; + if (sprite->data0 > 15) + { + sprite->invisible = TRUE; + } + else + { + sprite->invisible = FALSE; + } +} + +void sub_812A39C(void) +{ + if (gSaveBlock2Ptr->playerGender == MALE) + { + LoadSpritePalette(&gUnknown_085A73D8); + } + else + { + LoadSpritePalette(&gUnknown_085A73E0); + } +} + +void sub_812A3C8(void) +{ + FreeSpritePaletteByTag(0x0008); +} + +void sub_812A3D4(u8 taskId) +{ + if (sub_81279C4() == TRUE) + { + StringCopy(gStringVar1, gDecorations[gUnknown_0203A14C[gUnknown_0203A172]].name); + StringExpandPlaceholders(gStringVar4, gText_DecorationWillBeDiscarded); + DisplayItemMessageOnField(taskId, gStringVar4, sub_812A458); + } + else + { + StringExpandPlaceholders(gStringVar4, gText_CantThrowAwayInUse); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8127A5C); + } +} + +void sub_812A458(u8 taskId) +{ + sub_8197930(); + sub_8121F68(taskId, &gUnknown_085A741C); +} + +void sub_812A478(u8 taskId) +{ + gUnknown_0203A14C[gUnknown_0203A172] = DECOR_NONE; + gUnknown_0203A151 = CountDecorationCategoryN(gUnknown_0203A173); + CondenseDecorationCategoryN(gUnknown_0203A173); + sub_8127814(taskId); + StringExpandPlaceholders(gStringVar4, gText_DecorationThrownAway); + DisplayItemMessageOnField(taskId, gStringVar4, sub_8127A5C); +} diff --git a/src/decoration_inventory.c b/src/decoration_inventory.c new file mode 100644 index 000000000..03ab6c00c --- /dev/null +++ b/src/decoration_inventory.c @@ -0,0 +1,189 @@ + +// Includes +#include "global.h" +#include "decoration.h" +#include "decoration_inventory.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA struct DecorationInventory gDecorationInventories[8] = {}; + +// Static ROM declarations + +// .rodata + +// .text + +#define SET_DECOR_INV(i, ptr) {\ + gDecorationInventories[i].items = ptr;\ + gDecorationInventories[i].size = sizeof(ptr);\ +} + +void SetDecorationInventoriesPointers(void) +{ + SET_DECOR_INV(0, gSaveBlock1Ptr->decorDesk); + SET_DECOR_INV(1, gSaveBlock1Ptr->decorChair); + SET_DECOR_INV(2, gSaveBlock1Ptr->decorPlant); + SET_DECOR_INV(3, gSaveBlock1Ptr->decorOrnament); + SET_DECOR_INV(4, gSaveBlock1Ptr->decorMat); + SET_DECOR_INV(5, gSaveBlock1Ptr->decorPoster); + SET_DECOR_INV(6, gSaveBlock1Ptr->decorDoll); + SET_DECOR_INV(7, gSaveBlock1Ptr->decorCushion); + sub_8126968(); +} + +static void ClearDecorationInventory(u8 idx) +{ + u8 i; + + for (i = 0; i < gDecorationInventories[idx].size; i ++) + { + gDecorationInventories[idx].items[i] = DECOR_NONE; + } +} + +void ClearDecorationInventories(void) +{ + u8 idx; + + for (idx = 0; idx < 8; idx ++) + { + ClearDecorationInventory(idx); + } +} + +s8 GetFirstEmptyDecorSlot(u8 idx) +{ + s8 i; + + for (i = 0; i < (s8)gDecorationInventories[idx].size; i ++) + { + if (gDecorationInventories[idx].items[i] == DECOR_NONE) + { + return i; + } + } + return -1; +} + +bool8 CheckHasDecoration(u8 decor) +{ + u8 i; + u8 category; + + category = gDecorations[decor].category; + for (i = 0; i < gDecorationInventories[category].size; i ++) + { + if (gDecorationInventories[category].items[i] == decor) + { + return TRUE; + } + } + return FALSE; +} + +bool8 DecorationAdd(u8 decor) +{ + u8 category; + s8 idx; + + if (decor == DECOR_NONE) + { + return FALSE; + } + category = gDecorations[decor].category; + idx = GetFirstEmptyDecorSlot(category); + if (idx == -1) + { + return FALSE; + } + gDecorationInventories[category].items[idx] = decor; + return TRUE; +} + +bool8 DecorationCheckSpace(u8 decor) +{ + if (decor == DECOR_NONE) + { + return FALSE; + } + if (GetFirstEmptyDecorSlot(gDecorations[decor].category) == -1) + { + return FALSE; + } + return TRUE; +} + +s8 DecorationRemove(u8 decor) +{ + u8 i; + u8 idx; + + i = 0; + if (decor == DECOR_NONE) + { + return 0; + } + for (i = 0; i < gDecorationInventories[gDecorations[decor].category].size; i ++) + { + idx = gDecorations[decor].category; + if (gDecorationInventories[idx].items[i] == decor) + { + gDecorationInventories[idx].items[i] = DECOR_NONE; + CondenseDecorationCategoryN(idx); + return 1; + } + } + return 0; +} + +void CondenseDecorationCategoryN(u8 idx) +{ + u8 i; + u8 j; + u8 tmp; + + for (i = 0; i < gDecorationInventories[idx].size; i ++) + { + for (j = i + 1; j < gDecorationInventories[idx].size; j ++) + { + if (gDecorationInventories[idx].items[j] != DECOR_NONE && (gDecorationInventories[idx].items[i] == DECOR_NONE || gDecorationInventories[idx].items[i] > gDecorationInventories[idx].items[j])) + { + tmp = gDecorationInventories[idx].items[i]; + gDecorationInventories[idx].items[i] = gDecorationInventories[idx].items[j]; + gDecorationInventories[idx].items[j] = tmp; + } + } + } +} + +u8 CountDecorationCategoryN(u8 idx) +{ + u8 i; + u8 ct; + + ct = 0; + for (i = 0; i < gDecorationInventories[idx].size; i ++) + { + if (gDecorationInventories[idx].items[i] != DECOR_NONE) + { + ct ++; + } + } + return ct; +} + +u8 CountDecorations(void) +{ + u8 idx; + u8 ct; + + ct = 0; + for (idx = 0; idx < 8; idx ++) + { + ct += CountDecorationCategoryN(idx); + } + return ct; +} diff --git a/src/international_string_util.c b/src/international_string_util.c index c77b4f8ff..81985d614 100644 --- a/src/international_string_util.c +++ b/src/international_string_util.c @@ -28,13 +28,13 @@ s32 GetStringWidthDifference(s32 fontId, const u8 *str, s32 totalWidth, s32 lett return 0; } -s32 GetMaxWidthInMenuTable(const u8 **str, s32 arg1) +s32 GetMaxWidthInMenuTable(const struct MenuAction *str, s32 arg1) { s32 i, var; for (var = 0, i = 0; i < arg1; i++) { - s32 stringWidth = GetStringWidth(1, str[i * 2], 0); + s32 stringWidth = GetStringWidth(1, str[i].text, 0); if (stringWidth > var) var = stringWidth; } @@ -42,13 +42,13 @@ s32 GetMaxWidthInMenuTable(const u8 **str, s32 arg1) return convert_pixel_width_to_tile_width(var); } -s32 sub_81DB3D8(const u8 **str, u8* arg1, s32 arg2) +s32 sub_81DB3D8(const struct MenuAction *str, u8* arg1, s32 arg2) { s32 i, var; for (var = 0, i = 0; i < arg2; i++) { - s32 stringWidth = GetStringWidth(1, str[arg1[i] * 2], 0); + s32 stringWidth = GetStringWidth(1, str[arg1[i]].text, 0); if (stringWidth > var) var = stringWidth; } diff --git a/src/start_menu.c b/src/start_menu.c index be30d0e53..37331a922 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -207,7 +207,7 @@ static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) do { - if (sStartMenuItems[sCurrentStartMenuActions[_index]].func == StartMenu_PlayerName) + if (sStartMenuItems[sCurrentStartMenuActions[_index]].func.u8_void == StartMenu_PlayerName) { } diff --git a/src/tv.c b/src/tv.c index 7f64b46ac..3c822b394 100644 --- a/src/tv.c +++ b/src/tv.c @@ -2353,7 +2353,7 @@ void sub_80EDFB4(TVShow *show) show->secretBaseVisit.move = sTV_SecretBaseVisitMonsTemp[j].move; } -void sub_80EE104(void) +void TV_PutSecretBaseVisitOnTheAir(void) { TVShow *show; -- cgit v1.2.3 From 9fc2c99d18c08043c0349a0d17ba71a8bfb8688b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 22 Oct 2017 19:05:32 -0400 Subject: Move these palettes to INCBINs --- src/decoration.c | 60 +++++++++++++++++++++++--------------------------------- 1 file changed, 24 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/decoration.c b/src/decoration.c index b2f4125ef..11d44693b 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -40,6 +40,9 @@ // Static type declarations +#define OVERWORLD_DECOR_PAL_TAG 0xbe5 +#define OVERWORLD_DECOR_BOX_PAL_TAG 0x008 + struct UnkStruct_0203A18C { struct ListMenuItem unk_000[41]; u8 unk_148[41][24]; @@ -219,12 +222,7 @@ const struct WindowTemplate gUnknown_085A6B90[4] = { { 0, 16, 13, 13, 6, 15, 0x0193 } }; -const u16 gUnknown_085A6BB0[] = { - 0x532e, 0x7fff, 0x318c, 0x675a, - 0x739c, 0x6318, 0x0000, 0x77bd, - 0x6318, 0x4a52, 0x001f, 0x0016, - 0x631f, 0x7d4a, 0x58c6, 0x7f18 -}; +const u16 gUnknown_085A6BB0[] = INCBIN_U16("graphics/decorations/unk_85a6bb0.gbapal"); const struct ListMenuTemplate gUnknown_085A6BD0 = { NULL, @@ -244,16 +242,16 @@ const struct { u8 x; u8 y; } gUnknown_085A7250[] = { - {0x00, 0x01, 0x78, 0x4e}, - {0x01, 0x02, 0x80, 0x4e}, - {0x01, 0x03, 0x90, 0x56}, - {0x01, 0x03, 0x90, 0x46}, - {0x00, 0x02, 0x80, 0x46}, - {0x02, 0x02, 0x78, 0x46}, - {0x02, 0x03, 0x80, 0x56}, - {0x02, 0x03, 0x80, 0x36}, - {0x00, 0x03, 0x90, 0x46}, - {0x01, 0x03, 0x90, 0x46} + {0, 1, 0x78, 0x4e}, + {1, 2, 0x80, 0x4e}, + {1, 3, 0x90, 0x56}, + {1, 3, 0x90, 0x46}, + {0, 2, 0x80, 0x46}, + {2, 2, 0x78, 0x46}, + {2, 3, 0x80, 0x56}, + {2, 3, 0x80, 0x36}, + {0, 3, 0x90, 0x46}, + {1, 3, 0x90, 0x46} }; const union AnimCmd gUnknown_085A7278[] = { @@ -271,7 +269,7 @@ const struct SpriteFrameImage gUnknown_085A7284 = { const struct SpriteTemplate gUnknown_085A728C = { 0xffff, - 0x0be5, + OVERWORLD_DECOR_PAL_TAG, &gUnknown_0203AA3C, gUnknown_085A7280, &gUnknown_085A7284, @@ -290,7 +288,7 @@ const struct SpriteTemplate gUnknown_085A72A4 = { }; const struct SpritePalette gUnknown_085A72BC = { - (const u16 *)&gUnknown_0203A190.palette, 0x0be5 + (const u16 *)&gUnknown_0203A190.palette, OVERWORLD_DECOR_PAL_TAG }; const struct YesNoFuncTable gUnknown_085A72C4 = { @@ -325,19 +323,9 @@ const u16 gUnknown_085A72F4[] = { 0x04, 0x08, 0x10, 0x20, 0x10, 0x08, 0x10, 0x20, 0x40, 0x20 }; -const u16 Unknown_085A7308[] = { - 0x530e, 0x5b5f, 0x4b1f, 0x3a5b, - 0x210f, 0x3d27, 0x30e5, 0x28a3, - 0x1c82, 0x779b, 0x2f1f, 0x2e77, - 0x2d9f, 0x2118, 0x7fff, 0x0000 -}; +const u16 Unknown_085A7308[] = INCBIN_U16("graphics/decorations/unk_85a7308.gbapal"); -const u16 Unknown_085A7328[] = { - 0x530e, 0x677f, 0x4a9b, 0x3a19, - 0x296f, 0x398c, 0x20e5, 0x29b4, - 0x1cc9, 0x6f39, 0x2f1f, 0x2e77, - 0x2d9f, 0x2118, 0x7fff, 0x0000 -}; +const u16 Unknown_085A7328[] = INCBIN_U16("graphics/decorations/unk_85a7328.gbapal"); const struct YesNoFuncTable gUnknown_085A7348 = { sub_812A1C0, @@ -352,11 +340,11 @@ const struct YesNoFuncTable gUnknown_085A7350 = { const u8 Unknown_085A7358[] = INCBIN_U8("graphics/misc/decoration_unk_85a7358.4bpp"); const struct SpritePalette gUnknown_085A73D8 = { - Unknown_085A7308, 8 + Unknown_085A7308, OVERWORLD_DECOR_BOX_PAL_TAG }; const struct SpritePalette gUnknown_085A73E0 = { - Unknown_085A7328, 8 + Unknown_085A7328, OVERWORLD_DECOR_BOX_PAL_TAG }; const struct OamData Unknown_085A73E8 = { @@ -378,7 +366,7 @@ const struct SpriteFrameImage Unknown_085A73FC = { const struct SpriteTemplate gUnknown_085A7404 = { 0xFFFF, - 8, + OVERWORLD_DECOR_BOX_PAL_TAG, &Unknown_085A73E8, Unknown_085A73F8, &Unknown_085A73FC, @@ -1692,7 +1680,7 @@ void c1_overworld_prev_quest(u8 taskId) break; case 1: sub_812A3C8(); - FreeSpritePaletteByTag(0xbe5); + FreeSpritePaletteByTag(OVERWORLD_DECOR_PAL_TAG); gFieldCallback = sub_8128CD4; SetMainCallback2(c2_exit_to_overworld_2_switch); DestroyTask(taskId); @@ -2005,7 +1993,7 @@ u8 gpu_pal_decompress_alloc_tag_and_upload(struct UnkStruct_0203A190 *data, u8 d { return AddPseudoFieldObject(data->decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); } - FreeSpritePaletteByTag(0xBE5); + FreeSpritePaletteByTag(OVERWORLD_DECOR_PAL_TAG); sub_81291E8(data); sub_812925C(data->decoration->shape); sub_81291A4(data); @@ -2758,7 +2746,7 @@ void sub_812A39C(void) void sub_812A3C8(void) { - FreeSpritePaletteByTag(0x0008); + FreeSpritePaletteByTag(OVERWORLD_DECOR_BOX_PAL_TAG); } void sub_812A3D4(u8 taskId) -- cgit v1.2.3 From 0dd3db7061165f990f386546304d4d90331d6cd0 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 22 Oct 2017 20:13:31 -0400 Subject: Rename some functions and all RAM objects in decoration.c --- src/decoration.c | 632 +++++++++++++++++++++++++++---------------------------- 1 file changed, 316 insertions(+), 316 deletions(-) (limited to 'src') diff --git a/src/decoration.c b/src/decoration.c index 11d44693b..0179d36a1 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -40,25 +40,25 @@ // Static type declarations -#define OVERWORLD_DECOR_PAL_TAG 0xbe5 -#define OVERWORLD_DECOR_BOX_PAL_TAG 0x008 +#define OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG 0xbe5 +#define OVERWORLD_PLACE_DECOR_PLAYER_PAL_TAG 0x008 -struct UnkStruct_0203A18C { - struct ListMenuItem unk_000[41]; - u8 unk_148[41][24]; +struct DecorPCBuffer { + struct ListMenuItem items[41]; + u8 names[41][24]; u8 unk_520; u8 unk_521; u8 unk_522; }; -struct UnkStruct_0203A190 { +struct PlaceDecorationGraphicsDataBuffer { /*0x000; 0x0203a190*/ const struct Decoration *decoration; /*0x004; 0x0203a194*/ u16 tiles[0x40]; /*0x084; 0x0203a214*/ u8 image[0x800]; /*0x884; 0x0203aa14*/ u16 palette[16]; }; -struct UnkStruct_0203AA44 { +struct DecorRearrangementDataBuffer { u8 idx; u8 width; u8 height; @@ -67,39 +67,39 @@ struct UnkStruct_0203AA44 { // Static RAM declarations -EWRAM_DATA u8 *gUnknown_0203A14C = NULL; -EWRAM_DATA u8 gUnknown_0203A150 = 0; -EWRAM_DATA u8 gUnknown_0203A151 = 0; -EWRAM_DATA u8 gUnknown_0203A152[16] = {}; -EWRAM_DATA u8 gUnknown_0203A162[12] = {}; -EWRAM_DATA u16 gUnknown_0203A16E = 0; -EWRAM_DATA u16 gUnknown_0203A170 = 0; -EWRAM_DATA u8 gUnknown_0203A172 = 0; -EWRAM_DATA u8 gUnknown_0203A173 = 0; +EWRAM_DATA u8 *gCurDecorInventoryItems = NULL; +EWRAM_DATA u8 sSecretBasePCMenuCursorPos = 0; +EWRAM_DATA u8 sCurDecorCatCount = 0; +EWRAM_DATA u8 sSecretBaseItemsIndicesBuffer[16] = {}; +EWRAM_DATA u8 sPlayerRoomItemsIndicesBuffer[12] = {}; +EWRAM_DATA u16 sSecretBasePCSelectDecorLineNo = 0; +EWRAM_DATA u16 sSecretBasePCSelectDecorPageNo = 0; +EWRAM_DATA u8 gCurDecorationIndex = 0; +EWRAM_DATA u8 sCurDecorationCategory = DECORCAT_DESK; EWRAM_DATA u32 filler_0203a174[2] = {}; EWRAM_DATA struct DecorPCPointers gUnknown_0203A17C = {}; -EWRAM_DATA u8 gUnknown_0203A188[4] = {}; -EWRAM_DATA struct UnkStruct_0203A18C *gUnknown_0203A18C = NULL; -EWRAM_DATA struct UnkStruct_0203A190 gUnknown_0203A190 = {}; -EWRAM_DATA u16 gUnknown_0203AA34 = 0; -EWRAM_DATA u16 gUnknown_0203AA36 = 0; -EWRAM_DATA u8 gUnknown_0203AA38 = 0; -EWRAM_DATA u8 gUnknown_0203AA39 = 0; -EWRAM_DATA u8 gUnknown_0203AA3A = 0; -EWRAM_DATA struct OamData gUnknown_0203AA3C = {}; -EWRAM_DATA struct UnkStruct_0203AA44 gUnknown_0203AA44[16] = {}; -EWRAM_DATA u8 gUnknown_0203AAC4 = 0; +EWRAM_DATA u8 sDecorMenuWindowIndices[4] = {}; +EWRAM_DATA struct DecorPCBuffer *sDecorPCBuffer = NULL; +EWRAM_DATA struct PlaceDecorationGraphicsDataBuffer sPlaceDecorationGraphicsDataBuffer = {}; +EWRAM_DATA u16 sCurDecorMapX = 0; +EWRAM_DATA u16 sCurDecorMapY = 0; +EWRAM_DATA u8 sDecor_CameraSpriteObjectIdx1 = 0; +EWRAM_DATA u8 sDecor_CameraSpriteObjectIdx2 = 0; +EWRAM_DATA u8 sDecorationLastDirectionMoved = 0; +EWRAM_DATA struct OamData sDecorSelectorOam = {}; +EWRAM_DATA struct DecorRearrangementDataBuffer sDecorRearrangementDataBuffer[16] = {}; +EWRAM_DATA u8 sCurDecorSelectedInRearrangement = 0; // Static ROM declarations void sub_8126B80(u8 taskId); void sub_8126C08(void); -void sub_8126C48(u8 taskId); -void sub_8126CA4(u8 taskId); -void sub_8126D10(u8 taskId); +void SecretBasePC_Decorate(u8 taskId); +void SecretBasePC_PutAway(u8 taskId); +void SecretBasePC_Toss(u8 taskId); void sub_8126DA4(u8 taskId); -void sub_8126D6C(u8 taskId); -void sub_8126DCC(u8 taskId); +void SecretBasePC_Cancel(u8 taskId); +void SecretBasePC_PrepMenuForSelectingStoredDecors(u8 taskId); void sub_8126DFC(u8 taskId); void sub_8126E8C(u8 taskId); void sub_8126F68(u8 winid, u8 decorCat, u8 x, u8 y, bool8 flag, u8 speed); @@ -119,15 +119,15 @@ void sub_8127744(u32 a0); void sub_81277A8(void); bool8 sub_81277BC(u8 idx); bool8 sub_81277E8(u8 idx); -void sub_81279B4(u8 taskId); +void IdentifyOwnedDecorationsCurrentlyInUse(u8 taskId); void sub_812759C(u8 taskId); void sub_8127718(u8 decorCat); void sub_8127A30(u8 taskId); void sub_8127A8C(u8 taskId); void sub_8127F68(u8 taskId); void sub_8128060(u8 taskId); -void ConfigureCameraObjectForPlacingDecoration(struct UnkStruct_0203A190 *data, u8 decor); -void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_0203A190 *data); +void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor); +void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphicsDataBuffer *data); void sub_812826C(u8 taskId); void sub_81283BC(u8 taskId); void sub_8128414(u8 taskId); @@ -145,7 +145,7 @@ void sub_8128FD8(u8 taskId); void sub_8129020(u8 taskId); void sub_81292D0(struct Sprite *sprite); void sub_81292E8(struct Sprite *sprite); -u8 gpu_pal_decompress_alloc_tag_and_upload(struct UnkStruct_0203A190 *data, u8 decor); +u8 gpu_pal_decompress_alloc_tag_and_upload(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor); const u8 *GetDecorationIconPicOrPalette(u16 decor, u8 mode); bool8 sub_81299AC(u8 taskId); void sub_8129ABC(u8 taskId); @@ -175,37 +175,37 @@ void sub_812A478(u8 taskId); #include "data/decoration/description.h" #include "data/decoration/header.h" -const u8 *const gUnknown_085A6B28[] = { - gUnknown_085EA859, - gUnknown_085EA85E, - gUnknown_085EA864, - gUnknown_085EA86A, - gUnknown_085EA873, - gUnknown_085EA877, - gUnknown_085EA87E, - gUnknown_085EA883 +const u8 *const sDecorCatNames[] = { + gText_Desk, + gText_Chair, + gText_Plant, + gText_Ornament, + gText_Mat, + gText_Poster, + gText_Doll, + gText_Cushion }; -const struct MenuAction gUnknown_085A6B48[] = { +const struct MenuAction sSecretBasePCMenuActions[] = { { - gUnknown_085EA7B1, {.void_u8=sub_8126C48} + gText_Decorate, {.void_u8=SecretBasePC_Decorate} }, { - gUnknown_085EA7BA, {.void_u8=sub_8126CA4} + gText_PutAway, {.void_u8=SecretBasePC_PutAway} }, { - gUnknown_085EA7C3, {.void_u8=sub_8126D10} + gText_Toss2, {.void_u8=SecretBasePC_Toss} }, { - gText_Cancel, {.void_u8=sub_8126D6C} + gText_Cancel, {.void_u8=SecretBasePC_Cancel} } }; -const u8 *const gUnknown_085A6B68[] = { - gUnknown_085EA7CF, - gUnknown_085EA7F5, - gUnknown_085EA81C, +const u8 *const sSecretBasePCMenuItemDescriptions[] = { + gText_PutOutSelectedDecorItem, + gText_StoreChosenDecorInPC, + gText_ThrowAwayUnwantedDecors, gText_GoBackPrevMenu }; -void (*const gUnknown_085A6B78[][2])(u8 taskId) = { +void (*const SecretBasePC_SelectedDecorActions[][2])(u8 taskId) = { { sub_8127F68, sub_8127A8C }, { @@ -259,36 +259,36 @@ const union AnimCmd gUnknown_085A7278[] = { ANIMCMD_END }; -const union AnimCmd *const gUnknown_085A7280[] = { +const union AnimCmd *const sDecorSelectorAnims[] = { gUnknown_085A7278 }; -const struct SpriteFrameImage gUnknown_085A7284 = { - (const u8 *)&gUnknown_0203A190.image, 0x800 +const struct SpriteFrameImage sDecorSelectorSpriteFrameImages = { + (const u8 *)&sPlaceDecorationGraphicsDataBuffer.image, 0x800 }; -const struct SpriteTemplate gUnknown_085A728C = { +const struct SpriteTemplate sDecorSelectorSpriteTemplate = { 0xffff, - OVERWORLD_DECOR_PAL_TAG, - &gUnknown_0203AA3C, - gUnknown_085A7280, - &gUnknown_085A7284, + OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG, + &sDecorSelectorOam, + sDecorSelectorAnims, + &sDecorSelectorSpriteFrameImages, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; -const struct SpriteTemplate gUnknown_085A72A4 = { +const struct SpriteTemplate sDecorWhilePlacingSpriteTemplate = { 0x0000, 0x0000, - &gUnknown_0203AA3C, - gUnknown_085A7280, + &sDecorSelectorOam, + sDecorSelectorAnims, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }; const struct SpritePalette gUnknown_085A72BC = { - (const u16 *)&gUnknown_0203A190.palette, OVERWORLD_DECOR_PAL_TAG + (const u16 *)&sPlaceDecorationGraphicsDataBuffer.palette, OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG }; const struct YesNoFuncTable gUnknown_085A72C4 = { @@ -340,11 +340,11 @@ const struct YesNoFuncTable gUnknown_085A7350 = { const u8 Unknown_085A7358[] = INCBIN_U8("graphics/misc/decoration_unk_85a7358.4bpp"); const struct SpritePalette gUnknown_085A73D8 = { - Unknown_085A7308, OVERWORLD_DECOR_BOX_PAL_TAG + Unknown_085A7308, OVERWORLD_PLACE_DECOR_PLAYER_PAL_TAG }; const struct SpritePalette gUnknown_085A73E0 = { - Unknown_085A7328, OVERWORLD_DECOR_BOX_PAL_TAG + Unknown_085A7328, OVERWORLD_PLACE_DECOR_PLAYER_PAL_TAG }; const struct OamData Unknown_085A73E8 = { @@ -366,7 +366,7 @@ const struct SpriteFrameImage Unknown_085A73FC = { const struct SpriteTemplate gUnknown_085A7404 = { 0xFFFF, - OVERWORLD_DECOR_BOX_PAL_TAG, + OVERWORLD_PLACE_DECOR_PLAYER_PAL_TAG, &Unknown_085A73E8, Unknown_085A73F8, &Unknown_085A73FC, @@ -383,9 +383,9 @@ const struct YesNoFuncTable gUnknown_085A741C = { void sub_8126968(void) { - if (gUnknown_0203A173 < 8) + if (sCurDecorationCategory < 8) { - gUnknown_0203A14C = gDecorationInventories[gUnknown_0203A173].items; + gCurDecorInventoryItems = gDecorationInventories[sCurDecorationCategory].items; } if (gUnknown_0203A17C.isPlayerRoom == FALSE) { @@ -404,11 +404,11 @@ u8 sub_81269D4(u8 idx) u8 *winidx; struct WindowTemplate template; - winidx = &gUnknown_0203A188[idx]; + winidx = &sDecorMenuWindowIndices[idx]; if (idx == 0) { template = gUnknown_085A6B90[0]; - template.width = GetMaxWidthInMenuTable(gUnknown_085A6B48, 4); + template.width = GetMaxWidthInMenuTable(sSecretBasePCMenuActions, 4); if (template.width > 18) { template.width = 18; @@ -426,9 +426,9 @@ u8 sub_81269D4(u8 idx) void sub_8126A58(u8 idx) { - sub_8198070(gUnknown_0203A188[idx], FALSE); - ClearWindowTilemap(gUnknown_0203A188[idx]); - RemoveWindow(gUnknown_0203A188[idx]); + sub_8198070(sDecorMenuWindowIndices[idx], FALSE); + ClearWindowTilemap(sDecorMenuWindowIndices[idx]); + RemoveWindow(sDecorMenuWindowIndices[idx]); schedule_bg_copy_tilemap_to_vram(0); } @@ -437,13 +437,13 @@ void sub_8126A88(void) u8 idx; idx = sub_81269D4(0); - PrintMenuTable(idx, 4, gUnknown_085A6B48); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(idx, 4, gUnknown_0203A150); + PrintMenuTable(idx, 4, sSecretBasePCMenuActions); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(idx, 4, sSecretBasePCMenuCursorPos); } void sub_8126ABC(void) { - gUnknown_0203A150 = 0; + sSecretBasePCMenuCursorPos = 0; ScriptContext2_Enable(); sub_8126A88(); sub_8126C08(); @@ -480,18 +480,18 @@ void sub_8126B80(u8 taskId) { default: PlaySE(SE_SELECT); - gUnknown_085A6B48[gUnknown_0203A150].func.void_u8(taskId); + sSecretBasePCMenuActions[sSecretBasePCMenuCursorPos].func.void_u8(taskId); break; case -2: - gUnknown_0203A150 = GetMenuCursorPos(); - if ((s8)menuPos != gUnknown_0203A150) + sSecretBasePCMenuCursorPos = GetMenuCursorPos(); + if ((s8)menuPos != sSecretBasePCMenuCursorPos) { sub_8126C08(); } break; case -1: PlaySE(SE_SELECT); - sub_8126D6C(taskId); + SecretBasePC_Cancel(taskId); break; } } @@ -500,10 +500,10 @@ void sub_8126B80(u8 taskId) void sub_8126C08(void) { FillWindowPixelBuffer(0, 0x11); - AddTextPrinterParametrized(0, 1, gUnknown_085A6B68[gUnknown_0203A150], 0, 0, 2, 1, 3); + AddTextPrinterParametrized(0, 1, sSecretBasePCMenuItemDescriptions[sSecretBasePCMenuCursorPos], 0, 0, 2, 1, 3); } -void sub_8126C48(u8 taskId) +void SecretBasePC_Decorate(u8 taskId) { if (CountDecorations() == 0) { @@ -513,12 +513,12 @@ void sub_8126C48(u8 taskId) else { gTasks[taskId].data[11] = 0; - gUnknown_0203A173 = DECORCAT_DESK; - sub_8126DCC(taskId); + sCurDecorationCategory = DECORCAT_DESK; + SecretBasePC_PrepMenuForSelectingStoredDecors(taskId); } } -void sub_8126CA4(u8 taskId) +void SecretBasePC_PutAway(u8 taskId) { if (!sub_81299AC(taskId)) { @@ -535,7 +535,7 @@ void sub_8126CA4(u8 taskId) } } -void sub_8126D10(u8 taskId) +void SecretBasePC_Toss(u8 taskId) { if (CountDecorations() == 0) { @@ -545,12 +545,12 @@ void sub_8126D10(u8 taskId) else { gTasks[taskId].data[11] = 1; - gUnknown_0203A173 = DECORCAT_DESK; - sub_8126DCC(taskId); + sCurDecorationCategory = DECORCAT_DESK; + SecretBasePC_PrepMenuForSelectingStoredDecors(taskId); } } -void sub_8126D6C(u8 taskId) +void SecretBasePC_Cancel(u8 taskId) { sub_8126A58(0); if (!gUnknown_0203A17C.isPlayerRoom) @@ -570,7 +570,7 @@ void sub_8126DA4(u8 taskId) gTasks[taskId].func = sub_8126B80; } -void sub_8126DCC(u8 taskId) +void SecretBasePC_PrepMenuForSelectingStoredDecors(u8 taskId) { LoadPalette(gUnknown_085A6BB0, 0xd0, 0x20); sub_8197434(0, 0); @@ -584,15 +584,15 @@ void sub_8126DFC(u8 taskId) winIdx = sub_81269D4(1); sub_8126E8C(taskId); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(winIdx, 9, gUnknown_0203A173); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(winIdx, 9, sCurDecorationCategory); gTasks[taskId].func = sub_8127088; } void sub_8126E44(u8 taskId) { - FillWindowPixelBuffer(gUnknown_0203A188[1], 0x11); + FillWindowPixelBuffer(sDecorMenuWindowIndices[1], 0x11); sub_8126E8C(taskId); - InitMenuInUpperLeftCornerPlaySoundWhenAPressed(gUnknown_0203A188[1], 9, gUnknown_0203A173); + InitMenuInUpperLeftCornerPlaySoundWhenAPressed(sDecorMenuWindowIndices[1], 9, sCurDecorationCategory); gTasks[taskId].func = sub_8127088; } @@ -605,7 +605,7 @@ void sub_8126E8C(u8 taskId) bool8 fl; data = gTasks[taskId].data; - r5 = gUnknown_0203A188[1]; + r5 = sDecorMenuWindowIndices[1]; fl = gUnknown_0203A17C.isPlayerRoom; r8 = FALSE; if (fl == TRUE && data[11] == 0) @@ -636,7 +636,7 @@ void sub_8126F68(u8 winid, u8 decorCat, u8 x, u8 y, bool8 flag, u8 speed) y ++; sub_8127058(gStringVar4, flag); strbuf = StringLength(gStringVar4) + gStringVar4; - StringCopy(strbuf, gUnknown_085A6B28[decorCat]); + StringCopy(strbuf, sDecorCatNames[decorCat]); PrintTextOnWindow(winid, 1, gStringVar4, x, y, speed, NULL); strbuf = ConvertIntToDecimalStringN(strbuf, CountDecorationCategoryN(decorCat), STR_CONV_MODE_RIGHT_ALIGN, 2); *strbuf++ = CHAR_SLASH; @@ -678,7 +678,7 @@ void sub_8127088(u8 taskId) break; default: PlaySE(SE_SELECT); - gUnknown_0203A173 = input; + sCurDecorationCategory = input; sub_81270E8(taskId); break; } @@ -687,14 +687,14 @@ void sub_8127088(u8 taskId) void sub_81270E8(u8 taskId) { - gUnknown_0203A151 = CountDecorationCategoryN(gUnknown_0203A173); - if (gUnknown_0203A151 != 0) + sCurDecorCatCount = CountDecorationCategoryN(sCurDecorationCategory); + if (sCurDecorCatCount != 0) { - CondenseDecorationCategoryN(gUnknown_0203A173); - gUnknown_0203A14C = gDecorationInventories[gUnknown_0203A173].items; - sub_81279B4(taskId); - gUnknown_0203A170 = 0; - gUnknown_0203A16E = 0; + CondenseDecorationCategoryN(sCurDecorationCategory); + gCurDecorInventoryItems = gDecorationInventories[sCurDecorationCategory].items; + IdentifyOwnedDecorationsCurrentlyInUse(taskId); + sSecretBasePCSelectDecorPageNo = 0; + sSecretBasePCSelectDecorLineNo = 0; gTasks[taskId].func = sub_8127620; } else @@ -737,13 +737,13 @@ void sub_8127208(u8 taskId) LoadPalette(gUnknown_085A6BB0, 0xd0, 0x20); sub_8197434(0, 0); gTasks[taskId].data[11] = 2; - gUnknown_0203A173 = DECORCAT_DESK; + sCurDecorationCategory = DECORCAT_DESK; sub_8126DFC(taskId); } void sub_8127250(u8 *dest, u8 decorCat) { - StringCopy(dest, gUnknown_085A6B28[decorCat]); + StringCopy(dest, sDecorCatNames[decorCat]); } void sub_8127268(u8 taskId) @@ -754,25 +754,25 @@ void sub_8127268(u8 taskId) void sub_8127284(void) { - gUnknown_0203A18C->unk_520 = gUnknown_0203A151 + 1; - if (gUnknown_0203A18C->unk_520 > 8) + sDecorPCBuffer->unk_520 = sCurDecorCatCount + 1; + if (sDecorPCBuffer->unk_520 > 8) { - gUnknown_0203A18C->unk_521 = 8; + sDecorPCBuffer->unk_521 = 8; } else { - gUnknown_0203A18C->unk_521 = gUnknown_0203A18C->unk_520; + sDecorPCBuffer->unk_521 = sDecorPCBuffer->unk_520; } } void sub_81272C8(void) { - sub_812225C(&gUnknown_0203A170, &gUnknown_0203A16E, gUnknown_0203A18C->unk_521, gUnknown_0203A18C->unk_520); + sub_812225C(&sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo, sDecorPCBuffer->unk_521, sDecorPCBuffer->unk_520); } void sub_81272F8(void) { - sub_8122298(&gUnknown_0203A170, &gUnknown_0203A16E, gUnknown_0203A18C->unk_521, gUnknown_0203A18C->unk_520, 8); + sub_8122298(&sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo, sDecorPCBuffer->unk_521, sDecorPCBuffer->unk_520, 8); } void sub_8127330(u8 taskId) @@ -781,7 +781,7 @@ void sub_8127330(u8 taskId) u16 i; data = gTasks[taskId].data; - if ((gUnknown_0203A173 < DECORCAT_DOLL || gUnknown_0203A173 > DECORCAT_CUSHION) && gUnknown_0203A17C.isPlayerRoom == TRUE && data[11] == 0) + if ((sCurDecorationCategory < DECORCAT_DOLL || sCurDecorationCategory > DECORCAT_CUSHION) && gUnknown_0203A17C.isPlayerRoom == TRUE && data[11] == 0) { sub_8127058(gStringVar1, TRUE); } @@ -789,20 +789,20 @@ void sub_8127330(u8 taskId) { sub_8127058(gStringVar1, FALSE); } - for (i = 0; i < gUnknown_0203A18C->unk_520 - 1; i ++) + for (i = 0; i < sDecorPCBuffer->unk_520 - 1; i ++) { - sub_8127454(gUnknown_0203A18C->unk_148[i], gUnknown_0203A14C[i]); - gUnknown_0203A18C->unk_000[i].unk_00 = gUnknown_0203A18C->unk_148[i]; - gUnknown_0203A18C->unk_000[i].unk_04 = i; + sub_8127454(sDecorPCBuffer->names[i], gCurDecorInventoryItems[i]); + sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i]; + sDecorPCBuffer->items[i].unk_04 = i; } - StringCopy(gUnknown_0203A18C->unk_148[i], gText_Cancel); - gUnknown_0203A18C->unk_000[i].unk_00 = gUnknown_0203A18C->unk_148[i]; - gUnknown_0203A18C->unk_000[i].unk_04 = -2; + StringCopy(sDecorPCBuffer->names[i], gText_Cancel); + sDecorPCBuffer->items[i].unk_00 = sDecorPCBuffer->names[i]; + sDecorPCBuffer->items[i].unk_04 = -2; gUnknown_03006310 = gUnknown_085A6BD0; - gUnknown_03006310.unk_10 = gUnknown_0203A188[1]; - gUnknown_03006310.unk_0c = gUnknown_0203A18C->unk_520; - gUnknown_03006310.unk_00 = gUnknown_0203A18C->unk_000; - gUnknown_03006310.unk_0e = gUnknown_0203A18C->unk_521; + gUnknown_03006310.unk_10 = sDecorMenuWindowIndices[1]; + gUnknown_03006310.unk_0c = sDecorPCBuffer->unk_520; + gUnknown_03006310.unk_00 = sDecorPCBuffer->items; + gUnknown_03006310.unk_0e = sDecorPCBuffer->unk_521; } void sub_8127454(u8 *dest, u16 decorId) @@ -837,18 +837,18 @@ void sub_81274A0(u8 a0, s32 a1, u8 a2) void sub_8127500(void) { - if (gUnknown_0203A18C->unk_522 == 0xFF) + if (sDecorPCBuffer->unk_522 == 0xFF) { - gUnknown_0203A18C->unk_522 = AddScrollIndicatorArrowPairParametrized(0x02, 0x3c, 0x0c, 0x94, gUnknown_0203A18C->unk_520 - gUnknown_0203A18C->unk_521, 0x6e, 0x6e, &gUnknown_0203A170); + sDecorPCBuffer->unk_522 = AddScrollIndicatorArrowPairParametrized(0x02, 0x3c, 0x0c, 0x94, sDecorPCBuffer->unk_520 - sDecorPCBuffer->unk_521, 0x6e, 0x6e, &sSecretBasePCSelectDecorPageNo); } } void sub_8127554(void) { - if (gUnknown_0203A18C->unk_522 != 0xFF) + if (sDecorPCBuffer->unk_522 != 0xFF) { - RemoveScrollIndicatorArrowPair(gUnknown_0203A18C->unk_522); - gUnknown_0203A18C->unk_522 = 0xFF; + RemoveScrollIndicatorArrowPair(sDecorPCBuffer->unk_522); + sDecorPCBuffer->unk_522 = 0xFF; } } @@ -864,14 +864,14 @@ void sub_812759C(u8 taskId) data = gTasks[taskId].data; sub_81269D4(3); - sub_8127718(gUnknown_0203A173); - gUnknown_0203A18C = calloc(1, sizeof(struct UnkStruct_0203A18C)); - gUnknown_0203A18C->unk_522 = 0xFF; + sub_8127718(sCurDecorationCategory); + sDecorPCBuffer = calloc(1, sizeof(struct DecorPCBuffer)); + sDecorPCBuffer->unk_522 = 0xFF; sub_8127284(); sub_81272C8(); sub_81272F8(); sub_8127330(taskId); - data[13] = ListMenuInit(&gUnknown_03006310, gUnknown_0203A170, gUnknown_0203A16E); + data[13] = ListMenuInit(&gUnknown_03006310, sSecretBasePCSelectDecorPageNo, sSecretBasePCSelectDecorLineNo); sub_8127500(); } @@ -890,24 +890,24 @@ void sub_812764C(u8 taskId) if (!gPaletteFade.active) { input = ListMenuHandleInput(data[13]); - get_coro_args_x18_x1A(data[13], &gUnknown_0203A170, &gUnknown_0203A16E); + get_coro_args_x18_x1A(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo); switch (input) { case -1: break; case -2: PlaySE(SE_SELECT); - gUnknown_085A6B78[data[11]][1](taskId); + SecretBasePC_SelectedDecorActions[data[11]][1](taskId); break; default: PlaySE(SE_SELECT); - gUnknown_0203A172 = input; + gCurDecorationIndex = input; sub_8127554(); - sub_81AE6C8(data[13], &gUnknown_0203A170, &gUnknown_0203A16E); + sub_81AE6C8(data[13], &sSecretBasePCSelectDecorPageNo, &sSecretBasePCSelectDecorLineNo); sub_8126A58(1); sub_81277A8(); - free(gUnknown_0203A18C); - gUnknown_085A6B78[data[11]][0](taskId); + free(sDecorPCBuffer); + SecretBasePC_SelectedDecorActions[data[11]][0](taskId); break; } } @@ -923,15 +923,15 @@ void sub_8127744(u32 a0) u8 winidx; const u8 *txt; - winidx = gUnknown_0203A188[3]; + winidx = sDecorMenuWindowIndices[3]; FillWindowPixelBuffer(winidx, 0x11); - if (a0 >= gUnknown_0203A151) + if (a0 >= sCurDecorCatCount) { txt = gText_GoBackPrevMenu; } else { - txt = gDecorations[gUnknown_0203A14C[a0]].description; + txt = gDecorations[gCurDecorInventoryItems[a0]].description; } PrintTextOnWindow(winidx, 1, txt, 0, 1, 0, 0); } @@ -948,7 +948,7 @@ bool8 sub_81277BC(u8 idx) for (i = 0; i < 16; i ++) { - if (gUnknown_0203A152[i] == idx) + if (sSecretBaseItemsIndicesBuffer[i] == idx) { return TRUE; } @@ -962,7 +962,7 @@ bool8 sub_81277E8(u8 idx) for (i = 0; i < 12; i ++) { - if (gUnknown_0203A162[i] == idx) + if (sPlayerRoomItemsIndicesBuffer[i] == idx) { return TRUE; } @@ -970,7 +970,7 @@ bool8 sub_81277E8(u8 idx) return FALSE; } -void sub_8127814(u8 taskId) +void IdentifyOwnedDecorationsCurrentlyInUseInternal(u8 taskId) { u16 i; u16 j; @@ -978,20 +978,20 @@ void sub_8127814(u8 taskId) u16 cnt; cnt = 0; - memset(gUnknown_0203A152, 0, 16); - memset(gUnknown_0203A162, 0, 12); + memset(sSecretBaseItemsIndicesBuffer, 0, 16); + memset(sPlayerRoomItemsIndicesBuffer, 0, 12); for (i = 0; i < 16; i ++) { if (gSaveBlock1Ptr->secretBases[0].decorations[i] != DECOR_NONE) { - for (j = 0; j < gDecorationInventories[gUnknown_0203A173].size; j ++) + for (j = 0; j < gDecorationInventories[sCurDecorationCategory].size; j ++) { - if (gUnknown_0203A14C[j] == gSaveBlock1Ptr->secretBases[0].decorations[i]) + if (gCurDecorInventoryItems[j] == gSaveBlock1Ptr->secretBases[0].decorations[i]) { - for (k = 0; k < cnt && gUnknown_0203A152[k] != j + 1; k ++); + for (k = 0; k < cnt && sSecretBaseItemsIndicesBuffer[k] != j + 1; k ++); if (k == cnt) { - gUnknown_0203A152[cnt] = j + 1; + sSecretBaseItemsIndicesBuffer[cnt] = j + 1; cnt ++; break; } @@ -1004,14 +1004,14 @@ void sub_8127814(u8 taskId) { if (gSaveBlock1Ptr->playerRoomDecor[i] != DECOR_NONE) { - for (j = 0; j < gDecorationInventories[gUnknown_0203A173].size; j ++) + for (j = 0; j < gDecorationInventories[sCurDecorationCategory].size; j ++) { - if (gUnknown_0203A14C[j] == gSaveBlock1Ptr->playerRoomDecor[i] && sub_81277BC(j + 1) != TRUE) + if (gCurDecorInventoryItems[j] == gSaveBlock1Ptr->playerRoomDecor[i] && sub_81277BC(j + 1) != TRUE) { - for (k = 0; k < cnt && gUnknown_0203A162[k] != j + 1; k ++); + for (k = 0; k < cnt && sPlayerRoomItemsIndicesBuffer[k] != j + 1; k ++); if (k == cnt) { - gUnknown_0203A162[cnt] = j + 1; + sPlayerRoomItemsIndicesBuffer[cnt] = j + 1; cnt ++; break; } @@ -1021,21 +1021,21 @@ void sub_8127814(u8 taskId) } } -void sub_81279B4(u8 taskId) +void IdentifyOwnedDecorationsCurrentlyInUse(u8 taskId) { - sub_8127814(taskId); + IdentifyOwnedDecorationsCurrentlyInUseInternal(taskId); } -bool8 sub_81279C4(void) +bool8 IsSelectedDecorInThePC(void) { u16 i; for (i = 0; i < 16; i ++) { - if (gUnknown_0203A152[i] == gUnknown_0203A170 + gUnknown_0203A16E + 1) + if (sSecretBaseItemsIndicesBuffer[i] == sSecretBasePCSelectDecorPageNo + sSecretBasePCSelectDecorLineNo + 1) { return FALSE; } - if (i < 12 && gUnknown_0203A162[i] == gUnknown_0203A170 + gUnknown_0203A16E + 1) + if (i < 12 && sPlayerRoomItemsIndicesBuffer[i] == sSecretBasePCSelectDecorPageNo + sSecretBasePCSelectDecorLineNo + 1) { return FALSE; } @@ -1073,7 +1073,7 @@ void sub_8127A8C(u8 taskId) sub_8127554(); sub_81277A8(); sub_81AE6C8(data[13], NULL, NULL); - free(gUnknown_0203A18C); + free(sDecorPCBuffer); sub_8126E44(taskId); } @@ -1210,10 +1210,10 @@ void sub_8127E18(void) break; } } - VarSet(0x3F20 + gMapHeader.events->mapObjects[j].graphicsId, gUnknown_0203A190.decoration->tiles[0]); + VarSet(0x3F20 + gMapHeader.events->mapObjects[j].graphicsId, sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0]); gSpecialVar_0x8005 = gMapHeader.events->mapObjects[j].localId; - gSpecialVar_0x8006 = gUnknown_0203AA34; - gSpecialVar_0x8007 = gUnknown_0203AA36; + gSpecialVar_0x8006 = sCurDecorMapX; + gSpecialVar_0x8007 = sCurDecorMapY; show_sprite(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); sub_808EBA8(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gSpecialVar_0x8006, gSpecialVar_0x8007); sub_808F254(gSpecialVar_0x8005, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); @@ -1238,12 +1238,12 @@ bool8 sub_8127F38(void) void sub_8127F68(u8 taskId) { - if (gUnknown_0203A17C.isPlayerRoom == TRUE && gUnknown_0203A173 != DECORCAT_DOLL && gUnknown_0203A173 != DECORCAT_CUSHION) + if (gUnknown_0203A17C.isPlayerRoom == TRUE && sCurDecorationCategory != DECORCAT_DOLL && sCurDecorationCategory != DECORCAT_CUSHION) { StringExpandPlaceholders(gStringVar4, gText_CantPlaceInRoom); DisplayItemMessageOnField(taskId, gStringVar4, sub_8127A5C); } - else if (sub_81279C4() == TRUE) + else if (IsSelectedDecorInThePC() == TRUE) { if (sub_8127F38() == TRUE) { @@ -1284,9 +1284,9 @@ void sub_8128060(u8 taskId) break; case 1: gPaletteFade.bufferTransferDisabled = TRUE; - ConfigureCameraObjectForPlacingDecoration(&gUnknown_0203A190, gUnknown_0203A14C[gUnknown_0203A172]); + ConfigureCameraObjectForPlacingDecoration(&sPlaceDecorationGraphicsDataBuffer, gCurDecorInventoryItems[gCurDecorationIndex]); sub_812826C(taskId); - SetUpPlacingDecorationPlayerAvatar(taskId, &gUnknown_0203A190); + SetUpPlacingDecorationPlayerAvatar(taskId, &sPlaceDecorationGraphicsDataBuffer); pal_fill_black(); gPaletteFade.bufferTransferDisabled = FALSE; gTasks[taskId].data[2] = 2; @@ -1301,9 +1301,9 @@ void sub_8128060(u8 taskId) } } -void ConfigureCameraObjectForPlacingDecoration(struct UnkStruct_0203A190 *data, u8 decor) +void ConfigureCameraObjectForPlacingDecoration(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor) { - gUnknown_0203AA38 = gSprites[gUnknown_03005DD0.unk4].data0; + sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0; gUnknown_03005DD0.unk4 = gpu_pal_decompress_alloc_tag_and_upload(data, decor); gSprites[gUnknown_03005DD0.unk4].oam.priority = 1; gSprites[gUnknown_03005DD0.unk4].callback = sub_81292D0; @@ -1311,7 +1311,7 @@ void ConfigureCameraObjectForPlacingDecoration(struct UnkStruct_0203A190 *data, gSprites[gUnknown_03005DD0.unk4].pos1.y = gUnknown_085A7250[data->decoration->shape].y; } -void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_0203A190 *data) +void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct PlaceDecorationGraphicsDataBuffer *data) { u8 v0; @@ -1322,20 +1322,20 @@ void SetUpPlacingDecorationPlayerAvatar(u8 taskId, struct UnkStruct_0203A190 *da } if (gSaveBlock2Ptr->playerGender == MALE) { - gUnknown_0203AA39 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, v0, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, v0, 0x48, 0); } else { - gUnknown_0203AA39 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, v0, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, v0, 0x48, 0); } - gSprites[gUnknown_0203AA39].oam.priority = 1; - DestroySprite(&gSprites[gUnknown_0203AA38]); - gUnknown_0203AA38 = gUnknown_03005DD0.unk4; + gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1; + DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]); + sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4; } void sub_812826C(u8 taskId) { - switch (gDecorations[gUnknown_0203A14C[gUnknown_0203A172]].shape) + switch (gDecorations[gCurDecorInventoryItems[gCurDecorationIndex]].shape) { case DECORSHAPE_1x1: gTasks[taskId].data[5] = 1; @@ -1384,8 +1384,8 @@ void sub_812826C(u8 taskId) void sub_81283BC(u8 taskId) { gTasks[taskId].data[10] = 0; - gSprites[gUnknown_0203AA38].data7 = 1; - gSprites[gUnknown_0203AA39].data7 = 1; + gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1; + gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1; sub_8128DE0(); sub_8128950(taskId); } @@ -1393,8 +1393,8 @@ void sub_81283BC(u8 taskId) void sub_8128414(u8 taskId) { gTasks[taskId].data[10] = 0; - gSprites[gUnknown_0203AA38].data7 = 1; - gSprites[gUnknown_0203AA39].data7 = 1; + gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 1; + gSprites[sDecor_CameraSpriteObjectIdx2].data7 = 1; sub_8128DE0(); StringExpandPlaceholders(gStringVar4, gText_CancelDecorating); DisplayItemMessageOnField(taskId, gStringVar4, sub_8128B80); @@ -1569,7 +1569,7 @@ bool8 sub_812853C(u8 taskId, const struct Decoration *decoration) void sub_8128950(u8 taskId) { - if (sub_812853C(taskId, &gDecorations[gUnknown_0203A14C[gUnknown_0203A172]]) == TRUE) + if (sub_812853C(taskId, &gDecorations[gCurDecorInventoryItems[gCurDecorationIndex]]) == TRUE) { StringExpandPlaceholders(gStringVar4, gText_PlaceItHere); DisplayItemMessageOnField(taskId, gStringVar4, sub_81289D0); @@ -1592,17 +1592,17 @@ void sub_81289F0(u8 taskId) { sub_8197434(0, 0); sub_8128AAC(taskId); - if (gDecorations[gUnknown_0203A14C[gUnknown_0203A172]].permission != DECORPERM_SOLID_MAT) + if (gDecorations[gCurDecorInventoryItems[gCurDecorationIndex]].permission != DECORPERM_SOLID_MAT) { - sub_8127D38(gTasks[taskId].data[0], gTasks[taskId].data[1], gUnknown_0203A14C[gUnknown_0203A172]); + sub_8127D38(gTasks[taskId].data[0], gTasks[taskId].data[1], gCurDecorInventoryItems[gCurDecorationIndex]); } else { - gUnknown_0203AA34 = gTasks[taskId].data[0] - 7; - gUnknown_0203AA36 = gTasks[taskId].data[1] - 7; + sCurDecorMapX = gTasks[taskId].data[0] - 7; + sCurDecorMapY = gTasks[taskId].data[1] - 7; ScriptContext1_SetupScript(gUnknown_08275D1F); } - gSprites[gUnknown_0203AA38].pos1.y += 2; + gSprites[sDecor_CameraSpriteObjectIdx1].pos1.y += 2; if (gMapHeader.regionMapSectionId == REGION_MAP_SECRET_BASE) { TV_PutSecretBaseVisitOnTheAir(); @@ -1618,7 +1618,7 @@ void sub_8128AAC(u8 taskId) { if (gUnknown_0203A17C.items[i] == DECOR_NONE) { - gUnknown_0203A17C.items[i] = gUnknown_0203A14C[gUnknown_0203A172]; + gUnknown_0203A17C.items[i] = gCurDecorInventoryItems[gCurDecorationIndex]; gUnknown_0203A17C.pos[i] = ((gTasks[taskId].data[0] - 7) << 4) + (gTasks[taskId].data[1] - 7); break; } @@ -1627,9 +1627,9 @@ void sub_8128AAC(u8 taskId) { for (i = 0; i < 16; i ++) { - if (gUnknown_0203A152[i] == 0) + if (sSecretBaseItemsIndicesBuffer[i] == 0) { - gUnknown_0203A152[i] = gUnknown_0203A172 + 1; + sSecretBaseItemsIndicesBuffer[i] = gCurDecorationIndex + 1; break; } } @@ -1638,9 +1638,9 @@ void sub_8128AAC(u8 taskId) { for (i = 0; i < 12; i ++) { - if (gUnknown_0203A162[i] == 0) + if (sPlayerRoomItemsIndicesBuffer[i] == 0) { - gUnknown_0203A162[i] = gUnknown_0203A172 + 1; + sPlayerRoomItemsIndicesBuffer[i] = gCurDecorationIndex + 1; break; } } @@ -1680,7 +1680,7 @@ void c1_overworld_prev_quest(u8 taskId) break; case 1: sub_812A3C8(); - FreeSpritePaletteByTag(OVERWORLD_DECOR_PAL_TAG); + FreeSpritePaletteByTag(OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG); gFieldCallback = sub_8128CD4; SetMainCallback2(c2_exit_to_overworld_2_switch); DestroyTask(taskId); @@ -1732,22 +1732,22 @@ bool8 sub_8128D10(u8 taskId) s16 *data; data = gTasks[taskId].data; - if (gUnknown_0203AA3A == DIR_SOUTH && data[1] - data[6] - 6 < 0) + if (sDecorationLastDirectionMoved == DIR_SOUTH && data[1] - data[6] - 6 < 0) { data[1] ++; return FALSE; } - if (gUnknown_0203AA3A == DIR_NORTH && data[1] - 7 >= gMapHeader.mapData->height) + if (sDecorationLastDirectionMoved == DIR_NORTH && data[1] - 7 >= gMapHeader.mapData->height) { data[1] --; return FALSE; } - if (gUnknown_0203AA3A == DIR_WEST && data[0] - 7 < 0) + if (sDecorationLastDirectionMoved == DIR_WEST && data[0] - 7 < 0) { data[0] ++; return FALSE; } - if (gUnknown_0203AA3A == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) + if (sDecorationLastDirectionMoved == DIR_EAST && data[0] + data[5] - 8 >= gMapHeader.mapData->width) { data[0] --; return FALSE; @@ -1769,9 +1769,9 @@ bool8 sub_8128DB4(void) void sub_8128DE0(void) { - gUnknown_0203AA3A = 0; - gSprites[gUnknown_0203AA38].data2 = 0; - gSprites[gUnknown_0203AA38].data3 = 0; + sDecorationLastDirectionMoved = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0; } void sub_8128E18(u8 taskId) @@ -1779,7 +1779,7 @@ void sub_8128E18(u8 taskId) s16 *data; data = gTasks[taskId].data; - if (!gSprites[gUnknown_0203AA38].data4) + if (!gSprites[sDecor_CameraSpriteObjectIdx1].data4) { if (data[10] == 1) { @@ -1792,30 +1792,30 @@ void sub_8128E18(u8 taskId) } if ((gMain.heldKeys & 0x0F0) == DPAD_UP) { - gUnknown_0203AA3A = DIR_SOUTH; - gSprites[gUnknown_0203AA38].data2 = 0; - gSprites[gUnknown_0203AA38].data3 = -2; + sDecorationLastDirectionMoved = DIR_SOUTH; + gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data3 = -2; data[1]--; } if ((gMain.heldKeys & 0x0F0) == DPAD_DOWN) { - gUnknown_0203AA3A = DIR_NORTH; - gSprites[gUnknown_0203AA38].data2 = 0; - gSprites[gUnknown_0203AA38].data3 = 2; + sDecorationLastDirectionMoved = DIR_NORTH; + gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 2; data[1]++; } if ((gMain.heldKeys & 0x0F0) == DPAD_LEFT) { - gUnknown_0203AA3A = DIR_WEST; - gSprites[gUnknown_0203AA38].data2 = -2; - gSprites[gUnknown_0203AA38].data3 = 0; + sDecorationLastDirectionMoved = DIR_WEST; + gSprites[sDecor_CameraSpriteObjectIdx1].data2 = -2; + gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0; data[0]--; } if ((gMain.heldKeys & 0x0F0) == DPAD_RIGHT) { - gUnknown_0203AA3A = DIR_EAST; - gSprites[gUnknown_0203AA38].data2 = 2; - gSprites[gUnknown_0203AA38].data3 = 0; + sDecorationLastDirectionMoved = DIR_EAST; + gSprites[sDecor_CameraSpriteObjectIdx1].data2 = 2; + gSprites[sDecor_CameraSpriteObjectIdx1].data3 = 0; data[0]++; } if (!sub_8128DB4() || !sub_8128D10(taskId)) @@ -1823,10 +1823,10 @@ void sub_8128E18(u8 taskId) sub_8128DE0(); } } - if (gUnknown_0203AA3A) + if (sDecorationLastDirectionMoved) { - gSprites[gUnknown_0203AA38].data4++; - gSprites[gUnknown_0203AA38].data4 &= 7; + gSprites[sDecor_CameraSpriteObjectIdx1].data4++; + gSprites[sDecor_CameraSpriteObjectIdx1].data4 &= 7; } if (!data[10]) { @@ -1844,7 +1844,7 @@ void sub_8128E18(u8 taskId) void sub_8128FD8(u8 taskId) { sub_8197434(0, 1); - gSprites[gUnknown_0203AA38].data7 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0; gTasks[taskId].data[10] = 0; gTasks[taskId].func = sub_8128E18; } @@ -1857,7 +1857,7 @@ void sub_8129020(u8 taskId) } } -void sub_8129048(struct UnkStruct_0203A190 *data) +void sub_8129048(struct PlaceDecorationGraphicsDataBuffer *data) { CpuFill16(0, data, sizeof(*data)); } @@ -1911,7 +1911,7 @@ void sub_8129088(u8 *dest, u16 tile) } } -void sub_81291A4(struct UnkStruct_0203A190 *data) +void sub_81291A4(struct PlaceDecorationGraphicsDataBuffer *data) { u16 i; for (i = 0; i < 64; i ++) @@ -1925,7 +1925,7 @@ u16 sub_81291CC(u16 tile) return ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[tile] & 0xFFF; } -void sub_81291E8(struct UnkStruct_0203A190 *data) +void sub_81291E8(struct PlaceDecorationGraphicsDataBuffer *data) { u8 i; u8 shape; @@ -1937,20 +1937,20 @@ void sub_81291E8(struct UnkStruct_0203A190 *data) } } -void sub_812925C(u8 decoShape) +void SetDecorSelectionBoxOamAttributes(u8 decorShape) { - gUnknown_0203AA3C.y = 0; - gUnknown_0203AA3C.affineMode = ST_OAM_AFFINE_OFF; - gUnknown_0203AA3C.objMode = ST_OAM_OBJ_NORMAL; - gUnknown_0203AA3C.mosaic = 0; - gUnknown_0203AA3C.bpp = ST_OAM_4BPP; - gUnknown_0203AA3C.shape = gUnknown_085A7250[decoShape].shape; - gUnknown_0203AA3C.x = 0; - gUnknown_0203AA3C.matrixNum = 0; - gUnknown_0203AA3C.size = gUnknown_085A7250[decoShape].size; - gUnknown_0203AA3C.tileNum = 0; - gUnknown_0203AA3C.priority = 0; - gUnknown_0203AA3C.paletteNum = 0; + sDecorSelectorOam.y = 0; + sDecorSelectorOam.affineMode = ST_OAM_AFFINE_OFF; + sDecorSelectorOam.objMode = ST_OAM_OBJ_NORMAL; + sDecorSelectorOam.mosaic = 0; + sDecorSelectorOam.bpp = ST_OAM_4BPP; + sDecorSelectorOam.shape = gUnknown_085A7250[decorShape].shape; + sDecorSelectorOam.x = 0; + sDecorSelectorOam.matrixNum = 0; + sDecorSelectorOam.size = gUnknown_085A7250[decorShape].size; + sDecorSelectorOam.tileNum = 0; + sDecorSelectorOam.priority = 0; + sDecorSelectorOam.paletteNum = 0; } void sub_81292D0(struct Sprite *sprite) @@ -1985,7 +1985,7 @@ void sub_81292E8(struct Sprite *sprite) } } -u8 gpu_pal_decompress_alloc_tag_and_upload(struct UnkStruct_0203A190 *data, u8 decor) +u8 gpu_pal_decompress_alloc_tag_and_upload(struct PlaceDecorationGraphicsDataBuffer *data, u8 decor) { sub_8129048(data); data->decoration = &gDecorations[decor]; @@ -1993,13 +1993,13 @@ u8 gpu_pal_decompress_alloc_tag_and_upload(struct UnkStruct_0203A190 *data, u8 d { return AddPseudoFieldObject(data->decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); } - FreeSpritePaletteByTag(OVERWORLD_DECOR_PAL_TAG); + FreeSpritePaletteByTag(OVERWORLD_PLACE_DECOR_SELECTOR_PAL_TAG); sub_81291E8(data); - sub_812925C(data->decoration->shape); + SetDecorSelectionBoxOamAttributes(data->decoration->shape); sub_81291A4(data); sub_8129068(data->palette, ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[(data->decoration->tiles[0] * 8) + 7] >> 12); LoadSpritePalette(&gUnknown_085A72BC); - return CreateSprite(&gUnknown_085A728C, 0, 0, 0); + return CreateSprite(&sDecorSelectorSpriteTemplate, 0, 0, 0); } u8 AddDecorationIconObjectFromIconTable(u16 tilesTag, u16 paletteTag, u8 decor) @@ -2048,23 +2048,23 @@ u8 AddDecorationIconObjectFromFieldObject(u16 tilesTag, u16 paletteTag, u8 decor struct SpritePalette palette; struct SpriteTemplate *template; - sub_8129048(&gUnknown_0203A190); - gUnknown_0203A190.decoration = &gDecorations[decor]; - if (gUnknown_0203A190.decoration->permission != DECORPERM_SOLID_MAT) + sub_8129048(&sPlaceDecorationGraphicsDataBuffer); + sPlaceDecorationGraphicsDataBuffer.decoration = &gDecorations[decor]; + if (sPlaceDecorationGraphicsDataBuffer.decoration->permission != DECORPERM_SOLID_MAT) { - sub_81291E8(&gUnknown_0203A190); - sub_812925C(gUnknown_0203A190.decoration->shape); - sub_81291A4(&gUnknown_0203A190); - sub_8129068(gUnknown_0203A190.palette, ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[(gUnknown_0203A190.decoration->tiles[0] * 8) + 7] >> 12); - sheet.data = gUnknown_0203A190.image; - sheet.size = gUnknown_085A72F4[gUnknown_0203A190.decoration->shape] << 5; + sub_81291E8(&sPlaceDecorationGraphicsDataBuffer); + SetDecorSelectionBoxOamAttributes(sPlaceDecorationGraphicsDataBuffer.decoration->shape); + sub_81291A4(&sPlaceDecorationGraphicsDataBuffer); + sub_8129068(sPlaceDecorationGraphicsDataBuffer.palette, ((u16 *)gTilesetPointer_SecretBaseRedCave->metatiles)[(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0] * 8) + 7] >> 12); + sheet.data = sPlaceDecorationGraphicsDataBuffer.image; + sheet.size = gUnknown_085A72F4[sPlaceDecorationGraphicsDataBuffer.decoration->shape] << 5; sheet.tag = tilesTag; LoadSpriteSheet(&sheet); - palette.data = gUnknown_0203A190.palette; + palette.data = sPlaceDecorationGraphicsDataBuffer.palette; palette.tag = paletteTag; LoadSpritePalette(&palette); template = Alloc(sizeof(struct SpriteTemplate)); - *template = gUnknown_085A72A4; + *template = sDecorWhilePlacingSpriteTemplate; template->tileTag = tilesTag; template->paletteTag = paletteTag; spriteId = CreateSprite(template, 0, 0, 0); @@ -2072,7 +2072,7 @@ u8 AddDecorationIconObjectFromFieldObject(u16 tilesTag, u16 paletteTag, u8 decor } else { - spriteId = AddPseudoFieldObject(gUnknown_0203A190.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); + spriteId = AddPseudoFieldObject(sPlaceDecorationGraphicsDataBuffer.decoration->tiles[0], SpriteCallbackDummy, 0, 0, 1); } return spriteId; } @@ -2134,14 +2134,14 @@ void sub_8129708(void) gSpecialVar_0x8005 = 0; gScriptResult = 0; - if (gSpecialVar_0x8004 == gUnknown_0203AAC4) + if (gSpecialVar_0x8004 == sCurDecorSelectedInRearrangement) { gScriptResult = 1; } - else if (gDecorations[gUnknown_0203A17C.items[gUnknown_0203AA44[gSpecialVar_0x8004].idx]].permission == DECORPERM_SOLID_MAT) + else if (gDecorations[gUnknown_0203A17C.items[sDecorRearrangementDataBuffer[gSpecialVar_0x8004].idx]].permission == DECORPERM_SOLID_MAT) { - gSpecialVar_0x8005 = gUnknown_0203AA44[gSpecialVar_0x8004].flagId; - sub_81296EC(gUnknown_0203AA44[gSpecialVar_0x8004].idx); + gSpecialVar_0x8005 = sDecorRearrangementDataBuffer[gSpecialVar_0x8004].flagId; + sub_81296EC(sDecorRearrangementDataBuffer[gSpecialVar_0x8004].idx); for (i = 0; i < gMapHeader.events->mapObjectCount; i ++) { if (gMapHeader.events->mapObjects[i].flagId == gSpecialVar_0x8005) @@ -2176,21 +2176,21 @@ void sub_81297F8(void) int posY; u8 perm; - for (i = 0; i < gUnknown_0203AAC4; i ++) + for (i = 0; i < sCurDecorSelectedInRearrangement; i ++) { - perm = gDecorations[gUnknown_0203A17C.items[gUnknown_0203AA44[i].idx]].permission; - posX = gUnknown_0203A17C.pos[gUnknown_0203AA44[i].idx] >> 4; - posY = gUnknown_0203A17C.pos[gUnknown_0203AA44[i].idx] & 0x0F; + perm = gDecorations[gUnknown_0203A17C.items[sDecorRearrangementDataBuffer[i].idx]].permission; + posX = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[i].idx] >> 4; + posY = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[i].idx] & 0x0F; if (perm != DECORPERM_SOLID_MAT) { - for (y = 0; y < gUnknown_0203AA44[i].height; y ++) + for (y = 0; y < sDecorRearrangementDataBuffer[i].height; y ++) { - for (x = 0; x < gUnknown_0203AA44[i].width; x ++) + for (x = 0; x < sDecorRearrangementDataBuffer[i].width; x ++) { MapGridSetMetatileEntryAt(posX + 7 + x, posY + 7 - y, gMapHeader.mapData->map[posX + x + gMapHeader.mapData->width * (posY - y)] | 0x3000); } } - sub_81296EC(gUnknown_0203AA44[i].idx); + sub_81296EC(sDecorRearrangementDataBuffer[i].idx); } } } @@ -2213,7 +2213,7 @@ void sub_81298EC(u8 taskId) break; case 2: ScriptContext2_Enable(); - sub_8127814(taskId); + IdentifyOwnedDecorationsCurrentlyInUseInternal(taskId); pal_fill_black(); gTasks[taskId].data[2] = 3; break; @@ -2249,21 +2249,21 @@ bool8 sub_81299AC(u8 taskId) void SetUpPuttingAwayDecorationPlayerAvatar(void) { player_get_direction_lower_nybble(); - gUnknown_0203AA38 = gSprites[gUnknown_03005DD0.unk4].data0; + sDecor_CameraSpriteObjectIdx1 = gSprites[gUnknown_03005DD0.unk4].data0; sub_812A39C(); gUnknown_03005DD0.unk4 = CreateSprite(&gUnknown_085A7404, 0x78, 0x50, 0); if (gSaveBlock2Ptr->playerGender == MALE) { - gUnknown_0203AA39 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC1, SpriteCallbackDummy, 0x88, 0x48, 0); } else { - gUnknown_0203AA39 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, 0x88, 0x48, 0); + sDecor_CameraSpriteObjectIdx2 = AddPseudoFieldObject(0xC2, SpriteCallbackDummy, 0x88, 0x48, 0); } - gSprites[gUnknown_0203AA39].oam.priority = 1; - DestroySprite(&gSprites[gUnknown_0203AA38]); - gUnknown_0203AA38 = gUnknown_03005DD0.unk4; - gSprites[gUnknown_0203AA38].oam.priority = 1; + gSprites[sDecor_CameraSpriteObjectIdx2].oam.priority = 1; + DestroySprite(&gSprites[sDecor_CameraSpriteObjectIdx1]); + sDecor_CameraSpriteObjectIdx1 = gUnknown_03005DD0.unk4; + gSprites[sDecor_CameraSpriteObjectIdx1].oam.priority = 1; } void sub_8129ABC(u8 taskId) @@ -2300,11 +2300,11 @@ void sub_8129ABC(u8 taskId) void sub_8129B34(u8 taskId) { sub_8197434(0, 1); - gSprites[gUnknown_0203AA38].data7 = 0; - gSprites[gUnknown_0203AA38].invisible = FALSE; - gSprites[gUnknown_0203AA38].callback = sub_812A36C; - gSprites[gUnknown_0203AA39].pos1.x = 0x88; - gSprites[gUnknown_0203AA39].pos1.y = 0x48; + gSprites[sDecor_CameraSpriteObjectIdx1].data7 = 0; + gSprites[sDecor_CameraSpriteObjectIdx1].invisible = FALSE; + gSprites[sDecor_CameraSpriteObjectIdx1].callback = sub_812A36C; + gSprites[sDecor_CameraSpriteObjectIdx2].pos1.x = 0x88; + gSprites[sDecor_CameraSpriteObjectIdx2].pos1.y = 0x48; gTasks[taskId].data[10] = 0; gTasks[taskId].func = sub_8128E18; } @@ -2320,8 +2320,8 @@ void sub_8129BF8(u8 taskId) { gTasks[taskId].data[10] = 0; sub_8128DE0(); - gSprites[gUnknown_0203AA38].invisible = FALSE; - gSprites[gUnknown_0203AA38].callback = SpriteCallbackDummy; + gSprites[sDecor_CameraSpriteObjectIdx1].invisible = FALSE; + gSprites[sDecor_CameraSpriteObjectIdx1].callback = SpriteCallbackDummy; StringExpandPlaceholders(gStringVar4, gText_StopPuttingAwayDecorations); DisplayItemMessageOnField(taskId, gStringVar4, sub_812A1F0); } @@ -2332,7 +2332,7 @@ void sub_8129C74(u8 taskId) u8 behavior; sub_812A0E8(taskId); - if (gUnknown_0203AAC4 != 0) + if (sCurDecorSelectedInRearrangement != 0) { StringExpandPlaceholders(gStringVar4, gText_ReturnDecorationToPC); DisplayItemMessageOnField(taskId, gStringVar4, sub_812A1A0); @@ -2343,8 +2343,8 @@ void sub_8129C74(u8 taskId) behavior = MapGridGetMetatileBehaviorAt(data[0], data[1]); if (MetatileBehavior_IsSecretBasePC(behavior) == TRUE || MetatileBehavior_IsMB_C5(behavior) == TRUE) { - gSprites[gUnknown_0203AA38].invisible = FALSE; - gSprites[gUnknown_0203AA38].callback = SpriteCallbackDummy; + gSprites[sDecor_CameraSpriteObjectIdx1].invisible = FALSE; + gSprites[sDecor_CameraSpriteObjectIdx1].callback = SpriteCallbackDummy; StringExpandPlaceholders(gStringVar4, gText_StopPuttingAwayDecorations); DisplayItemMessageOnField(taskId, gStringVar4, sub_812A1F0); } @@ -2364,7 +2364,7 @@ void sub_8129D64(u8 taskId) } } -void sub_8129D8C(u8 decor, struct UnkStruct_0203AA44 *data) +void sub_8129D8C(u8 decor, struct DecorRearrangementDataBuffer *data) { if (gDecorations[decor].shape == DECORSHAPE_1x1) { @@ -2411,13 +2411,13 @@ void sub_8129D8C(u8 decor, struct UnkStruct_0203AA44 *data) void sub_8129E0C(u8 x, u8 y) { - gSprites[gUnknown_0203AA38].invisible = TRUE; - gSprites[gUnknown_0203AA38].callback = SpriteCallbackDummy; - gSprites[gUnknown_0203AA39].pos1.x = (x << 4) + 0x88; - gSprites[gUnknown_0203AA39].pos1.y = (y << 4) + 0x48; + gSprites[sDecor_CameraSpriteObjectIdx1].invisible = TRUE; + gSprites[sDecor_CameraSpriteObjectIdx1].callback = SpriteCallbackDummy; + gSprites[sDecor_CameraSpriteObjectIdx2].pos1.x = (x << 4) + 0x88; + gSprites[sDecor_CameraSpriteObjectIdx2].pos1.y = (y << 4) + 0x48; } -bool8 sub_8129E74(u8 taskId, u8 idx, struct UnkStruct_0203AA44 *data) +bool8 sub_8129E74(u8 taskId, u8 idx, struct DecorRearrangementDataBuffer *data) { u8 x; u8 y; @@ -2447,14 +2447,14 @@ void sub_8129F20(void) u8 xOff; u8 yOff; u16 i; - - xOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[gUnknown_0203AAC4].idx] >> 4; - yOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[gUnknown_0203AAC4].idx] & 0x0F; + + xOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].idx] >> 4; + yOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].idx] & 0x0F; for (i = 0; i < 0x40; i ++) { if (gSaveBlock1Ptr->mapObjectTemplates[i].x == xOff && gSaveBlock1Ptr->mapObjectTemplates[i].y == yOff && !FlagGet(gSaveBlock1Ptr->mapObjectTemplates[i].flagId)) { - gUnknown_0203AA44[gUnknown_0203AAC4].flagId = gSaveBlock1Ptr->mapObjectTemplates[i].flagId; + sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].flagId = gSaveBlock1Ptr->mapObjectTemplates[i].flagId; break; } } @@ -2470,12 +2470,12 @@ bool8 sub_8129FC8(u8 taskId) { if (gDecorations[gUnknown_0203A17C.items[i]].permission == DECORPERM_SOLID_MAT) { - sub_8129D8C(gUnknown_0203A17C.items[i], gUnknown_0203AA44); - if (sub_8129E74(taskId, i, gUnknown_0203AA44) == TRUE) + sub_8129D8C(gUnknown_0203A17C.items[i], sDecorRearrangementDataBuffer); + if (sub_8129E74(taskId, i, sDecorRearrangementDataBuffer) == TRUE) { - gUnknown_0203AA44->idx = i; + sDecorRearrangementDataBuffer->idx = i; sub_8129F20(); - gUnknown_0203AAC4 = 1; + sCurDecorSelectedInRearrangement = 1; return TRUE; } } @@ -2498,9 +2498,9 @@ void sub_812A040(u8 left, u8 top, u8 right, u8 bottom) yOff = gUnknown_0203A17C.pos[i] & 0x0F; if (decorIdx != 0 && gDecorations[decorIdx].permission == DECORPERM_SOLID_MAT && left <= xOff && top <= yOff && right >= xOff && bottom >= yOff) { - gUnknown_0203AA44[gUnknown_0203AAC4].idx = i; + sDecorRearrangementDataBuffer[sCurDecorSelectedInRearrangement].idx = i; sub_8129F20(); - gUnknown_0203AAC4++; + sCurDecorSelectedInRearrangement++; } } } @@ -2513,9 +2513,9 @@ void sub_812A0E8(u8 taskId) u8 yOff; u8 decor; register u8 decor asm("r1"); - struct UnkStruct_0203AA44 *data; + struct DecorRearrangementDataBuffer *data; - gUnknown_0203AAC4 = 0; + sCurDecorSelectedInRearrangement = 0; if (sub_8129FC8(taskId) != TRUE) { for (i = 0; i < gUnknown_0203A17C.size; i ++) @@ -2523,21 +2523,21 @@ void sub_812A0E8(u8 taskId) decor = gUnknown_0203A17C.items[i]; if (decor != DECOR_NONE) { - data = &gUnknown_0203AA44[0]; + data = &sDecorRearrangementDataBuffer[0]; sub_8129D8C(decor, data); if (sub_8129E74(taskId, i, data) == TRUE) { data->idx = i; - gUnknown_0203AAC4 ++; + sCurDecorSelectedInRearrangement ++; break; } } } - if (gUnknown_0203AAC4 != 0) + if (sCurDecorSelectedInRearrangement != 0) { - xOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[0].idx] >> 4; - yOff = gUnknown_0203A17C.pos[gUnknown_0203AA44[0].idx] & 0x0F; - sub_812A040(xOff, yOff - gUnknown_0203AA44[0].height + 1, xOff + gUnknown_0203AA44[0].width - 1, yOff); // Arithmetic register swap at the r2 argument: `add r2, r0, r2` instead of `add r2, r2, r0` + xOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[0].idx] >> 4; + yOff = gUnknown_0203A17C.pos[sDecorRearrangementDataBuffer[0].idx] & 0x0F; + sub_812A040(xOff, yOff - sDecorRearrangementDataBuffer[0].height + 1, xOff + sDecorRearrangementDataBuffer[0].width - 1, yOff); // Arithmetic register swap at the r2 argument: `add r2, r0, r2` instead of `add r2, r2, r0` } } } @@ -2547,7 +2547,7 @@ __attribute__((naked)) void sub_812A0E8(u8 taskId) asm_unified("\tpush {r4-r7,lr}\n" "\tlsls r0, 24\n" "\tlsrs r6, r0, 24\n" - "\tldr r4, =gUnknown_0203AAC4\n" + "\tldr r4, =sCurDecorSelectedInRearrangement\n" "\tmovs r0, 0\n" "\tstrb r0, [r4]\n" "\tadds r0, r6, 0\n" @@ -2568,7 +2568,7 @@ __attribute__((naked)) void sub_812A0E8(u8 taskId) "\tldrb r1, [r0]\n" "\tcmp r1, 0\n" "\tbeq _0812A14C\n" - "\tldr r4, =gUnknown_0203AA44\n" + "\tldr r4, =sDecorRearrangementDataBuffer\n" "\tadds r0, r1, 0\n" "\tadds r1, r4, 0\n" "\tbl sub_8129D8C\n" @@ -2595,12 +2595,12 @@ __attribute__((naked)) void sub_812A0E8(u8 taskId) "\tcmp r5, r1\n" "\tbcc _0812A10E\n" "_0812A15A:\n" - "\tldr r0, =gUnknown_0203AAC4\n" + "\tldr r0, =sCurDecorSelectedInRearrangement\n" "\tldrb r0, [r0]\n" "\tcmp r0, 0\n" "\tbeq _0812A18C\n" "\tldr r0, =gUnknown_0203A17C\n" - "\tldr r2, =gUnknown_0203AA44\n" + "\tldr r2, =sDecorRearrangementDataBuffer\n" "\tldrb r1, [r2]\n" "\tldr r0, [r0, 0x4]\n" "\tadds r0, r1\n" @@ -2746,14 +2746,14 @@ void sub_812A39C(void) void sub_812A3C8(void) { - FreeSpritePaletteByTag(OVERWORLD_DECOR_BOX_PAL_TAG); + FreeSpritePaletteByTag(OVERWORLD_PLACE_DECOR_PLAYER_PAL_TAG); } void sub_812A3D4(u8 taskId) { - if (sub_81279C4() == TRUE) + if (IsSelectedDecorInThePC() == TRUE) { - StringCopy(gStringVar1, gDecorations[gUnknown_0203A14C[gUnknown_0203A172]].name); + StringCopy(gStringVar1, gDecorations[gCurDecorInventoryItems[gCurDecorationIndex]].name); StringExpandPlaceholders(gStringVar4, gText_DecorationWillBeDiscarded); DisplayItemMessageOnField(taskId, gStringVar4, sub_812A458); } @@ -2772,10 +2772,10 @@ void sub_812A458(u8 taskId) void sub_812A478(u8 taskId) { - gUnknown_0203A14C[gUnknown_0203A172] = DECOR_NONE; - gUnknown_0203A151 = CountDecorationCategoryN(gUnknown_0203A173); - CondenseDecorationCategoryN(gUnknown_0203A173); - sub_8127814(taskId); + gCurDecorInventoryItems[gCurDecorationIndex] = DECOR_NONE; + sCurDecorCatCount = CountDecorationCategoryN(sCurDecorationCategory); + CondenseDecorationCategoryN(sCurDecorationCategory); + IdentifyOwnedDecorationsCurrentlyInUseInternal(taskId); StringExpandPlaceholders(gStringVar4, gText_DecorationThrownAway); DisplayItemMessageOnField(taskId, gStringVar4, sub_8127A5C); } -- cgit v1.2.3 From 2082c0491b0f7334683f891ca2558cead7b08aaf Mon Sep 17 00:00:00 2001 From: "U-User-PC\\User" Date: Sun, 22 Oct 2017 21:00:08 -0400 Subject: more bool8 stuff --- src/pokemon_summary_screen.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index b2f18090b..37ecdc982 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -165,8 +165,8 @@ extern void sub_8199C30(u8 a, u8 b, u8 c, u8 d, u8 e, u8 f); extern void AddTextPrinterParametrized2(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, struct TextColor* colors, s8 speed, u8 *str); extern s32 GetStringCenterAlignXOffset(u8 fontId, u8 *str, s32 totalWidth); extern s32 GetStringRightAlignXOffset(u8 fontId, u8 *str, s32 totalWidth); -extern u8 sub_81A6BF4(); -extern u8 sub_81B9E94(); +extern bool8 sub_81A6BF4(); +extern bool8 sub_81B9E94(); extern void sub_81AFBF0(); extern u8 sub_81AFC0C(u8 a, u8 *b); extern void sub_81AFC28(u8 *a, u8 *b); @@ -2718,7 +2718,7 @@ void sub_81C2AFC(u8 a) case 0: PutWindowTilemap(0); PutWindowTilemap(4); - if (sub_81A6BF4() == 1 || sub_81B9E94() == 1) + if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE) PutWindowTilemap(8); PutWindowTilemap(9); break; @@ -2763,7 +2763,7 @@ void sub_81C2C38(u8 a) { case 0: ClearWindowTilemap(4); - if (sub_81A6BF4() == 1 || sub_81B9E94() == 1) + if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE) ClearWindowTilemap(8); ClearWindowTilemap(9); break; @@ -2970,7 +2970,7 @@ void sub_81C2EC4() void sub_81C2F5C() { int r4; - if (sub_81A6BF4() != 1 && sub_81B9E94() != 1) + if (sub_81A6BF4() != TRUE && sub_81B9E94() != TRUE) { ConvertIntToDecimalStringN(StringCopy(gStringVar1, gText_UnkCtrlF907F908), (u16)gUnknown_0203CF1C->summary.OTID, 2, 5); r4 = GetStringRightAlignXOffset(1, gStringVar1, 0x38); @@ -2998,7 +2998,7 @@ void sub_81C307C() sub_81AFC0C(0, gUnknown_0861CE74); sub_81AFC0C(1, gUnknown_0861CE7B); sub_81C31C0(); - if (sub_81A6BF4() == 1 || sub_81B9E94() == 1 || sub_81C3304() == TRUE) + if (sub_81A6BF4() == TRUE || sub_81B9E94() == TRUE || sub_81C3304() == TRUE) sub_81AFC28(gStringVar4, gText_XNature); else { -- cgit v1.2.3 From 1bb931245b5030746b7150e3965520954d0068a7 Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Mon, 23 Oct 2017 20:43:26 -0500 Subject: use SPEED instead of SPD in mon data constants --- src/battle_script_commands.c | 12 ++++++------ src/pokemon_1.c | 12 ++++++------ src/pokemon_2.c | 12 ++++++------ src/pokemon_size_record.c | 2 +- src/pokemon_summary_screen.c | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a1e5767ad..28357d984 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -909,7 +909,7 @@ static const u8 sUnknown_0831C2E8[] = INCBIN_U8("graphics/battle_interface/unk_b static const u8 sRubyLevelUpStatBoxStats[] = { MON_DATA_MAX_HP, MON_DATA_SPATK, MON_DATA_ATK, - MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPD + MON_DATA_SPDEF, MON_DATA_DEF, MON_DATA_SPEED }; #define MON_ICON_LVLUP_BOX_TAG 0xD75A @@ -3610,7 +3610,7 @@ static void atk23_getexp(void) BATTLE_LVLUP_STATS->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_MAX_HP); BATTLE_LVLUP_STATS->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_ATK); BATTLE_LVLUP_STATS->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_DEF); - BATTLE_LVLUP_STATS->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPD); + BATTLE_LVLUP_STATS->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED); BATTLE_LVLUP_STATS->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPATK); BATTLE_LVLUP_STATS->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPDEF); @@ -3649,8 +3649,8 @@ static void atk23_getexp(void) gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_ATK); gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_DEF); // Why is this duplicated? - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPD); - gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPD); + gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED); + gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED); gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPATK); gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPDEF); @@ -3664,8 +3664,8 @@ static void atk23_getexp(void) gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_ATK); gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_DEF); // Duplicated again, but this time there's no Sp Defense - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPD); - gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPD); + gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED); + gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPEED); gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterId], MON_DATA_SPATK); } diff --git a/src/pokemon_1.c b/src/pokemon_1.c index fe7809826..79fa15343 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -33,7 +33,7 @@ void ZeroMonData(struct Pokemon *mon) SetMonData(mon, MON_DATA_MAX_HP, &arg); SetMonData(mon, MON_DATA_ATK, &arg); SetMonData(mon, MON_DATA_DEF, &arg); - SetMonData(mon, MON_DATA_SPD, &arg); + SetMonData(mon, MON_DATA_SPEED, &arg); SetMonData(mon, MON_DATA_SPATK, &arg); SetMonData(mon, MON_DATA_SPDEF, &arg); arg = 255; @@ -128,7 +128,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, SetBoxMonData(boxMon, MON_DATA_HP_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_ATK_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_DEF_IV, &fixedIV); - SetBoxMonData(boxMon, MON_DATA_SPD_IV, &fixedIV); + SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &fixedIV); SetBoxMonData(boxMon, MON_DATA_SPDEF_IV, &fixedIV); } @@ -147,7 +147,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, value = Random(); iv = value & 0x1F; - SetBoxMonData(boxMon, MON_DATA_SPD_IV, &iv); + SetBoxMonData(boxMon, MON_DATA_SPEED_IV, &iv); iv = (value & 0x3E0) >> 5; SetBoxMonData(boxMon, MON_DATA_SPATK_IV, &iv); iv = (value & 0x7C00) >> 10; @@ -234,7 +234,7 @@ void CreateMonWithIVsOTID(struct Pokemon *mon, u16 species, u8 level, u8 *ivs, u SetMonData(mon, MON_DATA_HP_IV, &ivs[0]); SetMonData(mon, MON_DATA_ATK_IV, &ivs[1]); SetMonData(mon, MON_DATA_DEF_IV, &ivs[2]); - SetMonData(mon, MON_DATA_SPD_IV, &ivs[3]); + SetMonData(mon, MON_DATA_SPEED_IV, &ivs[3]); SetMonData(mon, MON_DATA_SPATK_IV, &ivs[4]); SetMonData(mon, MON_DATA_SPDEF_IV, &ivs[5]); CalculateMonStats(mon); @@ -317,7 +317,7 @@ void sub_806819C(struct Pokemon *mon, struct UnknownPokemonStruct *src) value = src->defenseIV; SetMonData(mon, MON_DATA_DEF_IV, &value); value = src->speedIV; - SetMonData(mon, MON_DATA_SPD_IV, &value); + SetMonData(mon, MON_DATA_SPEED_IV, &value); value = src->spAttackIV; SetMonData(mon, MON_DATA_SPATK_IV, &value); value = src->spDefenseIV; @@ -381,7 +381,7 @@ void sub_8068338(struct Pokemon *mon, struct UnknownPokemonStruct *src, bool8 lv value = src->defenseIV; SetMonData(mon, MON_DATA_DEF_IV, &value); value = src->speedIV; - SetMonData(mon, MON_DATA_SPD_IV, &value); + SetMonData(mon, MON_DATA_SPEED_IV, &value); value = src->spAttackIV; SetMonData(mon, MON_DATA_SPATK_IV, &value); value = src->spDefenseIV; diff --git a/src/pokemon_2.c b/src/pokemon_2.c index 27441f952..e14949d48 100644 --- a/src/pokemon_2.c +++ b/src/pokemon_2.c @@ -330,7 +330,7 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data) if (!ret) ret = mon->defense; break; - case MON_DATA_SPD: + case MON_DATA_SPEED: ret = GetDeoxysStat(mon, STAT_SPD); if (!ret) ret = mon->speed; @@ -566,7 +566,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_DEF_IV: retVal = substruct3->defenseIV; break; - case MON_DATA_SPD_IV: + case MON_DATA_SPEED_IV: retVal = substruct3->speedIV; break; case MON_DATA_SPATK_IV: @@ -747,7 +747,7 @@ void SetMonData(struct Pokemon *mon, s32 field, const void *dataArg) case MON_DATA_DEF: SET16(mon->defense); break; - case MON_DATA_SPD: + case MON_DATA_SPEED: SET16(mon->speed); break; case MON_DATA_SPATK: @@ -940,7 +940,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_DEF_IV: SET8(substruct3->defenseIV); break; - case MON_DATA_SPD_IV: + case MON_DATA_SPEED_IV: SET8(substruct3->speedIV); break; case MON_DATA_SPATK_IV: @@ -1329,7 +1329,7 @@ void CopyPlayerPartyMonToBattleData(u8 bank, u8 partyIndex) gBattleMons[bank].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); gBattleMons[bank].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); gBattleMons[bank].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); - gBattleMons[bank].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD_IV, NULL); + gBattleMons[bank].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); gBattleMons[bank].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); gBattleMons[bank].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); gBattleMons[bank].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); @@ -1339,7 +1339,7 @@ void CopyPlayerPartyMonToBattleData(u8 bank, u8 partyIndex) gBattleMons[bank].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); gBattleMons[bank].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); gBattleMons[bank].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); - gBattleMons[bank].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPD, NULL); + gBattleMons[bank].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); gBattleMons[bank].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); gBattleMons[bank].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); gBattleMons[bank].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c index 12d98bfd8..1758fba32 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon_size_record.c @@ -57,7 +57,7 @@ static u32 GetMonSizeHash(struct Pokemon *pkmn) u16 hpIV = GetMonData(pkmn, MON_DATA_HP_IV) & 0xF; u16 attackIV = GetMonData(pkmn, MON_DATA_ATK_IV) & 0xF; u16 defenseIV = GetMonData(pkmn, MON_DATA_DEF_IV) & 0xF; - u16 speedIV = GetMonData(pkmn, MON_DATA_SPD_IV) & 0xF; + u16 speedIV = GetMonData(pkmn, MON_DATA_SPEED_IV) & 0xF; u16 spAtkIV = GetMonData(pkmn, MON_DATA_SPATK_IV) & 0xF; u16 spDefIV = GetMonData(pkmn, MON_DATA_SPDEF_IV) & 0xF; u32 hibyte = ((attackIV ^ defenseIV) * hpIV) ^ (personality & 0xFF); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 37ecdc982..b3682825d 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -709,7 +709,7 @@ bool8 sub_81C00F0(struct Pokemon *a) sum->def = GetMonData(a, MON_DATA_DEF); sum->spatk = GetMonData(a, MON_DATA_SPATK); sum->spdef = GetMonData(a, MON_DATA_SPDEF); - sum->speed = GetMonData(a, MON_DATA_SPD); + sum->speed = GetMonData(a, MON_DATA_SPEED); } else { -- cgit v1.2.3 From 5ea2f463d71d0bc2663e70a553557de0ccf40eef Mon Sep 17 00:00:00 2001 From: camthesaxman Date: Thu, 26 Oct 2017 13:47:14 -0500 Subject: also fix ambiguous MON_DATA_SPD_EV and MON_DATA_SPD2 constants --- src/pokemon_1.c | 4 ++-- src/pokemon_2.c | 6 +++--- src/pokemon_summary_screen.c | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pokemon_1.c b/src/pokemon_1.c index 79fa15343..f56ade967 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -305,7 +305,7 @@ void sub_806819C(struct Pokemon *mon, struct UnknownPokemonStruct *src) SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); - SetMonData(mon, MON_DATA_SPD_EV, &src->speedEV); + SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); value = src->altAbility; @@ -369,7 +369,7 @@ void sub_8068338(struct Pokemon *mon, struct UnknownPokemonStruct *src, bool8 lv SetMonData(mon, MON_DATA_HP_EV, &src->hpEV); SetMonData(mon, MON_DATA_ATK_EV, &src->attackEV); SetMonData(mon, MON_DATA_DEF_EV, &src->defenseEV); - SetMonData(mon, MON_DATA_SPD_EV, &src->speedEV); + SetMonData(mon, MON_DATA_SPEED_EV, &src->speedEV); SetMonData(mon, MON_DATA_SPATK_EV, &src->spAttackEV); SetMonData(mon, MON_DATA_SPDEF_EV, &src->spDefenseEV); value = src->altAbility; diff --git a/src/pokemon_2.c b/src/pokemon_2.c index e14949d48..587773836 100644 --- a/src/pokemon_2.c +++ b/src/pokemon_2.c @@ -351,7 +351,7 @@ u32 GetMonData(struct Pokemon *mon, s32 field, u8* data) case MON_DATA_DEF2: ret = mon->defense; break; - case MON_DATA_SPD2: + case MON_DATA_SPEED2: ret = mon->speed; break; case MON_DATA_SPATK2: @@ -512,7 +512,7 @@ u32 GetBoxMonData(struct BoxPokemon *boxMon, s32 field, u8 *data) case MON_DATA_DEF_EV: retVal = substruct2->defenseEV; break; - case MON_DATA_SPD_EV: + case MON_DATA_SPEED_EV: retVal = substruct2->speedEV; break; case MON_DATA_SPATK_EV: @@ -880,7 +880,7 @@ void SetBoxMonData(struct BoxPokemon *boxMon, s32 field, const void *dataArg) case MON_DATA_DEF_EV: SET8(substruct2->defenseEV); break; - case MON_DATA_SPD_EV: + case MON_DATA_SPEED_EV: SET8(substruct2->speedEV); break; case MON_DATA_SPATK_EV: diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index b3682825d..838e91d90 100755 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -720,7 +720,7 @@ bool8 sub_81C00F0(struct Pokemon *a) sum->def = GetMonData(a, MON_DATA_DEF2); sum->spatk = GetMonData(a, MON_DATA_SPATK2); sum->spdef = GetMonData(a, MON_DATA_SPDEF2); - sum->speed = GetMonData(a, MON_DATA_SPD2); + sum->speed = GetMonData(a, MON_DATA_SPEED2); } break; case 3: -- cgit v1.2.3