diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2019-07-01 21:45:36 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-01 21:45:36 -0400 |
commit | 74d771ef90a3189bd2da1b35f6b42a1fa8f51e67 (patch) | |
tree | 96c754aee40f16956fb0958ecb31bd806bd99642 /src | |
parent | 7f06718571de81609208a5fa402a93da63cfa8bf (diff) | |
parent | 062238aa12cb4f54f70b73459ff5b5d775f69a54 (diff) |
Merge pull request #76 from jiangzhengwenjz/misc
new_menu_helpers, multiboot, hof_pc, play_time, decompress, reset_save_heap, save_location, mail_data, fldeff_*
Diffstat (limited to 'src')
43 files changed, 3018 insertions, 1734 deletions
@@ -211,7 +211,7 @@ void sub_810B858(void) InitWindows(gUnknown_84530E4); DeactivateAllTextPrinters(); TextWindow_SetUserSelectedFrame(0, 0x64, 0xE0); - TextWindow_SetBubbleFrame_841F1C8(0, 0x6D, 0xD0); + TextWindow_LoadResourcesStdFrame0(0, 0x6D, 0xD0); TextWindow_SetStdFrame0_WithPal(0, 0x81, 0xC0); LoadPalette(gUnknown_8453098, 0xF0, 0x20); for (i = 0; i < 3; i++) @@ -219,7 +219,7 @@ void sub_810B858(void) FillWindowPixelBuffer(i, 0x00); PutWindowTilemap(i); } - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); for (i = 0; i < 11; i++) { gUnknown_203AD34[i] = 0xFF; @@ -258,7 +258,7 @@ u8 sub_810B9DC(u8 a0, u8 a1) { SetWindowBorderStyle(gUnknown_203AD34[a0], FALSE, 0x081, 0x0C); } - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); } return gUnknown_203AD34[a0]; } @@ -268,7 +268,7 @@ void sub_810BA3C(u8 a0) ClearMenuWindow(gUnknown_203AD34[a0], FALSE); ClearWindowTilemap(gUnknown_203AD34[a0]); RemoveWindow(gUnknown_203AD34[a0]); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); gUnknown_203AD34[a0] = 0xFF; } @@ -289,7 +289,7 @@ void sub_810BA9C(u8 a0) ClearWindowTilemap(gUnknown_203AD34[a0]); RemoveWindow(gUnknown_203AD34[a0]); PutWindowTilemap(1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); gUnknown_203AD34[a0] = 0xFF; } diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 6343b55cd..ff3d26b65 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -6,6 +6,7 @@ #include "constants/abilities.h" #include "constants/battle_ai.h" #include "constants/battle_move_effects.h" +#include "constants/moves.h" extern u16 Random(void); extern void sub_80C7164(void); @@ -230,10 +231,7 @@ static const BattleAICmdFunc sBattleAICmdTable[] = BattleAICmd_if_not_taunted, // 0x5D }; -#ifdef NONMATCHING -static -#endif -const u16 sDiscouragedPowerfulMoveEffects[] = +static const u16 sDiscouragedPowerfulMoveEffects[] = { EFFECT_EXPLOSION, EFFECT_DREAM_EATER, @@ -970,331 +968,69 @@ static void BattleAICmd_get_move_power(void) gAIScriptPtr += 1; } -// still a nonmatching -#ifdef NONMATCHING static void BattleAICmd_is_most_powerful_move(void) { - int i, j; - s32 damages[MAX_MON_MOVES]; + s32 i, checkedMove; + s32 moveDmgs[4]; for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + { if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].effect == sDiscouragedPowerfulMoveEffects[i]) break; + } if (gBattleMoves[AI_THINKING_STRUCT->moveConsidered].power > 1 - && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF) { gDynamicBasePower = 0; - eDynamicMoveType = 0; - eDmgMultiplier = 1; + gBattleStruct->dynamicMoveType = 0; + gBattleScripting.dmgMultiplier = 1; gMoveResultFlags = 0; gCritMultiplier = 1; - for (i = 0; i < MAX_MON_MOVES; i++) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) { - for (j = 0; sDiscouragedPowerfulMoveEffects[j] != 0xFFFF; j++) - { // _08108276 - if (gBattleMoves[gBattleMons[gBankAttacker].moves[i]].effect == sDiscouragedPowerfulMoveEffects[j]) + for (i = 0; sDiscouragedPowerfulMoveEffects[i] != 0xFFFF; i++) + { + if (gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].effect == sDiscouragedPowerfulMoveEffects[i]) break; } - // _081082BA - if (gBattleMons[gBankAttacker].moves[i] - && sDiscouragedPowerfulMoveEffects[j] == 0xFFFF - && gBattleMoves[gBattleMons[gBankAttacker].moves[i]].power > 1) + if (gBattleMons[sBattler_AI].moves[checkedMove] != MOVE_NONE + && sDiscouragedPowerfulMoveEffects[i] == 0xFFFF + && gBattleMoves[gBattleMons[sBattler_AI].moves[checkedMove]].power > 1) { - gCurrentMove = gBattleMons[gBankAttacker].moves[i]; - AI_CalcDmg(gBankAttacker, gBankTarget); - TypeCalc(gCurrentMove, gBankAttacker, gBankTarget); - damages[i] = (gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[i]) / 100; - - if (damages[i] == 0) // moves always do at least 1 damage. - damages[i] = 1; + gCurrentMove = gBattleMons[sBattler_AI].moves[checkedMove]; + AI_CalcDmg(sBattler_AI, gBattlerTarget); + TypeCalc(gCurrentMove, sBattler_AI, gBattlerTarget); + moveDmgs[checkedMove] = gBattleMoveDamage * AI_THINKING_STRUCT->simulatedRNG[checkedMove] / 100; + if (moveDmgs[checkedMove] == 0) + moveDmgs[checkedMove] = 1; } else { - damages[i] = 0; + moveDmgs[checkedMove] = 0; } } - for (i = 0; i < MAX_MON_MOVES; i++) - if (damages[i] > damages[AI_THINKING_STRUCT->movesetIndex]) + for (checkedMove = 0; checkedMove < MAX_MON_MOVES; checkedMove++) + { + if (moveDmgs[checkedMove] > moveDmgs[AI_THINKING_STRUCT->movesetIndex]) break; + } - if (i == MAX_MON_MOVES) - AI_THINKING_STRUCT->funcResult = 2; + if (checkedMove == MAX_MON_MOVES) + AI_THINKING_STRUCT->funcResult = MOVE_MOST_POWERFUL; // Is the most powerful. else - AI_THINKING_STRUCT->funcResult = 1; + AI_THINKING_STRUCT->funcResult = MOVE_NOT_MOST_POWERFUL; // Not the most powerful. } else { - AI_THINKING_STRUCT->funcResult = 0; + AI_THINKING_STRUCT->funcResult = MOVE_POWER_DISCOURAGED; // Highly discouraged in terms of power. } - gAIScriptPtr += 1; + gAIScriptPtr++; } -#else -NAKED -static void BattleAICmd_is_most_powerful_move(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0x14\n\ - movs r3, 0\n\ - ldr r0, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r1, [r0]\n\ - ldr r5, _080C80A8 @ =0x0000ffff\n\ - ldr r6, _080C80AC @ =gBattleMoves\n\ - ldr r2, _080C80B0 @ =gBattleResources\n\ - cmp r1, r5\n\ - beq _080C7FA2\n\ - ldr r0, [r2]\n\ - ldr r0, [r0, 0x14]\n\ - ldrh r1, [r0, 0x2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r4, [r0]\n\ - ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\ -_080C7F92:\n\ - ldrh r0, [r1]\n\ - cmp r4, r0\n\ - beq _080C7FA2\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r5\n\ - bne _080C7F92\n\ -_080C7FA2:\n\ - ldr r0, [r2]\n\ - ldr r0, [r0, 0x14]\n\ - ldrh r1, [r0, 0x2]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r6\n\ - ldrb r0, [r0, 0x1]\n\ - cmp r0, 0x1\n\ - bhi _080C7FB8\n\ - b _080C8142\n\ -_080C7FB8:\n\ - lsls r0, r3, 1\n\ - ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r1\n\ - ldrh r3, [r0]\n\ - ldr r0, _080C80A8 @ =0x0000ffff\n\ - cmp r3, r0\n\ - beq _080C7FC8\n\ - b _080C8142\n\ -_080C7FC8:\n\ - ldr r0, _080C80B4 @ =gDynamicBasePower\n\ - movs r1, 0\n\ - strh r1, [r0]\n\ - ldr r0, _080C80B8 @ =gBattleStruct\n\ - ldr r0, [r0]\n\ - strb r1, [r0, 0x13]\n\ - ldr r0, _080C80BC @ =gBattleScripting\n\ - movs r2, 0x1\n\ - strb r2, [r0, 0xE]\n\ - ldr r0, _080C80C0 @ =gMoveResultFlags\n\ - strb r1, [r0]\n\ - ldr r0, _080C80C4 @ =gCritMultiplier\n\ - strb r2, [r0]\n\ - movs r6, 0\n\ - mov r9, r3\n\ - ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\ - ldrh r2, [r2]\n\ - str r2, [sp, 0x10]\n\ -_080C7FEC:\n\ - movs r3, 0\n\ - ldr r5, _080C80C8 @ =gBattleMons\n\ - lsls r4, r6, 1\n\ - ldr r7, _080C80CC @ =sBattler_AI\n\ - lsls r0, r6, 2\n\ - mov r8, r0\n\ - adds r1, r6, 0x1\n\ - mov r10, r1\n\ - ldr r2, [sp, 0x10]\n\ - cmp r2, r9\n\ - beq _080C8030\n\ - ldr r2, _080C80AC @ =gBattleMoves\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 2\n\ - adds r0, r2\n\ - ldrb r2, [r0]\n\ - ldr r1, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\ -_080C8020:\n\ - ldrh r0, [r1]\n\ - cmp r2, r0\n\ - beq _080C8030\n\ - adds r1, 0x2\n\ - adds r3, 0x1\n\ - ldrh r0, [r1]\n\ - cmp r0, r9\n\ - bne _080C8020\n\ -_080C8030:\n\ - ldrb r1, [r7]\n\ - movs r0, 0x58\n\ - muls r0, r1\n\ - adds r0, r4, r0\n\ - adds r1, r5, 0\n\ - adds r1, 0xC\n\ - adds r1, r0, r1\n\ - ldrh r0, [r1]\n\ - cmp r0, 0\n\ - beq _080C80DC\n\ - lsls r0, r3, 1\n\ - ldr r2, _080C80A4 @ =sDiscouragedPowerfulMoveEffects\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - cmp r0, r9\n\ - bne _080C80DC\n\ - ldr r0, _080C80AC @ =gBattleMoves\n\ - ldrh r2, [r1]\n\ - lsls r1, r2, 1\n\ - adds r1, r2\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0x1\n\ - bls _080C80DC\n\ - ldr r5, _080C80D0 @ =gCurrentMove\n\ - strh r2, [r5]\n\ - ldrb r0, [r7]\n\ - ldr r4, _080C80D4 @ =gBattlerTarget\n\ - ldrb r1, [r4]\n\ - bl AI_CalcDmg\n\ - ldrh r0, [r5]\n\ - ldrb r1, [r7]\n\ - ldrb r2, [r4]\n\ - bl TypeCalc\n\ - mov r4, sp\n\ - add r4, r8\n\ - ldr r2, _080C80D8 @ =gBattleMoveDamage\n\ - ldr r0, _080C80B0 @ =gBattleResources\n\ - ldr r0, [r0]\n\ - ldr r0, [r0, 0x14]\n\ - adds r0, 0x18\n\ - adds r0, r6\n\ - ldrb r1, [r0]\n\ - ldr r0, [r2]\n\ - muls r0, r1\n\ - movs r1, 0x64\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - cmp r0, 0\n\ - bne _080C80E4\n\ - movs r0, 0x1\n\ - str r0, [r4]\n\ - b _080C80E4\n\ - .align 2, 0\n\ -_080C80A4: .4byte sDiscouragedPowerfulMoveEffects\n\ -_080C80A8: .4byte 0x0000ffff\n\ -_080C80AC: .4byte gBattleMoves\n\ -_080C80B0: .4byte gBattleResources\n\ -_080C80B4: .4byte gDynamicBasePower\n\ -_080C80B8: .4byte gBattleStruct\n\ -_080C80BC: .4byte gBattleScripting\n\ -_080C80C0: .4byte gMoveResultFlags\n\ -_080C80C4: .4byte gCritMultiplier\n\ -_080C80C8: .4byte gBattleMons\n\ -_080C80CC: .4byte sBattler_AI\n\ -_080C80D0: .4byte gCurrentMove\n\ -_080C80D4: .4byte gBattlerTarget\n\ -_080C80D8: .4byte gBattleMoveDamage\n\ -_080C80DC:\n\ - mov r1, sp\n\ - add r1, r8\n\ - movs r0, 0\n\ - str r0, [r1]\n\ -_080C80E4:\n\ - mov r6, r10\n\ - cmp r6, 0x3\n\ - bgt _080C80EC\n\ - b _080C7FEC\n\ -_080C80EC:\n\ - movs r6, 0\n\ - ldr r2, _080C8130 @ =gBattleResources\n\ - ldr r0, [r2]\n\ - ldr r0, [r0, 0x14]\n\ - ldrb r0, [r0, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r1, [sp]\n\ - ldr r0, [r0]\n\ - ldr r5, _080C8134 @ =gAIScriptPtr\n\ - cmp r1, r0\n\ - bgt _080C8122\n\ - adds r4, r2, 0\n\ - mov r3, sp\n\ -_080C8108:\n\ - adds r3, 0x4\n\ - adds r6, 0x1\n\ - cmp r6, 0x3\n\ - bgt _080C8122\n\ - ldr r0, [r4]\n\ - ldr r0, [r0, 0x14]\n\ - ldrb r0, [r0, 0x1]\n\ - lsls r0, 2\n\ - add r0, sp\n\ - ldr r1, [r3]\n\ - ldr r0, [r0]\n\ - cmp r1, r0\n\ - ble _080C8108\n\ -_080C8122:\n\ - cmp r6, 0x4\n\ - bne _080C8138\n\ - ldr r0, [r2]\n\ - ldr r1, [r0, 0x14]\n\ - movs r0, 0x2\n\ - str r0, [r1, 0x8]\n\ - b _080C814C\n\ - .align 2, 0\n\ -_080C8130: .4byte gBattleResources\n\ -_080C8134: .4byte gAIScriptPtr\n\ -_080C8138:\n\ - ldr r0, [r2]\n\ - ldr r1, [r0, 0x14]\n\ - movs r0, 0x1\n\ - str r0, [r1, 0x8]\n\ - b _080C814C\n\ -_080C8142:\n\ - ldr r0, [r2]\n\ - ldr r1, [r0, 0x14]\n\ - movs r0, 0\n\ - str r0, [r1, 0x8]\n\ - ldr r5, _080C8164 @ =gAIScriptPtr\n\ -_080C814C:\n\ - ldr r0, [r5]\n\ - adds r0, 0x1\n\ - str r0, [r5]\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_080C8164: .4byte gAIScriptPtr\n\ - .syntax divided\n"); -} -#endif static void BattleAICmd_get_move(void) { @@ -605,88 +605,25 @@ u16 Unused_LoadBgPalette(u8 bg, const void *src, u16 size, u16 destOffset) return (u8)cursor; } -#ifdef NONMATCHING // Matches everything but r5 and r6 are flipped, rrr bool8 IsDma3ManagerBusyWithBgCopy(void) { - u8 mod; - u8 div; - s8 reqSpace; - int i; for (i = 0; i < 0x80; i++) { - div = i / 0x20; - mod = i % 0x20; + u8 div = i / 0x20; + u8 mod = i % 0x20; - if ((sDmaBusyBitfield[div] & (1 << mod)) != FALSE) + if ((sDmaBusyBitfield[div] & (1 << mod))) { - reqSpace = CheckForSpaceForDma3Request(i); + s8 reqSpace = CheckForSpaceForDma3Request(i); if (reqSpace == -1) - { return TRUE; - } - sDmaBusyBitfield[div] &= ~(1 << mod); } } - return FALSE; } -#else -NAKED -bool8 IsDma3ManagerBusyWithBgCopy(void) -{ - asm("push {r4-r7,lr}\n\ - mov r5, #0\n\ - mov r7, #0x1\n\ - neg r7, r7\n\ -_08001ADC:\n\ - add r0, r5, #0\n\ - cmp r5, #0\n\ - bge _08001AE4\n\ - add r0, #0x1F\n\ -_08001AE4:\n\ - asr r0, #5\n\ - lsl r2, r0, #24\n\ - lsl r0, #5\n\ - sub r0, r5, r0\n\ - lsl r0, #24\n\ - lsr r0, #24\n\ - ldr r1, =sDmaBusyBitfield\n\ - lsr r2, #22\n\ - add r4, r2, r1\n\ - mov r6, #0x1\n\ - lsl r6, r0\n\ - ldr r0, [r4]\n\ - and r0, r6\n\ - cmp r0, #0\n\ - beq _08001B22\n\ - lsl r0, r5, #16\n\ - asr r0, #16\n\ - bl CheckForSpaceForDma3Request\n\ - lsl r0, #24\n\ - asr r0, #24\n\ - cmp r0, r7\n\ - bne _08001B1C\n\ - mov r0, #0x1\n\ - b _08001B2A\n\ - .pool\n\ -_08001B1C:\n\ - ldr r0, [r4]\n\ - bic r0, r6\n\ - str r0, [r4]\n\ -_08001B22:\n\ - add r5, #0x1\n\ - cmp r5, #0x7F\n\ - ble _08001ADC\n\ - mov r0, #0\n\ -_08001B2A:\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n"); -} -#endif // NONMATCHING void ShowBg(u8 bg) { @@ -928,79 +865,58 @@ void SetBgAffine(u8 bg, u32 srcCenterX, u32 srcCenterY, s16 dispCenterX, s16 dis SetBgAffineInternal(bg, srcCenterX, srcCenterY, dispCenterX, dispCenterY, scaleX, scaleY, rotationAngle); } -u8 Unused_AdjustBgMosaic(u8 a1, u8 a2) +u8 AdjustBgMosaic(u8 value, u8 mode) { - u16 result; - s16 test1; - s16 test2; - - result = GetGpuReg(REG_OFFSET_MOSAIC); - - test1 = result & 0xF; - test2 = (result >> 4) & 0xF; - result &= 0xFF00; + u16 mosaicSize; + s16 bgMosaicH; + s16 bgMosaicV; + mosaicSize = GetGpuReg(REG_OFFSET_MOSAIC); + bgMosaicH = mosaicSize & 0xF; + bgMosaicV = (mosaicSize >> 4) & 0xF; + mosaicSize &= 0xFF00; - switch (a2) + switch (mode) { - case 0: - default: - test1 = a1 & 0xF; - test2 = a1 >> 0x4; - break; - case 1: - test1 = a1 & 0xF; - break; - case 2: - if ((test1 + a1) > 0xF) - { - test1 = 0xF; - } - else - { - test1 += a1; - } - break; - case 3: - if ((test1 - a1) < 0) - { - test1 = 0x0; - } - else - { - test1 -= a1; - } - break; - case 4: - test2 = a1 & 0xF; - break; - case 5: - if ((test2 + a1) > 0xF) - { - test2 = 0xF; - } - else - { - test2 += a1; - } - break; - case 6: - if ((test2 - a1) < 0) - { - test2 = 0x0; - } - else - { - test2 -= a1; - } - break; + case BG_MOSAIC_SET: + default: + bgMosaicH = value & 0xF; + bgMosaicV = value >> 0x4; + break; + case BG_MOSAIC_SET_H: + bgMosaicH = value & 0xF; + break; + case BG_MOSAIC_INC_H: + if ((bgMosaicH + value) > 0xF) + bgMosaicH = 0xF; + else + bgMosaicH += value; + break; + case BG_MOSAIC_DEC_H: + if ((bgMosaicH - value) < 0) + bgMosaicH = 0x0; + else + bgMosaicH -= value; + break; + case BG_MOSAIC_SET_V: + bgMosaicV = value & 0xF; + break; + case BG_MOSAIC_INC_V: + if ((bgMosaicV + value) > 0xF) + bgMosaicV = 0xF; + else + bgMosaicV += value; + break; + case BG_MOSAIC_DEC_V: + if ((bgMosaicV - value) < 0) + bgMosaicV = 0x0; + else + bgMosaicV -= value; + break; } - - result |= ((test2 << 0x4) & 0xF0); - result |= (test1 & 0xF); - - SetGpuReg(REG_OFFSET_MOSAIC, result); - - return result; + mosaicSize |= ((bgMosaicV << 0x4) & 0xF0); + mosaicSize |= (bgMosaicH & 0xF); + SetGpuReg(REG_OFFSET_MOSAIC, mosaicSize); + return mosaicSize; } void SetBgTilemapBuffer(u8 bg, void *tilemap) diff --git a/src/daycare.c b/src/daycare.c index 206e0b383..7a2cb0698 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -5,7 +5,7 @@ #include "string_util.h" #include "constants/species.h" #include "constants/items.h" -#include "mail.h" +#include "mail_data.h" #include "pokemon_storage_system.h" #include "event_data.h" #include "random.h" @@ -1768,8 +1768,8 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID, u16* speciesLoc { u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); - sub_800ECC4(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid); - LoadCompressedObjectPalette(GetMonSpritePalStruct(mon)); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[(a0 * 2) + 1], species, pid); + LoadCompressedSpritePalette(GetMonSpritePalStruct(mon)); *speciesLoc = species; } break; @@ -1824,7 +1824,7 @@ static void CB2_EggHatch_0(void) SetVBlankCallback(VBlankCB_EggHatch); gSpecialVar_0x8005 = GetCurrentMapMusic(); - reset_temp_tile_data_buffers(); + ResetTempTileDataBuffers(); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates_EggHatch, ARRAY_COUNT(sBgTemplates_EggHatch)); diff --git a/src/decompress.c b/src/decompress.c new file mode 100644 index 000000000..caeda738a --- /dev/null +++ b/src/decompress.c @@ -0,0 +1,662 @@ +#include "global.h" +#include "malloc.h" +#include "decompress.h" +#include "pokemon.h" +#include "text.h" +#include "constants/species.h" + +extern const struct CompressedSpriteSheet gMonFrontPicTable[]; +extern const struct CompressedSpriteSheet gMonBackPicTable[]; + +static void DuplicateDeoxysTiles(void *pointer, s32 species); + +void LZDecompressWram(const void *src, void *dest) +{ + LZ77UnCompWram(src, dest); +} + +void LZDecompressVram(const void *src, void *dest) +{ + LZ77UnCompVram(src, dest); +} + +u16 LoadCompressedSpriteSheet(const struct CompressedSpriteSheet *src) +{ + struct SpriteSheet dest; + + LZ77UnCompWram(src->data, gDecompressionBuffer); + dest.data = gDecompressionBuffer; + dest.size = src->size; + dest.tag = src->tag; + return LoadSpriteSheet(&dest); +} + +void LoadCompressedSpriteSheetOverrideBuffer(const struct CompressedSpriteSheet *src, void *buffer) +{ + struct SpriteSheet dest; + + LZ77UnCompWram(src->data, buffer); + dest.data = buffer; + dest.size = src->size; + dest.tag = src->tag; + LoadSpriteSheet(&dest); +} + +void LoadCompressedSpritePalette(const struct CompressedSpritePalette *src) +{ + struct SpritePalette dest; + + LZ77UnCompWram(src->data, gDecompressionBuffer); + dest.data = (void*) gDecompressionBuffer; + dest.tag = src->tag; + LoadSpritePalette(&dest); +} + +void LoadCompressedSpritePaletteOverrideBuffer(const struct CompressedSpritePalette *a, void *buffer) +{ + struct SpritePalette dest; + + LZ77UnCompWram(a->data, buffer); + dest.data = buffer; + dest.tag = a->tag; + LoadSpritePalette(&dest); +} + +void DecompressPicFromTable(const struct CompressedSpriteSheet *src, void* buffer, s32 species) +{ + if (species > NUM_SPECIES) + LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); + else + LZ77UnCompWram(src->data, buffer); + DuplicateDeoxysTiles(buffer, species); +} + +void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality) +{ + bool8 isFrontPic; + + if (src == &gMonFrontPicTable[species]) + isFrontPic = TRUE; // frontPic + else + isFrontPic = FALSE; // backPic + LoadSpecialPokePic(src, dest, species, personality, isFrontPic); +} + +void LoadSpecialPokePic(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic) +{ + if (species == SPECIES_UNOWN) + { + u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C; + + // The other Unowns are separate from Unown A. + if (i == 0) + i = SPECIES_UNOWN; + else + i += SPECIES_UNOWN_B - 1; + if (!isFrontPic) + LZ77UnCompWram(gMonBackPicTable[i].data, dest); + else + LZ77UnCompWram(gMonFrontPicTable[i].data, dest); + } + else if (species > NUM_SPECIES) // is species unknown? draw the ? icon + LZ77UnCompWram(gMonFrontPicTable[0].data, dest); + else + LZ77UnCompWram(src->data, dest); + + DuplicateDeoxysTiles(dest, species); + DrawSpindaSpots(species, personality, dest, isFrontPic); +} + +static void DuplicateDeoxysTiles(void *pointer, s32 species) +{ + if (species == SPECIES_DEOXYS) + CpuCopy32(pointer + 0x800, pointer, 0x800); +} + +static void Unused_LZDecompressWramIndirect(const void **src, void *dest) +{ + LZ77UnCompWram(*src, dest); +} + +#ifdef NONMATCHING +static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3) +{ + u8 *v1, *v2; + int i, j, k, l; + + if (a0 & 1) + { + u8 v40 = ((a0 >> 1) + 4); + for (i = 0; i < a1; ++i) + { + // this nested loop failed to match + for (j = 0; j < 8 - a0; ++j) + { + for (k = 0; k < 8; ++k) + { + + v1 = a3 + 0x100 * v40 + 0x100 * (j >> 1) + 0x20 * k; + v2 = a3 + 0x20 * k + 0x100 * (j >> 1); + for (l = 0; l < 0x10; ++l) + { + if (!(j & 1)) + { + v2[0] = j & 1; + v1[16] = 0; +// a3[0x100 * (j / 2) + 0x20 * k + l] = 0; +// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0; + } + else + { + v2[16] = 0; + v1[0x100] = 0; +// a3[0x100 * (j / 2) + 0x20 * k + l + 0x10] = 0; +// a3[0x100 * v40 + 0x100 * (j / 2) + 0x20 * k + l + 0x100] = 0; + } + ++v1; + ++v2; // this should be generated if you write stuff inside operator [] instead of declaring v1/v2 + } + } + } + for (j = 0; j < 2; ++j) + { + for (k = 0; k < 8; ++k) + { + for (l = 0; l < 0x20; ++l) + { + a3[0x100 * k + 0x20 * j + l] = 0; + a3[0x100 * k + 0xC0 + 0x20 * j + l] = 0; + } + } + } + if (a0 == 5) + a3 += 0x120; + for (j = 0; j < a0; ++j) + { + for (k = 0; k < a0; ++k) + { + for (l = 0; l < 4; ++l) + { + a3[0x12 + 4 * l] = a2[0 + 4 * l]; + a3[0x13 + 4 * l] = a2[1 + 4 * l]; + a3[0x12 + 0x1E + 4 * l] = a2[2 + 4 * l]; + a3[0x12 + 0x1F + 4 * l] = a2[3 + 4 * l]; + a3[0x102 + 4 * l] = a2[0x10 + 4 * l]; + a3[0x103 + 4 * l] = a2[0x11 + 4 * l]; + a3[0x120 + 4 * l] = a2[0x12 + 4 * l]; + a3[0x121 + 4 * l] = a2[0x13 + 4 * l]; + } + a2 += 0x20; + a3 += 0x20; + } + if (a0 == 7) + a3 += 0x20; + else if (a0 == 5) + a3 += 0x60; + } + if (a0 == 7) + a3 += 0x100; + else if (a0 == 5) + a3 += 0x1E0; + } + } + else + { + for (i = 0; i < a1; ++i) + { + if (a0 == 6) + for (j = 0; j < 0x100; ++j) + *a3++ = 0; + for (j = 0; j < a0; ++j) + { + if (a0 == 6) + for (k = 0; k < 0x20; ++k) + *a3++ = 0; + for (k = 0; k < 0x20 * a0; ++k) + *a3++ = *a2++; + if (a0 == 6) + for (k = 0; k < 0x20; ++k) + *a3++ = 0; + } + if (a0 == 6) + for (j = 0; j < 0x100; ++j) + *a3++ = 0; + } + } +} +#else +NAKED +static void sub_800EDDC(s32 a0, s32 a1, const u8 *a2, u8 *a3) +{ + asm_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, 0x24\n\ + mov r9, r0\n\ + str r1, [sp]\n\ + str r2, [sp, 0x4]\n\ + adds r5, r3, 0\n\ + movs r0, 0x1\n\ + mov r1, r9\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0800EDFC\n\ + b _0800EF94\n\ + _0800EDFC:\n\ + asrs r0, r1, 1\n\ + adds r0, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x8]\n\ + movs r0, 0\n\ + ldr r2, [sp]\n\ + cmp r0, r2\n\ + blt _0800EE10\n\ + b _0800F024\n\ + _0800EE10:\n\ + movs r4, 0x8\n\ + subs r1, r4, r1\n\ + str r1, [sp, 0x10]\n\ + _0800EE16:\n\ + movs r7, 0\n\ + adds r0, 0x1\n\ + str r0, [sp, 0x14]\n\ + ldr r0, [sp, 0x10]\n\ + cmp r7, r0\n\ + bge _0800EE92\n\ + ldr r1, [sp, 0x8]\n\ + lsls r1, 8\n\ + str r1, [sp, 0x18]\n\ + movs r2, 0\n\ + mov r10, r2\n\ + mov r0, r9\n\ + movs r4, 0x8\n\ + subs r0, r4, r0\n\ + str r0, [sp, 0xC]\n\ + _0800EE34:\n\ + movs r3, 0\n\ + asrs r0, r7, 1\n\ + adds r1, r7, 0\n\ + movs r2, 0x1\n\ + ands r1, r2\n\ + str r1, [sp, 0x20]\n\ + lsls r0, 8\n\ + mov r8, r0\n\ + mov r12, r5\n\ + _0800EE46:\n\ + lsls r1, r3, 5\n\ + ldr r4, [sp, 0x18]\n\ + adds r0, r5, r4\n\ + adds r0, r1\n\ + mov r1, r8\n\ + adds r2, r0, r1\n\ + mov r1, r12\n\ + add r1, r8\n\ + movs r6, 0xF\n\ + _0800EE58:\n\ + ldr r4, [sp, 0x20]\n\ + cmp r4, 0\n\ + bne _0800EE68\n\ + strb r4, [r1]\n\ + add r4, sp, 0x20\n\ + ldrb r4, [r4]\n\ + strb r4, [r2, 0x10]\n\ + b _0800EE76\n\ + _0800EE68:\n\ + mov r0, r10\n\ + strb r0, [r1, 0x10]\n\ + movs r4, 0x80\n\ + lsls r4, 1\n\ + adds r4, r2, r4\n\ + str r4, [sp, 0x1C]\n\ + strb r0, [r4]\n\ + _0800EE76:\n\ + adds r2, 0x1\n\ + adds r1, 0x1\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _0800EE58\n\ + movs r0, 0x20\n\ + add r12, r0\n\ + adds r3, 0x1\n\ + cmp r3, 0x7\n\ + ble _0800EE46\n\ + adds r7, 0x1\n\ + ldr r1, [sp, 0xC]\n\ + cmp r7, r1\n\ + blt _0800EE34\n\ + _0800EE92:\n\ + movs r7, 0\n\ + movs r2, 0\n\ + _0800EE96:\n\ + movs r6, 0\n\ + adds r4, r7, 0x1\n\ + mov r8, r4\n\ + lsls r4, r7, 5\n\ + _0800EE9E:\n\ + adds r0, r6, 0x1\n\ + mov r10, r0\n\ + lsls r1, r6, 8\n\ + adds r0, r1, 0\n\ + adds r0, 0xC0\n\ + adds r0, r5, r0\n\ + adds r0, r4\n\ + adds r1, r5, r1\n\ + adds r1, r4\n\ + movs r3, 0x1F\n\ + _0800EEB2:\n\ + strb r2, [r1]\n\ + strb r2, [r0]\n\ + adds r0, 0x1\n\ + adds r1, 0x1\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _0800EEB2\n\ + mov r6, r10\n\ + cmp r6, 0x7\n\ + ble _0800EE9E\n\ + mov r7, r8\n\ + cmp r7, 0x1\n\ + ble _0800EE96\n\ + mov r1, r9\n\ + cmp r1, 0x5\n\ + bne _0800EED8\n\ + movs r2, 0x90\n\ + lsls r2, 1\n\ + adds r5, r2\n\ + _0800EED8:\n\ + movs r7, 0\n\ + cmp r7, r9\n\ + bge _0800EF6E\n\ + _0800EEDE:\n\ + movs r3, 0\n\ + adds r7, 0x1\n\ + mov r8, r7\n\ + cmp r3, r9\n\ + bge _0800EF4E\n\ + _0800EEE8:\n\ + adds r3, 0x1\n\ + mov r10, r3\n\ + ldr r4, [sp, 0x4]\n\ + adds r4, 0x20\n\ + adds r7, r5, 0\n\ + adds r7, 0x20\n\ + movs r0, 0x12\n\ + adds r0, r5\n\ + mov r12, r0\n\ + ldr r2, [sp, 0x4]\n\ + adds r3, r5, 0\n\ + movs r6, 0x3\n\ + _0800EF00:\n\ + ldrb r0, [r2]\n\ + mov r1, r12\n\ + strb r0, [r1]\n\ + ldrb r0, [r2, 0x1]\n\ + strb r0, [r1, 0x1]\n\ + ldrb r0, [r2, 0x2]\n\ + strb r0, [r1, 0x1E]\n\ + ldrb r0, [r2, 0x3]\n\ + strb r0, [r1, 0x1F]\n\ + movs r0, 0x81\n\ + lsls r0, 1\n\ + adds r1, r3, r0\n\ + ldrb r0, [r2, 0x10]\n\ + strb r0, [r1]\n\ + ldr r0, _0800EF58 @ =0x00000103\n\ + adds r1, r3, r0\n\ + ldrb r0, [r2, 0x11]\n\ + strb r0, [r1]\n\ + movs r0, 0x90\n\ + lsls r0, 1\n\ + adds r1, r3, r0\n\ + ldrb r0, [r2, 0x12]\n\ + strb r0, [r1]\n\ + ldr r0, _0800EF5C @ =0x00000121\n\ + adds r1, r3, r0\n\ + ldrb r0, [r2, 0x13]\n\ + strb r0, [r1]\n\ + movs r1, 0x4\n\ + add r12, r1\n\ + adds r2, 0x4\n\ + adds r3, 0x4\n\ + subs r6, 0x1\n\ + cmp r6, 0\n\ + bge _0800EF00\n\ + str r4, [sp, 0x4]\n\ + adds r5, r7, 0\n\ + mov r3, r10\n\ + cmp r3, r9\n\ + blt _0800EEE8\n\ + _0800EF4E:\n\ + mov r2, r9\n\ + cmp r2, 0x7\n\ + bne _0800EF60\n\ + adds r5, 0x20\n\ + b _0800EF68\n\ + .align 2, 0\n\ + _0800EF58: .4byte 0x00000103\n\ + _0800EF5C: .4byte 0x00000121\n\ + _0800EF60:\n\ + mov r4, r9\n\ + cmp r4, 0x5\n\ + bne _0800EF68\n\ + adds r5, 0x60\n\ + _0800EF68:\n\ + mov r7, r8\n\ + cmp r7, r9\n\ + blt _0800EEDE\n\ + _0800EF6E:\n\ + mov r0, r9\n\ + cmp r0, 0x7\n\ + bne _0800EF7C\n\ + movs r1, 0x80\n\ + lsls r1, 1\n\ + adds r5, r1\n\ + b _0800EF88\n\ + _0800EF7C:\n\ + mov r2, r9\n\ + cmp r2, 0x5\n\ + bne _0800EF88\n\ + movs r4, 0xF0\n\ + lsls r4, 1\n\ + adds r5, r4\n\ + _0800EF88:\n\ + ldr r0, [sp, 0x14]\n\ + ldr r1, [sp]\n\ + cmp r0, r1\n\ + bge _0800EF92\n\ + b _0800EE16\n\ + _0800EF92:\n\ + b _0800F024\n\ + _0800EF94:\n\ + movs r6, 0\n\ + ldr r2, [sp]\n\ + cmp r6, r2\n\ + bge _0800F024\n\ + _0800EF9C:\n\ + adds r6, 0x1\n\ + mov r10, r6\n\ + mov r4, r9\n\ + cmp r4, 0x6\n\ + bne _0800EFB4\n\ + movs r0, 0\n\ + movs r3, 0xFF\n\ + _0800EFAA:\n\ + strb r0, [r5]\n\ + adds r5, 0x1\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _0800EFAA\n\ + _0800EFB4:\n\ + movs r7, 0\n\ + cmp r7, r9\n\ + bge _0800F008\n\ + _0800EFBA:\n\ + adds r7, 0x1\n\ + mov r8, r7\n\ + mov r1, r9\n\ + lsls r0, r1, 5\n\ + cmp r1, 0x6\n\ + bne _0800EFD4\n\ + movs r1, 0\n\ + movs r3, 0x1F\n\ + _0800EFCA:\n\ + strb r1, [r5]\n\ + adds r5, 0x1\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _0800EFCA\n\ + _0800EFD4:\n\ + adds r1, r0, 0\n\ + cmp r1, 0\n\ + ble _0800EFEE\n\ + adds r3, r1, 0\n\ + _0800EFDC:\n\ + ldr r2, [sp, 0x4]\n\ + ldrb r0, [r2]\n\ + strb r0, [r5]\n\ + adds r2, 0x1\n\ + str r2, [sp, 0x4]\n\ + adds r5, 0x1\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bne _0800EFDC\n\ + _0800EFEE:\n\ + mov r4, r9\n\ + cmp r4, 0x6\n\ + bne _0800F002\n\ + movs r0, 0\n\ + movs r3, 0x1F\n\ + _0800EFF8:\n\ + strb r0, [r5]\n\ + adds r5, 0x1\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _0800EFF8\n\ + _0800F002:\n\ + mov r7, r8\n\ + cmp r7, r9\n\ + blt _0800EFBA\n\ + _0800F008:\n\ + mov r0, r9\n\ + cmp r0, 0x6\n\ + bne _0800F01C\n\ + movs r0, 0\n\ + movs r3, 0xFF\n\ + _0800F012:\n\ + strb r0, [r5]\n\ + adds r5, 0x1\n\ + subs r3, 0x1\n\ + cmp r3, 0\n\ + bge _0800F012\n\ + _0800F01C:\n\ + mov r6, r10\n\ + ldr r1, [sp]\n\ + cmp r6, r1\n\ + blt _0800EF9C\n\ + _0800F024:\n\ + add sp, 0x24\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\ + "); +} +#endif + +bool8 LoadCompressedSpriteSheetUsingHeap(const struct CompressedSpriteSheet* src) +{ + struct SpriteSheet dest; + void* buffer; + + buffer = AllocZeroed(*((u32*)src->data) >> 8); + if (!buffer) + return TRUE; + LZ77UnCompWram(src->data, buffer); + dest.data = buffer; + dest.size = src->size; + dest.tag = src->tag; + LoadSpriteSheet(&dest); + Free(buffer); + return FALSE; +} + +bool8 LoadCompressedSpritePaletteUsingHeap(const struct CompressedSpritePalette *src) +{ + struct SpritePalette dest; + void* buffer; + + buffer = AllocZeroed(*((u32*)src->data) >> 8); + if (!buffer) + return TRUE; + LZ77UnCompWram(src->data, buffer); + dest.data = buffer; + dest.tag = src->tag; + LoadSpritePalette(&dest); + Free(buffer); + return FALSE; +} + +u32 GetDecompressedDataSize(const u8 *ptr) +{ + u32 ptr32[1]; + u8 *ptr8 = (u8 *)ptr32; + + ptr8[0] = ptr[1]; + ptr8[1] = ptr[2]; + ptr8[2] = ptr[3]; + ptr8[3] = 0; + return ptr32[0]; +} + +void DecompressPicFromTable_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void* buffer, s32 species) +{ + if (species > NUM_SPECIES) + LZ77UnCompWram(gMonFrontPicTable[0].data, buffer); + else + LZ77UnCompWram(src->data, buffer); +} + +void HandleLoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality) +{ + bool8 isFrontPic; + + if (src == &gMonFrontPicTable[species]) + isFrontPic = TRUE; // frontPic + else + isFrontPic = FALSE; // backPic + LoadSpecialPokePic_DontHandleDeoxys(src, dest, species, personality, isFrontPic); +} + +void LoadSpecialPokePic_DontHandleDeoxys(const struct CompressedSpriteSheet *src, void *dest, s32 species, u32 personality, bool8 isFrontPic) +{ + if (species == SPECIES_UNOWN) + { + u16 i = (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 3)) % 0x1C; + + // The other Unowns are separate from Unown A. + if (i == 0) + i = SPECIES_UNOWN; + else + i += SPECIES_UNOWN_B - 1; + if (!isFrontPic) + LZ77UnCompWram(gMonBackPicTable[i].data, dest); + else + LZ77UnCompWram(gMonFrontPicTable[i].data, dest); + } + else if (species > NUM_SPECIES) // is species unknown? draw the ? icon + { + LZ77UnCompWram(gMonFrontPicTable[0].data, dest); + } + else + { + LZ77UnCompWram(src->data, dest); + } + DrawSpindaSpots(species, personality, dest, isFrontPic); +} diff --git a/src/dma3_manager.c b/src/dma3_manager.c index 10049a566..ec2cb932f 100644 --- a/src/dma3_manager.c +++ b/src/dma3_manager.c @@ -1,6 +1,13 @@ #include "global.h" #include "dma3.h" +#define MAX_DMA_REQUESTS 128 + +#define DMA_REQUEST_COPY32 1 +#define DMA_REQUEST_FILL32 2 +#define DMA_REQUEST_COPY16 3 +#define DMA_REQUEST_FILL16 4 + static /*IWRAM_DATA*/ struct { /* 0x00 */ const u8 *src; /* 0x04 */ u8 *dest; @@ -9,7 +16,7 @@ static /*IWRAM_DATA*/ struct { /* 0x0C */ u32 value; } gDma3Requests[128]; -static bool8 gDma3ManagerLocked; +static volatile bool8 gDma3ManagerLocked; static u8 gDma3RequestCursor; void ClearDma3Requests(void) @@ -29,78 +36,50 @@ void ClearDma3Requests(void) gDma3ManagerLocked = FALSE; } -#ifdef NONMATCHING void ProcessDma3Requests(void) { - // NOTE: the fillerA member of the DMA struct is actually u32 value; - u16 total_size; + u16 bytesTransferred; if (gDma3ManagerLocked) return; - total_size = 0; + bytesTransferred = 0; // as long as there are DMA requests to process (unless size or vblank is an issue), do not exit - while (gDma3Requests[gDma3RequestCursor].size) + while (gDma3Requests[gDma3RequestCursor].size != 0) { - total_size += gDma3Requests[gDma3RequestCursor].size; + bytesTransferred += gDma3Requests[gDma3RequestCursor].size; - if (total_size > 0xA000) - return; // don't do too much at once - - if (REG_VCOUNT > 224) - return;// we're about to leave vblank, stop + if (bytesTransferred > 40 * 1024) + return; // don't transfer more than 40 KiB + if (*(u8 *)REG_ADDR_VCOUNT > 224) + return; // we're about to leave vblank, stop switch (gDma3Requests[gDma3RequestCursor].mode) { - case 1: // regular 32-bit copy - // _08000C8C - if(gDma3Requests[gDma3RequestCursor].size <= 0x1000) - { - DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); - break; - } - while (gDma3Requests[gDma3RequestCursor].size > 0x1000) - { - DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000); - gDma3Requests[gDma3RequestCursor].src += 0x1000; - gDma3Requests[gDma3RequestCursor].dest += 0x1000; - gDma3Requests[gDma3RequestCursor].size -= 0x1000; - } - DmaCopy32(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + case DMA_REQUEST_COPY32: // regular 32-bit copy + Dma3CopyLarge32_(gDma3Requests[gDma3RequestCursor].src, + gDma3Requests[gDma3RequestCursor].dest, + gDma3Requests[gDma3RequestCursor].size); break; - case 2: // repeat a single 32-bit value across RAM - // _08000CD0 - while (gDma3Requests[gDma3RequestCursor].size > 0x1000) - { - DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000); - gDma3Requests[gDma3RequestCursor].dest += 0x1000; - gDma3Requests[gDma3RequestCursor].size -= 0x1000; - } - DmaFill32(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + case DMA_REQUEST_FILL32: // repeat a single 32-bit value across RAM + Dma3FillLarge32_(gDma3Requests[gDma3RequestCursor].value, + gDma3Requests[gDma3RequestCursor].dest, + gDma3Requests[gDma3RequestCursor].size); break; - case 3: // regular 16-bit copy - // _08000D3C - while (gDma3Requests[gDma3RequestCursor].size > 0x1000) - { - DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, 0x1000); - gDma3Requests[gDma3RequestCursor].src += 0x1000; - gDma3Requests[gDma3RequestCursor].dest += 0x1000; - gDma3Requests[gDma3RequestCursor].size -= 0x1000; - } - DmaCopy16(3, gDma3Requests[gDma3RequestCursor].src, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + case DMA_REQUEST_COPY16: // regular 16-bit copy + Dma3CopyLarge16_(gDma3Requests[gDma3RequestCursor].src, + gDma3Requests[gDma3RequestCursor].dest, + gDma3Requests[gDma3RequestCursor].size); break; - case 4: // repeat a single 16-bit value across RAM - // _08000D88 - while (gDma3Requests[gDma3RequestCursor].size > 0x1000) - { - DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, 0x1000); - gDma3Requests[gDma3RequestCursor].dest += 0x1000; - gDma3Requests[gDma3RequestCursor].size -= 0x1000; - } - DmaFill16(3, gDma3Requests[gDma3RequestCursor].value, gDma3Requests[gDma3RequestCursor].dest, gDma3Requests[gDma3RequestCursor].size); + case DMA_REQUEST_FILL16: // repeat a single 16-bit value across RAM + Dma3FillLarge16_(gDma3Requests[gDma3RequestCursor].value, + gDma3Requests[gDma3RequestCursor].dest, + gDma3Requests[gDma3RequestCursor].size); break; } + + // Free the request gDma3Requests[gDma3RequestCursor].src = NULL; gDma3Requests[gDma3RequestCursor].dest = NULL; gDma3Requests[gDma3RequestCursor].size = 0; @@ -108,328 +87,12 @@ void ProcessDma3Requests(void) gDma3Requests[gDma3RequestCursor].value = 0; gDma3RequestCursor++; - if (gDma3RequestCursor >= 128) // loop back to the first DMA request + if (gDma3RequestCursor >= MAX_DMA_REQUESTS) // loop back to the first DMA request gDma3RequestCursor = 0; } } -#else -__attribute__((naked)) -void ProcessDma3Requests(void) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r10\n\ - mov r6, r9\n\ - mov r5, r8\n\ - push {r5-r7}\n\ - sub sp, 0xC\n\ - ldr r0, =gDma3ManagerLocked\n\ - ldrb r0, [r0]\n\ - cmp r0, 0\n\ - beq _08000C06\n\ - b _08000E46\n\ -_08000C06:\n\ - movs r0, 0\n\ - str r0, [sp, 0x8]\n\ - ldr r1, =gDma3Requests\n\ - ldr r2, =gDma3RequestCursor\n\ - ldrb r0, [r2]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - ldrh r0, [r0, 0x8]\n\ - mov r12, r2\n\ - cmp r0, 0\n\ - bne _08000C1E\n\ - b _08000E46\n\ -_08000C1E:\n\ - mov r8, r1\n\ - adds r1, 0x4\n\ - mov r10, r1\n\ - movs r6, 0x80\n\ - lsls r6, 5\n\ - ldr r7, =0x040000D4 @REG_DMA3\n\ - movs r2, 0\n\ - mov r9, r2\n\ -_08000C2E:\n\ - mov r3, r12 @ gDma3RequestCursor\n\ - ldrb r0, [r3]\n\ - lsls r5, r0, 4\n\ - mov r0, r8 @ gDma3Requests\n\ - adds r1, r5, r0 @ gDma3Requests[gDma3RequestCursor]\n\ - ldrh r0, [r1, 0x8] @ gDma3Requests[gDma3RequestCursor].size\n\ - ldr r2, [sp, 0x8]\n\ - adds r0, r2, r0\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - str r0, [sp, 0x8]\n\ - movs r0, 0xA0\n\ - lsls r0, 8\n\ - ldr r3, [sp, 0x8]\n\ - cmp r3, r0\n\ - bls _08000C50\n\ - b _08000E46\n\ -_08000C50:\n\ - ldr r0, =0x04000006 @REG_VCOUNT\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xE0\n\ - bls _08000C5A\n\ - b _08000E46\n\ -_08000C5A:\n\ - ldrh r0, [r1, 0xA]\n\ - cmp r0, 0x2\n\ - beq _08000CD0\n\ - cmp r0, 0x2\n\ - bgt _08000C80\n\ - cmp r0, 0x1\n\ - beq _08000C8C\n\ - b _08000DF0\n\ - .pool\n\ -_08000C80:\n\ - cmp r0, 0x3\n\ - beq _08000D3C\n\ - cmp r0, 0x4\n\ - bne _08000C8A\n\ - b _08000D88\n\ -_08000C8A:\n\ - b _08000DF0\n\ -_08000C8C:\n\ - ldr r3, [r1]\n\ - mov r2, r10\n\ - adds r0, r5, r2\n\ - ldr r2, [r0]\n\ - ldrh r1, [r1, 0x8]\n\ - cmp r1, r6\n\ - bhi _08000CA6\n\ - str r3, [r7]\n\ - str r2, [r7, 0x4]\n\ - lsrs r0, r1, 2\n\ - movs r1, 0x84\n\ - lsls r1, 24\n\ - b _08000DAA\n\ -_08000CA6:\n\ - ldr r4, =0x040000D4 @REG_DMA3\n\ - str r3, [r4]\n\ - str r2, [r4, 0x4]\n\ - ldr r0, =0x84000400\n\ - str r0, [r4, 0x8]\n\ - ldr r0, [r4, 0x8]\n\ - adds r3, r6\n\ - adds r2, r6\n\ - subs r1, r6\n\ - cmp r1, r6\n\ - bhi _08000CA6\n\ - str r3, [r4]\n\ - str r2, [r4, 0x4]\n\ - lsrs r0, r1, 2\n\ - movs r1, 0x84\n\ - lsls r1, 24\n\ - b _08000D76\n\ - .pool\n\ -_08000CD0:\n\ - mov r3, r10\n\ - adds r0, r5, r3\n\ - ldr r4, [r0]\n\ - ldrh r1, [r1, 0x8]\n\ - cmp r1, r6\n\ - bhi _08000CF4\n\ - mov r0, r8\n\ - adds r0, 0xC\n\ - adds r0, r5, r0\n\ - ldr r0, [r0]\n\ - str r0, [sp]\n\ - mov r5, sp\n\ - str r5, [r7]\n\ - str r4, [r7, 0x4]\n\ - lsrs r0, r1, 2\n\ - movs r1, 0x85\n\ - lsls r1, 24\n\ - b _08000DAA\n\ -_08000CF4:\n\ - mov r2, r12\n\ - ldrb r0, [r2]\n\ - lsls r0, 4\n\ - mov r5, r8\n\ - adds r5, 0xC\n\ - adds r0, r5\n\ - ldr r0, [r0]\n\ - str r0, [sp]\n\ - ldr r3, =0x040000D4 @REG_DMA3\n\ - mov r0, sp\n\ - str r0, [r3]\n\ - str r4, [r3, 0x4]\n\ - ldr r0, =0x85000400\n\ - str r0, [r3, 0x8]\n\ - ldr r0, [r3, 0x8]\n\ - adds r4, r6\n\ - subs r1, r6\n\ - cmp r1, r6\n\ - bhi _08000CF4\n\ - ldrb r0, [r2]\n\ - lsls r0, 4\n\ - adds r0, r5\n\ - ldr r0, [r0]\n\ - str r0, [sp]\n\ - mov r2, sp\n\ - str r2, [r3]\n\ - str r4, [r3, 0x4]\n\ - lsrs r0, r1, 2\n\ - movs r1, 0x85\n\ - lsls r1, 24\n\ - b _08000DEA\n\ - .pool\n\ -_08000D3C:\n\ - ldr r3, [r1]\n\ - mov r2, r10\n\ - adds r0, r5, r2\n\ - ldr r2, [r0]\n\ - ldrh r1, [r1, 0x8]\n\ - cmp r1, r6\n\ - bhi _08000D56\n\ - str r3, [r7]\n\ - str r2, [r7, 0x4]\n\ - lsrs r0, r1, 1\n\ - movs r1, 0x80\n\ - lsls r1, 24\n\ - b _08000DAA\n\ -_08000D56:\n\ - ldr r4, =0x040000D4 @REG_DMA3\n\ - str r3, [r4]\n\ - str r2, [r4, 0x4]\n\ - ldr r0, =0x80000800\n\ - str r0, [r4, 0x8]\n\ - ldr r0, [r4, 0x8]\n\ - adds r3, r6\n\ - adds r2, r6\n\ - subs r1, r6\n\ - cmp r1, r6\n\ - bhi _08000D56\n\ - str r3, [r4]\n\ - str r2, [r4, 0x4]\n\ - lsrs r0, r1, 1\n\ - movs r1, 0x80\n\ - lsls r1, 24\n\ -_08000D76:\n\ - orrs r0, r1\n\ - str r0, [r4, 0x8]\n\ - ldr r0, [r4, 0x8]\n\ - b _08000DF0\n\ - .pool\n\ -_08000D88:\n\ - mov r3, r10\n\ - adds r0, r5, r3\n\ - ldr r2, [r0]\n\ - ldrh r4, [r1, 0x8]\n\ - add r1, sp, 0x4\n\ - cmp r4, r6\n\ - bhi _08000DB2\n\ - mov r0, r8\n\ - adds r0, 0xC\n\ - adds r0, r5, r0\n\ - ldr r0, [r0]\n\ - strh r0, [r1]\n\ - str r1, [r7]\n\ - str r2, [r7, 0x4]\n\ - lsrs r0, r4, 1\n\ - movs r1, 0x81\n\ - lsls r1, 24\n\ -_08000DAA:\n\ - orrs r0, r1\n\ - str r0, [r7, 0x8]\n\ - ldr r0, [r7, 0x8]\n\ - b _08000DF0\n\ -_08000DB2:\n\ - mov r5, r12\n\ - ldrb r0, [r5]\n\ - lsls r0, 4\n\ - ldr r3, =gDma3Requests + 0x0C\n\ - adds r0, r3\n\ - ldr r0, [r0]\n\ - strh r0, [r1]\n\ - ldr r3, =0x040000D4 @REG_DMA3\n\ - str r1, [r3]\n\ - str r2, [r3, 0x4]\n\ - ldr r0, =0x81000800\n\ - str r0, [r3, 0x8]\n\ - ldr r0, [r3, 0x8]\n\ - adds r2, r6\n\ - subs r4, r6\n\ - cmp r4, r6\n\ - bhi _08000DB2\n\ - ldrb r0, [r5]\n\ - lsls r0, 4\n\ - ldr r5, =gDma3Requests + 0x0C\n\ - adds r0, r5\n\ - ldr r0, [r0]\n\ - strh r0, [r1]\n\ - str r1, [r3]\n\ - str r2, [r3, 0x4]\n\ - lsrs r0, r4, 1\n\ - movs r1, 0x81\n\ - lsls r1, 24\n\ -_08000DEA:\n\ - orrs r0, r1\n\ - str r0, [r3, 0x8]\n\ - ldr r0, [r3, 0x8]\n\ -_08000DF0:\n\ - ldr r1, =gDma3Requests\n\ - mov r3, r12\n\ - ldrb r0, [r3]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - mov r2, r9\n\ - str r2, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 4\n\ - add r0, r10\n\ - str r2, [r0]\n\ - ldrb r0, [r3]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - movs r4, 0\n\ - strh r2, [r0, 0x8]\n\ - ldrb r0, [r3]\n\ - lsls r0, 4\n\ - adds r0, r1\n\ - mov r5, r9\n\ - strh r5, [r0, 0xA]\n\ - ldrb r0, [r3]\n\ - lsls r0, 4\n\ - adds r1, 0xC\n\ - adds r0, r1\n\ - mov r1, r9\n\ - str r1, [r0]\n\ - ldrb r0, [r3]\n\ - adds r0, 0x1\n\ - strb r0, [r3]\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bge _08000E34\n\ - strb r4, [r3]\n\ -_08000E34:\n\ - mov r2, r12\n\ - ldrb r0, [r2]\n\ - lsls r0, 4\n\ - ldr r3, =gDma3Requests\n\ - adds r0, r3\n\ - ldrh r0, [r0, 0x8]\n\ - cmp r0, 0\n\ - beq _08000E46\n\ - b _08000C2E\n\ -_08000E46:\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"); -} -#endif -int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode) +s16 RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode) { int cursor; int var = 0; @@ -466,7 +129,7 @@ int RequestDma3Copy(const void *src, void *dest, u16 size, u8 mode) return -1; } -int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode) +s16 RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode) { int cursor; int var = 0; @@ -504,7 +167,7 @@ int RequestDma3Fill(s32 value, void *dest, u16 size, u8 mode) return -1; } -int CheckForSpaceForDma3Request(s16 index) +s16 CheckForSpaceForDma3Request(s16 index) { int current = 0; diff --git a/src/fieldmap.c b/src/fieldmap.c index 5d11c7d99..2683eaf62 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -897,7 +897,7 @@ void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, if (!tileset->isCompressed) LoadBgTiles(2, tileset->tiles, numTiles * 32, offset); else - sub_80F68F0(2, tileset->tiles, numTiles * 32, offset, 0); + DecompressAndCopyTileDataToVram2(2, tileset->tiles, numTiles * 32, offset, 0); } } @@ -908,7 +908,7 @@ void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, if (!tileset->isCompressed) LoadBgTiles(2, tileset->tiles, numTiles * 32, offset); else - sub_80F69E8(2, tileset->tiles, numTiles * 32, offset, 0); + DecompressAndLoadBgGfxUsingHeap2(2, tileset->tiles, numTiles * 32, offset, 0); } } diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c new file mode 100644 index 000000000..3a28c1adc --- /dev/null +++ b/src/fldeff_dig.c @@ -0,0 +1,48 @@ +#include "global.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "fldeff.h" +#include "item_use.h" +#include "overworld.h" +#include "party_menu.h" +#include "sprite.h" +#include "constants/map_objects.h" + +static void FieldCallback_Dig(void); +static void sub_80C9AFC(void); + +bool8 SetUpFieldMove_Dig(void) +{ + if (CanUseEscapeRopeOnCurrMap() == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_Dig; + return TRUE; + } + return FALSE; +} + +static void FieldCallback_Dig(void) +{ + Overworld_ResetStateAfterDigEscRope(); + FieldEffectStart(FLDEFF_USE_DIG); + gFieldEffectArguments[0] = GetCursorSelectionMonId(); +} + +bool8 FldEff_UseDig(void) +{ + u8 taskId = oei_task_add(); + + FLDEFF_SET_FUNC_TO_DATA(sub_80C9AFC); + SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); + return FALSE; +} + +static void sub_80C9AFC(void) +{ + u8 taskId; + + FieldEffectActiveListRemove(FLDEFF_USE_DIG); + taskId = CreateTask(sub_80A1C44, 8); + gTasks[taskId].data[0] = 0; +} diff --git a/src/fldeff_poison.c b/src/fldeff_poison.c new file mode 100644 index 000000000..98f54b4d4 --- /dev/null +++ b/src/fldeff_poison.c @@ -0,0 +1,39 @@ +#include "global.h" +#include "task.h" +#include "bg.h" +#include "sound.h" +#include "constants/songs.h" + +static void Task_FieldPoisonEffect(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + switch (data[0]) + { + case 0: + data[1] += 1; + if (data[1] > 4) + data[0]++; + break; + case 1: + data[1] -= 1; + if (data[1] == 0) + data[0]++; + break; + case 2: + DestroyTask(taskId); + return; + } + AdjustBgMosaic((u8)(((u8)data[1] << 4) | (u8)data[1]), BG_MOSAIC_SET); +} + +void FldEffPoison_Start(void) +{ + PlaySE(SE_DAUGI); + CreateTask(Task_FieldPoisonEffect, 80); +} + +bool32 FldEffPoison_IsActive(void) +{ + return FuncIsActiveTask(Task_FieldPoisonEffect); +} diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c new file mode 100644 index 000000000..517f3479a --- /dev/null +++ b/src/fldeff_rocksmash.c @@ -0,0 +1,137 @@ +#include "global.h" +#include "global.fieldmap.h" +#include "field_player_avatar.h" +#include "field_effect.h" +#include "party_menu.h" +#include "malloc.h" +#include "event_data.h" +#include "script.h" +#include "fldeff.h" +#include "event_scripts.h" +#include "field_weather.h" +#include "sound.h" +#include "palette.h" +#include "overworld.h" +#include "wild_encounter.h" +#include "field_map_obj.h" +#include "constants/songs.h" +#include "constants/map_objects.h" + +static void task08_080C9820(u8 taskId); +static void sub_80C98FC(u8 taskId); +static void sub_80C98B0(u8 taskId); +static void sub_80C99A0(u8 taskId); +static void sub_80C9A10(void); +static void sub_80C9A60(void); + +bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId) +{ + u8 mapObjId; + + GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + gPlayerFacingPosition.height = PlayerGetZCoord(); + mapObjId = GetFieldObjectIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height); + if (gMapObjects[mapObjId].graphicsId != graphicsId) + return FALSE; + gSpecialVar_LastTalked = gMapObjects[mapObjId].localId; + return TRUE; +} + +u8 oei_task_add(void) +{ + GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + return CreateTask(task08_080C9820, 8); +} + +static void task08_080C9820(u8 taskId) +{ + u8 mapObjId; + + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = TRUE; + mapObjId = gPlayerAvatar.mapObjectId; + if (!FieldObjectIsMovementOverridden(&gMapObjects[mapObjId]) + || FieldObjectClearHeldMovementIfFinished(&gMapObjects[mapObjId])) + { + if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) + { + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + gTasks[taskId].func = sub_80C98FC; + } + else + { + sub_805CB70(); + FieldObjectSetHeldMovement(&gMapObjects[mapObjId], 0x45); + gTasks[taskId].func = sub_80C98B0; + } + } +} + +static void sub_80C98B0(u8 taskId) +{ + if (FieldObjectCheckHeldMovementStatus(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE) + { + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + gTasks[taskId].func = sub_80C98FC; + } +} + +static void sub_80C98FC(u8 taskId) +{ + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + gFieldEffectArguments[1] = GetPlayerFacingDirection(); + if (gFieldEffectArguments[1] == 1) + gFieldEffectArguments[2] = 0; + if (gFieldEffectArguments[1] == 2) + gFieldEffectArguments[2] = 1; + if (gFieldEffectArguments[1] == 3) + gFieldEffectArguments[2] = 2; + if (gFieldEffectArguments[1] == 4) + gFieldEffectArguments[2] = 3; + EventObjectSetGraphicsId(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState()); + StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]); + FieldEffectActiveListRemove(6); + gTasks[taskId].func = sub_80C99A0; + } +} + +static void sub_80C99A0(u8 taskId) +{ + FLDEFF_CALL_FUNC_IN_DATA(); + gPlayerAvatar.unk6 = FALSE; + DestroyTask(taskId); +} + +bool8 SetUpFieldMove_RockSmash(void) +{ + if (CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_BREAKABLE_ROCK*/0x60) == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = sub_80C9A10; + return TRUE; + } + return FALSE; +} + +static void sub_80C9A10(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + ScriptContext1_SetupScript(EventScript_FldEffRockSmash); +} + +bool8 FldEff_UseRockSmash(void) +{ + u8 taskId = oei_task_add(); + + FLDEFF_SET_FUNC_TO_DATA(sub_80C9A60); + IncrementGameStat(GAME_STAT_USED_ROCK_SMASH); + return FALSE; +} + +static void sub_80C9A60(void) +{ + PlaySE(SE_W145); + FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH); + EnableBothScriptContexts(); +} diff --git a/src/fldeff_softboiled.c b/src/fldeff_softboiled.c index 50c715388..2a3d68e70 100644 --- a/src/fldeff_softboiled.c +++ b/src/fldeff_softboiled.c @@ -4,11 +4,12 @@ #include "string_util.h" #include "menu.h" #include "constants/songs.h" +#include "fldeff.h" -void sub_80E57E8(u8 taskId); -void sub_80E583C(u8 taskId); -void sub_80E58A0(u8 taskId); -void sub_80E5934(u8 taskId); +static void sub_80E57E8(u8 taskId); +static void sub_80E583C(u8 taskId); +static void sub_80E58A0(u8 taskId); +static void sub_80E5934(u8 taskId); extern const u8 gUnknown_84169F8[]; extern const u8 gUnknown_8416F27[]; @@ -61,22 +62,22 @@ void sub_80E5724(u8 taskId) } } -void sub_80E57E8(u8 taskId) +static void sub_80E57E8(u8 taskId) { PlaySE(SE_KAIFUKU); sub_8120760(taskId, gUnknown_203B0A0.unkA, 1, GetMonData(&gPlayerParty[gUnknown_203B0A0.unk9], MON_DATA_MAX_HP) / 5, sub_80E583C); } -void sub_80E583C(u8 taskId) +static void sub_80E583C(u8 taskId) { GetMonNickname(&gPlayerParty[gUnknown_203B0A0.unkA], gStringVar1); StringExpandPlaceholders(gStringVar4, gUnknown_8416F27); sub_81202F8(gStringVar4, 0); - schedule_bg_copy_tilemap_to_vram(2); + ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = sub_80E58A0; } -void sub_80E58A0(u8 taskId) +static void sub_80E58A0(u8 taskId) { if (sub_8120370() != TRUE) { @@ -91,7 +92,7 @@ void sub_80E58A0(u8 taskId) } } -void sub_80E5900(u8 taskId) +static void sub_80E5900(u8 taskId) { if (sub_8120370() != TRUE) { @@ -100,10 +101,10 @@ void sub_80E5900(u8 taskId) } } -void sub_80E5934(u8 taskId) +static void sub_80E5934(u8 taskId) { PlaySE(SE_SELECT); sub_81202F8(gUnknown_84169F8, 0); - schedule_bg_copy_tilemap_to_vram(2); + ScheduleBgCopyTilemapToVram(2); gTasks[taskId].func = sub_80E5900; } diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c new file mode 100644 index 000000000..3f3254ade --- /dev/null +++ b/src/fldeff_strength.c @@ -0,0 +1,47 @@ +#include "global.h" +#include "field_player_avatar.h" +#include "field_effect.h" +#include "party_menu.h" +#include "event_data.h" +#include "script.h" +#include "fldeff.h" +#include "event_scripts.h" +#include "constants/songs.h" +#include "constants/map_objects.h" + +static void FldEff_UseStrength(void); +static void sub_80D08A8(void); + +bool8 SetUpFieldMove_Strength(void) +{ + if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_PUSHABLE_BOULDER*/0x61) != TRUE) + { + return FALSE; + } + else + { + gSpecialVar_Result = GetCursorSelectionMonId(); + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FldEff_UseStrength; + return TRUE; + } +} +static void FldEff_UseStrength(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + ScriptContext1_SetupScript(EventScript_FldEffStrength); +} + +bool8 sub_80D0860(void) +{ + u8 taskId = oei_task_add(); + FLDEFF_SET_FUNC_TO_DATA(sub_80D08A8); + GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1); + return FALSE; +} + +static void sub_80D08A8(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_STRENGTH); + EnableBothScriptContexts(); +} diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c new file mode 100644 index 000000000..9c6115044 --- /dev/null +++ b/src/fldeff_sweetscent.c @@ -0,0 +1,101 @@ +#include "global.h" +#include "field_player_avatar.h" +#include "field_effect.h" +#include "party_menu.h" +#include "malloc.h" +#include "event_data.h" +#include "script.h" +#include "fldeff.h" +#include "event_scripts.h" +#include "field_weather.h" +#include "sound.h" +#include "palette.h" +#include "wild_encounter.h" +#include "constants/songs.h" + +static void FieldCallback_SweetScent(void); +static void StartSweetScentFieldEffect(void); +static void TrySweetScentEncounter(u8 taskId); +static void FailSweetScentEncounter(u8 taskId); + +static void Unused_StartSweetscentFldeff(void) +{ + gUnknown_203B0A0.unk9 = 0; + FieldCallback_SweetScent(); +} + +bool8 SetUpFieldMove_SweetScent(void) +{ + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_SweetScent; + return TRUE; +} + +static void FieldCallback_SweetScent(void) +{ + FieldEffectStart(FLDEFF_SWEET_SCENT); + gFieldEffectArguments[0] = GetCursorSelectionMonId(); +} + +bool8 FldEff_SweetScent(void) +{ + u8 taskId; + + SetWeatherScreenFadeOut(); + taskId = oei_task_add(); + FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect); + return FALSE; +} + +static void StartSweetScentFieldEffect(void) +{ + u8 taskId; + + PlaySE(SE_W260); + gPaletteDecompressionBuffer = (u8 *)Alloc(0x400); + CpuFastSet(gPlttBufferUnfaded, gPaletteDecompressionBuffer, 0x100); + CpuFastSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x100); + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 0, 8, RGB(31, 0, 0)); + taskId = CreateTask(TrySweetScentEncounter, 0); + gTasks[taskId].data[0] = 0; + FieldEffectActiveListRemove(FLDEFF_SWEET_SCENT); +} + +static void TrySweetScentEncounter(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (!gPaletteFade.active) + { + if (data[0] == 64) + { + data[0] = 0; + if (SweetScentWildEncounter() == TRUE) + { + Free(gPaletteDecompressionBuffer); + DestroyTask(taskId); + } + else + { + gTasks[taskId].func = FailSweetScentEncounter; + BeginNormalPaletteFade(~(1 << (gSprites[GetPlayerAvatarObjectId()].oam.paletteNum + 16)), 4, 8, 0, RGB(31, 0, 0)); + } + } + else + { + data[0]++; + } + } +} + +static void FailSweetScentEncounter(u8 taskId) +{ + if (!gPaletteFade.active) + { + CpuFastSet(gPaletteDecompressionBuffer, gPlttBufferUnfaded, 0x100); + sub_807B070(); + Free(gPaletteDecompressionBuffer); + ScriptContext1_SetupScript(EventScript_FailSweetScent); + DestroyTask(taskId); + } +} diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c index 74fad1110..a66a332bf 100644 --- a/src/fldeff_teleport.c +++ b/src/fldeff_teleport.c @@ -29,8 +29,7 @@ static void FieldCallback_Teleport(void) bool8 FldEff_UseTeleport(void) { u8 taskId = oei_task_add(); - gTasks[taskId].data[8] = (u32)StartTeleportFieldEffect >> 16; - gTasks[taskId].data[9] = (u32)StartTeleportFieldEffect; + FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); return FALSE; } diff --git a/src/hof_pc.c b/src/hof_pc.c new file mode 100644 index 000000000..241fbc4f3 --- /dev/null +++ b/src/hof_pc.c @@ -0,0 +1,53 @@ +#include "global.h" +#include "hall_of_fame.h" +#include "palette.h" +#include "overworld.h" +#include "script.h" +#include "script_menu.h" +#include "task.h" +#include "hall_of_fame.h" +#include "bg.h" +#include "window.h" + +static void ReshowPCMenuAfterHallOfFamePC(void); +static void Task_WaitForPaletteFade(u8 taskId); + +static void Task_WaitFadeAndSetCallback(u8 taskId) +{ + if (!gPaletteFade.active) + { + FreeAllWindowBuffers(); + ResetBgsAndClearDma3BusyFlags(0); + DestroyTask(taskId); + SetMainCallback2(sub_80F2978); + } +} + +void HallOfFamePCBeginFade(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, RGB_BLACK); + ScriptContext2_Enable(); + CreateTask(Task_WaitFadeAndSetCallback, 0); +} + +void ReturnFromHallOfFamePC(void) +{ + SetMainCallback2(CB2_ReturnToField); + gFieldCallback = ReshowPCMenuAfterHallOfFamePC; +} + +static void ReshowPCMenuAfterHallOfFamePC(void) +{ + ScriptContext2_Enable(); + Overworld_PlaySpecialMapMusic(); + ScrSpecial_CreatePCMenu(); + ScriptMenu_DisplayPCStartupPrompt(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, RGB_BLACK); + CreateTask(Task_WaitForPaletteFade, 10); +} + +static void Task_WaitForPaletteFade(u8 taskId) +{ + if (!gPaletteFade.active) + DestroyTask(taskId); +} diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index a244a1075..0c2c60437 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -683,7 +683,7 @@ u8 AddItemIconObject(u16 tilesTag, u16 paletteTag, u16 itemId) spritePalette.data = sub_8098974(itemId, 1); spritePalette.tag = paletteTag; - LoadCompressedObjectPalette(&spritePalette); + LoadCompressedSpritePalette(&spritePalette); CpuCopy16(&gUnknown_83D427C, &template, sizeof(struct SpriteTemplate)); template.tileTag = tilesTag; @@ -714,7 +714,7 @@ u8 AddItemIconObjectWithCustomObjectTemplate(const struct SpriteTemplate * origT spritePalette.data = sub_8098974(itemId, 1); spritePalette.tag = paletteTag; - LoadCompressedObjectPalette(&spritePalette); + LoadCompressedSpritePalette(&spritePalette); CpuCopy16(origTemplate, &template, sizeof(struct SpriteTemplate)); template.tileTag = tilesTag; diff --git a/src/item_pc.c b/src/item_pc.c index afc82a73f..2d30416c9 100644 --- a/src/item_pc.c +++ b/src/item_pc.c @@ -247,7 +247,7 @@ static void ItemPc_MainCB(void) RunTasks(); AnimateSprites(); BuildOamBuffer(); - do_scheduled_bg_tilemap_copies_to_vram(); + DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } @@ -276,7 +276,7 @@ static bool8 ItemPc_DoGfxSetup(void) { case 0: SetVBlankHBlankCallbacksToNull(); - clear_scheduled_bg_copies_to_vram(); + ClearScheduledBgCopiesToVram(); gMain.state++; break; case 1: @@ -423,7 +423,7 @@ static bool8 ItemPc_InitBgs(void) ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); SetBgTilemapBuffer(1, sBg1TilemapBuffer); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(1); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT , 0); ShowBg(0); @@ -436,12 +436,12 @@ static bool8 ItemPc_LoadGraphics(void) switch (sStateDataPtr->data[0]) { case 0: - reset_temp_tile_data_buffers(); - decompress_and_copy_tile_data_to_vram(1, gItemPcTiles, 0, 0, 0); + ResetTempTileDataBuffers(); + DecompressAndCopyTileDataToVram(1, gItemPcTiles, 0, 0, 0); sStateDataPtr->data[0]++; break; case 1: - if (free_temp_tile_data_buffers_if_possible() != TRUE) + if (FreeTempTileDataBuffersIfPossible() != TRUE) { LZDecompressWram(gItemPcTilemap, sBg1TilemapBuffer); sStateDataPtr->data[0]++; @@ -452,11 +452,11 @@ static bool8 ItemPc_LoadGraphics(void) sStateDataPtr->data[0]++; break; case 3: - LoadCompressedObjectPic(&gBagSwapSpriteSheet); + LoadCompressedSpriteSheet(&gBagSwapSpriteSheet); sStateDataPtr->data[0]++; break; default: - LoadCompressedObjectPalette(&gBagSwapSpritePalette); + LoadCompressedSpritePalette(&gBagSwapSpritePalette); sStateDataPtr->data[0] = 0; return TRUE; } @@ -710,7 +710,7 @@ static void ItemPc_SetScrollPosition(void) static void ItemPc_SetMessageWindowPalette(int a0) { SetBgRectPal(1, 0, 14, 30, 6, a0 + 1); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(1); } void ItemPc_SetInitializedFlag(u8 a0) @@ -849,7 +849,7 @@ static void Task_ItemPcSubmenuInit(u8 taskId) CopyItemName(ItemPc_GetItemIdBySlotId(data[1]), gStringVar1); StringExpandPlaceholders(gStringVar4, gOtherText_StrVar1); ItemPc_AddTextPrinterParameterized(windowId, 2, gStringVar4, 0, 2, 1, 0, 0, 1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); gTasks[taskId].func = Task_ItemPcSubmenuRun; } @@ -881,7 +881,7 @@ static void Task_ItemPcWithdraw(u8 taskId) if (ItemPc_GetItemQuantityBySlotId(data[1]) == 1) { PutWindowTilemap(0); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); ItemPc_DoWithdraw(taskId); } else @@ -952,7 +952,7 @@ static void Task_ItemPcCleanUpWithdraw(u8 taskId) ItemPc_SetCursorPosition(); ItemPc_BuildListMenuTemplate(); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sListMenuState.scroll, sListMenuState.row); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); ItemPc_ReturnFromSubmenu(taskId); } @@ -967,7 +967,7 @@ static void ItemPc_WithdrawMultipleInitWindow(u16 slotId) StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); ItemPc_SetBorderStyleOnWindow(3); ItemPc_AddTextPrinterParameterized(3, 0, gStringVar4, 8, 10, 1, 0, 0, 1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); } static void sub_810E670(s16 quantity) @@ -991,7 +991,7 @@ static void Task_ItemPcHandleWithdrawMultiple(u8 taskId) ClearWindowTilemap(3); PutWindowTilemap(0); ItemPc_PrintOrRemoveCursor(data[0], 1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); ItemPc_RemoveScrollIndicatorArrowPair(); ItemPc_DoWithdraw(taskId); } @@ -1004,7 +1004,7 @@ static void Task_ItemPcHandleWithdrawMultiple(u8 taskId) PutWindowTilemap(0); PutWindowTilemap(1); ItemPc_PrintOrRemoveCursor(data[0], 1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); ItemPc_RemoveScrollIndicatorArrowPair(); ItemPc_ReturnFromSubmenu(taskId); } @@ -1049,7 +1049,7 @@ static void gTask_ItemPcWaitButtonAndExitSubmenu(u8 taskId) ClearWindowTilemap(5); PutWindowTilemap(1); ItemPc_PrintOrRemoveCursor(data[0], 1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); ItemPc_ReturnFromSubmenu(taskId); } } @@ -1064,7 +1064,7 @@ static void Task_ItemPcCancel(u8 taskId) PutWindowTilemap(0); PutWindowTilemap(1); ItemPc_PrintOrRemoveCursor(data[0], 1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); ItemPc_ReturnFromSubmenu(taskId); } @@ -1076,7 +1076,7 @@ static void ItemPc_InitWindows(void) DeactivateAllTextPrinters(); TextWindow_SetUserSelectedFrame(0, 0x3C0, 0xE0); TextWindow_SetStdFrame0_WithPal(0, 0x3A3, 0xC0); - TextWindow_SetBubbleFrame_841F1C8(0, 0x3AC, 0xB0); + TextWindow_LoadResourcesStdFrame0(0, 0x3AC, 0xB0); LoadPalette(stdpal_get(2), 0xD0, 0x20); LoadPalette(gTMCaseMainWindowPalette, 0xF0, 0x20); for (i = 0; i < 3; i++) @@ -1084,7 +1084,7 @@ static void ItemPc_InitWindows(void) FillWindowPixelBuffer(i, 0x00); PutWindowTilemap(i); } - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); for (i = 0; i < 3; i++) sSubmenuWindowIds[i] = 0xFF; } @@ -1146,5 +1146,5 @@ static u8 ItemPc_GetSubwindow(u8 idx) static void ItemPc_PrintOnWindow5WithContinueTask(u8 taskId, const u8 * str, TaskFunc taskFunc) { DisplayMessageAndContinueTask(taskId, 5, 0x3AC, 0x0B, 2, GetTextSpeedSetting(), str, taskFunc); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); } diff --git a/src/item_use.c b/src/item_use.c index a7146b65e..3653a1699 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -68,7 +68,6 @@ void sub_80A19E8(u8 taskId); void sub_80A1A44(void); void sub_80A1B48(u8 taskId); void sub_80A1C08(u8 taskId); -void sub_80A1C44(u8 taskId); void sub_80A1CAC(void); void sub_80A1CC0(u8 taskId); void sub_80A1D58(void); @@ -557,7 +556,7 @@ void sub_80A1B48(u8 taskId) } } -bool8 sub_80A1B8C(void) +bool8 CanUseEscapeRopeOnCurrMap(void) { if (gMapHeader.escapeRope & 1) return TRUE; @@ -567,7 +566,7 @@ bool8 sub_80A1B8C(void) void ItemUseOutOfBattle_EscapeRope(u8 taskId) { - if (sub_80A1B8C() == TRUE) + if (CanUseEscapeRopeOnCurrMap() == TRUE) { ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId); sItemUseOnFieldCB = sub_80A1C08; @@ -579,7 +578,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId) void sub_80A1C08(u8 taskId) { - sub_8054D70(); + Overworld_ResetStateAfterDigEscRope(); sub_80A1A44(); gTasks[taskId].data[0] = 0; DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A1C44); diff --git a/src/load_save.c b/src/load_save.c index 8d09a86a8..0a7bbbfc5 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -6,6 +6,7 @@ #include "random.h" #include "malloc.h" #include "item.h" +#include "save_location.h" extern void SetBagPocketsPointers(void); extern void sub_8110840(void *oldSave); @@ -132,28 +133,28 @@ void MoveSaveBlocks_ResetHeap(void) u32 sav2_x1_query_bit1(void) { - return gSaveBlock2Ptr->specialSaveWarp & 1; + return gSaveBlock2Ptr->specialSaveWarpFlags & CONTINUE_GAME_WARP; } void sav2_x9_clear_bit1(void) { - gSaveBlock2Ptr->specialSaveWarp &= ~1; + gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP; } void sub_804C1AC(void) { - gSaveBlock2Ptr->specialSaveWarp |= 1; + gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP; } void sub_804C1C0(void) { sub_8055778(0); - gSaveBlock2Ptr->specialSaveWarp |= 1; + gSaveBlock2Ptr->specialSaveWarpFlags |= CONTINUE_GAME_WARP; } void sav2_gender2_inplace_and_xFE(void) { - gSaveBlock2Ptr->specialSaveWarp &= ~1; + gSaveBlock2Ptr->specialSaveWarpFlags &= ~CONTINUE_GAME_WARP; } void SavePlayerParty(void) diff --git a/src/mail_data.c b/src/mail_data.c new file mode 100644 index 000000000..d4fa649e1 --- /dev/null +++ b/src/mail_data.c @@ -0,0 +1,186 @@ +#include "global.h" +#include "text.h" +#include "mail.h" +#include "mail_data.h" +#include "constants/species.h" +#include "constants/items.h" +#include "pokemon_icon.h" + +void ClearMailData(void) +{ + u8 i; + + for (i = 0; i < MAIL_COUNT; i++) + ClearMailStruct(&gSaveBlock1Ptr->mail[i]); +} + +void ClearMailStruct(struct MailStruct *mail) +{ + s32 i; + + for (i = 0; i < MAIL_WORDS_COUNT; i++) + mail->words[i] = 0xFFFF; + for (i = 0; i < PLAYER_NAME_LENGTH; i++) + mail->playerName[i] = EOS; + for (i = 0; i < 4; i++) + mail->trainerId[i] = 0; + mail->species = SPECIES_BULBASAUR; + mail->itemId = ITEM_NONE; +} + +bool8 MonHasMail(struct Pokemon *mon) +{ + u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + if (ItemIsMail(heldItem) && GetMonData(mon, MON_DATA_MAIL) != 0xFF) + return TRUE; + else + return FALSE; +} + +u8 GiveMailToMon(struct Pokemon *mon, u16 itemId) +{ + u8 heldItem[2]; + u8 id, i; + u16 species; + u32 personality; + + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + for (id = 0; id < PARTY_SIZE; id++) + { + if (gSaveBlock1Ptr->mail[id].itemId == 0) + { + for (i = 0; i < MAIL_WORDS_COUNT; i++) + gSaveBlock1Ptr->mail[id].words[i] = 0xFFFF; + for (i = 0; i < PLAYER_NAME_LENGTH - 1 && gSaveBlock2Ptr->playerName[i] != EOS; i++) + gSaveBlock1Ptr->mail[id].playerName[i] = gSaveBlock2Ptr->playerName[i]; + for (; i <= 5; i++) + gSaveBlock1Ptr->mail[id].playerName[i] = CHAR_SPACE; + gSaveBlock1Ptr->mail[id].playerName[i] = EOS; + for (i = 0; i < 4; i++) + gSaveBlock1Ptr->mail[id].trainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; + species = GetBoxMonData(&mon->box, MON_DATA_SPECIES); + personality = GetBoxMonData(&mon->box, MON_DATA_PERSONALITY); + gSaveBlock1Ptr->mail[id].species = SpeciesToMailSpecies(species, personality); + gSaveBlock1Ptr->mail[id].itemId = itemId; + SetMonData(mon, MON_DATA_MAIL, &id); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + return id; + } + } + return 0xFF; +} + +u16 SpeciesToMailSpecies(u16 species, u32 personality) +{ + if (species == SPECIES_UNOWN) { + u32 mailSpecies = GetUnownLetterByPersonality(personality) + 30000; + return mailSpecies; + } + return species; +} + +u16 MailSpeciesToSpecies(u16 mailSpecies, u16 *unownLetter) +{ + u16 result; + + if (mailSpecies >= 30000 && mailSpecies < (30000 + UNOWN_FORM_COUNT)) + { + result = SPECIES_UNOWN; + *unownLetter = mailSpecies - 30000; + } + else + { + result = mailSpecies; + } + return result; +} + +u8 GiveMailToMon2(struct Pokemon *mon, struct MailStruct *mail) +{ + u8 heldItem[2]; + u16 itemId = mail->itemId; + u8 mailId = GiveMailToMon(mon, itemId); + + if (mailId == 0xFF) + return 0xFF; + gSaveBlock1Ptr->mail[mailId] = *mail; + SetMonData(mon, MON_DATA_MAIL, &mailId); + heldItem[0] = itemId; + heldItem[1] = itemId >> 8; + + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + + return mailId; +} + +static bool32 DummyMailFunc(void) +{ + return FALSE; +} + +void TakeMailFromMon(struct Pokemon *mon) +{ + u8 heldItem[2]; + u8 mailId; + + if (MonHasMail(mon)) + { + mailId = GetMonData(mon, MON_DATA_MAIL); + gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; + mailId = 0xFF; + heldItem[0] = ITEM_NONE; + heldItem[1] = ITEM_NONE << 8; + SetMonData(mon, MON_DATA_MAIL, &mailId); + SetMonData(mon, MON_DATA_HELD_ITEM, heldItem); + } +} + +void ClearMailItemId(u8 mailId) +{ + gSaveBlock1Ptr->mail[mailId].itemId = ITEM_NONE; +} + +u8 TakeMailFromMon2(struct Pokemon *mon) +{ + u8 i, newMailId; + u8 newHeldItem[2]; + + newHeldItem[0] = ITEM_NONE; + newHeldItem[1] = ITEM_NONE << 8; + newMailId = 0xFF; + for (i = PARTY_SIZE; i < MAIL_COUNT; i++) + { + if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE) + { + memcpy(&gSaveBlock1Ptr->mail[i], &gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)], sizeof(struct MailStruct)); + gSaveBlock1Ptr->mail[GetMonData(mon, MON_DATA_MAIL)].itemId = ITEM_NONE; + SetMonData(mon, MON_DATA_MAIL, &newMailId); + SetMonData(mon, MON_DATA_HELD_ITEM, newHeldItem); + return i; + } + } + return 0xFF; +} + +bool8 ItemIsMail(u16 itemId) +{ + switch (itemId) + { + case ITEM_ORANGE_MAIL: + case ITEM_HARBOR_MAIL: + case ITEM_GLITTER_MAIL: + case ITEM_MECH_MAIL: + case ITEM_WOOD_MAIL: + case ITEM_WAVE_MAIL: + case ITEM_BEAD_MAIL: + case ITEM_SHADOW_MAIL: + case ITEM_TROPIC_MAIL: + case ITEM_DREAM_MAIL: + case ITEM_FAB_MAIL: + case ITEM_RETRO_MAIL: + return TRUE; + default: + return FALSE; + } +} diff --git a/src/map_obj_lock.c b/src/map_obj_lock.c index cdd74a5b9..f89819647 100644 --- a/src/map_obj_lock.c +++ b/src/map_obj_lock.c @@ -89,7 +89,7 @@ void LockSelectedMapObject(void) void sub_80696C0(void) { u8 fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]); + FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]); sub_80974D8(); UnfreezeMapObjects(); } @@ -98,9 +98,9 @@ void sub_80696F0(void) { u8 fieldObjectId; if (gMapObjects[gSelectedEventObject].active) - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]); + FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]); fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]); + FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]); sub_80974D8(); UnfreezeMapObjects(); } diff --git a/src/menu2.c b/src/menu2.c index 9a1846c7e..ffe5865e4 100644 --- a/src/menu2.c +++ b/src/menu2.c @@ -820,7 +820,7 @@ u8 sub_812EA78(u16 species, u32 personality, u8 a2) { if (species == SPECIES_UNOWN) { - u8 unownLetter = GetUnownLetterByPersonality(personality); + u8 unownLetter = GetUnownLetterByPersonalityLoByte(personality); switch (unownLetter) { case 0: diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c index 034a07679..abd29ca11 100644 --- a/src/mevent_8145654.c +++ b/src/mevent_8145654.c @@ -175,13 +175,13 @@ s32 FadeToWonderCardMenu(void) CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); - decompress_and_copy_tile_data_to_vram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0); + DecompressAndCopyTileDataToVram(2, gUnknown_203F3C8->unk_0170->tiles, 0, 0x008, 0); gUnknown_203F3C8->unk_0176[0] = AddWindow(&gUnknown_8467074[0]); gUnknown_203F3C8->unk_0176[1] = AddWindow(&gUnknown_8467074[1]); gUnknown_203F3C8->unk_0176[2] = AddWindow(&gUnknown_8467074[2]); break; case 3: - if (free_temp_tile_data_buffers_if_possible()) + if (FreeTempTileDataBuffersIfPossible()) return 0; gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(gUnknown_203F3C8->unk_0170->pal, 0x10, 0x20); @@ -402,7 +402,7 @@ void sub_8146060(void) } if (gUnknown_203F3C8->unk_0000.unk_09 != 0 && gUnknown_203F3C8->unk_0000.unk_08_0 == 1) { - sub_800F034(&gUnknown_8467F58); + LoadCompressedSpriteSheetUsingHeap(&gUnknown_8467F58); LoadSpritePalette(&gUnknown_8467F60[gUnknown_203F3C8->unk_0170->textPal4]); for (; r7 < gUnknown_203F3C8->unk_0000.unk_09; r7++) { @@ -565,12 +565,12 @@ s32 FadeToWonderNewsMenu(void) CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); CopyBgTilemapBufferToVram(3); - decompress_and_copy_tile_data_to_vram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0); + DecompressAndCopyTileDataToVram(3, gUnknown_203F3CC->unk_01BC->tiles, 0, 8, 0); gUnknown_203F3CC->unk_01C8[0] = AddWindow(&gUnknown_8468040[0]); gUnknown_203F3CC->unk_01C8[1] = AddWindow(&gUnknown_8468040[1]); break; case 3: - if (free_temp_tile_data_buffers_if_possible()) + if (FreeTempTileDataBuffersIfPossible()) return 0; gPaletteFade.bufferTransferDisabled = TRUE; LoadPalette(gUnknown_203F3CC->unk_01BC->pal, 0x10, 0x20); diff --git a/src/multiboot.c b/src/multiboot.c new file mode 100644 index 000000000..cfc9821d2 --- /dev/null +++ b/src/multiboot.c @@ -0,0 +1,416 @@ +#include "global.h" +#include "multiboot.h" + +static IWRAM_DATA u16 MultiBoot_required_data[MULTIBOOT_NCHILD]; + +static int MultiBootSend(struct MultiBootParam *mp, u16 data); +static int MultiBootHandShake(struct MultiBootParam *mp); +static void MultiBootWaitCycles(u32 cycles); +static void MultiBootWaitSendDone(void); + +void MultiBootInit(struct MultiBootParam *mp) +{ + mp->client_bit = 0; + mp->probe_count = 0; + mp->response_bit = 0; + mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT; + mp->sendflag = 0; + mp->handshake_timeout = 0; + REG_RCNT = 0; + REG_SIOCNT = SIO_MULTI_MODE | SIO_115200_BPS; + REG_SIODATA8 = 0; +} + +int MultiBootMain(struct MultiBootParam *mp) +{ + int i, j, k; + + if (MultiBootCheckComplete(mp)) + { + return 0; + } + if (mp->check_wait > MULTIBOOT_CONNECTION_CHECK_WAIT) + { + mp->check_wait--; + return 0; + } +output_burst: + if (mp->sendflag) + { + mp->sendflag = 0; + + i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_ERROR | SIO_ID | SIO_MULTI_SD | SIO_MULTI_SI); + if (i != SIO_MULTI_SD) + { + MultiBootInit(mp); + return i ^ SIO_MULTI_SD; + } + } + if (mp->probe_count >= 0xe0) + { + i = MultiBootHandShake(mp); + if (i) + { + return i; + } + + if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK + && mp->probe_count > 0xe1 + && MultiBootCheckComplete(mp) == 0) + { + MultiBootWaitSendDone(); + goto output_burst; + } + + if (MultiBootCheckComplete(mp) == 0) + { + if (mp->handshake_timeout == 0) + { + MultiBootInit(mp); + return MULTIBOOT_ERROR_HANDSHAKE_FAILURE; + } + mp->handshake_timeout--; + } + + return 0; + } + switch (mp->probe_count) + { + case 0: + k = 0x0e; + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + if (*(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2) != 0xffff) + { + break; + } + k >>= 1; + } + k &= 0x0e; + mp->response_bit = k; + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + if (mp->client_bit & (1 << i)) + { + if (j != ((MULTIBOOT_CLIENT_INFO << 8) | (1 << i))) + { + k = 0; + break; + } + } + } + mp->client_bit &= k; + if (k == 0) + { + mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT; + } + + if (mp->check_wait) + { + mp->check_wait--; + } + else + { + if (mp->response_bit != mp->client_bit) + { + MultiBootStartProbe(mp); + goto case_1; + } + } + output_master_info: + return MultiBootSend(mp, (MULTIBOOT_MASTER_INFO << 8) | mp->client_bit); + case_1: + case 1: + mp->probe_target_bit = 0; + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + if ((j >> 8) == MULTIBOOT_CLIENT_INFO) + { + MultiBoot_required_data[i - 1] = j; + j &= 0xff; + if (j == (1 << i)) + { + mp->probe_target_bit |= j; + } + } + } + if (mp->response_bit != mp->probe_target_bit) + { + goto output_master_info; + } + mp->probe_count = 2; + return MultiBootSend(mp, (MULTIBOOT_MASTER_START_PROBE << 8) | mp->probe_target_bit); + case 2: + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + if (mp->probe_target_bit & (1 << i)) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + if (j != MultiBoot_required_data[i - 1]) + { + mp->probe_target_bit ^= 1 << i; + } + } + } + goto output_header; + case 0xd0: + k = 1; + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + mp->client_data[i - 1] = j; + if (mp->probe_target_bit & (1 << i)) + { + if ((j >> 8) != MULTIBOOT_CLIENT_INFO + && (j >> 8) != MULTIBOOT_CLIENT_DLREADY) + { + MultiBootInit(mp); + return MULTIBOOT_ERROR_NO_DLREADY; + } + if (j == MultiBoot_required_data[i - 1]) + { + k = 0; + } + } + } + if (k == 0) + { + return MultiBootSend(mp, (MULTIBOOT_MASTER_REQUEST_DLREADY << 8) | mp->palette_data); + } + mp->probe_count = 0xd1; + k = 0x11; + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + k += mp->client_data[i - 1]; + } + mp->handshake_data = k; + return MultiBootSend(mp, (MULTIBOOT_MASTER_START_DL << 8) | (k & 0xff)); + case 0xd1: + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + if (mp->probe_target_bit & (1 << i)) + { + if ((j >> 8) != MULTIBOOT_CLIENT_DLREADY) + { + MultiBootInit(mp); + return MULTIBOOT_ERROR_NO_DLREADY; + } + } + } + i = MultiBoot(mp); + if (i == 0) + { + mp->probe_count = 0xe0; + mp->handshake_timeout = MULTIBOOT_HANDSHAKE_TIMEOUT; + return 0; + } + MultiBootInit(mp); + mp->check_wait = MULTIBOOT_CONNECTION_CHECK_WAIT * 2; + return MULTIBOOT_ERROR_BOOT_FAILURE; + default: + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + if (mp->probe_target_bit & (1 << i)) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + if ((j >> 8) != (MULTIBOOT_MASTER_START_PROBE + 1 - (mp->probe_count >> 1)) + || ((j & 0xff) != (1 << i))) + { + mp->probe_target_bit ^= 1 << i; + } + } + } + if (mp->probe_count == 0xc4) + { + mp->client_bit = mp->probe_target_bit & 0x0e; + mp->probe_count = 0; + goto output_master_info; + } + output_header: + if (mp->probe_target_bit == 0) + { + MultiBootInit(mp); + return MULTIBOOT_ERROR_NO_PROBE_TARGET; + } + mp->probe_count += 2; + if (mp->probe_count == 0xc4) + { + goto output_master_info; + } + i = MultiBootSend(mp, + (mp->masterp[mp->probe_count - 4 + 1] << 8) + | mp->masterp[mp->probe_count - 4]); + if (i) + { + return i; + } + if (mp->server_type == MULTIBOOT_SERVER_TYPE_QUICK) + { + MultiBootWaitSendDone(); + goto output_burst; + } + return 0; + } +} + +static int MultiBootSend(struct MultiBootParam *mp, u16 data) +{ + int i = REG_SIOCNT & (SIO_MULTI_BUSY | SIO_MULTI_SD | SIO_MULTI_SI); + if (i != SIO_MULTI_SD) + { + MultiBootInit(mp); + return i ^ SIO_MULTI_SD; + } + REG_SIODATA8 = data; + REG_SIOCNT = SIO_MULTI_MODE | SIO_START | SIO_115200_BPS; + mp->sendflag = 1; + return 0; +} + +void MultiBootStartProbe(struct MultiBootParam *mp) +{ + if (mp->probe_count != 0) + { + MultiBootInit(mp); + return; + } + mp->check_wait = 0; + mp->client_bit = 0; + mp->probe_count = 1; +} + +void MultiBootStartMaster(struct MultiBootParam *mp, const u8 *srcp, int length, u8 palette_color, s8 palette_speed) +{ + int i = 0; + + if (mp->probe_count != 0 + || mp->client_bit == 0 + || mp->check_wait != 0) + { + MultiBootInit(mp); + return; + } + mp->boot_srcp = srcp; + length = (length + 15) & ~15; + if (length < MULTIBOOT_SEND_SIZE_MIN || length > MULTIBOOT_SEND_SIZE_MAX) + { + MultiBootInit(mp); + return; + } + mp->boot_endp = srcp + length; + switch (palette_speed) + { + case -4: + case -3: + case -2: + case -1: + i = (palette_color << 3) | (3 - palette_speed); + break; + case 0: + i = 0x38 | palette_color; + break; + case 1: + case 2: + case 3: + case 4: + i = (palette_color << 3) | (palette_speed - 1); + break; + } + mp->palette_data = ((i & 0x3f) << 1) | 0x81; + mp->probe_count = 0xd0; +} + +bool32 MultiBootCheckComplete(struct MultiBootParam *mp) +{ + if (mp->probe_count == 0xe9) + return 1; + else + return 0; +} + +static int MultiBootHandShake(struct MultiBootParam *mp) +{ + int i, j; + +#define send_data (mp->system_work[0]) +#define must_data (mp->system_work[1]) + switch (mp->probe_count) + { + case_0xe0: + case 0xe0: + mp->probe_count = 0xe1; + must_data = 0x0000; + send_data = 0x100000; + return MultiBootSend(mp, 0x0000); + default: + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + if ((mp->client_bit & (1 << i)) + && j != must_data) + { + goto case_0xe0; + } + } + mp->probe_count++; + must_data = send_data & 0xffff; + if (send_data == 0x0000) + { + must_data = mp->masterp[0xac] | (mp->masterp[0xad] << 8); + send_data = must_data << 5; + } + send_data >>= 5; + output_common: + return MultiBootSend(mp, send_data); + case 0xe7: + case 0xe8: + for (i = MULTIBOOT_NCHILD; i != 0; i--) + { + j = *(vu16 *)(REG_ADDR_SIOMULTI0 + i * 2); + if ((mp->client_bit & (1 << i)) && j != must_data) + { + MultiBootInit(mp); + return MULTIBOOT_ERROR_HANDSHAKE_FAILURE; + } + } + + mp->probe_count++; + if (mp->probe_count == 0xe9) + { + return 0; + } + send_data = mp->masterp[0xae] | (mp->masterp[0xaf] << 8); + must_data = send_data; + goto output_common; + } +#undef send_data +#undef must_data +} + +static void MultiBootWaitCycles(u32 cycles) +{ + asm("mov r2, pc"); + asm("lsr r2, #24"); + asm("mov r1, #12"); + asm("cmp r2, #0x02"); + asm("beq MultiBootWaitCyclesLoop"); + asm("mov r1, #13"); + asm("cmp r2, #0x08"); + asm("beq MultiBootWaitCyclesLoop"); + asm("mov r1, #4"); + + asm("MultiBootWaitCyclesLoop:"); + asm("sub r0, r1"); + asm("bgt MultiBootWaitCyclesLoop"); +} + +static void MultiBootWaitSendDone(void) +{ + int i; + + for (i = 0; (i < 31069) && (REG_SIOCNT & SIO_START); i++); + MultiBootWaitCycles(600); +} diff --git a/src/new_menu_helpers.c b/src/new_menu_helpers.c new file mode 100644 index 000000000..1939154da --- /dev/null +++ b/src/new_menu_helpers.c @@ -0,0 +1,767 @@ +#include "global.h" +#include "malloc.h" +#include "dma3.h" +#include "task.h" +#include "bg.h" +#include "gpu_regs.h" +#include "window.h" +#include "menu.h" +#include "menu_helpers.h" +#include "new_menu_helpers.h" +#include "quest_log.h" +#include "text.h" +#include "field_specials.h" +#include "text_window.h" +#include "script.h" +#include "graphics.h" +#include "palette.h" + +#define DLG_WINDOW_PALETTE_NUM 15 +#define DLG_WINDOW_BASE_TILE_NUM 0x200 +#define STD_WINDOW_PALETTE_NUM 14 +#define STD_WINDOW_BASE_TILE_NUM 0x214 + +static EWRAM_DATA bool8 gUnknown_203AB58[4] = {FALSE}; // knizz: bgmaps_that_need_syncing +static EWRAM_DATA u16 gUnknown_203AB5C = {0}; +static EWRAM_DATA void *gUnknown_203AB60[0x20] = {NULL}; +static EWRAM_DATA u8 sStartMenuWindowId = {0}; + +static const u8 gUnknown_841F428[] = { 8, 4, 1 }; + +static const struct WindowTemplate sStandardTextBox_WindowTemplates[] = +{ + { + .bg = 0, + .tilemapLeft = 0x2, + .tilemapTop = 0xF, + .width = 0x1A, + .height = 0x4, + .paletteNum = DLG_WINDOW_PALETTE_NUM, + .baseBlock = 0x198, + }, + DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate sYesNo_WindowTemplate = +{ + .bg = 0, + .tilemapLeft = 0x15, + .tilemapTop = 0x9, + .width = 0x6, + .height = 0x4, + .paletteNum = DLG_WINDOW_PALETTE_NUM, + .baseBlock = 0x125, +}; + +static const struct FontInfo gFontInfos[] = +{ + { + .fontFunction = Font0Func, + .maxLetterWidth = 0x8, + .maxLetterHeight = 0xD, + .letterSpacing = 0x0, + .lineSpacing = 0x0, + .unk = 0x0, + .fgColor = 0x2, + .bgColor = 0x1, + .shadowColor = 0x3, + }, + { + .fontFunction = Font1Func, + .maxLetterWidth = 0x8, + .maxLetterHeight = 0xE, + .letterSpacing = 0x0, + .lineSpacing = 0x0, + .unk = 0x0, + .fgColor = 0x2, + .bgColor = 0x1, + .shadowColor = 0x3, + }, + { + .fontFunction = Font2Func, + .maxLetterWidth = 0xA, + .maxLetterHeight = 0xE, + .letterSpacing = 0x1, + .lineSpacing = 0x0, + .unk = 0x0, + .fgColor = 0x2, + .bgColor = 0x1, + .shadowColor = 0x3, + }, + { + .fontFunction = Font3Func, + .maxLetterWidth = 0xA, + .maxLetterHeight = 0xE, + .letterSpacing = 0x1, + .lineSpacing = 0x0, + .unk = 0x0, + .fgColor = 0x2, + .bgColor = 0x1, + .shadowColor = 0x3, + }, + { + .fontFunction = Font4Func, + .maxLetterWidth = 0xA, + .maxLetterHeight = 0xE, + .letterSpacing = 0x0, + .lineSpacing = 0x0, + .unk = 0x0, + .fgColor = 0x2, + .bgColor = 0x1, + .shadowColor = 0x3, + }, + { + .fontFunction = Font5Func, + .maxLetterWidth = 0xA, + .maxLetterHeight = 0xE, + .letterSpacing = 0x0, + .lineSpacing = 0x0, + .unk = 0x0, + .fgColor = 0x2, + .bgColor = 0x1, + .shadowColor = 0x3, + }, + { + .fontFunction = Font6Func, + .maxLetterWidth = 0x8, + .maxLetterHeight = 0x10, + .letterSpacing = 0x0, + .lineSpacing = 0x2, + .unk = 0x0, + .fgColor = 0x2, + .bgColor = 0x1, + .shadowColor = 0x3, + }, + { + .fontFunction = NULL, + .maxLetterWidth = 0x8, + .maxLetterHeight = 0x8, + .letterSpacing = 0x0, + .lineSpacing = 0x0, + .unk = 0x0, + .fgColor = 0x1, + .bgColor = 0x2, + .shadowColor = 0xF, + } +}; + +static const u8 gMenuCursorDimensions[][2] = +{ + { 0x8, 0xD }, + { 0x8, 0xE }, + { 0x8, 0xE }, + { 0x8, 0xE }, + { 0x8, 0xE }, + { 0x8, 0xE }, + { 0x8, 0x10 }, + { 0x0, 0x0 } +}; + +static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode); +static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); +static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); +static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); +static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum); +static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId); + +void ClearScheduledBgCopiesToVram(void) +{ + memset(gUnknown_203AB58, 0, sizeof(gUnknown_203AB58)); +} + +void ScheduleBgCopyTilemapToVram(u8 bgId) +{ + gUnknown_203AB58[bgId] = TRUE; +} + +void DoScheduledBgTilemapCopiesToVram(void) +{ + if (gUnknown_203AB58[0] == TRUE) + { + CopyBgTilemapBufferToVram(0); + gUnknown_203AB58[0] = FALSE; + } + if (gUnknown_203AB58[1] == TRUE) + { + CopyBgTilemapBufferToVram(1); + gUnknown_203AB58[1] = FALSE; + } + if (gUnknown_203AB58[2] == TRUE) + { + CopyBgTilemapBufferToVram(2); + gUnknown_203AB58[2] = FALSE; + } + if (gUnknown_203AB58[3] == TRUE) + { + CopyBgTilemapBufferToVram(3); + gUnknown_203AB58[3] = FALSE; + } +} + +void ResetTempTileDataBuffers(void) +{ + int i; + + for (i = 0; i < (s32)NELEMS(gUnknown_203AB60); i++) + { + gUnknown_203AB60[i] = NULL; + } + gUnknown_203AB5C = 0; +} + +bool8 FreeTempTileDataBuffersIfPossible(void) +{ + int i; + + if (!IsDma3ManagerBusyWithBgCopy()) + { + if (gUnknown_203AB5C) + { + for (i = 0; i < gUnknown_203AB5C; i++) + { + FREE_AND_SET_NULL(gUnknown_203AB60[i]); + } + gUnknown_203AB5C = 0; + } + return FALSE; + } + else + { + return TRUE; + } +} + +void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) +{ + u32 sizeOut; + + if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60)) + { + void *ptr = MallocAndDecompress(src, &sizeOut); + if (!size) + size = sizeOut; + if (ptr) + { + CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode); + gUnknown_203AB60[gUnknown_203AB5C++] = ptr; + } + return ptr; + } + return NULL; +} + +void *DecompressAndCopyTileDataToVram2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) +{ + u32 sizeOut; + + if (gUnknown_203AB5C < NELEMS(gUnknown_203AB60)) + { + void *ptr = MallocAndDecompress(src, &sizeOut); + if (sizeOut > size) + sizeOut = size; + if (ptr) + { + CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode); + gUnknown_203AB60[gUnknown_203AB5C++] = ptr; + } + return ptr; + } + return NULL; +} + +void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) +{ + u32 sizeOut; + + void *ptr = MallocAndDecompress(src, &sizeOut); + if (!size) + size = sizeOut; + if (ptr) + { + u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0); + gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, size, offset, mode); + SetWordTaskArg(taskId, 1, (u32)ptr); + } +} + +void DecompressAndLoadBgGfxUsingHeap2(u8 bgId, const void *src, u32 size, u16 offset, u8 mode) +{ + u32 sizeOut; + + void *ptr = MallocAndDecompress(src, &sizeOut); + if (sizeOut > size) + sizeOut = size; + if (ptr) + { + u8 taskId = CreateTask(TaskFreeBufAfterCopyingTileDataToVram, 0); + gTasks[taskId].data[0] = CopyDecompressedTileDataToVram(bgId, ptr, sizeOut, offset, mode); + SetWordTaskArg(taskId, 1, (u32)ptr); + } +} + +static void TaskFreeBufAfterCopyingTileDataToVram(u8 taskId) +{ + if (!CheckForSpaceForDma3Request(gTasks[taskId].data[0])) + { + Free((void *)GetWordTaskArg(taskId, 1)); + DestroyTask(taskId); + } +} + +void *MallocAndDecompress(const void *src, u32 *size) +{ + void *ptr; + u8 *sizeAsBytes = (u8 *)size; + const u8 *srcAsBytes = src; + + sizeAsBytes[0] = srcAsBytes[1]; + sizeAsBytes[1] = srcAsBytes[2]; + sizeAsBytes[2] = srcAsBytes[3]; + sizeAsBytes[3] = 0; + + ptr = Alloc(*size); + if (ptr) + LZ77UnCompWram(src, ptr); + return ptr; +} + +static u16 CopyDecompressedTileDataToVram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode) +{ + switch (mode) + { + case 1: + break; + case 0: + default: + return LoadBgTiles(bgId, src, size, offset); + } + return LoadBgTilemap(bgId, src, size, offset); +} + +void SetBgRectPal(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette) +{ + u8 i, j; + u16 *ptr = GetBgTilemapBuffer(bgId); + + for (i = top; i < top + height; i++) + { + for (j = left; j < left + width; j++) + { + ptr[(i * 32) + j] = (ptr[(i * 32) + j] & 0xFFF) | (palette << 12); + } + } +} + +void CopyRectIntoAltRect(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height) +{ + u8 i,j; + const u16 *src = GetBgTilemapBuffer(bgId); + + for (i = 0; i < height; i++) + { + for (j = 0; j < width; j++) + { + dest[(i * width) + j] = src[(i + top) * 32 + j + left]; + } + } +} + +void ResetBgPositions(void) +{ + ChangeBgX(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgY(3, 0, 0); +} + +void InitStandardTextBoxWindows(void) +{ + InitWindows(sStandardTextBox_WindowTemplates); + sStartMenuWindowId = 0xFF; + MapNamePopupWindowIdSetDummy(); +} + +void FreeAllOverworldWindowBuffers(void) +{ + FreeAllWindowBuffers(); +} + +void ResetBg0(void) +{ + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + DeactivateAllTextPrinters(); + sub_80F6E9C(); +} + +u16 RunTextPrinters_CheckPrinter0Active(void) +{ + RunTextPrinters(); + return IsTextPrinterActive(0); +} + +u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor) +{ + struct TextPrinterTemplate printer; + + printer.currentChar = str; + printer.windowId = windowId; + printer.fontId = fontId; + printer.x = 0; + printer.y = 1; + printer.currentX = 0; + printer.currentY = 1; + printer.letterSpacing = 1; + printer.lineSpacing = 1; + printer.unk = 0; + printer.fgColor = fgColor; + printer.bgColor = bgColor; + printer.shadowColor = shadowColor; + gTextFlags.useAlternateDownArrow = 0; + return AddTextPrinter(&printer, speed, callback); +} + +void AddTextPrinterDiffStyle(bool8 allowSkippingDelayWithButtonPress) +{ + u8 result; + void *nptr = NULL; + + gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; + result = ContextNpcGetTextColor(); + if (result == 0) + AddTextPrinterParameterized2(0, 4, gStringVar4, GetTextSpeedSetting(), nptr, 8, 1, 3); + else if (result == 1) + AddTextPrinterParameterized2(0, 5, gStringVar4, GetTextSpeedSetting(), nptr, 4, 1, 3); + else + AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), nptr, 2, 1, 3); +} + +void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress) +{ + gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; + AddTextPrinterParameterized2(0, 2, gStringVar4, GetTextSpeedSetting(), NULL, 2, 1, 3); +} + +void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed) +{ + gTextFlags.canABSpeedUpPrint = allowSkippingDelayWithButtonPress; + AddTextPrinterParameterized2(0, 2, gStringVar4, speed, NULL, 2, 1, 3); +} + +void sub_80F6E9C(void) +{ + if (gUnknown_203ADFA == 2) + { + gTextFlags.autoScroll = 1; + TextWindow_LoadTilesStdFrame1(0, DLG_WINDOW_BASE_TILE_NUM); + } + else + { + Menu_LoadStdPal(); + TextWindow_LoadResourcesStdFrame0(0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10); + } + TextWindow_SetUserSelectedFrame(0, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM * 0x10); +} + +void DrawDialogueFrame(u8 windowId, bool8 copyToVram) +{ + CallWindowFunction(windowId, WindowFunc_DrawDialogueFrame); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + PutWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, 3); +} + +void DrawStdWindowFrame(u8 windowId, bool8 copyToVram) +{ + CallWindowFunction(windowId, WindowFunc_DrawStandardFrame); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + PutWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, 3); +} + +void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram) +{ + CallWindowFunction(windowId, WindowFunc_ClearDialogWindowAndFrame); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + ClearWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, 3); + if (gUnknown_203ADFA == 2) + sub_8111134(); +} + +void ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram) +{ + CallWindowFunction(windowId, WindowFunc_ClearStdWindowAndFrame); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + ClearWindowTilemap(windowId); + if (copyToVram == TRUE) + CopyWindowToVram(windowId, 3); +} + +static void WindowFunc_DrawStandardFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) +{ + int i; + + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 1, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 1, tilemapLeft, tilemapTop - 1, width, 1, STD_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 2, tilemapLeft + width, tilemapTop - 1, 1, 1, STD_WINDOW_PALETTE_NUM); + for (i = tilemapTop; i < tilemapTop + height; i++) + { + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 3, tilemapLeft - 1, i, 1, 1, STD_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 5, tilemapLeft + width, i, 1, 1, STD_WINDOW_PALETTE_NUM); + } + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 7, tilemapLeft, tilemapTop + height, width, 1, STD_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, STD_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop + height, 1, 1, STD_WINDOW_PALETTE_NUM); +} + +static void WindowFunc_DrawDialogueFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) +{ + if (!IsMsgSignPost() || gUnknown_203ADFA == 2) + { + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + } + else + { + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 0, tilemapLeft - 2, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 1, tilemapLeft - 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 2, tilemapLeft, tilemapTop - 1, width, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 3, tilemapLeft + width, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 4, tilemapLeft + width + 1, tilemapTop - 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 5, tilemapLeft - 2, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 6, tilemapLeft - 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 8, tilemapLeft + width, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 9, tilemapLeft + width + 1, tilemapTop, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 10, tilemapLeft - 2, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 11, tilemapLeft - 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 12, tilemapLeft + width, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, DLG_WINDOW_BASE_TILE_NUM + 13, tilemapLeft + width + 1, tilemapTop + 1, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 5), tilemapLeft - 2, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 6), tilemapLeft - 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 8), tilemapLeft + width, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 9), tilemapLeft + width + 1, tilemapTop + 2, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 10), tilemapLeft - 2, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 11), tilemapLeft - 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 12), tilemapLeft + width, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 13), tilemapLeft + width + 1, tilemapTop + 3, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 0), tilemapLeft - 2, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 1), tilemapLeft - 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 2), tilemapLeft, tilemapTop + 4, width, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 3), tilemapLeft + width, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + FillBgTilemapBufferRect(bg, BG_TILE_V_FLIP(DLG_WINDOW_BASE_TILE_NUM + 4), tilemapLeft + width + 1, tilemapTop + 4, 1, 1, DLG_WINDOW_PALETTE_NUM); + } +} + +static void WindowFunc_ClearStdWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) +{ + FillBgTilemapBufferRect(bg, 0, tilemapLeft - 1, tilemapTop - 1, width + 2, height + 2, STD_WINDOW_PALETTE_NUM); +} + +static void WindowFunc_ClearDialogWindowAndFrame(u8 bg, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 paletteNum) +{ + FillBgTilemapBufferRect(bg, 0, tilemapLeft - 2, tilemapTop - 1, width + 4, height + 2, STD_WINDOW_PALETTE_NUM); +} + +void sub_80F771C(bool8 copyToVram) +{ + FillBgTilemapBufferRect(0, 0, 0, 0, 0x20, 0x20, 0x11); + if (copyToVram == TRUE) + CopyBgTilemapBufferToVram(0); +} + +void SetStdWindowBorderStyle(u8 windowId, bool8 copyToVram) +{ + SetWindowBorderStyle(windowId, copyToVram, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM); +} + +void sub_80F7768(u8 windowId, bool8 copyToVram) +{ + if (gUnknown_203ADFA == 2) + { + gTextFlags.autoScroll = 1; + TextWindow_LoadTilesStdFrame1(0, DLG_WINDOW_BASE_TILE_NUM); + } + else + { + TextWindow_LoadResourcesStdFrame0(windowId, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM * 0x10); + } + DrawDialogFrameWithCustomTileAndPalette(windowId, copyToVram, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM); +} + +void Menu_LoadStdPal(void) +{ + LoadPalette(gTMCaseMainWindowPalette, STD_WINDOW_PALETTE_NUM * 0x10, 0x14); +} + +void Menu_LoadStdPalAt(u16 offset) +{ + LoadPalette(gTMCaseMainWindowPalette, offset, 0x14); +} + +static const u16 *GetTmCaseMainWindowPalette(void) +{ + return gTMCaseMainWindowPalette; +} + +static u16 GetStdPalColor(u8 colorNum) +{ + if (colorNum > 0xF) + colorNum = 0; + return gTMCaseMainWindowPalette[colorNum]; +} + +void DisplayItemMessageOnField(u8 taskId, u8 bgId, const u8 *string, TaskFunc callback) +{ + sub_80F6E9C(); + DisplayMessageAndContinueTask(taskId, 0, DLG_WINDOW_BASE_TILE_NUM, DLG_WINDOW_PALETTE_NUM, bgId, GetTextSpeedSetting(), string, callback); + CopyWindowToVram(0, 3); +} + +void DisplayYesNoMenuDefaultYes(void) +{ + CreateYesNoMenu(&sYesNo_WindowTemplate, 2, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 0); +} + +void DisplayYesNoMenuDefaultNo(void) +{ + CreateYesNoMenu(&sYesNo_WindowTemplate, 2, 0, 2, STD_WINDOW_BASE_TILE_NUM, STD_WINDOW_PALETTE_NUM, 1); +} + +u8 GetTextSpeedSetting(void) +{ + u32 speed; + if (gSaveBlock2Ptr->optionsTextSpeed > OPTIONS_TEXT_SPEED_FAST) + gSaveBlock2Ptr->optionsTextSpeed = OPTIONS_TEXT_SPEED_MID; + return gUnknown_841F428[gSaveBlock2Ptr->optionsTextSpeed]; +} + +u8 sub_80F78E0(u8 height) +{ + if (sStartMenuWindowId == 0xFF) + { + struct WindowTemplate wTemp1, wTemp2; + SetWindowTemplateFields(&wTemp1, 0, 0x16, 1, 7, height * 2 - 1, DLG_WINDOW_PALETTE_NUM, 0x13D); + wTemp2 = wTemp1; + sStartMenuWindowId = AddWindow(&wTemp2); + PutWindowTilemap(sStartMenuWindowId); + } + return sStartMenuWindowId; +} + +u8 GetStartMenuWindowId(void) +{ + return sStartMenuWindowId; +} + +void RemoveStartMenuWindow(void) +{ + if (sStartMenuWindowId != 0xFF) + { + RemoveWindow(sStartMenuWindowId); + sStartMenuWindowId = 0xFF; + } +} + +static u16 GetDlgWindowBaseTileNum(void) +{ + return DLG_WINDOW_BASE_TILE_NUM; +} + +u16 GetStdWindowBaseTileNum(void) +{ + return STD_WINDOW_BASE_TILE_NUM; +} + +void sub_80F7974(const u8 * text) +{ + sub_814FE6C(sub_8112EB4(), DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM); + sub_8113018(text, 2); +} + +void sub_80F7998(void) +{ + sub_8112EDC(2); +} + +void sub_80F79A4(void) +{ + Menu_LoadStdPal(); + sub_814FEEC(0, DLG_WINDOW_BASE_TILE_NUM, 0x10 * DLG_WINDOW_PALETTE_NUM); + TextWindow_SetUserSelectedFrame(0, STD_WINDOW_BASE_TILE_NUM, 0x10 * STD_WINDOW_PALETTE_NUM); +} + +void SetDefaultFontsPointer(void) +{ + SetFontsPointer(&gFontInfos[0]); +} + +u8 GetFontAttribute(u8 fontId, u8 attributeId) +{ + int result = 0; + + switch (attributeId) + { + case FONTATTR_MAX_LETTER_WIDTH: + result = gFontInfos[fontId].maxLetterWidth; + break; + case FONTATTR_MAX_LETTER_HEIGHT: + result = gFontInfos[fontId].maxLetterHeight; + break; + case FONTATTR_LETTER_SPACING: + result = gFontInfos[fontId].letterSpacing; + break; + case FONTATTR_LINE_SPACING: + result = gFontInfos[fontId].lineSpacing; + break; + case FONTATTR_UNKNOWN: + result = gFontInfos[fontId].unk; + break; + case FONTATTR_COLOR_FOREGROUND: + result = gFontInfos[fontId].fgColor; + break; + case FONTATTR_COLOR_BACKGROUND: + result = gFontInfos[fontId].bgColor; + break; + case FONTATTR_COLOR_SHADOW: + result = gFontInfos[fontId].shadowColor; + break; + } + return result; +} + +u8 GetMenuCursorDimensionByFont(u8 fontId, u8 whichDimension) +{ + return gMenuCursorDimensions[fontId][whichDimension]; +} diff --git a/src/oak_speech.c b/src/oak_speech.c index 3bf174778..14e7c87d0 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -495,7 +495,7 @@ static void Task_OaksSpeech1(u8 taskId) ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); - reset_temp_tile_data_buffers(); + ResetTempTileDataBuffers(); HelpSystem_SetSomeVariable2(2); break; case 1: @@ -536,10 +536,10 @@ static void Task_OaksSpeech1(u8 taskId) case 5: sOakSpeechResources->textSpeed = GetTextSpeedSetting(); gTextFlags.canABSpeedUpPrint = TRUE; - decompress_and_copy_tile_data_to_vram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0); break; case 6: - if (free_temp_tile_data_buffers_if_possible()) + if (FreeTempTileDataBuffersIfPossible()) return; ClearDialogWindowAndFrame(0, 1); FillBgTilemapBufferRect_Palette0(1, 0x0000, 0, 0, 32, 32); @@ -718,7 +718,7 @@ static void Task_OakSpeech6(u8 taskId) PlayBGM(BGM_FRLG_GAME_EXPLANATION_MIDDLE); sub_810F71C(); PrintTextOnRightSnappedWindow(gText_ABUTTONNext, 0, 1); - sOakSpeechResources->unk_0008 = malloc_and_decompress(sNewGameAdventureIntroTilemap, &sp14); + sOakSpeechResources->unk_0008 = MallocAndDecompress(sNewGameAdventureIntroTilemap, &sp14); CopyToBgTilemapBufferRect(1, sOakSpeechResources->unk_0008, 0, 2, 30, 19); CopyBgTilemapBufferToVram(1); Free(sOakSpeechResources->unk_0008); @@ -869,7 +869,7 @@ static void Task_OakSpeech9(u8 taskId) data[3]--; else { - sOakSpeechResources->solidColorsGfx = malloc_and_decompress(sOakSpeechGfx_SolidColors, &size); + sOakSpeechResources->solidColorsGfx = MallocAndDecompress(sOakSpeechGfx_SolidColors, &size); LoadBgTiles(1, sOakSpeechResources->solidColorsGfx, size, 0); CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0); CopyBgTilemapBufferToVram(1); @@ -1054,7 +1054,7 @@ static void Task_OakSpeech19(u8 taskId) { gTasks[taskId].data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[1]); PutWindowTilemap(gTasks[taskId].data[13]); - SetWindowBorderStyle(gTasks[taskId].data[13], 1, sub_80F796C(), 14); + SetWindowBorderStyle(gTasks[taskId].data[13], 1, GetStdWindowBaseTileNum(), 14); FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11); sOakSpeechResources->unk_001C[0] = 1; sOakSpeechResources->unk_001C[1] = 2; @@ -1246,7 +1246,7 @@ static void Task_OakSpeech26(u8 taskId) data[3]--; else { - CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], 2, 0, 2, sub_80F796C(), 14, 0); + CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], 2, 0, 2, GetStdWindowBaseTileNum(), 14, 0); gTasks[taskId].func = Task_OakSpeech27; } } @@ -1536,7 +1536,7 @@ static void CB2_ReturnFromNamingScreen(void) ScanlineEffect_Stop(); ResetSpriteData(); FreeAllSpritePalettes(); - reset_temp_tile_data_buffers(); + ResetTempTileDataBuffers(); break; case 1: ResetBgsAndClearDma3BusyFlags(0); @@ -1564,10 +1564,10 @@ static void CB2_ReturnFromNamingScreen(void) LoadPalette(sHelpDocsPalette, 0, 0xe0); break; case 4: - decompress_and_copy_tile_data_to_vram(1, sOakSpeechGfx_SolidColors, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_SolidColors, 0, 0, 0); break; case 5: - if (free_temp_tile_data_buffers_if_possible()) + if (FreeTempTileDataBuffersIfPossible()) return; FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0); @@ -1613,7 +1613,7 @@ static void CreateNidoranFSprite(u8 taskId) u8 spriteId; DecompressPicFromTable(gUnknown_8235194, sub_8044E00(0), SPECIES_NIDORAN_F); - sub_800F078(&gUnknown_82373F4); + LoadCompressedSpritePaletteUsingHeap(&gUnknown_82373F4); SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0); spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1); gSprites[spriteId].callback = SpriteCallbackDummy; @@ -1635,9 +1635,9 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st switch (state) { case 0: - LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[0]); - LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[1]); - LoadCompressedObjectPic(&sOakSpeech_PikaSpriteSheets[2]); + LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[0]); + LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[1]); + LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[2]); LoadSpritePalette(&sOakSpeech_PikaSpritePal); spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[0], 0x10, 0x11, 2); gSprites[spriteId].oam.priority = 0; @@ -1654,7 +1654,7 @@ static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 st gTasks[taskId].data[9] = spriteId; break; case 1: - LoadCompressedObjectPic(&sOakSpeech_GrassPlatformSpriteSheet); + LoadCompressedSpriteSheet(&sOakSpeech_GrassPlatformSpriteSheet); LoadSpritePalette(&sOakSpeech_GrassPlatformSpritePal); for (i = 0; i < 3; i++) { @@ -1850,7 +1850,7 @@ static void PrintNameChoiceOptions(u8 taskId, u8 state) data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[3]); PutWindowTilemap(data[13]); - SetWindowBorderStyle(data[13], 1, sub_80F796C(), 14); + SetWindowBorderStyle(data[13], 1, GetStdWindowBaseTileNum(), 14); FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11); AddTextPrinterParameterized(data[13], 2, gOtherText_NewName, 8, 1, 0, NULL); if (state == 0) diff --git a/src/play_time.c b/src/play_time.c new file mode 100644 index 000000000..04f4b2040 --- /dev/null +++ b/src/play_time.c @@ -0,0 +1,65 @@ +#include "play_time.h" + +static IWRAM_DATA u8 sPlayTimeCounterState; + +enum +{ + STOPPED, + RUNNING, + MAXED_OUT, +}; + +void PlayTimeCounter_Reset(void) +{ + sPlayTimeCounterState = STOPPED; + gSaveBlock2Ptr->playTimeHours = 0; + gSaveBlock2Ptr->playTimeMinutes = 0; + gSaveBlock2Ptr->playTimeSeconds = 0; + gSaveBlock2Ptr->playTimeVBlanks = 0; +} + +void PlayTimeCounter_Start(void) +{ + sPlayTimeCounterState = RUNNING; + if (gSaveBlock2Ptr->playTimeHours > 999) + PlayTimeCounter_SetToMax(); +} + +void PlayTimeCounter_Stop(void) +{ + sPlayTimeCounterState = STOPPED; +} + +void PlayTimeCounter_Update(void) +{ + if (sPlayTimeCounterState == RUNNING) + { + gSaveBlock2Ptr->playTimeVBlanks++; + if (gSaveBlock2Ptr->playTimeVBlanks > 59) + { + gSaveBlock2Ptr->playTimeVBlanks = 0; + gSaveBlock2Ptr->playTimeSeconds++; + if (gSaveBlock2Ptr->playTimeSeconds > 59) + { + gSaveBlock2Ptr->playTimeSeconds = 0; + gSaveBlock2Ptr->playTimeMinutes++; + if (gSaveBlock2Ptr->playTimeMinutes > 59) + { + gSaveBlock2Ptr->playTimeMinutes = 0; + gSaveBlock2Ptr->playTimeHours++; + if (gSaveBlock2Ptr->playTimeHours > 999) + PlayTimeCounter_SetToMax(); + } + } + } + } +} + +void PlayTimeCounter_SetToMax(void) +{ + sPlayTimeCounterState = MAXED_OUT; + gSaveBlock2Ptr->playTimeHours = 999; + gSaveBlock2Ptr->playTimeMinutes = 59; + gSaveBlock2Ptr->playTimeSeconds = 59; + gSaveBlock2Ptr->playTimeVBlanks = 59; +} diff --git a/src/quest_log.c b/src/quest_log.c index 0021ee927..fe83f67e9 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -859,7 +859,7 @@ void sub_8110F14(u8 taskId) } else { - SetMainCallback2(sub_8056938); + SetMainCallback2(CB2_ContinueSavedGame); DestroyTask(taskId); } } @@ -1418,7 +1418,7 @@ void sub_8111D10(void) PutWindowTilemap(gUnknown_203ADFE[2]); sub_8111D90(gUnknown_203ADFE[2]); AddTextPrinterParameterized4(gUnknown_203ADFE[2], 2, 2, gUnknown_8456698[count], 1, 0, &gUnknown_8456634, 0, gStringVar4); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); } void sub_8111D90(u8 a0) @@ -1567,7 +1567,7 @@ void sub_81120AC(u8 taskId) { case 0: gUnknown_2031DD8 = 0; - sub_8055DC4(); + Overworld_PlaySpecialMapMusic(); sub_811229C(); FillWindowPixelRect(gUnknown_203ADFE[0], 0xF, 0, 0, gUnknown_845661C[0].width * 8, gUnknown_845661C[0].height * 8); data[0]++; @@ -1705,7 +1705,7 @@ void sub_811246C(struct Sprite *sprite) { if (gUnknown_203AF9A[0][0] != 0xFF) { - sub_8063CA4(mapObject, gUnknown_203AF9A[0][0]); + FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[0][0]); gUnknown_203AF9A[0][0] = 0xFF; } if (gUnknown_203AF9A[0][1] != 0xFF) @@ -1719,7 +1719,7 @@ void sub_811246C(struct Sprite *sprite) { if (gUnknown_203AF9A[mapObject->localId][0] != 0xFF) { - sub_8063CA4(mapObject, gUnknown_203AF9A[mapObject->localId][0]); + FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[mapObject->localId][0]); gUnknown_203AF9A[mapObject->localId][0] = 0xFF; } sub_8063E28(mapObject, sprite); @@ -1911,7 +1911,7 @@ void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2) gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0; gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0; gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0; - switch (player_get_direction_lower_nybble()) + switch (GetPlayerFacingDirection()) { case 0: case 1: @@ -2297,7 +2297,7 @@ const struct WindowTemplate gUnknown_8456928 = { 0x00, 0, 15, 30, 5, 15, 0x008F }; -void sub_8112EA8(void) +void MapNamePopupWindowIdSetDummy(void) { gUnknown_203B020 = 0xFF; } @@ -2471,12 +2471,12 @@ void sub_8112FE4(const u8 * a0) AddTextPrinterParameterized4(gUnknown_203B020, 0x02, 2, 5, 1, 1, &gUnknown_8456930, -1, a0); } -void sub_8113018(const u8 * a0, u8 a1) +void sub_8113018(const u8 * text, u8 mode) { sub_8112FD0(); - sub_8112FE4(a0); - if (a1) - CopyWindowToVram(gUnknown_203B020, a1); + sub_8112FE4(text); + if (mode) + CopyWindowToVram(gUnknown_203B020, mode); } void sub_8113044(void) diff --git a/src/quest_log_8150454.c b/src/quest_log_8150454.c index 8af516e3a..3d61dee72 100644 --- a/src/quest_log_8150454.c +++ b/src/quest_log_8150454.c @@ -115,7 +115,7 @@ void sub_81505C4(u8 taskId) gTasks[taskId].data[0]++; break; case 2: - StartSpriteAnim(sprite, sub_8063500(player_get_direction_lower_nybble())); + StartSpriteAnim(sprite, sub_8063500(GetPlayerFacingDirection())); gTasks[taskId].data[0]++; break; case 3: @@ -173,7 +173,7 @@ void sub_8150794(u8 taskId) void sub_81507BC(struct MapObject * a0, u8 a1) { - sub_805F060(a0, a1); + EventObjectSetGraphicsId(a0, a1); } void sub_81507CC(void) diff --git a/src/reset_save_heap.c b/src/reset_save_heap.c new file mode 100644 index 000000000..428f7b88d --- /dev/null +++ b/src/reset_save_heap.c @@ -0,0 +1,29 @@ +#include "global.h" +#include "main.h" +#include "gpu_regs.h" +#include "m4a.h" +#include "load_save.h" +#include "save.h" +#include "new_game.h" +#include "overworld.h" +#include "malloc.h" + +void sub_8079B7C(void) +{ + u16 imeBackup = REG_IME; + + REG_IME = 0; + RegisterRamReset(RESET_EWRAM); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_FORCED_BLANK); + REG_IME = imeBackup; + gMain.inBattle = FALSE; + SetSaveBlocksPointers(); + ResetMenuAndMonGlobals(); + Save_ResetSaveCounters(); + Save_LoadGameData(0); + if (gSaveFileStatus == 0 || gSaveFileStatus == 2) + Sav2_ClearSetDefault(); + SetPokemonCryStereo(gSaveBlock2Ptr->optionsSound); + InitHeap(gHeap, HEAP_SIZE); + SetMainCallback2(CB2_ContinueSavedGame); +} diff --git a/src/save_location.c b/src/save_location.c new file mode 100644 index 000000000..9b679c7ee --- /dev/null +++ b/src/save_location.c @@ -0,0 +1,108 @@ +#include "global.h" +#include "save_location.h" +#include "constants/maps.h" + +static bool32 IsCurMapInLocationList(const u16 *list) +{ + s32 i; + u16 locSum = (gSaveBlock1Ptr->location.mapGroup << 8) + (gSaveBlock1Ptr->location.mapNum); + + for (i = 0; list[i] != 0xFFFF; i++) + { + if (list[i] == locSum) + return TRUE; + } + return FALSE; +} + +static const u16 sSaveLocationPokeCenterList[] = +{ + MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F, MAP_VIRIDIAN_CITY_POKEMON_CENTER_2F, + MAP_PEWTER_CITY_POKEMON_CENTER_1F, MAP_PEWTER_CITY_POKEMON_CENTER_2F, + MAP_CERULEAN_CITY_POKEMON_CENTER_1F, MAP_CERULEAN_CITY_POKEMON_CENTER_2F, + MAP_LAVENDER_TOWN_POKEMON_CENTER_1F, MAP_LAVENDER_TOWN_POKEMON_CENTER_2F, + MAP_VERMILION_CITY_POKEMON_CENTER_1F, MAP_VERMILION_CITY_POKEMON_CENTER_2F, + MAP_CELADON_CITY_POKEMON_CENTER_1F, MAP_CELADON_CITY_POKEMON_CENTER_2F, + MAP_FUCHSIA_CITY_POKEMON_CENTER_1F, MAP_FUCHSIA_CITY_POKEMON_CENTER_2F, + MAP_CINNABAR_ISLAND_POKEMON_CENTER_1F, MAP_CINNABAR_ISLAND_POKEMON_CENTER_2F, + MAP_INDIGO_PLATEAU_POKEMON_CENTER_1F, MAP_INDIGO_PLATEAU_POKEMON_CENTER_2F, + MAP_SAFFRON_CITY_POKEMON_CENTER_1F, MAP_SAFFRON_CITY_POKEMON_CENTER_2F, + MAP_ROUTE4_POKEMON_CENTER_1F, MAP_ROUTE4_POKEMON_CENTER_2F, + MAP_ROUTE10_POKEMON_CENTER_1F, MAP_ROUTE10_POKEMON_CENTER_2F, + MAP_ONE_ISLAND_POKEMON_CENTER_1F, MAP_ONE_ISLAND_POKEMON_CENTER_2F, + MAP_TWO_ISLAND_POKEMON_CENTER_1F, MAP_TWO_ISLAND_POKEMON_CENTER_2F, + MAP_THREE_ISLAND_POKEMON_CENTER_1F, MAP_THREE_ISLAND_POKEMON_CENTER_2F, + MAP_FOUR_ISLAND_POKEMON_CENTER_1F, MAP_FOUR_ISLAND_POKEMON_CENTER_2F, + MAP_FIVE_ISLAND_POKEMON_CENTER_1F, MAP_FIVE_ISLAND_POKEMON_CENTER_2F, + MAP_SEVEN_ISLAND_POKEMON_CENTER_1F, MAP_SEVEN_ISLAND_POKEMON_CENTER_2F, + MAP_SIX_ISLAND_POKEMON_CENTER_1F, MAP_SIX_ISLAND_POKEMON_CENTER_2F, + MAP_UNKNOWN_MAP_00_00, MAP_UNKNOWN_MAP_00_01, + MAP_UNKNOWN_MAP_00_03, MAP_UNKNOWN_MAP_00_04, + 0xFFFF, +}; + +bool32 IsCurMapPokeCenter(void) +{ + return IsCurMapInLocationList(sSaveLocationPokeCenterList); +} + +static const u16 sSaveLocationReloadLocList[] = { 0xFFFF }; + +static bool32 IsCurMapReloadLocation(void) +{ + return IsCurMapInLocationList(sSaveLocationReloadLocList); +} + +static const u16 sUnknown_8453094[] = { 0xFFFF }; + +static bool32 sub_810B75C(void) +{ + return IsCurMapInLocationList(sUnknown_8453094); +} + +static void TrySetPokeCenterWarpStatus(void) +{ + if (IsCurMapPokeCenter() == FALSE) + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(POKECENTER_SAVEWARP); + else + gSaveBlock2Ptr->specialSaveWarpFlags |= POKECENTER_SAVEWARP; +} + +static void TrySetReloadWarpStatus(void) +{ + if (!IsCurMapReloadLocation()) + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(LOBBY_SAVEWARP); + else + gSaveBlock2Ptr->specialSaveWarpFlags |= LOBBY_SAVEWARP; +} + +static void sub_810B7CC(void) +{ + if (!sub_810B75C()) + gSaveBlock2Ptr->specialSaveWarpFlags &= ~(UNK_SPECIAL_SAVE_WARP_FLAG_3); + else + gSaveBlock2Ptr->specialSaveWarpFlags |= UNK_SPECIAL_SAVE_WARP_FLAG_3; +} + +void TrySetMapSaveWarpStatus(void) +{ + TrySetPokeCenterWarpStatus(); + TrySetReloadWarpStatus(); + sub_810B7CC(); +} + +void sub_810B810(void) +{ + gSaveBlock2Ptr->field_A8 |= 0x1; + gSaveBlock2Ptr->field_A8 |= 0x10; + gSaveBlock2Ptr->field_A8 |= 0x20; +} + +void sub_810B82C(void) +{ + gSaveBlock2Ptr->specialSaveWarpFlags |= 0x80; + gSaveBlock2Ptr->field_A8 |= 0x2; + gSaveBlock2Ptr->field_A8 |= 0x4; + gSaveBlock2Ptr->field_A8 |= 0x8; + gSaveBlock2Ptr->field_A8 |= 0x8000; +} diff --git a/src/scrcmd.c b/src/scrcmd.c index 12b2892bb..d317a78b5 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -807,7 +807,7 @@ bool8 ScrCmd_warpteleport2(struct ScriptContext *ctx) u16 y = VarGet(ScriptReadHalfword(ctx)); Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y); - sub_805DAE4(player_get_direction_lower_nybble()); + sub_805DAE4(GetPlayerFacingDirection()); sub_807E500(); ResetInitialPlayerAvatarState(); return TRUE; @@ -1154,7 +1154,7 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx) if (gMapObjects[gSelectedEventObject].active) { FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedEventObject], - player_get_direction_lower_nybble()); + GetPlayerFacingDirection()); } return FALSE; } @@ -1241,7 +1241,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) HideFieldMessageBox(); playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]); + FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]); sub_80974D8(); UnfreezeMapObjects(); return FALSE; @@ -1253,9 +1253,9 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) HideFieldMessageBox(); if (gMapObjects[gSelectedEventObject].active) - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]); + FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]); playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0); - FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]); + FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]); sub_80974D8(); UnfreezeMapObjects(); return FALSE; diff --git a/src/script.c b/src/script.c index 608dc6ba0..06418b8d0 100644 --- a/src/script.c +++ b/src/script.c @@ -279,7 +279,7 @@ void sub_8069A2C(void) gUnknown_3000FA1 = 0; } -bool8 sub_8069A38(void) +bool8 IsMsgSignPost(void) { if(gUnknown_3000FA1 == TRUE) return TRUE; diff --git a/src/sprite.c b/src/sprite.c index 60bcd1da4..c1fc89777 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -250,12 +250,26 @@ static const AffineAnimCmdFunc sAffineAnimCmdFuncs[] = AffineAnimCmd_frame, }; -static const s32 gUnknown_082EC6F4[24] = +static const s32 sUnknown_082EC6F4[3][4][2] = { - 8, 8, 0x10, 0x10, 0x20, 0x20, - 0x40, 0x40, 0x10, 8, 0x20, 8, - 0x20, 0x10, 0x40, 0x20, 8, 0x10, - 8, 0x20, 0x10, 0x20, 0x20, 0x40, + { + {8, 8}, + {0x10, 0x10}, + {0x20, 0x20}, + {0x40, 0x40}, + }, + { + {0x10, 8}, + {0x20, 8}, + {0x20, 0x10}, + {0x40, 0x20}, + }, + { + {8, 0x10}, + {8, 0x20}, + {0x10, 0x20}, + {0x20, 0x40}, + }, }; static const struct OamDimensions sOamDimensions[3][4] = @@ -1227,106 +1241,26 @@ s32 sub_800800C(s32 a0, s32 a1, s32 a2) return a2 - ((u32)(a2 * a1) / (u32)(a0) + var1); } -#ifdef NONMATCHING -void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2) +void obj_update_pos2(struct Sprite *sprite, s32 a1, s32 a2) { s32 var0, var1, var2; - u8 matrixNum = sprite->oam.matrixNum; + + u32 matrixNum = sprite->oam.matrixNum; if (a1 != 0x800) { - var0 = gUnknown_082EC6F4[sprite->oam.size * 8 + sprite->oam.shape * 32]; + var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][0]; var1 = var0 << 8; var2 = (var0 << 16) / gOamMatrices[matrixNum].a; sprite->pos2.x = sub_800800C(var1, var2, a1); } if (a2 != 0x800) { - var0 = gUnknown_082EC6F4[4 + (sprite->oam.size * 8 + sprite->oam.shape * 32)]; + var0 = sUnknown_082EC6F4[sprite->oam.shape][sprite->oam.size][1]; var1 = var0 << 8; var2 = (var0 << 16) / gOamMatrices[matrixNum].d; sprite->pos2.y = sub_800800C(var1, var2, a2); } } -#else -__attribute__((naked)) -void obj_update_pos2(struct Sprite* sprite, s32 a1, s32 a2) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - adds r5, r0, 0\n\ - adds r6, r1, 0\n\ - mov r8, r2\n\ - ldrb r1, [r5, 0x3]\n\ - lsls r0, r1, 26\n\ - lsrs r7, r0, 27\n\ - movs r0, 0x80\n\ - lsls r0, 4\n\ - mov r9, r0\n\ - cmp r6, r9\n\ - beq _08007EA2\n\ - ldr r2, =gUnknown_082EC6F4\n\ - lsrs r1, 6\n\ - lsls r1, 3\n\ - ldrb r0, [r5, 0x1]\n\ - lsrs r0, 6\n\ - lsls r0, 5\n\ - adds r1, r0\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - lsls r4, r0, 8\n\ - lsls r0, 16\n\ - ldr r2, =gOamMatrices\n\ - lsls r1, r7, 3\n\ - adds r1, r2\n\ - movs r2, 0\n\ - ldrsh r1, [r1, r2]\n\ - bl __divsi3\n\ - adds r1, r0, 0\n\ - adds r0, r4, 0\n\ - adds r2, r6, 0\n\ - bl sub_800800C\n\ - strh r0, [r5, 0x24]\n\ -_08007EA2:\n\ - cmp r8, r9\n\ - beq _08007EDA\n\ - ldr r2, =gUnknown_082EC6F4\n\ - ldrb r1, [r5, 0x3]\n\ - lsrs r1, 6\n\ - lsls r1, 3\n\ - ldrb r0, [r5, 0x1]\n\ - lsrs r0, 6\n\ - lsls r0, 5\n\ - adds r1, r0\n\ - adds r2, 0x4\n\ - adds r1, r2\n\ - ldr r0, [r1]\n\ - lsls r4, r0, 8\n\ - lsls r0, 16\n\ - ldr r2, =gOamMatrices\n\ - lsls r1, r7, 3\n\ - adds r1, r2\n\ - movs r2, 0x6\n\ - ldrsh r1, [r1, r2]\n\ - bl __divsi3\n\ - adds r1, r0, 0\n\ - adds r0, r4, 0\n\ - mov r2, r8\n\ - bl sub_800800C\n\ - strh r0, [r5, 0x26]\n\ -_08007EDA:\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .pool\n\ - .syntax divided"); -} -#endif // NONMATCHING void SetSpriteOamFlipBits(struct Sprite *sprite, u8 hFlip, u8 vFlip) { diff --git a/src/teachy_tv.c b/src/teachy_tv.c index eb5a7293d..1e3f42027 100644 --- a/src/teachy_tv.c +++ b/src/teachy_tv.c @@ -422,7 +422,7 @@ static void TeachyTvCallback(void) RunTasks(); AnimateSprites(); BuildOamBuffer(); - do_scheduled_bg_tilemap_copies_to_vram(); + DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } @@ -476,7 +476,7 @@ static void TeachyTvMainCallback(void) sResources->grassAnimDisabled = 0; sResources->scrollIndicatorArrowPairId = 0xFF; SetVBlankHBlankCallbacksToNull(); - clear_scheduled_bg_copies_to_vram(); + ClearScheduledBgCopiesToVram(); ScanlineEffect_Stop(); FreeAllSpritePalettes(); ResetPaletteFade(); @@ -487,7 +487,7 @@ static void TeachyTvMainCallback(void) ++gMain.state; break; case 1: - if (free_temp_tile_data_buffers_if_possible() == TRUE) + if (FreeTempTileDataBuffersIfPossible() == TRUE) return; TeachyTvCreateAndRenderRbox(); TeachyTvInitIo(); @@ -506,10 +506,10 @@ static void TeachyTvMainCallback(void) PlayNewMapMusic(BGM_FRLG_TEACHY_TV); TeachyTvSetWindowRegs(); } - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); - schedule_bg_copy_tilemap_to_vram(2); - schedule_bg_copy_tilemap_to_vram(3); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); + ScheduleBgCopyTilemapToVram(2); + ScheduleBgCopyTilemapToVram(3); sub_812B1E0(9); // help system something BlendPalettes(0xFFFFFFFF, 0x10, 0); BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); @@ -542,8 +542,8 @@ static void TeachyTvSetupBg(void) static void TeachyTvLoadGraphic(void) { u16 src = RGB_BLACK; - reset_temp_tile_data_buffers(); - decompress_and_copy_tile_data_to_vram(1, gUnknown_8E86240, 0, 0, 0); + ResetTempTileDataBuffers(); + DecompressAndCopyTileDataToVram(1, gUnknown_8E86240, 0, 0, 0); LZDecompressWram(gUnknown_8E86BE8, sResources->buffer1); LZDecompressWram(gUnknown_8E86D6C, sResources->buffer4); LoadCompressedPalette(gUnknown_8E86F98, 0, 0x80); @@ -656,7 +656,7 @@ static void TeachyTvBg2AnimController(void) tilemapBuffer[32 * i + j] = ((Random() & 3) << 10) + 0x301F; } } - schedule_bg_copy_tilemap_to_vram(2); + ScheduleBgCopyTilemapToVram(2); } static void TeachyTvSetupPostBattleWindowAndObj(u8 taskId) @@ -718,7 +718,7 @@ static void TeachyTvQuitFadeControlAndTaskDel(u8 taskId) } else { - sub_8055DC4(); + Overworld_PlaySpecialMapMusic(); SetMainCallback2(sStaticResources.callback); } TeachyTvFree(); @@ -757,7 +757,7 @@ static void TeachyTvOptionListController(u8 taskId) DestroyListMenu(data[0], &sStaticResources.scrollOffset, &sStaticResources.selectedRow); TeachyTvClearWindowRegs(); ClearWindowTilemap(1); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); TeachyTvRemoveScrollIndicatorArrowPair(); data[3] = 0; data[2] = 0; @@ -776,7 +776,7 @@ static void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId) { CopyToBgTilemapBufferRect_ChangePalette(2, sResources->buffer4, 0, 0, 0x20, 0x20, 0x11); TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 8, 0x38, 7); - schedule_bg_copy_tilemap_to_vram(2); + ScheduleBgCopyTilemapToVram(2); data[2] = 0; ++data[3]; PlayNewMapMusic(BGM_FRLG_FOLLOW_ME); @@ -789,7 +789,7 @@ static void TTVcmd_ClearBg2TeachyTvGraphic(u8 taskId) if (++data[2] == 134) { FillBgTilemapBufferRect_Palette0(2, 0, 2, 1, 0x1A, 0xC); - schedule_bg_copy_tilemap_to_vram(2); + ScheduleBgCopyTilemapToVram(2); data[2] = 0; ++data[3]; } @@ -1040,7 +1040,7 @@ static void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId) if (!data[2]) { CopyToBgTilemapBufferRect_ChangePalette(1, sBg1EndGraphic, 20, 10, 8, 2, 0x11); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(1); } if (++data[2] > 126) { @@ -1053,7 +1053,7 @@ static void TTVcmd_RenderAndRemoveBg1EndGraphic(u8 taskId) static void TeachyTvClearBg1EndGraphicText(void) { FillBgTilemapBufferRect_Palette0(1, 0, 20, 10, 8, 2); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(1); } static void TTVcmd_End(u8 taskId) @@ -1071,7 +1071,7 @@ static void TTVcmd_End(u8 taskId) PutWindowTilemap(0); TeachyTvSetupScrollIndicatorArrowPair(); TeachyTvSetWindowRegs(); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); ChangeBgX(3, 0x0, 0); ChangeBgY(3, 0x0, 0); ChangeBgX(3, 0x1000, 2); diff --git a/src/text.c b/src/text.c index f84420352..c0fe6a444 100644 --- a/src/text.c +++ b/src/text.c @@ -16,7 +16,6 @@ extern void FillWindowPixelRect(u8 windowId, u8 fillValue, u16 x, u16 y, u16 wid extern void BlitBitmapRectToWindow(u8 windowId, const u8 *pixels, u16 srcX, u16 srcY, u16 srcWidth, int srcHeight, u16 destX, u16 destY, u16 rectWidth, u16 rectHeight); extern u8 GetKeypadIconWidth(u8 keypadIconId); extern void CopyWindowToVram(u8 windowId, u8 mode); -extern u16 Font6Func(struct TextPrinter *textPrinter); extern s32 GetGlyphWidthFont6(u16 glyphId, bool32 isJapanese); extern void PlaySE(u16 songNum); extern u8* UnkTextUtil_GetPtrI(u8 a1); diff --git a/src/text_window.c b/src/text_window.c index 0c562b195..98f82e818 100644 --- a/src/text_window.c +++ b/src/text_window.c @@ -57,7 +57,7 @@ void sub_814FE6C(u8 windowId, u16 destOffset, u8 palIdx) LoadPalette(stdpal_get(2), palIdx, 32); } -void TextWindow_SetBubbleFrame_841F1C8(u8 windowId, u16 destOffset, u8 palIdx) +void TextWindow_LoadResourcesStdFrame0(u8 windowId, u16 destOffset, u8 palIdx) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gUnknown_841F1C8, 0x280, destOffset); LoadPalette(stdpal_get(0), palIdx, 32); @@ -80,7 +80,7 @@ void sub_814FF6C(u8 windowId, u16 destOffset) LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame0, 0x120, destOffset); } -void sub_814FF98(u8 windowId, u16 destOffset) +void TextWindow_LoadTilesStdFrame1(u8 windowId, u16 destOffset) { LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), gStdFrame1, 0x280, destOffset); } diff --git a/src/tm_case.c b/src/tm_case.c index 7c26c1c58..54c50cc71 100644 --- a/src/tm_case.c +++ b/src/tm_case.c @@ -290,7 +290,7 @@ static void CB2_Idle(void) RunTasks(); AnimateSprites(); BuildOamBuffer(); - do_scheduled_bg_tilemap_copies_to_vram(); + DoScheduledBgTilemapCopiesToVram(); UpdatePaletteFade(); } @@ -322,7 +322,7 @@ static bool8 DoSetUpTMCaseUI(void) { case 0: SetVBlankHBlankCallbacksToNull(); - clear_scheduled_bg_copies_to_vram(); + ClearScheduledBgCopiesToVram(); gMain.state++; break; case 1: @@ -432,8 +432,8 @@ static void LoadBGTemplates(void) ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBGTemplates, NELEMS(sBGTemplates)); SetBgTilemapBuffer(2, *ptr); - schedule_bg_copy_tilemap_to_vram(1); - schedule_bg_copy_tilemap_to_vram(2); + ScheduleBgCopyTilemapToVram(1); + ScheduleBgCopyTilemapToVram(2); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); ShowBg(0); @@ -446,12 +446,12 @@ static bool8 HandleLoadTMCaseGraphicsAndPalettes(void) switch (sTMCaseDynamicResources->seqId) { case 0: - reset_temp_tile_data_buffers(); - decompress_and_copy_tile_data_to_vram(1, gUnknown_8E845D8, 0, 0, 0); + ResetTempTileDataBuffers(); + DecompressAndCopyTileDataToVram(1, gUnknown_8E845D8, 0, 0, 0); sTMCaseDynamicResources->seqId++; break; case 1: - if (free_temp_tile_data_buffers_if_possible() != TRUE) + if (FreeTempTileDataBuffersIfPossible() != TRUE) { LZDecompressWram(gUnknown_8E84A24, sTilemapBuffer); sTMCaseDynamicResources->seqId++; @@ -469,7 +469,7 @@ static bool8 HandleLoadTMCaseGraphicsAndPalettes(void) sTMCaseDynamicResources->seqId++; break; case 4: - LoadCompressedObjectPic(&sTMSpriteSheet); + LoadCompressedSpriteSheet(&sTMSpriteSheet); sTMCaseDynamicResources->seqId++; break; default: @@ -596,7 +596,7 @@ static void TMCase_MoveCursor_UpdatePrintedDescription(s32 itemIndex) static void FillBG2RowWithPalette_2timesNplus1(s32 a0) { SetBgRectPal(2, 0, 12, 30, 8, 2 * a0 + 1); - schedule_bg_copy_tilemap_to_vram(2); + ScheduleBgCopyTilemapToVram(2); } static void PrintListMenuCursorByID_WithColorIdx(u8 a0, u8 a1) @@ -806,8 +806,8 @@ static void Task_SelectTMAction_FromFieldBag(u8 taskId) PlaceHMTileInWindow(2, 0, 2); CopyWindowToVram(2, 2); } - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); gTasks[taskId].func = Task_TMContextMenu_HandleInput; } @@ -840,8 +840,8 @@ static void TMHMContextMenuAction_Use(u8 taskId) ClearMenuWindow(2, 0); ClearWindowTilemap(2); PutWindowTilemap(0); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); if (CalculatePlayerPartyCount() == 0) { PrintError_ThereIsNoPokemon(taskId); @@ -864,8 +864,8 @@ static void TMHMContextMenuAction_Give(u8 taskId) PutWindowTilemap(1); PutWindowTilemap(4); PutWindowTilemap(5); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); if (!itemid_is_unique(itemId)) { if (CalculatePlayerPartyCount() == 0) @@ -917,8 +917,8 @@ static void Subtask_CloseContextMenuAndReturnToMain(u8 taskId) PutWindowTilemap(1); PutWindowTilemap(4); PutWindowTilemap(5); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); Subtask_ReturnToTMCaseMain(taskId); } @@ -934,8 +934,8 @@ static void TMHMContextMenuAction_Exit(u8 taskId) PutWindowTilemap(1); PutWindowTilemap(4); PutWindowTilemap(5); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); Subtask_ReturnToTMCaseMain(taskId); } @@ -1023,8 +1023,8 @@ static void Task_SaleOfTMsCancelled(u8 taskId) PutWindowTilemap(3); PutWindowTilemap(4); PutWindowTilemap(5); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); PrintListMenuCursorByID_WithColorIdx(data[0], 1); Subtask_ReturnToTMCaseMain(taskId); } @@ -1040,8 +1040,8 @@ static void Task_InitQuantitySelectUI(u8 taskId) SellTM_PrintQuantityAndSalePrice(1, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8]); HandlePrintMoneyOnHand(); CreateTMCaseScrollIndicatorArrowPair_SellQuantitySelect(); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); gTasks[taskId].func = Task_QuantitySelect_HandleInput; } @@ -1066,8 +1066,8 @@ static void Task_QuantitySelect_HandleInput(u8 taskId) { PlaySE(SE_SELECT); ClearMenuWindow(7, 0); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); RemoveTMCaseScrollIndicatorArrowPair(); Task_AskConfirmSaleWithAmount(taskId); } @@ -1080,8 +1080,8 @@ static void Task_QuantitySelect_HandleInput(u8 taskId) PutWindowTilemap(3); PutWindowTilemap(0); PutWindowTilemap(1); - schedule_bg_copy_tilemap_to_vram(0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(1); RemoveTMCaseScrollIndicatorArrowPair(); PrintListMenuCursorByID_WithColorIdx(data[0], 1); Subtask_ReturnToTMCaseMain(taskId); @@ -1093,7 +1093,7 @@ static void Task_PrintSaleConfirmedText(u8 taskId) s16 * data = gTasks[taskId].data; PutWindowTilemap(0); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); CopyItemName(gSpecialVar_ItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_TM_CASE, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen); @@ -1250,7 +1250,7 @@ static void Task_TMCaseDude_Playback(u8 taskId) FillBG2RowWithPalette_2timesNplus1(0); BeginNormalPaletteFade(0x00000400, 0, 6, 0, 0); ClearMenuWindow_BorderThickness2(6, 0); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(1); data[8]++; } break; @@ -1298,7 +1298,7 @@ static void InitWindowTemplatesAndPals(void) InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); TextWindow_SetUserSelectedFrame(0, 0x5B, 0xE0); - TextWindow_SetBubbleFrame_841F1C8(0, 0x64, 0xB0); + TextWindow_LoadResourcesStdFrame0(0, 0x64, 0xB0); TextWindow_SetStdFrame0_WithPal(0, 0x78, 0xD0); LoadPalette(gTMCaseMainWindowPalette, 0xF0, 0x20); LoadPalette(gTMCaseMainWindowPalette, 0xA0, 0x20); @@ -1312,7 +1312,7 @@ static void InitWindowTemplatesAndPals(void) PutWindowTilemap(3); PutWindowTilemap(4); PutWindowTilemap(5); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); } static void AddTextPrinterParameterized_ColorByIndex(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx) @@ -1333,7 +1333,7 @@ static void TMCase_SetWindowBorder2(u8 windowId) static void TMCase_PrintMessageWithFollowupTask(u8 taskId, u8 windowId, const u8 * str, TaskFunc func) { DisplayMessageAndContinueTask(taskId, 6, 0x64, 0x0B, windowId, GetTextSpeedSetting(), str, func); - schedule_bg_copy_tilemap_to_vram(1); + ScheduleBgCopyTilemapToVram(1); } static void PrintStringTMCaseOnWindow3(void) @@ -1413,7 +1413,7 @@ static u8 AddTMContextMenu(u8 * a0, u8 a1) { *a0 = AddWindow(&sTMContextWindowTemplates[a1]); TMCase_SetWindowBorder1(*a0); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); } return *a0; } @@ -1423,7 +1423,7 @@ static void RemoveTMContextMenu(u8 * a0) ClearMenuWindow(*a0, FALSE); ClearWindowTilemap(*a0); RemoveWindow(*a0); - schedule_bg_copy_tilemap_to_vram(0); + ScheduleBgCopyTilemapToVram(0); *a0 = 0xFF; } diff --git a/src/trainer_pokemon_sprites.c b/src/trainer_pokemon_sprites.c index ecd889d80..25a8d4515 100644 --- a/src/trainer_pokemon_sprites.c +++ b/src/trainer_pokemon_sprites.c @@ -109,7 +109,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett else { sCreatingSpriteTemplate.paletteTag = paletteTag; - LoadCompressedObjectPalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality)); + LoadCompressedSpritePalette(GetMonSpritePalStructFromOtIdPersonality(species, otId, personality)); } } else @@ -122,7 +122,7 @@ void LoadPicPaletteByTagOrSlot(u16 species, u32 otId, u32 personality, u8 palett else { sCreatingSpriteTemplate.paletteTag = paletteTag; - LoadCompressedObjectPalette(&gTrainerFrontPicPaletteTable[species]); + LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[species]); } } } diff --git a/src/unk_8159F40.c b/src/unk_8159F40.c index a6f6e67fc..b0147d06a 100644 --- a/src/unk_8159F40.c +++ b/src/unk_8159F40.c @@ -612,7 +612,7 @@ void sub_815A540(void) s16 x, y; PlayerGetDestCoords(&x, &y); - if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(0x08)) + if (!MetatileBehavior_IsSurfable(MapGridGetMetatileBehaviorAt(x, y)) && TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING)) { struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; SetPlayerAvatarTransitionFlags(0x01); diff --git a/src/unk_815C980.c b/src/unk_815C980.c index b90d2fb03..09b92c834 100644 --- a/src/unk_815C980.c +++ b/src/unk_815C980.c @@ -128,7 +128,7 @@ bool32 sub_815CA40(u32 id, s32 arg1, const struct UnkStruct3 *arg2) compObjectPic = *(struct CompressedSpriteSheet*)(arg2->spriteSheet); compObjectPic.size = GetDecompressedDataSize(arg2->spriteSheet->data); - gUnknown_203F454->array[id].tileStart = LoadCompressedObjectPic(&compObjectPic); + gUnknown_203F454->array[id].tileStart = LoadCompressedSpriteSheet(&compObjectPic); } if (gUnknown_203F454->array[id].tileStart == 0xFFFF) diff --git a/src/unk_815F138.c b/src/unk_815F138.c index 8941f1559..96005a07b 100644 --- a/src/unk_815F138.c +++ b/src/unk_815F138.c @@ -209,7 +209,7 @@ void sub_815F564(u16 tilesTag, u16 palTag) struct SpritePalette spritePalette = {gUnknown_847A328}; spriteSheet.tag = tilesTag; spritePalette.tag = palTag; - LoadCompressedObjectPic(&spriteSheet); + LoadCompressedSpriteSheet(&spriteSheet); LoadSpritePalette(&spritePalette); } diff --git a/src/window.c b/src/window.c index 4c302885c..5ccd05f35 100644 --- a/src/window.c +++ b/src/window.c @@ -378,696 +378,74 @@ void FillWindowPixelBuffer(u8 windowId, u8 fillValue) CpuFastFill8(fillValue, gWindows[windowId].tileData, 0x20 * fillSize); } -// functionally equivalent, its fucking hard to match -#ifdef NONMATCHING +#define MOVE_TILES_DOWN(a) \ +{ \ + destOffset = i + (a); \ + srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \ + if (srcOffset < size) \ + *(u32*)(tileData + destOffset) = *(u32*)(tileData + srcOffset); \ + else \ + *(u32*)(tileData + destOffset) = fillValue32; \ + distanceLoop++; \ +} + +#define MOVE_TILES_UP(a) \ +{ \ + destOffset = i + (a); \ + srcOffset = i + (((width * (distanceLoop & ~7)) | (distanceLoop & 7)) * 4); \ + if (srcOffset < size) \ + *(u32*)(tileData - destOffset) = *(u32*)(tileData - srcOffset); \ + else \ + *(u32*)(tileData - destOffset) = fillValue32; \ + distanceLoop++; \ +} + void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue) { - s32 i, id1, id2, size; - u32 distanceLoop, toFill, width; - u8 *tileData; - struct WindowTemplate window; - - tileData = gWindows[windowId].tileData; - toFill = (fillValue << 0x18) | (fillValue << 0x10) | (fillValue << 8) | fillValue; - window = gWindows[windowId].window; - size = 0x20 * (window.height * window.width); - width = window.width; - if (direction != 1) + struct WindowTemplate window = gWindows[windowId].window; + u8 *tileData = gWindows[windowId].tileData; + u32 fillValue32 = (fillValue << 24) | (fillValue << 16) | (fillValue << 8) | fillValue; + s32 size = window.height * window.width * 32; + u32 width = window.width; + s32 i; + s32 srcOffset, destOffset; + u32 distanceLoop; + + switch (direction) { - s32 signedDirection = direction; - if (signedDirection <= 1) + case 0: + for (i = 0; i < size; i += 32) { - if (signedDirection == 0) - { - for (i = 0; i < size; i += 0x20) - { - distanceLoop = distance; - id1 = i + 0; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - - distanceLoop++; - id1 = i + 4; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - - distanceLoop++; - id1 = i + 8; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - - distanceLoop++; - id1 = i + 12; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - - distanceLoop++; - id1 = i + 16; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - - distanceLoop++; - id1 = i + 20; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - - distanceLoop++; - id1 = i + 24; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - - distanceLoop++; - id1 = i + 28; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData + id1) = *(u32*)(tileData + id2); - else - *(u32*)(tileData + id1) = toFill; - } - } + distanceLoop = distance; + MOVE_TILES_DOWN(0) + MOVE_TILES_DOWN(4) + MOVE_TILES_DOWN(8) + MOVE_TILES_DOWN(12) + MOVE_TILES_DOWN(16) + MOVE_TILES_DOWN(20) + MOVE_TILES_DOWN(24) + MOVE_TILES_DOWN(28) } - } - else - { + break; + case 1: tileData += size - 4; - for (i = 0; i < size; i += 0x20) + for (i = 0; i < size; i += 32) { distanceLoop = distance; - id1 = i + 0; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; - - distanceLoop++; - id1 = i + 4; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; - - distanceLoop++; - id1 = i + 8; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; - - distanceLoop++; - id1 = i + 12; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; - - distanceLoop++; - id1 = i + 16; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; - - distanceLoop++; - id1 = i + 20; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; - - distanceLoop++; - id1 = i + 24; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; - - distanceLoop++; - id1 = i + 28; - id2 = i + (((width * ((distanceLoop) & ~(7))) | ((distanceLoop) & 7)) * 4); - if (id2 < size) - *(u32*)(tileData - id1) = *(u32*)(tileData - id2); - else - *(u32*)(tileData - id1) = toFill; + MOVE_TILES_UP(0) + MOVE_TILES_UP(4) + MOVE_TILES_UP(8) + MOVE_TILES_UP(12) + MOVE_TILES_UP(16) + MOVE_TILES_UP(20) + MOVE_TILES_UP(24) + MOVE_TILES_UP(28) } + break; + case 2: + break; } } -#else -__attribute__((naked)) -void ScrollWindow(u8 windowId, u8 direction, u8 distance, u8 fillValue) -{ - 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, 0x8\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - mov r8, r1\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - str r2, [sp]\n\ - lsls r3, 24\n\ - lsrs r3, 24\n\ - ldr r2, =gWindows\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r4, r1, r2\n\ - adds r2, 0x8\n\ - adds r1, r2\n\ - ldr r5, [r1]\n\ - lsls r7, r3, 24\n\ - lsls r0, r3, 16\n\ - orrs r7, r0\n\ - lsls r0, r3, 8\n\ - orrs r7, r0\n\ - orrs r7, r3\n\ - ldr r1, [r4]\n\ - ldr r2, [r4, 0x4]\n\ - ldrb r3, [r4, 0x4]\n\ - lsrs r0, r1, 24\n\ - muls r0, r3\n\ - lsls r6, r0, 5\n\ - lsrs r1, 24\n\ - mov r12, r1\n\ - mov r0, r8\n\ - cmp r0, 0x1\n\ - bne _08003CE8\n\ - b _08003E9E\n\ -_08003CE8:\n\ - cmp r0, 0x1\n\ - ble _08003CEE\n\ - b _08004046\n\ -_08003CEE:\n\ - cmp r0, 0\n\ - beq _08003CF4\n\ - b _08004046\n\ -_08003CF4:\n\ - movs r4, 0\n\ - cmp r4, r6\n\ - blt _08003CFC\n\ - b _08004046\n\ -_08003CFC:\n\ - movs r1, 0x8\n\ - negs r1, r1\n\ - mov r9, r1\n\ - movs r2, 0x7\n\ - mov r8, r2\n\ - mov r10, r5\n\ -_08003D08:\n\ - ldr r3, [sp]\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - adds r0, r3, 0\n\ - mov r2, r8\n\ - ands r0, r2\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003D34\n\ - adds r0, r5, r1\n\ - ldr r0, [r0]\n\ - mov r1, r10\n\ - str r0, [r1]\n\ - b _08003D38\n\ - .pool\n\ -_08003D34:\n\ - mov r2, r10\n\ - str r7, [r2]\n\ -_08003D38:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0x4\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003D64\n\ - adds r0, r5, r2\n\ - adds r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003D68\n\ -_08003D64:\n\ - adds r0, r5, r2\n\ - str r7, [r0]\n\ -_08003D68:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x8\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003D96\n\ - adds r0, r5, r2\n\ - adds r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003D9A\n\ -_08003D96:\n\ - adds r0, r5, r2\n\ - str r7, [r0]\n\ -_08003D9A:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0xC\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003DC8\n\ - adds r0, r5, r2\n\ - adds r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003DCC\n\ -_08003DC8:\n\ - adds r0, r5, r2\n\ - str r7, [r0]\n\ -_08003DCC:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x10\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003DFA\n\ - adds r0, r5, r2\n\ - adds r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003DFE\n\ -_08003DFA:\n\ - adds r0, r5, r2\n\ - str r7, [r0]\n\ -_08003DFE:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x14\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003E2C\n\ - adds r0, r5, r2\n\ - adds r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003E30\n\ -_08003E2C:\n\ - adds r0, r5, r2\n\ - str r7, [r0]\n\ -_08003E30:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x18\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003E5E\n\ - adds r0, r5, r2\n\ - adds r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003E62\n\ -_08003E5E:\n\ - adds r0, r5, r2\n\ - str r7, [r0]\n\ -_08003E62:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x1C\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - mov r1, r8\n\ - ands r3, r1\n\ - orrs r0, r3\n\ - lsls r0, 2\n\ - adds r1, r4, r0\n\ - cmp r1, r6\n\ - bge _08003E8C\n\ - adds r0, r5, r2\n\ - adds r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003E90\n\ -_08003E8C:\n\ - adds r0, r5, r2\n\ - str r7, [r0]\n\ -_08003E90:\n\ - movs r2, 0x20\n\ - add r10, r2\n\ - adds r4, 0x20\n\ - cmp r4, r6\n\ - bge _08003E9C\n\ - b _08003D08\n\ -_08003E9C:\n\ - b _08004046\n\ -_08003E9E:\n\ - subs r0, r6, 0x4\n\ - adds r5, r0\n\ - movs r4, 0\n\ - cmp r4, r6\n\ - blt _08003EAA\n\ - b _08004046\n\ -_08003EAA:\n\ - movs r0, 0x8\n\ - negs r0, r0\n\ - mov r9, r0\n\ - movs r1, 0x7\n\ - mov r8, r1\n\ - mov r10, r5\n\ -_08003EB6:\n\ - ldr r3, [sp]\n\ - adds r0, r3, 0\n\ - mov r2, r9\n\ - ands r0, r2\n\ - mov r1, r12\n\ - muls r1, r0\n\ - adds r0, r3, 0\n\ - mov r2, r8\n\ - ands r0, r2\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003EDC\n\ - subs r0, r5, r1\n\ - ldr r0, [r0]\n\ - mov r1, r10\n\ - str r0, [r1]\n\ - b _08003EE0\n\ -_08003EDC:\n\ - mov r2, r10\n\ - str r7, [r2]\n\ -_08003EE0:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0x4\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003F0C\n\ - subs r0, r5, r2\n\ - subs r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003F10\n\ -_08003F0C:\n\ - subs r0, r5, r2\n\ - str r7, [r0]\n\ -_08003F10:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x8\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003F3E\n\ - subs r0, r5, r2\n\ - subs r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003F42\n\ -_08003F3E:\n\ - subs r0, r5, r2\n\ - str r7, [r0]\n\ -_08003F42:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0xC\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003F70\n\ - subs r0, r5, r2\n\ - subs r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003F74\n\ -_08003F70:\n\ - subs r0, r5, r2\n\ - str r7, [r0]\n\ -_08003F74:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x10\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003FA2\n\ - subs r0, r5, r2\n\ - subs r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003FA6\n\ -_08003FA2:\n\ - subs r0, r5, r2\n\ - str r7, [r0]\n\ -_08003FA6:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x14\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08003FD4\n\ - subs r0, r5, r2\n\ - subs r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08003FD8\n\ -_08003FD4:\n\ - subs r0, r5, r2\n\ - str r7, [r0]\n\ -_08003FD8:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x18\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - str r1, [sp, 0x4]\n\ - adds r0, r3, 0\n\ - mov r1, r8\n\ - ands r0, r1\n\ - ldr r1, [sp, 0x4]\n\ - orrs r1, r0\n\ - lsls r1, 2\n\ - adds r1, r4, r1\n\ - cmp r1, r6\n\ - bge _08004006\n\ - subs r0, r5, r2\n\ - subs r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _0800400A\n\ -_08004006:\n\ - subs r0, r5, r2\n\ - str r7, [r0]\n\ -_0800400A:\n\ - adds r3, 0x1\n\ - adds r2, r4, 0\n\ - adds r2, 0x1C\n\ - adds r0, r3, 0\n\ - mov r1, r9\n\ - ands r0, r1\n\ - mov r1, r12\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - mov r1, r8\n\ - ands r3, r1\n\ - orrs r0, r3\n\ - lsls r0, 2\n\ - adds r1, r4, r0\n\ - cmp r1, r6\n\ - bge _08004034\n\ - subs r0, r5, r2\n\ - subs r1, r5, r1\n\ - ldr r1, [r1]\n\ - str r1, [r0]\n\ - b _08004038\n\ -_08004034:\n\ - subs r0, r5, r2\n\ - str r7, [r0]\n\ -_08004038:\n\ - movs r2, 0x20\n\ - negs r2, r2\n\ - add r10, r2\n\ - adds r4, 0x20\n\ - cmp r4, r6\n\ - bge _08004046\n\ - b _08003EB6\n\ -_08004046:\n\ - add sp, 0x8\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 CallWindowFunction(u8 windowId, WindowFunc func) { |