diff options
Diffstat (limited to 'src/field')
63 files changed, 13468 insertions, 2877 deletions
diff --git a/src/field/battle_tower.c b/src/field/battle_tower.c index caebc6a7b..41d5ae9d1 100644 --- a/src/field/battle_tower.c +++ b/src/field/battle_tower.c @@ -103,59 +103,59 @@ static const u16 sBattleTowerHeldItems[] = { #include "../data/battle_tower/level_100_mons.h" static const u8 sMaleTrainerClasses[] = { - TRAINER_CLASS_RUIN_MANIAC, - TRAINER_CLASS_TUBER_M, - TRAINER_CLASS_COOL_TRAINER_M, - TRAINER_CLASS_RICH_BOY, - TRAINER_CLASS_POKEMANIAC, - TRAINER_CLASS_SWIMMER_M, - TRAINER_CLASS_BLACK_BELT, - TRAINER_CLASS_GUITARIST, - TRAINER_CLASS_KINDLER, - TRAINER_CLASS_CAMPER, - TRAINER_CLASS_BUG_MANIAC, - TRAINER_CLASS_PSYCHIC_M, - TRAINER_CLASS_GENTLEMAN, - TRAINER_CLASS_SCHOOL_KID_M, - TRAINER_CLASS_POKEFAN_M, - TRAINER_CLASS_EXPERT_M, - TRAINER_CLASS_YOUNGSTER, - TRAINER_CLASS_FISHERMAN, - TRAINER_CLASS_CYCLING_TRIATHLETE_M, - TRAINER_CLASS_RUNNING_TRIATHLETE_M, - TRAINER_CLASS_SWIMMING_TRIATHLETE_M, - TRAINER_CLASS_DRAGON_TAMER, - TRAINER_CLASS_BIRD_KEEPER, - TRAINER_CLASS_NINJA_BOY, - TRAINER_CLASS_SAILOR, - TRAINER_CLASS_COLLECTOR, - TRAINER_CLASS_POKEMON_BREEDER_M, - TRAINER_CLASS_POKEMON_RANGER_M, - TRAINER_CLASS_BUG_CATCHER, - TRAINER_CLASS_HIKER, + FACILITY_CLASS_RUIN_MANIAC, + FACILITY_CLASS_TUBER_M, + FACILITY_CLASS_COOL_TRAINER_M, + FACILITY_CLASS_RICH_BOY, + FACILITY_CLASS_POKEMANIAC, + FACILITY_CLASS_SWIMMER_M, + FACILITY_CLASS_BLACK_BELT, + FACILITY_CLASS_GUITARIST, + FACILITY_CLASS_KINDLER, + FACILITY_CLASS_CAMPER, + FACILITY_CLASS_BUG_MANIAC, + FACILITY_CLASS_PSYCHIC_M, + FACILITY_CLASS_GENTLEMAN, + FACILITY_CLASS_SCHOOL_KID_M, + FACILITY_CLASS_POKEFAN_M, + FACILITY_CLASS_EXPERT_M, + FACILITY_CLASS_YOUNGSTER, + FACILITY_CLASS_FISHERMAN, + FACILITY_CLASS_CYCLING_TRIATHLETE_M, + FACILITY_CLASS_RUNNING_TRIATHLETE_M, + FACILITY_CLASS_SWIMMING_TRIATHLETE_M, + FACILITY_CLASS_DRAGON_TAMER, + FACILITY_CLASS_BIRD_KEEPER, + FACILITY_CLASS_NINJA_BOY, + FACILITY_CLASS_SAILOR, + FACILITY_CLASS_COLLECTOR, + FACILITY_CLASS_POKEMON_BREEDER_M, + FACILITY_CLASS_POKEMON_RANGER_M, + FACILITY_CLASS_BUG_CATCHER, + FACILITY_CLASS_HIKER, }; static const u8 sFemaleTrainerClasses[] = { - TRAINER_CLASS_AROMA_LADY, - TRAINER_CLASS_TUBER_F, - TRAINER_CLASS_COOL_TRAINER_F, - TRAINER_CLASS_HEX_MANIAC, - TRAINER_CLASS_LADY, - TRAINER_CLASS_BEAUTY, - TRAINER_CLASS_PSYCHIC_F, - TRAINER_CLASS_SCHOOL_KID_F, - TRAINER_CLASS_POKEFAN_F, - TRAINER_CLASS_EXPERT_F, - TRAINER_CLASS_CYCLING_TRIATHLETE_F, - TRAINER_CLASS_RUNNING_TRIATHLETE_F, - TRAINER_CLASS_SWIMMING_TRIATHLETE_F, - TRAINER_CLASS_BATTLE_GIRL, - TRAINER_CLASS_PARASOL_LADY, - TRAINER_CLASS_SWIMMER_F, - TRAINER_CLASS_PICNICKER, - TRAINER_CLASS_POKEMON_BREEDER_F, - TRAINER_CLASS_POKEMON_RANGER_F, - TRAINER_CLASS_LASS, + FACILITY_CLASS_AROMA_LADY, + FACILITY_CLASS_TUBER_F, + FACILITY_CLASS_COOL_TRAINER_F, + FACILITY_CLASS_HEX_MANIAC, + FACILITY_CLASS_LADY, + FACILITY_CLASS_BEAUTY, + FACILITY_CLASS_PSYCHIC_F, + FACILITY_CLASS_SCHOOL_KID_F, + FACILITY_CLASS_POKEFAN_F, + FACILITY_CLASS_EXPERT_F, + FACILITY_CLASS_CYCLING_TRIATHLETE_F, + FACILITY_CLASS_RUNNING_TRIATHLETE_F, + FACILITY_CLASS_SWIMMING_TRIATHLETE_F, + FACILITY_CLASS_BATTLE_GIRL, + FACILITY_CLASS_PARASOL_LADY, + FACILITY_CLASS_SWIMMER_F, + FACILITY_CLASS_PICNICKER, + FACILITY_CLASS_POKEMON_BREEDER_F, + FACILITY_CLASS_POKEMON_RANGER_F, + FACILITY_CLASS_LASS, }; static const u8 sMaleTrainerGfxIds[] = { @@ -255,11 +255,11 @@ static void ResetBattleTowerStreak(u8 levelType); static void ValidateBattleTowerRecordChecksums(void); static void PrintEReaderTrainerFarewellMessage(void); extern void SetBattleTowerTrainerGfxId(u8); -extern void sub_8135A3C(void); +static void SaveCurrentWinStreak(void); static void sub_8135CFC(void); static void CheckMonBattleTowerBanlist(u16, u16, u16, u8, u8, u16 *, u16 *, u8 *); static void ClearEReaderTrainer(struct BattleTowerEReaderTrainer *); -static void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); +void SetEReaderTrainerChecksum(struct BattleTowerEReaderTrainer *ereaderTrainer); static void SetBattleTowerRecordChecksum(struct BattleTowerRecord *); static void ClearBattleTowerRecord(struct BattleTowerRecord *); @@ -1538,7 +1538,7 @@ void CheckPartyBattleTowerBanlist(void) StringAppend(gStringVar1, BattleText_Format8); return; } - + if (1 & counter) StringAppend(gStringVar1, BattleText_Format6); else @@ -1699,7 +1699,7 @@ void SetBattleTowerProperty(void) } gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]++; - sub_8135A3C(); + SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType]; gStringVar1[0] = gSaveBlock2.battleTower.curChallengeBattleNum[battleTowerLevelType] + 0xA1; @@ -1711,7 +1711,7 @@ void SetBattleTowerProperty(void) gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]++; } - sub_8135A3C(); + SaveCurrentWinStreak(); gSpecialVar_Result = gSaveBlock2.battleTower.curStreakChallengesNum[battleTowerLevelType]; break; case 8: @@ -1801,118 +1801,35 @@ void SetBattleTowerParty(void) ReducePlayerPartyToThree(); } -#ifdef NONMATCHING -void sub_8135A3C(void) +static void SaveCurrentWinStreak(void) { - u8 battleTowerLevelType = gSaveBlock2.battleTower.battleTowerLevelType; - u16 winStreak = GetCurrentBattleTowerWinStreak(battleTowerLevelType); + u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; + u16 streak = GetCurrentBattleTowerWinStreak(levelType); - if (gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] < winStreak) - { - gSaveBlock2.battleTower.recordWinStreaks[battleTowerLevelType] = winStreak; - } + if (gSaveBlock2.battleTower.recordWinStreaks[levelType] < streak) + gSaveBlock2.battleTower.recordWinStreaks[levelType] = streak; if (gSaveBlock2.battleTower.recordWinStreaks[0] > gSaveBlock2.battleTower.recordWinStreaks[1]) { - u16 streak = gSaveBlock2.battleTower.recordWinStreaks[0]; + streak = gSaveBlock2.battleTower.recordWinStreaks[0]; SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + if (streak > 9999) - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - } else - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } } else { - u16 streak = gSaveBlock2.battleTower.recordWinStreaks[1]; + streak = gSaveBlock2.battleTower.recordWinStreaks[1]; SetGameStat(GAME_STAT_BATTLE_TOWER_BEST_STREAK, streak); + if (streak > 9999) - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = 9999; - } else - { gSaveBlock2.battleTower.bestBattleTowerWinStreak = streak; - } } } -#else -__attribute__((naked)) -void sub_8135A3C(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - ldr r6, _08135A84 @ =gSaveBlock2\n\ - ldr r1, _08135A88 @ =0x00000554\n\ - adds r0, r6, r1\n\ - ldrb r4, [r0]\n\ - lsls r4, 31\n\ - lsrs r4, 31\n\ - adds r0, r4, 0\n\ - bl GetCurrentBattleTowerWinStreak\n\ - lsls r0, 16\n\ - lsrs r5, r0, 16\n\ - lsls r4, 1\n\ - movs r3, 0xAC\n\ - lsls r3, 3\n\ - adds r2, r6, r3\n\ - adds r4, r2\n\ - ldrh r0, [r4]\n\ - cmp r0, r5\n\ - bcs _08135A66\n\ - strh r5, [r4]\n\ -_08135A66:\n\ - ldr r0, _08135A8C @ =0x00000562\n\ - adds r1, r6, r0\n\ - ldrh r0, [r2]\n\ - ldrh r3, [r1]\n\ - cmp r0, r3\n\ - bls _08135A94\n\ - adds r5, r0, 0\n\ - movs r0, 0x20\n\ - adds r1, r5, 0\n\ - bl SetGameStat\n\ - ldr r1, _08135A90 @ =0x0000270f\n\ - cmp r5, r1\n\ - bhi _08135AA4\n\ - b _08135AB4\n\ - .align 2, 0\n\ -_08135A84: .4byte gSaveBlock2\n\ -_08135A88: .4byte 0x00000554\n\ -_08135A8C: .4byte 0x00000562\n\ -_08135A90: .4byte 0x0000270f\n\ -_08135A94:\n\ - ldrh r5, [r1]\n\ - movs r0, 0x20\n\ - adds r1, r5, 0\n\ - bl SetGameStat\n\ - ldr r1, _08135AAC @ =0x0000270f\n\ - cmp r5, r1\n\ - bls _08135AB4\n\ -_08135AA4:\n\ - ldr r2, _08135AB0 @ =0x00000572\n\ - adds r0, r6, r2\n\ - strh r1, [r0]\n\ - b _08135ABA\n\ - .align 2, 0\n\ -_08135AAC: .4byte 0x0000270f\n\ -_08135AB0: .4byte 0x00000572\n\ -_08135AB4:\n\ - ldr r3, _08135AC0 @ =0x00000572\n\ - adds r0, r6, r3\n\ - strh r5, [r0]\n\ -_08135ABA:\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08135AC0: .4byte 0x00000572\n\ - .syntax divided\n"); -} -#endif // NONMATCHING void sub_8135AC4(void) { @@ -1951,7 +1868,7 @@ void sub_8135AC4(void) } SetBattleTowerRecordChecksum(&gSaveBlock2.battleTower.playerRecord); - sub_8135A3C(); + SaveCurrentWinStreak(); } void SaveBattleTowerProgress(void) @@ -1978,7 +1895,7 @@ void SaveBattleTowerProgress(void) VarSet(VAR_TEMP_0, 0); gSaveBlock2.battleTower.unk_554 = 1; - TrySavingData(EREADER_SAVE); + Save_WriteData(SAVE_EREADER); } void BattleTower_SoftReset(void) @@ -2068,79 +1985,15 @@ u16 GetCurrentBattleTowerWinStreak(u8 battleTowerLevelType) return winStreak; } -#ifdef NONMATCHING void DetermineBattleTowerPrize(void) { - u16 prizeItem; - struct SaveBlock2 *saveBlock = &gSaveBlock2; - u8 battleTowerLevelType = saveBlock->battleTower.battleTowerLevelType; + u8 levelType = gSaveBlock2.battleTower.battleTowerLevelType; - if (saveBlock->battleTower.curStreakChallengesNum[battleTowerLevelType] - 1 > 5) - { - prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; - } + if (gSaveBlock2.battleTower.curStreakChallengesNum[levelType] - 1 > 5) + gSaveBlock2.battleTower.prizeItem = sLongStreakPrizes[Random() % ARRAY_COUNT(sLongStreakPrizes)]; else - { - prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; - } - - saveBlock->battleTower.prizeItem = prizeItem; -} -#else -__attribute__((naked)) -void DetermineBattleTowerPrize(void) -{ - asm(".syntax unified\n\ - push {r4,r5,lr}\n\ - ldr r5, _08135DB0 @ =gSaveBlock2\n\ - ldr r1, _08135DB4 @ =0x00000554\n\ - adds r0, r5, r1\n\ - ldrb r0, [r0]\n\ - lsls r0, 31\n\ - lsrs r0, 31\n\ - lsls r0, 1\n\ - ldr r2, _08135DB8 @ =0x0000055c\n\ - adds r1, r5, r2\n\ - adds r0, r1\n\ - ldrh r0, [r0]\n\ - subs r0, 0x1\n\ - cmp r0, 0x5\n\ - ble _08135DC0\n\ - bl Random\n\ - ldr r4, _08135DBC @ =sLongStreakPrizes\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x9\n\ - b _08135DCC\n\ - .align 2, 0\n\ -_08135DB0: .4byte gSaveBlock2\n\ -_08135DB4: .4byte 0x00000554\n\ -_08135DB8: .4byte 0x0000055c\n\ -_08135DBC: .4byte sLongStreakPrizes\n\ -_08135DC0:\n\ - bl Random\n\ - ldr r4, _08135DE8 @ =sShortStreakPrizes\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - movs r1, 0x6\n\ -_08135DCC:\n\ - bl __umodsi3\n\ - lsls r0, 16\n\ - lsrs r0, 15\n\ - adds r0, r4\n\ - ldrh r1, [r0]\n\ - movs r2, 0xAD\n\ - lsls r2, 3\n\ - adds r0, r5, r2\n\ - strh r1, [r0]\n\ - pop {r4,r5}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08135DE8: .4byte sShortStreakPrizes\n\ - .syntax divided\n"); + gSaveBlock2.battleTower.prizeItem = sShortStreakPrizes[Random() % ARRAY_COUNT(sShortStreakPrizes)]; } -#endif // NONMATCHING void GiveBattleTowerPrize(void) { diff --git a/src/field/berry.c b/src/field/berry.c index 088267ad0..588807755 100644 --- a/src/field/berry.c +++ b/src/field/berry.c @@ -999,6 +999,66 @@ extern u16 gSpecialVar_0x8006; static u8 CalcBerryYield(struct BerryTree *tree); static u16 GetStageDurationByBerryType(u8 berry); +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2B04() +{ + asm( + " push {lr}\n" + " mov r0, #0x0\n" + " bl sub_80B47D8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._1 @ gTasks\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldrh r0, [r1, #0x10]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._2:\n" + " .align 2, 0\n" + "._1:\n" + " .word gTasks\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_80C2B30() +{ + asm( + " push {lr}\n" + " mov r0, #0x1\n" + " bl sub_80B47D8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " ldr r2, ._3 @ gTasks\n" + " lsl r1, r0, #0x2\n" + " add r1, r1, r0\n" + " lsl r1, r1, #0x3\n" + " add r1, r1, r2\n" + " ldrh r0, [r1, #0x10]\n" + " sub r0, r0, #0x1\n" + " strh r0, [r1, #0x10]\n" + " bl CloseMenu\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gTasks\n" + "\n" + ); +} +#endif + // unused // this could be static, but making it so causes a compile-time warning. void ClearEnigmaBerries(void) @@ -1022,6 +1082,180 @@ void SetEnigmaBerry(u8 *src) gSaveBlock1.enigmaBerry.berry.description2 = gSaveBlock1.enigmaBerry.description2; } +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2BD0() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " ldr r3, ._11 @ gSaveBlock1\n" + " ldr r1, ._11 + 4 @ 0x316c\n" + " add r4, r3, r1\n" + " ldr r6, [r4]\n" + " add r1, r1, #0x4\n" + " add r2, r3, r1\n" + " ldr r7, [r2]\n" + " mov r1, #0x0\n" + " str r1, [r4]\n" + " str r1, [r2]\n" + " add r4, r0, #0\n" + " mov r2, #0x0\n" + " ldr r5, ._11 + 8 @ 0x52b\n" + "._10:\n" + " add r0, r4, r1\n" + " ldrb r0, [r0]\n" + " add r2, r2, r0\n" + " add r1, r1, #0x1\n" + " cmp r1, r5\n" + " bls ._10 @cond_branch\n" + " ldr r1, ._11 + 4 @ 0x316c\n" + " add r0, r3, r1\n" + " str r6, [r0]\n" + " add r1, r1, #0x4\n" + " add r0, r3, r1\n" + " str r7, [r0]\n" + " add r0, r2, #0\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._12:\n" + " .align 2, 0\n" + "._11:\n" + " .word gSaveBlock1\n" + " .word 0x316c\n" + " .word 0x52b\n" + "\n" + ); +} +#endif + +#if DEBUG +__attribute__((naked)) +u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add r3, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " mov r9, r1\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " mov r8, r2\n" + " ldr r4, ._16 @ gSaveBlock1\n" + " ldr r1, ._16 + 4 @ 0x3160\n" + " add r0, r4, r1\n" + " add r2, r0, #0\n" + " ldr r1, ._16 + 8 @ gBerries\n" + " ldmia r1!, {r5, r6, r7}\n" + " stmia r2!, {r5, r6, r7}\n" + " ldmia r1!, {r5, r6, r7}\n" + " stmia r2!, {r5, r6, r7}\n" + " ldr r1, [r1]\n" + " str r1, [r2]\n" + " add r1, r3, #0\n" + " bl StringCopy\n" + " ldr r0, ._16 + 12 @ 0x361c\n" + " add r6, r4, r0\n" + " ldr r1, ._16 + 16 @ gUnknown_Debug_083F7F84\n" + " add r0, r6, #0\n" + " bl StringCopy\n" + " ldr r1, ._16 + 20 @ 0x3649\n" + " add r5, r4, r1\n" + " ldr r1, ._16 + 24 @ gUnknown_Debug_083F7F90\n" + " add r0, r5, #0\n" + " bl StringCopy\n" + " ldr r2, ._16 + 28 @ 0x316c\n" + " add r0, r4, r2\n" + " str r6, [r0]\n" + " ldr r6, ._16 + 32 @ 0x3170\n" + " add r0, r4, r6\n" + " str r5, [r0]\n" + " mov r2, #0x0\n" + " ldr r6, ._16 + 36 @ 0x47f\n" + " ldr r7, ._16 + 40 @ 0x317c\n" + " add r5, r4, r7\n" + " ldr r3, ._16 + 44 @ gSpriteImage_UnusedCherry\n" + "._13:\n" + " add r0, r2, r5\n" + " add r1, r2, r3\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, r6\n" + " ble ._13 @cond_branch\n" + " ldr r0, ._16 @ gSaveBlock1\n" + " ldr r3, ._16 + 48 @ gSpritePalette_UnusedCherry\n" + " ldr r2, ._16 + 52 @ 0x35fc\n" + " add r1, r0, r2\n" + " mov r2, #0xf\n" + "._14:\n" + " ldrh r0, [r3]\n" + " strh r0, [r1]\n" + " add r3, r3, #0x2\n" + " add r1, r1, #0x2\n" + " sub r2, r2, #0x1\n" + " cmp r2, #0\n" + " bge ._14 @cond_branch\n" + " mov r2, #0x0\n" + " ldr r5, ._16 + 56 @ gSaveBlock1\n" + " ldr r3, ._16 + 60 @ gUnknown_Debug_839B6CE\n" + "._15:\n" + " add r0, r2, r5\n" + " add r1, r2, r3\n" + " ldrb r1, [r1]\n" + " strb r1, [r0]\n" + " add r2, r2, #0x1\n" + " cmp r2, #0x11\n" + " ble ._15 @cond_branch\n" + " ldr r5, ._16 + 64 @ 0x3688\n" + " add r0, r4, r5\n" + " mov r6, r9\n" + " strb r6, [r0]\n" + " ldr r7, ._16 + 68 @ 0x3689\n" + " add r0, r4, r7\n" + " mov r1, r8\n" + " strb r1, [r0]\n" + " ldr r2, ._16 + 4 @ 0x3160\n" + " add r0, r4, r2\n" + " bl debug_sub_80C2BD0\n" + " add r5, r5, #0x4\n" + " add r1, r4, r5\n" + " str r0, [r1]\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word gSaveBlock1\n" + " .word 0x3160\n" + " .word gBerries\n" + " .word 0x361c\n" + " .word gUnknown_Debug_083F7F84\n" + " .word 0x3649\n" + " .word gUnknown_Debug_083F7F90\n" + " .word 0x316c\n" + " .word 0x3170\n" + " .word 0x47f\n" + " .word 0x317c\n" + " .word gSpriteImage_UnusedCherry\n" + " .word gSpritePalette_UnusedCherry\n" + " .word 0x35fc\n" + " .word gSaveBlock1+0x3676\n" + " .word gUnknown_Debug_839B6CE\n" + " .word 0x3688\n" + " .word 0x3689\n" + "\n" + ); +} +#else static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) { const u8 *description1; @@ -1051,9 +1285,110 @@ static u32 GetEnigmaBerryChecksum(struct EnigmaBerry *enigmaBerry) return checksum; } +#endif + +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2D24() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " ldr r6, [sp, #0x18]\n" + " ldr r4, [sp, #0x1c]\n" + " mov r8, r4\n" + " ldr r5, ._18 @ gSaveBlock1\n" + " ldr r7, ._18 + 4 @ 0x3175\n" + " add r4, r5, r7\n" + " strb r0, [r4]\n" + " ldr r4, ._18 + 8 @ 0x3176\n" + " add r0, r5, r4\n" + " strb r1, [r0]\n" + " add r7, r7, #0x2\n" + " add r0, r5, r7\n" + " strb r2, [r0]\n" + " ldr r1, ._18 + 12 @ 0x3178\n" + " add r0, r5, r1\n" + " strb r3, [r0]\n" + " add r4, r4, #0x3\n" + " add r0, r5, r4\n" + " strb r6, [r0]\n" + " add r7, r7, #0x3\n" + " add r0, r5, r7\n" + " mov r1, r8\n" + " strb r1, [r0]\n" + " sub r4, r4, #0x19\n" + " add r0, r5, r4\n" + " bl debug_sub_80C2BD0\n" + " ldr r7, ._18 + 16 @ 0x368c\n" + " add r5, r5, r7\n" + " str r0, [r5]\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._19:\n" + " .align 2, 0\n" + "._18:\n" + " .word gSaveBlock1\n" + " .word 0x3175\n" + " .word 0x3176\n" + " .word 0x3178\n" + " .word 0x368c\n" + "\n" + ); +} +#endif // due to e-reader scans being particularly volatile to failure, it is a requirement to check for // their integrity here due to scans possibly failing to produce the correct result. +#if DEBUG +__attribute__((naked)) +bool32 IsEnigmaBerryValid() +{ + asm( + " push {r4, lr}\n" + " ldr r4, ._24 @ gSaveBlock1\n" + " ldr r1, ._24 + 4 @ 0x3174\n" + " add r0, r4, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._22 @cond_branch\n" + " ldr r2, ._24 + 8 @ 0x316a\n" + " add r0, r4, r2\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._22 @cond_branch\n" + " ldr r1, ._24 + 12 @ 0x3160\n" + " add r0, r4, r1\n" + " bl debug_sub_80C2BD0\n" + " ldr r2, ._24 + 16 @ 0x368c\n" + " add r1, r4, r2\n" + " ldr r1, [r1]\n" + " cmp r0, r1\n" + " bne ._22 @cond_branch\n" + " mov r0, #0x1\n" + " b ._23\n" + "._25:\n" + " .align 2, 0\n" + "._24:\n" + " .word gSaveBlock1\n" + " .word 0x3174\n" + " .word 0x316a\n" + " .word 0x3160\n" + " .word 0x368c\n" + "._22:\n" + " mov r0, #0x0\n" + "._23:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} +#else bool32 IsEnigmaBerryValid(void) { if (gSaveBlock1.enigmaBerry.berry.stageDuration == 0) @@ -1064,6 +1399,7 @@ bool32 IsEnigmaBerryValid(void) return FALSE; return TRUE; } +#endif const struct Berry *GetBerryInfo(u8 berry) { @@ -1417,6 +1753,177 @@ bool8 PlayerHasBerries(void) return IsBagPocketNonEmpty(BAG_BERRIES); } +#if DEBUG +void debug_sub_80C33FC(u8 *buffer, s32 value, u8 n) +{ + StringAppend(gStringVar4, buffer); + ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEADING_ZEROS, n); + StringAppend(gStringVar4, gStringVar1); +} + +extern const u8 gUnknown_Debug_083F7F9D[]; +extern const u8 gUnknown_Debug_083F7FA2[]; +extern const u8 gUnknown_Debug_083F7FA9[]; +extern const u8 gUnknown_Debug_083F7FB0[]; +extern const u8 gUnknown_Debug_083F7FB7[]; +extern const u8 gUnknown_Debug_083F7FBE[]; +extern const u8 gUnknown_Debug_083F7FC5[]; +extern const u8 gUnknown_Debug_083F7FCC[]; +extern const u8 gUnknown_Debug_083F7FD3[]; +extern const u8 gUnknown_Debug_083F7FD3[]; +extern const u8 gUnknown_Debug_083F7FD3[]; + +#ifdef NONMATCHING +u8* DebugOpenBerryInfo(void) +{ + s32 i; + u8 berryTreeId; + struct BerryTree *berryTree; + + if (GetFieldObjectScriptPointerPlayerFacing() != &S_BerryTree) + return NULL; + + berryTreeId = FieldObjectGetBerryTreeId(gSelectedMapObject); + berryTree = GetBerryTreeInfo(berryTreeId); + + for (i = 0; i < 500; i++) + gStringVar4[i] |= 0xFF; + + debug_sub_80C33FC(gUnknown_Debug_083F7F9D, berryTreeId, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FA2, berryTree->berry, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FA9, berryTree->stage, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FB0, berryTree->secondsUntilNextStage, 5); + debug_sub_80C33FC(gUnknown_Debug_083F7FB7, berryTree->berryYield, 2); + debug_sub_80C33FC(gUnknown_Debug_083F7FBE, berryTree->regrowthCount, 3); + debug_sub_80C33FC(gUnknown_Debug_083F7FC5, berryTree->growthSparkle, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FCC, berryTree->watered1, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered2, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered3, 1); + debug_sub_80C33FC(gUnknown_Debug_083F7FD3, berryTree->watered4, 1); + + return gStringVar4; +} +#else +__attribute__((naked)) +void DebugOpenBerryInfo() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " bl GetFieldObjectScriptPointerPlayerFacing\n" + " ldr r1, ._138 @ S_BerryTree\n" + " cmp r0, r1\n" + " beq ._136 @cond_branch\n" + " mov r0, #0x0\n" + " b ._137\n" + "._139:\n" + " .align 2, 0\n" + "._138:\n" + " .word S_BerryTree\n" + "._136:\n" + " ldr r0, ._141 @ gSelectedMapObject\n" + " ldrb r0, [r0]\n" + " bl FieldObjectGetBerryTreeId\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " add r0, r6, #0\n" + " bl GetBerryTreeInfo\n" + " add r5, r0, #0\n" + " mov r2, #0x0\n" + " ldr r7, ._141 + 4 @ 0x1f3\n" + " ldr r4, ._141 + 8 @ gStringVar4\n" + " mov r3, #0xff\n" + "._140:\n" + " add r1, r2, r4\n" + " ldrb r0, [r1]\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " add r2, r2, #0x1\n" + " cmp r2, r7\n" + " ble ._140 @cond_branch\n" + " ldr r0, ._141 + 12 @ gUnknown_Debug_083F7F9D\n" + " add r1, r6, #0\n" + " mov r2, #0x3\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 16 @ gUnknown_Debug_083F7FA2\n" + " ldrb r1, [r5]\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 20 @ gUnknown_Debug_083F7FA9\n" + " ldrb r1, [r5, #0x1]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x19\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 24 @ gUnknown_Debug_083F7FB0\n" + " ldrh r1, [r5, #0x2]\n" + " mov r2, #0x5\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 28 @ gUnknown_Debug_083F7FB7\n" + " ldrb r1, [r5, #0x4]\n" + " mov r2, #0x2\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 32 @ gUnknown_Debug_083F7FBE\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " mov r2, #0x3\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 36 @ gUnknown_Debug_083F7FC5\n" + " ldrb r1, [r5, #0x1]\n" + " lsr r1, r1, #0x7\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 40 @ gUnknown_Debug_083F7FCC\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1b\n" + " lsr r1, r1, #0x1f\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r4, ._141 + 44 @ gUnknown_Debug_083F7FD3\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x1a\n" + " lsr r1, r1, #0x1f\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldrb r1, [r5, #0x5]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1f\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldrb r1, [r5, #0x5]\n" + " lsr r1, r1, #0x7\n" + " add r0, r4, #0\n" + " mov r2, #0x1\n" + " bl debug_sub_80C33FC\n" + " ldr r0, ._141 + 8 @ gStringVar4\n" + "._137:\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._142:\n" + " .align 2, 0\n" + "._141:\n" + " .word gSelectedMapObject\n" + " .word 0x1f3\n" + " .word gStringVar4\n" + " .word gUnknown_Debug_083F7F9D\n" + " .word gUnknown_Debug_083F7FA2\n" + " .word gUnknown_Debug_083F7FA9\n" + " .word gUnknown_Debug_083F7FB0\n" + " .word gUnknown_Debug_083F7FB7\n" + " .word gUnknown_Debug_083F7FBE\n" + " .word gUnknown_Debug_083F7FC5\n" + " .word gUnknown_Debug_083F7FCC\n" + " .word gUnknown_Debug_083F7FD3\n" + "\n" + ); +} +#endif + +#endif + // whenever the player is not within view of the berry tree during its sparkle state, the // sparkle state will be reset. void ResetBerryTreeSparkleFlags(void) @@ -1445,3 +1952,17 @@ void ResetBerryTreeSparkleFlags(void) } } } + +#if DEBUG +static const u8 gUnknown_Debug_083F7F84[] = _("そとから きた きのみ"); +static const u8 gUnknown_Debug_083F7F90[] = _("ただいま かいはつちゅう"); +static const u8 gUnknown_Debug_083F7F9D[] = _("POS:"); +static const u8 gUnknown_Debug_083F7FA2[] = _("\nTYPE:"); +static const u8 gUnknown_Debug_083F7FA9[] = _("\nGROW:"); +static const u8 gUnknown_Debug_083F7FB0[] = _("\nTIME:"); +static const u8 gUnknown_Debug_083F7FB7[] = _("\nFCNT:"); +static const u8 gUnknown_Debug_083F7FBE[] = _("\nSCNT:"); +static const u8 gUnknown_Debug_083F7FC5[] = _("\nHOOK:"); +static const u8 gUnknown_Debug_083F7FCC[] = _("\nWBIT:"); +static const u8 gUnknown_Debug_083F7FD3[] = _(""); +#endif diff --git a/src/field/berry_tag_screen.c b/src/field/berry_tag_screen.c index 960a163c1..ed0ab86ae 100644 --- a/src/field/berry_tag_screen.c +++ b/src/field/berry_tag_screen.c @@ -42,7 +42,7 @@ extern u8 gBerryCheck_Pal[]; extern u8 gUnknown_08E788E4[]; extern u8 gUnknown_08E78A84[]; -static const u8 *const gUnknown_0841192C[] = +const u8 *const gUnknown_0841192C[] = { ContestStatsText_VerySoft, ContestStatsText_Soft, @@ -93,7 +93,7 @@ static bool8 sub_8146058(void) switch (gMain.state) { case 0: - sub_80F9438(); + ClearVideoCallbacks(); sub_80F9368(); sub_8146288(); REG_BLDCNT = 0; @@ -109,11 +109,11 @@ static bool8 sub_8146058(void) gMain.state += 1; break; case 3: - SetUpWindowConfig(&gWindowConfig_81E6E18); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E18); gMain.state += 1; break; case 4: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E18); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E18); gMain.state += 1; break; case 5: @@ -189,7 +189,6 @@ static void sub_8146288(void) bool8 sub_81462B8(void) { u16 i; - void *addr; switch (gSharedMem.var_1FFFF) { @@ -213,8 +212,7 @@ bool8 sub_81462B8(void) else gBGTilemapBuffers[2][i] = 0x5042; } - addr = (void *)(VRAM + 0x3800); - DmaCopy16(3, gBGTilemapBuffers[2], addr, 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x3800), 0x800); gSharedMem.var_1FFFF += 1; break; case 4: @@ -280,18 +278,18 @@ static void sub_81464E4(void) berryInfo = GetBerryInfo(gSpecialVar_ItemId + OFFSET_7B + 1); ConvertIntToDecimalStringN(gStringVar1, gSpecialVar_ItemId - FIRST_BERRY + 1, STR_CONV_MODE_LEADING_ZEROS, 2); - MenuPrint(gStringVar1, 12, 4); + Menu_PrintText(gStringVar1, 12, 4); #if ENGLISH - MenuPrint(berryInfo->name, 14, 4); + Menu_PrintText(berryInfo->name, 14, 4); #elif GERMAN StringCopy(buffer, berryInfo->name); StringAppend(buffer, gOtherText_Berry2); - MenuPrint(buffer, 14, 4); + Menu_PrintText(buffer, 14, 4); #endif - MenuPrint(berryInfo->description1, 4, 14); - MenuPrint(berryInfo->description2, 4, 16); + Menu_PrintText(berryInfo->description1, 4, 14); + Menu_PrintText(berryInfo->description2, 4, 16); #ifdef UNITS_IMPERIAL size = (berryInfo->size * 1000) / 254; @@ -301,7 +299,7 @@ static void sub_81464E4(void) sizeMajor = size / 100; #endif - MenuPrint(gOtherText_Size, 11, 7); + Menu_PrintText(gOtherText_Size, 11, 7); if (berryInfo->size != 0) { #ifdef UNITS_IMPERIAL @@ -311,18 +309,18 @@ static void sub_81464E4(void) ConvertIntToDecimalStringN(gStringVar1, berryInfo->size / 10, STR_CONV_MODE_LEFT_ALIGN, 2); ConvertIntToDecimalStringN(gStringVar2, berryInfo->size % 10, STR_CONV_MODE_LEFT_ALIGN, 2); #endif - MenuPrint(gContestStatsText_Unknown1, 16, 7); + Menu_PrintText(gContestStatsText_Unknown1, 16, 7); } else { - MenuPrint(gOtherText_ThreeQuestions2, 16, 7); + Menu_PrintText(gOtherText_ThreeQuestions2, 16, 7); } - MenuPrint(gOtherText_Firm, 11, 9); + Menu_PrintText(gOtherText_Firm, 11, 9); if (berryInfo->firmness != 0) - MenuPrint(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); + Menu_PrintText(gUnknown_0841192C[berryInfo->firmness - 1], 16, 9); else - MenuPrint(gOtherText_ThreeQuestions2, 16, 9); + Menu_PrintText(gOtherText_ThreeQuestions2, 16, 9); } static void sub_8146600(u8 berry) @@ -445,7 +443,7 @@ static void sub_8146810(s8 berry) static void sub_81468BC(void) { - MenuZeroFillWindowRect(0, 4, 29, 19); + Menu_EraseWindowRect(0, 4, 29, 19); sub_81464E4(); // center of berry sprite diff --git a/src/field/bike.c b/src/field/bike.c index 8db01b4b4..98966ebd4 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -14,6 +14,11 @@ extern bool8 gBikeCyclingChallenge; extern u8 gBikeCollisions; extern u8 gUnusedBikeCameraAheadPanback; +#if DEBUG +extern u8 gUnknown_020297ED; +u8 debug_sub_805F2B0(u8); +#endif + static void MovePlayerOnMachBike(u8, u16, u16); static u8 GetMachBikeTransition(u8 *); static void MachBikeTransition_FaceDirection(u8); @@ -134,6 +139,13 @@ void MovePlayerOnBike(u8 direction, u16 newKeys, u16 heldKeys) static void MovePlayerOnMachBike(u8 direction, u16 newKeys, u16 heldKeys) { +#if DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(direction)) + { + Bike_SetBikeStill(); + return; + } +#endif sMachBikeTransitions[GetMachBikeTransition(&direction)](direction); } @@ -271,6 +283,14 @@ static void MachBikeTransition_TrySlowDown(u8 var) // the acro bike requires the input handler to be executed before the transition can. static void MovePlayerOnAcroBike(u8 newDirection, u16 newKeys, u16 heldKeys) { +#if DEBUG + if (gUnknown_020297ED && debug_sub_805F2B0(newDirection)) + { + Bike_SetBikeStill(); + return; + } +#endif + sAcroBikeTransitions[CheckMovementInputAcroBike(&newDirection, newKeys, heldKeys)](newDirection); } diff --git a/src/field/braille_puzzles.c b/src/field/braille_puzzles.c index 0d304714d..f11fb5fb3 100644 --- a/src/field/braille_puzzles.c +++ b/src/field/braille_puzzles.c @@ -161,7 +161,7 @@ void Task_BrailleWait(u8 taskId) case 1: if (BrailleWait_CheckButtonPress() != FALSE) { - MenuZeroFillScreen(); + Menu_EraseScreen(); PlaySE(SE_SELECT); data[0] = 2; } @@ -170,7 +170,7 @@ void Task_BrailleWait(u8 taskId) data[1] = data[1] - 1; if (data[1] == 0) { - MenuZeroFillScreen(); + Menu_EraseScreen(); data[0] = 3; data[1] = 30; } diff --git a/src/field/choose_party.c b/src/field/choose_party.c index d278eda4a..7529c4271 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -1,5 +1,5 @@ #include "global.h" -#include "decoration.h" +#include "event_data.h" #include "field_fadetransition.h" #include "main.h" #include "menu.h" @@ -7,6 +7,7 @@ #include "palette.h" #include "party_menu.h" #include "pokemon_menu.h" +#include "field_weather.h" #include "pokemon.h" #include "pokemon_summary_screen.h" #include "overworld.h" @@ -318,19 +319,19 @@ static void sub_812238C(u8 taskId) { if (gMain.newAndRepeatedKeys & 0x40) { - if (GetMenuCursorPos() != 0) + if (Menu_GetCursorPos() != 0) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } return; } if (gMain.newAndRepeatedKeys & 0x80) { - if (GetMenuCursorPos() != 3) + if (Menu_GetCursorPos() != 3) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } return; } @@ -343,7 +344,7 @@ static void sub_812238C(u8 taskId) gTasks[taskId].data[4], sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, - GetMenuCursorPos()); + Menu_GetCursorPos()); popupMenuFunc(taskId); return; } @@ -461,8 +462,8 @@ static void BattleTowerEntryMenuCallback_Enter(u8 taskId) } } PlaySE(SE_HAZURE); - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); sub_806D5A4(); sub_806E834(gOtherText_NoMoreThreePoke, 1); gTasks[taskId].func = sub_8122728; @@ -475,8 +476,8 @@ static void sub_8122728(u8 taskId) if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) { - MenuZeroFillWindowRect(0, 14, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(0, 14, 29, 19); + Menu_DestroyCursor(); BattleTowerEntryMenuCallback_Exit(taskId); } } @@ -515,8 +516,8 @@ static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId) static void sub_81227FC(u8 taskId) { - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); PrintPartyMenuPromptText(0, 0); gTasks[taskId].func = HandleBattleTowerPartyMenu; } @@ -527,6 +528,107 @@ static void BattleTowerEntryMenuCallback_Exit(u8 taskId) sub_81227FC(taskId); } +#if DEBUG +__attribute__((naked)) +void debug_sub_81381B4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " ldr r4, ._189 @ gUnknown_02023A00\n" + " add r0, r4, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x60\n" + " bl memset\n" + " mov r7, #0x0\n" + " mov r8, r4\n" + " mov r0, #0x4\n" + " add r0, r0, r8\n" + " mov r9, r0\n" + "._188:\n" + " mov r0, #0x64\n" + " add r1, r7, #0\n" + " mul r1, r1, r0\n" + " ldr r0, ._189 + 4 @ gPlayerParty\n" + " add r5, r1, r0\n" + " add r0, r5, #0\n" + " mov r1, #0x41\n" + " bl GetMonData\n" + " lsl r4, r7, #0x5\n" + " mov r1, r8\n" + " add r6, r4, r1\n" + " strh r0, [r6]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " beq ._187 @cond_branch\n" + " add r0, r5, #0\n" + " mov r1, #0x38\n" + " bl GetMonData\n" + " strb r0, [r6, #0xf]\n" + " add r0, r5, #0\n" + " mov r1, #0x39\n" + " bl GetMonData\n" + " strh r0, [r6, #0x10]\n" + " add r0, r5, #0\n" + " mov r1, #0x3a\n" + " bl GetMonData\n" + " strh r0, [r6, #0x12]\n" + " add r0, r5, #0\n" + " mov r1, #0x37\n" + " bl GetMonData\n" + " mov r1, r8\n" + " add r1, r1, #0x14\n" + " add r1, r4, r1\n" + " str r0, [r1]\n" + " add r0, r5, #0\n" + " mov r1, #0xc\n" + " bl GetMonData\n" + " strh r0, [r6, #0x2]\n" + " add r0, r5, #0\n" + " mov r1, #0x0\n" + " bl GetMonData\n" + " mov r1, r8\n" + " add r1, r1, #0x18\n" + " add r1, r4, r1\n" + " str r0, [r1]\n" + " add r0, r5, #0\n" + " bl GetMonGender\n" + " strb r0, [r6, #0x1c]\n" + " add r4, r4, r9\n" + " add r0, r5, #0\n" + " mov r1, #0x2\n" + " add r2, r4, #0\n" + " bl GetMonData\n" + " add r0, r4, #0\n" + " bl Text_StripExtCtrlCodes\n" + " add r0, r5, #0\n" + " mov r1, #0x3\n" + " bl GetMonData\n" + " strb r0, [r6, #0x1d]\n" + "._187:\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x2\n" + " bls ._188 @cond_branch\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._190:\n" + " .align 2, 0\n" + "._189:\n" + " .word gUnknown_02023A00\n" + " .word gPlayerParty+0x12c\n" + "\n" + ); +} +#endif + bool8 SetupLinkMultiBattlePartyMenu(void) { switch (ewram1B000_alt.setupState) @@ -806,19 +908,19 @@ static void Task_DaycareStorageMenu8122EAC(u8 taskId) { if (gMain.newAndRepeatedKeys & 0x40) { - if (GetMenuCursorPos() != 0) + if (Menu_GetCursorPos() != 0) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } return; } if (gMain.newAndRepeatedKeys & 0x80) { - if (GetMenuCursorPos() != 3) + if (Menu_GetCursorPos() != 3) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } return; } @@ -831,7 +933,7 @@ static void Task_DaycareStorageMenu8122EAC(u8 taskId) gTasks[taskId].data[4], sDaycareStorageMenus, sDaycareStorageMenuItems, - GetMenuCursorPos()); + Menu_GetCursorPos()); popupMenuFunc(taskId); return; } @@ -896,8 +998,8 @@ static void DaycareStorageMenuCallback_Summary(u8 taskId) static void DaycareStorageMenuCallback_Exit(u8 taskId) { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(20, 10, 29, 19); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(20, 10, 29, 19); + Menu_DestroyCursor(); PrintPartyMenuPromptText(15, 0); gTasks[taskId].func = HandleDaycarePartyMenu; } @@ -930,7 +1032,7 @@ void sub_81231AC(void) static void sub_81231C4(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { DestroyTask(taskId); ScriptContext2_Disable(); diff --git a/src/field/coins.c b/src/field/coins.c index 91a4b508d..2c217e635 100644 --- a/src/field/coins.c +++ b/src/field/coins.c @@ -13,13 +13,13 @@ void UpdateCoinsWindow(s32 coins, u8 x, u8 y) void ShowCoinsWindow(u32 coins, u8 x, u8 y) { - MenuDrawTextWindow(x, y, x + 9, y + 3); + Menu_DrawStdWindowFrame(x, y, x + 9, y + 3); UpdateCoinsWindow(coins, x, y); } void HideCoinsWindow(u8 x, u8 y) { - MenuZeroFillWindowRect(x, y, x + 9, y + 3); + Menu_EraseWindowRect(x, y, x + 9, y + 3); } void PrintCoins(s32 coins, u8 b, u8 x, u8 y) @@ -46,7 +46,7 @@ void PrintCoins(s32 coins, u8 b, u8 x, u8 y) ptr[2] = (b - StringLength(string)) * 6; ptr += 3; StringCopy(ptr, string); - MenuPrint(gOtherText_Coins2, x, y); + Menu_PrintText(gOtherText_Coins2, x, y); } u16 GetCoins(void) diff --git a/src/field/coord_event_weather.c b/src/field/coord_event_weather.c index db4e9c161..60b87fa30 100644 --- a/src/field/coord_event_weather.c +++ b/src/field/coord_event_weather.c @@ -34,7 +34,7 @@ static const struct CoordEventWeather sCoordEventWeatherFuncs[] = { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog }, { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash }, { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm }, - { COORD_EVENT_WEATHER_DARK, CoordEventWeather_Dark }, + { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark }, { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought }, { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle }, { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle }, @@ -87,7 +87,7 @@ static void CoordEventWeather_Sandstorm(void) static void CoordEventWeather_Dark(void) { - SetWeather(WEATHER_DARK); + SetWeather(WEATHER_SHADE); } static void CoordEventWeather_Drought(void) diff --git a/src/field/daycare.c b/src/field/daycare.c index c28bc65ca..2f0c7281e 100644 --- a/src/field/daycare.c +++ b/src/field/daycare.c @@ -205,7 +205,7 @@ static u16 TakeSelectedPokemonFromDaycare(struct DayCare * daycare, u8 slot) GetBoxMonNick(&daycare->mons[slot], gStringVar1); species = GetBoxMonData(&daycare->mons[slot], MON_DATA_SPECIES); - sub_803B4B4(&daycare->mons[slot], &pokemon); + ExpandBoxMon(&daycare->mons[slot], &pokemon); if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) { @@ -341,7 +341,7 @@ u16 GetEggSpecies(u16 species) { for (k = 0; k < 5; k++) { - if (gEvolutionTable[j].evolutions[k].targetSpecies == species) + if (gEvolutionTable[j][k].targetSpecies == species) { species = j; found = TRUE; @@ -557,7 +557,7 @@ void BuildEggMoveset(struct Pokemon *egg, struct BoxPokemon *father, struct BoxP { for (j = 0; j < NUM_TECHNICAL_MACHINES + NUM_HIDDEN_MACHINES; j++) { - if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j)) + if (gHatchedEggFatherMoves[i] == ItemIdToBattleMoveId(ITEM_TM01_FOCUS_PUNCH + j) && CanMonLearnTMHM(egg, j)) { if (GiveMoveToMon(egg, gHatchedEggFatherMoves[i]) == 0xffff) DeleteFirstMoveAndGiveMoveToMon(egg, gHatchedEggFatherMoves[i]); @@ -1741,7 +1741,7 @@ static void HandleDaycareLevelMenuInput(u8 taskId) if (gTasks[taskId].data[0] != 0) { gTasks[taskId].data[0] --; - MoveMenuCursor(-1); + Menu_MoveCursor(-1); PlaySE(SE_SELECT); } } @@ -1750,25 +1750,25 @@ static void HandleDaycareLevelMenuInput(u8 taskId) if (gTasks[taskId].data[0] != 2) { gTasks[taskId].data[0]++; - MoveMenuCursor(+1); + Menu_MoveCursor(+1); PlaySE(SE_SELECT); } } else if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gLastFieldPokeMenuOpened = gSpecialVar_Result = gTasks[taskId].data[0]; DestroyTask(taskId); - MenuZeroFillWindowRect(15, 6, 29, 13); + Menu_EraseWindowRect(15, 6, 29, 13); EnableBothScriptContexts(); } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); gLastFieldPokeMenuOpened = gSpecialVar_Result = 2; DestroyTask(taskId); - MenuZeroFillWindowRect(15, 6, 29, 13); + Menu_EraseWindowRect(15, 6, 29, 13); EnableBothScriptContexts(); } } @@ -1776,11 +1776,11 @@ static void HandleDaycareLevelMenuInput(u8 taskId) void ShowDaycareLevelMenu(void) { u8 buffer[100]; - MenuDrawTextWindow(15, 6, 29, 13); + Menu_DrawStdWindowFrame(15, 6, 29, 13); GetDaycareLevelMenuText(&gSaveBlock1.daycare, buffer); - MenuPrint(buffer, 16, 7); + Menu_PrintText(buffer, 16, 7); GetDaycareLevelMenuLevelText(&gSaveBlock1.daycare, buffer); - MenuPrint_PixelCoords(buffer, 0xce, 0x38, TRUE); + Menu_PrintTextPixelCoords(buffer, 0xce, 0x38, TRUE); InitMenu(0, 16, 7, 3, 0, 13); CreateTask(HandleDaycareLevelMenuInput, 3); } diff --git a/src/field/decoration.c b/src/field/decoration.c index 87a9d8028..0e7fa5f41 100644 --- a/src/field/decoration.c +++ b/src/field/decoration.c @@ -19,6 +19,7 @@ #include "event_data.h" #include "field_weather.h" #include "decoration.h" +#include "shop.h" #include "ewram.h" EWRAM_DATA u8 *gUnknown_020388D0 = NULL; @@ -1433,8 +1434,8 @@ extern u8 gUnknown_0815F399[]; void sub_80FE1DC(void) { sub_80FE2B4(); - MenuDrawTextWindow(0, 0, 10, 9); - PrintMenuItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); + Menu_DrawStdWindowFrame(0, 0, 10, 9); + Menu_PrintItems(1, 1, 4, (const struct MenuAction *)gUnknown_083EC604); InitMenu(0, 1, 1, 4, gUnknown_020388D4, 9); } @@ -1487,13 +1488,13 @@ void Task_DecorationPCProcessMenuInput(u8 taskId) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - gUnknown_020388D4 = MoveMenuCursor(-1); + gUnknown_020388D4 = Menu_MoveCursor(-1); sub_80FE394(); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - gUnknown_020388D4 = MoveMenuCursor(1); + gUnknown_020388D4 = Menu_MoveCursor(1); sub_80FE394(); } if (gMain.newKeys & A_BUTTON) @@ -1510,15 +1511,15 @@ void Task_DecorationPCProcessMenuInput(u8 taskId) void sub_80FE394(void) { - MenuFillWindowRectWithBlankTile(2, 15, 27, 18); - MenuPrint(gUnknown_083EC624[gUnknown_020388D4], 2, 15); + Menu_BlankWindowRect(2, 15, 27, 18); + Menu_PrintText(gUnknown_083EC624[gUnknown_020388D4], 2, 15); } void gpu_pal_decompress_alloc_tag_and_upload(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 10, 9); - MenuFillWindowRectWithBlankTile(2, 15, 27, 18); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 10, 9); + Menu_BlankWindowRect(2, 15, 27, 18); FreeSpritePaletteByTag(6); if (ewram_1f000.isPlayerRoom == 0) { @@ -1546,7 +1547,7 @@ void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCateg { u8 *strptr; u8 v0; - v0 = sub_8072CBC(); + v0 = Menu_GetTextWindowPaletteNum(); // PALETTE {palIdx} strptr = gStringVar4; strptr[0] = EXT_CTRL_CODE_BEGIN; @@ -1561,13 +1562,13 @@ void sub_80FE470(u8 decoCat, u8 left, u8 top, u8 palIdx) // PrintDecorationCateg strptr[1] = 5; strptr[2] = v0; strptr[3] = EOS; - MenuPrint(gStringVar4, left, top); + Menu_PrintText(gStringVar4, left, top); } void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings { u8 decoCat; - MenuDrawTextWindow(0, 0, 14, 19); + Menu_DrawStdWindowFrame(0, 0, 14, 19); for (decoCat=0; decoCat<8; decoCat++) { if (ewram_1f000.isPlayerRoom == 1 && gTasks[taskId].data[11] == 0 && decoCat != DECORCAT_DOLL && decoCat != DECORCAT_CUSHION) @@ -1578,13 +1579,13 @@ void sub_80FE528(u8 taskId) // PrintDecorationCategorySelectionMenuStrings sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); // Unselectable } } - MenuPrint(gUnknownText_Exit, 1, 17); + Menu_PrintText(gUnknownText_Exit, 1, 17); } void sub_80FE5AC(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80FE528(taskId); InitMenu(0, 1, 1, 9, gUnknown_020388F6, 13); gTasks[taskId].func = sub_80FE604; @@ -1597,15 +1598,15 @@ void sub_80FE604(u8 taskId) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gUnknown_020388F6 = GetMenuCursorPos(); + gUnknown_020388F6 = Menu_GetCursorPos(); if (gUnknown_020388F6 != 8) { gUnknown_020388D5 = sub_8134194(gUnknown_020388F6); @@ -1614,14 +1615,14 @@ void sub_80FE604(u8 taskId) sub_8134104(gUnknown_020388F6); gUnknown_020388D0 = gDecorationInventories[gUnknown_020388F6].items; sub_80FEF50(taskId); - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); sub_80F9480(gUnknown_020388F7, 8); LoadScrollIndicatorPalette(); gTasks[taskId].func = sub_80FE868; } else { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecors, sub_80FE418, 0); } } else @@ -1649,17 +1650,17 @@ void sub_80FE728(u8 taskId) void sub_80FE758(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); if (gTasks[taskId].data[11] != 2) { sub_80FE1DC(); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); sub_80FE394(); gTasks[taskId].func = Task_DecorationPCProcessMenuInput; } else { - sub_80B3068(taskId); + Shop_RunExitSellMenuTask(taskId); } } @@ -1677,18 +1678,18 @@ void sub_80FE7D4(u8 *dest, u8 decClass) void sub_80FE7EC(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80FEC94(taskId); sub_80FECB8(gUnknown_020388F6); #if ENGLISH - MenuDrawTextWindow(15, 12, 29, 19); + Menu_DrawStdWindowFrame(15, 12, 29, 19); #elif GERMAN if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5) { - MenuDrawTextWindow(15, 12, 29, 19); + Menu_DrawStdWindowFrame(15, 12, 29, 19); } #endif @@ -1710,7 +1711,7 @@ void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) PlaySE(SE_SELECT); if (cursorVector != 0) { - gUnknown_020388F2 = MoveMenuCursor(cursorVector); + gUnknown_020388F2 = Menu_MoveCursor(cursorVector); } if (bgVector != 0) { @@ -1722,12 +1723,12 @@ void sub_80FE894(u8 taskId /*r8*/, s8 cursorVector /*r5*/, s8 bgVector /*r7*/) { if (v0) { - MenuDrawTextWindow(15, 12, 29, 19); + Menu_DrawStdWindowFrame(15, 12, 29, 19); } sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); } else { - MenuZeroFillWindowRect(15, 12, 29, 19); + Menu_EraseWindowRect(15, 12, 29, 19); } } @@ -1757,7 +1758,7 @@ void sub_80FE948(u8 taskId) } if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4; if (gUnknown_020388F5 == gUnknown_020388D5) @@ -1769,7 +1770,7 @@ void sub_80FE948(u8 taskId) } } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gUnknown_083EC634[gTasks[taskId].data[11]].noFunc(taskId); } @@ -1783,17 +1784,17 @@ void sub_80FEABC(u8 taskId, u8 dummy1) u16 i; u16 j; u8 ni; - if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(0), gUnknown_020388F4 != 0)) + if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(TOP_ARROW), gUnknown_020388F4 != 0)) { - CreateVerticalScrollIndicators(0, 0x3c, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0x3c, 0x08); } if (gUnknown_020388F4 + 7 == gUnknown_020388D5) { - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } if (gUnknown_020388F4 + 7 < gUnknown_020388D5) { - CreateVerticalScrollIndicators(1, 0x3c, 0x98); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x3c, 0x98); } for (i=gUnknown_020388F4; i<gUnknown_020388F4+8; i++) { @@ -1839,13 +1840,13 @@ void sub_80FEABC(u8 taskId, u8 dummy1) void sub_80FEC94(u8 taskId) { - MenuDrawTextWindow(0, 0, 14, 19); + Menu_DrawStdWindowFrame(0, 0, 14, 19); sub_80FEABC(taskId, 0); } void sub_80FECB8(u8 decoCat) { - MenuDrawTextWindow(15, 0, 29, 3); + Menu_DrawStdWindowFrame(15, 0, 29, 3); sub_80FE470(decoCat, 16, 1, 0xff); } @@ -1902,8 +1903,8 @@ _080FED26:\n\ void sub_80FED1C(void) { - MenuZeroFillWindowRect(15, 0, 29, 3); - MenuZeroFillWindowRect(15, 12, 29, 19); + Menu_EraseWindowRect(15, 0, 29, 3); + Menu_EraseWindowRect(15, 12, 29, 19); } void sub_80FED3C(u8 taskId) @@ -2003,10 +2004,10 @@ void sub_80FEF50(u8 taskId) void sub_80FEF74(void) { sub_80F9520(gUnknown_020388F7, 8); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); } bool8 sub_80FEFA4(void) @@ -2035,16 +2036,16 @@ void sub_80FEFF4(u8 taskId) void sub_80FF034(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 14, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 14, 19); sub_80FE5AC(taskId); } void sub_80FF058(u8 taskId) { sub_80F9520(gUnknown_020388F7, 8); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); BuyMenuFreeMemory(); gTasks[taskId].func = sub_80FF034; } @@ -2238,7 +2239,7 @@ void sub_80FF5BC(u8 taskId) { if (sub_80FF58C() == TRUE) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_80FF6AC; } else @@ -2271,8 +2272,8 @@ void sub_80FF6AC(u8 taskId) if (!gPaletteFade.active) { sub_80FF0E0(taskId); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); sub_80F9520(gUnknown_020388F7, 8); BuyMenuFreeMemory(); gTasks[taskId].data[2] = 1; @@ -2288,7 +2289,7 @@ void sub_80FF6AC(u8 taskId) gTasks[taskId].data[2] = 2; break; case 2: - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].data[12] = 0; sub_810065C(taskId); @@ -3128,7 +3129,7 @@ void sub_81000A0(u8 taskId) void sub_81000C4(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_8100174(taskId); if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].permission != DECORPERM_SOLID_MAT) { @@ -3186,13 +3187,13 @@ void sub_8100248(u8 taskId) void sub_810026C(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_810028C(taskId); } void sub_810028C(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = c1_overworld_prev_quest; } @@ -3221,7 +3222,7 @@ void c1_overworld_prev_quest(u8 taskId) void sub_8100334(u8 taskId) { - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = sub_80FE948; } @@ -3341,7 +3342,7 @@ void sub_8100494(u8 taskId) void sub_810065C(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gSprites[gUnknown_020391A8].data[7] = 0; gTasks[taskId].data[10] = 0; gTasks[taskId].func = sub_8100494; @@ -3628,7 +3629,7 @@ void sub_8100A0C(u8 taskId) { if (sub_8100D38(taskId) == 1) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_8100E70; } else @@ -3723,7 +3724,7 @@ void sub_8100C88(u8 taskId) { DrawWholeMapView(); ScriptContext1_SetupScript(gUnknown_081A2F8A); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gTasks[taskId].data[2] = 2; } break; @@ -3734,7 +3735,7 @@ void sub_8100C88(u8 taskId) gTasks[taskId].data[2] = 3; break; case 3: - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].data[13] = -1; DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); @@ -3760,7 +3761,7 @@ bool8 sub_8100D38(u8 taskId) void SetUpPuttingAwayDecorationPlayerAvatar(void) { player_get_direction_lower_nybble(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data[0]; sub_81016C8(); gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83ECA88, 0x78, 0x50, 0); @@ -3790,7 +3791,7 @@ void sub_8100E70(u8 taskId) data[2] = 1; data[6] = 1; data[5] = 1; - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); } break; case 1: @@ -3799,7 +3800,7 @@ void sub_8100E70(u8 taskId) data[2] = 2; break; case 2: - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { data[12] = 1; sub_8100EEC(taskId); @@ -3810,7 +3811,7 @@ void sub_8100E70(u8 taskId) void sub_8100EEC(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gSprites[gUnknown_020391A8].data[7] = 0; gSprites[gUnknown_020391A8].invisible = 0; gSprites[gUnknown_020391A8].callback = sub_8101698; @@ -4137,7 +4138,7 @@ void sub_8101518(u8 taskId) void sub_810153C(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_8100C88; } @@ -4150,13 +4151,13 @@ void sub_810156C(u8 taskId) void sub_8101590(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_81015B0(taskId); } void sub_81015B0(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); gTasks[taskId].data[2] = 0; gTasks[taskId].func = sub_81015E0; } @@ -4183,7 +4184,7 @@ void sub_81015E0(u8 taskId) void sub_8101648(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) { gTasks[taskId].func = Task_DecorationPCProcessMenuInput; } @@ -4192,7 +4193,7 @@ void sub_8101648(u8 taskId) void sub_8101678(void) { pal_fill_black(); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); sub_80FE220(); CreateTask(sub_8101648, 8); } @@ -4274,7 +4275,7 @@ void sub_8101824(u8 taskId) void sub_8101848(u8 taskId) { - MenuZeroFillWindowRect(20, 8, 26, 14); + Menu_EraseWindowRect(20, 8, 26, 14); sub_8109A30(gUnknown_020388D0[gUnknown_020388F5]); gUnknown_020388D0[gUnknown_020388F5] = DECOR_NONE; sub_80FF098(taskId); diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c index dd0e972aa..8f7f5eb92 100644 --- a/src/field/decoration_inventory.c +++ b/src/field/decoration_inventory.c @@ -164,3 +164,14 @@ u8 sub_81341D4(void) } return count; } + + +#if DEBUG +void debug_sub_814A3A8(void) +{ + u8 decor; + + for (decor = 0; decor < DECOR_COUNT; decor++) + IsThereStorageSpaceForDecoration(decor); +} +#endif diff --git a/src/field/diploma.c b/src/field/diploma.c index 27601404c..b31fc7dec 100644 --- a/src/field/diploma.c +++ b/src/field/diploma.c @@ -10,7 +10,7 @@ #include "strings2.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" static void VBlankCB(void); static void MainCB2(void); @@ -62,14 +62,14 @@ void CB2_ShowDiploma(void) LZ77UnCompVram(gDiplomaTiles, (void *)VRAM); LZ77UnCompVram(gDiplomaTilemap, (void *)(VRAM + 0x3000)); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); LoadPalette(gDiplomaPalettes, 0, 64); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); DisplayDiplomaText(); BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); @@ -125,7 +125,7 @@ static void Task_DiplomaFadeOut(u8 taskId) static void DisplayDiplomaText(void) { - if (sub_8090FF4()) + if (CompletedNationalPokedex()) { REG_BG3HOFS = 256; StringCopy(gStringVar1, gOtherText_NationalDex); @@ -135,5 +135,5 @@ static void DisplayDiplomaText(void) REG_BG3HOFS = 0; StringCopy(gStringVar1, gOtherText_HoennDex); } - MenuPrint(gOtherText_DiplomaCertificationGameFreak, 6, 2); + Menu_PrintText(gOtherText_DiplomaCertificationGameFreak, 6, 2); }
\ No newline at end of file diff --git a/src/field/easy_chat.c b/src/field/easy_chat.c deleted file mode 100644 index 94532506f..000000000 --- a/src/field/easy_chat.c +++ /dev/null @@ -1,445 +0,0 @@ -#include "global.h" -#include "easy_chat.h" -#include "constants/easy_chat.h" -#include "data2.h" -#include "event_data.h" -#include "field_message_box.h" -#include "pokedex.h" -#include "random.h" -#include "string_util.h" -#include "strings.h" -#include "strings2.h" -#include "text.h" - -static bool8 sub_80EB680(u16 *, u16, u16, u16); -static u16 sub_80EB9D8(void); -static u16 sub_80EB960(void); - -extern void *gEasyChatGroupWords[]; -extern const u8 gEasyChatGroupSizes[]; - -extern u16 gSpecialVar_0x8004; - -IWRAM_DATA u8 gUnknown_03000740; - -// returns the end of the destination buffer text -u8 *EasyChat_GetWordText(u8 *dst, u16 word) -{ - u16 group; - u16 wordIndex; - u8 *src; - u16 i; - - if (sub_80EB37C(word)) - return StringCopy(dst, gOtherText_ThreeQuestions); - - if (word == 0xFFFF) - { - *dst = EOS; - return dst; - } - else - { - group = EC_GROUP(word); - wordIndex = EC_INDEX(word); - switch (group) - { - case EC_GROUP_POKEMON: // 0 - case EC_GROUP_POKEMON_2: // 21 - dst = StringCopy(dst, gSpeciesNames[wordIndex]); - break; - case EC_GROUP_MOVE_1: // 18 - case EC_GROUP_MOVE_2: // 19 - dst = StringCopy(dst, gMoveNames[wordIndex]); - break; - default: - src = gEasyChatGroupWords[group]; - for (i = wordIndex - 1; i != 0xFFFF; i--) - { - while (*src++ != EOS) - ; - } - dst = StringCopy(dst, src); - break; - } - *dst = EOS; - return dst; - } -} - -u8 *ConvertEasyChatWordsToString(u8 *dst, u16 *words, u16 arg2, u16 arg3) -{ - u16 i; - u16 n; - - const u16 i1 = arg2 - 1; - - for (i = 0; i < arg3; i++) - { - u16 word; - - for (n = 0; n < i1; n++) - { - dst = EasyChat_GetWordText(dst, words[0]); - - if (words[0] != 0xFFFF) - { - dst[0] = CHAR_SPACE; - dst++; - } - - words++; - } - - word = words[0]; - words++; - dst = EasyChat_GetWordText(dst, word); - - dst[0] = CHAR_NEWLINE; - dst++; - } - - dst--; - dst[0] = EOS; - - return dst; -} - -u8 *sub_80EB544(u8 *dst, u16 *words, u16 arg2, u16 arg3) -{ - u16 i; - u16 n; - - const u16 i1 = arg2 - 1; - - for (i = 0; i < arg3; i++) - { - u16 word; - - for (n = 0; n < i1; n++) - { - dst = EasyChat_GetWordText(dst, words[0]); - - if (words[0] != 0xFFFF) - { - dst[0] = CHAR_SPACE; - dst++; - } - - words++; - } - - word = words[0]; - words++; - dst = EasyChat_GetWordText(dst, word); - - // Only difference with ConvertEasyChatWordsToString - dst[0] = (i == 0) ? CHAR_NEWLINE : CHAR_PROMPT_SCROLL; - dst++; - } - - dst--; - dst[0] = EOS; - - return dst; -} - - -u16 unref_sub_80EB5E0(u16 arg0) -{ - const u8 *chars; - u16 i; - u16 length; - int group, word; - - - if (arg0 == 0xFFFF) - return 0; - - group = EC_GROUP(arg0); - word = EC_INDEX(arg0); - switch (group) - { - case EC_GROUP_POKEMON: // 0 - case EC_GROUP_POKEMON_2: // 21 - chars = gSpeciesNames[word]; - break; - case EC_GROUP_MOVE_1: // 18 - case EC_GROUP_MOVE_2: // 19 - chars = gMoveNames[word]; - break; - default: - chars = gEasyChatGroupWords[group]; - for (i = word - 1; i != 0xFFFF; i--) - { - while (*chars++ != EOS) - ; - } - break; - } - - length = 0; - while (*chars != EOS) - { - chars++; - length++; - } - - return length; -} - -static bool8 sub_80EB680(u16 *arg0, u16 arg1, u16 arg2, u16 arg3) -{ - return FALSE; -} - -void unref_sub_80EB684(u8 arg0, u16 arg1) -{ - u16 *ptr; - u16 c; - - // FIXME: find actual tv shows used - switch (arg0) - { - case 5: - c = 6; - ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x04); - break; - case 7: - c = 2; - ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x1C); - break; - case 8: - c = 1; - ptr = (u16*)((void *)&gSaveBlock1.tvShows[arg1] + 0x02); - break; - default: - return; - } - - c -= 1; - while (c != 0xFFFF) - { - *ptr = -1; - ptr++; - c -= 1; - } -} - -void sub_80EB6FC(u16 *arg0, u16 arg1) -{ - u16 i; - - for (i = arg1 - 1; i != 0xFFFF; i--) - { - *arg0 = 0xFFFF; - arg0++; - } - -} - -u16 sub_80EB72C(u16 group) -{ - u16 local1 = Random() % gEasyChatGroupSizes[group]; - - if (group == EC_GROUP_POKEMON - || group == EC_GROUP_POKEMON_2 - || group == EC_GROUP_MOVE_1 - || group == EC_GROUP_MOVE_2) - { - local1 = ((u16 *) gEasyChatGroupWords[group])[local1]; - } - - return ((group & 0x7F) << 9) | (local1 & 0x1FF); -} - -u16 sub_80EB784(u16 group) -{ - if (!sub_80EAD7C(group)) - return -1; - - if (group != EC_GROUP_POKEMON) - { - if (group == EC_GROUP_TRENDY_SAYING) - return sub_80EB960(); - } - else - { - return sub_80EB9D8(); - } - - return sub_80EB72C(group); -} - -void sub_80EB7C4(void) -{ - u16 *words; - u16 arg1, arg2; - - switch (gSpecialVar_0x8004) - { - case 0: - words = gSaveBlock1.easyChats.unk2B1C; - arg1 = 2; - arg2 = 2; - break; - case 1: - words = gSaveBlock1.easyChats.unk2B28; - if (sub_80EB680(gSaveBlock1.easyChats.unk2B28, 3, 2, 20)) - { - arg1 = 2; - arg2 = 3; - } - else - { - arg1 = 3; - arg2 = 2; - } - break; - case 2: - words = gSaveBlock1.easyChats.unk2B34; - arg1 = 3; - arg2 = 2; - break; - case 3: - words = gSaveBlock1.easyChats.unk2B40; - arg1 = 3; - arg2 = 2; - break; - default: - return; - } - - ConvertEasyChatWordsToString(gStringVar4, words, arg1, arg2); - ShowFieldAutoScrollMessage(gStringVar4); -} - -void BufferRandomHobbyOrLifestyleString(void) -{ - u16 group, local2; - - if (Random() & 1) - group = EC_GROUP_HOBBIES; - else - group = EC_GROUP_LIFESTYLE; - - local2 = sub_80EB784(group); - EasyChat_GetWordText(gStringVar2, local2); -} - -u8 sub_80EB868(u8 arg0) -{ - int offset; - int index; - - index = arg0 / 8; - offset = arg0 % 8; - return (gSaveBlock1.unk2D8C[index] >> offset) & 1; -} - -void sub_80EB890(u8 arg0) -{ - int offset; - int index; - - if (arg0 < 33) - { - index = arg0 / 8; - offset = arg0 % 8; - gSaveBlock1.unk2D8C[index] |= 1 << offset; - } -} - -u8 sub_80EB8C0(void) -{ - u8 i, count; - - for (i = 0, count = 0; i < 33; i++) - { - if (sub_80EB868(i)) - count++; - } - return count; -} - -u16 sub_80EB8EC(void) -{ - u16 i; - u16 local1, local2; - - local1 = sub_80EB8C0(); - if (local1 == 33) - return -1; - - local2 = Random() % (33 - local1); - for (i = 0; i < 33; i++) - { - if (sub_80EB868(i) == 0) - { - if (local2 == 0) - { - sub_80EB890(i); - return (i & 0x1FF) | 0x2800; - } - local2--; - } - } - return -1; -} - -static u16 sub_80EB960(void) -{ - u16 i; - u16 local1; - - local1 = sub_80EB8C0(); - if (local1 == 0) - return -1; - - local1 = Random() % local1; - for (i = 0; i < 33; i++) - { - if (sub_80EB868(i)) - { - if (local1 == 0) - return (i & 0x1FF) | 0x2800; - local1--; - } - } - - return -1; -} - -u8 sub_80EB9C8(void) -{ - return IsNationalPokedexEnabled(); -} - -static u16 sub_80EB9D8(void) -{ - u16 *speciesList; - u16 local1; - u16 i; - - local1 = sub_80EAE88(0); - - if (local1 == 0) - return -1; - - local1 = Random() % local1; - speciesList = (u16 *) gEasyChatGroupWords[EC_GROUP_POKEMON]; - for (i = 0; i < gEasyChatGroupSizes[EC_GROUP_POKEMON]; i++) - { - const u16 dexNum = SpeciesToNationalPokedexNum(*speciesList); - const u8 local2 = GetSetPokedexFlag(dexNum, 0); - - if (local2) - { - if (local1 == 0) - return *speciesList & 0x1FF; - local1--; - } - speciesList++; - } - return -1; -} diff --git a/src/field/field_control_avatar.c b/src/field/field_control_avatar.c index 52e66f16e..3ae422512 100644 --- a/src/field/field_control_avatar.c +++ b/src/field/field_control_avatar.c @@ -4,6 +4,7 @@ #include "bike.h" #include "coord_event_weather.h" #include "daycare.h" +#include "debug.h" #include "event_data.h" #include "field_fadetransition.h" #include "field_player_avatar.h" @@ -35,6 +36,7 @@ extern u16 gSpecialVar_Facing; extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; +extern u8 gUnknown_020297ED; static EWRAM_DATA u8 gUnknown_0202E8C0 = 0; static EWRAM_DATA u16 gUnknown_0202E8C2 = 0; @@ -103,7 +105,7 @@ static void sub_8068C30(struct MapHeader *, s8, struct MapPosition *); static bool8 map_warp_consider_2_to_inside(struct MapPosition *, u16, u8); static s8 map_warp_check(struct MapHeader *, u16, u16, u8); static u8 *mapheader_trigger_activate_at(struct MapHeader *, u16, u16, u8); -static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8); +static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *, u16, u16, u8);; void FieldClearPlayerInput(struct FieldInput *input) { @@ -162,6 +164,31 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys) input->dpadDirection = DIR_WEST; else if (heldKeys & DPAD_RIGHT) input->dpadDirection = DIR_EAST; +#if DEBUG + if ((heldKeys & R_BUTTON) && input->pressedStartButton) + { + input->input_field_1_2 = TRUE; + input->pressedStartButton = FALSE; + } + if (gUnknown_020297ED) + { + if (heldKeys & R_BUTTON) + { + input->input_field_1_1 = TRUE; + input->input_field_0_6 = FALSE; + input->input_field_0_1 = FALSE; + input->input_field_0_4 = FALSE; + input->input_field_0_5 = FALSE; + if (newKeys & SELECT_BUTTON) + { + input->input_field_1_0 = TRUE; + input->pressedSelectButton = FALSE; + } + } + if (heldKeys & L_BUTTON) + input->input_field_1_3 = TRUE; + } +#endif } int sub_8068024(struct FieldInput *input) @@ -173,15 +200,30 @@ int sub_8068024(struct FieldInput *input) r6 = player_get_direction_lower_nybble(); player_get_pos_to_and_height(&position); r4 = MapGridGetMetatileBehaviorAt(position.x, position.y); - if (CheckTrainers() == TRUE) +#if DEBUG + if (input->input_field_1_3 && dive_warp(&position, r4) == TRUE) return TRUE; - if (mapheader_run_first_tag2_script_list_match() == 1) +#endif + + if ( +#if DEBUG + !input->input_field_1_1 && +#endif + CheckTrainers() == TRUE) + return TRUE; + + if ( +#if DEBUG + !input->input_field_1_1 && +#endif + mapheader_run_first_tag2_script_list_match() == 1) return TRUE; + if (input->pressedBButton && sub_80687A4() == 1) return TRUE; if (input->input_field_0_6) { - IncrementGameStat(5); + IncrementGameStat(GAME_STAT_STEPS); if (sub_80687E4(&position, r4, r6) == 1) return TRUE; } @@ -211,6 +253,21 @@ int sub_8068024(struct FieldInput *input) } if (input->pressedSelectButton && sub_80A6D1C() == TRUE) return TRUE; + +#if DEBUG + if (input->input_field_1_0) + { + debug_sub_80888D8(); + return TRUE; + } + if (input->input_field_1_2) + { + PlaySE(SE_WIN_OPEN); + DebugMenu_8077048(); + return TRUE; + } +#endif + return FALSE; } @@ -532,7 +589,7 @@ static void happiness_algorithm_step(void) { struct Pokemon *pkmn = gPlayerParty; - for (i = 5; i >= 0; i--) + for (i = 0; i < 6; i++) { AdjustFriendship(pkmn, 5); pkmn++; @@ -767,20 +824,19 @@ static u8 *trigger_activate(struct CoordEvent *coordEvent) return NULL; } -static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 d) +static u8 *mapheader_trigger_activate_at(struct MapHeader *mapHeader, u16 x, u16 y, u8 elevation) { s32 i; struct CoordEvent *coordEvents = mapHeader->events->coordEvents; u8 coordEventCount = mapHeader->events->coordEventCount; - u8 *script; for (i = 0; i < coordEventCount; i++) { if ((u16)coordEvents[i].x == x && (u16)coordEvents[i].y == y) { - if (coordEvents[i].unk4 == d || coordEvents[i].unk4 == 0) + if (coordEvents[i].elevation == elevation || coordEvents[i].elevation == 0) { - script = trigger_activate(&coordEvents[i]); + u8 *script = trigger_activate(&coordEvents[i]); if (script != NULL) return script; } @@ -811,7 +867,7 @@ static struct BgEvent *FindInvisibleMapObjectByPosition(struct MapHeader *mapHea return NULL; } -int dive_warp(struct MapPosition *position, u16 b) +bool8 dive_warp(struct MapPosition *position, u16 b) { if (gMapHeader.mapType == MAP_TYPE_UNDERWATER && sub_805750C(b) == 0) { diff --git a/src/field/field_effect.c b/src/field/field_effect.c index 1e2aaa4ed..e1389c378 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -25,6 +25,7 @@ #include "field_map_obj.h" #include "util.h" #include "field_effect_helpers.h" +#include "pokemon_storage_system.h" #define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} @@ -407,7 +408,7 @@ void FieldEffectScript_LoadFadedPalette(u8 **script) { struct SpritePalette *palette = (struct SpritePalette *)FieldEffectScript_ReadWord(script); LoadSpritePalette(palette); - sub_807D78C(IndexOfSpritePaletteTag(palette->tag)); + UpdateSpritePaletteWithWeather(IndexOfSpritePaletteTag(palette->tag)); (*script) += 4; } @@ -543,7 +544,7 @@ u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) LoadCompressedObjectPalette(&gMonPaletteTable[species]); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; - sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); + PreservePaletteInWeather(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); } @@ -556,13 +557,13 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio LoadCompressedObjectPalette(spritePalette); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = spritePalette->tag; - sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + PreservePaletteInWeather(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); } void FreeResourcesAndDestroySprite(struct Sprite *sprite) { - sub_807DE68(); + ResetPreservedPalettesInWeather(); FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); if (sprite->oam.affineMode != 0) { @@ -1091,7 +1092,7 @@ void task00_8084310(u8 taskId) task = &gTasks[taskId]; if (!task->data[0]) { - if (!sub_807D770()) + if (!IsWeatherNotFadingIn()) { return; } @@ -1191,7 +1192,7 @@ bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { task->data[0]++; } @@ -1813,7 +1814,7 @@ bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { gFieldEffectArguments[0] = mapObject->coords2.x; gFieldEffectArguments[1] = mapObject->coords2.y; @@ -2046,7 +2047,7 @@ void sub_8087A74(u8 taskId) void sub_8087AA4(struct Task *task) { - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { task->data[0]++; task->data[15] = player_get_direction_lower_nybble(); @@ -2199,7 +2200,7 @@ void sub_8087E4C(struct Task *task) { struct Sprite *sprite; s16 centerToCornerVecY; - if (sub_807D770()) + if (IsWeatherNotFadingIn()) { sprite = &gSprites[gPlayerAvatar.spriteId]; centerToCornerVecY = -(sprite->centerToCornerVecY << 1); @@ -2434,8 +2435,8 @@ void sub_8088380(struct Task *task) IntrCallback callback; LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); SetVBlankCallback(callback); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); DestroyTask(FindTaskIdByFunc(sub_8088120)); @@ -2557,8 +2558,8 @@ void sub_808862C(struct Task *task) CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); SetVBlankCallback(intrCallback); - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); DestroyTask(FindTaskIdByFunc(sub_808847C)); diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c index 165829a55..c9d337de1 100644 --- a/src/field/field_effect_helpers.c +++ b/src/field/field_effect_helpers.c @@ -29,8 +29,6 @@ static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); static void sub_8128174(struct Sprite *); static u32 ShowDisguiseFieldEffect(u8, u8, u8); -const u8 UnusedEggString_8401E28[] = _("タマゴ"); - void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag) { struct Sprite *newSprite; @@ -95,7 +93,7 @@ static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum) { pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum); } - sub_807D78C(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum); } } @@ -107,7 +105,7 @@ static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum) if (graphicsInfo->paletteTag2 != 0x11ff) { pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum); - sub_807D78C(paletteNum); + UpdateSpritePaletteWithWeather(paletteNum); } } diff --git a/src/field/field_fadetransition.c b/src/field/field_fadetransition.c index 5014e97e3..21235500a 100644 --- a/src/field/field_fadetransition.c +++ b/src/field/field_fadetransition.c @@ -44,18 +44,18 @@ void pal_fill_for_map_transition(void) switch (fade_type_for_given_maplight_pair(map_light, Overworld_GetMapTypeOfSaveblockLocation())) { case 0: - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_fill_black(); break; case 1: - fade_screen(2, 0); + FadeScreen(2, 0); palette_bg_fill_white(); } } void pal_fill_black(void) { - fade_screen(0, 0); + FadeScreen(0, 0); palette_bg_fill_black(); } @@ -65,10 +65,10 @@ void fade_8080918(void) switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) { case 0: - fade_screen(1, 0); + FadeScreen(1, 0); break; case 1: - fade_screen(3, 0); + FadeScreen(3, 0); } } @@ -146,7 +146,7 @@ void sub_8080A5C(u8 taskId) task->data[0]++; break; case 1: - if (sub_8007ECC()) + if (IsLinkTaskFinished()) { pal_fill_for_map_transition(); task->data[0]++; @@ -366,7 +366,7 @@ bool32 sub_8080E64(void) bool32 sub_8080E70(void) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) return TRUE; else return FALSE; @@ -483,7 +483,7 @@ void sub_8081050(u8 taskId) { case 0: ClearLinkCallback_2(); - fade_screen(1, 0); + FadeScreen(1, 0); sub_8053FF8(); PlaySE(SE_KAIDAN); data[0]++; @@ -511,6 +511,22 @@ void sub_80810DC(void) CreateTask(sub_8081050, 10); } +#if DEBUG + +__attribute__((naked)) +void debug_sub_80888D8() +{ + asm("\ + PUSH {LR}\n\ + BL debug_sub_8052E04\n\ + BL sub_8080E88\n\ + BL ScriptContext2_Enable\n\ + POP {R0}\n\ + BX R0"); +} + +#endif + void task0A_fade_n_map_maybe(u8 taskId) { struct Task *task = &gTasks[taskId]; diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index ba7c3d68e..13d8ebb5b 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1907,6 +1907,9 @@ static u8 gUnknown_030005A4; static u16 gUnknown_030005A6; struct MapObject gMapObjects[16]; +#if DEBUG +u8 gUnknown_Debug_03004BC0[4]; // unknown type +#endif void npc_clear_ids_and_state(struct MapObject *mapObj) { @@ -1917,6 +1920,40 @@ void npc_clear_ids_and_state(struct MapObject *mapObj) mapObj->mapobj_unk_1C = 0xFF; } +#if DEBUG +__attribute__((naked)) +void npcs_clear_ids_and_state() +{ + asm( + " push {r4, r5, lr}\n" + " mov r4, #0x0\n" + " ldr r5, ._2 @ gMapObjects\n" + "._1:\n" + " lsl r0, r4, #0x3\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r5\n" + " bl npc_clear_ids_and_state\n" + " add r0, r4, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0xf\n" + " bls ._1 @cond_branch\n" + " ldr r1, ._2 + 4 @ gUnknown_Debug_03004BC0\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " pop {r4, r5}\n" + " pop {r0}\n" + " bx r0\n" + "._3:\n" + " .align 2, 0\n" + "._2:\n" + " .word gMapObjects\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else void npcs_clear_ids_and_state(void) { u8 i; @@ -1924,6 +1961,7 @@ void npcs_clear_ids_and_state(void) for (i = 0; i < 16; i++) npc_clear_ids_and_state(&gMapObjects[i]); } +#endif void sub_805AA98(void) { @@ -2017,6 +2055,176 @@ u8 GetFieldObjectIdByLocalId(u8 localId) return 16; } +#if DEBUG +__attribute__((naked)) +u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " add r5, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r6, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r7, r2, #0x18\n" + " ldrb r0, [r5]\n" + " add r1, r6, #0\n" + " add r2, r7, #0\n" + " mov r3, sp\n" + " bl GetAvailableFieldObjectSlot\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " beq ._35 @cond_branch\n" + " mov r0, #0x10\n" + " b ._36\n" + "._35:\n" + " mov r0, sp\n" + " ldrb r1, [r0]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._40 @ gMapObjects\n" + " add r4, r0, r1\n" + " add r0, r4, #0\n" + " bl npc_clear_ids_and_state\n" + " ldrh r3, [r5, #0x4]\n" + " add r3, r3, #0x7\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " ldrh r2, [r5, #0x6]\n" + " add r2, r2, #0x7\n" + " lsl r2, r2, #0x10\n" + " lsr r2, r2, #0x10\n" + " ldrb r0, [r4]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " mov r1, #0x4\n" + " orr r0, r0, r1\n" + " strb r0, [r4]\n" + " ldrb r0, [r5, #0x1]\n" + " strb r0, [r4, #0x5]\n" + " ldrb r0, [r5, #0x9]\n" + " strb r0, [r4, #0x6]\n" + " ldrb r0, [r5]\n" + " strb r0, [r4, #0x8]\n" + " strb r6, [r4, #0x9]\n" + " strb r7, [r4, #0xa]\n" + " strh r3, [r4, #0xc]\n" + " strh r2, [r4, #0xe]\n" + " strh r3, [r4, #0x10]\n" + " strh r2, [r4, #0x12]\n" + " strh r3, [r4, #0x14]\n" + " strh r2, [r4, #0x16]\n" + " ldrb r0, [r5, #0x8]\n" + " mov r7, #0xf\n" + " add r1, r7, #0\n" + " and r1, r1, r0\n" + " ldrb r2, [r4, #0xb]\n" + " mov r0, #0x10\n" + " neg r0, r0\n" + " mov r8, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0x8]\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0xb]\n" + " ldrb r1, [r5, #0xa]\n" + " lsl r1, r1, #0x1c\n" + " mov r0, #0xf\n" + " mov r9, r0\n" + " lsr r1, r1, #0x1c\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, r8\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrb r1, [r5, #0xa]\n" + " lsr r1, r1, #0x4\n" + " lsl r1, r1, #0x4\n" + " and r0, r0, r7\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + " ldrh r0, [r5, #0xc]\n" + " strb r0, [r4, #0x7]\n" + " ldrh r0, [r5, #0xe]\n" + " strb r0, [r4, #0x1d]\n" + " ldr r1, ._40 + 4 @ gUnknown_0836DC09\n" + " ldrb r0, [r5, #0x9]\n" + " add r0, r0, r1\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " add r0, r0, #0x20\n" + " strb r1, [r0]\n" + " ldrb r1, [r0]\n" + " add r0, r4, #0\n" + " bl FieldObjectSetDirection\n" + " add r0, r4, #0\n" + " bl FieldObjectHandleDynamicGraphicsId\n" + " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n" + " ldrb r0, [r4, #0x6]\n" + " add r0, r0, r1\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._39 @cond_branch\n" + " ldrb r2, [r4, #0x19]\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._38 @cond_branch\n" + " lsl r0, r2, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " add r0, r0, #0x1\n" + " mov r1, r9\n" + " and r0, r0, r1\n" + " mov r1, r8\n" + " and r1, r1, r2\n" + " orr r1, r1, r0\n" + " strb r1, [r4, #0x19]\n" + "._38:\n" + " ldrb r2, [r4, #0x19]\n" + " mov r0, #0xf0\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " bne ._39 @cond_branch\n" + " lsr r1, r2, #0x4\n" + " add r1, r1, #0x1\n" + " lsl r1, r1, #0x4\n" + " add r0, r7, #0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x19]\n" + "._39:\n" + " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1]\n" + " mov r0, sp\n" + " ldrb r0, [r0]\n" + "._36:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._41:\n" + " .align 2, 0\n" + "._40:\n" + " .word gMapObjects\n" + " .word gUnknown_0836DC09\n" + " .word gUnknown_0836DBBC\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else #ifdef NONMATCHING u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c) { @@ -2227,6 +2435,7 @@ _0805ADD8: .4byte gUnknown_0836DBBC\n\ .syntax divided\n"); } #endif +#endif u8 sub_805ADDC(u8 localId) { @@ -2266,11 +2475,38 @@ u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d) return 0; } +#if DEBUG +__attribute__((naked)) +void RemoveFieldObject(struct MapObject *mapObject) +{ + asm( + " push {lr}\n" + " ldrb r2, [r0]\n" + " mov r1, #0x2\n" + " neg r1, r1\n" + " and r1, r1, r2\n" + " strb r1, [r0]\n" + " bl RemoveFieldObjectInternal\n" + " ldr r1, ._72 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " pop {r0}\n" + " bx r0\n" + "._73:\n" + " .align 2, 0\n" + "._72:\n" + " .word gUnknown_Debug_03004BC0\n" + "\n" + ); +} +#else void RemoveFieldObject(struct MapObject *mapObject) { mapObject->active = FALSE; RemoveFieldObjectInternal(mapObject); } +#endif void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { @@ -2303,6 +2539,226 @@ void npc_hide_all_but_player(void) } } +#if DEBUG +__attribute__((naked)) +u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add r7, r1, #0\n" + " add r1, r2, #0\n" + " add r2, r3, #0\n" + " ldr r3, [sp, #0x20]\n" + " ldr r4, [sp, #0x24]\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " lsl r2, r2, #0x18\n" + " lsr r2, r2, #0x18\n" + " lsl r3, r3, #0x10\n" + " lsr r3, r3, #0x10\n" + " mov r9, r3\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " mov sl, r4\n" + " bl InitFieldObjectStateFromTemplate\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " cmp r0, #0x10\n" + " bne ._83 @cond_branch\n" + " mov r0, #0x10\n" + " b ._92\n" + "._83:\n" + " mov r0, r8\n" + " lsl r4, r0, #0x3\n" + " add r0, r4, r0\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._87 @ gMapObjects\n" + " add r5, r0, r1\n" + " ldrb r0, [r5, #0x5]\n" + " bl GetFieldObjectGraphicsInfo\n" + " add r6, r0, #0\n" + " ldrb r1, [r6, #0xc]\n" + " mov r0, #0xf\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._85 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__no_record\n" + " b ._89\n" + "._88:\n" + " .align 2, 0\n" + "._87:\n" + " .word gMapObjects\n" + "._85:\n" + " cmp r0, #0xa\n" + " bne ._89 @cond_branch\n" + " ldrh r0, [r6, #0x2]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x1c\n" + " bl npc_load_two_palettes__and_record\n" + "._89:\n" + " ldrb r0, [r5, #0x6]\n" + " cmp r0, #0x4c\n" + " bne ._90 @cond_branch\n" + " ldrb r0, [r5, #0x1]\n" + " mov r1, #0x20\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + "._90:\n" + " ldr r1, ._93 @ 0xffff\n" + " add r0, r1, #0\n" + " strh r0, [r7, #0x2]\n" + " add r0, r7, #0\n" + " mov r1, #0x0\n" + " mov r2, #0x0\n" + " mov r3, #0x0\n" + " bl CreateSprite\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x40\n" + " bne ._91 @cond_branch\n" + " ldr r1, ._93 + 4 @ gUnknown_Debug_03004BC0\n" + " ldrb r0, [r1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, ._93 + 8 @ gMapObjects\n" + " mov r2, r8\n" + " add r1, r4, r2\n" + " lsl r1, r1, #0x2\n" + " add r1, r1, r0\n" + " ldrb r2, [r1]\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " strb r0, [r1]\n" + " mov r0, #0x10\n" + " b ._92\n" + "._94:\n" + " .align 2, 0\n" + "._93:\n" + " .word 0xffff\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "._91:\n" + " lsl r0, r7, #0x4\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._96 @ gSprites\n" + " add r4, r0, r1\n" + " mov r1, r9\n" + " lsl r0, r1, #0x10\n" + " asr r0, r0, #0x10\n" + " ldrh r2, [r5, #0x10]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " mov r2, sl\n" + " lsl r1, r2, #0x10\n" + " asr r1, r1, #0x10\n" + " ldrh r2, [r5, #0x12]\n" + " add r1, r1, r2\n" + " lsl r1, r1, #0x10\n" + " asr r1, r1, #0x10\n" + " add r2, r4, #0\n" + " add r2, r2, #0x20\n" + " add r3, r4, #0\n" + " add r3, r3, #0x22\n" + " bl sub_8060388\n" + " ldrh r0, [r6, #0x8]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r1, r4, #0\n" + " add r1, r1, #0x28\n" + " strb r0, [r1]\n" + " ldrh r0, [r6, #0xa]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x11\n" + " neg r0, r0\n" + " add r2, r4, #0\n" + " add r2, r2, #0x29\n" + " strb r0, [r2]\n" + " ldrh r0, [r4, #0x20]\n" + " add r0, r0, #0x8\n" + " strh r0, [r4, #0x20]\n" + " ldrh r1, [r4, #0x22]\n" + " add r1, r1, #0x10\n" + " mov r0, #0x0\n" + " ldsb r0, [r2, r0]\n" + " add r0, r0, r1\n" + " strh r0, [r4, #0x22]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x1c\n" + " lsr r1, r1, #0x18\n" + " ldrb r2, [r4, #0x5]\n" + " mov r0, #0xf\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r4, #0x5]\n" + " add r2, r4, #0\n" + " add r2, r2, #0x3e\n" + " ldrb r0, [r2]\n" + " mov r1, #0x2\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " mov r0, r8\n" + " strh r0, [r4, #0x2e]\n" + " strb r7, [r5, #0x4]\n" + " ldrb r1, [r6, #0xc]\n" + " lsl r1, r1, #0x19\n" + " lsr r1, r1, #0x1f\n" + " lsl r1, r1, #0x4\n" + " ldrb r2, [r5, #0x1]\n" + " mov r0, #0x11\n" + " neg r0, r0\n" + " and r0, r0, r2\n" + " orr r0, r0, r1\n" + " strb r0, [r5, #0x1]\n" + " lsl r0, r0, #0x1b\n" + " cmp r0, #0\n" + " blt ._95 @cond_branch\n" + " ldrb r0, [r5, #0x18]\n" + " lsl r0, r0, #0x1c\n" + " lsr r0, r0, #0x1c\n" + " bl FieldObjectDirectionToImageAnimId\n" + " add r1, r0, #0\n" + " lsl r1, r1, #0x18\n" + " lsr r1, r1, #0x18\n" + " add r0, r4, #0\n" + " bl StartSpriteAnim\n" + "._95:\n" + " ldrb r0, [r5, #0xb]\n" + " lsr r0, r0, #0x4\n" + " add r1, r4, #0\n" + " mov r2, #0x1\n" + " bl SetObjectSubpriorityByZCoord\n" + " add r0, r5, #0\n" + " add r1, r4, #0\n" + " bl sub_80634D0\n" + " mov r0, r8\n" + "._92:\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r1}\n" + " bx r1\n" + "._97:\n" + " .align 2, 0\n" + "._96:\n" + " .word gSprites\n" + "\n" + ); +} +#else u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate *sprTemplate, u8 c, u8 d, s16 e, s16 f) { u8 mapObjectId; @@ -2352,6 +2808,7 @@ u8 sub_805AFCC(struct MapObjectTemplate *mapObjTemplate, struct SpriteTemplate * sub_80634D0(mapObject, sprite); return mapObjectId; } +#endif u8 SpawnFieldObject(struct MapObjectTemplate *mapObjTemplate, u8 b, u8 c, s16 d, s16 e) { @@ -2440,7 +2897,7 @@ void MakeObjectTemplateFromFieldObjectTemplate(struct MapObjectTemplate *mapObjT MakeObjectTemplateFromFieldObjectGraphicsInfoWithCallbackIndex(mapObjTemplate->graphicsId, mapObjTemplate->movementType, sprTemplate, subspriteTables); } -u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c, s16 d, u8 subpriority) +u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority) { struct SpriteTemplate spriteTemplate; const struct SubspriteTable *subspriteTables; @@ -2449,7 +2906,7 @@ u8 AddPseudoFieldObject(u16 graphicsId, void (*callback)(struct Sprite *), s16 c MakeObjectTemplateFromFieldObjectGraphicsInfo(graphicsId, callback, &spriteTemplate, &subspriteTables); if (spriteTemplate.paletteTag != 0xFFFF) sub_805BDF8(spriteTemplate.paletteTag); - spriteId = CreateSprite(&spriteTemplate, c, d, subpriority); + spriteId = CreateSprite(&spriteTemplate, x, y, subpriority); if (spriteId != 64 && subspriteTables != NULL) { SetSubspriteTables(&gSprites[spriteId], subspriteTables); @@ -2574,6 +3031,66 @@ void RemoveFieldObjectIfOutsideView(struct MapObject *mapObject) void sub_805B75C(u8, s16, s16); +#if DEBUG +__attribute__((naked)) +void sub_805B710(u16 u161, u16 u162) +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " add r4, r0, #0\n" + " add r5, r1, #0\n" + " lsl r4, r4, #0x10\n" + " lsr r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + " lsr r5, r5, #0x10\n" + " ldr r6, ._153 @ gUnknown_Debug_03004BC0\n" + " mov r0, #0x0\n" + " strb r0, [r6]\n" + " bl ClearPlayerAvatarInfo\n" + " mov r7, #0x0\n" + " ldr r0, ._153 + 4 @ gMapObjects\n" + " mov r8, r0\n" + " lsl r4, r4, #0x10\n" + " lsl r5, r5, #0x10\n" + "._152:\n" + " lsl r0, r7, #0x3\n" + " add r0, r0, r7\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r8\n" + " ldrb r0, [r0]\n" + " lsl r0, r0, #0x1f\n" + " cmp r0, #0\n" + " beq ._151 @cond_branch\n" + " add r0, r7, #0\n" + " asr r1, r4, #0x10\n" + " asr r2, r5, #0x10\n" + " bl sub_805B75C\n" + " ldrb r0, [r6]\n" + " add r0, r0, #0x1\n" + " strb r0, [r6]\n" + "._151:\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0xf\n" + " bls ._152 @cond_branch\n" + " bl sub_805AAB0\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._154:\n" + " .align 2, 0\n" + "._153:\n" + " .word gUnknown_Debug_03004BC0\n" + " .word gMapObjects\n" + "\n" + ); +} +#else void sub_805B710(u16 a, u16 b) { u8 i; @@ -2586,6 +3103,7 @@ void sub_805B710(u16 a, u16 b) } sub_805AAB0(); } +#endif extern void SetPlayerAvatarFieldObjectIdAndObjectId(u8, u8); extern void sub_805B914(struct MapObject *); diff --git a/src/field/field_message_box.c b/src/field/field_message_box.c index 35aac7ac9..5eec7a14b 100644 --- a/src/field/field_message_box.c +++ b/src/field/field_message_box.c @@ -19,8 +19,8 @@ static void PrintFieldMessageFromStringVar4(void); void InitFieldMessageBox(void) { sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; - SetMessageBoxBaseTileNum(gMenuTextWindowContentTileOffset); - InitWindowFromConfig(&gFieldMessageBoxWindow, &gWindowConfig_81E6CE4); + TextWindow_SetDlgFrameBaseTileNum(gMenuTextWindowContentTileOffset); + Text_InitWindowWithTemplate(&gFieldMessageBoxWindow, &gWindowTemplate_81E6CE4); } static void Task_FieldMessageBox(u8 taskId) @@ -29,22 +29,22 @@ static void Task_FieldMessageBox(u8 taskId) switch (task->data[0]) { case 0: - LoadMessageBoxTiles(&gFieldMessageBoxWindow); + TextWindow_LoadDialogueFrameTiles(&gFieldMessageBoxWindow); task->data[0]++; break; case 1: - DrawStandardMessageBox(&gFieldMessageBoxWindow); + TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); task->data[0]++; break; case 2: switch (sMessageBoxMode) { case FIELD_MESSAGE_BOX_NORMAL: - if (!sub_80035AC(&gFieldMessageBoxWindow)) + if (!Text_UpdateWindow(&gFieldMessageBoxWindow)) return; break; case FIELD_MESSAGE_BOX_AUTO_SCROLL: - if (!sub_8003778(&gFieldMessageBoxWindow)) + if (!Text_UpdateWindowAutoscroll(&gFieldMessageBoxWindow)) return; break; } @@ -117,20 +117,20 @@ bool8 unref_sub_8064BD0(const u8 *message) static void PrintFieldMessage(const u8 *message) { StringExpandPlaceholders(gStringVar4, message); - sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); CreateFieldMessageBoxTask(); } static void PrintFieldMessageFromStringVar4(void) { - sub_8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); + Text_InitWindow8002EB0(&gFieldMessageBoxWindow, gStringVar4, gMenuTextTileOffset, 2, 15); CreateFieldMessageBoxTask(); } void HideFieldMessageBox(void) { DestroyFieldMessageBoxTask(); - ClearStandardMessageBox(&gFieldMessageBoxWindow); + TextWindow_EraseDialogueFrame(&gFieldMessageBoxWindow); sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; } @@ -150,6 +150,6 @@ bool8 IsFieldMessageBoxHidden(void) void unref_sub_8064CA0(void) { DestroyFieldMessageBoxTask(); - DrawStandardMessageBox(&gFieldMessageBoxWindow); + TextWindow_DrawDialogueFrame(&gFieldMessageBoxWindow); sMessageBoxMode = FIELD_MESSAGE_BOX_HIDDEN; } diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index d80076be4..a7594372d 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -32,9 +32,9 @@ static void npc_clear_strange_bits(struct MapObject *a); static void MovePlayerAvatarUsingKeypadInput(u8 a, u16 b, u16 c); static void PlayerAllowForcedMovementIfMovingSameDirection(void); static bool8 TryDoMetatileBehaviorForcedMovement(void); -static u8 GetForcedMovementByMetatileBehavior(void); +/*static*/ u8 GetForcedMovementByMetatileBehavior(void); static void MovePlayerNotOnBike(u8 a, u16 b); -static u8 CheckMovementInputNotOnBike(u8 a); +/*static*/ u8 CheckMovementInputNotOnBike(u8 a); static u8 CheckForPlayerAvatarCollision(u8 a); static u8 sub_8058EF0(s16 a, s16 b, u8 c); static bool8 ShouldJumpLedge(s16 a, s16 b, u8 c); @@ -260,12 +260,59 @@ static void PlayerAllowForcedMovementIfMovingSameDirection(void) gPlayerAvatar.flags &= ~PLAYER_AVATAR_FLAG_5; } +#if DEBUG +__attribute__((naked)) +u8 TryDoMetatileBehaviorForcedMovement() +{ + asm( + " push {r4, lr}\n" + " ldr r0, ._27 @ gUnknown_020297ED\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " ldr r0, ._27 + 4 @ gMain\n" + " ldrh r1, [r0, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._25 @cond_branch\n" + " mov r0, #0x0\n" + " b ._26\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word gUnknown_020297ED\n" + " .word gMain\n" + "._25:\n" + " ldr r4, ._29 @ gUnknown_0830FBA0\n" + " bl GetForcedMovementByMetatileBehavior\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x16\n" + " add r0, r0, r4\n" + " ldr r0, [r0]\n" + " bl _call_via_r0\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + "._26:\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "._30:\n" + " .align 2, 0\n" + "._29:\n" + " .word gUnknown_0830FBA0\n" + "\n" + ); +} +#else static bool8 TryDoMetatileBehaviorForcedMovement(void) { return gUnknown_0830FBA0[GetForcedMovementByMetatileBehavior()](); } +#endif -static u8 GetForcedMovementByMetatileBehavior(void) +/*static*/ u8 GetForcedMovementByMetatileBehavior(void) { u8 i; @@ -436,12 +483,57 @@ bool8 ForcedMovement_MuddySlope(void) } } +#if DEBUG +__attribute__((naked)) +void MovePlayerNotOnBike(u8 u81, u16 u161) +{ + asm( + " push {r4, r5, r6, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " add r5, r2, #0\n" + " lsl r1, r1, #0x10\n" + " lsr r6, r1, #0x10\n" + " ldr r0, ._84 @ gUnknown_020297ED\n" + " ldrb r0, [r0]\n" + " cmp r0, #0\n" + " beq ._82 @cond_branch\n" + " add r0, r2, #0\n" + " bl debug_sub_805F2B0\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bne ._83 @cond_branch\n" + "._82:\n" + " ldr r4, ._84 + 4 @ gUnknown_0830FBEC\n" + " add r0, r5, #0\n" + " bl CheckMovementInputNotOnBike\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x16\n" + " add r0, r0, r4\n" + " ldr r2, [r0]\n" + " add r0, r5, #0\n" + " add r1, r6, #0\n" + " bl _call_via_r2\n" + "._83:\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._85:\n" + " .align 2, 0\n" + "._84:\n" + " .word gUnknown_020297ED\n" + " .word gUnknown_0830FBEC\n" + "\n" + ); +} +#else static void MovePlayerNotOnBike(u8 direction, u16 heldKeys) { gUnknown_0830FBEC[CheckMovementInputNotOnBike(direction)](direction, heldKeys); } +#endif -static u8 CheckMovementInputNotOnBike(u8 direction) +/*static*/ u8 CheckMovementInputNotOnBike(u8 direction) { if (direction == DIR_NONE) { @@ -523,7 +615,7 @@ u8 CheckForFieldObjectCollision(struct MapObject *a, s16 x, s16 y, u8 direction, return 5; if (ShouldJumpLedge(x, y, direction)) { - IncrementGameStat(0x2B); + IncrementGameStat(GAME_STAT_JUMPED_DOWN_LEDGES); return COLLISION_LEDGE_JUMP; } if (collision == 4 && sub_8058F6C(x, y, direction)) @@ -1507,7 +1599,7 @@ u8 Fishing4(struct Task *task) { u32 randVal; - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); task->tStep++; task->tFrameCounter = 0; task->tNumDots = 0; @@ -1549,7 +1641,7 @@ u8 Fishing5(struct Task *task) } else { - MenuPrint(dot, task->tNumDots + 4, 15); + Menu_PrintText(dot, task->tNumDots + 4, 15); task->tNumDots++; } } @@ -1573,7 +1665,7 @@ u8 Fishing6(struct Task *task) u8 Fishing7(struct Task *task) { sub_805A954(); - MenuPrint(gOtherText_OhABite, 4, 17); + Menu_PrintText(gOtherText_OhABite, 4, 17); task->tStep++; task->tFrameCounter = 0; return 0; @@ -1624,7 +1716,7 @@ u8 Fishing10(struct Task *task) { sub_805A954(); MenuPrintMessageDefaultCoords(gOtherText_PokeOnHook); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); task->tStep++; task->tFrameCounter = 0; return 0; @@ -1637,7 +1729,7 @@ u8 Fishing11(struct Task *task) if (task->tFrameCounter == 0) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId]; @@ -1647,7 +1739,7 @@ u8 Fishing11(struct Task *task) sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 0, 0); gSprites[gPlayerAvatar.spriteId].pos2.x = 0; gSprites[gPlayerAvatar.spriteId].pos2.y = 0; - MenuZeroFillScreen(); + Menu_EraseScreen(); task->tFrameCounter++; return 0; } @@ -1688,7 +1780,7 @@ u8 Fishing13(struct Task *task) u8 Fishing14(struct Task *task) { sub_805A954(); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); task->tStep++; return 0; } @@ -1713,12 +1805,12 @@ u8 Fishing15(struct Task *task) u8 Fishing16(struct Task *task) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { gPlayerAvatar.preventStep = FALSE; ScriptContext2_Disable(); UnfreezeMapObjects(); - MenuZeroFillScreen(); + Menu_EraseScreen(); sub_80BE97C(0); DestroyTask(FindTaskIdByFunc(Task_Fishing)); } @@ -1763,3 +1855,98 @@ static void sub_805A954(void) if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) sub_8127F28(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1A, 1, playerSprite->pos2.y); } + +#if DEBUG +__attribute__((naked)) +void debug_sub_805F2B0() +{ + asm( + " push {lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " ldr r0, ._422 @ gMain\n" + " ldrh r1, [r0, #0x2c]\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne ._420 @cond_branch\n" + " mov r0, #0x0\n" + " b ._421\n" + "._423:\n" + " .align 2, 0\n" + "._422:\n" + " .word gMain\n" + "._420:\n" + " add r0, r2, #0\n" + " bl debug_sub_805F2DC\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + "._421:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_805F2DC() +{ + asm( + " push {r4, lr}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne ._424 @cond_branch\n" + " ldr r2, ._426 @ gMapObjects\n" + " ldr r0, ._426 + 4 @ gPlayerAvatar\n" + " ldrb r1, [r0, #0x5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r0, [r0, #0x18]\n" + " lsr r0, r0, #0x4\n" + " bl PlayerFaceDirection\n" + " b ._430\n" + "._427:\n" + " .align 2, 0\n" + "._426:\n" + " .word gMapObjects\n" + " .word gPlayerAvatar\n" + "._424:\n" + " ldr r2, ._431 @ gMapObjects\n" + " ldr r0, ._431 + 4 @ gPlayerAvatar\n" + " ldrb r1, [r0, #0x5]\n" + " lsl r0, r1, #0x3\n" + " add r0, r0, r1\n" + " lsl r0, r0, #0x2\n" + " add r0, r0, r2\n" + " ldrb r0, [r0, #0x1]\n" + " lsr r0, r0, #0x7\n" + " cmp r0, #0\n" + " beq ._429 @cond_branch\n" + " add r0, r4, #0\n" + " bl CanCameraMoveInDirection\n" + " cmp r0, #0\n" + " bne ._429 @cond_branch\n" + " add r0, r4, #0\n" + " bl PlayerOnBikeCollide\n" + " b ._430\n" + "._432:\n" + " .align 2, 0\n" + "._431:\n" + " .word gMapObjects\n" + " .word gPlayerAvatar\n" + "._429:\n" + " add r0, r4, #0\n" + " bl PlayerGoSpeed4\n" + "._430:\n" + " mov r0, #0x1\n" + " pop {r4}\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} +#endif diff --git a/src/field/field_poison.c b/src/field/field_poison.c index 49678f269..8365351f9 100644 --- a/src/field/field_poison.c +++ b/src/field/field_poison.c @@ -43,7 +43,7 @@ void MonFaintFromPoisonOnField(u8 partyMember) u32 val = 0; AdjustFriendship(pkmn, 7); - SetMonData(pkmn, MON_DATA_STATUS, (u8*)&val); + SetMonData(pkmn, MON_DATA_STATUS, &val); GetMonData(pkmn, MON_DATA_NICKNAME, gStringVar1); StringGetEnd10(gStringVar1); } @@ -60,38 +60,36 @@ bool32 CheckMonFaintedFromPoison(u8 partyMember) return FALSE; } -//Task data -enum -{ - TD_STATE, - TD_PARTY_MEMBER, -}; +#define tState data[0] +#define tPartyMember data[1] void Task_WhiteOut(u8 taskId) { - s16 *taskData = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; - switch (taskData[TD_STATE]) + switch (tState) { - case 0: //Check if Pokemon have fainted due to poison - while (taskData[TD_PARTY_MEMBER] < 6) + case 0: + // Check if any Pokemon have fainted due to poison + while (tPartyMember < 6) { - if (CheckMonFaintedFromPoison(taskData[TD_PARTY_MEMBER])) + if (CheckMonFaintedFromPoison(tPartyMember)) { - MonFaintFromPoisonOnField(taskData[TD_PARTY_MEMBER]); + // Show message about fainted mon + MonFaintFromPoisonOnField(tPartyMember); ShowFieldMessage(fieldPoisonText_PokemonFainted); - taskData[TD_STATE]++; + tState++; return; } - taskData[TD_PARTY_MEMBER]++; + tPartyMember++; } - taskData[TD_STATE] = 2; + tState = 2; break; - case 1: //Wait for message box to disappear + case 1: // Wait for message box to disappear if (IsFieldMessageBoxHidden()) - taskData[TD_STATE]--; //Check next party member + tState--; // Go to previous step and check next party member break; - case 2: //Done checking Pokemon + case 2: // done checking all mons if (AllMonsFainted()) gSpecialVar_Result = 1; else @@ -102,6 +100,9 @@ void Task_WhiteOut(u8 taskId) } } +#undef tState +#undef tPartyMember + void ExecuteWhiteOut(void) { CreateTask(Task_WhiteOut, 0x50); @@ -115,26 +116,28 @@ s32 DoPoisonFieldEffect(void) u32 numFainting = 0; int i; + // count the number of mons that are poisoned and fainting from poison, + // and decrement HP of all poisoned mons for (i = 0; i < 6; i++) { u32 hp; - // UB: Too few arguments for function 'GetMonData' if (GetMonData(pkmn, MON_DATA_SANITY_BIT2) != 0 && pokemon_ailments_get_primary(GetMonData(pkmn, MON_DATA_STATUS)) == 1) { + // decrement HP of poisoned mon hp = GetMonData(pkmn, MON_DATA_HP); if (hp != 0) hp--; if (hp == 0) - numFainting++; //Pokemon will now faint due to poison + numFainting++; SetMonData(pkmn, MON_DATA_HP, &hp); numPoisoned++; } pkmn++; } if (numFainting != 0 || numPoisoned != 0) - DoFieldPoisonEffect(); + FldeffPoison_Start(); if (numFainting != 0) return 2; if (numPoisoned != 0) diff --git a/src/field/field_region_map.c b/src/field/field_region_map.c index 73e101d8f..54091459f 100644 --- a/src/field/field_region_map.c +++ b/src/field/field_region_map.c @@ -50,13 +50,13 @@ void CB2_FieldInitRegionMap(void) InitRegionMap((void *)&ewram0_5.unk8, 0); CreateRegionMapPlayerIcon(0, 0); CreateRegionMapCursor(1, 1); - SetUpWindowConfig(&gWindowConfig_81E709C); - InitMenuWindow(&gWindowConfig_81E709C); - MenuZeroFillScreen(); + Text_LoadWindowTemplate(&gWindowTemplate_81E709C); + InitMenuWindow(&gWindowTemplate_81E709C); + Menu_EraseScreen(); REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(31) | BGCNT_16COLOR | BGCNT_TXT256x256; - MenuDrawTextWindow(21, 0, 29, 3); + Menu_DrawStdWindowFrame(21, 0, 29, 3); sub_8072BD8(gOtherText_Hoenn, 0x16, 1, 0x38); - MenuDrawTextWindow(16, 16, 29, 19); + Menu_DrawStdWindowFrame(16, 16, 29, 19); sub_813F0C8(); SetMainCallback2(CB2_FieldRegionMap); SetVBlankCallback(VBlankCB_FieldRegionMap); @@ -117,7 +117,7 @@ void sub_813EFDC(void) void sub_813F0C8(void) { - MenuFillWindowRectWithBlankTile(17, 17, 28, 18); + Menu_BlankWindowRect(17, 17, 28, 18); if (ewram0_5.unk8.unk16) - MenuPrint(ewram0_5.unk8.str, 17, 17); + Menu_PrintText(ewram0_5.unk8.str, 17, 17); } diff --git a/src/field/field_screen_effect.c b/src/field/field_screen_effect.c index a472d5a9c..61301c5a9 100644 --- a/src/field/field_screen_effect.c +++ b/src/field/field_screen_effect.c @@ -7,13 +7,13 @@ #include "script.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" const static u16 gUnknown_0839ACDC[] = { 0xC8, 0x48, 0x38, 0x28, 0x18, 0x0 }; const s32 gMaxFlashLevel = 4; -const static struct UnknownTaskStruct gUnknown_0839ACEC = +const static struct ScanlineEffectParams gUnknown_0839ACEC = { (void *)REG_ADDR_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, @@ -64,18 +64,18 @@ static void sub_8081424(u8 taskId) switch (data[0]) { case 0: - sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]); + sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); data[0] = 1; break; case 1: - sub_8081398(&gUnknown_03004DE0[gUnknown_03004DC0.srcBank][0], data[1], data[2], data[3]); + sub_8081398(gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer], data[1], data[2], data[3]); data[0] = 0; data[3] += data[5]; if (data[3] > data[4]) { if (data[6] == 1) { - remove_some_task(); + ScanlineEffect_Stop(); data[0] = 2; } else @@ -85,7 +85,7 @@ static void sub_8081424(u8 taskId) } break; case 2: - dp12_8087EA4(); + ScanlineEffect_Clear(); DestroyTask(taskId); break; } @@ -140,8 +140,8 @@ void sub_80815E0(u8 a1) { if (a1) { - sub_8081398(&gUnknown_03004DE0[0][0], 120, 80, gUnknown_0839ACDC[a1]); - CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480); + sub_8081398(&gScanlineEffectRegBuffers[0][0], 120, 80, gUnknown_0839ACDC[a1]); + CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); } } @@ -208,14 +208,14 @@ static void sub_80816A8(u8 taskId) REG_BLDALPHA = 1804; REG_WININ = 63; REG_WINOUT = 30; - sub_8081398(&gUnknown_03004DE0[0][0], data[2], data[3], 1); - CpuFastSet(&gUnknown_03004DE0[0], &gUnknown_03004DE0[1], 480); - //sub_80895F8(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]); - sub_80895F8(gUnknown_0839ACEC); + sub_8081398(&gScanlineEffectRegBuffers[0][0], data[2], data[3], 1); + CpuFastSet(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 480); + //ScanlineEffect_SetParams(gUnknown_0839ACEC[0], gUnknown_0839ACEC[1], gUnknown_0839ACEC[2]); + ScanlineEffect_SetParams(gUnknown_0839ACEC); data[0] = 1; break; case 1: - MenuFillWindowRectWithBlankTile(0, 0, 29, 19); + Menu_BlankWindowRect(0, 0, 29, 19); sub_808161C(data[1]); sub_8081534(data[2], data[3], 1, 160, 1, 2); data[0] = 2; @@ -264,8 +264,8 @@ static void sub_80816A8(u8 taskId) } break; case 5: - MenuZeroFillWindowRect(0, 0, 29, 19); - LoadFontDefaultPalette(&gWindowConfig_81E6CE4); + Menu_EraseWindowRect(0, 0, 29, 19); + LoadFontDefaultPalette(&gWindowTemplate_81E6CE4); REG_WIN0H = 255; REG_DISPCNT = data[6]; REG_BLDCNT = data[7]; diff --git a/src/field/field_specials.c b/src/field/field_specials.c index fc6f690a3..e56d9ddbb 100644 --- a/src/field/field_specials.c +++ b/src/field/field_specials.c @@ -1058,21 +1058,21 @@ static void sub_810E874(void) ScriptContext2_Enable(); if (gUnknown_0203925A > 5) { - MenuDrawTextWindow(0, 0, 8, 11); + Menu_DrawStdWindowFrame(0, 0, 8, 11); InitMenu(0, 1, 1, 5, 0, 7); gUnknown_0203925C = 0; - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); sub_810ECD4(); } else { - MenuDrawTextWindow(0, 0, 8, 2 * gUnknown_0203925A + 1); + Menu_DrawStdWindowFrame(0, 0, 8, 2 * gUnknown_0203925A + 1); InitMenu(0, 1, 1, gUnknown_0203925A, 0, 7); } for (i = 0; i < 5 && gUnknown_03000760[i].var0 != 16; i ++) { - MenuPrint(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1); + Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[i].var0], 1, 2 * i + 1); } DisplayCurrentElevatorFloor(); CreateTask(sub_810E984, 8); @@ -1080,7 +1080,7 @@ static void sub_810E874(void) void DisplayCurrentElevatorFloor(void) { - MenuDrawTextWindow(20, 0, 29, 5); + Menu_DrawStdWindowFrame(20, 0, 29, 5); sub_8072BD8(gOtherText_NowOn, 21, 1, 64); sub_8072BD8(gUnknown_083F8380[gSpecialVar_0x8005], 21, 3, 64); } @@ -1091,15 +1091,15 @@ void sub_810E984(u8 taskId) if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) { gUnknown_0203925B--; - curMenuPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(-1); + curMenuPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(-1); sub_810EAC8(curMenuPos, DPAD_UP); } if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) { gUnknown_0203925B++; - curMenuPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(+1); + curMenuPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(+1); sub_810EAC8(curMenuPos, DPAD_DOWN); } if (gMain.newKeys & A_BUTTON) @@ -1109,7 +1109,7 @@ void sub_810E984(u8 taskId) { gSpecialVar_Result = 0; PlaySE(SE_SELECT); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } else @@ -1119,7 +1119,7 @@ void sub_810E984(u8 taskId) ShakeScreenInElevator(); FieldObjectTurnByLocalIdAndMap(gSpecialVar_LastTalked, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup, DIR_SOUTH); sub_810EEDC(); - MenuZeroFillScreen(); + Menu_EraseScreen(); DestroyTask(taskId); } } @@ -1128,7 +1128,7 @@ void sub_810E984(u8 taskId) gSpecialVar_Result = 0; PlaySE(SE_SELECT); sub_810EEDC(); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } } @@ -1163,10 +1163,10 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) if (flag) { sub_810EB90(newPos, 5); - MenuFillWindowRectWithBlankTile(2, 1, 7, 10); + Menu_BlankWindowRect(2, 1, 7, 10); for (i=0; i<5 && gUnknown_03000760[newPos].var0 != 16; newPos++, i++) { - MenuPrint(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1); + Menu_PrintText(gUnknown_083F8380[gUnknown_03000760[newPos].var0], 1, i * 2 + 1); } } return flag; @@ -1227,7 +1227,7 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) "\tmovs r1, 0x1\n" "\tmovs r2, 0x7\n" "\tmovs r3, 0xA\n" - "\tbl MenuFillWindowRectWithBlankTile\n" + "\tbl Menu_BlankWindowRect\n" "\tmovs r5, 0\n" "\tldr r2, _0810EB88 @ =gUnknown_03000760\n" "\tlsls r1, r4, 2\n" @@ -1249,7 +1249,7 @@ bool8 sub_810EAC8(u8 prevMenuPos, u8 dpadInput) "\tlsls r2, 24\n" "\tlsrs r2, 24\n" "\tmovs r1, 0x1\n" - "\tbl MenuPrint\n" + "\tbl Menu_PrintText\n" "\tadds r0, r4, 0x1\n" "\tlsls r0, 24\n" "\tlsrs r4, r0, 24\n" @@ -1283,7 +1283,7 @@ void sub_810EB90(u8 newPos, u8 maxItems) if (newPos == 0) { gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); } else { @@ -1296,7 +1296,7 @@ void sub_810EB90(u8 newPos, u8 maxItems) else if (newPos + maxItems == gUnknown_0203925A) { gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } } @@ -1347,7 +1347,7 @@ void sub_810ECB0(void) if (gUnknown_0203925C >> 1 != 1) { gUnknown_0203925C |= 0x2; - CreateVerticalScrollIndicators(0, 0x24, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0x24, 0x08); } } @@ -1356,7 +1356,7 @@ void sub_810ECD4(void) if ((gUnknown_0203925C & 1) == 0) { gUnknown_0203925C |= 0x1; - CreateVerticalScrollIndicators(1, 0x24, 0x48); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x24, 0x48); } } @@ -1428,11 +1428,11 @@ void sub_810EEDC(void) { if ((gUnknown_0203925C & 1) != 0) { - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } if ((gUnknown_0203925C >> 1) == 1) { - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); } BuyMenuFreeMemory(); } @@ -1539,15 +1539,15 @@ void ShowGlassWorkshopMenu(void) { u8 i; ScriptContext2_Enable(); - MenuDrawTextWindow(0, 0, 10, 11); + Menu_DrawStdWindowFrame(0, 0, 10, 11); InitMenu(0, 1, 1, 5, 0, 9); gUnknown_0203925C = 0; - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); sub_810F2B4(); for (i=0; i<5; i++) { - MenuPrint(gUnknown_083F83C0[i], 1, 2 * i + 1); + Menu_PrintText(gUnknown_083F83C0[i], 1, 2 * i + 1); } gUnknown_0203925B = 0; gUnknown_0203925A = ARRAY_COUNT(gUnknown_083F83C0); @@ -1560,33 +1560,33 @@ void sub_810F118(u8 taskId) if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) { gUnknown_0203925B--; - prevCursorPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(-1); + prevCursorPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(-1); sub_810F1F4(prevCursorPos, DPAD_UP); } if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) { gUnknown_0203925B++; - prevCursorPos = GetMenuCursorPos(); - MoveMenuCursorNoWrap(1); + prevCursorPos = Menu_GetCursorPos(); + Menu_MoveCursorNoWrap(1); sub_810F1F4(prevCursorPos, DPAD_DOWN); } if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); gSpecialVar_Result = gUnknown_0203925B; PlaySE(SE_SELECT); sub_810EEDC(); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); gSpecialVar_Result = 0x7f; PlaySE(SE_SELECT); sub_810EEDC(); - MenuZeroFillWindowRect(0, 0, 29, 12); + Menu_EraseWindowRect(0, 0, 29, 12); sub_810EC9C(taskId); } } @@ -1621,10 +1621,10 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) if (flag) { GlassWorkshopUpdateScrollIndicators(newPos, 5); - MenuFillWindowRectWithBlankTile(2, 1, 9, 10); + Menu_BlankWindowRect(2, 1, 9, 10); for (i=0; i<5; newPos++, i++) { - MenuPrint(gUnknown_083F83C0[newPos], 1, 2 * i + 1); + Menu_PrintText(gUnknown_083F83C0[newPos], 1, 2 * i + 1); } } return flag; @@ -1683,7 +1683,7 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) "\tmovs r1, 0x1\n" "\tmovs r2, 0x9\n" "\tmovs r3, 0xA\n" - "\tbl MenuFillWindowRectWithBlankTile\n" + "\tbl Menu_BlankWindowRect\n" "\tmovs r5, 0\n" "\tldr r7, _0810F28C @ =gUnknown_083F83C0\n" "_0810F25C:\n" @@ -1695,7 +1695,7 @@ bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) "\tlsls r2, 24\n" "\tlsrs r2, 24\n" "\tmovs r1, 0x1\n" - "\tbl MenuPrint\n" + "\tbl Menu_PrintText\n" "\tadds r0, r4, 0x1\n" "\tlsls r0, 24\n" "\tlsrs r4, r0, 24\n" @@ -1721,7 +1721,7 @@ void sub_810F290(void) if (gUnknown_0203925C >> 1 != 1) { gUnknown_0203925C |= 0x02; - CreateVerticalScrollIndicators(0, 0x2c, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0x2c, 0x08); } } @@ -1730,7 +1730,7 @@ void sub_810F2B4(void) if (!(gUnknown_0203925C & 0x01)) { gUnknown_0203925C |= 0x01; - CreateVerticalScrollIndicators(1, 0x2c, 0x58); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0x2c, 0x58); } } @@ -1739,7 +1739,7 @@ void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) if (newPos == 0) { gUnknown_0203925C ^= 0x02; - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); } else { @@ -1752,7 +1752,7 @@ void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) else if (newPos + maxItems == gUnknown_0203925A) { gUnknown_0203925C ^= 0x01; - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } } diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 4a819bddf..fbc5431ae 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -13,7 +13,13 @@ #include "trig.h" #include "ewram.h" -#define MACRO1(a) ((((a) >> 1) & 0xF) | (((a) >> 2) & 0xF0) | (((a) >> 3) & 0xF00)) +#define MACRO1(color) ((((color) >> 1) & 0xF) | (((color) >> 2) & 0xF0) | (((color) >> 3) & 0xF00)) + +enum { + GAMMA_NONE, + GAMMA_NORMAL, + GAMMA_ALT, +}; struct RGBColor { @@ -24,7 +30,7 @@ struct RGBColor struct WeatherPaletteData { - u16 data[0][0x1000]; // unknown length + u16 gammaShiftColors[8][0x1000]; // 0x1000 is the number of bytes that make up all palettes. }; struct WeatherCallbacks @@ -35,10 +41,14 @@ struct WeatherCallbacks bool8 (*finish)(void); }; -extern struct Weather gWeather; -extern u8 gUnknown_0202FF38[]; -extern u16 gUnknown_0202FF58; -IWRAM_DATA const u8 *gUnknown_030006DC; +EWRAM_DATA struct Weather gWeather = {0}; +EWRAM_DATA u8 gFieldEffectPaletteGammaTypes[32] = {0}; +EWRAM_DATA u16 gUnknown_0202FF58 = 0; +#if DEBUG +EWRAM_DATA u16 gUnknown_Debug_20301FE = 0; +#endif + +static const u8 *sPaletteGammaTypes; const u8 DroughtPaletteData_0[] = INCBIN_U8("graphics/weather/drought0.bin.lz"); const u8 DroughtPaletteData_1[] = INCBIN_U8("graphics/weather/drought1.bin.lz"); @@ -46,8 +56,6 @@ const u8 DroughtPaletteData_2[] = INCBIN_U8("graphics/weather/drought2.bin.lz"); const u8 DroughtPaletteData_3[] = INCBIN_U8("graphics/weather/drought3.bin.lz"); const u8 DroughtPaletteData_4[] = INCBIN_U8("graphics/weather/drought4.bin.lz"); const u8 DroughtPaletteData_5[] = INCBIN_U8("graphics/weather/drought5.bin.lz"); -extern u8 (*gUnknown_0202FC48)[32]; -extern u8 gUnknown_0202F9E8[32]; static const u8 *const sCompressedDroughtPalettes[] = { @@ -57,7 +65,7 @@ static const u8 *const sCompressedDroughtPalettes[] = DroughtPaletteData_3, DroughtPaletteData_4, DroughtPaletteData_5, - gSharedMem, + (u8*)eDroughtPaletteData.gammaShiftColors, }; // This is a pointer to gWeather. All code in this file accesses gWeather directly, @@ -66,6 +74,18 @@ static const u8 *const sCompressedDroughtPalettes[] = // this file produces the same result as accessing gWeather directly. struct Weather *const gWeatherPtr = &gWeather; +static bool8 LightenSpritePaletteInFog(u8); +static void BuildGammaShiftTables(void); +static void UpdateWeatherGammaShift(void); +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex); +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor); +static void ApplyFogBlend(u8 blendCoeff, u16 blendColor); +static bool8 FadeInScreen_RainShowShade(void); +static bool8 FadeInScreen_Drought(void); +static bool8 FadeInScreen_Fog1(void); +static void FadeInScreenWithWeather(void); +static void DoNothing(void); void None_Init(void); void None_Main(void); bool8 None_Finish(void); @@ -109,10 +129,10 @@ void Fog1_InitVars(void); void Fog1_Main(void); void Fog1_InitAll(void); bool8 Fog1_Finish(void); -void Weather11_InitVars(void); -void Weather11_Main(void); -void Weather11_InitAll(void); -bool8 Weather11_Finish(void); +void Shade_InitVars(void); +void Shade_Main(void); +void Shade_InitAll(void); +bool8 Shade_Finish(void); void Drought_InitVars(void); void Drought_Main(void); void Drought_InitAll(void); @@ -131,7 +151,7 @@ static const struct WeatherCallbacks sWeatherFuncs[] = {None_Init, None_Main, None_Init, None_Finish}, {Clouds_InitVars, Clouds_Main, Clouds_InitAll, Clouds_Finish}, {Weather2_InitVars, Weather2_Main, Weather2_InitAll, Weather2_Finish}, - {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, // light rain + {LightRain_InitVars, LightRain_Main, LightRain_InitAll, LightRain_Finish}, {Snow_InitVars, Snow_Main, Snow_InitAll, Snow_Finish}, {MedRain_InitVars, Rain_Main, MedRain_InitAll, Rain_Finish}, {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, @@ -139,68 +159,112 @@ static const struct WeatherCallbacks sWeatherFuncs[] = {Sandstorm_InitVars, Sandstorm_Main, Sandstorm_InitAll, Sandstorm_Finish}, {Fog2_InitVars, Fog2_Main, Fog2_InitAll, Fog2_Finish}, {Fog1_InitVars, Fog1_Main, Fog1_InitAll, Fog1_Finish}, - {Weather11_InitVars, Weather11_Main, Weather11_InitAll, Weather11_Finish}, + {Shade_InitVars, Shade_Main, Shade_InitAll, Shade_Finish}, {Drought_InitVars, Drought_Main, Drought_InitAll, Drought_Finish}, {HeavyRain_InitVars, Rain_Main, HeavyRain_InitAll, Rain_Finish}, {Bubbles_InitVars, Bubbles_Main, Bubbles_InitAll, Bubbles_Finish}, }; -void (*const gUnknown_083970B8[])(void) = +void (*const gWeatherPalStateFuncs[])(void) = { - sub_807CC24, - sub_807CCAC, - nullsub_39, - nullsub_39, + UpdateWeatherGammaShift, // WEATHER_PAL_STATE_CHANGING_WEATHER + FadeInScreenWithWeather, // WEATHER_PAL_STATE_SCREEN_FADING_IN + DoNothing, // WEATHER_PAL_STATE_SCREEN_FADING_OUT + DoNothing, // WEATHER_PAL_STATE_IDLE }; -const u8 gUnknown_083970C8[] = +// This table specifies which of the gamma shift tables should be +// applied to each of the background and sprite palettes. +static const u8 sBasePaletteGammaTypes[32] = { - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 2, - 1, - 2, - 2, - 2, - 2, - 1, - 1, - 1, - 1, - 2, - 1, - 1, - 1, - 1, - 1, + // background palettes + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NONE, + GAMMA_NONE, + // sprite palettes + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_ALT, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, + GAMMA_NORMAL, }; +#if DEBUG + +const u8 gDebugText_Weather_0[] = _("なし "); +const u8 gDebugText_Weather_1[] = _("はれ "); +const u8 gDebugText_Weather_2[] = _("はれ2 "); +const u8 gDebugText_Weather_3[] = _("あめ "); +const u8 gDebugText_Weather_4[] = _("ゆき "); +const u8 gDebugText_Weather_5[] = _("かみなり "); +const u8 gDebugText_Weather_6[] = _("きり "); +const u8 gDebugText_Weather_7[] = _("かざんばい"); +const u8 gDebugText_Weather_8[] = _("すなあらし"); +const u8 gDebugText_Weather_9[] = _("きり2 "); +const u8 gDebugText_Weather_10[] = _("かいてい "); +const u8 gDebugText_Weather_11[] = _("くもり "); +const u8 gDebugText_Weather_12[] = _("はれ3 "); +const u8 gDebugText_Weather_13[] = _("おおあめ"); +const u8 gDebugText_Weather_14[] = _("かいてい2"); + +const u8 *const gDebugText_Weather[] = +{ + gDebugText_Weather_0, + gDebugText_Weather_1, + gDebugText_Weather_2, + gDebugText_Weather_3, + gDebugText_Weather_4, + gDebugText_Weather_5, + gDebugText_Weather_6, + gDebugText_Weather_7, + gDebugText_Weather_8, + gDebugText_Weather_9, + gDebugText_Weather_10, + gDebugText_Weather_11, + gDebugText_Weather_12, + gDebugText_Weather_13, + gDebugText_Weather_14, +}; + +#endif + const u16 gUnknown_083970E8[] = INCBIN_U16("graphics/weather/0.gbapal"); void StartWeather(void) { u8 index; + if (!FuncIsActiveTask(Task_WeatherMain)) { index = AllocSpritePalette(0x1200); CpuCopy32(gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); - sub_807CB10(); - gWeatherPtr->unknown_6D5 = index; - gWeatherPtr->unknown_6D4 = AllocSpritePalette(0x1201); + BuildGammaShiftTables(); + gWeatherPtr->altGammaSpritePalIndex = index; + gWeatherPtr->weatherPicSpritePalIndex = AllocSpritePalette(0x1201); gWeatherPtr->rainSpriteCount = 0; gWeatherPtr->unknown_6D8 = 0; gWeatherPtr->cloudSpritesCreated = 0; @@ -211,49 +275,53 @@ void StartWeather(void) gWeatherPtr->sandstormSprites1Created = 0; gWeatherPtr->sandstormSprites2Created = 0; gWeatherPtr->unknown_72E = 0; - gWeatherPtr->unknown_6FA = 0; + gWeatherPtr->lightenedFogSpritePalsCount = 0; Weather_SetBlendCoeffs(16, 0); gWeatherPtr->currWeather = 0; - gWeatherPtr->unknown_6C6 = 3; - gWeatherPtr->unknown_6C8 = 0; - gWeatherPtr->unknown_6D3 = 1; - gWeatherPtr->unknown_6C9 = CreateTask(Task_WeatherInit, 80); + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; + gWeatherPtr->readyForInit = FALSE; + gWeatherPtr->weatherChangeComplete = TRUE; + gWeatherPtr->taskId = CreateTask(Task_WeatherInit, 80); } } -void DoWeatherEffect(u8 effect) +void ChangeWeather(u8 weather) { - if (effect != WEATHER_RAIN_LIGHT && effect != WEATHER_RAIN_MED && effect != WEATHER_RAIN_HEAVY) + if (weather != WEATHER_RAIN_LIGHT && weather != WEATHER_RAIN_MED && weather != WEATHER_RAIN_HEAVY) { PlayRainSoundEffect(); } - if (gWeatherPtr->nextWeather != effect && gWeatherPtr->currWeather == effect) + + if (gWeatherPtr->nextWeather != weather && gWeatherPtr->currWeather == weather) { - sWeatherFuncs[effect].initVars(); + sWeatherFuncs[weather].initVars(); } - gWeatherPtr->unknown_6D3 = 0; - gWeatherPtr->nextWeather = effect; + + gWeatherPtr->weatherChangeComplete = FALSE; + gWeatherPtr->nextWeather = weather; gWeatherPtr->finishStep = 0; } -void sub_807C988(u8 effect) +void sub_807C988(u8 weather) { PlayRainSoundEffect(); - gWeatherPtr->currWeather = effect; - gWeatherPtr->nextWeather = effect; + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; } -void sub_807C9B4(u8 effect) +void sub_807C9B4(u8 weather) { PlayRainSoundEffect(); - gWeatherPtr->currWeather = effect; - gWeatherPtr->nextWeather = effect; - gWeatherPtr->unknown_6C8 = 1; + gWeatherPtr->currWeather = weather; + gWeatherPtr->nextWeather = weather; + gWeatherPtr->readyForInit = TRUE; } void Task_WeatherInit(u8 taskId) { - if (gWeatherPtr->unknown_6C8) + // Waits until it's ok to initialize weather. + // When the screen fades in, this is set to TRUE. + if (gWeatherPtr->readyForInit) { sWeatherFuncs[gWeatherPtr->currWeather].initAll(); gTasks[taskId].func = Task_WeatherMain; @@ -266,24 +334,26 @@ void Task_WeatherMain(u8 taskId) { if (!sWeatherFuncs[gWeatherPtr->currWeather].finish()) { + // Finished cleaning up previous weather. Now transition to next weather. sWeatherFuncs[gWeatherPtr->nextWeather].initVars(); - gWeatherPtr->unknown_6C3 = 0; - gWeatherPtr->unknown_6C6 = 0; + gWeatherPtr->gammaStepFrameCounter = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; gWeatherPtr->currWeather = gWeatherPtr->nextWeather; - gWeatherPtr->unknown_6D3 = 1; + gWeatherPtr->weatherChangeComplete = TRUE; } } else { sWeatherFuncs[gWeatherPtr->currWeather].main(); } - gUnknown_083970B8[gWeatherPtr->unknown_6C6](); + + gWeatherPalStateFuncs[gWeatherPtr->palProcessingState](); } void None_Init(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; } void None_Main(void) @@ -295,7 +365,10 @@ u8 None_Finish(void) return 0; } -void sub_807CB10(void) +// Builds two tables that contain gamma shifts for palette colors. +// It's unclear why the two tables aren't declared as const arrays, since +// this function always builds the same two tables. +static void BuildGammaShiftTables(void) { u16 v0; u8 (*v1)[32]; @@ -308,15 +381,15 @@ void sub_807CB10(void) u16 v11; s16 dunno; - gUnknown_030006DC = gUnknown_083970C8; + sPaletteGammaTypes = sBasePaletteGammaTypes; for (v0 = 0; v0 <= 1; v0++) { if (v0 == 0) - v1 = gWeatherPtr->unknown_200; + v1 = gWeatherPtr->gammaShifts; else - v1 = gWeatherPtr->unk460; + v1 = gWeatherPtr->altGammaShifts; - for (v2 = 0; (u16)v2 <= 0x1f; v2++) + for (v2 = 0; v2 < 32; v2++) { v4 = v2 << 8; if (v0 == 0) @@ -335,88 +408,86 @@ void sub_807CB10(void) v10 += 0xf; } v11 = v10 >> 4; - if (v2 <= 0xb) + if (v2 < 12) { - for (; v6 <= 0x12; v6++) + for (; v6 < 19; v6++) { v4 += v11; dunno = v4 - v9; if (dunno > 0) - { v4 -= (dunno + ((u16)dunno >> 15)) >> 1; - } v1[v6][v2] = v4 >> 8; if (v1[v6][v2] > 0x1f) - { v1[v6][v2] = 0x1f; - } } } else { - for (; v6 <= 0x12; v6++) + for (; v6 < 19; v6++) { v4 += v11; v1[v6][v2] = v4 >> 8; if (v1[v6][v2] > 0x1f) - { v1[v6][v2] = 0x1f; - } } } } } } -void sub_807CC24(void) +// When the weather is changing, it gradually updates the palettes +// towards the desired gamma shift. +static void UpdateWeatherGammaShift(void) { - if (gWeatherPtr->unknown_6C0 == gWeatherPtr->unknown_6C1) + if (gWeatherPtr->gammaIndex == gWeatherPtr->gammaTargetIndex) { - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } else { - if (++gWeatherPtr->unknown_6C3 >= gWeatherPtr->unknown_6C2) + if (++gWeatherPtr->gammaStepFrameCounter >= gWeatherPtr->gammaStepDelay) { - gWeatherPtr->unknown_6C3 = 0; - if (gWeatherPtr->unknown_6C0 < gWeatherPtr->unknown_6C1) - gWeatherPtr->unknown_6C0++; + gWeatherPtr->gammaStepFrameCounter = 0; + if (gWeatherPtr->gammaIndex < gWeatherPtr->gammaTargetIndex) + gWeatherPtr->gammaIndex++; else - gWeatherPtr->unknown_6C0--; - sub_807CEBC(0, 0x20, gWeatherPtr->unknown_6C0); + gWeatherPtr->gammaIndex--; + + ApplyGammaShift(0, 32, gWeatherPtr->gammaIndex); } } } -void sub_807CCAC(void) +static void FadeInScreenWithWeather(void) { if (++gWeatherPtr->unknown_6CB > 1) gWeatherPtr->unknown_6CA = 0; + switch (gWeatherPtr->currWeather) { case WEATHER_RAIN_LIGHT: case WEATHER_RAIN_MED: case WEATHER_RAIN_HEAVY: case WEATHER_SNOW: - case WEATHER_DARK: - if (sub_807CDC4() == 0) + case WEATHER_SHADE: + if (FadeInScreen_RainShowShade() == FALSE) { - gWeatherPtr->unknown_6C0 = 3; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_DROUGHT: - if (sub_807CE24() == 0) + if (FadeInScreen_Drought() == FALSE) { - gWeatherPtr->unknown_6C0 = -6; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = -6; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_FOG_1: - if (sub_807CE7C() == 0) + if (FadeInScreen_Fog1() == FALSE) { - gWeatherPtr->unknown_6C0 = 0; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = 0; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; case WEATHER_ASH: @@ -426,71 +497,78 @@ void sub_807CCAC(void) default: if (!gPaletteFade.active) { - gWeatherPtr->unknown_6C0 = gWeatherPtr->unknown_6C1; - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->gammaIndex = gWeatherPtr->gammaTargetIndex; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } break; } } -u8 sub_807CDC4(void) +bool8 FadeInScreen_RainShowShade(void) { - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - if (++gWeatherPtr->unknown_6C7 >= 0x10) + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) { - sub_807CEBC(0, 0x20, 3); - gWeatherPtr->unknown_6C7 = 0x10; - return 0; + ApplyGammaShift(0, 32, 3); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; } - sub_807D1BC(0, 0x20, 3, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); - return 1; + + ApplyGammaShiftWithBlend(0, 32, 3, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -u8 sub_807CE24(void) +bool8 FadeInScreen_Drought(void) { - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - if (++gWeatherPtr->unknown_6C7 >= 0x10) + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + if (++gWeatherPtr->fadeScreenCounter >= 16) { - sub_807CEBC(0, 0x20, -6); - gWeatherPtr->unknown_6C7 = 0x10; - return 0; + ApplyGammaShift(0, 32, -6); + gWeatherPtr->fadeScreenCounter = 16; + return FALSE; } - sub_807D304(-6, 0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); - return 1; -} -u8 sub_807CE7C(void) -{ - if (gWeatherPtr->unknown_6C7 == 0x10) - return 0; - ++gWeatherPtr->unknown_6C7; - sub_807D424(0x10 - gWeatherPtr->unknown_6C7, gWeatherPtr->unknown_6C4); - return 1; + ApplyDroughtGammaShiftWithBlend(-6, 16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -void nullsub_39(void) +bool8 FadeInScreen_Fog1(void) { + if (gWeatherPtr->fadeScreenCounter == 16) + return FALSE; + + gWeatherPtr->fadeScreenCounter++; + ApplyFogBlend(16 - gWeatherPtr->fadeScreenCounter, gWeatherPtr->fadeDestColor); + return TRUE; } -void sub_807CEBC(u8 a, u8 b, s8 c) +static void DoNothing(void) +{ } + +static void ApplyGammaShift(u8 startPalIndex, u8 numPalettes, s8 gammaIndex) { - u16 r4; + u16 curPalIndex; u16 palOffset; - u8 *r6; + u8 *gammaTable; u16 i; - if (c > 0) + if (gammaIndex > 0) { - c = c - 1; - palOffset = a * 16; - b += a; - r4 = a; - while (r4 < b) + gammaIndex--; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + // Loop through the speficied palette range and apply necessary gamma shifts to the colors. + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { + // No palette change. CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } @@ -498,25 +576,27 @@ void sub_807CEBC(u8 a, u8 b, s8 c) { u8 r, g, b; - if (gUnknown_030006DC[r4] == 2 || r4 - 16 == gWeatherPtr->unknown_6D5) - r6 = gWeatherPtr->unk460[c]; + if (sPaletteGammaTypes[curPalIndex] == GAMMA_ALT || curPalIndex - 16 == gWeatherPtr->altGammaSpritePalIndex) + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; else - r6 = gWeatherPtr->unknown_200[c]; - if (r4 == 16 || r4 > 0x1B) + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; + + if (curPalIndex == 16 || curPalIndex > 27) { for (i = 0; i < 16; i++) { - if (gPlttBufferUnfaded[palOffset] == 0x2D9F) + if (gPlttBufferUnfaded[palOffset] == RGB(31, 12, 11)) { + // Skip gamma shift for this specific color. (Why?) palOffset++; } else { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - - r = r6[color.r]; - g = r6[color.g]; - b = r6[color.b]; + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } @@ -525,39 +605,45 @@ void sub_807CEBC(u8 a, u8 b, s8 c) { for (i = 0; i < 16; i++) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - - r = r6[color.r]; - g = r6[color.g]; - b = r6[color.b]; + // Apply gamma shift to the original color. + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + r = gammaTable[baseColor.r]; + g = gammaTable[baseColor.g]; + b = gammaTable[baseColor.b]; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } } - r4++; + + curPalIndex++; } } - else if (c < 0) + else if (gammaIndex < 0) { - c = -c - 1; - palOffset = a * 16; - b += a; - r4 = a; - while (r4 < b) + // A negative gammIndex value means that the blending will come from the special Drought weather's palette tables. + gammaIndex = -gammaIndex - 1; + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { + // No palette change. CpuFastCopy(gPlttBufferUnfaded + palOffset, gPlttBufferFaded + palOffset, 16 * sizeof(u16)); palOffset += 16; } else { - if (r4 == 16 || r4 > 0x1B) + if (curPalIndex == 16 || curPalIndex > 27) { for (i = 0; i < 16; i++) { - if (gPlttBufferUnfaded[palOffset] != 0x2D9F) - gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])]; + // Skip gamma shift for this specific color. (Why?) + if (gPlttBufferUnfaded[palOffset] != RGB(31, 12, 11)) + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; + palOffset++; } } @@ -565,93 +651,100 @@ void sub_807CEBC(u8 a, u8 b, s8 c) { for (i = 0; i < 16; i++) { - gPlttBufferFaded[palOffset] = eWeatherPaletteData.data[c][MACRO1(gPlttBufferUnfaded[palOffset])]; + gPlttBufferFaded[palOffset] = eDroughtPaletteData.gammaShiftColors[gammaIndex][MACRO1(gPlttBufferUnfaded[palOffset])]; palOffset++; } } } - r4++; + + curPalIndex++; } } else { - CpuFastCopy(gPlttBufferUnfaded + a * 16, gPlttBufferFaded + a * 16, b * 16 * sizeof(u16)); + // No palette blending. + CpuFastCopy(gPlttBufferUnfaded + startPalIndex * 16, gPlttBufferFaded + startPalIndex * 16, numPalettes * 16 * sizeof(u16)); } } -void sub_807D1BC(u8 a1, u8 a2, s8 c, u8 d, u16 e) +static void ApplyGammaShiftWithBlend(u8 startPalIndex, u8 numPalettes, s8 gammaIndex, u8 blendCoeff, u16 blendColor) { u16 palOffset; - u16 r4; + u16 curPalIndex; u16 i; - struct RGBColor color = *(struct RGBColor *)&e; - u8 r_ = color.r; - u8 g_ = color.g; - u8 b_ = color.b; - - palOffset = a1 * 16; - a2 += a1; - c = c - 1; - r4 = a1; - while (r4 < a2) + struct RGBColor color = *(struct RGBColor *)&blendColor; + u8 rBlend = color.r; + u8 gBlend = color.g; + u8 bBlend = color.b; + + palOffset = startPalIndex * 16; + numPalettes += startPalIndex; + gammaIndex--; + curPalIndex = startPalIndex; + + while (curPalIndex < numPalettes) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { - BlendPalette(palOffset, 16, d, e); + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { - u8 *r5; + u8 *gammaTable; - if (gUnknown_030006DC[r4] == 1) - r5 = gWeatherPtr->unknown_200[c]; + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NORMAL) + gammaTable = gWeatherPtr->gammaShifts[gammaIndex]; else - r5 = gWeatherPtr->unk460[c]; + gammaTable = gWeatherPtr->altGammaShifts[gammaIndex]; for (i = 0; i < 16; i++) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; - u8 r = r5[color.r]; - u8 g = r5[color.g]; - u8 b = r5[color.b]; - - r += ((r_ - r) * d) >> 4; - g += ((g_ - g) * d) >> 4; - b += ((b_ - b) * d) >> 4; + struct RGBColor baseColor = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; + u8 r = gammaTable[baseColor.r]; + u8 g = gammaTable[baseColor.g]; + u8 b = gammaTable[baseColor.b]; + + // Apply gamma shift and target blend color to the original color. + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b << 10) | (g << 5) | r; } } - r4++; + + curPalIndex++; } } -void sub_807D304(s8 a, u8 coeff, u16 c) +void ApplyDroughtGammaShiftWithBlend(s8 gammaIndex, u8 blendCoeff, u16 blendColor) { struct RGBColor color; - u8 r_; - u8 g_; - u8 b_; - u16 r4; + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; u16 palOffset; - u16 r12; + u16 i; - a = -a - 1; - color = *(struct RGBColor *)&c; - r_ = color.r; - g_ = color.g; - b_ = color.b; + gammaIndex = -gammaIndex - 1; + color = *(struct RGBColor *)&blendColor; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; palOffset = 0; - for (r4 = 0; r4 < 32; r4++) + for (curPalIndex = 0; curPalIndex < 32; curPalIndex++) { - if (gUnknown_030006DC[r4] == 0) + if (sPaletteGammaTypes[curPalIndex] == GAMMA_NONE) { - BlendPalette(palOffset, 16, coeff, c); + // No gamma shift. Simply blend the colors. + BlendPalette(palOffset, 16, blendCoeff, blendColor); palOffset += 16; } else { - for (r12 = 0; r12 < 16; r12++) + for (i = 0; i < 16; i++) { u32 offset; struct RGBColor color1; @@ -665,14 +758,14 @@ void sub_807D304(s8 a, u8 coeff, u16 c) b1 = color1.b; offset = ((b1 & 0x1E) << 7) | ((g1 & 0x1E) << 3) | ((r1 & 0x1E) >> 1); - color2 = *(struct RGBColor *)&eWeatherPaletteData.data[a][offset]; + color2 = *(struct RGBColor *)&eDroughtPaletteData.gammaShiftColors[gammaIndex][offset]; r2 = color2.r; g2 = color2.g; b2 = color2.b; - r2 += ((r_ - r2) * coeff) >> 4; - g2 += ((g_ - g2) * coeff) >> 4; - b2 += ((b_ - b2) * coeff) >> 4; + r2 += ((rBlend - r2) * blendCoeff) >> 4; + g2 += ((gBlend - g2) * blendCoeff) >> 4; + b2 += ((bBlend - b2) * blendCoeff) >> 4; gPlttBufferFaded[palOffset++] = (b2 << 10) | (g2 << 5) | r2; } @@ -680,33 +773,30 @@ void sub_807D304(s8 a, u8 coeff, u16 c) } } -bool8 sub_807D574(u8); - -void sub_807D424(u8 a, u16 b) +void ApplyFogBlend(u8 blendCoeff, u16 blendColor) { struct RGBColor color; - u8 r_; - u8 g_; - u8 b_; - u16 r4; - - BlendPalette(0, 0x100, a, b); - color = *(struct RGBColor *)&b; - r_ = color.r; - g_ = color.g; - b_ = color.b; - - r4 = 16; - while (r4 < 32) + u8 rBlend; + u8 gBlend; + u8 bBlend; + u16 curPalIndex; + + BlendPalette(0, 0x100, blendCoeff, blendColor); + color = *(struct RGBColor *)&blendColor; + rBlend = color.r; + gBlend = color.g; + bBlend = color.b; + + for (curPalIndex = 16; curPalIndex < 32; curPalIndex++) { - if (sub_807D574(r4)) + if (LightenSpritePaletteInFog(curPalIndex)) { - u16 r12 = (r4 + 1) * 16; - u16 r6 = r4 * 16; + u16 palEnd = (curPalIndex + 1) * 16; + u16 palOffset = curPalIndex * 16; - while (r6 < r12) + while (palOffset < palEnd) { - struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[r6]; + struct RGBColor color = *(struct RGBColor *)&gPlttBufferUnfaded[palOffset]; u8 r = color.r; u8 g = color.g; u8 b = color.b; @@ -715,88 +805,88 @@ void sub_807D424(u8 a, u16 b) g += ((31 - g) * 3) >> 2; b += ((28 - b) * 3) >> 2; - r += ((r_ - r) * a) >> 4; - g += ((g_ - g) * a) >> 4; - b += ((b_ - b) * a) >> 4; + r += ((rBlend - r) * blendCoeff) >> 4; + g += ((gBlend - g) * blendCoeff) >> 4; + b += ((bBlend - b) * blendCoeff) >> 4; - gPlttBufferFaded[r6] = (b << 10) | (g << 5) | r; - r6++; + gPlttBufferFaded[palOffset] = (b << 10) | (g << 5) | r; + palOffset++; } } else { - BlendPalette(r4 * 16, 16, a, b); + BlendPalette(curPalIndex * 16, 16, blendCoeff, blendColor); } - r4++; } } -void sub_807D540(u8 a) +static void MarkFogSpritePalToLighten(u8 paletteIndex) { - if (gWeatherPtr->unknown_6FA < 6) + if (gWeatherPtr->lightenedFogSpritePalsCount < 6) { - gWeatherPtr->unknown_6F4[gWeatherPtr->unknown_6FA] = a; - gWeatherPtr->unknown_6FA++; + gWeatherPtr->lightenedFogSpritePals[gWeatherPtr->lightenedFogSpritePalsCount] = paletteIndex; + gWeatherPtr->lightenedFogSpritePalsCount++; } } -bool8 sub_807D574(u8 a) +static bool8 LightenSpritePaletteInFog(u8 paletteIndex) { u16 i; - for (i = 0; i < gWeatherPtr->unknown_6FA; i++) + for (i = 0; i < gWeatherPtr->lightenedFogSpritePalsCount; i++) { - if (gWeatherPtr->unknown_6F4[i] == a) + if (gWeatherPtr->lightenedFogSpritePals[i] == paletteIndex) return TRUE; } + return FALSE; } -void sub_807D5BC(s8 a) +void sub_807D5BC(s8 gammaIndex) { - if (gWeatherPtr->unknown_6C6 == 3) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { - sub_807CEBC(0, 32, a); - gWeatherPtr->unknown_6C0 = a; + ApplyGammaShift(0, 32, gammaIndex); + gWeatherPtr->gammaIndex = gammaIndex; } } -void sub_807D5F0(u8 a, u8 b, u8 c) +void sub_807D5F0(u8 gammaIndex, u8 gammaTargetIndex, u8 gammaStepDelay) { - if (gWeatherPtr->unknown_6C6 == 3) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_IDLE) { - gWeatherPtr->unknown_6C6 = 0; - gWeatherPtr->unknown_6C0 = a; - gWeatherPtr->unknown_6C1 = b; - gWeatherPtr->unknown_6C3 = 0; - gWeatherPtr->unknown_6C2 = c; - sub_807D5BC(a); + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_CHANGING_WEATHER; + gWeatherPtr->gammaIndex = gammaIndex; + gWeatherPtr->gammaTargetIndex = gammaTargetIndex; + gWeatherPtr->gammaStepFrameCounter = 0; + gWeatherPtr->gammaStepDelay = gammaStepDelay; + sub_807D5BC(gammaIndex); } } -void fade_screen(u8 a, u8 delay) +void FadeScreen(u8 mode, u8 delay) { u32 fadeColor; - u32 r1; - u32 r2; + bool8 fadeOut; + bool8 useWeatherPal; - switch (a) + switch (mode) { - case 0: + case FADE_FROM_BLACK: fadeColor = 0; - r1 = 0; + fadeOut = FALSE; break; - case 2: + case FADE_FROM_WHITE: fadeColor = 0xFFFF; - r1 = 0; + fadeOut = FALSE; break; - case 1: + case FADE_TO_BLACK: fadeColor = 0; - r1 = 1; + fadeOut = TRUE; break; - case 3: + case FADE_TO_WHITE: fadeColor = 0xFFFF; - r1 = 1; + fadeOut = TRUE; break; default: return; @@ -809,145 +899,149 @@ void fade_screen(u8 a, u8 delay) case WEATHER_RAIN_HEAVY: case WEATHER_SNOW: case WEATHER_FOG_1: - case WEATHER_DARK: + case WEATHER_SHADE: case WEATHER_DROUGHT: - r2 = 1; + useWeatherPal = TRUE; break; default: - r2 = 0; + useWeatherPal = FALSE; break; } - if (r1 != 0) + if (fadeOut) { - if (r2 != 0) + if (useWeatherPal) CpuFastCopy(gPlttBufferFaded, gPlttBufferUnfaded, 0x400); + BeginNormalPaletteFade(0xFFFFFFFF, delay, 0, 16, fadeColor); - gWeatherPtr->unknown_6C6 = 2; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } else { - gWeatherPtr->unknown_6C4 = fadeColor; - if (r2 != 0) - gWeatherPtr->unknown_6C7 = 0; + gWeatherPtr->fadeDestColor = fadeColor; + if (useWeatherPal) + gWeatherPtr->fadeScreenCounter = 0; else BeginNormalPaletteFade(0xFFFFFFFF, delay, 16, 0, fadeColor); - gWeatherPtr->unknown_6C6 = 1; + + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_IN; gWeatherPtr->unknown_6CA = 1; gWeatherPtr->unknown_6CB = 0; Weather_SetBlendCoeffs(gWeatherPtr->currBlendEVA, gWeatherPtr->currBlendEVB); - gWeatherPtr->unknown_6C8 = 1; + gWeatherPtr->readyForInit = TRUE; } } -bool8 sub_807D770(void) +bool8 IsWeatherNotFadingIn(void) { - return gWeatherPtr->unknown_6C6 ^ 1 ? TRUE : FALSE; + return (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_IN); } -void sub_807D78C(u8 a) +void UpdateSpritePaletteWithWeather(u8 spritePaletteIndex) { - u16 r4 = 16 + a; + u16 paletteIndex = 16 + spritePaletteIndex; u16 i; - switch (gWeatherPtr->unknown_6C6) + switch (gWeatherPtr->palProcessingState) { - case 1: + case WEATHER_PAL_STATE_SCREEN_FADING_IN: if (gWeatherPtr->unknown_6CA != 0) { if (gWeatherPtr->currWeather == WEATHER_FOG_1) - sub_807D540(r4); - r4 *= 16; + MarkFogSpritePalToLighten(paletteIndex); + paletteIndex *= 16; for (i = 0; i < 16; i++) - gPlttBufferFaded[r4 + i] = gWeatherPtr->unknown_6C4; + gPlttBufferFaded[paletteIndex + i] = gWeatherPtr->fadeDestColor; } break; - case 2: - r4 *= 16; - CpuFastCopy(gPlttBufferFaded + r4, gPlttBufferUnfaded + r4, 32); - BlendPalette(r4, 16, gPaletteFade.y, gPaletteFade.blendColor); + case WEATHER_PAL_STATE_SCREEN_FADING_OUT: + paletteIndex *= 16; + CpuFastCopy(gPlttBufferFaded + paletteIndex, gPlttBufferUnfaded + paletteIndex, 32); + BlendPalette(paletteIndex, 16, gPaletteFade.y, gPaletteFade.blendColor); break; + // WEATHER_PAL_STATE_CHANGING_WEATHER + // WEATHER_PAL_STATE_CHANGING_IDLE default: if (gWeatherPtr->currWeather != WEATHER_FOG_1) { - sub_807CEBC(r4, 1, gWeatherPtr->unknown_6C0); + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } else { - r4 *= 16; - BlendPalette(r4, 16, 12, 0x73FC); + paletteIndex *= 16; + BlendPalette(paletteIndex, 16, 12, 0x73FC); } break; } } -void sub_807D874(u8 a) +void ApplyWeatherGammaShiftToPal(u8 paletteIndex) { - sub_807CEBC(a, 1, gWeatherPtr->unknown_6C0); + ApplyGammaShift(paletteIndex, 1, gWeatherPtr->gammaIndex); } u8 unref_sub_807D894(void) { - if (gWeatherPtr->unknown_6C6 == 1) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_SCREEN_FADING_IN) return gWeatherPtr->unknown_6CA; else return 0; } -void sub_807D8C0(const u16 *palette) +void LoadCustomWeatherSpritePalette(const u16 *palette) { - LoadPalette(palette, 0x100 + gWeatherPtr->unknown_6D4 * 16, 32); - sub_807D78C(gWeatherPtr->unknown_6D4); + LoadPalette(palette, 0x100 + gWeatherPtr->weatherPicSpritePalIndex * 16, 32); + UpdateSpritePaletteWithWeather(gWeatherPtr->weatherPicSpritePalIndex); } -void sub_807D8F0(u8 *a, u8 *b) +static void LoadDroughtWeatherPalette(u8 *gammaIndexPtr, u8 *b) { - u8 r4 = *a; + u8 gammaIndex = *gammaIndexPtr; u16 i; - if (r4 < 7) + if (gammaIndex < 7) { - r4--; - LZ77UnCompWram(sCompressedDroughtPalettes[r4], eWeatherPaletteData.data[r4]); - if (r4 == 0) + gammaIndex--; + LZ77UnCompWram(sCompressedDroughtPalettes[gammaIndex], eDroughtPaletteData.gammaShiftColors[gammaIndex]); + if (gammaIndex == 0) { - eWeatherPaletteData.data[r4][0] = 0x421; + eDroughtPaletteData.gammaShiftColors[gammaIndex][0] = RGB(1, 1, 1); for (i = 1; i < 0x1000; i++) - eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4][i - 1]; + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex][i - 1]; } else { for (i = 0; i < 0x1000; i++) - eWeatherPaletteData.data[r4][i] += eWeatherPaletteData.data[r4 - 1][i]; + eDroughtPaletteData.gammaShiftColors[gammaIndex][i] += eDroughtPaletteData.gammaShiftColors[gammaIndex - 1][i]; } - if (++(*a) == 7) + if (++(*gammaIndexPtr) == 7) { - *a = 32; + *gammaIndexPtr = 32; *b = 32; } } } -void sub_807D9A8(void) +void ResetDroughtWeatherPaletteLoading(void) { - gWeatherPtr->unknown_74D = 1; - gWeatherPtr->unknown_74E = 1; + gWeatherPtr->loadDroughtPalsIndex = 1; + gWeatherPtr->loadDroughtPalsOffset = 1; } -bool8 sub_807D9C8(void) +bool8 LoadDroughtWeatherPalettes(void) { - if (gWeatherPtr->unknown_74D < 32) + if (gWeatherPtr->loadDroughtPalsIndex < 32) { - sub_807D8F0(&gWeatherPtr->unknown_74D, &gWeatherPtr->unknown_74E); - if (gWeatherPtr->unknown_74D < 32) + LoadDroughtWeatherPalette(&gWeatherPtr->loadDroughtPalsIndex, &gWeatherPtr->loadDroughtPalsOffset); + if (gWeatherPtr->loadDroughtPalsIndex < 32) return TRUE; } return FALSE; } -void sub_807DA04(s8 a) +void sub_807DA04(s8 gammaIndex) { - sub_807D5BC(-a - 1); + sub_807D5BC(-gammaIndex - 1); } void sub_807DA14(void) @@ -1009,8 +1103,8 @@ void Weather_SetTargetBlendCoeffs(u8 eva, u8 evb, int delay) gWeatherPtr->targetBlendEVA = eva; gWeatherPtr->targetBlendEVB = evb; gWeatherPtr->blendDelay = delay; - gWeatherPtr->unknown_739 = 0; - gWeatherPtr->unknown_738 = 0; + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter = 0; } bool8 Weather_UpdateBlend(void) @@ -1019,13 +1113,13 @@ bool8 Weather_UpdateBlend(void) && gWeatherPtr->currBlendEVB == gWeatherPtr->targetBlendEVB) return TRUE; - if (++gWeatherPtr->unknown_739 > gWeatherPtr->blendDelay) + if (++gWeatherPtr->blendFrameCounter > gWeatherPtr->blendDelay) { - gWeatherPtr->unknown_739 = 0; - gWeatherPtr->unknown_738++; + gWeatherPtr->blendFrameCounter = 0; + gWeatherPtr->blendUpdateCounter++; // Update currBlendEVA and currBlendEVB on alternate frames - if (gWeatherPtr->unknown_738 & 1) + if (gWeatherPtr->blendUpdateCounter & 1) { if (gWeatherPtr->currBlendEVA < gWeatherPtr->targetBlendEVA) gWeatherPtr->currBlendEVA++; @@ -1055,48 +1149,48 @@ void unref_sub_807DCB4(u8 a) switch (a) { case 1: - SetWeather(1); + SetWeather(WEATHER_CLOUDS); break; case 2: - SetWeather(2); + SetWeather(WEATHER_SUNNY); break; case 3: - SetWeather(3); + SetWeather(WEATHER_RAIN_LIGHT); break; case 4: - SetWeather(4); + SetWeather(WEATHER_SNOW); break; case 5: - SetWeather(5); + SetWeather(WEATHER_RAIN_MED); break; case 6: - SetWeather(6); + SetWeather(WEATHER_FOG_1); break; case 7: - SetWeather(9); + SetWeather(WEATHER_FOG_2); break; case 8: - SetWeather(7); + SetWeather(WEATHER_ASH); break; case 9: - SetWeather(8); + SetWeather(WEATHER_SANDSTORM); break; case 10: - SetWeather(11); + SetWeather(WEATHER_SHADE); break; } } -u8 weather_get_current(void) +u8 GetCurrentWeather(void) { return gWeatherPtr->currWeather; } -void SetRainStrengthFromSoundEffect(u16 sndEff) +void SetRainStrengthFromSoundEffect(u16 soundEffect) { - if (gWeatherPtr->unknown_6C6 != 2) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_SCREEN_FADING_OUT) { - switch (sndEff) + switch (soundEffect) { case SE_T_KOAME: gWeatherPtr->rainStrength = 0; @@ -1110,7 +1204,8 @@ void SetRainStrengthFromSoundEffect(u16 sndEff) default: return; } - PlaySE(sndEff); + + PlaySE(soundEffect); } } @@ -1134,29 +1229,171 @@ void PlayRainSoundEffect(void) } } -u8 sub_807DDFC(void) +u8 IsWeatherChangeComplete(void) { - return gWeatherPtr->unknown_6D3; + return gWeatherPtr->weatherChangeComplete; } -void sub_807DE10(void) +void SetWeatherScreenFadeOut(void) { - gWeatherPtr->unknown_6C6 = 2; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_SCREEN_FADING_OUT; } void unref_sub_807DE24(void) { - gWeatherPtr->unknown_6C6 = 3; + gWeatherPtr->palProcessingState = WEATHER_PAL_STATE_IDLE; } -void sub_807DE38(u8 a) +void PreservePaletteInWeather(u8 preservedPalIndex) { - CpuCopy16(gUnknown_083970C8, gUnknown_0202FF38, 32); - gUnknown_0202FF38[a] = 0; - gUnknown_030006DC = gUnknown_0202FF38; + CpuCopy16(sBasePaletteGammaTypes, gFieldEffectPaletteGammaTypes, 32); + gFieldEffectPaletteGammaTypes[preservedPalIndex] = GAMMA_NONE; + sPaletteGammaTypes = gFieldEffectPaletteGammaTypes; } -void sub_807DE68(void) +void ResetPreservedPalettesInWeather(void) { - gUnknown_030006DC = gUnknown_083970C8; + sPaletteGammaTypes = sBasePaletteGammaTypes; } + +#if DEBUG + +__attribute__((naked)) +u8 debug_sub_8085564(void) +{ + asm("\ + push {lr}\n\ + mov r2, #0x0\n\ + ldr r0, ._375 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._370 @cond_branch\n\ + ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0xf\n\ + bne ._371 @cond_branch\n\ + strb r2, [r1]\n\ +._371:\n\ + mov r2, #0x1\n\ +._370:\n\ + ldr r0, ._375 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._372 @cond_branch\n\ + ldr r1, ._375 + 4 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r1]\n\ + cmp r0, #0\n\ + beq ._373 @cond_branch\n\ + sub r0, r0, #0x1\n\ + b ._374\n\ +._376:\n\ + .align 2, 0\n\ +._375:\n\ + .word gMain\n\ + .word gUnknown_Debug_20301FE\n\ +._373:\n\ + mov r0, #0xe\n\ +._374:\n\ + strb r0, [r1]\n\ + mov r2, #0x1\n\ +._372:\n\ + cmp r2, #0\n\ + beq ._377 @cond_branch\n\ + mov r0, #0x16\n\ + mov r1, #0x1\n\ + mov r2, #0x1c\n\ + mov r3, #0x2\n\ + bl Menu_BlankWindowRect\n\ + ldr r1, ._380 @ gDebugText_Weather\n\ + ldr r0, ._380 + 4 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x17\n\ + mov r2, #0x1\n\ + bl Menu_PrintText\n\ +._377:\n\ + ldr r0, ._380 + 8 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._378 @cond_branch\n\ + mov r0, #0x0\n\ + b ._379\n\ +._381:\n\ + .align 2, 0\n\ +._380:\n\ + .word gDebugText_Weather\n\ + .word gUnknown_Debug_20301FE\n\ + .word gMain\n\ +._378:\n\ + ldr r0, ._382 @ gUnknown_Debug_20301FE\n\ + ldrb r0, [r0]\n\ + bl ChangeWeather\n\ + bl CloseMenu\n\ + mov r0, #0x1\n\ +._379:\n\ + pop {r1}\n\ + bx r1\n\ +._383:\n\ + .align 2, 0\n\ +._382:\n\ + .word gUnknown_Debug_20301FE"); +} + +__attribute__((naked)) +u8 debug_sub_808560C(void) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._384 @ gUnknown_Debug_20301FE\n\ + ldr r0, ._384 + 4 @ gWeather\n\ + mov r1, #0xda\n\ + lsl r1, r1, #0x3\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + strb r0, [r4]\n\ + bl Menu_EraseScreen\n\ + mov r0, #0x16\n\ + mov r1, #0x1\n\ + mov r2, #0x1c\n\ + mov r3, #0x2\n\ + bl Menu_BlankWindowRect\n\ + ldr r1, ._384 + 8 @ gDebugText_Weather\n\ + ldrb r0, [r4]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x17\n\ + mov r2, #0x1\n\ + bl Menu_PrintText\n\ + ldr r1, ._384 + 12 @ gMenuCallback\n\ + ldr r0, ._384 + 16 @ debug_sub_8085564\n\ + str r0, [r1]\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._385:\n\ + .align 2, 0\n\ +._384:\n\ + .word gUnknown_Debug_20301FE\n\ + .word gWeather\n\ + .word gDebugText_Weather\n\ + .word gMenuCallback\n\ + .word debug_sub_8085564+1"); +} + +#endif diff --git a/src/field/field_weather_effects.c b/src/field/field_weather_effects.c index 5a59d6c2a..eff702f8c 100644 --- a/src/field/field_weather_effects.c +++ b/src/field/field_weather_effects.c @@ -74,10 +74,7 @@ static const struct SpriteTemplate sCloudSpriteTemplate = .callback = sub_807E0F4, }; -extern void sub_807D5BC(s8 a); -extern void sub_807D8C0(const u16 *palette); -extern void sub_807D9A8(void); -extern bool8 sub_807D9C8(void); +extern void sub_807D5BC(s8 gammaIndex); extern void sub_807DA14(void); extern void sub_807DA4C(void); extern void Weather_SetTargetBlendCoeffs(u8 a, u8 b, int c); @@ -91,8 +88,8 @@ extern void sub_807D5F0(u8 a, u8 b, u8 c); void Clouds_InitVars(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; gWeatherPtr->initStep = 0; if (gWeatherPtr->cloudSpritesCreated == FALSE) @@ -159,8 +156,8 @@ bool8 Clouds_Finish(void) void Weather2_InitVars(void) { - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; } void Weather2_InitAll(void) @@ -184,7 +181,7 @@ void CreateCloudSprites(void) if (gWeatherPtr->cloudSpritesCreated == TRUE) return; LoadSpriteSheet(&sCloudSpriteSheet); - sub_807D8C0(gUnknown_08397108); + LoadCustomWeatherSpritePalette(gUnknown_08397108); for (i = 0; i < 3; i++) { u8 spriteId = CreateSprite(&sCloudSpriteTemplate, 0, 0, 0xFF); @@ -236,8 +233,8 @@ void Drought_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 0; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 0; } void Drought_Main(void); @@ -254,15 +251,15 @@ void Drought_Main(void) switch (gWeatherPtr->initStep) { case 0: - if (gWeatherPtr->unknown_6C6 != 0) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_CHANGING_WEATHER) gWeatherPtr->initStep++; break; case 1: - sub_807D9A8(); + ResetDroughtWeatherPaletteLoading(); gWeatherPtr->initStep++; break; case 2: - if (sub_807D9C8() == FALSE) + if (LoadDroughtWeatherPalettes() == FALSE) gWeatherPtr->initStep++; break; case 3: @@ -368,8 +365,8 @@ void LightRain_InitVars(void) gWeatherPtr->unknown_6DB = 8; gWeatherPtr->unknown_6DC = 0; gWeatherPtr->unknown_6D9 = 10; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; SetRainStrengthFromSoundEffect(SE_T_KOAME); } @@ -885,8 +882,8 @@ void Snow_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6E5 = 16; gWeatherPtr->unknown_6E0 = 0; } @@ -1074,8 +1071,8 @@ void MedRain_InitVars(void) gWeatherPtr->unknown_6DB = 4; gWeatherPtr->unknown_6DC = 0; gWeatherPtr->unknown_6D9 = 16; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment gWeatherPtr->unknown_6ED = 0; SetRainStrengthFromSoundEffect(SE_T_AME); @@ -1102,8 +1099,8 @@ void HeavyRain_InitVars(void) gWeatherPtr->unknown_6DB = 4; gWeatherPtr->unknown_6DC = 1; gWeatherPtr->unknown_6D9 = 24; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->weatherGfxLoaded = FALSE; // duplicate assignment SetRainStrengthFromSoundEffect(SE_T_OOAME); } @@ -1139,7 +1136,7 @@ void Rain_Main(void) gWeatherPtr->initStep++; break; case 3: - if (gWeatherPtr->unknown_6C6 == 0) + if (gWeatherPtr->palProcessingState == WEATHER_PAL_STATE_CHANGING_WEATHER) break; gWeatherPtr->initStep = 6; break; @@ -1213,7 +1210,7 @@ void Rain_Main(void) gWeatherPtr->initStep++; break; case 14: - if (gWeatherPtr->unknown_6C6 != 3) + if (gWeatherPtr->palProcessingState != WEATHER_PAL_STATE_IDLE) break; gWeatherPtr->unknown_6EA = 1; gWeatherPtr->initStep = 4; @@ -1296,8 +1293,8 @@ void Fog1_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; if (gWeatherPtr->fog1SpritesCreated == 0) { gWeatherPtr->unknown_6F0 = 0; @@ -1446,8 +1443,8 @@ void Ash_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = FALSE; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6FE = 20; if (!gWeatherPtr->ashSpritesCreated) { @@ -1634,8 +1631,8 @@ void Fog2_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; gWeatherPtr->unknown_6F0 = 0; gWeatherPtr->unknown_6F2 = 1; if (gWeatherPtr->fog2SpritesCreated == 0) @@ -1835,8 +1832,8 @@ void Sandstorm_InitVars(void) { gWeatherPtr->initStep = 0; gWeatherPtr->weatherGfxLoaded = 0; - gWeatherPtr->unknown_6C1 = 0; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 0; + gWeatherPtr->gammaStepDelay = 20; if (gWeatherPtr->sandstormSprites1Created == 0) { gWeatherPtr->unknown_704 = gWeatherPtr->unknown_708 = 0; @@ -2015,7 +2012,7 @@ void CreateSandstormSprites_1(void) if (!gWeatherPtr->sandstormSprites1Created) { LoadSpriteSheet(&sSandstormSpriteSheet); - sub_807D8C0(gUnknown_08397128); + LoadCustomWeatherSpritePalette(gUnknown_08397128); for (i = 0; i < 20; i++) { u8 spriteId = CreateSpriteAtEnd(&sSandstormSpriteTemplate, 0, (i / 5) * 64, 1); @@ -2113,26 +2110,26 @@ void SandstormSpriteCallback3(struct Sprite *sprite) } //------------------------------------------------------------------------------ -// Weather 11 +// Shade //------------------------------------------------------------------------------ -void Weather11_InitVars(void) +void Shade_InitVars(void) { gWeatherPtr->initStep = 0; - gWeatherPtr->unknown_6C1 = 3; - gWeatherPtr->unknown_6C2 = 20; + gWeatherPtr->gammaTargetIndex = 3; + gWeatherPtr->gammaStepDelay = 20; } -void Weather11_InitAll(void) +void Shade_InitAll(void) { - Weather11_InitVars(); + Shade_InitVars(); } -void Weather11_Main(void) +void Shade_Main(void) { } -bool8 Weather11_Finish(void) +bool8 Shade_Finish(void) { return FALSE; } @@ -2322,7 +2319,7 @@ void SetSav1WeatherFromCurrMapHeader(void) void SetWeather(u32 weather) { SetSav1Weather(weather); - DoWeatherEffect(GetSav1Weather()); + ChangeWeather(GetSav1Weather()); } void SetWeather_Unused(u32 weather) @@ -2333,7 +2330,7 @@ void SetWeather_Unused(u32 weather) void DoCurrentWeather(void) { - DoWeatherEffect(GetSav1Weather()); + ChangeWeather(GetSav1Weather()); } void sub_8080750(void) @@ -2380,5 +2377,5 @@ void UpdateRainCounter(u8 newWeather, u8 oldWeather) { if (newWeather != oldWeather && (newWeather == WEATHER_RAIN_LIGHT || newWeather == WEATHER_RAIN_MED)) - IncrementGameStat(0x28); + IncrementGameStat(GAME_STAT_GOT_RAINED_ON); } diff --git a/src/field/fieldmap.c b/src/field/fieldmap.c index 7a31ae720..7383bb174 100644 --- a/src/field/fieldmap.c +++ b/src/field/fieldmap.c @@ -86,18 +86,20 @@ void map_copy_with_padding(u16 *map, u16 width, u16 height) void sub_80560AC(struct MapHeader *mapHeader) { + // BUG: This results in a null pointer dereference when mapHeader->connections + // is NULL, causing count to be assigned a garbage value. This garbage value + // just so happens to have the most significant bit set, so it is treated as + // negative and the loop below thankfully never executes in this scenario. + int count = mapHeader->connections->count; + struct MapConnection *connection = mapHeader->connections->connections; int i; - struct MapConnection *connection; - struct MapHeader *cMap; - u32 offset; - int count; - count = mapHeader->connections->count; - connection = mapHeader->connections->connections; + gUnknown_0202E850 = sDummyConnectionFlags; for (i = 0; i < count; i++, connection++) { - cMap = mapconnection_get_mapheader(connection); - offset = connection->offset; + struct MapHeader *cMap = mapconnection_get_mapheader(connection); + u32 offset = connection->offset; + switch (connection->direction) { case CONNECTION_SOUTH: diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c index e4328acfc..5d39b87a9 100644 --- a/src/field/fldeff_cut.c +++ b/src/field/fldeff_cut.c @@ -72,6 +72,115 @@ static const struct SpriteTemplate gSpriteTemplate_CutGrass = .callback = sub_80A2A48, }; +#if DEBUG +__attribute__((naked)) +void debug_sub_80AFEE4() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, r8\n" + " push {r7}\n" + " mov r0, #0x52\n" + " bl npc_before_player_of_type\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._1 @cond_branch\n" + " ldr r1, ._3 @ gLastFieldPokeMenuOpened\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl sub_80A2634\n" + " b ._8\n" + "._4:\n" + " .align 2, 0\n" + "._3:\n" + " .word gLastFieldPokeMenuOpened\n" + "._1:\n" + " ldr r4, ._9 @ gUnknown_0203923C\n" + " add r1, r4, #2\n" + " add r0, r4, #0\n" + " bl PlayerGetDestCoords\n" + " mov r7, #0x0\n" + " mov r8, r4\n" + "._12:\n" + " ldr r1, ._9 + 4 @ 0xffff\n" + " add r0, r7, r1\n" + " mov r2, r8\n" + " ldrh r2, [r2, #0x2]\n" + " add r0, r0, r2\n" + " mov r6, #0x0\n" + " lsl r0, r0, #0x10\n" + " asr r5, r0, #0x10\n" + "._11:\n" + " ldr r1, ._9 + 4 @ 0xffff\n" + " add r0, r6, r1\n" + " mov r2, r8\n" + " ldrh r2, [r2]\n" + " add r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " asr r4, r0, #0x10\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl MapGridGetZCoordAt\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r2, r8\n" + " mov r1, #0x4\n" + " ldsb r1, [r2, r1]\n" + " cmp r0, r1\n" + " bne ._7 @cond_branch\n" + " add r0, r4, #0\n" + " add r1, r5, #0\n" + " bl MapGridGetMetatileBehaviorAt\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " add r0, r4, #0\n" + " bl MetatileBehavior_IsPokeGrass\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " beq ._6 @cond_branch\n" + " add r0, r4, #0\n" + " bl MetatileBehavior_IsAshGrass\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x1\n" + " bne ._7 @cond_branch\n" + "._6:\n" + " ldr r1, ._9 + 8 @ gLastFieldPokeMenuOpened\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + " bl sub_80A25E8\n" + " b ._8\n" + "._10:\n" + " .align 2, 0\n" + "._9:\n" + " .word gUnknown_0203923C\n" + " .word 0xffff\n" + " .word gLastFieldPokeMenuOpened\n" + "._7:\n" + " add r0, r6, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " cmp r6, #0x2\n" + " bls ._11 @cond_branch\n" + " add r0, r7, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " cmp r7, #0x2\n" + " bls ._12 @cond_branch\n" + " bl ScriptContext2_Disable\n" + "._8:\n" + " pop {r3}\n" + " mov r8, r3\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} +#endif + bool8 SetUpFieldMove_Cut(void) { s16 x, y; @@ -122,7 +231,7 @@ bool8 FldEff_UseCutOnGrass(void) gTasks[taskId].data[8] = (u32)sub_80A2684 >> 16; gTasks[taskId].data[9] = (u32)sub_80A2684; - IncrementGameStat(0x12); + IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } @@ -138,7 +247,7 @@ bool8 FldEff_UseCutOnTree(void) gTasks[taskId].data[8] = (u32)sub_80A2B00 >> 16; gTasks[taskId].data[9] = (u32)sub_80A2B00; - IncrementGameStat(0x12); + IncrementGameStat(GAME_STAT_USED_CUT); return FALSE; } diff --git a/src/field/fldeff_escalator.c b/src/field/fldeff_escalator.c new file mode 100644 index 000000000..981233480 --- /dev/null +++ b/src/field/fldeff_escalator.c @@ -0,0 +1,132 @@ +#include "global.h" +#include "task.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "field_player_avatar.h" + +extern u8 gUnknown_02038731; + +void sub_80B45B4(u8 taskId, const s16 *list, u16 c) +{ + s16 r5 = gTasks[taskId].data[4] - 1; + s16 r3 = gTasks[taskId].data[5] - 1; + s16 r4 = gTasks[taskId].data[1]; + s16 y; + s16 x; + + if (gTasks[taskId].data[2] == 0) + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); + } + } + } + } + else + { + for (y = 0; y < 3; y++) + { + for (x = 0; x < 3; x++) + { + s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); + + if (list[2 - r4] == metatileId) + { + if (r4 != 2) + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); + else + MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); + } + } + } + } +} + +const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; +const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; +const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; +const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; +const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; +const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; +const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; + +void sub_80B4710(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + data[3] = 1; + + switch (data[0]) + { + case 0: + sub_80B45B4(taskId, gUnknown_083CC714, 0); + break; + case 1: + sub_80B45B4(taskId, gUnknown_083CC71A, 0); + break; + case 2: + sub_80B45B4(taskId, gUnknown_083CC720, 0xC00); + break; + case 3: + sub_80B45B4(taskId, gUnknown_083CC726, 0); + break; + case 4: + sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00); + break; + case 5: + sub_80B45B4(taskId, gUnknown_083CC732, 0); + break; + case 6: + sub_80B45B4(taskId, gUnknown_083CC738, 0); + break; + } + + data[0] = (data[0] + 1) & 7; + if (!data[0]) + { + DrawWholeMapView(); + data[1] = (data[1] + 1) % 3; + data[3] = 0; + } +} + +u8 sub_80B47D8(u16 var) +{ + u8 taskId = CreateTask(sub_80B4710, 0); + s16 *data = gTasks[taskId].data; + + PlayerGetDestCoords(&data[4], &data[5]); + data[0] = 0; + data[1] = 0; + data[2] = var; + sub_80B4710(taskId); + return taskId; +} + +void sub_80B4824(u8 var) +{ + gUnknown_02038731 = sub_80B47D8(var); +} + +void sub_80B483C(void) +{ + DestroyTask(gUnknown_02038731); +} + +bool8 sub_80B4850(void) +{ + if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) + return FALSE; + else + return TRUE; +} diff --git a/src/field/fldeff_flash.c b/src/field/fldeff_flash.c index 22f170184..8c0f09bd9 100644 --- a/src/field/fldeff_flash.c +++ b/src/field/fldeff_flash.c @@ -71,6 +71,36 @@ static const u16 gUnknown_083F809C[] = INCBIN_U16("graphics/misc/83F809C.gbapal" static const u16 gCaveTransitionTilemap[] = INCBIN_U16("graphics/misc/cave_transition_map.bin.lz"); static const u8 gCaveTransitionTiles[] = INCBIN_U8("graphics/misc/cave_transition.4bpp.lz"); +#if DEBUG +__attribute__((naked)) +void debug_sub_8122080(void) +{ + asm("\ + push {lr}\n\ + ldr r0, ._4 @ gMapHeader\n\ + ldrb r0, [r0, #0x15]\n\ + cmp r0, #0x1\n\ + bne ._2 @cond_branch\n\ + ldr r0, ._4 + 4 @ 0x828\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._2 @cond_branch\n\ + bl sub_810CBFC\n\ + b ._3\n\ +._5:\n\ + .align 2, 0\n\ +._4:\n\ + .word gMapHeader\n\ + .word 0x828\n\ +._2:\n\ + bl ScriptContext2_Disable\n\ +._3:\n\ + pop {r0}\n\ + bx r0"); +} +#endif + bool8 SetUpFieldMove_Flash(void) { if (gMapHeader.cave == TRUE && !FlagGet(FLAG_SYS_USE_FLASH)) diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c index b0052d59d..52afc2516 100644 --- a/src/field/fldeff_poison.c +++ b/src/field/fldeff_poison.c @@ -32,13 +32,13 @@ static void Task_FieldPoisonEffect(u8 taskId) REG_MOSAIC = (data[1] << 4) | data[1]; } -void DoFieldPoisonEffect(void) +void FldeffPoison_Start(void) { PlaySE(SE_DOKU); CreateTask(Task_FieldPoisonEffect, 80); } -bool32 FieldPoisonEffectIsRunning(void) +bool32 FldeffPoison_IsActive(void) { return FuncIsActiveTask(Task_FieldPoisonEffect); } diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c index bf8e98403..0e91bb55c 100644 --- a/src/field/fldeff_secretpower.c +++ b/src/field/fldeff_secretpower.c @@ -243,6 +243,102 @@ void sub_80C6280(void) } } +#if DEBUG + +__attribute__((naked)) +void debug_sub_80D93F4() +{ + asm("\ + push {r4, lr}\n\ + bl sub_80BB63C\n\ + ldr r0, ._98 @ gSpecialVar_Result\n\ + ldrh r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._95 @cond_branch\n\ + bl player_get_direction_lower_nybble\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x2\n\ + beq ._96 @cond_branch\n\ +._95:\n\ + bl ScriptContext2_Disable\n\ + b ._109\n\ +._99:\n\ + .align 2, 0\n\ +._98:\n\ + .word gSpecialVar_Result\n\ +._96:\n\ + ldr r4, ._102 @ gUnknown_0203923C\n\ + add r1, r4, #2\n\ + add r0, r4, #0\n\ + bl GetXYCoordsOneStepInFrontOfPlayer\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + mov r2, #0x2\n\ + ldsh r1, [r4, r2]\n\ + bl MapGridGetMetatileBehaviorAt\n\ + lsl r0, r0, #0x18\n\ + lsr r4, r0, #0x18\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseCave\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._100 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._102 + 4 @ gLastFieldPokeMenuOpened\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C639C\n\ + b ._109\n\ +._103:\n\ + .align 2, 0\n\ +._102:\n\ + .word gUnknown_0203923C\n\ + .word gLastFieldPokeMenuOpened\n\ +._100:\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseTree\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._104 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._106 @ gLastFieldPokeMenuOpened\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C64A8\n\ + b ._109\n\ +._107:\n\ + .align 2, 0\n\ +._106:\n\ + .word gLastFieldPokeMenuOpened\n\ +._104:\n\ + add r0, r4, #0\n\ + bl MetatileBehavior_IsSecretBaseShrub\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._108 @cond_branch\n\ + bl sub_80C6264\n\ + ldr r1, ._110 @ gLastFieldPokeMenuOpened\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + bl sub_80C660C\n\ + b ._109\n\ +._111:\n\ + .align 2, 0\n\ +._110:\n\ + .word gLastFieldPokeMenuOpened\n\ +._108:\n\ + bl ScriptContext2_Disable\n\ +._109:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0"); +} +#endif + bool8 SetUpFieldMove_SecretPower(void) { u8 behavior; diff --git a/src/field/fldeff_softboiled.c b/src/field/fldeff_softboiled.c index a574232a8..3c64ec520 100644 --- a/src/field/fldeff_softboiled.c +++ b/src/field/fldeff_softboiled.c @@ -126,7 +126,7 @@ static void sub_8133E74(u8 taskId) { return; } - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); PrintPartyMenuPromptText(3, 0); gTasks[taskId].func = HandlePartyMenuSwitchPokemonInput; } @@ -142,7 +142,7 @@ static void sub_8133EF8(void) { sub_806CCE4(); EWRAM_1B000_2.unk261 = 2; DestroySprite(&gSprites[EWRAM_1000.unk1]); - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); PrintPartyMenuPromptText(0, 0); SwitchTaskToFollowupFunc(EWRAM_1000.unk0); } diff --git a/src/field/fldeff_strength.c b/src/field/fldeff_strength.c index 565ac1651..9f9cd4013 100644 --- a/src/field/fldeff_strength.c +++ b/src/field/fldeff_strength.c @@ -1,4 +1,5 @@ #include "global.h" +#include "constants/map_objects.h" #include "braille_puzzles.h" #include "field_effect.h" #include "party_menu.h" @@ -20,6 +21,28 @@ extern void (*gUnknown_03005CE4)(void); extern u8 S_UseStrength[]; +#if DEBUG +void debug_sub_8130318(void) +{ + if (ShouldDoBrailleStrengthEffect()) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA38(); + } + else if (npc_before_player_of_type(MAP_OBJ_GFX_PUSHABLE_BOULDER) == TRUE) + { + gLastFieldPokeMenuOpened = 0; + gSpecialVar_Result = 0; + sub_811AA18(); + } + else + { + ScriptContext2_Disable(); + } +} +#endif + bool8 SetUpFieldMove_Strength(void) { if (ShouldDoBrailleStrengthEffect()) diff --git a/src/field/item.c b/src/field/item.c index 66d7d65df..6ff7a7cbe 100644 --- a/src/field/item.c +++ b/src/field/item.c @@ -571,7 +571,7 @@ void SwapRegisteredBike(void) static u16 SanitizeItemId(u16 itemId) { - if (itemId > 0x15C) + if (itemId >= ARRAY_COUNT(gItems)) return 0; else return itemId; diff --git a/src/field/item_menu.c b/src/field/item_menu.c index e9b8b24d3..ae1465fbd 100644 --- a/src/field/item_menu.c +++ b/src/field/item_menu.c @@ -33,13 +33,13 @@ #include "string_util.h" #include "task.h" #include "text.h" -#include "unknown_task.h" +#include "scanline_effect.h" +#include "menu_helpers.h" #include "ewram.h" // External stuff extern void gpu_pal_allocator_reset__manage_upper_four(void); -extern void sub_80F9020(void); -extern void sub_80F9988(); +extern void SetVerticalScrollIndicatorPriority(); extern void sub_809D104(u16 *, u16, u16, const u8 *, u16, u16, u16, u16); extern void PauseVerticalScrollIndicator(); extern u8 sub_80F9284(void); @@ -47,10 +47,10 @@ extern void sub_808B5B4(); extern u8 sub_80F92F4(); extern void sub_80C9C7C(u8); extern void pal_fill_black(void); -extern bool8 sub_807D770(void); +extern bool8 IsWeatherNotFadingIn(void); extern u8 sub_80F931C(); extern void sub_808A3F8(u8); -extern void sub_80B3050(void); +extern void Shop_FadeReturnToMartMenu(void); extern void sub_80546B8(u8); extern void sub_804E990(u8); extern void sub_802E424(u8); @@ -158,6 +158,9 @@ extern struct PocketScrollState gBagPocketScrollStates[]; extern struct ItemSlot *gCurrentBagPocketItemSlots; // selected pocket item slots extern const u8 Event_NoRegisteredItem[]; +// TODO: decompile the debug code so we can use static in this file +#define static + extern const struct CompressedSpriteSheet sMaleBagSpriteSheet; extern const struct CompressedSpriteSheet sFemaleBagSpriteSheet; extern const struct CompressedSpritePalette sBagSpritePalette; @@ -286,6 +289,24 @@ static void sub_80A6618(u8); const struct YesNoFuncTable gUnknown_083C16FC = {sub_80A65AC, sub_80A6618}; +#if DEBUG +const struct {u16 item; u8 unk;} gUnknown_Debug_083EBC68[12+48] = +{ + {ITEM_POKE_BALL, 10}, + {ITEM_ULTRA_BALL, 15}, + {ITEM_GREAT_BALL, 20}, + {ITEM_MASTER_BALL, 25}, + {ITEM_ACRO_BIKE, 1 }, + {ITEM_OLD_ROD, 1 }, + {ITEM_GOOD_ROD, 1 }, + {ITEM_SUPER_ROD, 1 }, + {ITEM_POKEBLOCK_CASE, 1 }, + {ITEM_WAILMER_PAIL, 1 }, + {ITEM_ITEMFINDER, 1 }, + {ITEM_NONE, 1 }, +}; +#endif + void sub_80A34E8(void); static bool8 LoadBagGraphicsMultistep(void); static void sub_80A362C(void); @@ -368,22 +389,394 @@ static void sub_80A3134(void) LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - - { - const void *src = gBGTilemapBuffers[1]; - void *dst = (void *)(VRAM + 0x2000); - - DmaCopy16(3, src, dst, 0x800); - } - - { - const void *src = gBGTilemapBuffers[2]; - void *dst = (void *)(VRAM + 0x6000); - - DmaCopy16(3, src, dst, 0x800); - } + DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0x2000), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x6000), 0x800); } +#if DEBUG +__attribute__((naked)) +static bool8 SetupBagMultistep(void) +{ + asm("\ + push {r4, r5, lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._5 @ gMain\n\ + ldr r1, ._5 + 4 @ 0x43c\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x10\n\ + bls ._3 @cond_branch\n\ + b ._66\n\ +._3:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._5 + 8 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._6:\n\ + .align 2, 0\n\ +._5:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._7\n\ +._7:\n\ + .word ._8\n\ + .word ._9\n\ + .word ._10\n\ + .word ._11\n\ + .word ._12\n\ + .word ._13\n\ + .word ._14\n\ + .word ._15\n\ + .word ._16\n\ + .word ._17\n\ + .word ._18\n\ + .word ._19\n\ + .word ._20\n\ + .word ._21\n\ + .word ._22\n\ + .word ._23\n\ + .word ._24\n\ +._8:\n\ + bl ClearVideoCallbacks\n\ + bl sub_80A34E8\n\ + b ._61\n\ +._9:\n\ + bl ScanlineEffect_Stop\n\ + ldr r1, ._27 @ gMain\n\ + ldr r0, ._27 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._28:\n\ + .align 2, 0\n\ +._27:\n\ + .word gMain\n\ + .word 0x43c\n\ +._10:\n\ + bl gpu_pal_allocator_reset__manage_upper_four\n\ + b ._61\n\ +._11:\n\ + bl ClearBGTilemapBuffers\n\ + ldr r0, ._31 @ \n\ + ldr r1, ._31 + 4 @ \n\ + add r0, r0, r1\n\ + mov r1, #0x0\n\ + strb r1, [r0]\n\ + b ._61\n\ +._32:\n\ + .align 2, 0\n\ +._31:\n\ + .word +0x2000000\n\ + .word 0x1ffff\n\ +._12:\n\ + bl ResetPaletteFade\n\ + ldr r2, ._34 @ gPaletteFade\n\ + ldrb r0, [r2, #0x8]\n\ + mov r1, #0x80\n\ + orr r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._34 + 4 @ gMain\n\ + ldr r0, ._34 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._35:\n\ + .align 2, 0\n\ +._34:\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._13:\n\ + bl ResetSpriteData\n\ + b ._61\n\ +._14:\n\ + bl LoadBagGraphicsMultistep\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._37 @cond_branch\n\ + b ._66\n\ +._37:\n\ + ldr r1, ._40 @ gMain\n\ + ldr r0, ._40 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._41:\n\ + .align 2, 0\n\ +._40:\n\ + .word gMain\n\ + .word 0x43c\n\ +._15:\n\ + ldr r0, ._43 @ gWindowTemplate_81E6DFC\n\ + bl Text_LoadWindowTemplate\n\ + b ._61\n\ +._44:\n\ + .align 2, 0\n\ +._43:\n\ + .word gWindowTemplate_81E6DFC\n\ +._16:\n\ + ldr r0, ._46 @ gWindowTemplate_81E6DFC\n\ + bl MultistepInitMenuWindowBegin\n\ + ldr r1, ._46 + 4 @ gMain\n\ + ldr r0, ._46 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._47:\n\ + .align 2, 0\n\ +._46:\n\ + .word gWindowTemplate_81E6DFC\n\ + .word gMain\n\ + .word 0x43c\n\ +._17:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + bne ._48 @cond_branch\n\ + b ._66\n\ +._48:\n\ + b ._61\n\ +._18:\n\ + bl ClearVerticalScrollIndicatorPalettes\n\ + bl LoadScrollIndicatorPalette\n\ + mov r0, #0x0\n\ + mov r1, #0xac\n\ + mov r2, #0xc\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x1\n\ + mov r1, #0xac\n\ + mov r2, #0x94\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x2\n\ + mov r1, #0x1c\n\ + mov r2, #0x58\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x3\n\ + mov r1, #0x64\n\ + mov r2, #0x58\n\ + bl CreateVerticalScrollIndicators\n\ + mov r0, #0x0\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + mov r0, #0x1\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + mov r0, #0x2\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + mov r0, #0x3\n\ + mov r1, #0x2\n\ + bl SetVerticalScrollIndicatorPriority\n\ + ldr r0, ._53 @ sReturnLocation\n\ + ldrb r0, [r0]\n\ + sub r0, r0, #0x4\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bhi ._51 @cond_branch\n\ + mov r0, #0x2\n\ + mov r1, #0x1\n\ + bl SetVerticalScrollIndicators\n\ + mov r0, #0x3\n\ + mov r1, #0x1\n\ + bl SetVerticalScrollIndicators\n\ +._51:\n\ + ldr r1, ._53 + 4 @ gMain\n\ + ldr r0, ._53 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._54:\n\ + .align 2, 0\n\ +._53:\n\ + .word sReturnLocation\n\ + .word gMain\n\ + .word 0x43c\n\ +._19:\n\ + ldr r1, ._56 @ gUnknown_0203855A\n\ + mov r0, #0x10\n\ + strb r0, [r1]\n\ + ldr r4, ._56 + 4 @ gBGTilemapBuffers\n\ + ldr r5, ._56 + 8 @ sCurrentBagPocket\n\ + ldrb r1, [r5]\n\ + add r1, r1, #0x1\n\ + lsl r1, r1, #0x18\n\ + lsr r1, r1, #0x18\n\ + add r0, r4, #0\n\ + bl sub_80A39B8\n\ + ldrb r1, [r5]\n\ + add r0, r4, #0\n\ + bl DrawPocketIndicatorDots\n\ + bl UpdateAllBagPockets\n\ + ldr r4, ._56 + 12 @ gBagPockets\n\ + ldr r0, [r4, #0x10]\n\ + ldr r1, [r4, #0x14]\n\ + bl SortItemSlots\n\ + ldr r0, [r4, #0x18]\n\ + ldr r1, [r4, #0x1c]\n\ + bl SortItemSlots\n\ + bl sub_80A3D40\n\ + ldr r1, ._56 + 16 @ gCurrentBagPocketItemSlots\n\ + mov r0, #0x0\n\ + ldsb r0, [r5, r0]\n\ + lsl r0, r0, #0x3\n\ + add r0, r0, r4\n\ + ldr r0, [r0]\n\ + str r0, [r1]\n\ + bl sub_80A362C\n\ + b ._61\n\ +._57:\n\ + .align 2, 0\n\ +._56:\n\ + .word gUnknown_0203855A\n\ + .word gBGTilemapBuffers+0x1000\n\ + .word sCurrentBagPocket\n\ + .word gBagPockets\n\ + .word gCurrentBagPocketItemSlots\n\ +._20:\n\ + ldr r0, ._59 @ 0xffff\n\ + mov r1, #0x0\n\ + mov r2, #0x7\n\ + bl sub_80A48E8\n\ + ldr r1, ._59 + 4 @ gBagPocketScrollStates\n\ + ldr r4, ._59 + 8 @ sCurrentBagPocket\n\ + mov r0, #0x0\n\ + ldsb r0, [r4, r0]\n\ + lsl r0, r0, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0, #0x1]\n\ + ldrb r0, [r0]\n\ + add r1, r1, r0\n\ + ldr r0, ._59 + 12 @ gCurrentBagPocketItemSlots\n\ + ldr r0, [r0]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + mov r2, #0x0\n\ + ldsh r0, [r1, r2]\n\ + bl ItemListMenu_InitDescription\n\ + bl ItemListMenu_InitMenu\n\ + ldr r1, ._59 + 16 @ gUnknown_0203855B\n\ + ldrb r0, [r4]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + ldr r1, ._59 + 20 @ gUnknown_0203855C\n\ + mov r0, #0x0\n\ + strb r0, [r1]\n\ + ldr r1, ._59 + 24 @ gMain\n\ + ldr r0, ._59 + 28 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._60:\n\ + .align 2, 0\n\ +._59:\n\ + .word 0xffff\n\ + .word gBagPocketScrollStates\n\ + .word sCurrentBagPocket\n\ + .word gCurrentBagPocketItemSlots\n\ + .word gUnknown_0203855B\n\ + .word gUnknown_0203855C\n\ + .word gMain\n\ + .word 0x43c\n\ +._21:\n\ + bl CreateBagSprite\n\ + mov r0, #0x0\n\ + bl CreateBagPokeballSprite\n\ + bl sub_80A3740\n\ + b ._61\n\ +._22:\n\ + ldr r3, ._63 @ 0x4000208\n\ + ldrh r2, [r3]\n\ + mov r0, #0x0\n\ + strh r0, [r3]\n\ + ldr r4, ._63 + 4 @ 0x4000200\n\ + ldrh r0, [r4]\n\ + mov r1, #0x1\n\ + orr r0, r0, r1\n\ + strh r0, [r4]\n\ + strh r2, [r3]\n\ + ldr r2, ._63 + 8 @ 0x4000004\n\ + ldrh r0, [r2]\n\ + mov r1, #0x8\n\ + orr r0, r0, r1\n\ + strh r0, [r2]\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r2, ._63 + 12 @ gPaletteFade\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._63 + 16 @ gMain\n\ + ldr r0, ._63 + 20 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._62\n\ +._64:\n\ + .align 2, 0\n\ +._63:\n\ + .word 0x4000208\n\ + .word 0x4000200\n\ + .word 0x4000004\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._23:\n\ + bl sub_8055870\n\ + cmp r0, #0x1\n\ + beq ._66 @cond_branch\n\ +._61:\n\ + ldr r1, ._67 @ gMain\n\ + ldr r2, ._67 + 4 @ 0x43c\n\ + add r1, r1, r2\n\ +._62:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._66\n\ +._68:\n\ + .align 2, 0\n\ +._67:\n\ + .word gMain\n\ + .word 0x43c\n\ +._24:\n\ + ldr r0, ._71 @ sub_80A3134\n\ + bl SetVBlankCallback\n\ + ldr r0, ._71 + 4 @ sub_80A3118\n\ + bl SetMainCallback2\n\ + bl sub_80A751C\n\ + bl sub_80A7630\n\ + bl sub_80A770C\n\ + bl sub_80A7828\n\ + bl sub_80A78B8\n\ + ldr r0, ._71 + 8 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._69 @cond_branch\n\ + ldr r0, ._71 + 12 @ 0x600f5e0\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._71 + 16 @ 0x600f800\n\ + mov r3, #0x0\n\ + bl debug_sub_8008218\n\ +._69:\n\ + mov r0, #0x1\n\ + b ._70\n\ +._72:\n\ + .align 2, 0\n\ +._71:\n\ + .word sub_80A3134+1\n\ + .word sub_80A3118+1\n\ + .word gLinkOpen\n\ + .word 0x600f5e0\n\ + .word 0x600f800\n\ +._66:\n\ + mov r0, #0x0\n\ +._70:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1"); +} +#else static bool8 SetupBagMultistep(void) { u32 index; @@ -392,12 +785,12 @@ static bool8 SetupBagMultistep(void) switch (gMain.state) { case 0: - sub_80F9438(); + ClearVideoCallbacks(); sub_80A34E8(); gMain.state++; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); gMain.state++; break; case 2: @@ -405,7 +798,7 @@ static bool8 SetupBagMultistep(void) gMain.state++; break; case 3: - sub_80F9020(); + ClearBGTilemapBuffers(); ewramBagSetupStep = 0; gMain.state++; break; @@ -424,11 +817,11 @@ static bool8 SetupBagMultistep(void) gMain.state++; break; case 7: - SetUpWindowConfig(&gWindowConfig_81E6DFC); + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); gMain.state++; break; case 8: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6DFC); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6DFC); gMain.state++; break; case 9: @@ -437,20 +830,20 @@ static bool8 SetupBagMultistep(void) gMain.state++; break; case 10: - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); - CreateVerticalScrollIndicators(0, 172, 12); - CreateVerticalScrollIndicators(1, 172, 148); - CreateVerticalScrollIndicators(2, 28, 88); - CreateVerticalScrollIndicators(3, 100, 88); - sub_80F9988(0, 2); - sub_80F9988(1, 2); - sub_80F9988(2, 2); - sub_80F9988(3, 2); + CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); + CreateVerticalScrollIndicators(LEFT_ARROW, 28, 88); + CreateVerticalScrollIndicators(RIGHT_ARROW, 100, 88); + SetVerticalScrollIndicatorPriority(TOP_ARROW, 2); + SetVerticalScrollIndicatorPriority(BOTTOM_ARROW, 2); + SetVerticalScrollIndicatorPriority(LEFT_ARROW, 2); + SetVerticalScrollIndicatorPriority(RIGHT_ARROW, 2); if (sReturnLocation == RETURN_TO_FIELD_4 || sReturnLocation == RETURN_TO_FIELD_5) { - sub_80F979C(2, 1); - sub_80F979C(3, 1); + SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); } gMain.state++; break; @@ -508,6 +901,7 @@ static bool8 SetupBagMultistep(void) } return FALSE; } +#endif static bool8 sub_80A34B4(void) { @@ -634,6 +1028,79 @@ void ClearBag(void) ResetBagScrollPositions(); } +#if DEBUG +__attribute__((naked)) +void debug_sub_80A3714() +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffff4\n\ + mov r5, #0x0\n\ + ldr r2, ._138 @ gUnknown_Debug_083EBC68\n\ + mov r1, #0x0\n\ +._134:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, sp\n\ + strh r1, [r0]\n\ + add r0, r5, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x4\n\ + bls ._134 @cond_branch\n\ + mov r5, #0x0\n\ + ldrh r0, [r2]\n\ + cmp r0, #0\n\ + beq ._136 @cond_branch\n\ + add r6, r2, #0\n\ +._137:\n\ + lsl r4, r5, #0x2\n\ + add r4, r4, r6\n\ + ldrh r0, [r4]\n\ + bl ItemId_GetPocket\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x8\n\ + ldr r1, ._138 + 4 @ 0xffff0000\n\ + add r0, r0, r1\n\ + lsr r0, r0, #0x10\n\ + ldr r1, ._138 + 8 @ gBagPockets\n\ + lsl r2, r0, #0x3\n\ + add r2, r2, r1\n\ + lsl r0, r0, #0x1\n\ + mov r1, sp\n\ + add r3, r1, r0\n\ + ldrh r1, [r3]\n\ + ldr r0, [r2]\n\ + lsl r1, r1, #0x2\n\ + add r1, r1, r0\n\ + ldr r0, [r4]\n\ + str r0, [r1]\n\ + ldrh r0, [r3]\n\ + add r0, r0, #0x1\n\ + strh r0, [r3]\n\ + add r0, r5, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r5, r0, #0x10\n\ + cmp r5, #0x3b\n\ + bhi ._136 @cond_branch\n\ + lsl r0, r5, #0x2\n\ + add r0, r0, r6\n\ + ldrh r0, [r0]\n\ + cmp r0, #0\n\ + bne ._137 @cond_branch\n\ +._136:\n\ + add sp, sp, #0xc\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._139:\n\ + .align 2, 0\n\ +._138:\n\ + .word gUnknown_Debug_083EBC68\n\ + .word 0xffff0000\n\ + .word gBagPockets"); +} +#endif + static void sub_80A3740(void) { const u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; @@ -657,10 +1124,10 @@ static void sub_80A3770(void) static void sub_80A37C0(u8 taskId) { gTasks[taskId].func = sub_80A50C8; - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - StartVerticalScrollIndicators(2); - StartVerticalScrollIndicators(3); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + StartVerticalScrollIndicators(LEFT_ARROW); + StartVerticalScrollIndicators(RIGHT_ARROW); } static void sub_80A37F8(u8 taskId) @@ -702,8 +1169,8 @@ static void sub_80A37F8(u8 taskId) sub_80A37C0(FindTaskIdByFunc(sub_80A4F68)); DestroyTask(taskId); ItemListMenu_InitMenu(); - sub_80F979C(2, 0); - sub_80F979C(3, 0); + SetVerticalScrollIndicators(LEFT_ARROW, VISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, VISIBLE); } } @@ -1062,7 +1529,7 @@ void sub_80A4164(u8 *dest, u16 value, enum StringConvertMode mode, u8 digits) void sub_80A418C(u16 value, enum StringConvertMode mode, u8 c, u8 d, u8 digits) { sub_80A4164(gStringVar1, value, mode, digits); - MenuPrint(gStringVar1, c, d); + Menu_PrintText(gStringVar1, c, d); } static void sub_80A41D4(u8 taskId) @@ -1112,7 +1579,7 @@ static bool8 sub_80A42B0(u8 itemPos, int b) return TRUE; r5 = itemPos * 2 + 2; sub_8072C74(gStringVar1, gOtherText_CloseBag, 0x78, 0); - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); ptr = gBGTilemapBuffers[2] + 14 + r5 * 32; ptr[0] = 0x4F; ptr[1] = 0x4F; @@ -1121,9 +1588,9 @@ static bool8 sub_80A42B0(u8 itemPos, int b) if (itemPos == 7) return TRUE; if ((b == 1 && r8->unk2 != 0) || b == 2) - MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 13); + Menu_BlankWindowRect(14, r5 + 2, 29, 13); else - MenuFillWindowRectWithBlankTile(14, r5 + 2, 29, 17); + Menu_BlankWindowRect(14, r5 + 2, 29, 17); return TRUE; } return FALSE; @@ -1148,7 +1615,7 @@ static void sub_80A4380(u16 a, int b, int c, int d) text = sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x66, 0); *text++ = CHAR_MULT_SIGN; sub_8072C14(text, gCurrentBagPocketItemSlots[r4].quantity, 0x78, 1); - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); } } @@ -1173,7 +1640,7 @@ static void sub_80A444C(u16 a, int b, int c, int d) #else sub_8072C74(text, ItemId_GetItem(gCurrentBagPocketItemSlots[r4].itemId)->name, 0x63, 0); #endif - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); if (gUnknown_02038558 != 0) { if (gCurrentBagPocketItemSlots[r4].itemId == gSaveBlock1.registeredItem) @@ -1240,7 +1707,7 @@ static void sub_80A4548(u16 a, int b, int c, int d) moveName = gMoveNames[ItemIdToBattleMoveId(gCurrentBagPocketItemSlots[r4].itemId)]; sub_8072C74(text, moveName, 0x78, 0); } - MenuPrint(gStringVar1, 14, sp10); + Menu_PrintText(gStringVar1, 14, sp10); } } #else @@ -1421,7 +1888,7 @@ _080A46AE:\n\ ldr r0, _080A46F8 @ =gStringVar1\n\ movs r1, 0xE\n\ ldr r2, [sp, 0x10]\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ mov r0, r8\n\ adds r0, 0x1\n\ lsls r0, 24\n\ @@ -1482,7 +1949,7 @@ static void sub_80A46FC(u16 a, int b, int c, int d) text = sub_80A425C(a, text, i); CopyItemName(gCurrentBagPocketItemSlots[r4].itemId, gStringVar2); sub_80A41E0(text, gCurrentBagPocketItemSlots[r4].itemId - 0x84, gStringVar2, gCurrentBagPocketItemSlots[r4].quantity, 3); - MenuPrint(gStringVar1, 14, r5); + Menu_PrintText(gStringVar1, 14, r5); } } @@ -1505,14 +1972,14 @@ static void sub_80A47E8(u16 a, int b, int c, int d) break; } if (gBagPocketScrollStates[sCurrentBagPocket].scrollTop != 0) - sub_80F979C(0, 0); + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); else - sub_80F979C(0, 1); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); if ((sReturnLocation != RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots + 1) || (sReturnLocation == RETURN_TO_FIELD_5 && gBagPocketScrollStates[sCurrentBagPocket].scrollTop + 8 < gBagPocketScrollStates[sCurrentBagPocket].numSlots)) - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); else - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); } static void sub_80A48E8(u16 taskId, int b, int c) @@ -1540,7 +2007,7 @@ static void ItemListMenu_InitDescription(s16 itemId) } if (r5 < 3) - MenuZeroFillWindowRect(0, 13 + r5 * 2, 13, 20); + Menu_EraseWindowRect(0, 13 + r5 * 2, 13, 20); } static void ItemListMenu_ChangeDescription(s16 itemId, int b) @@ -1551,20 +2018,20 @@ static void ItemListMenu_ChangeDescription(s16 itemId, int b) { if (b == 0) { - MenuZeroFillWindowRect(0, 13, 13, 20); - MenuPrint_PixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); + Menu_EraseWindowRect(0, 13, 13, 20); + Menu_PrintTextPixelCoords(gOtherText_ReturnTo, 4, 0x68, 0); } else if (b == 1) { - MenuPrint_PixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); + Menu_PrintTextPixelCoords(gUnknown_0840E740[sReturnLocation], 4, 0x78, 0); } } else { if (b == 0) - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); if (ItemId_CopyDescription(description, itemId, b)) - MenuPrint_PixelCoords(description, 4, 104 + b * 16, 0); + Menu_PrintTextPixelCoords(description, 4, 104 + b * 16, 0); } } @@ -1602,9 +2069,9 @@ static void sub_80A4A98(const u8 *text, u32 line) u8 buffer[100]; if (line == 0) - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); if (CopyTextLine(buffer, text, line)) - MenuPrint_PixelCoords(buffer, 4, 104 + line * 16, 0); + Menu_PrintTextPixelCoords(buffer, 4, 104 + line * 16, 0); } static void sub_80A4ADC(u8 taskId) @@ -1618,7 +2085,7 @@ static void sub_80A4ADC(u8 taskId) static void sub_80A4B14(s8 a, u8 b) { gBagPocketScrollStates[sCurrentBagPocket].scrollTop += a; - MoveMenuCursor(0); + Menu_MoveCursor(0); sub_80A73C0(); sub_80A763C(); sub_80A4ADC(b); @@ -1626,7 +2093,7 @@ static void sub_80A4B14(s8 a, u8 b) static void sub_80A4B58(s8 delta, u8 b) { - gBagPocketScrollStates[sCurrentBagPocket].cursorPos = MoveMenuCursor(delta); + gBagPocketScrollStates[sCurrentBagPocket].cursorPos = Menu_MoveCursor(delta); sub_80A73C0(); sub_80A4ADC(b); } @@ -1649,7 +2116,7 @@ static void sub_80A4BF0(u16 *a) if (gUnknown_02038564 == 4) { - MenuDrawTextWindow(0, 7, 13, 12); + Menu_DrawStdWindowFrame(0, 7, 13, 12); sub_80A4008(a, 1, 8, 12, 4); if (sub_80F9344() == TRUE && sReturnLocation == RETURN_TO_FIELD_5) { @@ -1665,7 +2132,7 @@ static void sub_80A4BF0(u16 *a) text = sub_80A4B90(gSpecialVar_ItemId); else text = sItemPopupMenuActions[sPopupMenuActionList[i]].text; - MenuPrint(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); + Menu_PrintText(text, 1 + (i / 2) * 6, 8 + (i % 2) * 2); } } if (sReturnLocation == RETURN_TO_FIELD_5) @@ -1676,10 +2143,10 @@ static void sub_80A4BF0(u16 *a) } else { - MenuDrawTextWindow(0, 5, 13, 12); + Menu_DrawStdWindowFrame(0, 5, 13, 12); sub_80A4008(a, 1, 6, 12, 6); for (i = 0; i < gUnknown_02038564; i++) - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[i]].text, 1 + (i / 3) * 6, 6 + (i % 3) * 2); InitMenu(0, 1, 6, gUnknown_02038564, 0, 1); sub_8072DCC(0x2F); } @@ -1690,7 +2157,7 @@ static void sub_80A4DA4(u16 *a) { sub_80A73FC(); sub_80A36B8(a, 0, 6, 13, 6); - MenuZeroFillWindowRect(0, 5, 13, 12); + Menu_EraseWindowRect(0, 5, 13, 12); sub_80A7590(); } @@ -1699,7 +2166,7 @@ static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits) gTasks[taskId].data[1] = 1; gTasks[taskId].data[2] = b + 2; gTasks[taskId].data[3] = c + 1; - MenuDrawTextWindow(b, c, b + d, c + e); + Menu_DrawStdWindowFrame(b, c, b + d, c + e); sub_80A4008(gBGTilemapBuffers[1], b + 1, c + 1, d - 1, e - 1); sub_80A418C(1, 1, b + 2, c + 1, digits); } @@ -1707,14 +2174,14 @@ static void sub_80A4DD8(u8 taskId, u8 b, u8 c, u8 d, u8 e, u8 digits) static void sub_80A4E8C(s8 delta, u8 b) { PlaySE(SE_SELECT); - sub_80F979C(0, 1); - sub_80F979C(1, 1); - sub_80F979C(2, 1); - sub_80F979C(3, 1); - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); - PauseVerticalScrollIndicator(2); - PauseVerticalScrollIndicator(3); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + SetVerticalScrollIndicators(LEFT_ARROW, INVISIBLE); + SetVerticalScrollIndicators(RIGHT_ARROW, INVISIBLE); + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + PauseVerticalScrollIndicator(LEFT_ARROW); + PauseVerticalScrollIndicator(RIGHT_ARROW); ChangePocket(gBGTilemapBuffers[2], delta); DrawPocketIndicatorDots(gBGTilemapBuffers[2], sCurrentBagPocket); sub_80A3770(); @@ -1866,10 +2333,10 @@ static void sub_80A50C8(u8 taskId) gUnknown_02038560 = gBagPocketScrollStates[sCurrentBagPocket].scrollTop + gBagPocketScrollStates[sCurrentBagPocket].cursorPos; gSpecialVar_ItemId = gCurrentBagPocketItemSlots[gUnknown_02038560].itemId; gUnknown_083C16BC[sReturnLocation].onItemSelect(taskId); - sub_80F98A4(0); - sub_80F98A4(1); - sub_80F98A4(2); - sub_80F98A4(3); + StopVerticalScrollIndicators(TOP_ARROW); + StopVerticalScrollIndicators(BOTTOM_ARROW); + StopVerticalScrollIndicators(LEFT_ARROW); + StopVerticalScrollIndicators(RIGHT_ARROW); sub_80A797C(); } else @@ -1901,7 +2368,7 @@ static void sub_80A50C8(u8 taskId) } } -bool8 sub_80A52C4(u8 taskId, u16 b) +bool8 SellMenu_QuantityRoller(u8 taskId, u16 b) { s16 *taskData = gTasks[taskId].data; @@ -1948,7 +2415,7 @@ static bool8 sub_80A5350(u8 taskId) { s16 *taskData = gTasks[taskId].data; - if (sub_80A52C4(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE) + if (SellMenu_QuantityRoller(taskId, gCurrentBagPocketItemSlots[gUnknown_02038560].quantity) == TRUE) { // if (sCurrentBagPocket == BAG_POCKET_BERRIES) Can't get it to match this way if (sCurrentBagPocket + 1 == BAG_POCKET_BERRIES + 1) @@ -2539,7 +3006,7 @@ static void sub_80A57C4(void) r5 = 7; } sub_80A4008(gBGTilemapBuffers[1], 7, r5 + 1, 6, gUnknown_02038564 * 2); - MenuDrawTextWindow(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); + Menu_DrawStdWindowFrame(6, r5, 13, gUnknown_02038564 * 2 + 1 + r5); sub_80A7834(0, r5); InitMenu(0, 7, r5 + 1, gUnknown_02038564, 0, 6); } @@ -2553,7 +3020,7 @@ static void sub_80A5888(u8 taskId) if (sPopupMenuSelection != 0) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(-1); + sPopupMenuSelection = Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) @@ -2561,7 +3028,7 @@ static void sub_80A5888(u8 taskId) if (sPopupMenuSelection != gUnknown_02038564 - 1) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(1); + sPopupMenuSelection = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -2690,14 +3157,14 @@ static void sub_80A5C24(u8 taskId) void CleanUpItemMenuMessage(u8 taskId) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(7, 7, 13, 12); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(7, 7, 13, 12); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A5C24; } void CleanUpOverworldMessage(u8 taskId) { - MenuZeroFillWindowRect(0, 13, 29, 19); + Menu_EraseWindowRect(0, 13, 29, 19); DestroyTask(taskId); sub_8064E2C(); ScriptContext2_Disable(); @@ -2711,7 +3178,7 @@ void ExecuteItemUseFromBlackPalette(void) static void Task_CallItemUseOnFieldCallback(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) gFieldItemUseCallback(taskId); } @@ -2760,7 +3227,7 @@ static void sub_80A5DA0(u16 itemId, u16 quantity) static void sub_80A5DF8(void) { sub_80A4DA4(gBGTilemapBuffers[1]); - MenuZeroFillWindowRect(7, 6, 11, 13); + Menu_EraseWindowRect(7, 6, 11, 13); sub_80A7528(4); } @@ -2857,7 +3324,7 @@ static void sub_80A6024(u8 taskId) if (gMain.newKeys & A_BUTTON) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A6000; } } @@ -2963,7 +3430,7 @@ static void sub_80A62D8(void) gUnknown_02038563 = CreateTask(sub_80A50C8, 0); } -void sub_80A6300(void) +void ItemMenu_LoadSellMenu(void) { sReturnLocation = RETURN_TO_SHOP; SetMainCallback2(sub_80A62D8); @@ -2971,7 +3438,7 @@ void sub_80A6300(void) static void OnBagClose_Shop(u8 taskId) { - gFieldCallback = sub_80B3050; + gFieldCallback = Shop_FadeReturnToMartMenu; gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; sub_80A5AE4(taskId); @@ -3008,7 +3475,7 @@ static void sub_80A640C(u8 taskId) static void sub_80A6444(u8 taskId) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A640C; } @@ -3016,7 +3483,7 @@ static void sub_80A648C(u8 taskId) { gTasks[taskId].func = Task_BuyHowManyDialogueHandleInput; sub_80A4008(gBGTilemapBuffers[1], 1, 11, 12, 2); - MenuDrawTextWindow(0, 10, 13, 13); + Menu_DrawStdWindowFrame(0, 10, 13, 13); gTasks[taskId].data[1] = 1; gTasks[taskId].data[2] = 1; gTasks[taskId].data[3] = 11; @@ -3053,7 +3520,7 @@ static void sub_80A6574(u8 taskId) static void sub_80A65AC(u8 taskId) { - MenuZeroFillWindowRect(7, 6, 13, 12); + Menu_EraseWindowRect(7, 6, 13, 12); sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gOtherText_SoldItem); @@ -3063,7 +3530,7 @@ static void sub_80A65AC(u8 taskId) static void sub_80A6618(u8 taskId) { - MenuZeroFillWindowRect(7, 6, 13, 12); + Menu_EraseWindowRect(7, 6, 13, 12); sub_80A36B8(gBGTilemapBuffers[1], 7, 6, 6, 6); BuyMenuPrintItemQuantityAndPrice(taskId); } @@ -3078,13 +3545,13 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId) { if (sub_80A5350(taskId) == TRUE) { - MenuZeroFillWindowRect(6, 11, 12, 11); + Menu_EraseWindowRect(6, 11, 12, 11); BuyMenuDisplayMessage(gSpecialVar_ItemId, gTasks[taskId].data[1]); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(0, 10, 13, 13); + Menu_EraseWindowRect(0, 10, 13, 13); sub_80A36B8(gBGTilemapBuffers[1], 0, 10, 13, 3); ConvertIntToDecimalStringN(gStringVar1, ItemId_GetPrice(gSpecialVar_ItemId) / 2 * gTasks[taskId].data[1], STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gOtherText_CanPay); @@ -3110,8 +3577,8 @@ static void BuyMenuPrintItemQuantityAndPrice(u8 taskId) { sub_80A36B8(gBGTilemapBuffers[1], 0, 0, 31, 31); CloseMoneyWindow(0, 0); - MenuZeroFillWindowRect(0, 4, 13, 13); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 4, 13, 13); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_80A6760; } @@ -3229,7 +3696,7 @@ static void sub_80A6A84(u8 taskId) sub_80A4DA4(gBGTilemapBuffers[1]); CopyItemName(gSpecialVar_ItemId, gStringVar1); ConvertIntToDecimalStringN(gStringVar2, taskData[1], STR_CONV_MODE_LEFT_ALIGN, 3); - MenuZeroFillWindowRect(7, 6, 11, 13); + Menu_EraseWindowRect(7, 6, 11, 13); sub_80A7528(7); sub_80A3D5C(taskId); gTasks[taskId].func = sub_80A5E1C; @@ -3361,16 +3828,16 @@ static void sub_80A6DF0(u16 *a) { u8 r6 = (gUnknown_02038564 - 1) * 2; - MenuDrawTextWindow(7, 9 - r6, 13, 12); + Menu_DrawStdWindowFrame(7, 9 - r6, 13, 12); sub_80A4008(a, 8, 10 - r6, 5, r6 + 2); if (gUnknown_02038564 == 1) { - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 10); } else { - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); - MenuPrint(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[0]].text, 8, 8); + Menu_PrintText(sItemPopupMenuActions[sPopupMenuActionList[1]].text, 8, 10); } InitMenu(0, 8, 10 - r6, gUnknown_02038564, 0, 5); sub_80A7528(2); @@ -3383,7 +3850,7 @@ static void sub_80A6EB8(u8 taskId) if (sPopupMenuSelection == 1) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(-1); + sPopupMenuSelection = Menu_MoveCursor(-1); } } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) @@ -3391,7 +3858,7 @@ static void sub_80A6EB8(u8 taskId) if (sPopupMenuSelection + 1 < gUnknown_02038564) { PlaySE(SE_SELECT); - sPopupMenuSelection = MoveMenuCursor(1); + sPopupMenuSelection = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -3523,8 +3990,8 @@ static void sub_80A7230(u8 taskId) break; case 204: PlaySE(SE_SELECT); - sub_80F98A4(2); - sub_80F98A4(3); + StopVerticalScrollIndicators(LEFT_ARROW); + StopVerticalScrollIndicators(RIGHT_ARROW); gSpecialVar_ItemId = ITEM_POKE_BALL; sPopupMenuActionList = gUnknown_083C1708; gUnknown_02038564 = 2; @@ -3559,7 +4026,7 @@ static void ItemListMenu_InitMenu(void) static void sub_80A73C0(void) { - sub_814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); + MenuCursor_SetPos814AD7C(0x70, gBagPocketScrollStates[sCurrentBagPocket].cursorPos * 16 + 16); } static void sub_80A73F0(void) @@ -3569,16 +4036,53 @@ static void sub_80A73F0(void) static void sub_80A73FC(void) { - HandleDestroyMenuCursors(); - sub_814AD44(); + Menu_DestroyCursor(); + MenuCursor_Destroy814AD44(); } +#if DEBUG +__attribute__((naked)) +static void sub_80A740C(void) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl sub_80A75E4\n\ + bl sub_80A7768\n\ + bl sub_80A7420\n\ + ldr r0, ._931 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._930 @cond_branch\n\ + ldr r0, ._931 + 4 @ gLink\n\ + ldr r1, ._931 + 8 @ 0xfbd\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._930:\n\ + add sp, sp, #0x4\n\ + pop {r0}\n\ + bx r0\n\ +._932:\n\ + .align 2, 0\n\ +._931:\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else static void sub_80A740C(void) { sub_80A75E4(); sub_80A7768(); sub_80A7420(); } +#endif static void sub_80A7420(void) { @@ -3669,7 +4173,7 @@ static void sub_80A756C(void) static void sub_80A7590(void) { - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); sub_80A756C(); } @@ -3748,7 +4252,7 @@ static void sub_80A7694(void) static void sub_80A76A0(void) { - MenuZeroFillWindowRect(14, 2, 29, 18); + Menu_EraseWindowRect(14, 2, 29, 18); sub_80A7678(); } @@ -3816,7 +4320,7 @@ static void sub_80A7768(void) const u8 *text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; int var = r4->unk1 - 1; - MenuPrint(text, 7, var * 2 + 1 + r4->unk3); + Menu_PrintText(text, 7, var * 2 + 1 + r4->unk3); } else { @@ -3828,7 +4332,7 @@ static void sub_80A7768(void) else text = sItemPopupMenuActions[sPopupMenuActionList[r4->unk1 - 1]].text; var = r4->unk1 - 1; - MenuPrint(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); + Menu_PrintText(text, (var >> 1) * 6 + 1, (var & 1) * 2 + 8); } if (r4->unk1 == gUnknown_02038564) { diff --git a/src/field/item_use.c b/src/field/item_use.c index e1fdddce0..219ef5080 100644 --- a/src/field/item_use.c +++ b/src/field/item_use.c @@ -40,7 +40,7 @@ extern void (*gFieldItemUseCallback)(u8); extern void (*gFieldCallback)(void); extern void (*gUnknown_0300485C)(void); -extern void (*gUnknown_03004AE4)(u8, u16, TaskFunc); +extern void (*gPokemonItemUseCallback)(u8, u16, TaskFunc); extern u8 gUnknown_02038561; extern u8 gLastFieldPokeMenuOpened; @@ -100,7 +100,7 @@ void ItemMenu_ConfirmNormalFade(u8 var) void ItemMenu_ConfirmComplexFade(u8 var) { ExecuteSwitchToOverworldFromItemUse(var); - fade_screen(1, 0); + FadeScreen(1, 0); } void SetUpItemUseOnFieldCallback(u8 taskId) @@ -123,7 +123,7 @@ void HandleDeniedItemUseMessage(u8 var1, u8 playerMenuStatus, const u8 *text) switch (playerMenuStatus) { case 0: // Item Menu - MenuZeroFillWindowRect(0, 13, 13, 20); + Menu_EraseWindowRect(0, 13, 13, 20); DisplayItemMessageOnField(var1, gStringVar4, CleanUpItemMenuMessage, 1); break; default: // Field @@ -259,7 +259,7 @@ void ItemUseOnFieldCB_Rod(u8 taskId) void ItemUseOutOfBattle_Itemfinder(u8 var) { - IncrementGameStat(0x27); + IncrementGameStat(GAME_STAT_USED_ITEMFINDER); gFieldItemUseCallback = (void *)ItemUseOnFieldCB_Itemfinder; SetUpItemUseOnFieldCallback(var); } @@ -312,7 +312,7 @@ void RunItemfinderResults(u8 taskId) void ExitItemfinder(u8 taskId) { - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); sub_8064E2C(); ScriptContext2_Disable(); DestroyTask(taskId); @@ -744,7 +744,7 @@ void ItemUseOutOfBattle_CoinCase(u8 taskId) if (!gTasks[taskId].data[2]) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); } else @@ -770,7 +770,7 @@ void ItemUseOutOfBattle_SSTicket(u8 taskId) { if (gTasks[taskId].data[2] == 0) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gSpecialVar_ItemId)], sub_80C9BB8, 1); } else @@ -832,7 +832,7 @@ void sub_80C9D98(u8 taskId) void ItemUseOutOfBattle_Medicine(u8 taskId) { - gUnknown_03004AE4 = UseMedicine; + gPokemonItemUseCallback = UseMedicine; sub_80C9D98(taskId); } @@ -850,34 +850,34 @@ void ItemUseOutOfBattle_SacredAsh(u8 taskId) break; } } - gUnknown_03004AE4 = sub_8070048; + gPokemonItemUseCallback = sub_8070048; gUnknown_02038561 = 4; ItemMenu_ConfirmNormalFade(taskId); } void ItemUseOutOfBattle_PPRecovery(u8 taskId) { - gUnknown_03004AE4 = DoPPRecoveryItemEffect; + gPokemonItemUseCallback = DoPPRecoveryItemEffect; sub_80C9D98(taskId); } void ItemUseOutOfBattle_PPUp(u8 taskId) { - gUnknown_03004AE4 = DoPPUpItemEffect; + gPokemonItemUseCallback = DoPPUpItemEffect; sub_80C9D98(taskId); } void ItemUseOutOfBattle_RareCandy(u8 taskId) { - gUnknown_03004AE4 = DoRareCandyItemEffect; + gPokemonItemUseCallback = DoRareCandyItemEffect; sub_80C9D98(taskId); } void ItemUseOutOfBattle_TMHM(u8 taskId) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); - if (gSpecialVar_ItemId >= ITEM_HM01) + if (gSpecialVar_ItemId >= ITEM_HM01_CUT) DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM else DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM @@ -908,7 +908,7 @@ void sub_80C9F80(u8 var) void sub_80C9FC0(u8 var) { - gUnknown_03004AE4 = TeachMonTMMove; + gPokemonItemUseCallback = TeachMonTMMove; sub_80C9D98(var); } @@ -1009,7 +1009,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId) void ItemUseOutOfBattle_EvolutionStone(u8 var) { - gUnknown_03004AE4 = DoEvolutionStoneItemEffect; + gPokemonItemUseCallback = DoEvolutionStoneItemEffect; sub_80C9D98(var); } @@ -1022,7 +1022,7 @@ void ItemUseInBattle_PokeBall(u8 var) } else { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); } } @@ -1047,7 +1047,7 @@ void ItemUseInBattle_StatIncrease(u8 taskId) { u16 partyId = gBattlePartyID[gBankInMenu]; - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE) { @@ -1078,25 +1078,25 @@ void sub_80CA3C0(u8 taskId) void ItemUseInBattle_Medicine(u8 var) { - gUnknown_03004AE4 = UseMedicine; + gPokemonItemUseCallback = UseMedicine; sub_80CA3C0(var); } void unref_sub_80CA410(u8 var) { - gUnknown_03004AE4 = sub_8070048; + gPokemonItemUseCallback = sub_8070048; sub_80CA3C0(var); } void ItemUseInBattle_PPRecovery(u8 var) { - gUnknown_03004AE4 = DoPPRecoveryItemEffect; + gPokemonItemUseCallback = DoPPRecoveryItemEffect; sub_80CA3C0(var); } void unref_sub_80CA448(u8 var) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); if (ExecuteTableBasedItemEffect__(0, gSpecialVar_ItemId, 0) == FALSE) { @@ -1113,7 +1113,7 @@ void unref_sub_80CA448(u8 var) void ItemUseInBattle_Escape(u8 taskId) { - MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + Menu_EraseWindowRect(0, 0xD, 0xD, 0x14); if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) { diff --git a/src/field/map_name_popup.c b/src/field/map_name_popup.c index 2e2dfc72e..49a470cc1 100644 --- a/src/field/map_name_popup.c +++ b/src/field/map_name_popup.c @@ -89,8 +89,8 @@ void HideMapNamePopup(void) { if (FuncIsActiveTask(Task_MapNamePopup)) { - MenuLoadTextWindowGraphics(); - MenuZeroFillWindowRect(0, 0, 13, 3); + Menu_LoadStdFrameGraphics(); + Menu_EraseWindowRect(0, 0, 13, 3); REG_BG0VOFS = 0; DestroyTask(sTaskId); } @@ -100,8 +100,8 @@ void DrawMapNamePopup(void) { u8 name[20]; - MenuLoadTextWindowGraphics_OverrideFrameType(0); + Menu_LoadStdFrameGraphicsOverrideStyle(0); GetMapSectionName(name, gMapHeader.regionMapSectionId, 0); - MenuDrawTextWindow(0, 0, 13, 3); + Menu_DrawStdWindowFrame(0, 0, 13, 3); sub_8072BD8(name, 1, 1, 0x60); } diff --git a/src/field/mauville_man.c b/src/field/mauville_man.c index 4db513f65..b42c50513 100644 --- a/src/field/mauville_man.c +++ b/src/field/mauville_man.c @@ -250,7 +250,88 @@ void SetupMauvilleOldMan(void) sub_80F83D0(); } -static u8 GetCurrentMauvilleOldMan(void) +#if DEBUG +__attribute__((naked)) +void debug_sub_810B32C() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x4\n" + " bhi ._37 @cond_branch\n" + " lsl r0, r0, #0x2\n" + " ldr r1, ._23 @ \n" + " add r0, r0, r1\n" + " ldr r0, [r0]\n" + " mov pc, r0\n" + "._24:\n" + " .align 2, 0\n" + "._23:\n" + " .word ._22\n" + "._22:\n" + " .word ._25\n" + " .word ._26\n" + " .word ._27\n" + " .word ._28\n" + " .word ._29\n" + "._25:\n" + " bl SetupBard\n" + " b ._37\n" + "._26:\n" + " mov r2, #0x0\n" + " ldr r3, ._34 @ gSaveBlock1\n" + "._31:\n" + " mov r0, sp\n" + " add r1, r0, r2\n" + " add r0, r2, r3\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x7\n" + " bls ._31 @cond_branch\n" + " bl SetupHipster\n" + " mov r2, #0x0\n" + " ldr r3, ._34 @ gSaveBlock1\n" + "._32:\n" + " add r1, r2, r3\n" + " mov r4, sp\n" + " add r0, r4, r2\n" + " ldrb r0, [r0]\n" + " strb r0, [r1]\n" + " add r0, r2, #1\n" + " lsl r0, r0, #0x18\n" + " lsr r2, r0, #0x18\n" + " cmp r2, #0x7\n" + " bls ._32 @cond_branch\n" + " b ._37\n" + "._35:\n" + " .align 2, 0\n" + "._34:\n" + " .word gSaveBlock1+0x2d8c\n" + "._27:\n" + " bl SetupTrader\n" + " b ._37\n" + "._28:\n" + " bl SetupStoryteller\n" + " b ._37\n" + "._29:\n" + " bl SetupGiddy\n" + "._37:\n" + " bl sub_80F83D0\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} +#endif + +u8 GetCurrentMauvilleOldMan(void) { struct MauvilleManCommon *common = &gSaveBlock1.mauvilleMan.common; @@ -345,7 +426,7 @@ void PrepareSongText(void) void ScrSpecial_PlayBardSong(void) { StartBardSong(gSpecialVar_0x8004); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); ScriptContext1_Stop(); } @@ -858,8 +939,8 @@ static void Task_BardSong(u8 taskId) { case 0: // Initialize song PrepareSongText(); - InitWindowFromConfig(gMenuWindowPtr, &gWindowConfig_81E6CE4); - sub_8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15); + Text_InitWindowWithTemplate(gMenuWindowPtr, &gWindowTemplate_81E6CE4); + Text_InitWindow8002EB0(gMenuWindowPtr, gStringVar4, 2, 4, 15); task->data[1] = 0; task->data[2] = 0; task->tCharIndex = 0; @@ -921,7 +1002,7 @@ static void Task_BardSong(u8 taskId) } else if (gStringVar4[task->tCharIndex] == CHAR_SPACE) { - sub_8003418(gMenuWindowPtr); + Text_PrintWindowSimple(gMenuWindowPtr); task->tCharIndex++; task->tState = 2; task->data[2] = 0; @@ -941,7 +1022,7 @@ static void Task_BardSong(u8 taskId) else if (gStringVar4[task->tCharIndex] == CHAR_SONG_WORD_SEPARATOR) { gStringVar4[task->tCharIndex] = CHAR_SPACE; // restore it back to a space - sub_8003418(gMenuWindowPtr); + Text_PrintWindowSimple(gMenuWindowPtr); task->tCharIndex++; task->data[2] = 0; } @@ -950,7 +1031,7 @@ static void Task_BardSong(u8 taskId) switch (task->data[1]) { case 0: - sub_8003418(gMenuWindowPtr); + Text_PrintWindowSimple(gMenuWindowPtr); task->data[1]++; break; case 1: @@ -1219,7 +1300,7 @@ static void PrintStoryList(void) { s32 i; - MenuDrawTextWindow(0, 0, 25, 4 + GetFreeStorySlot() * 2); + Menu_DrawStdWindowFrame(0, 0, 25, 4 + GetFreeStorySlot() * 2); for (i = 0; i < 4; i++) { struct MauvilleManStoryteller *storyteller = &gSaveBlock1.mauvilleMan.storyteller; @@ -1227,9 +1308,9 @@ static void PrintStoryList(void) if (stat == 0) break; - MenuPrint(GetStoryTitleByStat(stat), 1, 2 + i * 2); + Menu_PrintText(GetStoryTitleByStat(stat), 1, 2 + i * 2); } - MenuPrint(gPCText_Cancel, 1, 2 + i * 2); + Menu_PrintText(gPCText_Cancel, 1, 2 + i * 2); } static u8 gUnknown_03000748; @@ -1247,7 +1328,7 @@ static void Task_StoryListMenu(u8 taskId) task->data[0]++; break; case 1: - selection = ProcessMenuInput(); + selection = Menu_ProcessInput(); if (selection == -2) break; if (selection == -1 || selection == GetFreeStorySlot()) @@ -1259,8 +1340,8 @@ static void Task_StoryListMenu(u8 taskId) gSpecialVar_Result = 1; gUnknown_03000748 = selection; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 25, 12); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 25, 12); DestroyTask(taskId); EnableBothScriptContexts(); break; diff --git a/src/field/menu_helpers.c b/src/field/menu_helpers.c index e3ef0c790..388d98ec7 100644 --- a/src/field/menu_helpers.c +++ b/src/field/menu_helpers.c @@ -18,7 +18,7 @@ static void sub_80F9834(struct Sprite *sprite); -static EWRAM_DATA u8 gUnknown_020388C0[4] = {0}; +static EWRAM_DATA u8 gVerticalScrollIndicatorIds[4] = {0}; static EWRAM_DATA struct YesNoFuncTable gUnknown_020388C4 = {0}; static TaskFunc gUnknown_0300074C; @@ -125,7 +125,7 @@ static const struct SpriteTemplate gSpriteTemplate_83E5A00 = .callback = SpriteCallbackDummy, }; -void sub_80F9020(void) +void ClearBGTilemapBuffers(void) { memset(&gBGTilemapBuffers[1], 0, 0x800); memset(&gBGTilemapBuffers[2], 0, 0x800); @@ -135,7 +135,7 @@ void sub_80F9020(void) // display message box, fill box with tile if tile is not zero, print string static void PrintMessage(const u8 *str, u16 tile) { - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); if (tile) { sub_80A3FA0(&gBGTilemapBuffers[1][0], 2, 15, 26, 4, tile); @@ -145,7 +145,7 @@ static void PrintMessage(const u8 *str, u16 tile) static void sub_80F9090(u8 taskId) { - if (MenuUpdateWindowText() == TRUE) + if (Menu_UpdateWindowText() == TRUE) { gUnknown_0300074C(taskId); } @@ -160,7 +160,7 @@ void DisplayItemMessageOnField(u8 taskId, const u8 *str, TaskFunc callback, u16 static void Task_CallYesOrNoCallback(u8 taskId) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: PlaySE(SE_SELECT); @@ -196,7 +196,7 @@ static void PrintStringWithPalette(const u8 *str, u8 paletteNum, u8 left, u8 top StringCopy(gStringVar4, str); } - MenuPrint(gStringVar4, left, top); + Menu_PrintText(gStringVar4, left, top); } // unused @@ -209,7 +209,7 @@ void PrintNumberWithPalette(s32 value, u8 paletteNum, u8 n, u8 mode, u8 left, u8 } else { - MenuPrint(gStringVar1, left, top); + Menu_PrintText(gStringVar1, left, top); } } @@ -296,9 +296,6 @@ bool8 sub_80F9344(void) void sub_80F9368(void) { - u8 *addr; - u32 size; - REG_DISPCNT = 0; REG_BG3CNT = 0; REG_BG2CNT = 0; @@ -312,38 +309,24 @@ void sub_80F9368(void) REG_BG1VOFS = 0; REG_BG0HOFS = 0; REG_BG0VOFS = 0; - - addr = (u8 *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - + DmaFill16Large(3, 0, (u8 *)VRAM, 0x18000, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); } -void sub_80F9438(void) +void ClearVideoCallbacks(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); } -void sub_80F944C(void) +void ClearVerticalScrollIndicatorPalettes(void) { u8 i; for (i = 0; i < 4; i++) { - gUnknown_020388C0[i] = 0xFF; + gVerticalScrollIndicatorIds[i] = 0xFF; } FreeSpritePaletteByTag(SCROLL_INDICATOR_PAL_TAG); @@ -401,92 +384,92 @@ void CreateVerticalScrollIndicators(u8 id, u16 x, u16 y) switch (id) { - case 0: - if (gUnknown_020388C0[0] == 0xFF) + case TOP_ARROW: + if (gVerticalScrollIndicatorIds[TOP_ARROW] == 0xFF) { - gUnknown_020388C0[0] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gUnknown_020388C0[0]].data[2] = -1; - if (gUnknown_020388C0[1] != 0xFF) + gVerticalScrollIndicatorIds[TOP_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[2] = -1; + if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[0]].pos2.y = gSprites[gUnknown_020388C0[1]].pos2.y * -1; - gSprites[gUnknown_020388C0[0]].data[3] = gSprites[gUnknown_020388C0[1]].data[3]; + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y * -1; + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3]; } else { - gSprites[gUnknown_020388C0[0]].data[3] = 0; + gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3] = 0; } } break; - case 1: - if (gUnknown_020388C0[1] == 0xFF) + case BOTTOM_ARROW: + if (gVerticalScrollIndicatorIds[BOTTOM_ARROW] == 0xFF) { - gUnknown_020388C0[1] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); - gSprites[gUnknown_020388C0[1]].data[2] = 1; - if (gUnknown_020388C0[0] != 0xFF) + gVerticalScrollIndicatorIds[BOTTOM_ARROW] = CreateSprite(&gSpriteTemplate_83E59D0, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[2] = 1; + if (gVerticalScrollIndicatorIds[TOP_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[1]].pos2.y = gSprites[gUnknown_020388C0[0]].pos2.y * -1; - gSprites[gUnknown_020388C0[1]].data[3] = gSprites[gUnknown_020388C0[0]].data[3]; + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].pos2.y = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].pos2.y * -1; + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = gSprites[gVerticalScrollIndicatorIds[TOP_ARROW]].data[3]; } else { - gSprites[gUnknown_020388C0[1]].data[3] = 0; + gSprites[gVerticalScrollIndicatorIds[BOTTOM_ARROW]].data[3] = 0; } } break; - case 2: - if (gUnknown_020388C0[2] == 0xFF) + case LEFT_ARROW: + if (gVerticalScrollIndicatorIds[LEFT_ARROW] == 0xFF) { - gUnknown_020388C0[2] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gUnknown_020388C0[2]].data[0] = -1; - if (gUnknown_020388C0[3] != 0xFF) + gVerticalScrollIndicatorIds[LEFT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[0] = -1; + if (gVerticalScrollIndicatorIds[RIGHT_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[2]].pos2.x = gSprites[gUnknown_020388C0[3]].pos2.x * -1; - gSprites[gUnknown_020388C0[2]].data[1] = gSprites[gUnknown_020388C0[3]].data[1]; + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x * -1; + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1]; } else { - gSprites[gUnknown_020388C0[2]].data[1] = 0; + gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1] = 0; } } break; - case 3: - if (gUnknown_020388C0[3] == 0xFF) + case RIGHT_ARROW: + if (gVerticalScrollIndicatorIds[RIGHT_ARROW] == 0xFF) { - gUnknown_020388C0[3] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); - gSprites[gUnknown_020388C0[3]].data[0] = 1; - if (gUnknown_020388C0[2] != 0xFF) + gVerticalScrollIndicatorIds[RIGHT_ARROW] = CreateSprite(&gSpriteTemplate_83E59E8, x, y, 0); + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[0] = 1; + if (gVerticalScrollIndicatorIds[LEFT_ARROW] != 0xFF) { - gSprites[gUnknown_020388C0[3]].pos2.x = gSprites[gUnknown_020388C0[2]].pos2.x * -1; - gSprites[gUnknown_020388C0[3]].data[1] = gSprites[gUnknown_020388C0[2]].data[1]; + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].pos2.x = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].pos2.x * -1; + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = gSprites[gVerticalScrollIndicatorIds[LEFT_ARROW]].data[1]; } else { - gSprites[gUnknown_020388C0[3]].data[1] = 0; + gSprites[gVerticalScrollIndicatorIds[RIGHT_ARROW]].data[1] = 0; } } break; } - StartSpriteAnim(&gSprites[gUnknown_020388C0[id]], id & 1); + StartSpriteAnim(&gSprites[gVerticalScrollIndicatorIds[id]], id & 1); } -void sub_80F979C(u8 id, bool8 invisible) +void SetVerticalScrollIndicators(u8 id, bool8 invisible) { - if (id < 4 && gUnknown_020388C0[id] != 0xFF) + if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) { - gSprites[gUnknown_020388C0[id]].invisible = invisible; + gSprites[gVerticalScrollIndicatorIds[id]].invisible = invisible; } } void DestroyVerticalScrollIndicator(u8 id) { - if (id < 4 && gUnknown_020388C0[id] != 0xFF) + if (id < 4 && gVerticalScrollIndicatorIds[id] != 0xFF) { - DestroySprite(&gSprites[gUnknown_020388C0[id]]); - gUnknown_020388C0[id] = 0xFF; + DestroySprite(&gSprites[gVerticalScrollIndicatorIds[id]]); + gVerticalScrollIndicatorIds[id] = 0xFF; } } @@ -530,43 +513,43 @@ static void sub_80F9834(struct Sprite *sprite) } } -void sub_80F98A4(u8 id) +void StopVerticalScrollIndicators(u8 id) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].callback = SpriteCallbackDummy; + gSprites[gVerticalScrollIndicatorIds[id]].callback = SpriteCallbackDummy; } } void StartVerticalScrollIndicators(u8 id) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].callback = sub_80F9834; + gSprites[gVerticalScrollIndicatorIds[id]].callback = sub_80F9834; } } -static void sub_80F9914(u8 id) +static void ResetVerticalScrollIndicators(u8 id) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].pos2.x = 0; - gSprites[gUnknown_020388C0[id]].pos2.y = 0; - gSprites[gUnknown_020388C0[id]].data[1] = 0; - gSprites[gUnknown_020388C0[id]].data[3] = 0; + gSprites[gVerticalScrollIndicatorIds[id]].pos2.x = 0; + gSprites[gVerticalScrollIndicatorIds[id]].pos2.y = 0; + gSprites[gVerticalScrollIndicatorIds[id]].data[1] = 0; + gSprites[gVerticalScrollIndicatorIds[id]].data[3] = 0; } } void PauseVerticalScrollIndicator(u8 id) { - sub_80F98A4(id); - sub_80F9914(id); + StopVerticalScrollIndicators(id); + ResetVerticalScrollIndicators(id); } -void sub_80F9988(u8 id, u8 priority) +void SetVerticalScrollIndicatorPriority(u8 id, u8 priority) { - if (gUnknown_020388C0[id] != 0xFF && id < 4) + if (gVerticalScrollIndicatorIds[id] != 0xFF && id < 4) { - gSprites[gUnknown_020388C0[id]].oam.priority = priority; + gSprites[gVerticalScrollIndicatorIds[id]].oam.priority = priority; } } diff --git a/src/field/money.c b/src/field/money.c index d0f0ab1f6..3b7268dbc 100644 --- a/src/field/money.c +++ b/src/field/money.c @@ -100,6 +100,8 @@ void GetMoneyAmountText(u8 *buffer, u32 amount, u8 arg2) width = 7; else if (amount > 99999) width = 6; + // A special sprite is used for 10000 in the decoration + // shop, so be sure to account for this. else if (amount > 10000) width = 5; else if (amount > 999) @@ -143,12 +145,12 @@ void PrintMoneyAmount(u32 amount, u8 size, u8 x, u8 y) if (stringWidth >= (size + 1) * 8) { - MenuPrint(buffer, x, y); + Menu_PrintText(buffer, x, y); } else { int xPlusOne = x + 1; - MenuPrint_PixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); + Menu_PrintTextPixelCoords(buffer, (xPlusOne + size) * 8 - stringWidth, y * 8, 1); } } @@ -175,7 +177,7 @@ void sub_80B7AEC(u32 arg0, u8 left, u8 top) } __attribute__((naked)) -void sub_80B7B34(u8 var1, u8 var2, int var3) +void Draw10000Sprite(u8 var1, u8 var2, int var3) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -275,7 +277,7 @@ void UpdateMoneyWindow(u32 amount, u8 x, u8 y) void OpenMoneyWindow(u32 amount, u8 x, u8 y) { - MenuDrawTextWindow(x, y, x + 13, y + 3); + Menu_DrawStdWindowFrame(x, y, x + 13, y + 3); UpdateMoneyWindow(amount, x, y); LoadCompressedObjectPic(gUnknown_083CF584); @@ -288,7 +290,7 @@ void CloseMoneyWindow(u8 x, u8 y) { DestroySpriteAndFreeResources(&gSprites[gUnknown_02038734]); FreeSpritePaletteByTag(SPRITE_TAG_MONEY); - MenuZeroFillWindowRect(x, y, x + 13, y + 3); + Menu_EraseWindowRect(x, y, x + 13, y + 3); } bool8 HasEnoughMoneyFor(void) diff --git a/src/field/overworld.c b/src/field/overworld.c index e239daec7..07135080e 100644 --- a/src/field/overworld.c +++ b/src/field/overworld.c @@ -25,6 +25,7 @@ #include "link.h" #include "load_save.h" #include "main.h" +#include "m4a.h" #include "constants/maps.h" #include "map_name_popup.h" #include "menu.h" @@ -47,7 +48,7 @@ #include "tileset_anim.h" #include "time_events.h" #include "tv.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "wild_encounter.h" #ifdef SAPPHIRE @@ -62,6 +63,7 @@ struct UnkTVStruct u32 tv_field_4; }; +extern u8 gUnknown_020297ED; extern u16 gUnknown_03004898; extern u16 gUnknown_0300489C; @@ -142,7 +144,7 @@ const struct UCoords32 gUnknown_0821664C[] = { 1, -1}, }; -const struct UnknownTaskStruct gUnknown_08216694 = +const struct ScanlineEffectParams gUnknown_08216694 = { (void *)REG_ADDR_WIN0H, ((DMA_ENABLE | DMA_START_HBLANK | DMA_REPEAT | DMA_DEST_RELOAD) << 16) | 1, @@ -590,7 +592,7 @@ bool8 sub_80538D0(u16 x, u16 y) void sub_80538F0(u8 mapGroup, u8 mapNum) { - s32 i; + s32 paletteIndex; Overworld_SetWarpDestination(mapGroup, mapNum, -1, -1, -1); sub_8053F0C(); @@ -611,8 +613,8 @@ void sub_80538F0(u8 mapGroup, u8 mapNum) sub_8056D38(gMapHeader.mapData); apply_map_tileset2_palette(gMapHeader.mapData); - for (i = 6; i < 12; i++) - sub_807D874(i); + for (paletteIndex = 6; paletteIndex < 12; paletteIndex++) + ApplyWeatherGammaShiftToPal(paletteIndex); sub_8072ED0(); UpdateLocationHistoryForRoamer(); @@ -1106,6 +1108,68 @@ u8 sav1_map_get_battletype(void) return Overworld_GetMapHeaderByGroupAndId(gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum)->battleType; } +#if DEBUG + +void debug_sub_8076B68(void); + +void debug_sub_80589D8(void); + +void debug_sub_8058A50(void); + +void CB2_InitTestMenu(void) +{ + m4aSoundVSyncOff(); + SetVBlankCallback(NULL); + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + ResetPaletteFade(); + ResetSpriteData(); + ResetTasks(); + ScanlineEffect_Stop(); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); + debug_sub_8076B68(); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + REG_IE |= 1; + REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP; + m4aSoundVSyncOn(); + SetVBlankCallback(debug_sub_8058A50); + m4aSongNumStart(0x19D); + SetMainCallback2(debug_sub_80589D8); +} + +void debug_sub_80589D8(void) +{ + if (UpdatePaletteFade()) + return; + + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); +} + +void debug_sub_80589F4(void) +{ + if (UpdatePaletteFade()) + return; + + SetVBlankCallback(NULL); + + DmaFill32(3, 0, (void *) VRAM, VRAM_SIZE); + DmaFill32(3, 0, (void *) PLTT, PLTT_SIZE); + + SetMainCallback2(gMain.savedCallback); +} + +void debug_sub_8058A50(void) +{ + ProcessSpriteCopyRequests(); + LoadOam(); + TransferPlttBuffer(); +} + +#endif + void ResetSafariZoneFlag_(void) { ResetSafariZoneFlag(); @@ -1210,6 +1274,33 @@ void CB2_NewGame(void) SetMainCallback2(c2_overworld); } +#if DEBUG + +extern void (*gFieldCallback)(void); + +void debug_sub_8058C00(void) +{ + FieldClearVBlankHBlankCallbacks(); + StopMapMusic(); + ResetSafariZoneFlag_(); + player_avatar_init_params_reset(); + PlayTimeCounter_Start(); + ScriptContext1_Init(); + ScriptContext2_Disable(); + + if (gMain.heldKeys & R_BUTTON) + gFieldCallback = ExecuteTruckSequence; + else + gFieldCallback = sub_8080B60; + + do_load_map_stuff_loop(&gMain.state); + SetFieldVBlankCallback(); + set_callback1(c1_overworld); + SetMainCallback2(c2_overworld); +} + +#endif + void CB2_WhiteOut(void) { u8 val; @@ -1365,6 +1456,10 @@ void CB2_ContinueSavedGame(void) { FieldClearVBlankHBlankCallbacks(); StopMapMusic(); +#if DEBUG + if (gMain.heldKeys & R_BUTTON) + gUnknown_020297ED = TRUE; +#endif ResetSafariZoneFlag_(); LoadSaveblockMapHeader(); LoadSaveblockMapObjScripts(); @@ -1410,7 +1505,7 @@ void VBlankCB_Field(void) { LoadOam(); ProcessSpriteCopyRequests(); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); sub_8057A58(); TransferPlttBuffer(); sub_8072E74(); @@ -1422,7 +1517,7 @@ void sub_8054814(void) if (val) { sub_80815E0(val); - sub_80895F8(gUnknown_08216694); + ScanlineEffect_SetParams(gUnknown_08216694); } } @@ -1456,8 +1551,8 @@ bool32 sub_805483C(u8 *a1) case 4: sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); (*a1)++; break; case 5: @@ -1522,8 +1617,8 @@ bool32 sub_805493C(u8 *a1, u32 a2) case 4: sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); (*a1)++; break; case 5: @@ -1612,8 +1707,8 @@ bool32 sub_8054A9C(u8 *a1) case 3: sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); (*a1)++; break; case 4: @@ -1664,29 +1759,12 @@ void do_load_map_stuff_loop(u8 *a1) void sub_8054BA8(void) { - u8 *addr; - u32 size; - REG_DISPCNT = 0; - remove_some_task(); + ScanlineEffect_Stop(); DmaClear16(3, PLTT + 2, PLTT_SIZE - 2); - - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); ResetOamRange(0, 128); LoadOam(); } @@ -1695,8 +1773,8 @@ void sub_8054C2C(void) { sub_8054814(); sub_8054C54(); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); mapdata_load_assets_to_gpu_and_full_redraw(); } @@ -1731,7 +1809,7 @@ void sub_8054D4C(u32 a1) ResetTasks(); ResetSpriteData(); ResetPaletteFade(); - dp12_8087EA4(); + ScanlineEffect_Clear(); ResetCameraUpdateInfo(); InstallCameraPanAheadCallback(); sub_805C7C4(0); diff --git a/src/field/party_menu.c b/src/field/party_menu.c index 9c1150515..66e7e2319 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -32,7 +32,7 @@ #include "string_util.h" #include "strings.h" #include "task.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "util.h" #include "script_pokemon_80F9.h" #include "ewram.h" @@ -94,14 +94,21 @@ static void SpriteCB_UpdateHeldItemIconPosition(struct Sprite *sprite); static void ItemUseMoveMenu_HandleMoveSelection(u8 taskId); static void ItemUseMoveMenu_HandleCancel(u8 taskId); static bool8 SetupDefaultPartyMenu(void); -static void sub_806B4A8(void); -static void VBlankCB_PartyMenu(void); -static bool8 LoadPartyMenuGraphics(u8 a); +/*static*/ void sub_806B4A8(void); +/*static*/ void VBlankCB_PartyMenu(void); +/*static*/ bool8 LoadPartyMenuGraphics(u8 a); static void sub_806BF24(const u8 *a, u8 monIndex, u8 c, u8 d); static void sub_806BB9C(u8 a); static void sub_806BBEC(u8 a); -const u16 TMHMMoves[] = { +EWRAM_DATA u8 gUnknown_0202E8F4 = 0; +EWRAM_DATA u8 gUnknown_0202E8F5 = 0; +EWRAM_DATA u8 gUnknown_0202E8F6 = 0; +EWRAM_DATA u16 gUnknown_0202E8F8 = 0; +EWRAM_DATA u8 gPartyMenuType = 0; + +const u16 TMHMMoves[] = +{ MOVE_FOCUS_PUNCH, MOVE_DRAGON_CLAW, MOVE_WATER_PULSE, @@ -458,10 +465,6 @@ struct Unk201FE00 extern u16 gBattleTypeFlags; extern u8 gTileBuffer[]; -extern u8 gUnknown_0202E8F4; -extern u8 gUnknown_0202E8F6; -extern u16 gUnknown_0202E8F8; -extern u8 gPartyMenuType; extern u8 gLastFieldPokeMenuOpened; extern u8 gPlayerPartyCount; extern s32 gBattleMoveDamage; @@ -490,9 +493,71 @@ extern const u8 gStatusPal_Icons[]; #define WINDOW_RIGHT (29) #endif - -#ifdef NONMATCHING -// Main handler for the party menu. +#if DEBUG +__attribute__((naked)) +void CB2_PartyMenuMain(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + add sp, sp, #0xfffffffc\n\ + bl AnimateSprites\n\ + bl BuildOamBuffer\n\ + ldr r0, ._3 @ gPartyMenuType\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x4\n\ + ldr r1, ._3 + 4 @ PartyMonTextSettings\n\ + add r5, r0, r1\n\ + mov r6, #0x0\n\ +._1:\n\ + ldrb r0, [r5]\n\ + lsl r0, r0, #0x3\n\ + ldrb r1, [r5, #0x1]\n\ + lsl r1, r1, #0x3\n\ + ldr r2, [r5, #0x4]\n\ + lsl r3, r6, #0x5\n\ + mov r4, #0x80\n\ + lsl r4, r4, #0x2\n\ + orr r3, r3, r4\n\ + str r3, [sp]\n\ + mov r3, #0x0\n\ + bl DrawPartyMenuMonText\n\ + add r5, r5, #0x8\n\ + add r6, r6, #0x1\n\ + cmp r6, #0x5\n\ + ble ._1 @cond_branch\n\ + bl RunTasks\n\ + bl UpdatePaletteFade\n\ + ldr r0, ._3 + 8 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._2 @cond_branch\n\ + ldr r0, ._3 + 12 @ gLink\n\ + ldr r1, ._3 + 16 @ 0xfbd\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x2\n\ + str r1, [sp]\n\ + mov r1, #0x1\n\ + mov r2, #0x1\n\ + mov r3, #0x2\n\ + bl debug_sub_8008264\n\ +._2:\n\ + add sp, sp, #0x4\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._4:\n\ + .align 2, 0\n\ +._3:\n\ + .word gPartyMenuType\n\ + .word PartyMonTextSettings\n\ + .word gLinkOpen\n\ + .word gLink\n\ + .word 0xfbd"); +} +#else void CB2_PartyMenuMain(void) { const struct PartyMonTextSettingsStruct *textSettings; @@ -506,62 +571,18 @@ void CB2_PartyMenuMain(void) { // Draw mon name, level, and hp sprites DrawPartyMenuMonText( - textSettings[i].xOffset * 8, - textSettings[i].yOffset * 8, - textSettings[i].oamSettings, + textSettings->xOffset * 8, + textSettings->yOffset * 8, + textSettings->oamSettings, 0, (i << 5) | 0x200); + textSettings++; } RunTasks(); UpdatePaletteFade(); } -#else -__attribute__((naked)) -void CB2_PartyMenuMain(void) -{ - asm(".syntax unified\n\ - push {r4-r6,lr}\n\ - sub sp, 0x4\n\ - bl AnimateSprites\n\ - bl BuildOamBuffer\n\ - ldr r0, _0806AF2C @ =gPartyMenuType\n\ - ldrb r1, [r0]\n\ - lsls r0, r1, 1\n\ - adds r0, r1\n\ - lsls r0, 4\n\ - ldr r1, _0806AF30 @ =PartyMonTextSettings\n\ - adds r5, r0, r1\n\ - movs r6, 0\n\ -_0806AEF8:\n\ - ldrb r0, [r5]\n\ - lsls r0, 3\n\ - ldrb r1, [r5, 0x1]\n\ - lsls r1, 3\n\ - ldr r2, [r5, 0x4]\n\ - lsls r3, r6, 5\n\ - movs r4, 0x80\n\ - lsls r4, 2\n\ - orrs r3, r4\n\ - str r3, [sp]\n\ - movs r3, 0\n\ - bl DrawPartyMenuMonText\n\ - adds r5, 0x8\n\ - adds r6, 0x1\n\ - cmp r6, 0x5\n\ - ble _0806AEF8\n\ - bl RunTasks\n\ - bl UpdatePaletteFade\n\ - add sp, 0x4\n\ - pop {r4-r6}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806AF2C: .4byte gPartyMenuType\n\ -_0806AF30: .4byte PartyMonTextSettings\n\ - .syntax divided\n"); -} -#endif // NONMATCHING +#endif void VBlankCB_PartyMenu(void) { @@ -666,29 +687,432 @@ bool8 SetupDefaultPartyMenu(void) return FALSE; } +#if DEBUG +__attribute__((naked)) +bool8 InitPartyMenu(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + add sp, sp, #0xfffffff4\n\ + ldr r0, ._55 @ gMain\n\ + ldr r1, ._55 + 4 @ 0x43c\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x11\n\ + bls ._53 @cond_branch\n\ + b ._125\n\ +._53:\n\ + lsl r0, r0, #0x2\n\ + ldr r1, ._55 + 8 @ \n\ + add r0, r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ +._56:\n\ + .align 2, 0\n\ +._55:\n\ + .word gMain\n\ + .word 0x43c\n\ + .word ._57\n\ +._57:\n\ + .word ._58\n\ + .word ._59\n\ + .word ._60\n\ + .word ._61\n\ + .word ._62\n\ + .word ._63\n\ + .word ._64\n\ + .word ._65\n\ + .word ._66\n\ + .word ._67\n\ + .word ._68\n\ + .word ._69\n\ + .word ._70\n\ + .word ._71\n\ + .word ._72\n\ + .word ._73\n\ + .word ._74\n\ + .word ._75\n\ +._58:\n\ + mov r0, #0x0\n\ + bl SetVBlankCallback\n\ + mov r3, #0xc0\n\ + lsl r3, r3, #0x13\n\ + mov r4, #0xc0\n\ + lsl r4, r4, #0x9\n\ + add r2, sp, #0x8\n\ + mov r8, r2\n\ + add r2, sp, #0x4\n\ + mov r6, #0x0\n\ + ldr r1, ._78 @ 0x40000d4\n\ + mov r5, #0x80\n\ + lsl r5, r5, #0x5\n\ + ldr r7, ._78 + 4 @ 0x81000800\n\ + mov r0, #0x81\n\ + lsl r0, r0, #0x18\n\ + mov ip, r0\n\ +._76:\n\ + strh r6, [r2]\n\ + add r0, sp, #0x4\n\ + str r0, [r1]\n\ + str r3, [r1, #0x4]\n\ + str r7, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + add r3, r3, r5\n\ + sub r4, r4, r5\n\ + cmp r4, r5\n\ + bhi ._76 @cond_branch\n\ + strh r6, [r2]\n\ + add r2, sp, #0x4\n\ + str r2, [r1]\n\ + str r3, [r1, #0x4]\n\ + lsr r0, r4, #0x1\n\ + mov r3, ip\n\ + orr r0, r0, r3\n\ + str r0, [r1, #0x8]\n\ + ldr r0, [r1, #0x8]\n\ + mov r0, #0xe0\n\ + lsl r0, r0, #0x13\n\ + mov r3, #0x80\n\ + lsl r3, r3, #0x3\n\ + mov r4, #0x0\n\ + str r4, [sp, #0x8]\n\ + ldr r2, ._78 @ 0x40000d4\n\ + mov r1, r8\n\ + str r1, [r2]\n\ + str r0, [r2, #0x4]\n\ + lsr r0, r3, #0x2\n\ + mov r1, #0x85\n\ + lsl r1, r1, #0x18\n\ + orr r0, r0, r1\n\ + str r0, [r2, #0x8]\n\ + ldr r0, [r2, #0x8]\n\ + mov r1, #0xa0\n\ + lsl r1, r1, #0x13\n\ + add r0, sp, #0x4\n\ + strh r4, [r0]\n\ + str r0, [r2]\n\ + str r1, [r2, #0x4]\n\ + lsr r3, r3, #0x1\n\ + mov r0, #0x81\n\ + lsl r0, r0, #0x18\n\ + orr r3, r3, r0\n\ + str r3, [r2, #0x8]\n\ + ldr r0, [r2, #0x8]\n\ + ldr r2, ._78 + 8 @ gPaletteFade\n\ + ldrb r0, [r2, #0x8]\n\ + mov r1, #0x80\n\ + orr r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ + ldr r1, ._78 + 12 @ gMain\n\ + ldr r2, ._78 + 16 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._122\n\ +._79:\n\ + .align 2, 0\n\ +._78:\n\ + .word 0x40000d4\n\ + .word 0x81000800\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._59:\n\ + bl ScanlineEffect_Stop\n\ + b ._115\n\ +._60:\n\ + bl sub_806B4A8\n\ + ldr r1, ._82 @ \n\ + mov r2, #0x99\n\ + lsl r2, r2, #0x2\n\ + add r0, r1, r2\n\ + mov r2, #0x0\n\ + strh r2, [r0]\n\ + ldr r3, ._82 + 4 @ \n\ + add r0, r1, r3\n\ + strh r2, [r0]\n\ + mov r0, #0x9a\n\ + lsl r0, r0, #0x2\n\ + add r1, r1, r0\n\ + strh r2, [r1]\n\ + ldr r1, ._82 + 8 @ \n\ + ldr r2, ._82 + 12 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._83:\n\ + .align 2, 0\n\ +._82:\n\ + .word +0x201b000\n\ + .word 0x266\n\ + .word gMain\n\ + .word 0x43c\n\ +._61:\n\ + bl ResetSpriteData\n\ + b ._115\n\ +._62:\n\ + ldr r0, ._88 @ \n\ + mov r1, #0x96\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + beq ._86 @cond_branch\n\ + cmp r0, #0x5\n\ + beq ._86 @cond_branch\n\ + bl ResetTasks\n\ +._86:\n\ + ldr r1, ._88 + 4 @ \n\ + ldr r2, ._88 + 8 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._89:\n\ + .align 2, 0\n\ +._88:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._63:\n\ + bl FreeAllSpritePalettes\n\ + b ._115\n\ +._64:\n\ + ldr r4, ._92 @ \n\ + mov r1, #0x97\n\ + lsl r1, r1, #0x2\n\ + add r0, r4, r1\n\ + ldr r0, [r0]\n\ + mov r1, #0x0\n\ + bl CreateTask\n\ + mov r2, #0x98\n\ + lsl r2, r2, #0x2\n\ + add r1, r4, r2\n\ + strb r0, [r1]\n\ + b ._115\n\ +._93:\n\ + .align 2, 0\n\ +._92:\n\ + .word +0x201b000\n\ +._65:\n\ + ldr r0, ._95 @ gWindowTemplate_81E6C90\n\ + bl Text_LoadWindowTemplate\n\ + ldr r1, ._95 + 4 @ gMain\n\ + ldr r0, ._95 + 8 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._122\n\ +._96:\n\ + .align 2, 0\n\ +._95:\n\ + .word gWindowTemplate_81E6C90\n\ + .word gMain\n\ + .word 0x43c\n\ +._66:\n\ + ldr r4, ._98 @ gUnknown_03004210\n\ + ldr r1, ._98 + 4 @ gWindowTemplate_81E6C90\n\ + add r0, r4, #0\n\ + bl Text_InitWindowWithTemplate\n\ + add r0, r4, #0\n\ + mov r1, #0x1\n\ + bl MultistepInitWindowTileData\n\ + ldr r1, ._98 + 8 @ gMain\n\ + ldr r2, ._98 + 12 @ 0x43c\n\ + add r1, r1, r2\n\ + b ._122\n\ +._99:\n\ + .align 2, 0\n\ +._98:\n\ + .word gUnknown_03004210\n\ + .word gWindowTemplate_81E6C90\n\ + .word gMain\n\ + .word 0x43c\n\ +._67:\n\ + bl MultistepLoadFont\n\ + cmp r0, #0\n\ + bne ._100 @cond_branch\n\ + b ._125\n\ +._100:\n\ + ldr r0, ._103 @ \n\ + mov r3, #0x99\n\ + lsl r3, r3, #0x2\n\ + add r0, r0, r3\n\ + mov r1, #0x1\n\ + strh r1, [r0]\n\ + ldr r1, ._103 + 4 @ \n\ + ldr r0, ._103 + 8 @ \n\ + add r1, r1, r0\n\ + b ._122\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._68:\n\ + ldr r0, ._107 @ \n\ + mov r1, #0x99\n\ + lsl r1, r1, #0x2\n\ + add r4, r0, r1\n\ + ldrb r0, [r4]\n\ + bl LoadPartyMenuGraphics\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._105 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r4]\n\ + ldr r1, ._107 + 4 @ \n\ + ldr r2, ._107 + 8 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._108:\n\ + .align 2, 0\n\ +._107:\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._105:\n\ + ldrh r0, [r4]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4]\n\ + b ._125\n\ +._69:\n\ + bl sub_809D51C\n\ + b ._115\n\ +._70:\n\ + ldr r2, ._113 @ PartyMenuHandlers\n\ + ldr r0, ._113 + 4 @ \n\ + mov r1, #0x96\n\ + lsl r1, r1, #0x2\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + lsl r0, r1, #0x1\n\ + add r0, r0, r1\n\ + lsl r0, r0, #0x2\n\ + add r2, r2, #0x4\n\ + add r0, r0, r2\n\ + ldr r0, [r0]\n\ + bl _call_via_r0\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x1\n\ + bne ._125 @cond_branch\n\ + ldr r1, ._113 + 8 @ \n\ + ldr r2, ._113 + 12 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._114:\n\ + .align 2, 0\n\ +._113:\n\ + .word PartyMenuHandlers\n\ + .word +0x201b000\n\ + .word gMain\n\ + .word 0x43c\n\ +._71:\n\ + ldr r0, ._116 @ gWindowTemplate_81E6CC8\n\ + bl MultistepInitMenuWindowBegin\n\ + b ._115\n\ +._117:\n\ + .align 2, 0\n\ +._116:\n\ + .word gWindowTemplate_81E6CC8\n\ +._72:\n\ + bl MultistepInitMenuWindowContinue\n\ + cmp r0, #0\n\ + beq ._125 @cond_branch\n\ + ldr r1, ._120 @ gMain\n\ + ldr r0, ._120 + 4 @ 0x43c\n\ + add r1, r1, r0\n\ + b ._122\n\ +._121:\n\ + .align 2, 0\n\ +._120:\n\ + .word gMain\n\ + .word 0x43c\n\ +._73:\n\ + ldr r0, ._123 @ \n\ + ldr r1, ._123 + 4 @ \n\ + add r0, r0, r1\n\ + ldrb r0, [r0]\n\ + mov r1, #0x0\n\ + bl PrintPartyMenuPromptText\n\ + ldr r1, ._123 + 8 @ \n\ + ldr r2, ._123 + 12 @ \n\ + add r1, r1, r2\n\ + b ._122\n\ +._124:\n\ + .align 2, 0\n\ +._123:\n\ + .word +0x201b000\n\ + .word 0x259\n\ + .word gMain\n\ + .word 0x43c\n\ +._74:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x10\n\ + mov r3, #0x0\n\ + bl BeginNormalPaletteFade\n\ + ldr r2, ._126 @ gPaletteFade\n\ + ldrb r1, [r2, #0x8]\n\ + mov r0, #0x7f\n\ + and r0, r0, r1\n\ + strb r0, [r2, #0x8]\n\ +._115:\n\ + ldr r1, ._126 + 4 @ gMain\n\ + ldr r3, ._126 + 8 @ 0x43c\n\ + add r1, r1, r3\n\ +._122:\n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + b ._125\n\ +._127:\n\ + .align 2, 0\n\ +._126:\n\ + .word gPaletteFade\n\ + .word gMain\n\ + .word 0x43c\n\ +._75:\n\ + ldr r0, ._130 @ VBlankCB_PartyMenu\n\ + bl SetVBlankCallback\n\ + ldr r0, ._130 + 4 @ gLinkOpen\n\ + ldrb r0, [r0]\n\ + cmp r0, #0x1\n\ + bne ._128 @cond_branch\n\ + ldr r0, ._130 + 8 @ 0x600e5e0\n\ + mov r1, #0x80\n\ + lsl r1, r1, #0x8\n\ + ldr r2, ._130 + 12 @ 0x6007800\n\ + mov r3, #0x2\n\ + bl debug_sub_8008218\n\ +._128:\n\ + mov r0, #0x1\n\ + b ._129\n\ +._131:\n\ + .align 2, 0\n\ +._130:\n\ + .word VBlankCB_PartyMenu+1\n\ + .word gLinkOpen\n\ + .word 0x600e5e0\n\ + .word 0x6007800\n\ +._125:\n\ + mov r0, #0x0\n\ +._129:\n\ + add sp, sp, #0xc\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4, r5, r6, r7}\n\ + pop {r1}\n\ + bx r1"); +} +#else bool8 InitPartyMenu(void) { - u8 *addr; - u32 size; - switch (gMain.state) { case 0: SetVBlankCallback(NULL); - addr = (u8 *)VRAM; - size = VRAM_SIZE; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } - + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), VRAM_SIZE, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); @@ -696,7 +1120,7 @@ bool8 InitPartyMenu(void) gMain.state++; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); gMain.state++; break; case 2: @@ -727,11 +1151,11 @@ bool8 InitPartyMenu(void) gMain.state++; break; case 7: - SetUpWindowConfig(&gWindowConfig_81E6C90); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C90); gMain.state++; break; case 8: - InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C90); + Text_InitWindowWithTemplate(&gUnknown_03004210, &gWindowTemplate_81E6C90); MultistepInitWindowTileData(&gUnknown_03004210, 1); gMain.state++; break; @@ -764,7 +1188,7 @@ bool8 InitPartyMenu(void) } break; case 13: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6CC8); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6CC8); gMain.state++; break; case 14: @@ -789,6 +1213,7 @@ bool8 InitPartyMenu(void) return FALSE; } +#endif void CB2_InitPartyMenu(void) { @@ -841,9 +1266,7 @@ void ReDrawPartyMonBackgrounds(void) { if (ewram1B000.unk261) { - const void *src = gBGTilemapBuffers[2]; - void *dest = (void *)(BG_VRAM + 0x3000); - DmaCopy16(3, src, dest, 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(BG_VRAM + 0x3000), 0x800); if (ewram1B000.unk261 == 2) { @@ -1226,8 +1649,6 @@ void sub_806BBEC(u8 a) } } -#ifdef NONMATCHING -// The original THUMB is preserving r8 for seemingly no reason. Unsure how to match. void sub_806BC3C(u8 monIndex, u8 b) { u16 *vramPtr = gUnknown_08376918[IsDoubleBattle()][monIndex]; @@ -1240,74 +1661,10 @@ void sub_806BC3C(u8 monIndex, u8 b) vramPtr[i] = gUnknown_08E9A300[offset] + 0x10C; vramPtr[i + 0x20] = gUnknown_08E9A300[offset + 0x20] + 0x10C; } + + // Some dead code was likely optimized out, but the compiler still think r8 was used. + asm("":::"r8"); } -#else -__attribute__((naked)) -void sub_806BC3C(u8 monIndex, u8 b) -{ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r8\n\ - push {r7}\n\ - adds r4, r0, 0\n\ - adds r5, r1, 0\n\ - lsls r4, 24\n\ - lsrs r4, 24\n\ - lsls r5, 24\n\ - lsrs r5, 24\n\ - ldr r6, _0806BCB0 @ =gUnknown_08376918\n\ - bl IsDoubleBattle\n\ - lsls r4, 2\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - lsls r1, r0, 1\n\ - adds r1, r0\n\ - lsls r1, 3\n\ - adds r4, r1\n\ - adds r4, r6\n\ - ldr r7, [r4]\n\ - movs r6, 0\n\ - adds r0, r5, 0\n\ - movs r1, 0x7\n\ - bl __udivsi3\n\ - lsls r0, 24\n\ - lsrs r4, r0, 19\n\ - ldr r5, _0806BCB4 @ =gUnknown_08E9A300\n\ - movs r0, 0x86\n\ - lsls r0, 1\n\ - adds r3, r0, 0\n\ -_0806BC7C:\n\ - adds r1, r6, r4\n\ - lsls r2, r6, 1\n\ - adds r2, r7\n\ - lsls r0, r1, 1\n\ - adds r0, r5\n\ - ldrh r0, [r0]\n\ - adds r0, r3, r0\n\ - strh r0, [r2]\n\ - adds r2, 0x40\n\ - adds r1, 0x20\n\ - lsls r1, 1\n\ - adds r1, r5\n\ - ldrh r1, [r1]\n\ - adds r0, r3, r1\n\ - strh r0, [r2]\n\ - adds r0, r6, 0x1\n\ - lsls r0, 24\n\ - lsrs r6, r0, 24\n\ - cmp r6, 0x6\n\ - bls _0806BC7C\n\ - pop {r3}\n\ - mov r8, r3\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_0806BCB0: .4byte gUnknown_08376918\n\ -_0806BCB4: .4byte gUnknown_08E9A300\n\ - .syntax divided\n"); -} -#endif // NONMATCHING void unref_sub_806BCB8(u8 a) { @@ -2790,26 +3147,26 @@ void PrintPartyMenuPromptText(u8 textId, u8 b) switch (b) { case 0: - MenuDrawTextWindow(0, 16, 23, 19); + Menu_DrawStdWindowFrame(0, 16, 23, 19); break; case 1: - MenuDrawTextWindow(0, 16, 19, 19); + Menu_DrawStdWindowFrame(0, 16, 19, 19); break; case 2: - MenuDrawTextWindow(0, 16, 22, 19); + Menu_DrawStdWindowFrame(0, 16, 22, 19); break; case 3: - MenuDrawTextWindow(0, 16, 18, 19); + Menu_DrawStdWindowFrame(0, 16, 18, 19); break; } - MenuPrint(PartyMenuPromptTexts[textId], 1, 17); + Menu_PrintText(PartyMenuPromptTexts[textId], 1, 17); } } void sub_806D5A4(void) { - MenuZeroFillWindowRect(0, 16, 29, 19); + Menu_EraseWindowRect(0, 16, 29, 19); } void sub_806D5B8(u8 monIndex) @@ -2820,7 +3177,7 @@ void sub_806D5B8(u8 monIndex) u8 right = gUnknown_08376948[IsDoubleBattle()][monIndex].right; u8 bottom = gUnknown_08376948[IsDoubleBattle()][monIndex].bottom; - ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom); + Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); var1 = 0; CpuFastSet(&var1, OBJ_VRAM1 + monIndex * 0x400, 0x1000100); @@ -2834,7 +3191,7 @@ void sub_806D668(u8 monIndex) u8 right = gUnknown_08376978[IsDoubleBattle()][monIndex].right; u8 bottom = gUnknown_08376978[IsDoubleBattle()][monIndex].bottom; - ZeroFillWindowRect(&gUnknown_03004210, left, top, right, bottom); + Text_EraseWindowRect(&gUnknown_03004210, left, top, right, bottom); var1 = 0; CpuFastSet(&var1, OBJ_VRAM1 + 0x300 + monIndex * 0x400, 0x1000040); @@ -3427,7 +3784,7 @@ void PartyMenuDoPrintMonNickname(u8 monIndex, int b, const u8 *nameBuffer) { u32 var1 = 0; CpuFastSet(&var1, gTileBuffer, 0x1000100); - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gTileBuffer, nameBuffer); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gTileBuffer, nameBuffer); CpuFastSet(gTileBuffer, OBJ_VRAM1 + (monIndex * 0x400), 128); } @@ -3537,7 +3894,7 @@ void PartyMenuDoPrintLevel(u8 monIndex, u8 menuLayout, u8 level) var1 = 0; CpuFastSet(&var1, gUnknown_02039460, 0x1000020); - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x200 + (monIndex * 0x400), 32); } @@ -3631,7 +3988,7 @@ void PartyMenuDoPrintHP(u8 monIndex, u8 b, u16 currentHP, u16 maxHP) var = 0; CpuFastSet(&var, gUnknown_02039460, 0x1000040); - sub_8004E3C((struct WindowConfig *)&gWindowConfig_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); + Text_InitWindow8004E3C((struct WindowTemplate *)&gWindowTemplate_81E6CAC, gUnknown_02039460 - 0x100 /*gTileBuffer*/, gStringVar1); CpuFastSet(gUnknown_02039460, OBJ_VRAM1 + 0x300 + (monIndex * 0x400), 64); } @@ -3781,8 +4138,8 @@ void ClosePartyPopupMenu(u8 index, const struct PartyPopupMenu *menu) SetPartyPopupMenuOffsets(index, &left, &top, menu); - MenuZeroFillWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); - HandleDestroyMenuCursors(); + Menu_EraseWindowRect(left, top, left + menu[index].width, menu[index].numChoices * 2 + top + 1); + Menu_DestroyCursor(); } TaskFunc PartyMenuGetPopupMenuFunc(u8 menuIndex, const struct PartyPopupMenu *menus, const struct MenuAction2 *menuActions, u8 itemIndex) @@ -3797,7 +4154,7 @@ u8 sub_806E834(const u8 *message, u8 arg1) gUnknown_0202E8F6 = 1; - MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_DrawStdWindowFrame(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); MenuPrintMessage(message, WINDOW_LEFT + 1, 15); taskId = CreateTask(sub_806E884, 1); @@ -3808,11 +4165,11 @@ u8 sub_806E834(const u8 *message, u8 arg1) static void sub_806E884(u8 taskId) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { gUnknown_0202E8F6 = 0; if (gTasks[taskId].data[0] == 0) - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); DestroyTask(taskId); } } @@ -3902,13 +4259,13 @@ void party_menu_link_mon_held_item_object(u8 taskId) void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { u16 currentItem; - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); currentItem = GetMonData(ewram1C000.pokemon, MON_DATA_HELD_ITEM); RemoveBagItem(ewram1C000.unk6, 1); if (AddBagItem(currentItem, 1) == TRUE) @@ -3937,7 +4294,7 @@ void PartyMenuTryGiveMonHeldItem_806EACC(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); } gTasks[taskId].func = party_menu_link_mon_held_item_object; } @@ -4039,7 +4396,7 @@ void DoTakeMail(u8 taskId, TaskFunc func) void Task_LoseMailMessage(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { @@ -4052,7 +4409,7 @@ void Task_LoseMailMessage(u8 taskId) { sub_806E834(gOtherText_BagFullCannotRemoveItem, 0); } - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); gTasks[taskId].func = party_menu_link_mon_held_item_object; } else @@ -4061,8 +4418,8 @@ void Task_LoseMailMessage(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = party_menu_link_mon_held_item_object; } } @@ -4078,11 +4435,11 @@ void Task_ConfirmLoseMailMessage(u8 taskId) void Task_TakeHeldMail(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); if (TakeMailFromMon2(ewram1C000.pokemon) != 0xFF) sub_806E834(gOtherText_MailWasSent, 0); else @@ -4095,7 +4452,7 @@ void Task_TakeHeldMail(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); sub_806E834(gOtherText_MailRemovedMessageLost, 1); gTasks[taskId].func = Task_ConfirmLoseMailMessage; } @@ -4112,7 +4469,7 @@ void Task_ConfirmTakeHeldMail(u8 taskId) u16 ItemIdToBattleMoveId(u16 item) { - u16 machineNumber = item - ITEM_TM01; + u16 machineNumber = item - ITEM_TM01_FOCUS_PUNCH; return TMHMMoves[machineNumber]; } @@ -4136,6 +4493,10 @@ void TeachMonTMMove(u8 taskId, u16 move, TaskFunc func) CreateTask(Task_TeamMonTMMove, 5); } +#if DEBUG +extern u8 gUnknown_020297ED; +#endif + void Task_TeamMonTMMove(u8 taskId) { GetMonNickname(ewram1C000.pokemon, gStringVar1); @@ -4150,7 +4511,11 @@ void Task_TeamMonTMMove(u8 taskId) } else { - if (!CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) + if ( +#if DEBUG + !gUnknown_020297ED && +#endif + !CanMonLearnTMHM(ewram1C000.pokemon, ewram1C000.unk6 - 33)) { StringExpandPlaceholders(gStringVar4, gOtherText_NotCompatible); sub_806E834(gStringVar4, 1); @@ -4240,11 +4605,11 @@ void sub_806F358(u8 taskId) void sub_806F390(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); sub_806E834(gOtherText_WhichMoveToForget2, 1); gTasks[taskId].func = sub_806F44C; } @@ -4320,7 +4685,7 @@ void StopTryingToTeachMove_806F588(u8 taskId) void StopTryingToTeachMove_806F614(u8 taskId) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); StringExpandPlaceholders(gStringVar4, gOtherText_StopTryingTo); sub_806E834(gStringVar4, 1); @@ -4338,11 +4703,11 @@ void StopTryingToTeachMove_806F67C(u8 taskId) void StopTryingToTeachMove_806F6B4(u8 taskId) { - s8 selection = ProcessMenuInputNoWrap_(); + s8 selection = Menu_ProcessInputNoWrap_(); if (selection == 0) { - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); GetMonNickname(ewram1C000.pokemon, gStringVar1); StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); StringExpandPlaceholders(gStringVar4, gOtherText_DidNotLearnMove2); @@ -4355,7 +4720,7 @@ void StopTryingToTeachMove_806F6B4(u8 taskId) return; if (selection == -1) PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(23, 8, 29, 13); GetMonNickname(ewram1C000.pokemon, gStringVar1); StringCopy(gStringVar2, gMoveNames[ewram1C000.unk8]); StringExpandPlaceholders(gStringVar4, gOtherText_WantsToLearn); @@ -4706,7 +5071,7 @@ void sub_8070088(u8 taskId) else { gUnknown_0202E8F4 = 1; - MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + Menu_EraseWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); PlaySE(SE_KAIFUKU); PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); @@ -4763,12 +5128,12 @@ void CreateItemUseMoveMenu(u8 partyMonIndex) u8 i; r6 = 0; - MenuDrawTextWindow(19, 10, 29, 19); + Menu_DrawStdWindowFrame(19, 10, 29, 19); for (i = 0; i < 4; i++) { u16 move = GetMonData(&gPlayerParty[partyMonIndex], MON_DATA_MOVE1 + i); - MenuPrint(gMoveNames[move], 20, i * 2 + 11); + Menu_PrintText(gMoveNames[move], 20, i * 2 + 11); if (move != 0) r6++; } @@ -4780,12 +5145,12 @@ void Task_HandleItemUseMoveMenuInput(u8 taskId) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { @@ -4827,17 +5192,17 @@ void DoPPRecoveryItemEffect(u8 taskId, u16 item, TaskFunc c) void ItemUseMoveMenu_HandleMoveSelection(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 10, 29, 19); sub_806D5A4(); - gTasks[taskId].data[11] = GetMenuCursorPos(); + gTasks[taskId].data[11] = Menu_GetCursorPos(); DoRecoverPP(taskId); } void ItemUseMoveMenu_HandleCancel(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(19, 10, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(19, 10, 29, 19); if (gMain.inBattle) gTasks[ewram1C000.unk4].func = HandleBattlePartyMenu; else @@ -4880,7 +5245,8 @@ void DoPPUpItemEffect(u8 taskId, u16 b, TaskFunc c) gMain.newKeys = 0; } -static const u8 *const StatNames[] = { +static const u8 *const StatNames[] = +{ gOtherText_HP, gOtherText_Attack, gOtherText_Defense, @@ -4889,7 +5255,8 @@ static const u8 *const StatNames[] = { gOtherText_Speed, }; -static const u8 StatDataTypes[] = { +static const u8 StatDataTypes[] = +{ MON_DATA_MAX_HP, MON_DATA_ATK, MON_DATA_DEF, @@ -4897,6 +5264,17 @@ static const u8 StatDataTypes[] = { MON_DATA_SPDEF, MON_DATA_SPEED, }; + +#if DEBUG + +const u8 gUnknown_Debug_839B6CE[] = {0x40, 0, 0, 0, 0x44, 0, 0xFF, 0, 0, 0}; + +const u8 gUnknown_Debug_839B6D8[] = _( + "{STR_VAR_1}かい じっこう\n" + "{STR_VAR_2}たんいじかん しょうひ"); + +#endif + void DoRareCandyItemEffect(u8 taskId, u16 b, TaskFunc c) { u8 i; @@ -4966,7 +5344,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) { u8 i; - MenuDrawTextWindow(11, 0, 29, 7); + Menu_DrawStdWindowFrame(11, 0, 29, 7); for (i = 0; i < NUM_STATS; i++) { @@ -4982,12 +5360,12 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) x = (i / 3) * 9 + 11; y = ((i % 3) << 1) + 1; - MenuPrint_PixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); + Menu_PrintTextPixelCoords(StatNames[i], (x + 1) * 8, y * 8, 1); if (i == 2) - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); + Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 0); else - MenuPrint_PixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); + Menu_PrintTextPixelCoords(gOtherText_TallPlusAndRightArrow, (x + 6) * 8 + 6, y * 8, 1); gStringVar1[0] = EXT_CTRL_CODE_BEGIN; gStringVar1[1] = 0x14; @@ -4995,7 +5373,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[i], 1, 2); - MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); + Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); } } #elif GERMAN @@ -5011,7 +5389,7 @@ void PrintStatGrowthsInLevelUpWindow(u8 taskId) { movs r1, 0\n\ movs r2, 0x1D\n\ movs r3, 0x7\n\ - bl MenuDrawTextWindow\n\ + bl Menu_DrawStdWindowFrame\n\ movs r7, 0\n\ ldr r0, _0807092C @ =gStringVar1\n\ mov r10, r0\n\ @@ -5095,7 +5473,7 @@ _0807086C:\n\ mov r0, r10\n\ adds r1, r4, 0\n\ adds r2, r5, 0\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ adds r0, r7, 0x1\n\ lsls r0, 24\n\ lsrs r7, r0, 24\n\ @@ -5142,7 +5520,7 @@ void PrintNewStatsInLevelUpWindow(u8 taskId) gStringVar1[2] = 0x06; ConvertIntToDecimalStringN(gStringVar1 + 3, ewram1B000.statGrowths[newStatIndex], 1, 3); - MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); + Menu_PrintTextPixelCoords(gStringVar1, (x + 6) * 8 + 6, y * 8, 0); } } @@ -5184,7 +5562,7 @@ void Task_RareCandy3(u8 taskId) u16 learnedMove; u16 evolutionSpecies; - MenuZeroFillWindowRect(11, 0, 29, 7); + Menu_EraseWindowRect(11, 0, 29, 7); learnedMove = MonTryLearningNewMove(ewram1C000.pokemon, TRUE); ewram1B000.unk282 = 1; @@ -5628,9 +6006,13 @@ _08070F8A:\n\ } #endif // NONMATCHING + +// Maybe this goes in start_menu.c +#if !DEBUG void unref_sub_8070F90(void) { FlagSet(FLAG_SYS_POKEDEX_GET); FlagSet(FLAG_SYS_POKEMON_GET); FlagSet(FLAG_SYS_POKENAV_GET); } +#endif diff --git a/src/field/pc_screen_effect.c b/src/field/pc_screen_effect.c index 364fca0aa..dcc3bc9c9 100644 --- a/src/field/pc_screen_effect.c +++ b/src/field/pc_screen_effect.c @@ -2,18 +2,7 @@ #include "main.h" #include "palette.h" #include "sprite.h" - -struct UnkStruct -{ - /*0x00*/ u16 tileTag; - /*0x02*/ u16 paletteTag; - /*0x04*/ u16 unk04; - /*0x06*/ u16 unk06; - /*0x08*/ u16 unk08; - /*0x0A*/ u16 unk0A; - /*0x0C*/ s16 unk0C; - /*0x10*/ u32 selectedPalettes; -}; +#include "pc_screen_effect.h" void sub_80C603C(void); void sub_80C6078(void); @@ -30,7 +19,7 @@ extern const u16 gUnknownPal_083D18EC[16]; extern const u8 gUnknownGfx_083D190C[128]; -extern struct UnkStruct *gUnknown_020387EC; +EWRAM_DATA struct PCScreenEffectStruct *gUnknown_020387EC = NULL; const struct SpriteSheet gUnknown_083D1898 = { gUnknownGfx_083D190C, sizeof(gUnknownGfx_083D190C), 0 }; @@ -58,7 +47,7 @@ const struct SpriteTemplate gSpriteTemplate_83D18C0 = sub_80C6130, }; -void sub_80C5CD4(struct UnkStruct *unkStruct) +void sub_80C5CD4(struct PCScreenEffectStruct *unkStruct) { u16 i; diff --git a/src/field/player_pc.c b/src/field/player_pc.c index 4fef09386..27427ecaa 100644 --- a/src/field/player_pc.c +++ b/src/field/player_pc.c @@ -29,9 +29,9 @@ extern void DestroyVerticalScrollIndicator(u8); extern void PauseVerticalScrollIndicator(u8); extern void LoadScrollIndicatorPalette(void); extern void ClearMailStruct(struct MailStruct *); -extern u8 sub_807D770(void); +extern u8 IsWeatherNotFadingIn(void); extern void sub_808B020(void); -extern void sub_80F944C(void); +extern void ClearVerticalScrollIndicatorPalettes(void); static EWRAM_DATA const u8 *gPcItemMenuOptionOrder = NULL; @@ -217,8 +217,8 @@ void PlayerPC(void) static void InitPlayerPCMenu(u8 taskId) { - MenuDrawTextWindow(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); - PrintMenuItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); + Menu_DrawStdWindowFrame(0, 0, 10, gPcItemMenuOptionsNum * 2 + 1); + Menu_PrintItemsReordered(1, 1, gPcItemMenuOptionsNum, sPlayerPCMenuActions, gPcItemMenuOptionOrder); InitMenu(0, 1, 1, gPcItemMenuOptionsNum, 0, 9); TASK.FUNC = PlayerPCProcessMenuInput; } @@ -228,22 +228,22 @@ static void PlayerPCProcessMenuInput(u8 taskId) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - sPlayerPCMenuActions[gPcItemMenuOptionOrder[GetMenuCursorPos()]].func(taskId); + sPlayerPCMenuActions[gPcItemMenuOptionOrder[Menu_GetCursorPos()]].func(taskId); } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); sPlayerPCMenuActions[gPcItemMenuOptionsNum[gPcItemMenuOptionOrder - 1]].func(taskId); // run EXIT. } @@ -262,7 +262,7 @@ static void PlayerPC_ItemStorage(u8 taskId) static void PlayerPC_Mailbox(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 10, 9); + Menu_EraseWindowRect(0, 0, 10, 9); eMailboxInfo.count = GetMailboxMailCount(); if (eMailboxInfo.count == 0) @@ -280,7 +280,7 @@ static void PlayerPC_Mailbox(u8 taskId) static void PlayerPC_Decoration(u8 var) { - MenuZeroFillWindowRect(0, 0, 10, 9); + Menu_EraseWindowRect(0, 0, 10, 9); DoPlayerPCDecoration(var); } @@ -288,7 +288,7 @@ static void PlayerPC_TurnOff(u8 taskId) { if (gPcItemMenuOptionsNum == 4) // if the option count is 4, we are at the bedroom PC and not player PC, so do gender specific handling. { - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); if (gSaveBlock2.playerGender == MALE) ScriptContext1_SetupScript(gBrendanHouse_TurnPCOff); @@ -297,7 +297,7 @@ static void PlayerPC_TurnOff(u8 taskId) } else { - MenuZeroFillWindowRect(0, 0, 10, 9); + Menu_EraseWindowRect(0, 0, 10, 9); EnableBothScriptContexts(); } DestroyTask(taskId); @@ -305,17 +305,17 @@ static void PlayerPC_TurnOff(u8 taskId) static void InitItemStorageMenu(u8 var) { - MenuZeroFillWindowRect(0, 0, 10, 9); - MenuDrawTextWindow(0, 0, 11, 9); - PrintMenuItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText); + Menu_EraseWindowRect(0, 0, 10, 9); + Menu_DrawStdWindowFrame(0, 0, 11, 9); + Menu_PrintItems(1, 1, 4, (struct MenuAction *)gPCText_ItemPCOptionsText); InitMenu(0, 1, 1, 4, var, 10); ItemStorageMenuPrint(gPCText_OptionDescList[var]); } static void ItemStorageMenuPrint(const u8 *textPtr) { - MenuFillWindowRectWithBlankTile(2, 15, 27, 18); - MenuPrint(textPtr, 2, 15); + Menu_BlankWindowRect(2, 15, 27, 18); + Menu_PrintText(textPtr, 2, 15); } static void ItemStorageMenuProcessInput(u8 var) @@ -323,23 +323,23 @@ static void ItemStorageMenuProcessInput(u8 var) if (gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); - ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); + Menu_MoveCursor(-1); + ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); - ItemStorageMenuPrint(gPCText_OptionDescList[GetMenuCursorPos()]); + Menu_MoveCursor(1); + ItemStorageMenuPrint(gPCText_OptionDescList[Menu_GetCursorPos()]); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gPCText_ItemPCOptionsText[GetMenuCursorPos()].func(var); + gPCText_ItemPCOptionsText[Menu_GetCursorPos()].func(var); } else if (gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); gPCText_ItemPCOptionsText[ITEMPC_MENU_EXIT].func(var); } @@ -357,18 +357,18 @@ static void Task_ItemStorage_Deposit(u8 taskId) static void ItemStorage_Deposit(u8 taskId) { TASK.FUNC = Task_ItemStorage_Deposit; - fade_screen(1, 0); + FadeScreen(1, 0); } static void ItemStorage_HandleReturnToProcessInput(u8 taskId) { - if (sub_807D770() == TRUE) + if (IsWeatherNotFadingIn() == TRUE) TASK.FUNC = ItemStorageMenuProcessInput; } void ItemStorage_ReturnToMenuAfterDeposit(void) { - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); InitItemStorageMenu(ITEMPC_MENU_DEPOSIT); CreateTask(ItemStorage_HandleReturnToProcessInput, 0); pal_fill_black(); @@ -378,13 +378,13 @@ static void ItemStorage_Withdraw(u8 taskId) { s16 *data = TASK.data; - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); NUM_ITEMS = CountUsedPCItemSlots(); if (NUM_ITEMS != 0) { - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_WITHDRAW; PAGE_INDEX = 0; ITEMS_ABOVE_TOP = 0; @@ -400,13 +400,13 @@ static void ItemStorage_Toss(u8 taskId) { s16 *data = TASK.data; - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); NUM_ITEMS = CountUsedPCItemSlots(); if (NUM_ITEMS) { - MenuZeroFillWindowRect(0, 14, 29, 19); + Menu_EraseWindowRect(0, 14, 29, 19); CURRENT_ITEM_STORAGE_MENU = ITEMPC_MENU_TOSS; PAGE_INDEX = 0; ITEMS_ABOVE_TOP = 0; @@ -420,8 +420,8 @@ static void ItemStorage_Toss(u8 taskId) static void ItemStorage_Exit(u8 var) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 9); ReshowPlayerPC(var); } @@ -450,7 +450,7 @@ static void ItemStorage_ProcessInput(u8 taskId) if(PAGE_INDEX != 0) // did the cursor move physically upwards? { PlaySE(SE_SELECT); - PAGE_INDEX = MoveMenuCursor(-1); + PAGE_INDEX = Menu_MoveCursor(-1); trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; if (SWITCH_MODE_ACTIVE == FALSE) // are we not currently switching items? { @@ -474,7 +474,7 @@ static void ItemStorage_ProcessInput(u8 taskId) ItemStorage_DrawBothListAndDescription(taskId); if (SWITCH_MODE_ACTIVE != FALSE) - MoveMenuCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index. + Menu_MoveCursor(0); // don't move the cursor. it's at the top of the page index, but not the true index. } } else if(gMain.newAndRepeatedKeys & DPAD_DOWN) // _0813A306 @@ -482,7 +482,7 @@ static void ItemStorage_ProcessInput(u8 taskId) if(PAGE_INDEX != NUM_PAGE_ITEMS - 1) { PlaySE(SE_SELECT); - PAGE_INDEX = MoveMenuCursor(1); + PAGE_INDEX = Menu_MoveCursor(1); trueIndex = ITEMS_ABOVE_TOP + PAGE_INDEX; if(SWITCH_MODE_ACTIVE != FALSE) @@ -500,7 +500,7 @@ static void ItemStorage_ProcessInput(u8 taskId) ItemStorage_DrawBothListAndDescription(taskId); if (SWITCH_MODE_ACTIVE != FALSE) - MoveMenuCursor(0); + Menu_MoveCursor(0); } } else if(gMain.newKeys & SELECT_BUTTON) // _0813A3A0 @@ -549,7 +549,7 @@ static void ItemStorage_ProcessInput(u8 taskId) PlaySE(SE_SELECT); if(SWITCH_MODE_ACTIVE == FALSE) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); ItemStorage_GoBackToPlayerPCMenu(taskId); } else @@ -563,10 +563,10 @@ static void ItemStorage_ProcessInput(u8 taskId) static void ItemStorage_GoBackToPlayerPCMenu(u8 taskId) { BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - MenuZeroFillWindowRect(0, 0, 29, 19); - MenuDisplayMessageBox(); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_EraseWindowRect(0, 0, 29, 19); + Menu_DisplayDialogueFrame(); InitItemStorageMenu(TASK.CURRENT_ITEM_STORAGE_MENU); TASK.FUNC = ItemStorageMenuProcessInput; } @@ -576,8 +576,8 @@ static void ItemStorage_DoItemAction(u8 taskId) s16 *data = TASK.data; u8 trueIndex = PAGE_INDEX + ITEMS_ABOVE_TOP; - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); // PauseVerticalScrollIndicator + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) { @@ -603,7 +603,7 @@ static void ItemStorage_DoItemAction(u8 taskId) ItemStorage_PrintItemPcResponse(ITEMPC_HOW_MANY_TO_TOSS); } NUM_QUANTITY_ROLLER = 1; - MenuDrawTextWindow(6, 8, 13, 11); + Menu_DrawStdWindowFrame(6, 8, 13, 11); sub_80A418C(NUM_QUANTITY_ROLLER, STR_CONV_MODE_RIGHT_ALIGN, 8, 9, 3); TASK.FUNC = ItemStorage_HandleQuantityRolling; } @@ -652,7 +652,7 @@ static void ItemStorage_HandleQuantityRolling(u8 taskId) else if(gMain.newKeys & A_BUTTON) // confirm quantity. { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(6, 6, 0xD, 0xB); + Menu_EraseWindowRect(6, 6, 0xD, 0xB); if(CURRENT_ITEM_STORAGE_MENU == ITEMPC_MENU_WITHDRAW) ItemStorage_DoItemWithdraw(taskId); @@ -662,9 +662,9 @@ static void ItemStorage_HandleQuantityRolling(u8 taskId) else if(gMain.newKeys & B_BUTTON) // cancel quantity. { PlaySE(SE_SELECT); - MenuZeroFillWindowRect(6, 6, 0xD, 0xB); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + Menu_EraseWindowRect(6, 6, 0xD, 0xB); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); // why not use trueIndex? TASK.FUNC = ItemStorage_ProcessInput; } @@ -713,7 +713,7 @@ static void ItemStorage_DoItemToss(u8 taskId) static void ItemStorage_ResumeInputFromYesToss(u8 taskId) { - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); ItemStorage_PrintItemPcResponse(ITEMPC_THREW_AWAY_ITEM); TASK.FUNC = ItemStorage_HandleRemoveItem; } @@ -722,10 +722,10 @@ static void ItemStorage_ResumeInputFromNoToss(u8 taskId) { s16 *data = TASK.data; - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); InitMenu(0, 16, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); TASK.FUNC = ItemStorage_ProcessInput; } @@ -757,17 +757,17 @@ static void ItemStorage_WaitPressHandleResumeProcessInput(u8 taskId) if(gMain.newKeys & A_BUTTON || gMain.newKeys == B_BUTTON) { ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[ITEMS_ABOVE_TOP + PAGE_INDEX].itemId); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); TASK.FUNC = ItemStorage_ProcessInput; } } static void ItemStorage_HandleResumeProcessInput(u8 taskId) { - MenuZeroFillWindowRect(0x6, 0x6, 0xD, 0xB); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + Menu_EraseWindowRect(0x6, 0x6, 0xD, 0xB); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); ItemStorage_DrawBothListAndDescription(taskId); TASK.FUNC = ItemStorage_ProcessInput; } @@ -817,14 +817,14 @@ static void ItemStorage_DrawItemQuantity(u16 arg1, enum StringConvertMode arg2, sub_80A4164(gStringVar1, arg1, arg2, arg4); if(isSwapSelected != FALSE) - MenuPrint(gSelectedItemQuantityFormatText, 0x1A, arg3); + Menu_PrintText(gSelectedItemQuantityFormatText, 0x1A, arg3); else - MenuPrint(gNonSelectedItemQuantityFormatText, 0x1A, arg3); + Menu_PrintText(gNonSelectedItemQuantityFormatText, 0x1A, arg3); } static void ItemStorage_DrawItemVoidQuantity(u8 var) { - MenuPrint(gUnknown_08406330, 0x19, var); + Menu_PrintText(gUnknown_08406330, 0x19, var); } static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSwapSelected) @@ -832,9 +832,9 @@ static void ItemStorage_DrawItemName(struct ItemSlot *itemSlot, u8 var, int isSw CopyItemName(itemSlot->itemId, gStringVar1); if(isSwapSelected != FALSE) - MenuPrint(gSelectedItemFormattedText, 16, var); + Menu_PrintText(gSelectedItemFormattedText, 16, var); else - MenuPrint(gNonSelectedItemFormattedText, 16, var); + Menu_PrintText(gNonSelectedItemFormattedText, 16, var); } static void ItemStorage_DrawNormalItemEntry(struct ItemSlot *itemSlot, u8 var, int var2) @@ -853,7 +853,7 @@ static void ItemStorage_DrawTMHMEntry(struct ItemSlot *itemSlot, u8 var, int var { ItemStorage_DrawItemName(itemSlot, var, var2); - if(itemSlot->itemId < ITEM_HM01) + if(itemSlot->itemId < ITEM_HM01_CUT) ItemStorage_DrawItemQuantity(itemSlot->quantity, STR_CONV_MODE_RIGHT_ALIGN, var, 3, var2); else ItemStorage_DrawItemVoidQuantity(var); // HMs do not have a quantity. @@ -866,61 +866,51 @@ static void ItemStorage_DrawItemList(u8 taskId) u16 i; u16 yCoord = 0; - // r5 is i and is unsigned 16-bit. - - for(i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++) + for (i = ITEMS_ABOVE_TOP; i < ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS; i++) { yCoord = (i - ITEMS_ABOVE_TOP) * 2; - if(i != NUM_ITEMS) + if (i == NUM_ITEMS) + { + sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1); + break; + } + else { tempArg = 0; - if(SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) + if (SWITCH_MODE_ACTIVE != FALSE && i == SWAP_ITEM_INDEX) tempArg = 1; - switch(GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1) + switch (GetPocketByItemId(gSaveBlock1.pcItems[i].itemId) - 1) { - case 0: - case 1: - case 3: - ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; - case 4: - ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; - case 2: - ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); - break; + case 0: + case 1: + case 3: + ItemStorage_DrawNormalItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; + case 4: + ItemStorage_DrawKeyItemEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; + case 2: + ItemStorage_DrawTMHMEntry((struct ItemSlot *)&gSaveBlock1.pcItems[i], yCoord + 2, tempArg); + break; } } - else - { - goto weirdCase; // what??? - } } -beforeLabel: - if(i - ITEMS_ABOVE_TOP < 8) - MenuFillWindowRectWithBlankTile(16, yCoord + 4, 0x1C, 0x12); + if (i - ITEMS_ABOVE_TOP < 8) + Menu_BlankWindowRect(16, yCoord + 4, 0x1C, 0x12); - switch(ITEMS_ABOVE_TOP) - { - default: - CreateVerticalScrollIndicators(0, 0xB8, 8); - break; -weirdCase: - sub_8072A18(gOtherText_CancelNoTerminator, 0x80, (yCoord + 2) * 8, 0x68, 1); - goto beforeLabel; - case 0: - DestroyVerticalScrollIndicator(0); - break; - } + if (ITEMS_ABOVE_TOP != 0) + CreateVerticalScrollIndicators(TOP_ARROW, 0xB8, 8); + else + DestroyVerticalScrollIndicator(TOP_ARROW); - if(ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS) - CreateVerticalScrollIndicators(1, 0xB8, 0x98); + if (ITEMS_ABOVE_TOP + NUM_PAGE_ITEMS <= NUM_ITEMS) + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xB8, 0x98); else - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } static void ItemStorage_PrintItemPcResponse(u16 itemId) @@ -984,14 +974,14 @@ static void ItemStorage_GoBackToItemPCMenu(u8 taskId, u8 var) { s16 *data = TASK.data; - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); ItemStorage_LoadPalette(); - MenuDrawTextWindow(0xF, 0, 0x1D, 0x13); - MenuDrawTextWindow(0, 0xC, 0xE, 0x13); - MenuDrawTextWindow(0, 0, 0xB, 3); + Menu_DrawStdWindowFrame(0xF, 0, 0x1D, 0x13); + Menu_DrawStdWindowFrame(0, 0xC, 0xE, 0x13); + Menu_DrawStdWindowFrame(0, 0, 0xB, 3); ItemStorage_PrintItemPcResponse(gSaveBlock1.pcItems[0].itemId); - MenuPrint(gPCText_ItemPCOptionsText[var].text, 1, 1); + Menu_PrintText(gPCText_ItemPCOptionsText[var].text, 1, 1); ItemStorage_DrawItemList(taskId); InitMenu(0, 0x10, 2, NUM_PAGE_ITEMS, PAGE_INDEX, 0xD); } @@ -1039,68 +1029,50 @@ static void Mailbox_UpdateMailList(void) } } -// WWHHHHHYYYYYYYY SOMEBODY PLEASE FIX THIS static void Mailbox_DrawMailList(u8 taskId) // taskId is unused { u16 yCoord = 0; - u16 i = eMailboxInfo.itemsAbove; - register struct MailboxStruct *tempMailbox asm("r1") = &eMailboxInfo; - register struct MailboxStruct *mailbox asm("r6"); + u16 i; - if(i < i + tempMailbox->pageItems) + for (i = eMailboxInfo.itemsAbove; i < eMailboxInfo.itemsAbove + eMailboxInfo.pageItems; i++) { - mailbox = tempMailbox; - goto forJump; - for(; i < mailbox->itemsAbove + mailbox->pageItems; i++) - { - forJump: - yCoord = (i - mailbox->itemsAbove) * 2; - MenuFillWindowRectWithBlankTile(0x15, yCoord + 2, 0x1C, yCoord + 3); - - if(i != mailbox->count) + yCoord = (i - eMailboxInfo.itemsAbove) * 2; + Menu_BlankWindowRect(0x15, yCoord + 2, 0x1C, yCoord + 3); + if (i == eMailboxInfo.count) { - StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName); - SanitizeNameString(gStringVar1); - MenuPrint(gStringVar1, 0x15, yCoord + 2); + Menu_PrintText(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); + break; } else { - goto weirdCase; // again, what??? + StringCopy(gStringVar1, gSaveBlock1.mail[i + 6].playerName); + SanitizeNameString(gStringVar1); + Menu_PrintText(gStringVar1, 0x15, yCoord + 2); } } - } -beforeLabel: - if(i - eMailboxInfo.itemsAbove != 8) - MenuFillWindowRectWithBlankTile(0x15, yCoord + 4, 0x1C, 0x12); + if (i - eMailboxInfo.itemsAbove != 8) + Menu_BlankWindowRect(0x15, yCoord + 4, 0x1C, 0x12); - switch(eMailboxInfo.itemsAbove) - { - default: - CreateVerticalScrollIndicators(0, 0xC8, 8); - break; -weirdCase: - MenuPrint(gOtherText_CancelNoTerminator, 0x15, yCoord + 2); - goto beforeLabel; - case 0: - DestroyVerticalScrollIndicator(0); - break; - } + if (eMailboxInfo.itemsAbove != 0) + CreateVerticalScrollIndicators(TOP_ARROW, 0xC8, 8); + else + DestroyVerticalScrollIndicator(TOP_ARROW); - if(eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count) - CreateVerticalScrollIndicators(1, 0xC8, 0x98); + if (eMailboxInfo.itemsAbove + eMailboxInfo.pageItems <= eMailboxInfo.count) + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xC8, 0x98); else - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } static void Mailbox_DrawMailboxMenu(u8 taskId) { - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); - MenuDrawTextWindow(0, 0, 0x8, 0x3); - MenuPrint(gPCText_Mailbox, 1, 1); - MenuDrawTextWindow(0x14, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); + Menu_DrawStdWindowFrame(0, 0, 0x8, 0x3); + Menu_PrintText(gPCText_Mailbox, 1, 1); + Menu_DrawStdWindowFrame(0x14, 0, 0x1D, 0x13); Mailbox_DrawMailList(taskId); InitMenu(0, 0x15, 2, eMailboxInfo.pageItems, eMailboxInfo.cursorPos, 8); } @@ -1115,7 +1087,7 @@ static void Mailbox_ProcessInput(u8 taskId) if(eMailboxInfo.cursorPos != 0) { PlaySE(SE_SELECT); - eMailboxInfo.cursorPos = MoveMenuCursor(-1); + eMailboxInfo.cursorPos = Menu_MoveCursor(-1); } else if(eMailboxInfo.itemsAbove != 0) { @@ -1129,7 +1101,7 @@ static void Mailbox_ProcessInput(u8 taskId) if(eMailboxInfo.cursorPos != eMailboxInfo.pageItems - 1) { PlaySE(SE_SELECT); - eMailboxInfo.cursorPos = MoveMenuCursor(1); + eMailboxInfo.cursorPos = Menu_MoveCursor(1); } else if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos != eMailboxInfo.count) { @@ -1140,7 +1112,7 @@ static void Mailbox_ProcessInput(u8 taskId) } else if(gMain.newKeys & A_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); if(eMailboxInfo.itemsAbove + eMailboxInfo.cursorPos == eMailboxInfo.count) @@ -1155,7 +1127,7 @@ static void Mailbox_ProcessInput(u8 taskId) } else if(gMain.newKeys & B_BUTTON) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); Mailbox_TurnOff(taskId); } @@ -1165,13 +1137,13 @@ static void Mailbox_ProcessInput(u8 taskId) static void Mailbox_CloseScrollIndicators(void) { BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); } static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); StringCopy(gStringVar1, gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos].playerName); SanitizeNameString(gStringVar1); StringExpandPlaceholders(gStringVar4, gOtherText_WhatWillYouDoMail); @@ -1180,7 +1152,7 @@ static void Mailbox_PrintWhatToDoWithPlayerMailText(u8 taskId) static void Mailbox_ReturnToPlayerPC(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0, 0x1D, 0x13); ReshowPlayerPC(taskId); } @@ -1192,8 +1164,8 @@ static void Mailbox_TurnOff(u8 taskId) static void Mailbox_PrintMailOptions(u8 taskId) // Mailbox_PrintMailOptions { - MenuDrawTextWindow(0, 0, 0xC, 0x9); - PrintMenuItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); + Menu_DrawStdWindowFrame(0, 0, 0xC, 0x9); + Menu_PrintItems(1, 1, 4, (struct MenuAction *)gMailboxMailOptions); InitMenu(0, 1, 1, 4, 0, 0xB); TASK.FUNC = Mailbox_MailOptionsProcessInput; } @@ -1203,17 +1175,17 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId) if(gMain.newAndRepeatedKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if(gMain.newAndRepeatedKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if(gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gMailboxMailOptions[GetMenuCursorPos()].func(taskId); + gMailboxMailOptions[Menu_GetCursorPos()].func(taskId); } else if(gMain.newKeys & B_BUTTON) { @@ -1224,7 +1196,7 @@ static void Mailbox_MailOptionsProcessInput(u8 taskId) static void Mailbox_DoMailRead(u8 taskId) { - fade_screen(1, 0); + FadeScreen(1, 0); TASK.FUNC = Mailbox_FadeAndReadMail; } @@ -1239,7 +1211,7 @@ static void Mailbox_FadeAndReadMail(u8 taskId) static void Mailbox_HandleReturnToProcessInput(u8 taskId) // Mailbox_HandleReturnToProcessInput { - if(sub_807D770() == TRUE) // is black fade finished? why not gPaletteFade.active? + if (IsWeatherNotFadingIn() == TRUE) // is black fade finished? why not gPaletteFade.active? TASK.FUNC = Mailbox_ProcessInput; } @@ -1259,9 +1231,9 @@ static const u8 gHighlightedMoveToBagFormatText[] = _("{COLOR RED}{STR_VAR_1}"); static void Mailbox_MoveToBag(u8 taskId) { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); StringCopy(gStringVar1, gOtherText_MoveToBag); - MenuPrint(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText + Menu_PrintText(gHighlightedMoveToBagFormatText, 1, 3); // gHighlightedMoveToBagFormatText DisplayItemMessageOnField(taskId, gOtherText_MessageWillBeLost, Mailbox_DrawYesNoBeforeMove, 0); } @@ -1275,7 +1247,7 @@ static void Mailbox_DoMailMoveToBag(u8 taskId) { struct MailStruct *mail = &gSaveBlock1.mail[eMailboxInfo.itemsAbove + 6 + eMailboxInfo.cursorPos]; - MenuZeroFillWindowRect(0x14, 8, 0x1A, 0xD); + Menu_EraseWindowRect(0x14, 8, 0x1A, 0xD); if(AddBagItem(mail->itemId, 1) == FALSE) { @@ -1298,7 +1270,7 @@ static void Mailbox_DoMailMoveToBag(u8 taskId) static void Mailbox_ReturnToInputAfterNo(u8 taskId) // Mailbox_ReturnToInputAfterNo { - MenuZeroFillWindowRect(0x14, 0x8, 0x1A, 0xD); + Menu_EraseWindowRect(0x14, 0x8, 0x1A, 0xD); Mailbox_DrawMailMenuAndDoProcessInput(taskId); } @@ -1308,7 +1280,7 @@ static void Mailbox_Give(u8 taskId) Mailbox_NoPokemonForMail(taskId); // cannot be reached normally else { - fade_screen(1, 0); + FadeScreen(1, 0); TASK.FUNC = Mailbox_DoGiveMailPokeMenu; } } @@ -1353,8 +1325,8 @@ static void Mailbox_NoPokemonForMail(u8 taskId) static void Mailbox_Cancel(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 0xC, 0x9); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 0xC, 0x9); Mailbox_DrawMailMenuAndDoProcessInput(taskId); } diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index 640d4731f..b4be44aa2 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -1,14 +1,10 @@ -// - -// - #include "global.h" #include "overworld.h" #include "sprite.h" #include "script.h" #include "strings.h" #include "task.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "text.h" #include "main.h" #include "menu.h" @@ -95,7 +91,8 @@ static const u8 *gUnknown_03000758; #define GFX_TAG_POKEBLOCK_CASE 14800 -const s8 gPokeblockFlavorCompatibilityTable[] = { +const s8 gPokeblockFlavorCompatibilityTable[] = +{ // Cool, Beauty, Cute, Smart, Tough 0, 0, 0, 0, 0, // Hardy 1, 0, 0, 0, -1, // Lonely @@ -124,14 +121,16 @@ const s8 gPokeblockFlavorCompatibilityTable[] = { 0, 0, 0, 0, 0 // Quirky }; -void (*const gUnknown_083F7EA8[])(void) = { +void (*const gUnknown_083F7EA8[])(void) = +{ sub_80A5B40, c2_exit_to_overworld_2_switch, sub_802E424, c2_exit_to_overworld_2_switch }; -const u8 *const gPokeblockNames[] = { +const u8 *const gPokeblockNames[] = +{ NULL, ContestStatsText_RedPokeBlock, ContestStatsText_BluePokeBlock, @@ -149,7 +148,8 @@ const u8 *const gPokeblockNames[] = { ContestStatsText_GoldPokeBlock }; -const struct MenuAction2 gUnknown_083F7EF4[] = { +const struct MenuAction2 gUnknown_083F7EF4[] = +{ {OtherText_Use, sub_810C508}, {OtherText_Toss, sub_810C5C0}, {gOtherText_CancelNoTerminator, sub_810C748}, @@ -165,21 +165,25 @@ const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668}; const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f}; -const struct OamData gOamData_83F7F34 = { +const struct OamData gOamData_83F7F34 = +{ .size = 3, .priority = 2 }; -const union AnimCmd gSpriteAnim_83F7F3C[] = { +const union AnimCmd gSpriteAnim_83F7F3C[] = +{ ANIMCMD_FRAME(.imageValue = 0, .duration = 0), ANIMCMD_END }; -const union AnimCmd *const gSpriteAnimTable_83F7F44[] = { +const union AnimCmd *const gSpriteAnimTable_83F7F44[] = +{ gSpriteAnim_83F7F3C }; -const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { +const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = +{ AFFINEANIMCMD_FRAME(0, 0, -2, 2), AFFINEANIMCMD_FRAME(0, 0, 2, 4), AFFINEANIMCMD_FRAME(0, 0, -2, 4), @@ -187,22 +191,26 @@ const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] = { AFFINEANIMCMD_END }; -const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = { +const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] = +{ gSpriteAffineAnim_83F7F48 }; -const struct CompressedSpriteSheet gUnknown_083F7F74 = { +const struct CompressedSpriteSheet gUnknown_083F7F74 = +{ gMenuPokeblockDevice_Gfx, 0x800, GFX_TAG_POKEBLOCK_CASE }; -const struct CompressedSpritePalette gUnknown_083F7F7C = { +const struct CompressedSpritePalette gUnknown_083F7F7C = +{ gMenuPokeblockDevice_Pal, GFX_TAG_POKEBLOCK_CASE }; -const struct SpriteTemplate gSpriteTemplate_83F7F84 = { +const struct SpriteTemplate gSpriteTemplate_83F7F84 = +{ GFX_TAG_POKEBLOCK_CASE, GFX_TAG_POKEBLOCK_CASE, &gOamData_83F7F34, @@ -212,12 +220,25 @@ const struct SpriteTemplate gSpriteTemplate_83F7F84 = { SpriteCallbackDummy }; -const struct Pokeblock gUnknown_083F7F9C[] = { - { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20}, - { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20}, - { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20}, - { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20}, - { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20} +const struct Pokeblock gUnknown_083F7F9C[] = +{ + { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 }, + { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 }, + { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 }, +#if DEBUG + { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 }, + { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 }, + { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 }, + { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 }, + { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 }, + { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 }, + { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 }, + { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 }, + { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 }, + { 0 }, +#endif }; // text @@ -232,14 +253,10 @@ static void sub_810B674(void) static void sub_810B68C(void) { - u16 *src; - vu16 *dest; LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - src = gBGTilemapBuffers[2]; - dest = (vu16 *)(VRAM + 0x7800); - DmaCopy16(3, src, dest, sizeof gBGTilemapBuffers[2]); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x7800), sizeof gBGTilemapBuffers[2]); } static bool8 sub_810B6C0(void) @@ -248,14 +265,14 @@ static bool8 sub_810B6C0(void) switch (gMain.state) { case 0: - sub_80F9438(); + ClearVideoCallbacks(); sub_80F9368(); REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2); REG_BLDCNT = 0; gMain.state++; break; case 1: - remove_some_task(); + ScanlineEffect_Stop(); gMain.state++; break; case 2: @@ -275,15 +292,15 @@ static bool8 sub_810B6C0(void) gMain.state++; break; case 5: - SetUpWindowConfig(&gWindowConfig_81E6E34); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E34); gMain.state++; break; case 6: - SetUpWindowConfig(&gWindowConfig_81E6E50); + Text_LoadWindowTemplate(&gWindowTemplate_81E6E50); gMain.state++; break; case 7: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E34); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E34); gMain.state++; break; case 8: @@ -293,7 +310,7 @@ static bool8 sub_810B6C0(void) } break; case 9: - MultistepInitMenuWindowBegin(&gWindowConfig_81E6E50); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50); gMain.state++; break; case 10: @@ -310,10 +327,10 @@ static bool8 sub_810B6C0(void) } break; case 12: - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); - CreateVerticalScrollIndicators(0, 0xb0, 0x08); - CreateVerticalScrollIndicators(1, 0xb0, 0x98); + CreateVerticalScrollIndicators(TOP_ARROW, 0xb0, 0x08); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xb0, 0x98); gMain.state++; break; case 13: @@ -432,31 +449,30 @@ void OpenPokeblockCaseOnFeeder(void) SetMainCallback2(sub_810B96C); } -#ifdef DEBUG +#if DEBUG void debug_sub_8120F98(void) { u8 i; - for (i=0; i<40 && gUnknown_083F7F9C[i].color != 0; i++) - { + + for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++) gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i]; - } } #endif static void sub_810BB0C(void) { - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); sub_8072BD8(ItemId_GetItem(ITEM_POKEBLOCK_CASE)->name, 2, 1, 0x48); } static void sub_810BB30(void) { - BasicInitMenuWindow(&gWindowConfig_81E6E34); - MenuPrint(gContestStatsText_Spicy, 2, 13); - MenuPrint(gContestStatsText_Dry, 2, 15); - MenuPrint(gContestStatsText_Sweet, 2, 17); - MenuPrint(gContestStatsText_Bitter, 8, 13); - MenuPrint(gContestStatsText_Sour, 8, 15); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); + Menu_PrintText(gContestStatsText_Spicy, 2, 13); + Menu_PrintText(gContestStatsText_Dry, 2, 15); + Menu_PrintText(gContestStatsText_Sweet, 2, 17); + Menu_PrintText(gContestStatsText_Bitter, 8, 13); + Menu_PrintText(gContestStatsText_Sour, 8, 15); } static void sub_810BB88(u8 a0) @@ -464,17 +480,17 @@ static void sub_810BB88(u8 a0) u8 i; u8 y; u8 *buf; - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); for (i=a0; i<=a0+8; i++) { y = (i - a0) << 1; if (i == gUnknown_02039248.unk2) { buf = sub_8072C74(gStringVar1, gContestStatsText_StowCase, 0x78, 0); - MenuPrint(gStringVar1, 15, y + 1); + Menu_PrintText(gStringVar1, 15, y + 1); if (i != a0 + 8) { - MenuZeroFillWindowRect(15, y + 3, 29, 18); + Menu_EraseWindowRect(15, y + 3, 29, 18); } break; } @@ -484,7 +500,7 @@ static void sub_810BB88(u8 a0) buf[2] = 0x06; buf += 3; ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3); - MenuPrint(gStringVar1, 15, y + 1); + Menu_PrintText(gStringVar1, 15, y + 1); } } @@ -560,19 +576,19 @@ static void sub_810BDAC(bool8 flag) } if (gUnknown_02039248.unk1) { - sub_80F979C(0, 0); + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); } else { - sub_80F979C(0, 1); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); } if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) { - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); } else { - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); } for (i=0; i<5; i++) { @@ -596,15 +612,15 @@ static void sub_810BDAC(bool8 flag) gBGTilemapBuffers[2][v0 + 32] = 15; } } - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2) { sub_8072C14(gStringVar1, sub_810C9E8(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1]), 16, 1); - MenuPrint(gStringVar1, 11, 17); + Menu_PrintText(gStringVar1, 11, 17); } else { - MenuZeroFillWindowRect(11, 17, 12, 18); + Menu_EraseWindowRect(11, 17, 12, 18); } } @@ -776,8 +792,8 @@ static void sub_810C23C(u8 taskId) static void sub_810C2B0(void) { - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); BuyMenuFreeMemory(); } @@ -810,11 +826,11 @@ static void sub_810C368(u8 taskId) int v0 = 0; if (gUnknown_02039244 > 1) v0 = 2; - sub_80F98A4(0); - sub_80F98A4(1); - BasicInitMenuWindow(&gWindowConfig_81E6E50); - MenuDrawTextWindow(7, v0 + 4, 13, 11); - PrintMenuItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758); + StopVerticalScrollIndicators(TOP_ARROW); + StopVerticalScrollIndicators(BOTTOM_ARROW); + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_DrawStdWindowFrame(7, v0 + 4, 13, 11); + Menu_PrintItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758); InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5); gSpecialVar_ItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1; gTasks[taskId].func = sub_810C40C; @@ -824,24 +840,24 @@ static void sub_810C40C(u8 taskId) { if (gMain.newAndRepeatedKeys & DPAD_UP) { - if (GetMenuCursorPos()) + if (Menu_GetCursorPos()) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - if (GetMenuCursorPos() != gUnknown_0203924C - 1) + if (Menu_GetCursorPos() != gUnknown_0203924C - 1) { PlaySE(SE_SELECT); - MoveMenuCursor(+1); + Menu_MoveCursor(+1); } } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gUnknown_083F7EF4[gUnknown_03000758[GetMenuCursorPos()]].func(taskId); + gUnknown_083F7EF4[gUnknown_03000758[Menu_GetCursorPos()]].func(taskId); } else if (gMain.newKeys & B_BUTTON) { @@ -868,9 +884,9 @@ static void sub_810C508(u8 taskId) static void sub_810C540(u8 taskId) { - BasicInitMenuWindow(&gWindowConfig_81E6E50); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(7, 4, 13, 11); + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_DestroyCursor(); + Menu_EraseWindowRect(7, 4, 13, 11); StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1].color]); StringExpandPlaceholders(gStringVar4, gContestStatsText_ThrowAwayPrompt); DisplayItemMessageOnField(taskId, gStringVar4, sub_810C5EC, 0); @@ -878,7 +894,7 @@ static void sub_810C540(u8 taskId) static void sub_810C5C0(u8 taskId) { - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); gTasks[taskId].func = sub_810C540; } @@ -890,7 +906,7 @@ static void sub_810C5EC(u8 taskId) static void sub_810C610(u8 taskId) { - MenuZeroFillWindowRect(7, 6, 13, 11); + Menu_EraseWindowRect(7, 6, 13, 11); PokeblockClearIfExists((gUnknown_02039248.unk0 + gUnknown_02039248.unk1)); StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway); DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0); @@ -900,15 +916,15 @@ static void sub_810C610(u8 taskId) static void sub_810C668(u8 taskId) { - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2) { - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); } - BasicInitMenuWindow(&gWindowConfig_81E6E50); - MenuZeroFillWindowRect(7, 6, 13, 11); - MenuZeroFillWindowRect(0, 14, 29, 19); + BasicInitMenuWindow(&gWindowTemplate_81E6E50); + Menu_EraseWindowRect(7, 6, 13, 11); + Menu_EraseWindowRect(0, 14, 29, 19); gTasks[taskId].func = sub_810BF7C; } @@ -922,18 +938,18 @@ static void sub_810C6DC(u8 taskId) static void sub_810C704(u8 taskId) { - BasicInitMenuWindow(&gWindowConfig_81E6E34); + BasicInitMenuWindow(&gWindowTemplate_81E6E34); sub_810BC84(gUnknown_02039248.unk1); - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); gTasks[taskId].func = sub_810C6DC; } static void sub_810C748(u8 taskId) { - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(7, 4, 13, 11); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(7, 4, 13, 11); gTasks[taskId].func = sub_810BF7C; } diff --git a/src/field/pokedex_area_screen.c b/src/field/pokedex_area_screen.c new file mode 100644 index 000000000..67ca276c4 --- /dev/null +++ b/src/field/pokedex_area_screen.c @@ -0,0 +1,20 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u16 gUnknown_02039260 = 0; +EWRAM_DATA u16 gUnknown_02039262 = 0; +EWRAM_DATA u16 gUnknown_02039264 = 0; +EWRAM_DATA u16 gUnknown_02039266 = 0; +EWRAM_DATA u16 gUnknown_02039268 = 0; +EWRAM_DATA u16 gUnknown_0203926A = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/field/pokenav.c b/src/field/pokenav.c new file mode 100644 index 000000000..f57a98df6 --- /dev/null +++ b/src/field/pokenav.c @@ -0,0 +1,16 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +EWRAM_DATA u8 gUnknown_020388B0[4] = {}; +EWRAM_DATA u16 gUnknown_020388B4 = 0; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/field/region_map.c b/src/field/region_map.c index 07e77e389..7bfda1a81 100644 --- a/src/field/region_map.c +++ b/src/field/region_map.c @@ -280,7 +280,7 @@ static u16 sub_80FB9C0(u16); static void sub_80FBA18(void); static bool8 sub_80FBAA0(u16); void CreateRegionMapCursor(u16, u16); -static void sub_80FBCA0(void); +void sub_80FBCA0(void); static void sub_80FBDF8(void); static void sub_80FBE24(void); static void SpriteCB_PlayerIconZoomedOut(struct Sprite *); @@ -288,8 +288,8 @@ static void UpdateIconBlink(struct Sprite *); static void SpriteCB_PlayerIconZoomedIn(struct Sprite *); const u8 *GetMapSectionName(u8 *, u16, u16); static void VBlankCB_FlyRegionMap(void); -static void CB2_FlyRegionMap(void); -static void sub_80FC244(void (*func)(void)); +void CB2_FlyRegionMap(void); +void sub_80FC244(void (*func)(void)); static void PrintFlyTargetName(void); static void CreateFlyTargetGraphics(void); static void CreateCityTownFlyTargetIcons(void); @@ -297,7 +297,7 @@ static void CreateSpecialAreaFlyTargetIcons(void); static void SpriteCB_FlyTargetIcons(struct Sprite *); static void sub_80FC5B4(void); static void sub_80FC600(void); -static void sub_80FC69C(void); +void sub_80FC69C(void); void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed) { @@ -1127,7 +1127,7 @@ void CreateRegionMapCursor(u16 tileTag, u16 paletteTag) } } -static void sub_80FBCA0(void) +void sub_80FBCA0(void) { if (gRegionMap->cursorSprite != NULL) { @@ -1420,7 +1420,7 @@ struct UnknownStruct4 static const u8 *const sEverGrandeCityAreaNames[] = {OtherText_PokeLeague, OtherText_PokeCenter}; -static const struct UnknownStruct4 sUnknown_083E79C0[1] = +const struct UnknownStruct4 gUnknown_083E79C0[1] = { {sEverGrandeCityAreaNames, MAPSEC_EVER_GRANDE_CITY, FLAG_SYS_POKEMON_LEAGUE_FLY}, }; @@ -1540,11 +1540,11 @@ void CB2_InitFlyRegionMap(void) FreeAllSpritePalettes(); break; case 1: - SetUpWindowConfig(&gWindowConfig_81E7224); + Text_LoadWindowTemplate(&gWindowTemplate_81E7224); break; case 2: - InitMenuWindow(&gWindowConfig_81E7224); - MenuZeroFillScreen(); + InitMenuWindow(&gWindowTemplate_81E7224); + Menu_EraseScreen(); break; case 3: InitRegionMap(&ewram0_3.regionMap, 0); @@ -1562,7 +1562,7 @@ void CB2_InitFlyRegionMap(void) break; case 6: LoadPalette(sFlyRegionMapFrame_Pal, 16, 32); - MenuPrint_PixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); + Menu_PrintTextPixelCoords(gOtherText_FlyToWhere, 1, 0x90, 1); break; case 7: CreateFlyTargetGraphics(); @@ -1591,14 +1591,14 @@ static void VBlankCB_FlyRegionMap(void) TransferPlttBuffer(); } -static void CB2_FlyRegionMap(void) +void CB2_FlyRegionMap(void) { ewram0_3.unk0(); AnimateSprites(); BuildOamBuffer(); } -static void sub_80FC244(void (*func)(void)) +void sub_80FC244(void (*func)(void)) { ewram0_3.unk0 = func; ewram0_3.unk4 = 0; @@ -1608,39 +1608,38 @@ static void PrintFlyTargetName(void) { if (ewram0_3.regionMap.unk16 == 2 || ewram0_3.regionMap.unk16 == 4) { - u16 i = 0; - int zero; + u16 i; + bool32 drawFrameDisabled = FALSE; - for (i = 0; i < ARRAY_COUNT(sUnknown_083E79C0); i++) + for (i = 0; i < ARRAY_COUNT(gUnknown_083E79C0); i++) { - const struct UnknownStruct4 *r4 = &sUnknown_083E79C0[i]; + const struct UnknownStruct4 *r4 = &gUnknown_083E79C0[i]; if (ewram0_3.regionMap.mapSectionId == r4->mapSectionId) { if (FlagGet(r4->flag)) { - MenuDrawTextWindow(16, 14, 29, 19); - MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 15); + Menu_DrawStdWindowFrame(16, 14, 29, 19); + Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 15); MenuPrint_RightAligned(r4->unk0[ewram0_3.regionMap.everGrandeCityArea], 29, 17); return; } break; } } - // This check is always true, but somehow the compiler still performed it. - asm("mov %0, #0\n":"=r"(zero)); // zero = 0 - if (zero == 0) + + if (!drawFrameDisabled) { - MenuDrawTextWindow(16, 16, 29, 19); - MenuPrint(ewram0_3.regionMap.mapSectionName, 17, 17); - MenuZeroFillWindowRect(16, 14, 29, 15); + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(ewram0_3.regionMap.mapSectionName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); } } else { - MenuDrawTextWindow(16, 16, 29, 19); - MenuPrint(ewramBlankMapName, 17, 17); - MenuZeroFillWindowRect(16, 14, 29, 15); + Menu_DrawStdWindowFrame(16, 16, 29, 19); + Menu_PrintText(ewramBlankMapName, 17, 17); + Menu_EraseWindowRect(16, 14, 29, 15); } } @@ -1796,7 +1795,7 @@ static void sub_80FC600(void) } } -static void sub_80FC69C(void) +void sub_80FC69C(void) { switch (ewram0_3.unk4) { diff --git a/src/field/roamer.c b/src/field/roamer.c index 2eb26ef9d..6ed5b6c89 100644 --- a/src/field/roamer.c +++ b/src/field/roamer.c @@ -1,7 +1,9 @@ #include "global.h" +#include "debug.h" #include "roamer.h" #include "pokemon.h" #include "random.h" +#include "region_map.h" #include "constants/species.h" #ifdef SAPPHIRE @@ -224,3 +226,20 @@ void GetRoamerLocation(u8 *mapGroup, u8 *mapNum) *mapGroup = sRoamerLocation[MAP_GRP]; *mapNum = sRoamerLocation[MAP_NUM]; } + +#if DEBUG +void debug_sub_814A714(void) +{ + if (gSaveBlock1.location.mapGroup == 0) + { + CreateInitialRoamerMon(); + sRoamerLocation[0] = 0; + sRoamerLocation[1] = gSaveBlock1.location.mapNum; + } +} + +void debug_sub_814A73C(u8* str) +{ + GetMapSectionName(str, sRoamerLocation[1], 0); +} +#endif diff --git a/src/field/safari_zone.c b/src/field/safari_zone.c index e9ca3a9f9..f371b08b3 100644 --- a/src/field/safari_zone.c +++ b/src/field/safari_zone.c @@ -26,7 +26,7 @@ static void DecrementFeederStepCounters(void); extern u8 gBattleOutcome; EWRAM_DATA u8 gNumSafariBalls = 0; -EWRAM_DATA static u16 gSafariZoneStepCounter = 0; +EWRAM_DATA u16 gSafariZoneStepCounter = 0; EWRAM_DATA static struct PokeblockFeeder gPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0}; extern void (*gFieldCallback)(void); @@ -56,7 +56,7 @@ void ResetSafariZoneFlag(void) void EnterSafariMode(void) { - IncrementGameStat(0x11); + IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE); SetSafariZoneFlag(); ClearAllPokeblockFeeders(); gNumSafariBalls = 30; diff --git a/src/field/scrcmd.c b/src/field/scrcmd.c index 05a909e81..bc5cd0b1d 100644 --- a/src/field/scrcmd.c +++ b/src/field/scrcmd.c @@ -626,7 +626,7 @@ bool8 IsPaletteNotActive(void) bool8 ScrCmd_fadescreen(struct ScriptContext *ctx) { - fade_screen(ScriptReadByte(ctx), 0); + FadeScreen(ScriptReadByte(ctx), 0); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } @@ -636,7 +636,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx) u8 duration = ScriptReadByte(ctx); u8 delay = ScriptReadByte(ctx); - fade_screen(duration, delay); + FadeScreen(duration, delay); SetupNativeScript(ctx, IsPaletteNotActive); return TRUE; } @@ -1333,7 +1333,7 @@ bool8 ScrCmd_drawbox(struct ScriptContext *ctx) u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); - MenuDrawTextWindow(left, top, right, bottom); + Menu_DrawStdWindowFrame(left, top, right, bottom); return FALSE; } @@ -1363,7 +1363,7 @@ bool8 ScrCmd_erasebox(struct ScriptContext *ctx) u8 right = ScriptReadByte(ctx); u8 bottom = ScriptReadByte(ctx); - MenuZeroFillWindowRect(left, top, right, bottom); + Menu_EraseWindowRect(left, top, right, bottom); return FALSE; } @@ -1428,8 +1428,8 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) u8 v6 = ptr[4]; u8 v7 = ptr[5]; StringBraille(gStringVar4, ptr + 6); - MenuDrawTextWindow(v2, v3, v4, v5); - MenuPrint(gStringVar4, v6, v7); + Menu_DrawStdWindowFrame(v2, v3, v4, v5); + Menu_PrintText(gStringVar4, v6, v7); return FALSE; } @@ -1755,7 +1755,7 @@ bool8 ScrCmd_pokemart(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); - CreatePokemartMenu(ptr); + Shop_CreatePokemartMenu(ptr); ScriptContext1_Stop(); return TRUE; } @@ -1764,7 +1764,7 @@ bool8 ScrCmd_pokemartdecoration(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); - CreateDecorationShop1Menu(ptr); + Shop_CreateDecorationShop1Menu(ptr); ScriptContext1_Stop(); return TRUE; } @@ -1773,7 +1773,7 @@ bool8 ScrCmd_pokemartdecoration2(struct ScriptContext *ctx) { void *ptr = (void *)ScriptReadWord(ctx); - CreateDecorationShop2Menu(ptr); + Shop_CreateDecorationShop2Menu(ptr); ScriptContext1_Stop(); return TRUE; } diff --git a/src/field/script_menu.c b/src/field/script_menu.c index 9f3ab75cc..9d901a03c 100644 --- a/src/field/script_menu.c +++ b/src/field/script_menu.c @@ -622,7 +622,7 @@ bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, u8 ig static u16 GetStringWidthInTilesForScriptMenu(const u8 *str) { // each tile on screen is 8x8, so it needs the number of tiles and not pixels, hence the division by 8. - return (GetStringWidthGivenWindowConfig((struct WindowConfig *)&gWindowConfig_81E6CE4, str) + 7) / 8; + return (Text_GetStringWidthFromWindowTemplate((struct WindowTemplate *)&gWindowTemplate_81E6CE4, str) + 7) / 8; } static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuAction *list, u8 ignoreBPress, u8 cursorPos) @@ -651,8 +651,8 @@ static void DrawMultichoiceMenu(u8 left, u8 top, u8 count, const struct MenuActi bottom = top + (2 * count + 1); - MenuDrawTextWindow(left, top, right, bottom); - PrintMenuItems(left + 1, top + 1, count, list); + Menu_DrawStdWindowFrame(left, top, right, bottom); + Menu_PrintItems(left + 1, top + 1, count, list); InitMenu(0, left + 1, top + 1, count, cursorPos, right - left - 1); StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); } @@ -687,9 +687,9 @@ static void Task_HandleMultichoiceInput(u8 taskId) if (!gPaletteFade.active) { if (!gTasks[taskId].tDoWrap) - selection = ProcessMenuInputNoWrap(); + selection = Menu_ProcessInputNoWrap(); else - selection = ProcessMenuInput(); + selection = Menu_ProcessInput(); if (selection != -2) { @@ -704,8 +704,8 @@ static void Task_HandleMultichoiceInput(u8 taskId) { gSpecialVar_Result = selection; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); + Menu_DestroyCursor(); + Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -745,7 +745,7 @@ static void sub_80B53B4(u8 left, u8 top, u8 count, const struct MenuAction *list right = (right + left) + 2; bottom = top + (2 * count + 1); - PrintMenuItems(left, top, count, list); + Menu_PrintItems(left, top, count, list); InitMenu(0, left, top, count, 0, right - left - 1); StartScriptMenuTask(left, top, right, bottom, ignoreBPress, count); } @@ -788,7 +788,7 @@ static void Task_HandleYesNoInput(u8 taskId) return; } - switch (ProcessMenuInputNoWrap()) + switch (Menu_ProcessInputNoWrap()) { case -2: return; @@ -805,7 +805,7 @@ static void Task_HandleYesNoInput(u8 taskId) left = gTasks[taskId].tLeft; top = gTasks[taskId].tTop; - MenuZeroFillWindowRect(left, top, left + 6, top + 5); + Menu_EraseWindowRect(left, top, left + 6, top + 5); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -839,7 +839,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPr bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top; } - width = sub_807288C(columnCount); + width = Menu_GetColumnXCoord(columnCount); gTasks[taskId].tLeft = left; gTasks[taskId].tTop = top; gTasks[taskId].tRight = width + left + 2; @@ -851,7 +851,7 @@ bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, u8 ignoreBPr static void Task_HandleMultichoiceGridInput(u8 taskId) { - s8 selection = sub_80727CC(); + s8 selection = Menu_ProcessInputGridLayout(); if (selection != -2) { @@ -866,8 +866,8 @@ static void Task_HandleMultichoiceGridInput(u8 taskId) { gSpecialVar_Result = selection; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); + Menu_DestroyCursor(); + Menu_EraseWindowRect(gTasks[taskId].tLeft, gTasks[taskId].tTop, gTasks[taskId].tRight, gTasks[taskId].tBottom); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -909,23 +909,23 @@ void ScriptMenu_CreatePCMenu(void) if (FlagGet(FLAG_SYS_GAME_CLEAR)) // player has cleared game? { numChoices = 4; - MenuDrawTextWindow(0, 0, width + 2, 9); - MenuPrint(gPCText_HallOfFame, 1, 5); - MenuPrint(gPCText_LogOff, 1, 7); + Menu_DrawStdWindowFrame(0, 0, width + 2, 9); + Menu_PrintText(gPCText_HallOfFame, 1, 5); + Menu_PrintText(gPCText_LogOff, 1, 7); } else { numChoices = 3; - MenuDrawTextWindow(0, 0, width + 2, 7); - MenuPrint(gPCText_LogOff, 1, 5); + Menu_DrawStdWindowFrame(0, 0, width + 2, 7); + Menu_PrintText(gPCText_LogOff, 1, 5); } if (FlagGet(FLAG_SYS_PC_LANETTE)) // player met lanette? - MenuPrint(gPCText_LanettesPC, 1, 1); + Menu_PrintText(gPCText_LanettesPC, 1, 1); else - MenuPrint(gPCText_SomeonesPC, 1, 1); + Menu_PrintText(gPCText_SomeonesPC, 1, 1); - MenuPrint(gPCText_PlayersPC, 1, 3); + Menu_PrintText(gPCText_PlayersPC, 1, 3); InitMenu(0, 1, 1, numChoices, 0, width + 1); StartScriptMenuTask(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices); } @@ -1008,15 +1008,15 @@ _080B57B4:\n\ movs r0, 0\n\ movs r1, 0\n\ movs r3, 0x9\n\ - bl MenuDrawTextWindow\n\ + bl Menu_DrawStdWindowFrame\n\ ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ movs r1, 0x1\n\ movs r2, 0x5\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ ldr r0, _080B57F0 @ =gPCText_LogOff\n\ movs r1, 0x1\n\ movs r2, 0x7\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ b _080B5818\n\ .align 2, 0\n\ _080B57E8: .4byte gPCText_SomeonesPC\n\ @@ -1032,11 +1032,11 @@ _080B57FC:\n\ movs r0, 0\n\ movs r1, 0\n\ movs r3, 0x7\n\ - bl MenuDrawTextWindow\n\ + bl Menu_DrawStdWindowFrame\n\ ldr r0, _080B5834 @ =gPCText_LogOff\n\ movs r1, 0x1\n\ movs r2, 0x5\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ _080B5818:\n\ adds r6, r4, 0\n\ ldr r0, _080B5838 @ =0x0000084b\n\ @@ -1047,7 +1047,7 @@ _080B5818:\n\ ldr r0, _080B583C @ =gPCText_LanettesPC\n\ movs r1, 0x1\n\ movs r2, 0x1\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ b _080B584A\n\ .align 2, 0\n\ _080B5834: .4byte gPCText_LogOff\n\ @@ -1057,12 +1057,12 @@ _080B5840:\n\ ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\ movs r1, 0x1\n\ movs r2, 0x1\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ _080B584A:\n\ ldr r0, _080B588C @ =gPCText_PlayersPC\n\ movs r1, 0x1\n\ movs r2, 0x3\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ movs r4, 0\n\ str r4, [sp]\n\ adds r0, r5, 0x1\n\ @@ -1096,8 +1096,8 @@ _080B588C: .4byte gPCText_PlayersPC\n\ void ScriptMenu_DisplayPCStartupPrompt(void) { - MenuDisplayMessageBox(); - MenuPrint(gPCText_WhichPCShouldBeAccessed, 2, 15); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gPCText_WhichPCShouldBeAccessed, 2, 15); } #define tState data[0] @@ -1122,7 +1122,7 @@ static void Task_PokemonPicWindow(u8 taskId) task->tState++; break; case 3: - MenuZeroFillWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10); + Menu_EraseWindowRect(task->tWindowX, task->tWindowY, task->tWindowX + 9, task->tWindowY + 10); DestroyTask(taskId); break; } @@ -1139,7 +1139,7 @@ bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y) } else { - MenuDrawTextWindow(x, y, x + 9, y + 10); + Menu_DrawStdWindowFrame(x, y, x + 9, y + 10); taskId = CreateTask(Task_PokemonPicWindow, 0x50); gTasks[taskId].tState = 0; gTasks[taskId].tMonSpecies = species; diff --git a/src/field/secret_base.c b/src/field/secret_base.c index 2e4138a3b..8b67a2cd9 100644 --- a/src/field/secret_base.c +++ b/src/field/secret_base.c @@ -51,7 +51,7 @@ static void Task_SecretBasePC_Registry(u8 taskId); extern u8 gUnknown_0815F399[]; extern u8 gUnknown_0815F49A[]; -extern u8 gUnknown_020387DC; +EWRAM_DATA u8 gUnknown_020387DC = 0; const struct { @@ -348,7 +348,7 @@ void sub_80BBA48(u8 taskid) void sub_80BBAF0(void) { CreateTask(sub_80BBA48, 0); - fade_screen(1, 0); + FadeScreen(1, 0); saved_warp2_set(0, gSaveBlock1.location.mapGroup, gSaveBlock1.location.mapNum, -1); } @@ -362,7 +362,7 @@ bool8 sub_80BBB24(void) void sub_80BBB50(u8 taskid) { FieldObjectTurn(&(gMapObjects[gPlayerAvatar.mapObjectId]), 2); - if (sub_807D770() == 1) { + if (IsWeatherNotFadingIn() == 1) { EnableBothScriptContexts(); DestroyTask(taskid); } @@ -397,7 +397,7 @@ void sub_80BBC78(void) { u8 taskid = CreateTask(sub_80BBBEC, 0); gTasks[taskid].data[0] = 0; - fade_screen(1, 0); + FadeScreen(1, 0); } bool8 CurrentMapIsSecretBase(void) @@ -534,7 +534,7 @@ void sub_80BC074(u8 taskid) void sub_80BC0F8(void) { CreateTask(sub_80BC074, 0); - fade_screen(1, 0); + FadeScreen(1, 0); } void sub_80BC114(void) { @@ -895,7 +895,7 @@ void Task_SecretBasePC_Registry(u8 taskId) s16 *taskData; ScriptContext2_Enable(); - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); LoadScrollIndicatorPalette(); taskData = gTasks[taskId].data; @@ -913,7 +913,7 @@ void Task_SecretBasePC_Registry(u8 taskId) taskData[1] = 0; taskData[2] = 0; - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; @@ -948,8 +948,8 @@ void sub_80BC6B0(u8 taskId) if (sub_80BC268(i) == TRUE) { sub_80BC190(gStringVar1, i); - MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); - MenuPrint(gStringVar1, 18, 2 * n + 2); + Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); + Menu_PrintText(gStringVar1, 18, 2 * n + 2); if (++n == 8) break; } @@ -957,25 +957,25 @@ void sub_80BC6B0(u8 taskId) if (n < 8) { - MenuFillWindowRectWithBlankTile(18, 2 * n + 2, 28, 2 * n + 3); - MenuPrint(gUnknownText_Exit, 18, 2 * n + 2); - DestroyVerticalScrollIndicator(1); + Menu_BlankWindowRect(18, 2 * n + 2, 28, 2 * n + 3); + Menu_PrintText(gUnknownText_Exit, 18, 2 * n + 2); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); if (n != 7) - MenuFillWindowRectWithBlankTile(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match + Menu_BlankWindowRect(18, ((n << 25) + (1 << 26)) >> 24, 28, 18); // the shifts are needed to match } else - CreateVerticalScrollIndicators(1, 0xbc, 0x98); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xbc, 0x98); if (taskData[2] == 0) - DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(TOP_ARROW); else - CreateVerticalScrollIndicators(0, 0xbc, 0x08); + CreateVerticalScrollIndicators(TOP_ARROW, 0xbc, 0x08); } void sub_80BC7D8(u8 taskId) { u16 *taskData = gTasks[taskId].data; - MenuDrawTextWindow(17, 0, 29, 19); + Menu_DrawStdWindowFrame(17, 0, 29, 19); InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); sub_80BC6B0(taskId); @@ -990,7 +990,7 @@ void sub_80BC824(u8 taskId) if (taskData[1]) { PlaySE(5); - taskData[1] = MoveMenuCursor(-1); + taskData[1] = Menu_MoveCursor(-1); } else if (taskData[2]) { @@ -1013,7 +1013,7 @@ void sub_80BC824(u8 taskId) else { PlaySE(5); - taskData[1] = MoveMenuCursor(1); + taskData[1] = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -1021,13 +1021,13 @@ void sub_80BC824(u8 taskId) PlaySE(5); if (taskData[1] + taskData[2] == taskData[0]) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BCC54(taskId); } else { - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); taskData[4] = sub_80BC948(taskData[1] + taskData[2]); sub_80BC980(taskId); } @@ -1035,8 +1035,8 @@ void sub_80BC824(u8 taskId) else if (gMain.newKeys & B_BUTTON) { PlaySE(5); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BCC54(taskId); } } @@ -1064,10 +1064,10 @@ u8 sub_80BC948(u8 a) void sub_80BC980(u8 taskId) { - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); - MenuDrawTextWindow(1, 0, 12, 5); - PrintMenuItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DrawStdWindowFrame(1, 0, 12, 5); + Menu_PrintItems(2, 1, 2, (const struct MenuAction *)gUnknown_083D13D4); InitMenu(0, 2, 1, 2, 0, 10); gTasks[taskId].func = sub_80BC9E4; } @@ -1076,24 +1076,24 @@ void sub_80BC9E4(u8 taskId) { if (gMain.newAndRepeatedKeys & DPAD_UP) { - if (GetMenuCursorPos()) + if (Menu_GetCursorPos()) { PlaySE(5); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) { - if (GetMenuCursorPos() != 1) + if (Menu_GetCursorPos() != 1) { PlaySE(5); - MoveMenuCursor(1); + Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) { PlaySE(5); - gUnknown_083D13D4[GetMenuCursorPos()].func(taskId); + gUnknown_083D13D4[Menu_GetCursorPos()].func(taskId); } else if (gMain.newKeys & B_BUTTON) { @@ -1106,10 +1106,10 @@ void sub_80BCA84(u8 taskId) { s16 *taskData = gTasks[taskId].data; - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BC190(gStringVar1, taskData[4]); StringExpandPlaceholders(gStringVar4, gOtherText_OkayToDeleteFromRegistry); @@ -1126,7 +1126,7 @@ void sub_80BCB10(u8 taskId) { s16 *taskData = gTasks[taskId].data; - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); gSaveBlock1.secretBases[taskData[4]].sbr_field_1_6 = 0; taskData[0]--; @@ -1147,13 +1147,13 @@ void sub_80BCB10(u8 taskId) void sub_80BCB90(u8 taskId) { - MenuZeroFillWindowRect(20, 8, 26, 13); + Menu_EraseWindowRect(20, 8, 26, 13); DisplayItemMessageOnField(taskId, gOtherText_RegisteredDataDeleted, sub_80BCB10, 0); } void sub_80BCBC0(u8 taskId) { - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_EraseWindowRect(0, 0, 29, 19); sub_80BC7D8(taskId); gTasks[taskId].func = sub_80BC824; @@ -1164,9 +1164,9 @@ void sub_80BCBF8(u8 taskId) s16 *taskData = gTasks[taskId].data; InitMenu(0, 18, 2, taskData[3] + 1, taskData[1], 11); - MenuZeroFillWindowRect(1, 0, 12, 5); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); + Menu_EraseWindowRect(1, 0, 12, 5); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); gTasks[taskId].func = sub_80BC824; } @@ -1176,8 +1176,8 @@ void sub_80BCC54(u8 taskId) u16 curBaseIndex = VarGet(VAR_CURRENT_SECRET_BASE); BuyMenuFreeMemory(); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); if (curBaseIndex == 0) { @@ -1648,6 +1648,178 @@ void sub_80BD610(struct SecretBaseRecord *basesA, struct SecretBaseRecord *bases sub_80BD328(basesC, 0); } +#if DEBUG +__attribute__((naked)) +void sub_80BD674(void *playerRecords, u32 size, u8 c) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + add r6, r0, #0\n\ + add r5, r1, #0\n\ + lsl r2, r2, #0x18\n\ + lsr r7, r2, #0x18\n\ + ldr r0, ._503 @ gUnknown_020297ED\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._498 @cond_branch\n\ + mov r0, #0x60\n\ + bl FlagGet\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + bne ._498 @cond_branch\n\ + b ._520\n\ +._498:\n\ + bl GetLinkPlayerCount\n\ + lsl r0, r0, #0x18\n\ + lsr r0, r0, #0x18\n\ + cmp r0, #0x2\n\ + beq ._500 @cond_branch\n\ + cmp r0, #0x3\n\ + beq ._501 @cond_branch\n\ + b ._505\n\ +._504:\n\ + .align 2, 0\n\ +._503:\n\ + .word gUnknown_020297ED\n\ +._500:\n\ + lsl r4, r5, #0x1\n\ + add r0, r6, r4\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl memset\n\ + add r4, r4, r5\n\ + add r4, r6, r4\n\ + add r0, r4, #0\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl memset\n\ + b ._505\n\ +._501:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, r5\n\ + add r0, r6, r0\n\ + mov r1, #0x0\n\ + add r2, r5, #0\n\ + bl memset\n\ +._505:\n\ + cmp r7, #0x1\n\ + beq ._506 @cond_branch\n\ + cmp r7, #0x1\n\ + bgt ._507 @cond_branch\n\ + cmp r7, #0\n\ + beq ._508 @cond_branch\n\ + b ._515\n\ +._507:\n\ + cmp r7, #0x2\n\ + beq ._510 @cond_branch\n\ + cmp r7, #0x3\n\ + beq ._511 @cond_branch\n\ + b ._515\n\ +._508:\n\ + add r0, r6, r5\n\ + lsl r2, r5, #0x1\n\ + add r1, r6, r2\n\ + add r2, r2, r5\n\ + add r2, r6, r2\n\ + bl sub_80BD610\n\ + b ._515\n\ +._506:\n\ + lsl r1, r5, #0x1\n\ + add r0, r6, r1\n\ + add r1, r1, r5\n\ + add r1, r6, r1\n\ + add r2, r6, #0\n\ + bl sub_80BD610\n\ + b ._515\n\ +._510:\n\ + lsl r0, r5, #0x1\n\ + add r0, r0, r5\n\ + add r0, r6, r0\n\ + add r2, r6, r5\n\ + add r1, r6, #0\n\ + bl sub_80BD610\n\ + b ._515\n\ +._511:\n\ + add r1, r6, r5\n\ + lsl r2, r5, #0x1\n\ + add r2, r6, r2\n\ + add r0, r6, #0\n\ + bl sub_80BD610\n\ +._515:\n\ + mov r3, #0x1\n\ + ldr r6, ._521 @ gSaveBlock1\n\ + mov r5, #0x10\n\ + neg r5, r5\n\ + ldr r4, ._521 + 4 @ 0x1a09\n\ +._517:\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x5\n\ + add r0, r0, r6\n\ + add r2, r0, r4\n\ + ldrb r1, [r2]\n\ + lsl r0, r1, #0x1c\n\ + lsr r0, r0, #0x1c\n\ + cmp r0, #0x1\n\ + bne ._516 @cond_branch\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + mov r1, #0x40\n\ + orr r0, r0, r1\n\ + and r0, r0, r5\n\ + strb r0, [r2]\n\ +._516:\n\ + add r0, r3, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r3, r0, #0x10\n\ + cmp r3, #0x13\n\ + bls ._517 @cond_branch\n\ + bl sub_80BD280\n\ + mov r3, #0x1\n\ + ldr r4, ._521 @ gSaveBlock1\n\ + ldr r6, ._521 + 4 @ 0x1a09\n\ + add r7, r4, #0\n\ + mov r5, #0x3f\n\ +._519:\n\ + lsl r0, r3, #0x2\n\ + add r0, r0, r3\n\ + lsl r0, r0, #0x5\n\ + add r0, r0, r4\n\ + add r2, r0, r6\n\ + ldrb r1, [r2]\n\ + lsr r0, r1, #0x6\n\ + cmp r0, #0x2\n\ + bne ._518 @cond_branch\n\ + add r0, r5, #0\n\ + and r0, r0, r1\n\ + strb r0, [r2]\n\ +._518:\n\ + add r0, r3, #1\n\ + lsl r0, r0, #0x10\n\ + lsr r3, r0, #0x10\n\ + cmp r3, #0x13\n\ + bls ._519 @cond_branch\n\ + ldr r0, ._521 + 8 @ 0x1a16\n\ + add r2, r7, r0\n\ + ldrh r1, [r2]\n\ + ldr r0, ._521 + 12 @ 0xffff\n\ + cmp r1, r0\n\ + beq ._520 @cond_branch\n\ + add r0, r1, #1\n\ + strh r0, [r2]\n\ +._520:\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._522:\n\ + .align 2, 0\n\ +._521:\n\ + .word gSaveBlock1\n\ + .word 0x1a09\n\ + .word 0x1a16\n\ + .word 0xffff"); +} +#else void sub_80BD674(void *playerRecords, u32 size, u8 c) { if (FlagGet(FLAG_RECEIVED_SECRET_POWER)) @@ -1706,3 +1878,4 @@ void sub_80BD674(void *playerRecords, u32 size, u8 c) } } } +#endif diff --git a/src/field/shop.c b/src/field/shop.c index 23d668fc7..fdee31178 100644 --- a/src/field/shop.c +++ b/src/field/shop.c @@ -15,7 +15,7 @@ #include "strings.h" #include "task.h" #include "tv.h" -#include "unknown_task.h" +#include "scanline_effect.h" #include "field_map_obj.h" #include "field_player_avatar.h" #include "fieldmap.h" @@ -28,54 +28,66 @@ #include "field_camera.h" #include "ewram.h" -extern bool8 sub_80A52C4(u8, u8); +extern bool8 SellMenu_QuantityRoller(u8, u8); extern u8 gBuyMenuFrame_Gfx[]; extern u16 gBuyMenuFrame_Tilemap[]; extern u16 gMenuMoneyPal[16]; -void sub_80B39D0(int var1, int var2, bool32 hasControlCode); -void sub_80B3A70(void); -void sub_80B4378(u8); -void sub_80B43F0(u8); -void Task_ExitBuyMenu(u8); -void sub_80B4470(u8); -void sub_80B2EFC(u8 taskId); -void sub_80B2F30(u8 taskId); -void HandleShopMenuQuit(u8 taskId); -void sub_80B3BF4(u8 taskId); -void sub_80B3D7C(u8 taskId); +static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode); +static void Shop_PrintItemDescText(void); +static void Task_ReturnToBuyMenu(u8); +static void Task_ExitBuyMenu(u8); +static void Task_ExitBuyMenuDoFade(u8); +static void Task_UpdatePurchaseHistory(u8); +static void Task_HandleShopMenuBuy(u8 taskId); +static void Task_HandleShopMenuSell(u8 taskId); +static void Task_HandleShopMenuQuit(u8 taskId); +static void Task_DoItemPurchase(u8 taskId); +static void Task_CancelItemPurchase(u8 taskId); +static void Task_DoBuySellMenu(u8); +static void Shop_FadeAndRunBuySellCallback(u8); +static void BuyMenuDrawGraphics(void); +static void sub_80B3240(void); +static void DrawFirstMartScrollIndicators(void); +static void Shop_DrawViewport(void); +static void Shop_InitMenus(int, int); +static void Shop_PrintItemDesc(void); +static void Shop_DoCursorAction(u8); +static void Shop_LoadViewportObjects(void); +static void Shop_AnimViewportObjects(void); // iwram static struct MartInfo gMartInfo; // ewram EWRAM_DATA u32 gMartTotalCost = 0; -EWRAM_DATA s16 gUnknown_020386A4[16][4] = {0}; -EWRAM_DATA struct ItemSlot gUnknown_02038724[3] = {0}; // tv.c uses this, so it cant be static -EWRAM_DATA u8 gUnknown_02038730 = 0; -EWRAM_DATA u8 gUnknown_02038731 = 0; +EWRAM_DATA s16 gMartViewportObjects[16][4] = {0}; +EWRAM_DATA struct ItemSlot gMartPurchaseHistory[3] = {0}; +EWRAM_DATA u8 gMartPurchaseHistoryId = 0; + +EWRAM_DATA u8 gUnknown_02038731 = 0; // This really should be in fldeff_escalator, but being in a new file aligns the ewram, which doesnt match the ROM. // rodata static const struct MenuAction2 sBuySellQuitMenuActions[] = { - { MartText_Buy, sub_80B2EFC }, - { MartText_Sell, sub_80B2F30 }, - { MartText_Quit2, HandleShopMenuQuit }, + { MartText_Buy, Task_HandleShopMenuBuy }, + { MartText_Sell, Task_HandleShopMenuSell }, + { MartText_Quit2, Task_HandleShopMenuQuit }, }; -static const u8 gUnknown_083CC6E8[] = {0, 1, 2}; // BUY SELL EXIT -static const u8 gUnknown_083CC6EB[] = {0, 2}; // BUY EXIT +static const u8 gMartBuySellOptionList[] = {SHOP_BUY, SHOP_SELL, SHOP_EXIT}; +static const u8 gMartBuyNoSellOptionList[] = {SHOP_BUY, SHOP_EXIT}; static const u16 gUnusedMartArray[] = {0x2, 0x3, 0x4, 0xD, 0x121, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x0, 0x0}; -static const struct YesNoFuncTable gUnknown_083CC708[] = +static const struct YesNoFuncTable sShopPurchaseYesNoFuncs[] = { - sub_80B3BF4, - sub_80B3D7C + Task_DoItemPurchase, + Task_CancelItemPurchase }; -u8 CreateShopMenu(u8 martType) +static u8 CreateShopMenu(u8 martType) { ScriptContext2_Enable(); gMartInfo.martType = martType; @@ -84,26 +96,26 @@ u8 CreateShopMenu(u8 martType) if (martType == MART_TYPE_0) { gMartInfo.numChoices = 2; - MenuDrawTextWindow(0, 0, 10, 7); - PrintMenuItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gUnknown_083CC6E8); + Menu_DrawStdWindowFrame(0, 0, 10, 7); + Menu_PrintItemsReordered(1, 1, 3, sBuySellQuitMenuActions, gMartBuySellOptionList); } else { gMartInfo.numChoices = 1; - MenuDrawTextWindow(0, 0, 10, 5); - PrintMenuItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gUnknown_083CC6EB); + Menu_DrawStdWindowFrame(0, 0, 10, 5); + Menu_PrintItemsReordered(1, 1, 2, sBuySellQuitMenuActions, gMartBuyNoSellOptionList); } InitMenu(0, 1, 1, gMartInfo.numChoices + 1, 0, 9); // add 1 for cancel - return CreateTask(sub_80B2E38, 8); + return CreateTask(Task_DoBuySellMenu, 8); } -void SetShopMenuCallback(void *callbackPtr) +static void SetShopMenuCallback(void *callbackPtr) { gMartInfo.callback = callbackPtr; } -void SetShopItemsForSale(u16 *items) +static void SetShopItemsForSale(u16 *items) { u16 i = 0; @@ -117,16 +129,16 @@ void SetShopItemsForSale(u16 *items) } } -void sub_80B2E38(u8 var) +static void Task_DoBuySellMenu(u8 taskId) { - const u8 local = var; + const u8 taskIdConst = taskId; // why is a local const needed to match? if (gMain.newAndRepeatedKeys & DPAD_UP) { if (gMartInfo.cursor) // can move cursor up? { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(-1); + gMartInfo.cursor = Menu_MoveCursor(-1); } } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) @@ -134,7 +146,7 @@ void sub_80B2E38(u8 var) if (gMartInfo.cursor != gMartInfo.numChoices) // can move cursor down? { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(1); + gMartInfo.cursor = Menu_MoveCursor(1); } } else if (gMain.newKeys & A_BUTTON) @@ -142,40 +154,40 @@ void sub_80B2E38(u8 var) PlaySE(SE_SELECT); if (gMartInfo.martType == MART_TYPE_0) { - sBuySellQuitMenuActions[gUnknown_083CC6E8[gMartInfo.cursor]].func(local); + sBuySellQuitMenuActions[gMartBuySellOptionList[gMartInfo.cursor]].func(taskIdConst); } else { - sBuySellQuitMenuActions[gUnknown_083CC6EB[gMartInfo.cursor]].func(local); + sBuySellQuitMenuActions[gMartBuyNoSellOptionList[gMartInfo.cursor]].func(taskIdConst); } } else if (gMain.newKeys & B_BUTTON) { PlaySE(SE_SELECT); - HandleShopMenuQuit(local); + Task_HandleShopMenuQuit(taskIdConst); } } -void sub_80B2EFC(u8 taskId) +static void Task_HandleShopMenuBuy(u8 taskId) { gTasks[taskId].data[8] = (u32)BuyMenuDrawGraphics >> 16; gTasks[taskId].data[9] = (u32)BuyMenuDrawGraphics; - gTasks[taskId].func = sub_80B2FA0; - fade_screen(1, 0); + gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; + FadeScreen(1, 0); } -void sub_80B2F30(u8 taskId) +static void Task_HandleShopMenuSell(u8 taskId) { - gTasks[taskId].data[8] = (u32)sub_80A6300 >> 16; - gTasks[taskId].data[9] = (u32)sub_80A6300; - gTasks[taskId].func = sub_80B2FA0; - fade_screen(1, 0); + gTasks[taskId].data[8] = (u32)ItemMenu_LoadSellMenu >> 16; + gTasks[taskId].data[9] = (u32)ItemMenu_LoadSellMenu; + gTasks[taskId].func = Shop_FadeAndRunBuySellCallback; + FadeScreen(1, 0); } -void HandleShopMenuQuit(u8 taskId) +static void Task_HandleShopMenuQuit(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 11, 8); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 11, 8); sub_80BE3BC(); ScriptContext2_Disable(); DestroyTask(taskId); @@ -184,7 +196,7 @@ void HandleShopMenuQuit(u8 taskId) gMartInfo.callback(); // run the callback if it exists. } -void sub_80B2FA0(u8 taskId) +static void Shop_FadeAndRunBuySellCallback(u8 taskId) { if (!gPaletteFade.active) { @@ -193,15 +205,15 @@ void sub_80B2FA0(u8 taskId) } } -void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) +static void ReturnToShopMenuAfterExitingSellMenu(u8 taskId) { CreateShopMenu(gMartInfo.martType); DestroyTask(taskId); } -void Task_ExitSellMenu(u8 taskId) +static void Task_ReturnToMartMenu(u8 taskId) { - if (sub_807D770() == 1) + if (IsWeatherNotFadingIn() == 1) { if (gMartInfo.martType == MART_TYPE_2) DisplayItemMessageOnField(taskId, gOtherText_CanIHelpYou, ReturnToShopMenuAfterExitingSellMenu, 0); @@ -210,23 +222,24 @@ void Task_ExitSellMenu(u8 taskId) } } -void sub_80B3050(void) +void Shop_FadeReturnToMartMenu(void) { pal_fill_black(); - CreateTask(Task_ExitSellMenu, 0x8); + CreateTask(Task_ReturnToMartMenu, 0x8); } -void sub_80B3068(u8 taskId) +void Shop_RunExitSellMenuTask(u8 taskId) { - Task_ExitSellMenu(taskId); + Task_ReturnToMartMenu(taskId); } -void unref_sub_80B3078(u8 taskId) +// unused +void Shop_LoadExitSellMenuTask(u8 taskId) { - gTasks[taskId].func = Task_ExitSellMenu; + gTasks[taskId].func = Task_ReturnToMartMenu; } -void sub_80B3094(void) +static void MainCB2(void) { AnimateSprites(); BuildOamBuffer(); @@ -234,50 +247,43 @@ void sub_80B3094(void) UpdatePaletteFade(); } -void sub_80B30AC(void) +static void VBlankCB(void) { - void *addr; - void *addr2; - void *addr3; - u16 *tempArr; - u16 *tempArr2; - u16 *tempArr3; - LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - - // temp vars needed to match for some dumb reason - tempArr = gBGTilemapBuffers[1]; - addr = (void *)(VRAM + 0xE800); - DmaCopy16(3, tempArr, addr, 0x800); - tempArr2 = gBGTilemapBuffers[2]; - addr2 = (void *)(VRAM + 0xE000); - DmaCopy16(3, tempArr2, addr2, 0x800); - tempArr3 = gBGTilemapBuffers[3]; - addr3 = (void *)(VRAM + 0xF000); - DmaCopy16(3, tempArr3, addr3, 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[1], (void *)(VRAM + 0xE800), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0xE000), 0x800); + DmaCopy16Defvars(3, gBGTilemapBuffers[3], (void *)(VRAM + 0xF000), 0x800); } -// this function is fugly. pls fix -void BuyMenuDrawGraphics(void) +static void BuyMenuDrawGraphics(void) { - void *addr; - register u16 zero2 asm("r5"); - - sub_80F9438(); - remove_some_task(); - REG_BG1HOFS = (zero2 = 0); - REG_BG1VOFS = zero2; - REG_BG2HOFS = zero2; - REG_BG2VOFS = zero2; - REG_BG3HOFS = zero2; - REG_BG3VOFS = zero2; + ClearVideoCallbacks(); + ScanlineEffect_Stop(); + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; gPaletteFade.bufferTransferDisabled = 1; - addr = (void*)OAM; - { - register const u32 zero asm("r6") = 0; - DmaFill32(3, zero, addr, OAM_SIZE); + + /* + THEORY: This seemingly useless loop is required in order to match this + function without hacks. The reason is because it alters the 0 optimization + of a later assignment into using 2 different 0s instead of the same register. + It is speculated that at some point Game Freak insert an artificial + breakpoint here in order to look at the contents of OAM before it is cleared, + possibly because a programmer made a mistake in shop.c which corrupted its + contents. There may have been a macro here which at one point idled on the + while(1) but was changed to 0 for release due to a define somewhere. A + while(0) also matches, but it is more correct to use do {} while(0) as it + was a fix to prevent compiler warnings on older compilers. + */ + do {} while(0); + + DmaFill32Defvars(3, 0, (void*)OAM, OAM_SIZE); LZDecompressVram(gBuyMenuFrame_Gfx, (void*)(VRAM + 0x7C00)); LZDecompressWram(gBuyMenuFrame_Tilemap, ewram18000_2); LoadCompressedPalette(gMenuMoneyPal, 0xC0, sizeof(gMenuMoneyPal)); @@ -285,74 +291,74 @@ void BuyMenuDrawGraphics(void) ResetPaletteFade(); ResetSpriteData(); ResetTasks(); - SetUpWindowConfig(&gWindowConfig_81E6DFC); - InitMenuWindow(&gWindowConfig_81E6DFC); - BuyMenuDrawMapGraphics(); - gMartInfo.cursor = zero; - gMartInfo.choicesAbove = zero2; - MenuZeroFillWindowRect(0, 0, 0x20, 0x20); + Text_LoadWindowTemplate(&gWindowTemplate_81E6DFC); + InitMenuWindow(&gWindowTemplate_81E6DFC); + Shop_DrawViewport(); + gMartInfo.cursor = 0; + gMartInfo.choicesAbove = 0; + Menu_EraseWindowRect(0, 0, 0x20, 0x20); OpenMoneyWindow(gSaveBlock1.money, 0, 0); - sub_80B3764(0, 7); - sub_80B37EC(); - sub_80B3270(); - CreateTask(sub_80B40E8, 0x8); + Shop_InitMenus(0, 7); + Shop_PrintItemDesc(); + DrawFirstMartScrollIndicators(); + CreateTask(Shop_DoCursorAction, 0x8); sub_80B3240(); - asm("":::"r4"); // what?? - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, zero); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0x10, 0, 0); gPaletteFade.bufferTransferDisabled = 0; - SetVBlankCallback(sub_80B30AC); - SetMainCallback2(sub_80B3094); - } + SetVBlankCallback(VBlankCB); + SetMainCallback2(MainCB2); } -void sub_80B3240(void) +static void sub_80B3240(void) { - u16 tempArr[2] = {0x41EE, 0x7FFF}; + u16 colors[2] = {RGB(14, 15, 16), RGB_WHITE}; - LoadPalette(&tempArr[1], 0xD1, 2); - LoadPalette(&tempArr[0], 0xD8, 2); + LoadPalette(&colors[1], 0xD1, sizeof colors[1]); + LoadPalette(&colors[0], 0xD8, sizeof colors[0]); } -void sub_80B3270(void) +static void DrawFirstMartScrollIndicators(void) { - sub_80F944C(); + ClearVerticalScrollIndicatorPalettes(); if (gMartInfo.itemCount > 7) { - CreateVerticalScrollIndicators(0, 172, 12); - CreateVerticalScrollIndicators(1, 172, 148); - sub_80F979C(0, 1); + CreateVerticalScrollIndicators(TOP_ARROW, 172, 12); + CreateVerticalScrollIndicators(BOTTOM_ARROW, 172, 148); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); } } -void sub_80B32A4(void) +static void Shop_TryDrawVerticalScrollIndicators(void) { if (gMartInfo.choicesAbove == 0) - sub_80F979C(0, 1); + SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE); else - sub_80F979C(0, 0); + SetVerticalScrollIndicators(TOP_ARROW, VISIBLE); if (gMartInfo.choicesAbove + 7 >= gMartInfo.itemCount) - sub_80F979C(1, 1); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); else - sub_80F979C(1, 0); + SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE); } -void sub_80B32EC(u16 *array, s16 offset1, s16 offset2) +// what is the point of this function? the tiles always get overwritten by BuyMenuDrawTextboxBG. +static void BuyMenuDrawTextboxBG_Old(u16 *array, s16 offset1, s16 offset2) { array[offset1 + offset2] = 0xC3E1; array[offset1 + offset2 + 1] = 0xC3E1; } -void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2) +static void BuyMenuDrawMapMetatileLayer(u16 *array, s16 offset1, s16 offset2, u16 *array2) { - array[offset1 + offset2] = array2[0]; - array[offset1 + offset2 + 1] = array2[1]; - array[offset1 + offset2 + 32] = array2[2]; - array[offset1 + offset2 + 33] = array2[3]; + // This function draws a whole 2x2 metatile. + array[offset1 + offset2] = array2[0]; // top left + array[offset1 + offset2 + 1] = array2[1]; // top right + array[offset1 + offset2 + 32] = array2[2]; // bottom left + array[offset1 + offset2 + 33] = array2[3]; // bottom right } -void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) +static void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) { u8 tempVar4 = var4; s16 offset1 = var1 * 2; @@ -375,7 +381,8 @@ void BuyMenuDrawMapMetatile(int var1, int var2, u16 *var3, s32 var4) } } -void sub_80B33D0(s16 var1, int var2, u16 *var3) +// used to draw the border tiles around the viewport. +static void BuyMenuDrawMapPartialMetatile(s16 var1, int var2, u16 *var3) { s16 offset1 = var1 * 2; s16 offset2 = (var2 * 0x40) + 0x40; @@ -384,7 +391,7 @@ void sub_80B33D0(s16 var1, int var2, u16 *var3) BuyMenuDrawMapMetatileLayer(gBGTilemapBuffers[2], offset1, offset2, var3 + 4); } -void sub_80B3420(void) +static void Shop_DrawViewportTiles(void) { s16 facingX; s16 facingY; @@ -413,26 +420,26 @@ void sub_80B3420(void) else { if (metatileId < 512) - sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8); + BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->primaryTileset->metatiles + metatileId * 8); else - sub_80B33D0(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8); + BuyMenuDrawMapPartialMetatile(x, y, (u16 *)gMapHeader.mapData->secondaryTileset->metatiles + (metatileId - 512) * 8); } if (y == 0 && x != 0 && x != 6) - sub_80B32EC(gBGTilemapBuffers[1], x * 2, 64); + BuyMenuDrawTextboxBG_Old(gBGTilemapBuffers[1], x * 2, 64); } } } -void BuyMenuDrawMapGraphics(void) +static void Shop_DrawViewport(void) { - sub_80F9020(); - sub_80B356C(); - sub_80B368C(); - sub_80B3420(); + ClearBGTilemapBuffers(); + Shop_LoadViewportObjects(); + Shop_AnimViewportObjects(); + Shop_DrawViewportTiles(); } -void sub_80B356C(void) +static void Shop_LoadViewportObjects(void) { s16 facingX; s16 facingY; @@ -444,7 +451,7 @@ void sub_80B356C(void) GetXYCoordsOneStepInFrontOfPlayer(&facingX, &facingY); playerHeight = PlayerGetZCoord(); for (y = 0; y < 16; y++) - gUnknown_020386A4[y][MAP_OBJ_ID] = 16; + gMartViewportObjects[y][MAP_OBJ_ID] = 16; for (y = 0; y < 5; y++) { for (x = 0; x < 7; x++) @@ -453,43 +460,43 @@ void sub_80B356C(void) if (mapObjId != 16) { - gUnknown_020386A4[r8][MAP_OBJ_ID] = mapObjId; - gUnknown_020386A4[r8][X_COORD] = x; - gUnknown_020386A4[r8][Y_COORD] = y; + gMartViewportObjects[r8][MAP_OBJ_ID] = mapObjId; + gMartViewportObjects[r8][X_COORD] = x; + gMartViewportObjects[r8][Y_COORD] = y; if (gMapObjects[mapObjId].mapobj_unk_18 == 1) - gUnknown_020386A4[r8][ANIM_NUM] = 0; + gMartViewportObjects[r8][ANIM_NUM] = 0; if (gMapObjects[mapObjId].mapobj_unk_18 == 2) - gUnknown_020386A4[r8][ANIM_NUM] = 1; + gMartViewportObjects[r8][ANIM_NUM] = 1; if (gMapObjects[mapObjId].mapobj_unk_18 == 3) - gUnknown_020386A4[r8][ANIM_NUM] = 2; + gMartViewportObjects[r8][ANIM_NUM] = 2; if (gMapObjects[mapObjId].mapobj_unk_18 == 4) - gUnknown_020386A4[r8][ANIM_NUM] = 3; + gMartViewportObjects[r8][ANIM_NUM] = 3; r8++; } } } } -void sub_80B368C(void) +static void Shop_AnimViewportObjects(void) { u8 i; for (i = 0; i < 16; i++) // max objects? { - if (gUnknown_020386A4[i][MAP_OBJ_ID] == 16) + if (gMartViewportObjects[i][MAP_OBJ_ID] == 16) continue; StartSpriteAnim(&gSprites[AddPseudoFieldObject( - gMapObjects[gUnknown_020386A4[i][MAP_OBJ_ID]].graphicsId, + gMapObjects[gMartViewportObjects[i][MAP_OBJ_ID]].graphicsId, SpriteCallbackDummy, - (u16)gUnknown_020386A4[i][X_COORD] * 16 + 8, - (u16)gUnknown_020386A4[i][Y_COORD] * 16 + 32, + (u16)gMartViewportObjects[i][X_COORD] * 16 + 8, + (u16)gMartViewportObjects[i][Y_COORD] * 16 + 32, 2)], - gUnknown_020386A4[i][ANIM_NUM]); + gMartViewportObjects[i][ANIM_NUM]); } } -void sub_80B3720(void) +static void BuyMenuDrawTextboxBG(void) { s16 i; @@ -500,14 +507,15 @@ void sub_80B3720(void) } } -void sub_80B3764(int var1, int var2) +static void Shop_InitMenus(int firstItemId, int lastItemId) { - sub_80B3720(); - sub_80B39D0(var1, var2, 0); + BuyMenuDrawTextboxBG(); + Shop_DisplayPriceInList(firstItemId, lastItemId, 0); InitMenu(0, 0xE, 0x2, 0x8, gMartInfo.cursor, 0xF); } -void sub_80B379C(void) +// after printing the item quantity and price, restore the textbox tiles before the Yes/No prompt. +static void BuyMenuDrawTextboxBG_Restore(void) { u16 i, j; @@ -516,27 +524,29 @@ void sub_80B379C(void) gBGTilemapBuffers[1][32 * (i + 12) + j] = ewram18300[32 * i + j] + 0xC3E0; } -void sub_80B37EC(void) +static void Shop_PrintItemDesc(void) { - sub_80B3A70(); + Shop_PrintItemDescText(); } -void sub_80B37F8(u8 taskId) +#define tItemCount data[1] + +static void Shop_DisplayPriceInCheckoutWindow(u8 taskId) { u16 itemListIndex = gMartInfo.choicesAbove + gMartInfo.cursor; u16 itemId = gMartInfo.itemList[itemListIndex]; u32 price = (ItemId_GetPrice(itemId) >> GetPriceReduction(1)); - PrintMoneyAmount(gTasks[taskId].data[1] * price, 6, 6, 11); + PrintMoneyAmount(gTasks[taskId].tItemCount * price, 6, 6, 11); gStringVar1[0] = EXT_CTRL_CODE_BEGIN; gStringVar1[1] = 0x14; gStringVar1[2] = 0x6; - ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].data[1], 1, 2); - MenuPrint(gOtherText_xString1, 1, 11); + ConvertIntToDecimalStringN(&gStringVar1[3], gTasks[taskId].tItemCount, 1, 2); + Menu_PrintText(gOtherText_xString1, 1, 11); sub_80A3FA0(gBGTilemapBuffers[1], 1, 11, 12, 2, 0xC3E1); } -void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode) +static void Shop_DisplayNormalPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) { u8 *stringPtr = gStringVar1; @@ -557,10 +567,10 @@ void sub_80B389C(u16 itemId, u8 var2, bool32 hasControlCode) stringPtr = &gStringVar1[3]; GetMoneyAmountText(stringPtr, (ItemId_GetPrice(itemId) >> GetPriceReduction(1)), 0x4); - MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1); + Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 1); } -void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode) +static void Shop_DisplayDecorationPriceInList(u16 itemId, u8 var2, bool32 hasControlCode) { u8 *stringPtr = gStringVar1; @@ -579,37 +589,40 @@ void sub_80B3930(u16 itemId, u8 var2, bool32 hasControlCode) if (hasControlCode != FALSE) stringPtr = &gStringVar1[3]; + // some names are the maximum string length for a shop item. Because there is no room for + // a 6 character price (including the currency), a sprite is instead used for anything that + // is the maximum decoration price in order to fit it on screen. if (gDecorations[itemId].price == 10000) { - sub_80B7B34(0x19, var2, hasControlCode); // huh??? + Draw10000Sprite(0x19, var2, hasControlCode); } else { GetMoneyAmountText(stringPtr, gDecorations[itemId].price, 0x4); - MenuPrint_PixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1); + Menu_PrintTextPixelCoords(&gStringVar1[0], 0xCA, var2 << 3, 0x1); } } -void sub_80B39D0(int var1, int var2, bool32 hasControlCode) +static void Shop_DisplayPriceInList(int firstItemId, int lastItemId, bool32 hasControlCode) { u8 i; - for (i = var1; i <= var2 && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) + for (i = firstItemId; i <= lastItemId && gMartInfo.choicesAbove + i < gMartInfo.itemCount; i++) { if (gMartInfo.martType == MART_TYPE_0) - sub_80B389C(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + Shop_DisplayNormalPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); else - sub_80B3930(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); + Shop_DisplayDecorationPriceInList(gMartInfo.itemList[gMartInfo.choicesAbove + i], (i << 1) + 2, hasControlCode); } if (i != 8 && gMartInfo.choicesAbove + i == gMartInfo.itemCount) { - MenuFillWindowRectWithBlankTile(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); - MenuPrint(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); + Menu_BlankWindowRect(0xE, (i << 1) + 2, 0x1C, (i << 1) + 3); + Menu_PrintText(gOtherText_CancelNoTerminator, 0xE, (i << 1) + 2); } } -void sub_80B3A70(void) +static void Shop_PrintItemDescText(void) { if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) { @@ -628,121 +641,122 @@ void sub_80B3A70(void) } } -void sub_80B3AEC(u8 taskId) +static void Shop_DoPremierBallCheck(u8 taskId) { if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // huh??? + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); PlaySE(SE_SELECT); - if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].data[1] >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) - DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, sub_80B4378, 0xC3E1); + if (gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] == ITEM_POKE_BALL && gTasks[taskId].tItemCount >= 10 && AddBagItem(ITEM_PREMIER_BALL, 1) == TRUE) + DisplayItemMessageOnField(taskId, gOtherText_FreePremierBall, Task_ReturnToBuyMenu, 0xC3E1); else - sub_80B4378(taskId); + Task_ReturnToBuyMenu(taskId); } } -void sub_80B3B80(u8 taskId) +static void Shop_DoItemTransaction(u8 taskId) { - IncrementGameStat(0x26); + IncrementGameStat(GAME_STAT_SHOPPED); RemoveMoney(&gSaveBlock1.money, gMartTotalCost); PlaySE(SE_REGI); UpdateMoneyWindow(gSaveBlock1.money, 0, 0); - gTasks[taskId].func = sub_80B3AEC; + gTasks[taskId].func = Shop_DoPremierBallCheck; } -void sub_80B3BD0(u8 taskId) +static void Shop_DoPricePrintAndReturnToBuyMenu(u8 taskId) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); // same thing as above? - sub_80B4378(taskId); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Task_ReturnToBuyMenu(taskId); } -void sub_80B3BF4(u8 taskId) +static void Task_DoItemPurchase(u8 taskId) { - MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD); + Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0); - sub_80B379C(); - sub_80B3420(); + BuyMenuDrawTextboxBG_Restore(); + Shop_DrawViewportTiles(); if (IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { if (gMartInfo.martType == MART_TYPE_0) { - if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].data[1])) + if (AddBagItem(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gTasks[taskId].tItemCount)) { - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, sub_80B3B80, 0xC3E1); - sub_80B4470(taskId); + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo, Shop_DoItemTransaction, 0xC3E1); + Task_UpdatePurchaseHistory(taskId); } else - DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, sub_80B3BD0, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_NoRoomFor, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); } else // a normal mart is only type 0, so types 1 and 2 are decoration marts. { if (IsThereStorageSpaceForDecoration(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor])) { if (gMartInfo.martType == MART_TYPE_1) - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, sub_80B3B80, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo2, Shop_DoItemTransaction, 0xC3E1); else - DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, sub_80B3B80, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_HereYouGo3, Shop_DoItemTransaction, 0xC3E1); } else { StringExpandPlaceholders(gStringVar4, gOtherText_SpaceForIsFull); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3BD0, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); } } } else - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); } -void sub_80B3D38(u8 taskId) +static void Shop_DoYesNoPurchase(u8 taskId) { DisplayYesNoMenu(7, 8, 1); sub_80A3FA0(gBGTilemapBuffers[1], 8, 9, 4, 4, 0xC3E1); - DoYesNoFuncWithChoice(taskId, gUnknown_083CC708); + DoYesNoFuncWithChoice(taskId, sShopPurchaseYesNoFuncs); } -void sub_80B3D7C(u8 taskId) +static void Task_CancelItemPurchase(u8 taskId) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); - MenuZeroFillWindowRect(0x7, 0x8, 0xD, 0xD); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Menu_EraseWindowRect(0x7, 0x8, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 0x8, 0x9, 0x4, 0x4, 0); - sub_80B4378(taskId); + Task_ReturnToBuyMenu(taskId); } -void sub_80B3DC8(u8 taskId) +static void Shop_PrintPrice(u8 taskId) { - if (sub_80A52C4(taskId, gMartInfo.curItemCount) == TRUE) - sub_80B37F8(taskId); + if (SellMenu_QuantityRoller(taskId, gMartInfo.curItemCount) == TRUE) + Shop_DisplayPriceInCheckoutWindow(taskId); if (gMain.newKeys & A_BUTTON) { - gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].data[1]; // set total cost of your purchase. - MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD); + gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)) * gTasks[taskId].tItemCount; // set total cost of your purchase. + Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); - sub_80B379C(); - sub_80B3420(); + BuyMenuDrawTextboxBG_Restore(); + Shop_DrawViewportTiles(); CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); - ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].data[1], 0, 0x2); + ConvertIntToDecimalStringN(gStringVar2, gTasks[taskId].tItemCount, 0, 0x2); ConvertIntToDecimalStringN(gStringVar3, gMartTotalCost, 0, 0x8); StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); } else if (gMain.newKeys & B_BUTTON) { - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 0); - sub_80B4378(taskId); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 0); + Task_ReturnToBuyMenu(taskId); } } -void sub_80B3EFC(u8 taskId) +// set the item count in the mart info to the maximum allowed by the player's budget. +static void Shop_UpdateCurItemCountToMax(u8 taskId) { u16 var; - gTasks[taskId].data[1] = 1; - MenuDrawTextWindow(0, 0xA, 0xD, 0xD); - sub_80B37F8(taskId); + gTasks[taskId].tItemCount = 1; + Menu_DrawStdWindowFrame(0, 0xA, 0xD, 0xD); + Shop_DisplayPriceInCheckoutWindow(taskId); var = gSaveBlock1.money / (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); if (var > 99) @@ -750,11 +764,11 @@ void sub_80B3EFC(u8 taskId) else gMartInfo.curItemCount = var; - gTasks[taskId].func = sub_80B3DC8; + gTasks[taskId].func = Shop_PrintPrice; } #ifdef NONMATCHING -void sub_80B3F88(void) +static void Shop_MoveItemListUp(void) { u16 *r1; u16 *r2; @@ -796,7 +810,7 @@ void sub_80B3F88(void) } #else __attribute__((naked)) -void sub_80B3F88(void) +static void Shop_MoveItemListUp(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -891,7 +905,7 @@ _080B4038: .4byte 0xfffffc40\n\ #endif #ifdef NONMATCHING -void sub_80B403C(void) +static void Shop_MoveItemListDown(void) { u16 *r1; u16 *r2; @@ -935,7 +949,7 @@ void sub_80B403C(void) } #else __attribute__((naked)) -void sub_80B403C(void) +static void Shop_MoveItemListDown(void) { asm(".syntax unified\n\ push {r4-r7,lr}\n\ @@ -1028,7 +1042,7 @@ _080B40E4: .4byte 0x800000f0\n\ } #endif -void sub_80B40E8(u8 taskId) // Mart_DoCursorAction +static void Shop_DoCursorAction(u8 taskId) { if (!gPaletteFade.active) { @@ -1041,16 +1055,16 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction PlaySE(SE_SELECT); gMartInfo.choicesAbove--; // since cursor is at the top and there are choices above the top, scroll the menu up by updating choicesAbove. - sub_80B3F88(); - sub_80B39D0(0, 0, 0); - sub_80B3A70(); - sub_80B32A4(); + Shop_MoveItemListUp(); + Shop_DisplayPriceInList(0, 0, 0); + Shop_PrintItemDescText(); + Shop_TryDrawVerticalScrollIndicators(); } else // if the cursor is not 0, choicesAbove cannot be updated yet since the cursor is at the top of the menu, so update cursor. { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(-1); // move cursor up - sub_80B3A70(); + gMartInfo.cursor = Menu_MoveCursor(-1); // move cursor up + Shop_PrintItemDescText(); } } else if ((gMain.newAndRepeatedKeys & DPAD_ANY) == DPAD_DOWN) // only down can be pressed @@ -1062,16 +1076,16 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction PlaySE(SE_SELECT); gMartInfo.choicesAbove++; - sub_80B403C(); - sub_80B39D0(7, 7, 0); - sub_80B3A70(); - sub_80B32A4(); + Shop_MoveItemListDown(); + Shop_DisplayPriceInList(7, 7, 0); + Shop_PrintItemDescText(); + Shop_TryDrawVerticalScrollIndicators(); } else if (gMartInfo.cursor != gMartInfo.itemCount) { PlaySE(SE_SELECT); - gMartInfo.cursor = MoveMenuCursor(1); - sub_80B3A70(); + gMartInfo.cursor = Menu_MoveCursor(1); + Shop_PrintItemDescText(); } } else if (gMain.newKeys & A_BUTTON) @@ -1080,25 +1094,25 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction if (gMartInfo.choicesAbove + gMartInfo.cursor != gMartInfo.itemCount) // did you not hit CANCEL? { - PauseVerticalScrollIndicator(0); - PauseVerticalScrollIndicator(1); - sub_80F979C(1, 1); - sub_80B39D0(gMartInfo.cursor, gMartInfo.cursor, 1); - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0xC, 0xD, 0x13); + PauseVerticalScrollIndicator(TOP_ARROW); + PauseVerticalScrollIndicator(BOTTOM_ARROW); + SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE); + Shop_DisplayPriceInList(gMartInfo.cursor, gMartInfo.cursor, 1); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0xC, 0xD, 0x13); if (gMartInfo.martType == MART_TYPE_0) { gMartTotalCost = (ItemId_GetPrice(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]) >> GetPriceReduction(1)); // set 1x price if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge } else // _080B42BA { CopyItemName(gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor], gStringVar1); StringExpandPlaceholders(gStringVar4, gOtherText_HowManyYouWant); - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3EFC, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_UpdateCurItemCountToMax, 0xC3E1); } } else // _080B428C @@ -1107,7 +1121,7 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction if (!IsEnoughMoney(gSaveBlock1.money, gMartTotalCost)) { - DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, sub_80B3BD0, 0xC3E1); // tail merge + DisplayItemMessageOnField(taskId, gOtherText_NotEnoughMoney, Shop_DoPricePrintAndReturnToBuyMenu, 0xC3E1); // tail merge } else { @@ -1122,43 +1136,43 @@ void sub_80B40E8(u8 taskId) // Mart_DoCursorAction { StringExpandPlaceholders(gStringVar4, gOtherText_ThatWillBe3); } - DisplayItemMessageOnField(taskId, gStringVar4, sub_80B3D38, 0xC3E1); + DisplayItemMessageOnField(taskId, gStringVar4, Shop_DoYesNoPurchase, 0xC3E1); } } } else - sub_80B43F0(taskId); + Task_ExitBuyMenu(taskId); } else if (gMain.newKeys & B_BUTTON) // go back to buy/sell/exit menu { PlaySE(SE_SELECT); - sub_80B43F0(taskId); + Task_ExitBuyMenu(taskId); } } } -void sub_80B4378(u8 taskId) +static void Task_ReturnToBuyMenu(u8 taskId) { - MenuZeroFillWindowRect(0, 0xE, 0x1D, 0x13); - MenuZeroFillWindowRect(0, 0xA, 0xD, 0xD); + Menu_EraseWindowRect(0, 0xE, 0x1D, 0x13); + Menu_EraseWindowRect(0, 0xA, 0xD, 0xD); sub_80A3FA0(gBGTilemapBuffers[1], 0x1, 0xB, 0xC, 0x2, 0); - sub_80B3420(); - sub_80B3764(6, 7); - sub_80B37EC(); - StartVerticalScrollIndicators(0); - StartVerticalScrollIndicators(1); - sub_80B32A4(); - gTasks[taskId].func = sub_80B40E8; + Shop_DrawViewportTiles(); + Shop_InitMenus(6, 7); + Shop_PrintItemDesc(); + StartVerticalScrollIndicators(TOP_ARROW); + StartVerticalScrollIndicators(BOTTOM_ARROW); + Shop_TryDrawVerticalScrollIndicators(); + gTasks[taskId].func = Shop_DoCursorAction; } -void sub_80B43F0(u8 taskId) +static void Task_ExitBuyMenu(u8 taskId) { - gFieldCallback = sub_80B3050; + gFieldCallback = Shop_FadeReturnToMartMenu; BeginNormalPaletteFade(-1, 0, 0, 0x10, 0); - gTasks[taskId].func = Task_ExitBuyMenu; + gTasks[taskId].func = Task_ExitBuyMenuDoFade; } -void Task_ExitBuyMenu(u8 taskId) +static void Task_ExitBuyMenuDoFade(u8 taskId) { if (!gPaletteFade.active) { @@ -1169,38 +1183,41 @@ void Task_ExitBuyMenu(u8 taskId) } } -void sub_80B4470(u8 taskId) +// Task_UpdatePurchaseHistory +static void Task_UpdatePurchaseHistory(u8 taskId) { u16 i; for (i = 0; i < 3; i++) { - if (gUnknown_02038724[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] - && gUnknown_02038724[i].quantity != 0) + if (gMartPurchaseHistory[i].itemId == gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor] + && gMartPurchaseHistory[i].quantity != 0) { - if (gUnknown_02038724[i].quantity + gTasks[taskId].data[1] > 255) - gUnknown_02038724[i].quantity = 255; + if (gMartPurchaseHistory[i].quantity + gTasks[taskId].tItemCount > 255) + gMartPurchaseHistory[i].quantity = 255; else - gUnknown_02038724[i].quantity += gTasks[taskId].data[1]; + gMartPurchaseHistory[i].quantity += gTasks[taskId].tItemCount; return; } } - if (gUnknown_02038730 < 3) + if (gMartPurchaseHistoryId < 3) { - gUnknown_02038724[gUnknown_02038730].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; - gUnknown_02038724[gUnknown_02038730].quantity = gTasks[taskId].data[1]; - gUnknown_02038730++; + gMartPurchaseHistory[gMartPurchaseHistoryId].itemId = gMartInfo.itemList[gMartInfo.choicesAbove + gMartInfo.cursor]; + gMartPurchaseHistory[gMartPurchaseHistoryId].quantity = gTasks[taskId].tItemCount; + gMartPurchaseHistoryId++; } } -void ClearItemPurchases(void) +#undef tItemCount + +static void ClearItemPurchases(void) { - gUnknown_02038730 = 0; - ClearItemSlots(gUnknown_02038724, 3); + gMartPurchaseHistoryId = 0; + ClearItemSlots(gMartPurchaseHistory, 3); } -void CreatePokemartMenu(u16 *itemList) +void Shop_CreatePokemartMenu(u16 *itemList) { CreateShopMenu(MART_TYPE_0); SetShopItemsForSale(itemList); @@ -1208,141 +1225,37 @@ void CreatePokemartMenu(u16 *itemList) SetShopMenuCallback(EnableBothScriptContexts); } -void CreateDecorationShop1Menu(u16 *itemList) +void Shop_CreateDecorationShop1Menu(u16 *itemList) { CreateShopMenu(MART_TYPE_1); SetShopItemsForSale(itemList); SetShopMenuCallback(EnableBothScriptContexts); } -void CreateDecorationShop2Menu(u16 *itemList) +void Shop_CreateDecorationShop2Menu(u16 *itemList) { CreateShopMenu(MART_TYPE_2); SetShopItemsForSale(itemList); SetShopMenuCallback(EnableBothScriptContexts); } -void sub_80B45B4(u8 taskId, const s16 *list, u16 c) -{ - s16 r5 = gTasks[taskId].data[4] - 1; - s16 r3 = gTasks[taskId].data[5] - 1; - s16 r4 = gTasks[taskId].data[1]; - s16 y; - s16 x; - - if (gTasks[taskId].data[2] == 0) - { - for (y = 0; y < 3; y++) - { - for (x = 0; x < 3; x++) - { - s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - - if (list[r4] == metatileId) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[r4 + 1]); - else - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[0]); - } - } - } - } - else - { - for (y = 0; y < 3; y++) - { - for (x = 0; x < 3; x++) - { - s16 metatileId = MapGridGetMetatileIdAt(r5 + x, r3 + y); - - if (list[2 - r4] == metatileId) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[1 - r4]); - else - MapGridSetMetatileIdAt(r5 + x, r3 + y, c | list[2]); - } - } - } - } -} - -static const u16 gUnknown_083CC714[] = {0x284, 0x282, 0x280}; -static const u16 gUnknown_083CC71A[] = {0x285, 0x283, 0x281}; -static const u16 gUnknown_083CC720[] = {0x28C, 0x28A, 0x288}; -static const u16 gUnknown_083CC726[] = {0x28D, 0x28B, 0x289}; -static const u16 gUnknown_083CC72C[] = {0x2A0, 0x2A2, 0x2A4}; -static const u16 gUnknown_083CC732[] = {0x2A1, 0x2A3, 0x2A5}; -static const u16 gUnknown_083CC738[] = {0x2A8, 0x2AA, 0x2AC}; - -void sub_80B4710(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - data[3] = 1; - - switch (data[0]) - { - case 0: - sub_80B45B4(taskId, gUnknown_083CC714, 0); - break; - case 1: - sub_80B45B4(taskId, gUnknown_083CC71A, 0); - break; - case 2: - sub_80B45B4(taskId, gUnknown_083CC720, 0xC00); - break; - case 3: - sub_80B45B4(taskId, gUnknown_083CC726, 0); - break; - case 4: - sub_80B45B4(taskId, gUnknown_083CC72C, 0xC00); - break; - case 5: - sub_80B45B4(taskId, gUnknown_083CC732, 0); - break; - case 6: - sub_80B45B4(taskId, gUnknown_083CC738, 0); - break; - } - - data[0] = (data[0] + 1) & 7; - if (!data[0]) - { - DrawWholeMapView(); - data[1] = (data[1] + 1) % 3; - data[3] = 0; - } -} - -u8 sub_80B47D8(u16 var) -{ - u8 taskId = CreateTask(sub_80B4710, 0); - s16 *data = gTasks[taskId].data; - - PlayerGetDestCoords(&data[4], &data[5]); - data[0] = 0; - data[1] = 0; - data[2] = var; - sub_80B4710(taskId); - return taskId; -} - -void sub_80B4824(u8 var) -{ - gUnknown_02038731 = sub_80B47D8(var); -} - -void sub_80B483C(void) -{ - DestroyTask(gUnknown_02038731); -} - -bool8 sub_80B4850(void) -{ - if (gTasks[gUnknown_02038731].data[3] == 0 && gTasks[gUnknown_02038731].data[1] == 2) - return FALSE; - else - return TRUE; +#if DEBUG +__attribute__((naked)) +void debug_sub_80C2818(void) +{ + asm("\ + push {lr}\n\ + mov r0, #0x0\n\ + bl CreateShopMenu\n\ + ldr r0, ._290 @ gMartBuyNoSellOptionList\n\ + bl SetShopItemsForSale\n\ + mov r0, #0x0\n\ + bl SetShopMenuCallback\n\ + pop {r0}\n\ + bx r0\n\ +._291:\n\ + .align 2, 0\n\ +._290:\n\ + .word gMartBuyNoSellOptionList+0x3"); } +#endif diff --git a/src/field/slot_machine.c b/src/field/slot_machine.c index 89ec68b0a..2c97c146d 100644 --- a/src/field/slot_machine.c +++ b/src/field/slot_machine.c @@ -1,49 +1,4036 @@ #include "global.h" +#include "constants/songs.h" +#include "strings2.h" +#include "overworld.h" +#include "menu_cursor.h" +#include "field_effect.h" +#include "random.h" +#include "sound.h" +#include "main.h" #include "slot_machine.h" #include "decompress.h" +#include "trig.h" +#include "graphics.h" #include "palette.h" -#include "task.h" +#include "util.h" +#include "text.h" +#include "menu.h" #include "ewram.h" -struct UnkStruct2000000 { - /*0x00*/ u8 filler00[61]; - /*0x3D*/ u8 unk3D; -}; - -struct UnkStruct1 { +struct UnkStruct1 +{ /*0x00*/ u8 unk00; /*0x01*/ u8 unk01; /*0x02*/ s16 unk02; }; -extern struct UnkStruct1 *gUnknown_083ED048[]; -extern const u16 gPalette_83EDE24[]; - -extern const u8 gSlotMachine_Gfx[]; #if ENGLISH #define SLOTMACHINE_GFX_TILES 233 #elif GERMAN #define SLOTMACHINE_GFX_TILES 236 #endif -extern const u16 gUnknown_08E95A18[]; +// TODO: figure out which functions are static and which are not. +#define static + +static void CB2_SlotMachineSetup(void); +static void CB2_SlotMachineLoop(void); +static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb); +static void SlotMachineDummyTask(u8 taskId); +static void SlotMachineSetup_0_0(void); +static void SlotMachineSetup_6_2(void); +static void SlotMachineSetup_1_0(void); +static void SlotMachineSetup_2_0(void); +static void SlotMachineSetup_2_1(void); +static void SlotMachineSetup_0_1(void); +static void SlotMachineSetup_3_0(void); +static void SlotMachineSetup_4_0(void); +static void SlotMachineSetup_5_0(void); +static void SlotMachineSetup_6_0(void); +static void SlotMachineSetup_6_1(void); +static void sub_8101D04(void); +static void sub_8101D24(u8 taskId); +static bool8 sub_8101D5C(struct Task *task); +static bool8 sub_8101D8C(struct Task *task); +static bool8 sub_8101DB0(struct Task *task); +static bool8 sub_8101DF4(struct Task *task); +static bool8 sub_8101E10(struct Task *task); +static bool8 sub_8101E3C(struct Task *task); +static bool8 sub_8101F44(struct Task *task); +static bool8 sub_8101F60(struct Task *task); +static bool8 sub_8101F88(struct Task *task); +static bool8 sub_8101FA4(struct Task *task); +static bool8 sub_8102008(struct Task *task); +static bool8 sub_8102034(struct Task *task); +static bool8 sub_8102058(struct Task *task); +static bool8 sub_8102090(struct Task *task); +bool8 sub_81020C8(struct Task *task); +static bool8 sub_81021E0(struct Task *task); +static bool8 sub_81021FC(struct Task *task); +static bool8 sub_8102264(struct Task *task); +static bool8 sub_81022A0(struct Task *task); +static bool8 sub_81022CC(struct Task *task); +static bool8 sub_81022F0(struct Task *task); +static bool8 sub_8102318(struct Task *task); +static bool8 sub_8102344(struct Task *task); +static bool8 sub_810239C(struct Task *task); +static bool8 sub_81023B8(struct Task *task); +static bool8 sub_81023E0(struct Task *task); +static bool8 sub_81023FC(struct Task *task); +static bool8 sub_8102424(struct Task *task); +static bool8 sub_8102460(struct Task *task); +static bool8 debug_sub_8116E74(struct Task *); +static void sub_8102484(void); +static void sub_81024F0(void); +static bool8 sub_8102540(void); +static u8 sub_8102578(void); +static u16 dp15_jump_random_unknown(void); +static u8 sub_81025BC(void); +static void CheckMatch(void); +static void CheckMatch_CenterRow(void); +static void CheckMatch_TopAndBottom(void); +static void CheckMatch_Diagonals(void); +static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3); +static void sub_8102A24(void); +static void sub_8102A64(u8 taskId); +static bool8 sub_8102A44(void); +static bool8 sub_8102A9C(struct Task *task); +static bool8 sub_8102AD0(struct Task *task); +static bool8 sub_8102B80(struct Task *task); +static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y); +static void sub_8102DA8(void); +static void sub_8102DEC(u8 a0); +static void sub_8102E1C(u8 a0); +static bool8 sub_8102E40(u8 a0); +static void sub_8102E68(u8 taskId); +static bool8 sub_8102EA0(struct Task *task); +static bool8 sub_8102EA4(struct Task *task); +static bool8 sub_8102EC0(struct Task *task); +static bool8 sub_8102F4C(struct Task *task); +static bool8 sub_8103008(struct Task *task); +static bool8 sub_810305C(void); +static bool8 sub_8103154(u8 a0, u8 a1); +static bool8 sub_81031B4(u8 a0, u8 a1); +static bool8 sub_81032C0(void); +static bool8 sub_81032E8(void); +static bool8 sub_810333C(void); +static bool8 sub_81033DC(void); +static bool8 sub_810341C(u8 a0); +static bool8 sub_810347C(u8 a0); +static void sub_81034F4(void); +static void sub_8103540(void); +static void sub_8103564(void); +static void j5_08111E84(void); +static void sub_8103668(void); +static void sub_810380C(void); +static void sub_8103830(void); +static void sub_8103910(void); +static void sub_8103A78(void); +static void sub_8103C14(u8 a0); +static void sub_8103C48(u8 taskId); +static void sub_8103D50(u8 a0); +static void sub_8103C78(struct Task *task, u8 taskId); +static void sub_8103CAC(struct Task *task, u8 taskId); +static void sub_8103CC8(struct Task *task, u8 taskId); +static void sub_8103D8C(u8 a0); +static void sub_8103DC8(void); +static void sub_8103E04(u8 a0); +static bool8 sub_8103E38(void); +static bool8 sub_8103E7C(void); +static bool8 sub_8103EAC(u8 spriteId); +static void sub_8103EE4(struct Sprite *sprite); +static void sub_8103F70(void); +static bool8 sub_8103FA0(void); +static void sub_8103FE8(u8 taskId); +static void sub_8104048(void); +static void sub_8104064(u8 pikaPower); +static bool8 sub_81040C8(void); +static void sub_81040E8(u8 taskId); +static void nullsub_68(struct Task *task); +static void sub_810411C(struct Task *task); +static void sub_8104144(struct Task *task); +static void sub_81041AC(struct Task *task); +static void sub_810421C(struct Task *task); +static void sub_810423C(u8 pikaPower); +static void sub_810430C(void); +static bool8 sub_810432C(void); +static void sub_810434C(u8 taskId); +static void sub_810437C(struct Task *task); +static void sub_81043EC(struct Task *task); +static void sub_8104468(struct Task *task); +static void sub_8104498(struct Task *task); +static void sub_8104548(struct Task *task); +static void sub_8104598(struct Task *task); +static void sub_81045CC(struct Task *task); +static void sub_810463C(struct Task *task); +static void sub_81046C0(struct Task *task); +static void sub_8104764(struct Task *task); +static void sub_8104794(struct Task *task); +static void sub_81047EC(struct Task *task); +static void sub_8104860(struct Task *task); +static void sub_81048A8(struct Task *task); +static void sub_81048CC(struct Task *task); +static void sub_8104940(struct Task *task); +static void sub_81049C8(struct Task *task); +static void sub_81049F8(struct Task *task); +static void sub_8104A40(s16 a0, s16 a1); +static void sub_8104A88(s16 a0); +static void sub_8104AB8(u8 a0); +static bool8 sub_8104AEC(void); +static void sub_8104B0C(u8 taskId); +static void sub_8104B3C(struct Task *task); +static void sub_8104B60(struct Task *task); +static void sub_8104B80(struct Task *task); +static void sub_8104BC8(struct Task *task); +static void sub_8104BFC(struct Task *task); +static void sub_8104C44(struct Task *task); +static void sub_8104C5C(void); +static void sub_8104CAC(u8 arg0); +static bool8 sub_8104E18(void); +static void nullsub_69(struct Task *task); +static void sub_8104E74(u8 taskId); +static void sub_8104EA8(void); +static void sub_8104F8C(void); +static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3); +static void sub_81050C4(void); +static void sub_8105100(void); +static void sub_810514C(void); +static void sub_81051C0(void); +static void sub_8105284(void); +static void sub_81052EC(void); +static void sub_81053A0(void); +static void sub_810545C(void); +static void sub_81054B8(void); +static void sub_8105524(void); +static void sub_8105554(void); +static void sub_8105578(void); +static void sub_8105688(s16 a0); +static void sub_81056C0(void); +static void sub_81056F0(void); +static void sub_81057E8(s16 a0); +static void sub_8105804(void); +static void sub_8105854(void); +static void sub_81058A0(void); +static void sub_81058C4(void); +static void sub_81059B8(void); +static void sub_81059E8(void); +static bool8 sub_8105ACC(void); +static void sub_8105AEC(void); +static u8 sub_8105B1C(s16 x, s16 y); +static void sub_8105B88(u8 spriteId); +static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4); +static void sub_81063C0(void); +static void sub_8106404(void); +static void sub_8106448(void); +static void sub_81064B8(void); +static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4); +static void sub_81065DC(void); + +#if DEBUG +__attribute__((section(".bss"))) u8 unk_debug_bss_1_0 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_1 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_2 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_3 = 0; +__attribute__((section(".bss"))) u8 unk_debug_bss_1_4 = 0; +__attribute__((section(".bss"))) u32 unk_debug_bss_1_8 = 0; +#endif + +static const struct UnkStruct1 *const gUnknown_083ED048[]; +static const u16 gPalette_83EDE24[]; +static const u8 gUnknown_083ECD04[][3]; +static const u8 gUnknown_083ECE3A[]; +static const u16 gUnknown_083ECE42[]; +static const u16 gUnknown_083ECE48[]; + +void PlaySlotMachine(u8 arg0, MainCallback cb) +{ +#if DEBUG + unk_debug_bss_1_1 = 0; +#endif + PlaySlotMachine_Internal(arg0, cb); + SetMainCallback2(CB2_SlotMachineSetup); +} + +#if DEBUG +void debug_sub_811609C(u8 a, void (*func)(void)) +{ + unk_debug_bss_1_1 = 1; + PlaySlotMachine_Internal(a, func); + SetMainCallback2(CB2_SlotMachineSetup); +} +#endif + +static void CB2_SlotMachineSetup(void) +{ + switch (gMain.state) + { + case 0: + SlotMachineSetup_0_0(); + SlotMachineSetup_0_1(); + gMain.state++; + break; + case 1: + SlotMachineSetup_1_0(); + gMain.state++; + break; + case 2: + SlotMachineSetup_2_0(); + SlotMachineSetup_2_1(); + gMain.state++; + break; + case 3: + SlotMachineSetup_3_0(); + gMain.state++; + break; + case 4: + SlotMachineSetup_4_0(); + gMain.state++; + break; + case 5: + SlotMachineSetup_5_0(); + gMain.state++; + break; + case 6: + SlotMachineSetup_6_0(); + SlotMachineSetup_6_1(); + SlotMachineSetup_6_2(); + SetMainCallback2(CB2_SlotMachineLoop); + break; + } +} + +static void CB2_SlotMachineLoop(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +static void SlotMachine_VBlankCallback(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + REG_WIN0H = eSlotMachine->win0h; + REG_WIN0V = eSlotMachine->win0v; + REG_WININ = eSlotMachine->winIn; + REG_WINOUT = eSlotMachine->winOut; +} + +static void PlaySlotMachine_Internal(u8 arg0, MainCallback cb) +{ + struct Task *task = gTasks + CreateTask(SlotMachineDummyTask, 0xFF); + task->data[0] = arg0; + StoreWordInTwoHalfwords(task->data + 1, (intptr_t)cb); +} + +static void sub_81019EC(void) +{ + struct Task *task = gTasks + FindTaskIdByFunc(SlotMachineDummyTask); + eSlotMachine->unk01 = task->data[0]; + LoadWordFromTwoHalfwords((u16 *)(task->data + 1), (u32 *)&eSlotMachine->prevMainCb); +} + +static void SlotMachineDummyTask(u8 taskId) +{ +} + +static void SlotMachineSetup_0_0(void) +{ + SetVBlankCallback(NULL); + SetHBlankCallback(NULL); + REG_DISPCNT = 0; +} + +static void SlotMachineSetup_6_2(void) +{ + u16 imeBak; + SetVBlankCallback(SlotMachine_VBlankCallback); + imeBak = REG_IME; + REG_IME = 0; + REG_IE |= INTR_FLAG_VBLANK; + REG_IME = imeBak; + REG_DISPSTAT |= DISPSTAT_VBLANK_INTR; + REG_DISPCNT = DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON; +} + +static void SlotMachineSetup_1_0(void) +{ + DmaClearLarge16(3, (u16 *)(BG_VRAM), BG_VRAM_SIZE, 0x1000); +} + +static void SlotMachineSetup_2_0(void) +{ + DmaClear16(3, (u16 *)OAM, OAM_SIZE); +} + +static void SlotMachineSetup_2_1(void) +{ + REG_BG0CNT = 0; + REG_BG1CNT = 0; + REG_BG2CNT = 0; + REG_BG3CNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + REG_BG0CNT = BGCNT_PRIORITY(0) | BGCNT_SCREENBASE(31) | BGCNT_CHARBASE(2); + REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_SCREENBASE(28); + REG_BG2CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(29); + REG_BG3CNT = BGCNT_PRIORITY(2) | BGCNT_SCREENBASE(30); + REG_WININ = 0x3f; + REG_WINOUT = 0x3f; + REG_BLDCNT = BLDCNT_TGT1_BG3 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_OBJ; + REG_BLDALPHA = 0x809; +} + +static const s16 gUnknown_083ECCF8[][2]; + +#if DEBUG +__attribute__((naked)) +static void SlotMachineSetup_0_1(void) +{ + asm("\ + push {r4, r5, r6, r7, lr}\n\ + mov r7, sl\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5, r6, r7}\n\ + bl sub_81019EC\n\ + ldr r5, ._43 @ \n\ + mov r4, #0x0\n\ + strb r4, [r5]\n\ + strb r4, [r5, #0x2]\n\ + bl Random\n\ + mov r1, #0x1\n\ + and r1, r1, r0\n\ + strb r1, [r5, #0x3]\n\ + strb r4, [r5, #0x4]\n\ + mov r0, #0x0\n\ + strh r4, [r5, #0x8]\n\ + strb r0, [r5, #0xa]\n\ + strb r0, [r5, #0xb]\n\ + ldr r0, ._43 + 4 @ \n\ + ldr r1, ._43 + 8 @ \n\ + add r0, r0, r1\n\ + ldrh r0, [r0]\n\ + strh r0, [r5, #0xc]\n\ + strh r4, [r5, #0xe]\n\ + strh r4, [r5, #0x10]\n\ + strh r4, [r5, #0x12]\n\ + strh r4, [r5, #0x18]\n\ + mov r0, #0x8\n\ + strh r0, [r5, #0x1a]\n\ + add r1, r5, #0\n\ + add r1, r1, #0x58\n\ + mov r0, #0xf0\n\ + strh r0, [r1]\n\ + add r1, r1, #0x2\n\ + mov r0, #0xa0\n\ + strh r0, [r1]\n\ + add r0, r5, #0\n\ + add r0, r0, #0x5c\n\ + mov r1, #0x3f\n\ + strh r1, [r0]\n\ + add r0, r0, #0x2\n\ + strh r1, [r0]\n\ + bl GetCurrentMapMusic\n\ + add r1, r5, #0\n\ + add r1, r1, #0x60\n\ + strh r0, [r1]\n\ + mov r7, #0x0\n\ + add r6, r5, #0\n\ + ldr r2, ._43 + 12 @ \n\ + mov sl, r2\n\ + mov r0, #0x1c\n\ + add r0, r0, r6\n\ + mov r9, r0\n\ +._41:\n\ + lsl r5, r7, #0x1\n\ + mov r1, #0x22\n\ + add r1, r1, r6\n\ + mov r8, r1\n\ + add r1, r5, r1\n\ + mov r0, #0x0\n\ + strh r0, [r1]\n\ + add r4, r6, #0\n\ + add r4, r4, #0x28\n\ + add r4, r5, r4\n\ + ldrb r0, [r6, #0x3]\n\ + lsl r0, r0, #0x1\n\ + lsl r1, r7, #0x2\n\ + add r0, r0, r1\n\ + add r0, r0, sl\n\ + mov r2, #0x0\n\ + ldsh r0, [r0, r2]\n\ + mov r1, #0x15\n\ + bl __modsi3\n\ + strh r0, [r4]\n\ + add r5, r5, r9\n\ + mov r1, #0x0\n\ + ldsh r0, [r4, r1]\n\ + lsl r1, r0, #0x1\n\ + add r1, r1, r0\n\ + lsl r1, r1, #0x3\n\ + mov r2, #0xfc\n\ + lsl r2, r2, #0x1\n\ + add r0, r2, #0\n\ + sub r0, r0, r1\n\ + strh r0, [r5]\n\ + mov r1, #0x0\n\ + ldsh r0, [r5, r1]\n\ + add r1, r2, #0\n\ + bl __modsi3\n\ + strh r0, [r5]\n\ + add r0, r7, #1\n\ + lsl r0, r0, #0x18\n\ + lsr r7, r0, #0x18\n\ + cmp r7, #0x2\n\ + bls ._41 @cond_branch\n\ + bl debug_sub_811B5D0\n\ + ldr r0, ._43 + 16 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._42 @cond_branch\n\ + mov r1, r8\n\ + sub r1, r1, #0x22\n\ + mov r0, #0xfa\n\ + lsl r0, r0, #0x2\n\ + strh r0, [r1, #0xc]\n\ +._42:\n\ + pop {r3, r4, r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov sl, r5\n\ + pop {r4, r5, r6, r7}\n\ + pop {r0}\n\ + bx r0\n\ +._44:\n\ + .align 2, 0\n\ +._43:\n\ + .word +0x2000000\n\ + .word gSaveBlock1\n\ + .word 0x494\n\ + .word gUnknown_083ECCF8\n\ + .word unk_debug_bss_1_1"); +} +#else +static void SlotMachineSetup_0_1(void) +{ + u8 i; + + sub_81019EC(); + eSlotMachine->state = 0; + eSlotMachine->pikaPower = 0; + eSlotMachine->unk03 = Random() & 1; + eSlotMachine->unk04 = 0; + eSlotMachine->matchedSymbols = 0; + eSlotMachine->unk0A = 0; + eSlotMachine->unk0B = 0; + eSlotMachine->coins = gSaveBlock1.coins; + eSlotMachine->payout = 0; + eSlotMachine->unk10 = 0; + eSlotMachine->bet = 0; + eSlotMachine->unk18 = 0; + eSlotMachine->unk1A = 8; + eSlotMachine->win0h = 0xf0; + eSlotMachine->win0v = 0xa0; + eSlotMachine->winIn = 0x3f; + eSlotMachine->winOut = 0x3f; + eSlotMachine->backupMapMusic = GetCurrentMapMusic(); + for (i = 0; i < 3; i++) + { + eSlotMachine->unk22[i] = 0; + eSlotMachine->reelPositions[i] = gUnknown_083ECCF8[i][eSlotMachine->unk03] % 21; + eSlotMachine->unk1C[i] = 0x1f8 - eSlotMachine->reelPositions[i] * 24; + eSlotMachine->unk1C[i] %= 0x1f8; + } +} +#endif + +static void SlotMachineSetup_3_0(void) +{ + Text_LoadWindowTemplate(&gWindowTemplate_81E7128); + InitMenuWindow(&gWindowTemplate_81E7128); +} + +static void SlotMachineSetup_4_0(void) +{ + ResetPaletteFade(); + ResetSpriteData(); + gOamLimit = 128; + FreeAllSpritePalettes(); + ResetTasks(); +} + +static void SlotMachineSetup_5_0(void) +{ + sub_8106448(); + sub_81064B8(); + sub_81063C0(); +} + +static void SlotMachineSetup_6_0(void) +{ + sub_8104EA8(); + sub_8104F8C(); + sub_8103DC8(); + sub_81050C4(); +} + +static void SlotMachineSetup_6_1(void) +{ + sub_8104048(); + sub_8102DA8(); + sub_8104C5C(); + sub_8101D04(); +} + +static void sub_8101D04(void) +{ + sub_8101D24(CreateTask(sub_8101D24, 0)); +} + +static bool8 (*const gUnknown_083ECAAC[])(struct Task *task) = +{ + sub_8101D5C, + sub_8101D8C, + sub_8101DB0, + sub_8101DF4, + sub_8101E10, + sub_8101E3C, + sub_8101F44, + sub_8101F60, + sub_8101F88, + sub_8101FA4, + sub_8102008, + sub_8102034, + sub_8102058, + sub_8102090, + sub_81020C8, + sub_81021E0, + sub_81021FC, + sub_8102264, + sub_81022A0, + sub_81022CC, + sub_81022F0, + sub_8102318, + sub_8102344, + sub_810239C, + sub_81023B8, + sub_81023E0, + sub_81023FC, + sub_8102424, + sub_8102460, +#if DEBUG + debug_sub_8116E74, +#endif +}; + +static void sub_8101D24(u8 taskId) +{ + while (gUnknown_083ECAAC[eSlotMachine->state](gTasks + taskId)); +} + +static bool8 sub_8101D5C(struct Task *task) +{ + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + sub_810423C(eSlotMachine->pikaPower); + eSlotMachine->state++; + return FALSE; +} + +static bool8 sub_8101D8C(struct Task *task) +{ + if (!gPaletteFade.active) + { + eSlotMachine->state++; + } + return FALSE; +} + +static bool8 sub_8101DB0(struct Task *task) +{ + eSlotMachine->payout = 0; + eSlotMachine->bet = 0; + eSlotMachine->unk18 = 0; + eSlotMachine->unk04 &= 0xc0; + eSlotMachine->state = 4; + if (eSlotMachine->coins <= 0) + { + eSlotMachine->state = 25; + } + else if (eSlotMachine->unk0A) + { + eSlotMachine->state = 3; + sub_8104CAC(4); + } + return TRUE; +} + +static bool8 sub_8101DF4(struct Task *task) +{ + if (sub_8104E18()) + { + eSlotMachine->state = 4; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101E10(struct Task *task) +{ + asm("\ + push {lr}\n\ + mov r0, #0x0\n\ + bl sub_8104CAC\n\ + ldr r2, ._70 @ \n\ + mov r0, #0x5\n\ + strb r0, [r2]\n\ + ldr r0, ._70 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._67 @cond_branch\n\ + ldr r0, ._70 + 8 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._69 @cond_branch\n\ +._67:\n\ + mov r0, #0xc\n\ + ldsh r1, [r2, r0]\n\ + ldr r0, ._70 + 12 @ \n\ + cmp r1, r0\n\ + ble ._69 @cond_branch\n\ + mov r0, #0x17\n\ + strb r0, [r2]\n\ +._69:\n\ + mov r0, #0x1\n\ + pop {r1}\n\ + bx r1\n\ +._71:\n\ + .align 2, 0\n\ +._70:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word 0x270e"); +} +#else +static bool8 sub_8101E10(struct Task *task) +{ + sub_8104CAC(0); + eSlotMachine->state = 5; + if (eSlotMachine->coins >= 9999) + { + eSlotMachine->state = 23; + } + return TRUE; +} +#endif + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101E3C(struct Task *task) +{ + asm("\ + push {r4, r5, lr}\n\ + ldr r0, ._77 @ unk_debug_bss_1_1\n\ + ldrb r1, [r0]\n\ + add r3, r0, #0\n\ + ldr r5, ._77 + 4 @ gMain\n\ + cmp r1, #0\n\ + beq ._76 @cond_branch\n\ + ldr r2, ._77 + 8 @ unk_debug_bss_1_4\n\ + ldrb r0, [r2]\n\ + cmp r0, #0\n\ + beq ._76 @cond_branch\n\ + ldr r4, ._77 + 12 @ \n\ + mov r1, #0xc\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0x3\n\ + ble ._74 @cond_branch\n\ + ldrh r1, [r5, #0x2c]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._75 @cond_branch\n\ +._74:\n\ + mov r0, #0x0\n\ + strb r0, [r2]\n\ + b ._76\n\ +._78:\n\ + .align 2, 0\n\ +._77:\n\ + .word unk_debug_bss_1_1\n\ + .word gMain\n\ + .word unk_debug_bss_1_4\n\ + .word +0x2000000\n\ +._75:\n\ + mov r0, #0x0\n\ + bl sub_8103D50\n\ + mov r0, #0x1\n\ + bl sub_8103D50\n\ + mov r0, #0x2\n\ + bl sub_8103D50\n\ + ldrh r0, [r4, #0xc]\n\ + sub r0, r0, #0x3\n\ + strh r0, [r4, #0xc]\n\ + mov r0, #0x3\n\ + strh r0, [r4, #0x12]\n\ + mov r0, #0x9\n\ + strb r0, [r4]\n\ + b ._102\n\ +._76:\n\ + ldrb r0, [r3]\n\ + cmp r0, #0\n\ + beq ._81 @cond_branch\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._81 @cond_branch\n\ + bl debug_sub_811B620\n\ + ldr r1, ._83 @ \n\ + mov r0, #0x1d\n\ + strb r0, [r1]\n\ + b ._102\n\ +._84:\n\ + .align 2, 0\n\ +._83:\n\ + .word +0x2000000\n\ +._81:\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._85 @cond_branch\n\ + mov r0, #0x0\n\ + bl sub_8104AB8\n\ + ldr r1, ._87 @ \n\ + mov r0, #0x8\n\ + strb r0, [r1]\n\ + b ._102\n\ +._88:\n\ + .align 2, 0\n\ +._87:\n\ + .word +0x2000000\n\ +._85:\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._89 @cond_branch\n\ + ldr r2, ._94 @ \n\ + mov r3, #0xc\n\ + ldsh r0, [r2, r3]\n\ + sub r0, r0, #0x3\n\ + mov r3, #0x12\n\ + ldsh r1, [r2, r3]\n\ + add r0, r0, r1\n\ + cmp r0, #0\n\ + blt ._90 @cond_branch\n\ + ldrh r4, [r2, #0x12]\n\ + add r0, r1, #0\n\ + cmp r0, #0x2\n\ + bgt ._91 @cond_branch\n\ +._92:\n\ + lsl r0, r4, #0x18\n\ + lsr r0, r0, #0x18\n\ + bl sub_8103D50\n\ + lsl r0, r4, #0x10\n\ + mov r2, #0x80\n\ + lsl r2, r2, #0x9\n\ + add r0, r0, r2\n\ + lsr r4, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x2\n\ + ble ._92 @cond_branch\n\ +._91:\n\ + ldr r1, ._94 @ \n\ + ldrh r0, [r1, #0xc]\n\ + sub r0, r0, #0x3\n\ + ldrh r3, [r1, #0x12]\n\ + add r0, r0, r3\n\ + strh r0, [r1, #0xc]\n\ + mov r0, #0x3\n\ + strh r0, [r1, #0x12]\n\ + mov r0, #0x9\n\ + strb r0, [r1]\n\ + mov r0, #0x5f\n\ + bl PlaySE\n\ + b ._102\n\ +._95:\n\ + .align 2, 0\n\ +._94:\n\ + .word +0x2000000\n\ +._90:\n\ + mov r0, #0x6\n\ + b ._96\n\ +._89:\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._98 @cond_branch\n\ + ldr r4, ._103 @ \n\ + mov r1, #0xc\n\ + ldsh r0, [r4, r1]\n\ + cmp r0, #0\n\ + beq ._98 @cond_branch\n\ + mov r0, #0x5f\n\ + bl PlaySE\n\ + ldrb r0, [r4, #0x12]\n\ + bl sub_8103D50\n\ + ldrh r0, [r4, #0xc]\n\ + sub r0, r0, #0x1\n\ + strh r0, [r4, #0xc]\n\ + ldrh r0, [r4, #0x12]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0x12]\n\ +._98:\n\ + ldr r0, ._103 @ \n\ + mov r2, #0x12\n\ + ldsh r1, [r0, r2]\n\ + add r2, r0, #0\n\ + ldr r5, ._103 + 4 @ \n\ + cmp r1, #0x2\n\ + bgt ._99 @cond_branch\n\ + cmp r1, #0\n\ + beq ._101 @cond_branch\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._101 @cond_branch\n\ +._99:\n\ + mov r0, #0x9\n\ + strb r0, [r2]\n\ +._101:\n\ + ldrh r1, [r5, #0x2e]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._102 @cond_branch\n\ + mov r0, #0x15\n\ +._96:\n\ + strb r0, [r2]\n\ +._102:\n\ + mov r0, #0x0\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1\n\ +._104:\n\ + .align 2, 0\n\ +._103:\n\ + .word +0x2000000\n\ + .word gMain"); +} +#else +static bool8 sub_8101E3C(struct Task *task) +{ + s16 i; + + if (gMain.newKeys & SELECT_BUTTON) + { + sub_8104AB8(0); + eSlotMachine->state = 8; + } + else if (gMain.newKeys & R_BUTTON) + { + if (eSlotMachine->coins - (3 - eSlotMachine->bet) >= 0) + { + for (i = eSlotMachine->bet; i < 3; i++) + { + sub_8103D50(i); + } + eSlotMachine->coins -= (3 - eSlotMachine->bet); + eSlotMachine->bet = 3; + eSlotMachine->state = 9; + PlaySE(SE_REGI); + } + else + { + eSlotMachine->state = 6; + } + } + else + { + if (gMain.newKeys & DPAD_DOWN && eSlotMachine->coins != 0) + { + PlaySE(SE_REGI); + sub_8103D50(eSlotMachine->bet); + eSlotMachine->coins--; + eSlotMachine->bet++; + } + if (eSlotMachine->bet >= 3 || (eSlotMachine->bet != 0 && gMain.newKeys & A_BUTTON)) + { + eSlotMachine->state = 9; + } + if (gMain.newKeys & B_BUTTON) + { + eSlotMachine->state = 21; + } + } + return FALSE; +} +#endif + +static void sub_8101F2C(const u8 *str) +{ + Menu_DisplayDialogueFrame(); + Menu_PrintText(str, 2, 15); +} + +static bool8 sub_8101F44(struct Task *task) +{ + sub_8101F2C(gOtherText_DontHaveThreeCoins); + eSlotMachine->state = 7; + return FALSE; +} + +static bool8 sub_8101F60(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_8101F88(struct Task *task) +{ + if (sub_8104AEC()) + { + eSlotMachine->state = 5; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8101FA4(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + add r4, r0, #0\n\ + bl sub_8102484\n\ + bl sub_8104DA4\n\ + mov r0, #0x0\n\ + bl sub_8102DEC\n\ + mov r0, #0x1\n\ + bl sub_8102DEC\n\ + mov r0, #0x2\n\ + bl sub_8102DEC\n\ + mov r0, #0x0\n\ + strh r0, [r4, #0x8]\n\ + ldr r4, ._115 @ \n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._113 @cond_branch\n\ + bl sub_810430C\n\ + mov r0, #0xa\n\ + b ._114\n\ +._116:\n\ + .align 2, 0\n\ +._115:\n\ + .word +0x2000000\n\ +._113:\n\ + mov r0, #0x1\n\ + bl sub_8104CAC\n\ + mov r0, #0xb\n\ +._114:\n\ + strb r0, [r4]\n\ + ldr r4, ._119 @ \n\ + mov r0, #0x8\n\ + strh r0, [r4, #0x1a]\n\ + ldrb r0, [r4, #0xa]\n\ + cmp r0, #0\n\ + beq ._117 @cond_branch\n\ + bl dp15_jump_random_unknown\n\ + strh r0, [r4, #0x1a]\n\ +._117:\n\ + ldr r0, ._119 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._118 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x68\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._118:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._120:\n\ + .align 2, 0\n\ +._119:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_1"); +} +#else +static bool8 sub_8101FA4(struct Task *task) +{ + sub_8102484(); + sub_8104DA4(); + sub_8102DEC(0); + sub_8102DEC(1); + sub_8102DEC(2); + task->data[0] = 0; + if (eSlotMachine->unk04 & 0x20) + { + sub_810430C(); + eSlotMachine->state = 10; + } + else + { + sub_8104CAC(1); + eSlotMachine->state = 11; + } + eSlotMachine->unk1A = 8; + if (eSlotMachine->unk0A) + { + eSlotMachine->unk1A = dp15_jump_random_unknown(); + } + return FALSE; +} +#endif + +static bool8 sub_8102008(struct Task *task) +{ + if (sub_810432C()) + { + sub_8104CAC(1); + eSlotMachine->unk04 &= 0xDF; + eSlotMachine->state = 11; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102034(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldrh r1, [r0, #0x8]\n\ + add r1, r1, #0x1\n\ + strh r1, [r0, #0x8]\n\ + lsl r1, r1, #0x10\n\ + asr r1, r1, #0x10\n\ + cmp r1, #0x1d\n\ + ble ._124 @cond_branch\n\ + ldr r0, ._127 @ unk_debug_bss_1_1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._126 @cond_branch\n\ + ldr r0, ._127 + 4 @ unk_debug_bss_1_4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._126 @cond_branch\n\ + ldr r4, ._127 + 8 @ unk_debug_bss_1_8\n\ + bl Random\n\ + mov r1, #0x1f\n\ + and r1, r1, r0\n\ + add r1, r1, #0x1\n\ + str r1, [r4]\n\ +._126:\n\ + bl sub_81024F0\n\ + ldr r1, ._127 + 12 @ \n\ + mov r0, #0xc\n\ + strb r0, [r1]\n\ +._124:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._128:\n\ + .align 2, 0\n\ +._127:\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word unk_debug_bss_1_8\n\ + .word +0x2000000"); +} +#else +static bool8 sub_8102034(struct Task *task) +{ + if (++task->data[0] >= 30) + { + sub_81024F0(); + eSlotMachine->state = 12; + } + return FALSE; +} +#endif + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102058(struct Task *task) +{ + asm("\ + push {r4, r5, lr}\n\ + ldr r0, ._133 @ unk_debug_bss_1_1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._130 @cond_branch\n\ + ldr r0, ._133 + 4 @ unk_debug_bss_1_4\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._130 @cond_branch\n\ + ldr r5, ._133 + 8 @ unk_debug_bss_1_8\n\ + ldr r0, [r5]\n\ + sub r0, r0, #0x1\n\ + str r0, [r5]\n\ + cmp r0, #0\n\ + bne ._135 @cond_branch\n\ + mov r0, #0x18\n\ + bl PlaySE\n\ + ldr r4, ._133 + 12 @ \n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E1C\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8103C14\n\ + bl Random\n\ + mov r1, #0x1f\n\ + and r1, r1, r0\n\ + add r1, r1, #0x1\n\ + str r1, [r5]\n\ + b ._132\n\ +._134:\n\ + .align 2, 0\n\ +._133:\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_4\n\ + .word unk_debug_bss_1_8\n\ + .word +0x2000000\n\ +._130:\n\ + ldr r0, ._136 @ gMain\n\ + ldrh r1, [r0, #0x2e]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._135 @cond_branch\n\ + mov r0, #0x18\n\ + bl PlaySE\n\ + ldr r4, ._136 + 4 @ \n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E1C\n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8103C14\n\ +._132:\n\ + mov r0, #0xd\n\ + strb r0, [r4]\n\ +._135:\n\ + mov r0, #0x0\n\ + pop {r4, r5}\n\ + pop {r1}\n\ + bx r1\n\ +._137:\n\ + .align 2, 0\n\ +._136:\n\ + .word gMain\n\ + .word +0x2000000"); +} +#else +static bool8 sub_8102058(struct Task *task) +{ + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_JYUNI); + sub_8102E1C(eSlotMachine->unk18); + sub_8103C14(eSlotMachine->unk18); + eSlotMachine->state = 13; + } + return FALSE; +} +#endif + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102090(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._146 @ \n\ + ldrb r0, [r4, #0x18]\n\ + bl sub_8102E40\n\ + lsl r0, r0, #0x18\n\ + lsr r2, r0, #0x18\n\ + cmp r2, #0\n\ + bne ._138 @cond_branch\n\ + ldrh r0, [r4, #0x18]\n\ + add r0, r0, #0x1\n\ + strh r0, [r4, #0x18]\n\ + mov r1, #0xc\n\ + strb r1, [r4]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + cmp r0, #0x2\n\ + ble ._161 @cond_branch\n\ + mov r0, #0xe\n\ + strb r0, [r4]\n\ + ldr r0, ._146 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0x8\n\ + beq ._140 @cond_branch\n\ + cmp r0, #0x8\n\ + bgt ._141 @cond_branch\n\ + cmp r0, #0x2\n\ + beq ._142 @cond_branch\n\ + cmp r0, #0x2\n\ + bgt ._143 @cond_branch\n\ + cmp r0, #0x1\n\ + beq ._144 @cond_branch\n\ + b ._161\n\ +._147:\n\ + .align 2, 0\n\ +._146:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_0\n\ +._143:\n\ + cmp r0, #0x4\n\ + beq ._148 @cond_branch\n\ + b ._161\n\ +._141:\n\ + cmp r0, #0x40\n\ + beq ._150 @cond_branch\n\ + cmp r0, #0x40\n\ + bgt ._151 @cond_branch\n\ + cmp r0, #0x10\n\ + beq ._152 @cond_branch\n\ + b ._161\n\ +._151:\n\ + cmp r0, #0x80\n\ + beq ._154 @cond_branch\n\ + b ._161\n\ +._142:\n\ + mov r0, #0x14\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x12\n\ + b ._160\n\ +._144:\n\ + mov r0, #0x14\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x12\n\ + b ._160\n\ +._148:\n\ + mov r0, #0x3\n\ + strh r0, [r4, #0x28]\n\ + mov r0, #0x1\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x2\n\ + b ._160\n\ +._140:\n\ + strh r2, [r4, #0x28]\n\ + mov r0, #0x2\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x3\n\ + b ._160\n\ +._152:\n\ + mov r0, #0x2\n\ + strh r0, [r4, #0x28]\n\ + mov r0, #0x5\n\ + strh r0, [r4, #0x2a]\n\ + mov r0, #0x14\n\ + b ._160\n\ +._150:\n\ + mov r0, #0x13\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ + strh r2, [r4, #0x2c]\n\ + b ._161\n\ +._154:\n\ + mov r0, #0x13\n\ + strh r0, [r4, #0x28]\n\ + strh r0, [r4, #0x2a]\n\ +._160:\n\ + strh r0, [r4, #0x2c]\n\ +._161:\n\ + mov r0, #0x1\n\ + b ._162\n\ +._138:\n\ + mov r0, #0x0\n\ +._162:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1"); +} +#else +static bool8 sub_8102090(struct Task *task) +{ + if (!sub_8102E40(eSlotMachine->unk18)) + { + eSlotMachine->unk18++; + eSlotMachine->state = 12; + if (eSlotMachine->unk18 > 2) + { + eSlotMachine->state = 14; + } + return TRUE; + } + return FALSE; +} +#endif + +#if DEBUG +__attribute__((naked)) +bool8 sub_81020C8(struct Task *task) +{ + asm("\ + push {r4, lr}\n\ + ldr r4, ._165 @ \n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0xc0\n\ + and r0, r0, r1\n\ + strb r0, [r4, #0x4]\n\ + bl CheckMatch\n\ + ldrb r0, [r4, #0xa]\n\ + cmp r0, #0\n\ + beq ._163 @cond_branch\n\ + sub r0, r0, #0x1\n\ + strb r0, [r4, #0xa]\n\ + ldrb r0, [r4, #0xb]\n\ + add r0, r0, #0x1\n\ + strb r0, [r4, #0xb]\n\ + b ._164\n\ +._166:\n\ + .align 2, 0\n\ +._165:\n\ + .word +0x2000000\n\ +._163:\n\ + bl debug_sub_811B894\n\ +._164:\n\ + ldr r4, ._171 @ \n\ + ldrh r0, [r4, #0x8]\n\ + cmp r0, #0\n\ + beq ._167 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x6c\n\ + mov r2, #0xe\n\ + ldsh r1, [r4, r2]\n\ + bl debug_sub_811B5B4\n\ + mov r0, #0xf\n\ + strb r0, [r4]\n\ + bl sub_8102A24\n\ + bl sub_8103F70\n\ + ldrh r0, [r4, #0x10]\n\ + ldrh r1, [r4, #0xe]\n\ + sub r0, r0, r1\n\ + strh r0, [r4, #0x10]\n\ + lsl r0, r0, #0x10\n\ + cmp r0, #0\n\ + bge ._168 @cond_branch\n\ + mov r0, #0x0\n\ + strh r0, [r4, #0x10]\n\ +._168:\n\ + ldrh r1, [r4, #0x8]\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._169 @cond_branch\n\ + ldr r0, ._171 + 4 @ \n\ + bl PlayFanfare\n\ + mov r0, #0x6\n\ + bl sub_8104CAC\n\ + b ._174\n\ +._172:\n\ + .align 2, 0\n\ +._171:\n\ + .word +0x2000000\n\ + .word 0x185\n\ +._169:\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._173 @cond_branch\n\ + ldr r0, ._175 @ 0x185\n\ + bl PlayFanfare\n\ + mov r0, #0x5\n\ + bl sub_8104CAC\n\ + b ._174\n\ +._176:\n\ + .align 2, 0\n\ +._175:\n\ + .word 0x185\n\ +._173:\n\ + mov r0, #0xc3\n\ + lsl r0, r0, #0x1\n\ + bl PlayFanfare\n\ + mov r0, #0x2\n\ + bl sub_8104CAC\n\ +._174:\n\ + ldr r1, ._183 @ \n\ + ldrh r3, [r1, #0x8]\n\ + mov r0, #0xe0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + add r2, r1, #0\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + ldrb r1, [r2, #0x4]\n\ + mov r0, #0x3f\n\ + and r0, r0, r1\n\ + mov r1, #0x0\n\ + strb r0, [r2, #0x4]\n\ + mov r0, #0xc0\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + strb r1, [r2, #0xa]\n\ + strb r1, [r2, #0xb]\n\ + strb r1, [r2, #0x3]\n\ + mov r0, #0x80\n\ + lsl r0, r0, #0x1\n\ + and r0, r0, r3\n\ + cmp r0, #0\n\ + beq ._179 @cond_branch\n\ + mov r0, #0x1\n\ + strb r0, [r2, #0x3]\n\ +._179:\n\ + ldrh r1, [r2, #0x8]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._185 @cond_branch\n\ + ldrb r0, [r2, #0x2]\n\ + cmp r0, #0xf\n\ + bhi ._185 @cond_branch\n\ + add r0, r0, #0x1\n\ + strb r0, [r2, #0x2]\n\ + ldrb r0, [r2, #0x2]\n\ + bl sub_8104064\n\ + b ._185\n\ +._184:\n\ + .align 2, 0\n\ +._183:\n\ + .word +0x2000000\n\ +._167:\n\ + mov r0, #0x3\n\ + bl sub_8104CAC\n\ + mov r0, #0x14\n\ + strb r0, [r4]\n\ + ldrh r0, [r4, #0x12]\n\ + ldrh r1, [r4, #0x10]\n\ + add r0, r0, r1\n\ + strh r0, [r4, #0x10]\n\ + lsl r0, r0, #0x10\n\ + asr r0, r0, #0x10\n\ + ldr r1, ._186 @ 0x270f\n\ + cmp r0, r1\n\ + ble ._185 @cond_branch\n\ + strh r1, [r4, #0x10]\n\ +._185:\n\ + mov r0, #0x0\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ +._187:\n\ + .align 2, 0\n\ +._186:\n\ + .word 0x270f"); +} +#else +bool8 sub_81020C8(struct Task *task) +{ + eSlotMachine->unk04 &= 0xc0; + CheckMatch(); + if (eSlotMachine->unk0A) + { + eSlotMachine->unk0A--; + eSlotMachine->unk0B++; + } + if (eSlotMachine->matchedSymbols) + { + eSlotMachine->state = 15; + sub_8102A24(); + sub_8103F70(); + if ((eSlotMachine->unk10 -= eSlotMachine->payout) < 0) + { + eSlotMachine->unk10 = 0; + } + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + PlayFanfare(BGM_ME_B_BIG); + sub_8104CAC(6); + } + else if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_MIXED)) + { + PlayFanfare(BGM_ME_B_BIG); + sub_8104CAC(5); + } + else + { + PlayFanfare(BGM_ME_B_SMALL); + sub_8104CAC(2); + } + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_MIXED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + eSlotMachine->unk04 &= 0x3f; + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_BLUE) | (1 << SLOT_MACHINE_MATCHED_777_RED))) + { + eSlotMachine->unk0A = 0; + eSlotMachine->unk0B = 0; + eSlotMachine->unk03 = 0; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_777_BLUE)) + { + eSlotMachine->unk03 = 1; + } + } + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER) && eSlotMachine->pikaPower < 16) + { + eSlotMachine->pikaPower++; + sub_8104064(eSlotMachine->pikaPower); + } + } + else + { + sub_8104CAC(3); + eSlotMachine->state = 20; + if ((eSlotMachine->unk10 += eSlotMachine->bet) > 9999) + { + eSlotMachine->unk10 = 9999; + } + } + return FALSE; +} +#endif + +static bool8 sub_81021E0(struct Task *task) +{ + if (sub_8102A44()) + { + eSlotMachine->state = 16; + } + return FALSE; +} + +static bool8 sub_81021FC(struct Task *task) +{ + if (sub_8103FA0()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & ((1 << SLOT_MACHINE_MATCHED_777_RED) | (1 << SLOT_MACHINE_MATCHED_777_BLUE))) + { + IncrementGameStat(GAME_STAT_SLOT_JACKPOTS); + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->unk18 = 0; + eSlotMachine->state = 9; + } + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_POWER)) + { + eSlotMachine->state = 17; + } + if (eSlotMachine->unk0A && eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + sub_8104CAC(4); + eSlotMachine->state = 18; + } + } + return FALSE; +} + +static bool8 sub_8102264(struct Task *task) +{ + if (!sub_81040C8()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->state = 9; + if (eSlotMachine->unk0A) + { + sub_8104CAC(4); + eSlotMachine->state = 18; + } + } + } + return FALSE; +} + +static bool8 sub_81022A0(struct Task *task) +{ + if (sub_8104E18()) + { + eSlotMachine->state = 19; + if (eSlotMachine->matchedSymbols & (1 << SLOT_MACHINE_MATCHED_REPLAY)) + { + eSlotMachine->state = 9; + } + } + return FALSE; +} + +static bool8 sub_81022CC(struct Task *task) +{ + sub_8103D8C(0); + sub_8103D8C(1); + sub_8103D8C(2); + eSlotMachine->state = 2; + return FALSE; +} + +static bool8 sub_81022F0(struct Task *task) +{ + if (++task->data[1] > 64) + { + task->data[1] = 0; + eSlotMachine->state = 19; + } + return FALSE; +} + +static bool8 sub_8102318(struct Task *task) +{ + sub_8101F2C(gOtherText_QuitGamePrompt); + DisplayYesNoMenu(21, 7, 1); + sub_814AB84(); + eSlotMachine->state = 22; + return FALSE; +} + +static bool8 sub_8102344(struct Task *task) +{ + s8 input = Menu_ProcessInputNoWrap_(); + if (input == 0) + { + Menu_EraseScreen(); + sub_8103D8C(0); + sub_8103D8C(1); + sub_8103D8C(2); + eSlotMachine->coins += eSlotMachine->bet; + eSlotMachine->state = 27; + } + else if (input == 1 || input == -1) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_810239C(struct Task *task) +{ + sub_8101F2C(gOtherText_MaxCoins); + eSlotMachine->state = 24; + return FALSE; +} + +static bool8 sub_81023B8(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 5; + } + return FALSE; +} + +static bool8 sub_81023E0(struct Task *task) +{ + sub_8101F2C(gOtherText_OutOfCoins); + eSlotMachine->state = 26; + return FALSE; +} + +static bool8 sub_81023FC(struct Task *task) +{ + if (gMain.newKeys & (A_BUTTON | B_BUTTON)) + { + Menu_EraseScreen(); + eSlotMachine->state = 27; + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 sub_8102424(struct Task *task) +{ + asm("\ + push {lr}\n\ + add sp, sp, #0xfffffffc\n\ + ldr r0, ._234 @ unk_debug_bss_1_1\n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + bne ._233 @cond_branch\n\ + ldr r0, ._234 + 4 @ gSaveBlock1\n\ + ldr r1, ._234 + 8 @ \n\ + ldrh r1, [r1, #0xc]\n\ + ldr r2, ._234 + 12 @ \n\ + add r0, r0, r2\n\ + strh r1, [r0]\n\ +._233:\n\ + mov r0, #0x1\n\ + neg r0, r0\n\ + mov r1, #0x0\n\ + str r1, [sp]\n\ + mov r2, #0x0\n\ + mov r3, #0x10\n\ + bl BeginNormalPaletteFade\n\ + ldr r1, ._234 + 8 @ \n\ + ldrb r0, [r1]\n\ + add r0, r0, #0x1\n\ + strb r0, [r1]\n\ + mov r0, #0x0\n\ + add sp, sp, #0x4\n\ + pop {r1}\n\ + bx r1\n\ +._235:\n\ + .align 2, 0\n\ +._234:\n\ + .word unk_debug_bss_1_1\n\ + .word gSaveBlock1\n\ + .word +0x2000000\n\ + .word 0x494"); +} +#else +static bool8 sub_8102424(struct Task *task) +{ + gSaveBlock1.coins = eSlotMachine->coins; + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + eSlotMachine->state++; + return FALSE; +} +#endif + +static bool8 sub_8102460(struct Task *task) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(eSlotMachine->prevMainCb); + } + return FALSE; +} + +#if DEBUG +__attribute__((naked)) +static bool8 debug_sub_8116E74(struct Task *task) +{ + asm("\ + push {lr}\n\ + bl debug_sub_811B634\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._239 @cond_branch\n\ + ldr r1, ._240 @ \n\ + mov r0, #0x5\n\ + strb r0, [r1]\n\ +._239:\n\ + mov r0, #0x0\n\ + pop {r1}\n\ + bx r1\n\ +._241:\n\ + .align 2, 0\n\ +._240:\n\ + .word +0x2000000"); +} +#endif + +#if DEBUG +__attribute__((naked)) +static void sub_8102484(void) +{ + asm("\ + push {r4, r5, r6, lr}\n\ + ldr r0, ._256 @ \n\ + ldrb r2, [r0, #0xa]\n\ + add r4, r0, #0\n\ + cmp r2, #0\n\ + beq ._242 @cond_branch\n\ + b ._270\n\ +._242:\n\ + ldr r0, ._256 + 4 @ \n\ + ldrb r0, [r0]\n\ + cmp r0, #0\n\ + beq ._245 @cond_branch\n\ + ldr r3, ._256 + 8 @ \n\ + ldrb r0, [r3]\n\ + cmp r0, #0\n\ + beq ._245 @cond_branch\n\ + ldr r0, ._256 + 12 @ \n\ + ldrb r1, [r0]\n\ + strb r1, [r4, #0x4]\n\ + strb r2, [r3]\n\ + strb r2, [r0]\n\ + mov r0, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._246 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x88\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._246:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._247 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x84\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._247:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._248 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x8c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._248:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._249 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x80\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._249:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._250 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._250:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._251 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x78\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._251:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._252 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x74\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._252:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._253 @cond_branch\n\ + b ._270\n\ +._253:\n\ + add r0, r4, #0\n\ + add r0, r0, #0x70\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ + b ._270\n\ +._257:\n\ + .align 2, 0\n\ +._256:\n\ + .word +0x2000000\n\ + .word unk_debug_bss_1_1\n\ + .word unk_debug_bss_1_2\n\ + .word unk_debug_bss_1_3\n\ +._245:\n\ + add r5, r4, #0\n\ + ldrb r1, [r5, #0x4]\n\ + mov r0, #0xc0\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + bne ._270 @cond_branch\n\ + bl sub_8102540\n\ + lsl r0, r0, #0x18\n\ + cmp r0, #0\n\ + beq ._260 @cond_branch\n\ + bl sub_8102578\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + cmp r6, #0x3\n\ + beq ._260 @cond_branch\n\ + ldr r1, ._271 @ gUnknown_083ECE42\n\ + lsl r0, r6, #0x1\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + ldrb r0, [r5, #0x4]\n\ + orr r0, r0, r1\n\ + strb r0, [r5, #0x4]\n\ + mov r1, #0x80\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._261 @cond_branch\n\ + add r0, r5, #0\n\ + add r0, r0, #0x88\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._261:\n\ + ldrb r1, [r5, #0x4]\n\ + mov r0, #0x40\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._262 @cond_branch\n\ + add r0, r5, #0\n\ + add r0, r0, #0x84\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._262:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x20\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._263 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x8c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._263:\n\ + cmp r6, #0x1\n\ + bne ._270 @cond_branch\n\ +._260:\n\ + bl sub_81025BC\n\ + lsl r0, r0, #0x18\n\ + lsr r6, r0, #0x18\n\ + cmp r6, #0x5\n\ + beq ._270 @cond_branch\n\ + ldr r4, ._271 + 4 @ \n\ + ldr r1, ._271 + 8 @ \n\ + lsl r0, r6, #0x1\n\ + add r0, r0, r1\n\ + ldrb r1, [r0]\n\ + ldrb r0, [r4, #0x4]\n\ + orr r0, r0, r1\n\ + strb r0, [r4, #0x4]\n\ + mov r1, #0x10\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._266 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x80\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._266:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x8\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._267 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x7c\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._267:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x4\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._268 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x78\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._268:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x1\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._269 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x74\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._269:\n\ + ldrb r1, [r4, #0x4]\n\ + mov r0, #0x2\n\ + and r0, r0, r1\n\ + cmp r0, #0\n\ + beq ._270 @cond_branch\n\ + add r0, r4, #0\n\ + add r0, r0, #0x70\n\ + mov r1, #0x1\n\ + bl debug_sub_811B5B4\n\ +._270:\n\ + pop {r4, r5, r6}\n\ + pop {r0}\n\ + bx r0\n\ +._272:\n\ + .align 2, 0\n\ +._271:\n\ + .word gUnknown_083ECE42\n\ + .word +0x2000000\n\ + .word gUnknown_083ECE48"); +} +#else +static void sub_8102484(void) +{ + u8 r3; + + if (eSlotMachine->unk0A == 0 && !(eSlotMachine->unk04 & 0xc0)) + { + if (sub_8102540()) + { + r3 = sub_8102578(); + if (r3 != 3) + { + eSlotMachine->unk04 |= gUnknown_083ECE42[r3]; + if (r3 != 1) + { + return; + } + } + } + r3 = sub_81025BC(); + if (r3 != 5) + { + eSlotMachine->unk04 |= gUnknown_083ECE48[r3]; + } + } +} +#endif + +static void sub_81024F0(void) +{ + eSlotMachine->unk06 = 0; + if (eSlotMachine->unk04) + { + eSlotMachine->unk06 = 1; + } +} + +static u8 sub_810250C(u8 a0) +{ + u8 i; + + for (i = 0; i < 8; i++) + { + if (a0 & 1) + { + return gUnknown_083ECE3A[i]; + } + a0 >>= 1; + } + return 0; +} + +static bool8 sub_8102540(void) +{ + u8 rval = Random(); + if (gUnknown_083ECD04[eSlotMachine->unk01][eSlotMachine->bet - 1] > rval) + { + return TRUE; + } + return FALSE; +} + +static const u8 gUnknown_083ECD16[][6]; + +static u8 sub_8102578(void) +{ + s16 i; + + for (i = 0; i < 3; i++) + { + s16 rval = Random() & 0xff; + s16 value = gUnknown_083ECD16[i][eSlotMachine->unk01]; + if (value > rval) + { + break; + } + } + return i; +} + +static const u8 gUnknown_083ECD28[][6]; + +static u8 sub_81025BC(void) +{ + s16 i; + + for (i = 0; i < 5; i++) + { + s16 rval = Random() & 0xff; + s16 r3 = gUnknown_083ECD28[i][eSlotMachine->unk01]; + if (i == 0 && eSlotMachine->unk03 == 1) + { + r3 += 10; + if (r3 > 0x100) + { + r3 = 0x100; + } + } + else if (i == 4 && eSlotMachine->unk03 == 1) + { + r3 -= 10; + if (r3 < 0) + { + r3 = 0; + } + } + if (r3 > rval) + { + break; + } + } + return i; +} + +static const u8 gUnknown_083ECD46[][17]; +static const u8 gUnknown_083ECDAC[][17]; + +static u8 sub_810264C(u8 a0) +{ + if (eSlotMachine->unk03 == 0) + { + return gUnknown_083ECD46[a0][eSlotMachine->pikaPower]; + } + return gUnknown_083ECDAC[a0][eSlotMachine->pikaPower]; +} + +static void sub_8102680(void) +{ + u8 rval; + s16 i; + + eSlotMachine->unk05 = 0; + rval = Random(); + if (rval < sub_810264C(0)) + { + return; + } + for (i = 5; i > 0; i--) + { + rval = Random(); + if (rval < sub_810264C(i)) + { + break; + } + } + eSlotMachine->unk05 = i; +} + +static const u16 gUnknown_083ECE12[]; + +static bool8 sub_81026DC(u16 a0) +{ + u16 rval = Random() & 0xff; + if (rval < gUnknown_083ECE12[a0]) + { + return TRUE; + } + return FALSE; +} + +static const u16 gUnknown_083ECE1C[][2]; +static const u16 gUnknown_083ECE30[]; + +static u16 dp15_jump_random_unknown(void) +{ + u8 r4 = 0; + u8 rval; + u8 value; + if (eSlotMachine->unk10 >= 300) + { + r4 = 4; + } + else if (eSlotMachine->unk10 >= 250) + { + r4 = 3; + } + else if (eSlotMachine->unk10 >= 200) + { + r4 = 2; + } + else if (eSlotMachine->unk10 >= 150) + { + r4 = 1; + } + rval = Random() % 100; + value = gUnknown_083ECE1C[r4][0]; + if (rval < value) + { + return 4; + } + rval = Random() % 100; + value = gUnknown_083ECE1C[r4][1] + gUnknown_083ECE30[eSlotMachine->unk0B]; + if (rval < value) + { + return 2; + } + return 8; +} + +static void CheckMatch(void) +{ + eSlotMachine->matchedSymbols = 0; + CheckMatch_CenterRow(); + if (eSlotMachine->bet > 1) + { + CheckMatch_TopAndBottom(); + } + if (eSlotMachine->bet > 2) + { + CheckMatch_Diagonals(); + } +} + +static const u16 sSlotMatchFlags[]; +static const u16 sSlotPayouts[]; + +static void CheckMatch_CenterRow(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 2); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 2); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(0); + } +} + +static void CheckMatch_TopAndBottom(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 1); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match == SLOT_MACHINE_MATCHED_1CHERRY) + { + match = SLOT_MACHINE_MATCHED_2CHERRY; + } + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(1); + } + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 3); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match == SLOT_MACHINE_MATCHED_1CHERRY) + { + match = SLOT_MACHINE_MATCHED_2CHERRY; + } + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + sub_8103E04(2); + } +} + +static void CheckMatch_Diagonals(void) +{ + u8 c1, c2, c3, match; + + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 1); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 3); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match != SLOT_MACHINE_MATCHED_1CHERRY) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + } + sub_8103E04(3); + } + c1 = GetTagOfReelSymbolOnScreenAtPos(0, 3); + c2 = GetTagOfReelSymbolOnScreenAtPos(1, 2); + c3 = GetTagOfReelSymbolOnScreenAtPos(2, 1); + match = GetMatchFromSymbolsInRow(c1, c2, c3); + if (match != SLOT_MACHINE_MATCHED_NONE) + { + if (match != SLOT_MACHINE_MATCHED_1CHERRY) + { + eSlotMachine->payout += sSlotPayouts[match]; + eSlotMachine->matchedSymbols |= sSlotMatchFlags[match]; + } + sub_8103E04(4); + } +} + +static const u8 sSym2Match[]; + +static u8 GetMatchFromSymbolsInRow(u8 c1, u8 c2, u8 c3) +{ + if (c1 == c2 && c1 == c3) + { + return sSym2Match[c1]; + } + if (c1 == SLOT_MACHINE_TAG_7_RED && c2 == SLOT_MACHINE_TAG_7_RED && c3 == SLOT_MACHINE_TAG_7_BLUE) + { + return SLOT_MACHINE_MATCHED_777_MIXED; + } + if (c1 == SLOT_MACHINE_TAG_7_BLUE && c2 == SLOT_MACHINE_TAG_7_BLUE && c3 == SLOT_MACHINE_TAG_7_RED) + { + return SLOT_MACHINE_MATCHED_777_MIXED; + } + if (c1 == SLOT_MACHINE_TAG_CHERRY) + { + return SLOT_MACHINE_MATCHED_1CHERRY; + } + return SLOT_MACHINE_MATCHED_NONE; +} + +static void sub_8102A24(void) +{ + sub_8102A64(CreateTask(sub_8102A64, 4)); +} + +static bool8 sub_8102A44(void) +{ + if (FindTaskIdByFunc(sub_8102A64) == 0xff) + { + return TRUE; + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB20[])(struct Task *task) = { + sub_8102A9C, + sub_8102AD0, + sub_8102B80 +}; + +static void sub_8102A64(u8 taskId) +{ + while (gUnknown_083ECB20[gTasks[taskId].data[0]](gTasks + taskId)); +} + +static bool8 sub_8102A9C(struct Task *task) +{ + if (sub_8103E38()) + { + task->data[0]++; + if (eSlotMachine->payout == 0) + { + task->data[0] = 2; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_8102AD0(struct Task *task) +{ + if (!task->data[1]--) + { + if (IsFanfareTaskInactive()) + { + PlaySE(SE_PIN); + } + eSlotMachine->payout--; + if (eSlotMachine->coins < 9999) + { + eSlotMachine->coins++; + } + task->data[1] = 8; + if (gMain.heldKeys & A_BUTTON) + { + task->data[1] = 4; + } + } + if (IsFanfareTaskInactive() && gMain.newKeys & START_BUTTON) + { + PlaySE(SE_PIN); + eSlotMachine->coins += eSlotMachine->payout; + if (eSlotMachine->coins > 9999) + { + eSlotMachine->coins = 9999; + } + eSlotMachine->payout = 0; + } + if (eSlotMachine->payout == 0) + { + task->data[0]++; + } + return FALSE; +} + +static bool8 sub_8102B80(struct Task *task) +{ + if (sub_8103E7C()) + { + DestroyTask(FindTaskIdByFunc(sub_8102A64)); + } + return FALSE; +} + +static const u8 sReelSymbols[][21]; + +static u8 GetTagOfReelSymbolOnScreenAtPos(u8 x, s16 y) +{ + s16 offset = (eSlotMachine->reelPositions[x] + y) % 21; + if (offset < 0) + { + offset += 21; + } + return sReelSymbols[x][offset]; +} + +static u8 GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(u8 x, s16 y) +{ + s16 r6 = 0; + if ((eSlotMachine->unk1C[x]) % 24) + r6 = -1; + return GetTagOfReelSymbolOnScreenAtPos(x, y + r6); +} + +static const u8 gUnknown_083ECCF1[]; + +static u8 sub_8102C48(s16 a0) +{ + s16 r1 = (eSlotMachine->unk16 + a0) % 6; + if (r1 < 0) + r1 += 6; + return gUnknown_083ECCF1[r1]; +} + +static void sub_8102C84(u8 a0, s16 a1) +{ + eSlotMachine->unk1C[a0] += a1; + eSlotMachine->unk1C[a0] %= 504; + eSlotMachine->reelPositions[a0] = 21 - eSlotMachine->unk1C[a0] / 24; +} + +static s16 sub_8102CCC(u8 a0, s16 a1) +{ + s16 r1 = eSlotMachine->unk1C[a0] % 24; + if (r1 != 0) + { + if (r1 < a1) + a1 = r1; + sub_8102C84(a0, a1); + r1 = eSlotMachine->unk1C[a0] % 24; + } + return r1; +} + +static void sub_8102D28(s16 a0) +{ + eSlotMachine->unk14 += a0; + eSlotMachine->unk14 %= 120; + eSlotMachine->unk16 = 6 - eSlotMachine->unk14 / 20; +} + +static s16 sub_8102D5C(s16 a0) +{ + s16 r1 = eSlotMachine->unk14 % 20; + if (r1 != 0) + { + if (r1 < a0) + a0 = r1; + sub_8102D28(a0); + r1 = eSlotMachine->unk14 % 20; + } + return r1; +} + +static void sub_8102DA8(void) +{ + u8 i; + for (i = 0; i < 3; i++) + { + u8 taskId = CreateTask(sub_8102E68, 2); + gTasks[taskId].data[15] = i; + eSlotMachine->reelTasks[i] = taskId; + sub_8102E68(taskId); + } +} + +static void sub_8102DEC(u8 a0) +{ + gTasks[eSlotMachine->reelTasks[a0]].data[0] = 1; + gTasks[eSlotMachine->reelTasks[a0]].data[14] = 1; +} + +static void sub_8102E1C(u8 a0) +{ + gTasks[eSlotMachine->reelTasks[a0]].data[0] = 2; +} + +static bool8 sub_8102E40(u8 a0) +{ + return gTasks[eSlotMachine->reelTasks[a0]].data[14]; +} + +static bool8 (*const gUnknown_083ECB2C[])(struct Task *task) = { + sub_8102EA0, + sub_8102EA4, + sub_8102EC0, + sub_8102F4C, + sub_8103008 +}; + +static void sub_8102E68(u8 taskId) +{ + while (gUnknown_083ECB2C[gTasks[taskId].data[0]](gTasks + taskId)); +} + +static bool8 sub_8102EA0(struct Task *task) +{ + return FALSE; +} + +static bool8 sub_8102EA4(struct Task *task) +{ + sub_8102C84(task->data[15], eSlotMachine->unk1A); + return FALSE; +} + +static bool8 (*const gUnknown_083ECB40[])(void) = { + sub_810305C, + sub_81032C0, + sub_81033DC +}; +static void (*const gUnknown_083ECB4C[])(void) = { + sub_81034F4, + sub_8103540, + sub_810380C +}; + +static bool8 sub_8102EC0(struct Task *task) +{ + task->data[0]++; + eSlotMachine->unk34[task->data[15]] = 0; + eSlotMachine->unk2E[task->data[15]] = 0; + if (eSlotMachine->unk0A == 0 && (eSlotMachine->unk04 == 0 || eSlotMachine->unk06 == 0 || !gUnknown_083ECB40[task->data[15]]())) + { + eSlotMachine->unk06 = 0; + gUnknown_083ECB4C[task->data[15]](); + } + task->data[1] = eSlotMachine->unk2E[task->data[15]]; + return TRUE; +} + +static bool8 sub_8102F4C(struct Task *task) +{ + u16 sp[] = {2, 4, 4, 4, 8}; + s16 r2 = eSlotMachine->unk1C[task->data[15]] % 24; + if (r2 != 0) + { + r2 = sub_8102CCC(task->data[15], eSlotMachine->unk1A); + } + else if (eSlotMachine->unk2E[task->data[15]]) + { + eSlotMachine->unk2E[task->data[15]]--; + sub_8102C84(task->data[15], eSlotMachine->unk1A); + r2 = eSlotMachine->unk1C[task->data[15]] % 24; + } + if (r2 == 0 && eSlotMachine->unk2E[task->data[15]] == 0) + { + task->data[0]++; + task->data[1] = sp[task->data[1]]; + task->data[2] = 0; + } + return FALSE; +} + +static bool8 sub_8103008(struct Task *task) +{ + eSlotMachine->unk22[task->data[15]] = task->data[1]; + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 0x3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0] = 0; + task->data[14] = 0; + eSlotMachine->unk22[task->data[15]] = 0; + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB64[])(u8 a0, u8 a1) = { + sub_8103154, + sub_81031B4, + sub_81031B4 +}; + +static bool8 sub_810305C(void) +{ + u8 r3 = sub_810250C(eSlotMachine->unk04); + u8 r5 = r3; + if (eSlotMachine->unk04 & 0xc0) + { + r5 = 0; + r3 = 1; + } + return gUnknown_083ECB64[eSlotMachine->bet - 1](r5, r3); +} + +static bool8 sub_81030A4(s16 y, u8 tag1, u8 tag2) +{ + u8 tag = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, y); + if (tag == tag1 || tag == tag2) + { + eSlotMachine->unk07 = tag; + return TRUE; + } + return FALSE; +} + +static bool8 sub_81030E0(s16 y) +{ + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - y) == 4 || GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - y) == 4) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_8103134(void) +{ + if (eSlotMachine->unk04 & 0xc2) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_8103154(u8 a0, u8 a1) +{ + s16 i; + + for (i = 0; i < 5; i++) + { + if (sub_81030A4(2 - i, a0, a1)) + { + eSlotMachine->unk34[0] = 2; + eSlotMachine->unk2E[0] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_81031B4(u8 tag1, u8 tag2) +{ + s16 i; + bool8 r6 = sub_8103134(); + if (r6 || !sub_81030E0(0)) + { + for (i = 1; i < 4; i++) + { + if (sub_81030A4(i, tag1, tag2)) + { + eSlotMachine->unk34[0] = i; + eSlotMachine->unk2E[0] = 0; + return TRUE; + } + } + } + for (i = 1; i < 5; i++) + { + bool8 r7 = r6; + if (r7 || !sub_81030E0(i)) + { + if (sub_81030A4(1 - i, tag1, tag2)) + { + if (i == 1 && (r7 || !sub_81030E0(3))) + { + eSlotMachine->unk34[0] = 3; + eSlotMachine->unk2E[0] = 3; + return TRUE; + } + if (i < 4 && (r7 || !sub_81030E0(i + 1))) + { + eSlotMachine->unk34[0] = 2; + eSlotMachine->unk2E[0] = i + 1; + return TRUE; + } + eSlotMachine->unk34[0] = 1; + eSlotMachine->unk2E[0] = i; + return TRUE; + } + } + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB70[])(void) = { + sub_81032E8, + sub_81032E8, + sub_810333C +}; + +static bool8 sub_81032C0(void) +{ + return gUnknown_083ECB70[eSlotMachine->bet - 1](); +} + +static bool8 sub_81032E8(void) +{ + s16 i; + s16 unk34_0 = eSlotMachine->unk34[0]; + + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, unk34_0 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = unk34_0; + eSlotMachine->unk2E[1] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_810333C(void) +{ + s16 i; + if (sub_81032E8()) + { + if (eSlotMachine->unk34[0] != 2 && eSlotMachine->unk2E[1] > 1 && eSlotMachine->unk2E[1] != 4) + { + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + return TRUE; + } + if (eSlotMachine->unk34[0] != 2) + { + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i) == eSlotMachine->unk07) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + return TRUE; + } + } + } + return FALSE; +} + +static bool8 (*const gUnknown_083ECB7C[])(u8 a0) = { + sub_810341C, + sub_810341C, + sub_810347C +}; + +static bool8 sub_81033DC(void) +{ + u8 r3 = eSlotMachine->unk07; + if (eSlotMachine->unk04 & 0x40) + { + r3 = 0; + if (eSlotMachine->unk07 == 0) + { + r3 = 1; + } + } + return gUnknown_083ECB7C[eSlotMachine->bet - 1](r3); +} + +static bool8 sub_810341C(u8 a0) +{ + s16 i; + s16 unk34_1 = eSlotMachine->unk34[1]; + + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, unk34_1 - i) == a0) + { + eSlotMachine->unk34[2] = unk34_1; + eSlotMachine->unk2E[2] = i; + return TRUE; + } + } + return FALSE; +} + +static bool8 sub_810347C(u8 a0) +{ + s16 i; + s16 r8; + if (eSlotMachine->unk34[0] == eSlotMachine->unk34[1]) + { + return sub_810341C(a0); + } + r8 = 1; + if (eSlotMachine->unk34[0] == 1) + { + r8 = 3; + } + for (i = 0; i < 5; i++) + { + if (GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - i) == a0) + { + eSlotMachine->unk2E[2] = i; + eSlotMachine->unk34[2] = r8; + return TRUE; + } + } + return FALSE; +} + +static void sub_81034F4(void) +{ + s16 i; + for (i = 0; sub_81030E0(i); i++); + eSlotMachine->unk2E[0] = i; +} + +static bool8 sub_8103520(u8 *a0) +{ + if (*a0 == 0) + { + *a0 = 1; + return TRUE; + } + if (*a0 == 1) + { + *a0 = 0; + return TRUE; + } + return FALSE; +} + +static void (*const gUnknown_083ECB88[])(void) = { + sub_8103564, + j5_08111E84, + sub_8103668 +}; + +static void sub_8103540(void) +{ + gUnknown_083ECB88[eSlotMachine->bet - 1](); +} + +static void sub_8103564(void) +{ + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + s16 i; + for (i = 0; i < 5; i++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - i)) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + } +} + +static void j5_08111E84(void) +{ + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + s16 i; + for (i = 0; i < 5; i++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - i)) + { + eSlotMachine->unk34[1] = eSlotMachine->unk34[0]; + eSlotMachine->unk2E[1] = i; + break; + } + } + } + } +} + +static void sub_8103668(void) +{ + s16 i; + s16 j; + if (eSlotMachine->unk34[0] != 0 && eSlotMachine->unk04 & 0x80) + { + if (eSlotMachine->unk34[0] == 2) + { + j5_08111E84(); + } + else + { + u8 sp0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + if (sub_8103520(&sp0)) + { + j = 2; + if (eSlotMachine->unk34[0] == 3) + j = 3; + for (i = 0; i < 2; i++, j--) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, j)) + { + eSlotMachine->unk34[1] = j; + eSlotMachine->unk2E[1] = 0; + return; + } + } + for (j = 1; j < 5; j++) + { + if (sp0 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[0] - j)) + { + if (eSlotMachine->unk34[0] == 1) + { + if (j < 3) + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = j + 1; + } + else + { + eSlotMachine->unk34[1] = 1; + eSlotMachine->unk2E[1] = j; + } + } + else + { + if (j < 3) + { + eSlotMachine->unk34[1] = 3; + eSlotMachine->unk2E[1] = j; + } + else + { + eSlotMachine->unk34[1] = 2; + eSlotMachine->unk2E[1] = j - 1; + } + } + return; + } + } + } + } + } +} + +static bool8 sub_8103764(u8 a0, u8 a1) +{ + if ((a0 == 0 && a1 == 1) || (a0 == 1 && a1 == 0)) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_810378C(u8 a0, u8 a1, u8 a2) +{ + if ((a0 == 0 && a1 == 1 && a2 == 0) || (a0 == 1 && a1 == 0 && a2 == 1)) + { + return TRUE; + } + return FALSE; +} + +static bool8 sub_81037BC(u8 a0, u8 a1, u8 a2) +{ + if ((a0 == 0 && a1 == 1 && a2 == 0) || + (a0 == 1 && a1 == 0 && a2 == 1) || + (a0 == 0 && a1 == 0 && a2 == 1) || + (a0 == 1 && a1 == 1 && a2 == 0) || + (a0 == a1 && a0 == a2)) + { + return FALSE; + } + return TRUE; +} + +static void (*const gUnknown_083ECB94[])(void) = { + sub_8103830, + sub_8103910, + sub_8103A78 +}; + +static void sub_810380C(void) +{ + gUnknown_083ECB94[eSlotMachine->bet - 1](); +} + +static void sub_8103830(void) +{ + s16 i = 0; + u8 r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 2 - eSlotMachine->unk2E[0]); + u8 r1 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + if (r5 == r1) + { + while (1) + { + u8 r0; + if (!(r5 == (r0 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) || (r5 == 0 && r0 == 1) || (r5 == 1 && r0 == 0))) + { + break; + } + i++; + } + } + else if (sub_8103764(r5, r1)) + { + if (eSlotMachine->unk04 & 0x80) + { + for (i = 0; i < 5; i++) + { + if (r5 == GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) + { + eSlotMachine->unk2E[2] = i; + return; + } + } + } + i = 0; + while (1) + { + if (r5 != GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 2 - i)) + { + break; + } + i++; + } + } + eSlotMachine->unk2E[2] = i; +} -extern u16 gUnknown_08E95AB8[]; -extern u16 gUnknown_08E95FB8[]; +static void sub_8103910(void) +{ + s16 sp0 = 0; + s16 i; + u8 r7; + u8 r6; + u8 r4; + + if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] == eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) + { + r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); + if (sub_8103764(r7, r6)) + { + for (i = 0; i < 5; i++) + { + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, eSlotMachine->unk34[1] - i); + if (r7 == r4) + { + sp0 = i; + break; + } + } + } + } + while (1) + { + s16 r8; + for (i = 1, r8 = 0; i < 4; i++) + { + r7 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, i - eSlotMachine->unk2E[0]); + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, i - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, i - sp0); + if (!sub_81037BC(r7, r6, r4) && (!sub_810378C(r7, r6, r4) || !(eSlotMachine->unk04 & 0x80))) + { + r8++; + break; + } + } + if (r8 == 0) + { + break; + } + sp0++; + } + eSlotMachine->unk2E[2] = sp0; +} + +static void sub_8103A78(void) +{ + u8 r6; + u8 r5; + u8 r4; + s16 r8; + s16 i; + + sub_8103910(); + if (eSlotMachine->unk34[1] != 0 && eSlotMachine->unk34[0] != eSlotMachine->unk34[1] && eSlotMachine->unk04 & 0x80) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, eSlotMachine->unk34[0] - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, eSlotMachine->unk34[1] - eSlotMachine->unk2E[1]); + if (sub_8103764(r6, r5)) + { + r8 = 1; + if (eSlotMachine->unk34[0] == 1) + r8 = 3; + for (i = 0; i < 5; i++) + { + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, r8 - (eSlotMachine->unk2E[2] + i)); + if (r6 == r4) + { + eSlotMachine->unk2E[2] += i; + break; + } + } + } + } + while (1) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 1 - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 3 - eSlotMachine->unk2E[2]); + if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) + break; + eSlotMachine->unk2E[2]++; + } + while (1) + { + r6 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(0, 3 - eSlotMachine->unk2E[0]); + r5 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(1, 2 - eSlotMachine->unk2E[1]); + r4 = GetTagOfReelSymbolOnScreenAtPos_AdjustForPixelOffset(2, 1 - eSlotMachine->unk2E[2]); + if (sub_81037BC(r6, r5, r4) || (sub_810378C(r6, r5, r4) && eSlotMachine->unk04 & 0x80)) + break; + eSlotMachine->unk2E[2]++; + } +} + +static void sub_8103C14(u8 a0) +{ + u8 taskId = CreateTask(sub_8103C48, 5); + gTasks[taskId].data[15] = a0; + sub_8103C48(taskId); +} + +static void (*const gUnknown_083ECBA0[])(struct Task *task, u8 taskId) = { + sub_8103C78, + sub_8103CAC, + sub_8103CC8 +}; + +static void sub_8103C48(u8 taskId) +{ + gUnknown_083ECBA0[gTasks[taskId].data[0]](gTasks + taskId, taskId); +} + +static const s16 gUnknown_083ECBAC[] = {5, 10, 15}; + +static void sub_8103C78(struct Task *task, u8 taskId) +{ + sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x62, 0x63, 0x72, 0x73); + task->data[0]++; +} + +static void sub_8103CAC(struct Task *task, u8 taskId) +{ + if (++task->data[1] > 11) + task->data[0]++; +} + +static void sub_8103CC8(struct Task *task, u8 taskId) +{ + sub_81065A8(gUnknown_083ECBAC[task->data[15]], 0x42, 0x43, 0x52, 0x53); + DestroyTask(taskId); +} + +static const u16 *const gUnknown_083EDD08[]; +static const u16 *const gUnknown_083EDD1C[]; +static const u8 gUnknown_083EDD30[]; + +static void sub_8103D00(u8 a0) +{ + LoadPalette(gUnknown_083EDD08[a0], gUnknown_083EDD30[a0], 2); +} + +static void sub_8103D28(u8 a0) +{ + LoadPalette(gUnknown_083EDD1C[a0], gUnknown_083EDD30[a0], 2); +} + +static const u8 gUnknown_083EDD35[][2]; +static const u8 gUnknown_083EDD3B[]; + +static void sub_8103D50(u8 a0) +{ + u8 i; + for (i = 0; i < gUnknown_083EDD3B[a0]; i++) + { + sub_8103D00(gUnknown_083EDD35[a0][i]); + } +} + +static void sub_8103D8C(u8 a0) +{ + u8 i; + for (i = 0; i < gUnknown_083EDD3B[a0]; i++) + { + sub_8103D28(gUnknown_083EDD35[a0][i]); + } +} + +static void sub_8103DC8(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + u8 spriteId = CreateInvisibleSprite(sub_8103EE4); + gSprites[spriteId].data[0] = i; + eSlotMachine->unk44[i] = spriteId; + } +} + +static void sub_8103E04(u8 a0) +{ + struct Sprite *sprite = gSprites + eSlotMachine->unk44[a0]; + sprite->data[1] = 1; + sprite->data[2] = 4; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = 2; + sprite->data[7] = 0; +} + +static bool8 sub_8103E38(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + struct Sprite *sprite = gSprites + eSlotMachine->unk44[i]; + if (sprite->data[1] && sprite->data[2]) + return FALSE; + } + return TRUE; +} + +static bool8 sub_8103E7C(void) +{ + u8 i; + for (i = 0; i < 5; i++) + { + if (!sub_8103EAC(eSlotMachine->unk44[i])) + return FALSE; + } + return TRUE; +} + +static bool8 sub_8103EAC(u8 spriteId) +{ + struct Sprite *sprite = gSprites + spriteId; + if (!sprite->data[1]) + return TRUE; + if (sprite->data[7]) + sprite->data[1] = 0; + return sprite->data[7]; +} + +static void sub_8103EE4(struct Sprite *sprite) +{ + s16 r4; + if (sprite->data[1]) + { + if (!sprite->data[3]--) + { + sprite->data[7] = 0; + sprite->data[3] = 1; + sprite->data[4] += sprite->data[5]; + r4 = 4; + if (sprite->data[2]) + r4 = 8; + if (sprite->data[4] <= 0) + { + sprite->data[7] = 1; + sprite->data[5] = -sprite->data[5]; + if (sprite->data[2]) + sprite->data[2]--; + } + else if (sprite->data[4] >= r4) + sprite->data[5] = -sprite->data[5]; + if (sprite->data[2]) + sprite->data[3] <<= 1; + } + MultiplyPaletteRGBComponents(gUnknown_083EDD30[sprite->data[0]], sprite->data[4], sprite->data[4], sprite->data[4]); + } +} + +static void sub_8103F70(void) +{ + u8 taskId = CreateTask(sub_8103FE8, 6); + gTasks[taskId].data[3] = 1; + sub_8103FE8(taskId); +} + +static const u16 *const gUnknown_083EDDA0[]; +static const u16 *const gUnknown_083EDDAC; + +static bool8 sub_8103FA0(void) +{ + u8 taskId = FindTaskIdByFunc(sub_8103FE8); + if (!gTasks[taskId].data[2]) + { + DestroyTask(taskId); + LoadPalette(gUnknown_083EDDAC, 0x10, 0x20); + return TRUE; + } + return FALSE; +} + +static void sub_8103FE8(u8 taskId) +{ + struct Task *task = gTasks + taskId; + if (!task->data[1]--) + { + task->data[1] = 4; + task->data[2] += task->data[3]; + if (task->data[2] == 0 || task->data[2] == 2) + { + task->data[3] = -task->data[3]; + } + } + LoadPalette(gUnknown_083EDDA0[task->data[2]], 0x10, 0x20); +} + +static void sub_8104048(void) +{ + eSlotMachine->unk3E = CreateTask(sub_81040E8, 8); +} + +static void sub_8104064(u8 pikaPower) +{ + struct Task *task = gTasks + eSlotMachine->unk3E; + sub_810421C(task); + task->data[0] = 1; + task->data[1]++; + task->data[15] = 1; +} + +static void sub_8104098(void) +{ + struct Task *task = gTasks + eSlotMachine->unk3E; + sub_810421C(task); + task->data[0] = 3; + task->data[15] = 1; +} + +static bool8 sub_81040C8(void) +{ + return gTasks[eSlotMachine->unk3E].data[15]; +} + +static void (*const gUnknown_083ECBB4[])(struct Task *task) = { + nullsub_68, + sub_810411C, + sub_8104144, + sub_81041AC +}; + +static void sub_81040E8(u8 taskId) +{ + gUnknown_083ECBB4[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void nullsub_68(struct Task *task) +{ + +} + +static void sub_810411C(struct Task *task) +{ + task->data[2] = sub_8105B1C((task->data[1] << 3) + 20, 20); + task->data[0]++; +} + +static const u16 gUnknown_083ECBC4[][2] = { + {0x9e, 0x6e}, + {0x9f, 0x6f}, + {0xaf, 0x7f} +}; + +static void sub_8104144(struct Task *task) +{ + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + if (gSprites[task->data[2]].data[7]) + { + s16 r2 = task->data[1] + 2; + u8 r0 = 0; + if (task->data[1] == 1) + r0 = 1; + else if (task->data[1] == 16) + r0 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r0][0]; + sub_8105B88(task->data[2]); + task->data[0] = 0; + task->data[15] = 0; + } +} + +static void sub_81041AC(struct Task *task) +{ + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + s16 r4 = task->data[1] + 2; + u8 r2 = 0; + if (task->data[1] == 1) + r2 = 1; + else if (task->data[1] == 16) + r2 = 2; + if (task->data[2] == 0) + { + vaddr[r4 + 0x40] = gUnknown_083ECBC4[r2][1]; + task->data[1]--; + } + if (++task->data[2] >= 20) + task->data[2] = 0; + if (task->data[1] == 0) + { + task->data[0] = 0; + task->data[15] = 0; + } +} + +static void sub_810421C(struct Task *task) +{ + u8 i; + + for (i = 2; i < 16; i++) + task->data[i] = 0; +} + +static void sub_810423C(u8 pikaPower) +{ + s16 i; + u8 r3; + s16 r2 = 3; + u16 *vaddr = (u16 *)BG_SCREEN_ADDR(29); + for (i = 0; i < pikaPower; i++, r2++) + { + r3 = 0; + if (i == 0) + r3 = 1; + else if (i == 15) + r3 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][0]; + } + for (; i < 16; i++, r2++) + { + r3 = 0; + if (i == 0) + r3 = 1; + else if (i == 15) + r3 = 2; + vaddr[r2 + 0x40] = gUnknown_083ECBC4[r3][1]; + } + gTasks[eSlotMachine->unk3E].data[1] = pikaPower; +} + +static void sub_810430C(void) +{ + u8 taskId = CreateTask(sub_810434C, 7); + sub_810434C(taskId); +} + +static bool8 sub_810432C(void) +{ + if (FindTaskIdByFunc(sub_810434C) == 0xFF) + return TRUE; + return FALSE; +} + +static void (*const gUnknown_083ECBD0[])(struct Task *task) = { + sub_810437C, + sub_81043EC, + sub_8104468, + sub_8104498, + sub_8104548, + sub_8104598, + sub_81045CC, + sub_810463C, + sub_81046C0, + sub_8104764, + sub_8104794, + sub_81047EC, + sub_8104860, + sub_81048A8, + sub_81048CC, + sub_8104940, + sub_81049C8, + sub_8104794, + sub_81049F8 +}; + +static void sub_810434C(u8 taskId) +{ + gUnknown_083ECBD0[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void sub_810437C(struct Task *task) +{ + eSlotMachine->unk0A = 0; + eSlotMachine->unk14 = 0; + eSlotMachine->unk16 = 0; + task->data[0]++; + task->data[1] = 0; + task->data[2] = 30; + task->data[4] = 1280; + gSpriteCoordOffsetX = 0; + gSpriteCoordOffsetY = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + sub_8104A40(30, 0); + sub_81051C0(); + sub_8105100(); + sub_81052EC(); + sub_81053A0(); + sub_810545C(); + sub_8102680(); + StopMapMusic(); + PlayNewMapMusic(BGM_BD_TIME); +} + +static void sub_81043EC(struct Task *task) +{ + s16 r3; + gSpriteCoordOffsetX -= 8; + task->data[1] += 8; + r3 = ((task->data[1] + 240) & 0xff) >> 3; + REG_BG1HOFS = task->data[1] & 0x1ff; + if (r3 != task->data[2] && task->data[3] <= 18) + { + task->data[2] = r3; + task->data[3] = task->data[1] >> 3; + sub_8104A40(r3, task->data[3]); + } + if (task->data[1] >= 200) + { + task->data[0]++; + task->data[3] = 0; + } + sub_8102D28(task->data[4] >> 8); +} + +static void sub_8104468(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + if (++task->data[5] >= 60) + { + task->data[0]++; + sub_8105578(); + sub_81056F0(); + } +} + +static void sub_8104498(struct Task *task) +{ + int r5; + u8 sp0[] = {1, 1, 2, 2}; + s16 sp4[] = {0x40, 0x30, 0x18, 0x08}; + s16 spC[] = {10, 8, 6, 4}; + + sub_8102D28(task->data[4] >> 8); + task->data[4] -= 4; + r5 = 4 - (task->data[4] >> 8); + sub_8105688(sp4[r5]); + sub_81057E8(spC[r5]); + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, sp0[r5]); + if (task->data[4] <= 0x100) + { + task->data[0]++; + task->data[4] = 0x100; + task->data[5] = 0; + } +} + +static void sub_8104548(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + if (++task->data[5] >= 80) + { + task->data[0]++; + task->data[5] = 0; + sub_81057E8(2); + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 3); + } +} + +static void sub_8104598(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x80; + if (++task->data[5] >= 80) + { + task->data[0]++; + task->data[5] = 0; + } +} + +static void sub_81045CC(struct Task *task) +{ + sub_8102D28(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x40; + if (++task->data[5] >= 40) + { + task->data[5] = 0; + if (eSlotMachine->unk05) + { + if (eSlotMachine->unk0A <= task->data[6]) + { + task->data[0]++; + } + } + else if (task->data[6] > 3) + { + task->data[0]++; + } + else if (sub_81026DC(task->data[6])) + { + task->data[0] = 14; + } + task->data[6]++; + } +} + +static void sub_810463C(struct Task *task) +{ + s16 r5 = eSlotMachine->unk14 % 20; + if (r5) + { + r5 = sub_8102D5C(task->data[4] >> 8); + task->data[4] = (u8)task->data[4] + 0x40; + } + else if (sub_8102C48(1) != eSlotMachine->unk05) + { + sub_8102D28(task->data[4] >> 8); + r5 = eSlotMachine->unk14 % 20; + task->data[4] = (u8)task->data[4] + 0x40; + } + if (r5 == 0 && sub_8102C48(1) == eSlotMachine->unk05) + { + task->data[4] = 0; + task->data[0]++; + } +} + +static void sub_81046C0(struct Task *task) +{ + if (++task->data[4] >= 60) + { + StopMapMusic(); + sub_81056C0(); + sub_8105804(); + task->data[0]++; + if(eSlotMachine->unk05 == 0) + { + task->data[4] = 0xa0; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); + PlayFanfare(BGM_ME_ZANNEN); + } + else + { + task->data[4] = 0xc0; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 4); + gSprites[eSlotMachine->unk3F].animCmdIndex = 0; + if (eSlotMachine->pikaPower) + { + sub_8104098(); + eSlotMachine->pikaPower = 0; + } + PlayFanfare(BGM_ME_B_SMALL); + } + } +} + +static void sub_8104764(struct Task *task) +{ + if ((task->data[4] == 0 || --task->data[4] == 0) && !sub_81040C8()) + { + task->data[0]++; + } +} + +static void sub_8104794(struct Task *task) +{ + s16 r4; + gSpriteCoordOffsetX -= 8; + task->data[1] += 8; + task->data[3] += 8; + r4 = ((task->data[1] - 8) & 0xff) >> 3; + REG_BG1HOFS = task->data[1] & 0x1ff; + if (task->data[3] >> 3 <= 25) + { + sub_8104A88(r4); + } + else + { + task->data[0]++; + } +} + +static void sub_81047EC(struct Task *task) +{ + eSlotMachine->unk0B = 0; + eSlotMachine->unk0A = eSlotMachine->unk05; + gSpriteCoordOffsetX = 0; + REG_BG1HOFS = 0; + eSlotMachine->unk1A = 8; + sub_810514C(); + sub_81054B8(); + sub_8105524(); + PlayNewMapMusic(eSlotMachine->backupMapMusic); + if (eSlotMachine->unk0A == 0) + { + DestroyTask(FindTaskIdByFunc(sub_810434C)); + } + else + { + sub_8104CAC(4); + task->data[1] = dp15_jump_random_unknown(); + task->data[2] = 0; + task->data[3] = 0; + task->data[0]++; + } +} + +static void sub_8104860(struct Task *task) +{ + if (eSlotMachine->unk1A == task->data[1]) + { + task->data[0]++; + } + else if (eSlotMachine->unk1C[0] % 24 == 0 && (++task->data[2]& 0x07) == 0) + { + eSlotMachine->unk1A >>= 1; + } +} + +static void sub_81048A8(struct Task *task) +{ + if (sub_8104E18()) + { + DestroyTask(FindTaskIdByFunc(sub_810434C)); + } +} + +static void sub_81048CC(struct Task *task) +{ + sub_81054B8(); + sub_81056C0(); + sub_8105804(); + sub_8105854(); + gSprites[eSlotMachine->unk4E[0]].invisible = TRUE; + StartSpriteAnimIfDifferent(gSprites + eSlotMachine->unk3F, 5); + task->data[0]++; + task->data[4] = 4; + task->data[5] = 0; + StopMapMusic(); + PlayFanfare(BGM_ME_ZANNEN); + PlaySE(SE_W153); +} + +static void sub_8104940(struct Task *task) +{ + gSpriteCoordOffsetY = task->data[4]; + REG_BG1VOFS = task->data[4]; + if (task->data[5] & 0x01) + task->data[4] = -task->data[4]; + if ((++task->data[5] & 0x1f) == 0) + task->data[4] >>= 1; + if (task->data[4] == 0) + { + sub_81058A0(); + sub_81058C4(); + sub_8105284(); + sub_81059E8(); + gSprites[eSlotMachine->unk4E[0]].invisible = FALSE; + task->data[0]++; + task->data[5] = 0; + } +} + +static void sub_81049C8(struct Task *task) +{ + gSpriteCoordOffsetY = 0; + REG_BG1VOFS = 0; + if (sub_8105ACC()) + { + task->data[0]++; + sub_8105AEC(); + } +} + +static void sub_81049F8(struct Task *task) +{ + gSpriteCoordOffsetX = 0; + REG_BG1HOFS = 0; + PlayNewMapMusic(eSlotMachine->backupMapMusic); + sub_810514C(); + sub_8105554(); + sub_8105524(); + sub_81059B8(); + DestroyTask(FindTaskIdByFunc(sub_810434C)); +} + +static const u16 sReelTimeWindowTilemap[]; + +static void sub_8104A40(s16 a0, s16 a1) +{ + s16 i; + + for (i = 4; i < 15; i++) + { + u16 tile = sReelTimeWindowTilemap[a1 + (i - 4) * 20]; + ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = tile; + } +} + +static void sub_8104A88(s16 a0) +{ + s16 i; + + for (i = 4; i < 15; i++) + { + ((u16 *)BG_SCREEN_ADDR(28))[32 * i + a0] = 0; + } +} + +static void sub_8104AB8(u8 a0) +{ + u8 taskId = CreateTask(sub_8104B0C, 1); + gTasks[taskId].data[1] = a0; + sub_8104B0C(taskId); +} + +static bool8 sub_8104AEC(void) +{ + if (FindTaskIdByFunc(sub_8104B0C) == 0xFF) + return TRUE; + return FALSE; +} + +static void (*const gUnknown_083ECC30[])(struct Task *task) = { + sub_8104B3C, + sub_8104B60, + sub_8104B80, + sub_8104B60, + sub_8104BC8, + sub_8104B60, + sub_8104BFC, + sub_8104B60, + sub_8104C44 +}; + +static void sub_8104B0C(u8 taskId) +{ + gUnknown_083ECC30[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void sub_8104B3C(struct Task *task) +{ + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + task->data[0]++; +} + +static void sub_8104B60(struct Task *task) +{ + if (!gPaletteFade.active) + { + task->data[0]++; + } +} + +static void sub_8104B80(struct Task *task) +{ + sub_8104DA4(); + sub_81065DC(); + BasicInitMenuWindow(&gWindowTemplate_81E7144); + Menu_PrintTextPixelCoords(gOtherText_ReelTime, 10, 32, 1); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + task->data[0]++; +} + +static void sub_8104BC8(struct Task *task) +{ + if (gMain.newKeys & (B_BUTTON | SELECT_BUTTON)) + { + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + task->data[0]++; + } +} + +static void sub_8104BFC(struct Task *task) +{ + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7128); + sub_81064B8(); + sub_8104CAC(task->data[1]); + sub_810423C(eSlotMachine->pikaPower); + BeginNormalPaletteFade(-1, 0, 16, 0, 0); + task->data[0]++; +} + +static void sub_8104C44(struct Task *task) +{ + DestroyTask(FindTaskIdByFunc(sub_8104B0C)); +} + +static void sub_8104C5C(void) +{ + u8 i; + struct Task *task; + i = CreateTask(sub_8104E74, 3); + eSlotMachine->unk3D = i; + task = gTasks + i; + task->data[1] = -1; + for (i = 4; i < 16; i++) + { + task->data[i] = MAX_SPRITES; + } +} static void LoadSlotMachineWheelOverlay(void); -void sub_8104CAC(u8 arg0) { +static void sub_8104CAC(u8 arg0) +{ u8 i; struct Task *task; sub_8104DA4(); - task = &gTasks[ewram0_8->unk3D]; + task = gTasks + eSlotMachine->unk3D; task->data[1] = arg0; - i = 0; - while (gUnknown_083ED048[arg0][i].unk00 != 0xFF) + for (i = 0; gUnknown_083ED048[arg0][i].unk00 != 0xFF; i++) { u8 spriteId; spriteId = sub_8105BB4( @@ -55,44 +4042,1039 @@ void sub_8104CAC(u8 arg0) { #ifdef GERMAN if (arg0 == 5 && i <= 2) - { gSprites[spriteId].invisible = TRUE; - } #endif + } +} + +static void sub_8104D30(u8 a0, SpriteCallback a1, s16 a2, s16 a3, s16 a4) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + for (i = 4; i < 16; i++) + { + if (task->data[i] == MAX_SPRITES) + { + task->data[i] = sub_8105BF8(a0, a1, a2, a3, a4); + break; + } + } +} + +static void (*const gUnknown_083ED064[])(void); + +void sub_8104DA4(void) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + if ((u16)task->data[1] != 0xFFFF) + gUnknown_083ED064[task->data[1]](); + for (i = 4; i < 16; i++) + { + if (task->data[i] != MAX_SPRITES) + { + DestroySprite(gSprites + task->data[i]); + task->data[i] = MAX_SPRITES; + } + } +} + +static bool8 sub_8104E18(void) +{ + u8 i; + struct Task *task = gTasks + eSlotMachine->unk3D; + for (i = 4; i < 16; i++) + { + if (task->data[i] != MAX_SPRITES) + { + if (gSprites[task->data[i]].data[7]) + return FALSE; + } + } + return TRUE; +} + +static void (*const gUnknown_083ECC54[])(struct Task *task) = { + nullsub_69 +}; + +static void sub_8104E74(u8 taskId) +{ + gUnknown_083ECC54[gTasks[taskId].data[0]](gTasks + taskId); +} + +static void nullsub_69(struct Task *task) +{ + +} + +static const struct SpriteTemplate gSpriteTemplate_83ED414; + +static void sub_8104EA8(void) +{ + s16 i; + s16 j; + s16 x; + for (i = 0, x = 0x30; i < 3; i++, x += 0x28) + { + for (j = 0; j < 120; j += 24) + { + struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED414, x, 0, 14); + sprite->oam.priority = 3; + sprite->data[0] = i; + sprite->data[1] = j; + sprite->data[3] = -1; + } + } +} + +static void sub_8104F18(struct Sprite *sprite) +{ + sprite->data[2] = eSlotMachine->unk1C[sprite->data[0]] + sprite->data[1]; + sprite->data[2] %= 120; + sprite->pos1.y = eSlotMachine->unk22[sprite->data[0]] + 28 + sprite->data[2]; + sprite->sheetTileStart = GetSpriteTileStartByTag(GetTagOfReelSymbolOnScreenAtPos(sprite->data[0], sprite->data[2] / 24)); + SetSpriteSheetFrameTileNum(sprite); +} + +static void sub_8104F8C(void) +{ + s16 i; + s16 x; + for (x = 203, i = 1; i < 10000; i *= 10, x -= 7) + { + sub_8104FF4(x, 23, 0, i); + } + for (x = 235, i = 1; i < 10000; i *= 10, x -= 7) + { + sub_8104FF4(x, 23, 1, i); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED42C; - i += 1; +static void sub_8104FF4(s16 x, s16 y, u8 a2, s16 a3) +{ + struct Sprite *sprite = gSprites + CreateSprite(&gSpriteTemplate_83ED42C, x, y, 13); + sprite->oam.priority = 2; + sprite->data[0] = a2; + sprite->data[1] = a3; + sprite->data[2] = a3 * 10; + sprite->data[3] = -1; +} + +static void sub_810506C(struct Sprite *sprite) +{ + u16 tag = eSlotMachine->coins; + if (sprite->data[0]) + tag = eSlotMachine->payout; + if (sprite->data[3] != tag) + { + sprite->data[3] = tag; + tag %= (u16)sprite->data[2]; + tag /= (u16)sprite->data[1]; + tag += 7; + sprite->sheetTileStart = GetSpriteTileStartByTag(tag); + SetSpriteSheetFrameTileNum(sprite); } } -asm(".section .text_b"); +static const struct SpriteTemplate gSpriteTemplate_83ED444; +static const struct SubspriteTable gSubspriteTables_83ED704[]; -void sub_8106448(void) { - u32 offsetRead, offsetWrite; - u32 size; +static void sub_81050C4(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED444, 0x58, 0x48, 15); + gSprites[spriteId].oam.priority = 3; + SetSubspriteTables(gSprites + spriteId, gSubspriteTables_83ED704); +} - LZDecompressWram(gSlotMachine_Gfx, ewram10000_2); +static const struct SpriteTemplate gSpriteTemplate_83ED45C; - offsetRead = (u32)ewram10000_2; - offsetWrite = BG_VRAM; - size = SLOTMACHINE_GFX_TILES * 32; - while (TRUE) +static void sub_8105100(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED45C, 0x118, 0x50, 1); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].coordOffsetEnabled = TRUE; + eSlotMachine->unk3F = spriteId; +} + +static void sub_810514C(void) +{ + DestroySprite(gSprites + eSlotMachine->unk3F); +} + +static void sub_8105170(struct Sprite *sprite) +{ + sprite->pos2.y = sprite->pos2.x = 0; + if (sprite->animNum == 4) { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), 0x1000); - offsetRead += 0x1000; - offsetWrite += 0x1000; - size -= 0x1000; - if (size <= 0x1000) + sprite->pos2.y = sprite->pos2.x = 8; + if ((sprite->animCmdIndex != 0 && sprite->animDelayCounter != 0) || (sprite->animCmdIndex == 0 && sprite->animDelayCounter == 0)) { - DmaCopy16(3, offsetRead, (void *) (offsetWrite), size); + sprite->pos2.y = -8; + } + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED474; +static const struct SpriteTemplate gSpriteTemplate_83ED48C; +static const struct SubspriteTable gSubspriteTables_83ED73C[]; +static const struct SubspriteTable gSubspriteTables_83ED75C[]; + +static void sub_81051C0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED474, 0x170, 0x34, 7); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED73C); + eSlotMachine->unk49[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED48C, 0x170, 0x54, 7); + sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED75C); + eSlotMachine->unk49[1] = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4A4; +static const struct SubspriteTable gSubspriteTables_83ED78C[]; + +static void sub_8105284(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4A4, 0xa8 - gSpriteCoordOffsetX, 0x50, 7); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + SetSubspriteTables(sprite, gSubspriteTables_83ED78C); + eSlotMachine->unk42 = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4BC; + +static void sub_81052EC(void) +{ + u8 i; + s16 r5; + for (i = 0, r5 = 0; i < 3; i++, r5 += 20) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4BC, 0x170, 0x00, 10); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->data[7] = r5; + eSlotMachine->unk4B[i] = spriteId; + } +} + +static void sub_810535C(struct Sprite *sprite) +{ + s16 r0 = (u16)(eSlotMachine->unk14 + sprite->data[7]); + r0 %= 40; + sprite->pos1.y = r0 + 59; + StartSpriteAnimIfDifferent(sprite, sub_8102C48(r0 / 20)); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4D4; +static const struct SubspriteTable gSubspriteTables_83ED7B4[]; + +static void sub_81053A0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x170, 0x64, 9); + struct Sprite *sprite = gSprites + spriteId; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); + eSlotMachine->unk4E[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED4D4, 0x120, 0x68, 4); + sprite = gSprites + spriteId; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7B4); + eSlotMachine->unk4E[1] = spriteId; +} + +static const struct SpriteTemplate gSpriteTemplate_83ED4EC; +static const struct SubspriteTable gSubspriteTables_83ED7D4[]; + +static void sub_810545C(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED4EC, 0x170, 0x4c, 11); + struct Sprite *sprite = gSprites + spriteId; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + SetSubspriteTables(sprite, gSubspriteTables_83ED7D4); + eSlotMachine->unk40 = spriteId; +} + +static void sub_81054B8(void) +{ + u8 i; + + DestroySprite(gSprites + eSlotMachine->unk40); + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk49[i]); + } + for (i = 0; i < 3; i++) + { + DestroySprite(gSprites + eSlotMachine->unk4B[i]); + } +} + +static void sub_8105524(void) +{ + u8 i; + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk4E[i]); + } +} + +static void sub_8105554(void) +{ + DestroySprite(gSprites + eSlotMachine->unk42); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED504; + +static void sub_8105578(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0x98, 0x20, 5); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->hFlip = TRUE; + eSlotMachine->unk50[0] = spriteId; + sprite->data[0] = 8; + sprite->data[1] = -1; + sprite->data[2] = -1; + sprite->data[7] = 0x20; + + spriteId = CreateSprite(&gSpriteTemplate_83ED504, 0xb8, 0x20, 5); + sprite = gSprites + spriteId; + sprite->oam.priority = 1; + eSlotMachine->unk50[1] = spriteId; + sprite->data[1] = 1; + sprite->data[2] = -1; + sprite->data[7] = 0x20; +} + +static void sub_810562C(struct Sprite *sprite) +{ + if (sprite->data[0] != 0) + { + sprite->data[0]--; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->invisible = TRUE; + } + else + { + sprite->invisible = FALSE; + sprite->pos2.x += sprite->data[1]; + sprite->pos2.y += sprite->data[2]; + if (++sprite->data[3] >= 8) + { + sprite->data[0] = sprite->data[7]; + sprite->data[3] = 0; + } + } +} + +static void sub_8105688(s16 a0) +{ + gSprites[eSlotMachine->unk50[0]].data[7] = a0; + gSprites[eSlotMachine->unk50[1]].data[7] = a0; +} + +static void sub_81056C0(void) +{ + u8 i; + + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk50[i]); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED51C; + +static void sub_81056F0(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x48, 0x50, 3); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].data[0] = 1; + gSprites[spriteId].data[5] = 0; + gSprites[spriteId].data[6] = 16; + gSprites[spriteId].data[7] = 8; + eSlotMachine->unk52[0] = spriteId; + + spriteId = CreateSprite(&gSpriteTemplate_83ED51C, 0x68, 0x50, 3); + gSprites[spriteId].oam.priority = 1; + gSprites[spriteId].hFlip = TRUE; + eSlotMachine->unk52[1] = spriteId; +} + +static const u8 gUnknown_083ECC58[2]; // don't remove this until decompiled through gUnknown_083ECCF8 + +static void sub_8105784(struct Sprite *sprite) +{ + u8 sp[] = {16, 0}; + if (sprite->data[0] && --sprite->data[6] <= 0) + { + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, sp[sprite->data[5]], sp[sprite->data[5]], sp[sprite->data[5]]); + ++sprite->data[5]; + sprite->data[5] &= 1; + sprite->data[6] = sprite->data[7]; + } +} + +static void sub_81057E8(s16 a0) +{ + gSprites[eSlotMachine->unk52[0]].data[7] = a0; +} + +static void sub_8105804(void) +{ + u8 i; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(7) << 4) + 0x103, 0, 0, 0); + for (i = 0; i < 2; i++) + { + DestroySprite(gSprites + eSlotMachine->unk52[i]); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED534; + +static void sub_8105854(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED534, 0xa8, 0x50, 6); + gSprites[spriteId].oam.priority = 1; + eSlotMachine->unk41 = spriteId; +} + +static void sub_8105894(struct Sprite *sprite) +{ + sprite->pos2.y = gSpriteCoordOffsetY; +} + +static void sub_81058A0(void) +{ + DestroySprite(gSprites + eSlotMachine->unk41); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED54C; + +static void sub_81058C4(void) +{ + u8 i; + u16 sp[] = {0x0, 0x40, 0x80, 0xC0}; + for (i = 0; i < 4; i++) + { + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED54C, 0x50 - gSpriteCoordOffsetX, 0x44, 0); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->data[0] = sp[i]; + eSlotMachine->unk54[i] = spriteId; + } +} + +static void sub_810594C(struct Sprite *sprite) +{ + sprite->data[0] -= 2; + sprite->data[0] &= 0xff; + sprite->pos2.x = Cos(sprite->data[0], 20); + sprite->pos2.y = Sin(sprite->data[0], 6); + sprite->subpriority = 0; + if (sprite->data[0] >= 0x80) + { + sprite->subpriority = 2; + } + if (++sprite->data[1] >= 16) + { + sprite->hFlip ^= 1; + sprite->data[1] = 0; + } +} + +static void sub_81059B8(void) +{ + u8 i; + for (i = 0; i < 4; i++) + { + DestroySprite(gSprites + eSlotMachine->unk54[i]); + } +} + +static const struct SpriteTemplate gSpriteTemplate_83ED564; + +static void sub_81059E8(void) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED564, 0xa8, 0x3c, 8); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 1; + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + InitSpriteAffineAnim(sprite); + eSlotMachine->unk43 = spriteId; +} + +static void sub_8105A38(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + if (sprite->affineAnimEnded) + sprite->data[0]++; + } + else if (sprite->data[0] == 1) + { + sprite->invisible ^= 1; + if (++sprite->data[2] >= 24) + { + sprite->data[0]++; + sprite->data[2] = 0; + } + } + else + { + sprite->invisible = TRUE; + if (++sprite->data[2] >= 16) + sprite->data[7] = 1; + } + sprite->data[1] &= 0xff; + sprite->data[1] += 16; + sprite->pos2.y -= (sprite->data[1] >> 8); +} + +u8 sub_8105ACC(void) +{ + return gSprites[eSlotMachine->unk43].data[7]; +} + +static void sub_8105AEC(void) +{ + struct Sprite *sprite = gSprites + eSlotMachine->unk43; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); +} + +static const struct SpriteTemplate gSpriteTemplate_83ED6CC; + +static u8 sub_8105B1C(s16 x, s16 y) +{ + u8 spriteId = CreateSprite(&gSpriteTemplate_83ED6CC, x, y, 12); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 2; + sprite->oam.affineMode = ST_OAM_AFFINE_DOUBLE; + InitSpriteAffineAnim(sprite); + return spriteId; +} + +static void sub_8105B70(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + sprite->data[7] = 1; +} + +static void sub_8105B88(u8 spriteId) +{ + struct Sprite *sprite = gSprites + spriteId; + FreeOamMatrix(sprite->oam.matrixNum); + DestroySprite(sprite); +} + +static const s16 gUnknown_083ECE7E[][2]; +static const SpriteCallback gUnknown_083ECF0C[]; + +u8 sub_8105BB4(u8 templateIdx, u8 cbAndCoordsIdx, s16 a2) +{ + return sub_8105BF8(templateIdx, gUnknown_083ECF0C[cbAndCoordsIdx], gUnknown_083ECE7E[cbAndCoordsIdx][0], gUnknown_083ECE7E[cbAndCoordsIdx][1], a2); +} + +static const struct SpriteTemplate *const gUnknown_083EDB5C[]; +static const struct SubspriteTable *const gUnknown_083EDBC4[]; + +static u8 sub_8105BF8(u8 templateIdx, SpriteCallback callback, s16 x, s16 y, s16 a4) +{ + u8 spriteId = CreateSprite(gUnknown_083EDB5C[templateIdx], x, y, 16); + struct Sprite *sprite = gSprites + spriteId; + sprite->oam.priority = 3; + sprite->callback = callback; + sprite->data[6] = a4; + sprite->data[7] = 1; + if (gUnknown_083EDBC4[templateIdx]) + SetSubspriteTables(sprite, gUnknown_083EDBC4[templateIdx]); + return spriteId; +} + +static void sub_8105C64(struct Sprite *sprite) +{ + sprite->data[7] = 0; +} + +static void sub_8105C6C(struct Sprite *sprite) +{ + s16 sp0[] = {4, -4, 4, -4}; + s16 sp8[] = {4, 4, -4, -4}; + + if (sprite->data[1]++ >= 16) + { + sprite->subspriteTableNum ^= 1; + sprite->data[1] = 0; + } + sprite->pos2.x = 0; + sprite->pos2.y = 0; + if (sprite->subspriteTableNum != 0) + { + sprite->pos2.x = sp0[sprite->data[6]]; + sprite->pos2.y = sp8[sprite->data[6]]; + } +} + +static void sub_8105CF0(struct Sprite *sprite) +{ + sprite->hFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D08(struct Sprite *sprite) +{ + sprite->vFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D20(struct Sprite *sprite) +{ + sprite->hFlip = TRUE; + sprite->vFlip = TRUE; + sub_8105C6C(sprite); +} + +static void sub_8105D3C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + { + sprite->data[0]++; + } + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0x110) + { + sprite->data[0]++; + } + break; + case 3: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105DA4(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 1: + if (++sprite->data[1] > 90) + { + sprite->data[0]++; + } + break; + case 2: + sprite->pos1.x -= 4; + if (sprite->pos1.x <= 0x90) + { + sprite->data[0]++; + } + break; + case 3: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105E08(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + StartSpriteAnim(sprite, eSlotMachine->unk0A - 1); + sprite->data[0]++; + // fallthrough + case 1: + if (++sprite->data[1] >= 4) + { + sprite->data[0]++; + sprite->data[1] = 0; + } + break; + case 2: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xd0) + { + sprite->pos1.x = 0xd0; + sprite->data[0]++; + } + break; + case 3: + if (++sprite->data[1] > 90) + { + sprite->data[0]++; + } + break; + case 4: + sprite->pos1.x += 4; + if (sprite->pos1.x >= 0xf8) + { + sprite->data[0]++; + } + break; + case 5: + sprite->data[7] = 0; + break; + } +} + +static void sub_8105EB4(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->animPaused = TRUE; + sprite->data[0]++; + // fallthrough + case 1: + sprite->pos1.y += 8; + if (sprite->pos1.y >= 0x70) + { + sprite->pos1.y = 0x70; + sprite->data[1] = 16; + sprite->data[0]++; + } + break; + case 2: + if (sprite->data[2] == 0) + { + sprite->pos1.y -= sprite->data[1]; + sprite->data[1] = -sprite->data[1]; + if (++sprite->data[3] >= 2) + { + sprite->data[1] >>= 2; + sprite->data[3] = 0; + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->data[7] = 0; + sprite->animPaused = FALSE; + } + } + } + sprite->data[2]++; + sprite->data[2] &= 0x07; + break; + } +} + +static void sub_8105F54(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (++sprite->data[1] > 8) + { + sprite->data[0]++; + } + break; + case 1: + sprite->pos1.y += 2; + if (sprite->pos1.y >= 0x30) + { + sprite->pos1.y = 0x30; + sprite->data[0]++; + sprite->data[7] = 0; + } + break; + } +} + +static void sub_8105F9C(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + sprite->invisible = TRUE; + if (++sprite->data[1] > 0x20) + { + sprite->data[0]++; + sprite->data[1] = 5; + sprite->oam.mosaic = TRUE; + sprite->invisible = FALSE; + StartSpriteAnim(sprite, 1); + REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; + } + break; + case 1: + sprite->data[1] -= (sprite->data[2] >> 8); + if (sprite->data[1] < 0) + { + sprite->data[1] = 0; + } + REG_MOSAIC = ((sprite->data[1] << 4) | sprite->data[1]) << 8; + sprite->data[2] &= 0xff; + sprite->data[2] += 0x80; + if (sprite->data[1] == 0) + { + sprite->data[0]++; + sprite->data[7] = 0; + sprite->oam.mosaic = FALSE; + StartSpriteAnim(sprite, 0); + } break; + } +} + +static const u16 *const gUnknown_083EDE10[]; + +static void sub_8106058(struct Sprite *sprite) +{ + if (sprite->data[1] < 3) + { + LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); + if (++sprite->data[2] >= 4) + { + sprite->data[1]++; + sprite->data[2] = 0; } } + else + { + LoadPalette(gUnknown_083EDE10[sprite->data[1]], (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); + if (++sprite->data[2] >= 25) + { + sprite->data[1] = 0; + sprite->data[2] = 0; + } + } + StartSpriteAnimIfDifferent(sprite, 1); + sprite->data[7] = 0; +} + +static void sub_81060FC(struct Sprite *sprite) +{ + s16 sp00[] = {0, -40, 0, 0, 48, 0, 24, 0}; + s16 sp10[] = {-32, 0, -32, -48, 0, -48, 0, -48}; + s16 sp20[] = {16, 12, 16, 0, 0, 4, 8, 8}; + + switch (sprite->data[0]) + { + case 0: + sprite->pos2.x = sp00[sprite->data[6]]; + sprite->pos2.y = sp10[sprite->data[6]]; + sprite->data[1] = sp20[sprite->data[6]]; + sprite->data[0]++; + // fallthrough + case 1: + if (sprite->data[1]-- == 0) + { + sprite->data[0]++; + } + break; + case 2: + if (sprite->pos2.x > 0) + { + sprite->pos2.x -= 4; + } + else if (sprite->pos2.x < 0) + { + sprite->pos2.x += 4; + } + if (sprite->pos2.y > 0) + { + sprite->pos2.y -= 4; + } + else if (sprite->pos2.y < 0) + { + sprite->pos2.y += 4; + } + if (sprite->pos2.x == 0 && sprite->pos2.y == 0) + { + sprite->data[0]++; + } + break; + } +} + +static void sub_81061C8(struct Sprite *sprite) +{ + s16 sp0[] = {160, 192, 224, 104, 80, 64, 48, 24}; + + if (sprite->data[0] == 0) + { + sprite->data[0]++; + sprite->data[1] = 12; + } + sprite->pos2.x = Cos(sp0[sprite->data[6]], sprite->data[1]); + sprite->pos2.y = Sin(sp0[sprite->data[6]], sprite->data[1]); + if (sprite->data[1]) + { + sprite->data[1]--; + } +} + +static void sub_8106230(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + eSlotMachine->winIn = 0x2f; + eSlotMachine->winOut = 0x3f; + eSlotMachine->win0v = 0x2088; + sprite->invisible = TRUE; + sprite->data[0]++; + // fallthrough + case 1: + sprite->data[1] += 2; + sprite->data[2] = sprite->data[1] + 0xb0; + sprite->data[3] = 0xf0 - sprite->data[1]; + if (sprite->data[2] > 0xd0) + { + sprite->data[2] = 0xd0; + } + if (sprite->data[3] < 0xd0) + { + sprite->data[3] = 0xd0; + } + eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; + if (sprite->data[1] > 0x33) + { + sprite->data[0]++; + eSlotMachine->winIn = 0x3f; + } + break; + case 2: + if (eSlotMachine->bet == 0) + { + break; + } + sub_8104D30(5, SpriteCallbackDummy, 0xd0, 0x74, 0); + eSlotMachine->win0h = 0xc0e0; + eSlotMachine->win0v = 0x6880; + eSlotMachine->winIn = 0x2f; + sprite->data[0]++; + sprite->data[1] = 0; + // fallthrough + case 3: + sprite->data[1] += 2; + sprite->data[2] = sprite->data[1] + 0xc0; + sprite->data[3] = 0xe0 - sprite->data[1]; + if (sprite->data[2] > 0xd0) + { + sprite->data[2] = 0xd0; + } + if (sprite->data[3] < 0xd0) + { + sprite->data[3] = 0xd0; + } + eSlotMachine->win0h = (sprite->data[2] << 8) | sprite->data[3]; + if (sprite->data[1] > 0x0f) + { + sprite->data[0]++; + eSlotMachine->winIn = 0x3f; + } + break; + } +} + +static void nullsub_70(void) +{ + +} + +static void sub_8106364(void) +{ + REG_MOSAIC = 0; +} + +static const u16 *const gUnknown_083EDE20; + +static void sub_8106370(void) +{ + LoadPalette(gUnknown_083EDE20, (IndexOfSpritePaletteTag(6) << 4) + 0x100, 0x20); +} + +static void sub_810639C(void) +{ + eSlotMachine->win0h = 0xf0; + eSlotMachine->win0v = 0xa0; + eSlotMachine->winIn = 0x3f; + eSlotMachine->winOut = 0x3f; +} + +static const u8 sReelTimeGfx[]; +static const struct SpriteSheet sSlotMachineSpriteSheets[]; +static const struct SpritePalette gSlotMachineSpritePalettes[]; + +static void sub_81063C0(void) +{ + sub_8106404(); + LZDecompressWram(gSlotMachineReelTimeLights_Gfx, eSlotMachineGfxBuffer); + LZDecompressWram(sReelTimeGfx, eSlotMachineReelTimeGfxBuffer); + LoadSpriteSheets(sSlotMachineSpriteSheets); + LoadSpritePalettes(gSlotMachineSpritePalettes); +} + +static const u8 *const gUnknown_083EDCE4; +static const struct SpriteSheet gUnknown_083EDCDC; + +static void sub_8106404(void) +{ + u8 *dest = eSlotMachineGfxBuffer; + u8 i = 0; + const struct SpriteSheet *sheet = &gUnknown_083EDCDC; + const u8 *src = gUnknown_083EDCE4; + for (i = 0; i < 0x40; i++) + { + u8 j; + for (j = 0; j < 0x20; j++, dest++) + { + *dest = src[j]; + } + } + LoadSpriteSheet(sheet); +} + +static void sub_8106448(void) { + LZDecompressWram(gSlotMachine_Gfx, eSlotMachineGfxBuffer); + + DmaCopyLarge16(3, eSlotMachineGfxBuffer, BG_VRAM, SLOTMACHINE_GFX_TILES * 32, 0x1000); LoadPalette(gUnknown_08E95A18, 0, 160); LoadPalette(gPalette_83EDE24, 208, 32); } -void sub_81064B8(void) { +static void sub_81064B8(void) { CpuCopy16(gUnknown_08E95AB8, BG_SCREEN_ADDR(29), 20 * 32 * 2); LoadSlotMachineWheelOverlay(); } @@ -123,7 +5105,7 @@ static void LoadSlotMachineWheelOverlay(void) { } } -void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { +static void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { u16 *vram = BG_SCREEN_ADDR(29); vram[15 * 32 + arg0] = arg1; @@ -132,7 +5114,8 @@ void sub_81065A8(s16 arg0, u16 arg1, u16 arg2, u16 arg3, u16 arg4) { vram[16 * 32 + 1 + arg0] = arg4; } -void sub_81065DC(void) { +static void sub_81065DC(void) +{ s16 y, x; u16 *screen; @@ -147,3 +5130,2699 @@ void sub_81065DC(void) { } } } + +#if DEBUG +__attribute__((naked)) +void debug_sub_811B1C4() +{ + asm( + " ldr r1, .__1_\n" + " ldrb r0, [r1]\n" + " mov r3, #0x2\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__1_ + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x2\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__2_:\n" + " .align 2, 0\n" + ".__1_:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B1EC() +{ + asm( + " ldr r2, .__3\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " orr r0, r0, r1\n" + " strb r0, [r2]\n" + " ldr r2, .__3 + 4\n" + " ldrb r0, [r2]\n" + " mov r1, #0x1\n" + " eor r0, r0, r1\n" + " neg r0, r0\n" + " lsr r0, r0, #0x1f\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__4:\n" + " .align 2, 0\n" + ".__3:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B210() +{ + asm( + " ldr r1, .__5\n" + " ldrb r0, [r1]\n" + " mov r3, #0x4\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__5 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x4\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__6:\n" + " .align 2, 0\n" + ".__5:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B238() +{ + asm( + " ldr r1, .__7\n" + " ldrb r0, [r1]\n" + " mov r3, #0x8\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__7 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x8\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__8:\n" + " .align 2, 0\n" + ".__7:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B260() +{ + asm( + " ldr r1, .__9\n" + " ldrb r0, [r1]\n" + " mov r3, #0x10\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__9 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x10\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__10:\n" + " .align 2, 0\n" + ".__9:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B288() +{ + asm( + " ldr r1, .__11\n" + " ldrb r0, [r1]\n" + " mov r3, #0x40\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__11 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x40\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__12:\n" + " .align 2, 0\n" + ".__11:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2B0() +{ + asm( + " ldr r1, .__13\n" + " ldrb r0, [r1]\n" + " mov r3, #0x80\n" + " orr r0, r0, r3\n" + " strb r0, [r1]\n" + " ldr r2, .__13 + 4\n" + " ldrb r1, [r2]\n" + " mov r0, #0x80\n" + " eor r1, r1, r0\n" + " neg r0, r1\n" + " orr r0, r0, r1\n" + " asr r0, r0, #0x1f\n" + " and r0, r0, r3\n" + " strb r0, [r2]\n" + " bx lr\n" + ".__14:\n" + " .align 2, 0\n" + ".__13:\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2D8() +{ + asm( + " ldr r0, .__15\n" + " ldrb r1, [r0]\n" + " mov r2, #0x20\n" + " orr r1, r1, r2\n" + " strb r1, [r0]\n" + " bx lr\n" + ".__16:\n" + " .align 2, 0\n" + ".__15:\n" + " .word unk_debug_bss_1_3\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B2E8() +{ + asm( + " push {lr}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r0, .__17\n" + " ldrb r1, [r0, #0x1]\n" + " add r1, r1, #0x1\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x1\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x6\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " add sp, sp, #0x4\n" + " pop {r0}\n" + " bx r0\n" + ".__18:\n" + " .align 2, 0\n" + ".__17:\n" + " .word +0x2000000\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B310() +{ + asm( + " push {r4, lr}\n" + " add sp, sp, #0xfffffff8\n" + " ldr r0, .__21\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 8\n" + " mov r1, #0x1\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 12\n" + " mov r1, #0x1\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 16\n" + " mov r1, #0x1\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 20\n" + " mov r1, #0x1\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 24\n" + " mov r1, #0x1\n" + " mov r2, #0xd\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 28\n" + " mov r1, #0x1\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 32\n" + " mov r1, #0x1\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 36\n" + " mov r1, #0xf\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 40\n" + " mov r1, #0xf\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 44\n" + " mov r1, #0xf\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 48\n" + " mov r1, #0xf\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 52\n" + " mov r1, #0xf\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 56\n" + " mov r1, #0xf\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 60\n" + " mov r1, #0xf\n" + " mov r2, #0xd\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 64\n" + " mov r1, #0xf\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 68\n" + " mov r1, #0xf\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " ldr r0, .__21 + 72\n" + " ldrb r0, [r0, #0x3]\n" + " cmp r0, #0\n" + " bne .__19 @cond_branch\n" + " ldr r0, .__21 + 76\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " b .__20\n" + ".__22:\n" + " .align 2, 0\n" + ".__21:\n" + " .word Str_841B1C4\n" + " .word Str_841B1CB\n" + " .word Str_841B1D4\n" + " .word Str_841B1DB\n" + " .word Str_841B1E2\n" + " .word Str_841B1E8\n" + " .word Str_841B1F3\n" + " .word Str_841B202\n" + " .word Str_841B24C\n" + " .word Str_841B211\n" + " .word Str_841B219\n" + " .word Str_841B220\n" + " .word Str_841B227\n" + " .word Str_841B22E\n" + " .word Str_841B235\n" + " .word Str_841B23B\n" + " .word Str_841B23F\n" + " .word Str_841B243\n" + " .word +0x2000000\n" + " .word Str_841B246\n" + ".__19:\n" + " ldr r0, .__30\n" + " mov r1, #0xa\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + ".__20:\n" + " ldr r4, .__30 + 4\n" + " ldr r1, [r4, #0x68]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x6c]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " mov r0, #0x10\n" + " ldsh r1, [r4, r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0xa\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x70]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x74]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x5\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x78]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x7\n" + " bl Menu_PrintText\n" + " ldr r1, [r4, #0x7c]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x9\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x80\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xb\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x84\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xd\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x88\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " add r0, r4, #0\n" + " add r0, r0, #0x8c\n" + " ldr r1, [r0]\n" + " mov r0, sp\n" + " mov r2, #0x2\n" + " mov r3, #0x4\n" + " bl ConvertIntToDecimalStringN\n" + " mov r0, sp\n" + " mov r1, #0x14\n" + " mov r2, #0x11\n" + " bl Menu_PrintText\n" + " ldr r1, .__30 + 8\n" + " ldrb r0, [r1]\n" + " cmp r0, #0\n" + " beq .__23 @cond_branch\n" + " mov r2, #0x0\n" + " cmp r0, #0x8\n" + " beq .__24 @cond_branch\n" + " cmp r0, #0x8\n" + " bgt .__25 @cond_branch\n" + " cmp r0, #0x2\n" + " beq .__26 @cond_branch\n" + " cmp r0, #0x2\n" + " bgt .__27 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__28 @cond_branch\n" + " b .__45\n" + ".__31:\n" + " .align 2, 0\n" + ".__30:\n" + " .word Str_841B249\n" + " .word +0x2000000\n" + " .word unk_debug_bss_1_0\n" + ".__27:\n" + " cmp r0, #0x4\n" + " beq .__32 @cond_branch\n" + " b .__45\n" + ".__25:\n" + " cmp r0, #0x40\n" + " beq .__34 @cond_branch\n" + " cmp r0, #0x40\n" + " bgt .__35 @cond_branch\n" + " cmp r0, #0x10\n" + " beq .__36 @cond_branch\n" + " b .__45\n" + ".__35:\n" + " cmp r0, #0x80\n" + " beq .__38 @cond_branch\n" + " b .__45\n" + ".__26:\n" + " mov r2, #0x3\n" + " b .__45\n" + ".__28:\n" + " mov r2, #0x5\n" + " b .__45\n" + ".__32:\n" + " mov r2, #0x7\n" + " b .__45\n" + ".__24:\n" + " mov r2, #0x9\n" + " b .__45\n" + ".__36:\n" + " mov r2, #0xb\n" + " b .__45\n" + ".__34:\n" + " mov r2, #0xd\n" + " b .__45\n" + ".__38:\n" + " mov r2, #0xf\n" + ".__45:\n" + " ldr r0, .__46\n" + " mov r1, #0x17\n" + " bl Menu_PrintText\n" + ".__23:\n" + " bl debug_sub_811B2E8\n" + " add sp, sp, #0x8\n" + " pop {r4}\n" + " pop {r0}\n" + " bx r0\n" + ".__47:\n" + " .align 2, 0\n" + ".__46:\n" + " .word Str_841B26D\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B5B4() +{ + asm( + " push {lr}\n" + " add r2, r0, #0\n" + " ldr r0, [r2]\n" + " add r0, r0, r1\n" + " str r0, [r2]\n" + " ldr r1, .__49\n" + " cmp r0, r1\n" + " ble .__48 @cond_branch\n" + " str r1, [r2]\n" + ".__48:\n" + " pop {r0}\n" + " bx r0\n" + ".__50:\n" + " .align 2, 0\n" + ".__49:\n" + " .word 0x270f\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B5D0() +{ + asm( + " ldr r0, .__51\n" + " mov r1, #0x0\n" + " strb r1, [r0]\n" + " ldr r0, .__51 + 4\n" + " strb r1, [r0]\n" + " ldr r0, .__51 + 8\n" + " strb r1, [r0]\n" + " ldr r0, .__51 + 12\n" + " strb r1, [r0]\n" + " ldr r2, .__51 + 16\n" + " mov r0, #0x0\n" + " str r0, [r2, #0x68]\n" + " str r0, [r2, #0x6c]\n" + " str r0, [r2, #0x70]\n" + " str r0, [r2, #0x74]\n" + " str r0, [r2, #0x78]\n" + " str r0, [r2, #0x7c]\n" + " add r1, r2, #0\n" + " add r1, r1, #0x80\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " add r1, r1, #0x4\n" + " str r0, [r1]\n" + " bx lr\n" + ".__52:\n" + " .align 2, 0\n" + ".__51:\n" + " .word unk_debug_bss_1_0\n" + " .word unk_debug_bss_1_2\n" + " .word unk_debug_bss_1_3\n" + " .word unk_debug_bss_1_4\n" + " .word +0x2000000\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B620() +{ + asm( + " push {lr}\n" + " ldr r0, .__53\n" + " mov r1, #0x0\n" + " bl CreateTask\n" + " pop {r0}\n" + " bx r0\n" + ".__54:\n" + " .align 2, 0\n" + ".__53:\n" + " .word debug_sub_811B654+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B634() +{ + asm( + " push {lr}\n" + " ldr r0, .__57\n" + " bl FindTaskIdByFunc\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0xff\n" + " beq .__55 @cond_branch\n" + " mov r0, #0x0\n" + " b .__56\n" + ".__58:\n" + " .align 2, 0\n" + ".__57:\n" + " .word debug_sub_811B654+1\n" + ".__55:\n" + " mov r0, #0x1\n" + ".__56:\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B654() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " add sp, sp, #0xfffffff8\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " lsl r0, r6, #0x2\n" + " add r0, r0, r6\n" + " lsl r0, r0, #0x3\n" + " ldr r1, .__63\n" + " add r5, r0, r1\n" + " mov r0, #0x8\n" + " ldsh r1, [r5, r0]\n" + " cmp r1, #0x1\n" + " beq .__59 @cond_branch\n" + " cmp r1, #0x1\n" + " bgt .__60 @cond_branch\n" + " cmp r1, #0\n" + " beq .__61 @cond_branch\n" + " b .__116\n" + ".__64:\n" + " .align 2, 0\n" + ".__63:\n" + " .word gTasks\n" + ".__60:\n" + " cmp r1, #0x2\n" + " bne .__65 @cond_branch\n" + " b .__66\n" + ".__65:\n" + " cmp r1, #0x3\n" + " bne .__67 @cond_branch\n" + " b .__68\n" + ".__67:\n" + " b .__116\n" + ".__61:\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x18\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " bl debug_sub_811B310\n" + " ldrh r0, [r5, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5, #0x8]\n" + " b .__116\n" + ".__59:\n" + " ldr r7, .__76\n" + " ldrh r2, [r7, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq .__71 @cond_branch\n" + " b .__94\n" + ".__71:\n" + " mov r0, #0x20\n" + " and r0, r0, r2\n" + " lsl r0, r0, #0x10\n" + " lsr r3, r0, #0x10\n" + " cmp r3, #0\n" + " beq .__73 @cond_branch\n" + " ldr r1, .__76 + 4\n" + " ldrb r0, [r1, #0x1]\n" + " sub r0, r0, #0x1\n" + " strb r0, [r1, #0x1]\n" + " lsl r0, r0, #0x18\n" + " cmp r0, #0\n" + " bge .__79 @cond_branch\n" + " mov r0, #0x5\n" + " strb r0, [r1, #0x1]\n" + " b .__79\n" + ".__77:\n" + " .align 2, 0\n" + ".__76:\n" + " .word gMain\n" + " .word +0x2000000\n" + ".__73:\n" + " mov r0, #0x10\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq .__78 @cond_branch\n" + " ldr r1, .__81\n" + " ldrb r0, [r1, #0x1]\n" + " add r0, r0, #0x1\n" + " strb r0, [r1, #0x1]\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r0, #0x5\n" + " bls .__79 @cond_branch\n" + " strb r3, [r1, #0x1]\n" + ".__79:\n" + " bl debug_sub_811B2E8\n" + " b .__116\n" + ".__82:\n" + " .align 2, 0\n" + ".__81:\n" + " .word +0x2000000\n" + ".__78:\n" + " and r1, r1, r2\n" + " lsl r0, r1, #0x10\n" + " lsr r4, r0, #0x10\n" + " cmp r4, #0\n" + " beq .__83 @cond_branch\n" + " mov r0, #0x3\n" + " strh r0, [r5, #0x8]\n" + " bl Menu_EraseScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0x9\n" + " mov r3, #0x5\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, .__85\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r0, .__85 + 4\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " bl Menu_PrintText\n" + " b .__116\n" + ".__86:\n" + " .align 2, 0\n" + ".__85:\n" + " .word Str_841B25C\n" + " .word Str_841B264\n" + ".__83:\n" + " mov r0, #0x4\n" + " and r0, r0, r2\n" + " cmp r0, #0\n" + " beq .__87 @cond_branch\n" + " ldr r0, .__91\n" + " strb r4, [r0]\n" + " ldr r0, .__91 + 4\n" + " strb r4, [r0]\n" + " bl Menu_EraseScreen\n" + " mov r0, #0x0\n" + " mov r1, #0x0\n" + " mov r2, #0xa\n" + " mov r3, #0x13\n" + " bl Menu_DrawStdWindowFrame\n" + " ldr r0, .__91 + 8\n" + " mov r1, #0x1\n" + " mov r2, #0x1\n" + " bl Menu_PrintText\n" + " ldr r3, .__91 + 12\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " mov r2, #0x8\n" + " bl Menu_PrintItems\n" + " str r4, [sp]\n" + " mov r0, #0x9\n" + " str r0, [sp, #0x4]\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " mov r2, #0x3\n" + " mov r3, #0x8\n" + " bl InitMenu\n" + " ldrh r0, [r5, #0x8]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5, #0x8]\n" + ".__87:\n" + " ldrh r1, [r7, #0x2e]\n" + " mov r0, #0x8\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " bne .__88 @cond_branch\n" + " b .__116\n" + ".__88:\n" + " ldr r1, .__91 + 16\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " b .__94\n" + ".__92:\n" + " .align 2, 0\n" + ".__91:\n" + " .word unk_debug_bss_1_2\n" + " .word unk_debug_bss_1_3\n" + " .word Str_841B254\n" + " .word _841B270\n" + " .word unk_debug_bss_1_4\n" + ".__66:\n" + " bl Menu_ProcessInput\n" + " lsl r0, r0, #0x18\n" + " asr r2, r0, #0x18\n" + " mov r0, #0x2\n" + " neg r0, r0\n" + " cmp r2, r0\n" + " beq .__116 @cond_branch\n" + " add r0, r0, #0x1\n" + " cmp r2, r0\n" + " beq .__94 @cond_branch\n" + " ldr r1, .__96\n" + " mov r0, #0x1\n" + " strb r0, [r1]\n" + " ldr r0, .__96 + 4\n" + " lsl r1, r2, #0x3\n" + " add r0, r0, #0x4\n" + " add r1, r1, r0\n" + " ldr r0, [r1]\n" + " bl _call_via_r0\n" + ".__94:\n" + " bl Menu_EraseScreen\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + " b .__116\n" + ".__97:\n" + " .align 2, 0\n" + ".__96:\n" + " .word unk_debug_bss_1_2\n" + " .word _841B270\n" + ".__68:\n" + " ldr r2, .__100\n" + " ldrh r1, [r2, #0x30]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__98 @cond_branch\n" + " ldr r2, .__100 + 4\n" + " ldrh r0, [r2, #0xc]\n" + " add r0, r0, #0x64\n" + " b .__99\n" + ".__101:\n" + " .align 2, 0\n" + ".__100:\n" + " .word gMain\n" + " .word +0x2000000\n" + ".__98:\n" + " mov r0, #0x40\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__102 @cond_branch\n" + " ldr r1, .__104\n" + " ldrh r0, [r1, #0xc]\n" + " sub r0, r0, #0x64\n" + " b .__103\n" + ".__105:\n" + " .align 2, 0\n" + ".__104:\n" + " .word +0x2000000\n" + ".__102:\n" + " mov r0, #0x20\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__106 @cond_branch\n" + " ldr r1, .__109\n" + " ldr r2, .__109 + 4\n" + " add r0, r2, #0\n" + " ldrh r2, [r1, #0xc]\n" + " add r0, r0, r2\n" + ".__103:\n" + " strh r0, [r1, #0xc]\n" + " lsl r0, r0, #0x10\n" + " cmp r0, #0\n" + " bgt .__116 @cond_branch\n" + " ldr r0, .__109 + 8\n" + " strh r0, [r1, #0xc]\n" + " b .__116\n" + ".__110:\n" + " .align 2, 0\n" + ".__109:\n" + " .word +0x2000000\n" + " .word 0xfffffc18\n" + " .word 0x270f\n" + ".__106:\n" + " mov r0, #0x10\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__111 @cond_branch\n" + " ldr r2, .__114\n" + " mov r1, #0xfa\n" + " lsl r1, r1, #0x2\n" + " add r0, r1, #0\n" + " ldrh r1, [r2, #0xc]\n" + " add r0, r0, r1\n" + ".__99:\n" + " strh r0, [r2, #0xc]\n" + " lsl r0, r0, #0x10\n" + " asr r0, r0, #0x10\n" + " ldr r1, .__114 + 4\n" + " cmp r0, r1\n" + " ble .__116 @cond_branch\n" + " strh r1, [r2, #0xc]\n" + " b .__116\n" + ".__115:\n" + " .align 2, 0\n" + ".__114:\n" + " .word +0x2000000\n" + " .word 0x270f\n" + ".__111:\n" + " ldrh r1, [r2, #0x2e]\n" + " mov r0, #0x2\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__116 @cond_branch\n" + " bl Menu_EraseScreen\n" + " add r0, r6, #0\n" + " bl DestroyTask\n" + ".__116:\n" + " add sp, sp, #0x8\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_811B894() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " add sp, sp, #0xfffffffc\n" + " ldr r1, .__122\n" + " ldrh r2, [r1, #0x8]\n" + " mov r0, #0xc0\n" + " lsl r0, r0, #0x1\n" + " and r0, r0, r2\n" + " add r4, r1, #0\n" + " cmp r0, #0\n" + " beq .__117 @cond_branch\n" + " add r1, r1, #0x90\n" + " ldr r0, [r1]\n" + " add r0, r0, #0x1\n" + " str r0, [r1]\n" + " ldr r2, .__122 + 4\n" + " cmp r0, r2\n" + " ble .__118 @cond_branch\n" + " str r2, [r1]\n" + ".__118:\n" + " add r0, r4, #0\n" + " add r0, r0, #0x88\n" + " ldr r1, [r1]\n" + " ldr r0, [r0]\n" + " cmp r1, r0\n" + " beq .__119 @cond_branch\n" + " ldr r0, .__122 + 8\n" + " mov r1, #0x4\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + " ldr r1, .__122 + 12\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + ".__119:\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " cmp r4, #0\n" + " bne .__126 @cond_branch\n" + " ldr r0, .__122 + 16\n" + " mov r1, #0x4\n" + " mov r2, #0x11\n" + " b .__121\n" + ".__123:\n" + " .align 2, 0\n" + ".__122:\n" + " .word +0x2000000\n" + " .word 0x270f\n" + " .word Str_841B2B0\n" + " .word unk_debug_bss_1_4\n" + " .word Str_841B2D3\n" + ".__117:\n" + " lsl r0, r2, #0x10\n" + " cmp r0, #0\n" + " beq .__127 @cond_branch\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__126 @cond_branch\n" + " mov r4, #0x3\n" + " and r4, r4, r2\n" + " cmp r4, #0\n" + " bne .__126 @cond_branch\n" + " ldr r0, .__163\n" + " mov r1, #0x4\n" + " mov r2, #0x2\n" + ".__121:\n" + " bl Menu_PrintText\n" + " ldr r0, .__163 + 4\n" + " strb r4, [r0]\n" + ".__126:\n" + " ldr r0, .__163 + 8\n" + " ldrh r1, [r0, #0x8]\n" + " add r4, r0, #0\n" + " cmp r1, #0\n" + " beq .__127 @cond_branch\n" + " b .__162\n" + ".__127:\n" + " mov r1, #0x12\n" + " ldsh r0, [r4, r1]\n" + " cmp r0, #0x3\n" + " beq .__129 @cond_branch\n" + " b .__162\n" + ".__129:\n" + " ldrb r1, [r4, #0x4]\n" + " mov r0, #0x80\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq .__131 @cond_branch\n" + " b .__162\n" + ".__131:\n" + " mov r0, #0x0\n" + " mov r1, #0x1\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r7, r0, #0x18\n" + " mov r0, #0x0\n" + " mov r1, #0x2\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " str r0, [sp]\n" + " mov r0, #0x0\n" + " mov r1, #0x3\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r6, r0, #0x18\n" + " mov r0, #0x1\n" + " mov r1, #0x1\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r9, r0\n" + " mov r0, #0x1\n" + " mov r1, #0x2\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " mov r0, #0x1\n" + " mov r1, #0x3\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov sl, r0\n" + " mov r0, #0x2\n" + " mov r1, #0x1\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r5, r0, #0x18\n" + " mov r0, #0x2\n" + " mov r1, #0x2\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " mov r8, r0\n" + " mov r0, #0x2\n" + " mov r1, #0x3\n" + " bl GetTagOfReelSymbolOnScreenAtPos\n" + " lsl r0, r0, #0x18\n" + " lsr r0, r0, #0x18\n" + " cmp r7, #0\n" + " bne .__134 @cond_branch\n" + " mov r1, r9\n" + " cmp r1, #0x1\n" + " bne .__134 @cond_branch\n" + " cmp r5, #0\n" + " beq .__159 @cond_branch\n" + ".__134:\n" + " ldr r1, [sp]\n" + " cmp r1, #0\n" + " bne .__137 @cond_branch\n" + " cmp r4, #0x1\n" + " bne .__137 @cond_branch\n" + " mov r1, r8\n" + " cmp r1, #0\n" + " beq .__159 @cond_branch\n" + ".__137:\n" + " cmp r6, #0\n" + " bne .__140 @cond_branch\n" + " mov r1, sl\n" + " cmp r1, #0x1\n" + " bne .__140 @cond_branch\n" + " cmp r0, #0\n" + " beq .__159 @cond_branch\n" + ".__140:\n" + " cmp r7, #0\n" + " bne .__143 @cond_branch\n" + " cmp r4, #0x1\n" + " bne .__143 @cond_branch\n" + " cmp r0, #0\n" + " beq .__159 @cond_branch\n" + ".__143:\n" + " cmp r6, #0\n" + " bne .__146 @cond_branch\n" + " cmp r4, #0x1\n" + " bne .__146 @cond_branch\n" + " cmp r5, #0\n" + " beq .__159 @cond_branch\n" + ".__146:\n" + " cmp r7, #0x1\n" + " bne .__149 @cond_branch\n" + " mov r1, r9\n" + " cmp r1, #0\n" + " bne .__149 @cond_branch\n" + " cmp r5, #0x1\n" + " beq .__159 @cond_branch\n" + ".__149:\n" + " ldr r1, [sp]\n" + " cmp r1, #0x1\n" + " bne .__152 @cond_branch\n" + " cmp r4, #0\n" + " bne .__152 @cond_branch\n" + " mov r1, r8\n" + " cmp r1, #0x1\n" + " beq .__159 @cond_branch\n" + ".__152:\n" + " cmp r6, #0x1\n" + " bne .__155 @cond_branch\n" + " mov r1, sl\n" + " cmp r1, #0\n" + " bne .__155 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__159 @cond_branch\n" + ".__155:\n" + " cmp r7, #0x1\n" + " bne .__158 @cond_branch\n" + " cmp r4, #0\n" + " bne .__158 @cond_branch\n" + " cmp r0, #0x1\n" + " beq .__159 @cond_branch\n" + ".__158:\n" + " cmp r6, #0x1\n" + " bne .__162 @cond_branch\n" + " cmp r4, #0\n" + " bne .__162 @cond_branch\n" + " cmp r5, #0x1\n" + " bne .__162 @cond_branch\n" + ".__159:\n" + " ldr r0, .__163 + 12\n" + " mov r1, #0x4\n" + " mov r2, #0x0\n" + " bl Menu_PrintText\n" + " ldr r1, .__163 + 4\n" + " mov r0, #0x0\n" + " strb r0, [r1]\n" + ".__162:\n" + " add sp, sp, #0x4\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + ".__164:\n" + " .align 2, 0\n" + ".__163:\n" + " .word Str_841B2E4\n" + " .word unk_debug_bss_1_4\n" + " .word +0x2000000\n" + " .word Str_841B2BF\n" + "\n" + ); +} +#endif + +static const u8 sReelSymbols[][21] = +{ + { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY + }, { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_CHERRY + }, { + SLOT_MACHINE_TAG_7_RED, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_7_BLUE, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_AZURILL, + SLOT_MACHINE_TAG_POWER, + SLOT_MACHINE_TAG_REPLAY, + SLOT_MACHINE_TAG_LOTAD, + SLOT_MACHINE_TAG_CHERRY + } +}; + +static const u8 gUnknown_083ECCF1[] = { + 1, 0, 5, 4, 3, 2 +}; + +static const s16 gUnknown_083ECCF8[][2] = { + {0, 6}, + {0, 10}, + {0, 2} +}; + +static const u8 gUnknown_083ECD04[][3] = { + {1, 1, 12}, + {1, 1, 14}, + {2, 2, 14}, + {2, 2, 14}, + {2, 3, 16}, + {3, 3, 16} +}; + +static const u8 gUnknown_083ECD16[][6] = { + {25, 25, 30, 40, 40, 50}, + {25, 25, 30, 30, 35, 35}, + {25, 25, 30, 25, 25, 30} +}; + +static const u8 gUnknown_083ECD28[][6] = { + {20, 25, 25, 20, 25, 25}, + {12, 15, 15, 18, 19, 22}, + {25, 25, 25, 30, 30, 40}, + {25, 25, 20, 20, 15, 15}, + {40, 40, 35, 35, 40, 40} +}; + +static const u8 gUnknown_083ECD46[][17] = { + {243, 243, 243, 80, 80, 80, 80, 40, 40, 40, 40, 40, 40, 5, 5, 5, 5}, + { 5, 5, 5, 150, 150, 150, 150, 130, 130, 130, 130, 130, 130, 100, 100, 100, 5}, + { 4, 4, 4, 20, 20, 20, 20, 80, 80, 80, 80, 80, 80, 100, 100, 100, 40}, + { 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 45, 45, 45, 100}, + { 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6} +}; + +static const u8 gUnknown_083ECDAC[][17] = { + { 243, 243, 243, 200, 200, 200, 200, 160, 160, 160, 160, 160, 160, 70, 70, 70, 5}, + { 5, 5, 5, 25, 25, 25, 25, 5, 5, 5, 5, 5, 5, 2, 2, 2, 6}, + { 4, 4, 4, 25, 25, 25, 25, 30, 30, 30, 30, 30, 30, 40, 40, 40, 35}, + { 2, 2, 2, 3, 3, 3, 3, 30, 30, 30, 30, 30, 30, 100, 100, 100, 50}, + { 1, 1, 1, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 40, 40, 40, 100}, + { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 60} +}; + +static const u16 gUnknown_083ECE12[] = { + 0x80, 0xaf, 0xc8, 0xe1, 0x100 +}; + +static const u16 gUnknown_083ECE1C[][2] = { + {10, 5}, + {10, 10}, + {10, 15}, + {10, 25}, + {10, 35} +}; + +static const u16 gUnknown_083ECE30[] = { + 0, 5, 10, 15, 20 +}; + + +static const u8 gUnknown_083ECE3A[] = { + 6, 4, 3, 2, 5, 0, 0, 0 +}; + +static const u16 gUnknown_083ECE42[] = { + 0x80, 0x20, 0x40 +}; + +static const u16 gUnknown_083ECE48[] = { + 0x10, 0x08, 0x04, 0x02, 0x01 +}; + +static const u8 sSym2Match[] = { + SLOT_MACHINE_MATCHED_777_RED, + SLOT_MACHINE_MATCHED_777_BLUE, + SLOT_MACHINE_MATCHED_AZURILL, + SLOT_MACHINE_MATCHED_LOTAD, + SLOT_MACHINE_MATCHED_1CHERRY, + SLOT_MACHINE_MATCHED_POWER, + SLOT_MACHINE_MATCHED_REPLAY +}; + +static const u16 sSlotMatchFlags[] = { + 1 << SLOT_MACHINE_MATCHED_1CHERRY, + 1 << SLOT_MACHINE_MATCHED_2CHERRY, + 1 << SLOT_MACHINE_MATCHED_REPLAY, + 1 << SLOT_MACHINE_MATCHED_LOTAD, + 1 << SLOT_MACHINE_MATCHED_AZURILL, + 1 << SLOT_MACHINE_MATCHED_POWER, + 1 << SLOT_MACHINE_MATCHED_777_MIXED, + 1 << SLOT_MACHINE_MATCHED_777_RED, + 1 << SLOT_MACHINE_MATCHED_777_BLUE +}; + +static const u16 sSlotPayouts[] = { + 2, 4, 0, 6, 12, 3, 90, 300, 300 +}; + +static const s16 gUnknown_083ECE7E[][2] = { + { 0xd0, 0x38}, + { 0xb8, 0x00}, + { 0xc8, 0x08}, + { 0xd8, 0x10}, + { 0xe8, 0x18}, + { 0xd0, 0x48}, + { 0xd0, 0x08}, + { 0xd0, 0x40}, + { 0xd0, 0x38}, + { 0xc0, 0x58}, + { 0xe0, 0x58}, + { 0xc0, 0x78}, + { 0xe0, 0x78}, + { 0x90, 0x38}, + {0x110, 0x58}, + { 0xa8, 0x70}, + { 0xd0, 0x54}, + { 0xd0, 0x70}, + { 0xbc, 0x34}, + { 0xd0, 0x34}, + { 0xe4, 0x34}, + { 0xb8, 0x48}, + { 0xc4, 0x48}, + { 0xd0, 0x48}, + { 0xdc, 0x48}, + { 0xe8, 0x48}, + { 0xbc, 0x34}, + { 0xd0, 0x34}, + { 0xe4, 0x34}, + { 0xb8, 0x48}, + { 0xc4, 0x48}, + { 0xd0, 0x48}, + { 0xdc, 0x48}, + { 0xe8, 0x48}, + { 0x00, 0x00} +}; + +static const SpriteCallback gUnknown_083ECF0C[] = { + sub_8105C64, + sub_8105F54, + sub_8105F54, + sub_8105F54, + sub_8105F54, + sub_8105F9C, + sub_8105EB4, + sub_8105C64, + sub_8105C64, + sub_8105C6C, + sub_8105CF0, + sub_8105D08, + sub_8105D20, + sub_8105D3C, + sub_8105DA4, + sub_8105E08, + sub_8105C64, + sub_8106058, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81060FC, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_81061C8, + sub_8106230 +}; + +static const struct UnkStruct1 Unknown_83ECF98[] = { + {25, 34, 0}, + {2, 0, 0}, + {9, 16, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFA8[] = { + {10, 1, 0}, + {11, 2, 0}, + {12, 3, 0}, + {13, 4, 0}, + {5, 5, 0}, + {8, 6, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFC4[] = { + {3, 7, 0}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFD0[] = { + {4, 8, 0}, + {6, 9, 0}, + {6, 10, 1}, + {6, 11, 2}, + {6, 12, 3}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFE8[] = { + {0, 13, 0}, + {1, 14, 0}, + {7, 15, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ECFF8[] = { + {19, 26, 0}, + {20, 27, 1}, + {21, 28, 2}, + {14, 29, 3}, + {15, 30, 4}, + {16, 31, 5}, + {17, 32, 6}, + {18, 33, 7}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 Unknown_83ED020[] = { + {22, 18, 0}, + {23, 19, 1}, + {24, 20, 2}, + {14, 21, 3}, + {15, 22, 4}, + {16, 23, 5}, + {17, 24, 6}, + {18, 25, 7}, + {8, 17, 0}, + {255, 0, 0} +}; + +static const struct UnkStruct1 *const gUnknown_083ED048[] = { + Unknown_83ECF98, + Unknown_83ECFA8, + Unknown_83ECFC4, + Unknown_83ECFD0, + Unknown_83ECFE8, + Unknown_83ED020, + Unknown_83ECFF8 +}; + +static void (*const gUnknown_083ED064[])(void) = { + sub_810639C, + sub_8106364, + sub_8106370, + nullsub_70, + nullsub_70, + sub_8106370, + sub_8106370 +}; + + +static const struct OamData gOamData_83ED080 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 0, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED088 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 0, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED090 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 1, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED098 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 2, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0A0 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 2, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0A8 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_V_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0B0 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_H_RECTANGLE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct OamData gOamData_83ED0B8 = { + .y = 0x0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = ST_OAM_SQUARE, + .x = 0x0, + .matrixNum = 0, + .size = 3, + .tileNum = 0x0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0 +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0C0[] = { + {eSlotMachineReelTimeGfxBuffer + 0x0000, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x0800, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x1000, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x1800, 0x800}, + {eSlotMachineReelTimeGfxBuffer + 0x2000, 0x800} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0E8[] = { + {eSlotMachineReelTimeGfxBuffer + 0x2800, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0F0[] = { + {eSlotMachineReelTimeGfxBuffer + 0x2B00, 0x500} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED0F8[] = { + {eSlotMachineReelTimeGfxBuffer + 0x3000, 0x600} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED100[] = { + {gSpriteImage_8E988E8, 0x80}, + {gSpriteImage_8E98968, 0x80}, + {gSpriteImage_8E989E8, 0x80}, + {gSpriteImage_8E98A68, 0x80}, + {gSpriteImage_8E98AE8, 0x80}, + {gSpriteImage_8E98B68, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED130[] = { + {gSpriteImage_8E991E8, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED138[] = { + {gSpriteImage_8E99808, 0x40} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED140[] = { + {gSpriteImage_8E98BE8, 0x100}, + {gSpriteImage_8E98CE8, 0x100} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED150[] = { + {gSpriteImage_8E993E8, 0x400} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED158[] = { + {gSpriteImage_8E98DE8, 0x200}, + {gSpriteImage_8E98FE8, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED168[] = { + {gSpriteImage_8E98848, 0x20} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED170[] = { + {gSpriteImage_8E98868, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED178[] = { + {eSlotMachineGfxBuffer + 0x0000, 0x600} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED180[] = { + {eSlotMachineGfxBuffer + 0x0600, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED188[] = { + {eSlotMachineGfxBuffer + 0x0800, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED190[] = { + {eSlotMachineGfxBuffer + 0x0A00, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED198[] = { + {eSlotMachineGfxBuffer + 0x0C00, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1A0[] = { + {eSlotMachineGfxBuffer + 0x1000, 0x400} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1A8[] = { + {eSlotMachineGfxBuffer + 0x1400, 0x200} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1B0[] = { + {eSlotMachineGfxBuffer + 0x1600, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1B8[] = { + {eSlotMachineGfxBuffer + 0x1900, 0x300} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1C0[] = { + {eSlotMachineGfxBuffer + 0x1C00, 0x200}, + {eSlotMachineGfxBuffer + 0x1E00, 0x200}, + {eSlotMachineGfxBuffer + 0x1E00, 0x200} // is this a typo? +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1D8[] = { + {eSlotMachineGfxBuffer + 0x2000, 0x280} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED1E0[] = { + {eSlotMachineGfxBuffer + 0x2280, 0x80}, + {eSlotMachineGfxBuffer + 0x2300, 0x80}, + {eSlotMachineGfxBuffer + 0x2380, 0x80}, + {eSlotMachineGfxBuffer + 0x2400, 0x80}, + {eSlotMachineGfxBuffer + 0x2480, 0x80} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED208[] = { + {eSlotMachineGfxBuffer + 0x2600, 0x480}, + {eSlotMachineGfxBuffer + 0x2A80, 0x480} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED218[] = { + {eSlotMachineGfxBuffer + 0x2F00, 0x180}, + {eSlotMachineGfxBuffer + 0x3080, 0x180} +}; + +static const struct SpriteFrameImage gSpriteImageTable_83ED228[] = { + {gSpriteImage_8E98828, 0x20} +}; + +static const union AnimCmd gSpriteAnim_83ED230[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED238[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED240[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED248[] = { + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED254[] = { + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED260[] = { + ANIMCMD_FRAME(1, 4), + ANIMCMD_FRAME(0, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED26C[] = { + ANIMCMD_FRAME(2, 32), + ANIMCMD_FRAME(3, 32), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED278[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED280[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED288[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED290[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED298[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2A0[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2A8[] = { + ANIMCMD_FRAME(5, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2B0[] = { + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(1, 4), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2BC[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2C8[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2D4[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED2DC[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_FRAME(1, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2E8[] = { + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16), + ANIMCMD_FRAME(0, 16), + ANIMCMD_FRAME(1, 16, .hFlip = TRUE), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd gSpriteAnim_83ED2FC[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED304[] = { + ANIMCMD_FRAME(0, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED30C[] = { + ANIMCMD_FRAME(1, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED314[] = { + ANIMCMD_FRAME(2, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED31C[] = { + ANIMCMD_FRAME(3, 1), + ANIMCMD_END +}; + +static const union AnimCmd gSpriteAnim_83ED324[] = { + ANIMCMD_FRAME(4, 1), + ANIMCMD_END +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED32C[] = { + gSpriteAnim_83ED230 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED330[] = { + gSpriteAnim_83ED238 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED334[] = { + gSpriteAnim_83ED240, + gSpriteAnim_83ED248, + gSpriteAnim_83ED254, + gSpriteAnim_83ED260, + gSpriteAnim_83ED26C, + gSpriteAnim_83ED278 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED34C[] = { + gSpriteAnim_83ED280, + gSpriteAnim_83ED288, + gSpriteAnim_83ED290, + gSpriteAnim_83ED298, + gSpriteAnim_83ED2A0, + gSpriteAnim_83ED2A8 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED364[] = { + gSpriteAnim_83ED2B0 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED368[] = { + gSpriteAnim_83ED2BC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED36C[] = { + gSpriteAnim_83ED2C8, + gSpriteAnim_83ED2D4 +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED374[] = { + gSpriteAnim_83ED2DC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED378[] = { + gSpriteAnim_83ED2E8, + gSpriteAnim_83ED2FC +}; + +static const union AnimCmd *const gSpriteAnimTable_83ED380[] = { + gSpriteAnim_83ED304, + gSpriteAnim_83ED30C, + gSpriteAnim_83ED314, + gSpriteAnim_83ED31C, + gSpriteAnim_83ED324 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83ED394[] = { + AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), + AFFINEANIMCMD_LOOP(0), + AFFINEANIMCMD_FRAME(0x1, 0x1, 0, 1), + AFFINEANIMCMD_LOOP(255), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED3BC[] = { + gSpriteAffineAnim_83ED394 +}; + +static const union AffineAnimCmd gSpriteAffineAnim_83ED3C0[] = { + AFFINEANIMCMD_FRAME(0x0, 0x0, 8, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 6, 32), + AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 16), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_FRAME(0x0, 0x0, -12, 4), + AFFINEANIMCMD_FRAME(0x0, 0x0, 12, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const gSpriteAffineAnimTable_83ED410[] = { + gSpriteAffineAnim_83ED3C0 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED414 = { + 0, 0, &gOamData_83ED0A0, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_8104F18 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED42C = { + 7, 4, &gOamData_83ED088, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, sub_810506C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED444 = { + 17, 0, &gOamData_83ED0B8, gSpriteAnimTable_83ED32C, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED45C = { + 0xFFFF, 1, &gOamData_83ED0B8, gSpriteAnimTable_83ED334, gSpriteImageTable_83ED0C0, gDummySpriteAffineAnimTable, sub_8105170 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED474 = { + 0xFFFF, 2, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0E8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED48C = { + 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4A4 = { + 0xFFFF, 3, &gOamData_83ED088, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED0F8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4BC = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED34C, gSpriteImageTable_83ED100, gDummySpriteAffineAnimTable, sub_810535C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4D4 = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED130, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED4EC = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED138, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED504 = { + 0xFFFF, 4, &gOamData_83ED098, gSpriteAnimTable_83ED364, gSpriteImageTable_83ED140, gDummySpriteAffineAnimTable, sub_810562C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED51C = { + 0xFFFF, 7, &gOamData_83ED0A8, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED150, gDummySpriteAffineAnimTable, sub_8105784 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED534 = { + 0xFFFF, 5, &gOamData_83ED0A0, gSpriteAnimTable_83ED368, gSpriteImageTable_83ED158, gDummySpriteAffineAnimTable, sub_8105894 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED54C = { + 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED330, gSpriteImageTable_83ED168, gDummySpriteAffineAnimTable, sub_810594C +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED564 = { + 0xFFFF, 4, &gOamData_83ED090, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED170, gSpriteAffineAnimTable_83ED3BC, sub_8105A38 +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED57C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED178, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED594 = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED180, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5AC = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED188, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5C4 = { + 18, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED190, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5DC = { + 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED198, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED5F4 = { + 0xFFFF, 6, &gOamData_83ED0B0, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED60C = { + 19, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1A8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED624 = { + 20, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED63C = { + 21, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1B8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED654 = { + 0xFFFF, 6, &gOamData_83ED0A0, gSpriteAnimTable_83ED36C, gSpriteImageTable_83ED1C0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED66C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED1D8, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED684 = { + 0xFFFF, 6, &gOamData_83ED090, gSpriteAnimTable_83ED380, gSpriteImageTable_83ED1E0, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED69C = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED378, gSpriteImageTable_83ED208, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED6B4 = { + 0xFFFF, 6, &gOamData_83ED080, gSpriteAnimTable_83ED374, gSpriteImageTable_83ED218, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +static const struct SpriteTemplate gSpriteTemplate_83ED6CC = { + 0xFFFF, 4, &gOamData_83ED080, gSpriteAnimTable_83ED32C, gSpriteImageTable_83ED228, gSpriteAffineAnimTable_83ED410, sub_8105B70 +}; + +static const struct Subsprite gSubspriteTable_83ED6E4[] = { + {-64, -64, ST_OAM_SQUARE, 3, 0x0, 3}, + {0, -64, ST_OAM_SQUARE, 3, 0x0, 3}, + {-64, 0, ST_OAM_SQUARE, 3, 0x0, 3}, + {0, 0, ST_OAM_SQUARE, 3, 0x0, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED704[] = { + {4, gSubspriteTable_83ED6E4} +}; + +static const struct Subsprite gSubspriteTable_83ED70C[] = { + {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, + {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, + {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, + {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 1}, + {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 1}, + {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED73C[] = { + {6, gSubspriteTable_83ED70C} +}; + +static const struct Subsprite gSubspriteTable_83ED744[] = { + {-32, -20, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, + {-32, 12, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, + {0, 12, ST_OAM_H_RECTANGLE, 1, 0x24, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED75C[] = { + {3, gSubspriteTable_83ED744} +}; + +static const struct Subsprite gSubspriteTable_83ED764[] = { + {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 1}, + {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 1}, + {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 1}, + {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 1}, + {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED78C[] = { + {5, gSubspriteTable_83ED764} +}; + +static const struct Subsprite gSubspriteTable_83ED794[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 1}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 1}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 1}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED7B4[] = { + {4, gSubspriteTable_83ED794} +}; + +static const struct Subsprite gSubspriteTable_83ED7BC[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0x0, 1}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x0, 1} +}; + +static const struct SubspriteTable gSubspriteTables_83ED7D4[] = { + {3, gSubspriteTable_83ED7BC} +}; + +static const struct Subsprite gSubspriteTable_83ED7DC[] = { + {-32, -24, ST_OAM_H_RECTANGLE, 3, 0x0, 3}, + {-32, 8, ST_OAM_H_RECTANGLE, 1, 0x20, 3}, + {0, 8, ST_OAM_H_RECTANGLE, 1, 0x24, 3}, + {-32, 16, ST_OAM_H_RECTANGLE, 1, 0x28, 3}, + {0, 16, ST_OAM_H_RECTANGLE, 1, 0x2c, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED804[] = { + {5, gSubspriteTable_83ED7DC} +}; + +static const struct Subsprite gSubspriteTable_83ED80C[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED82C[] = { + {4, gSubspriteTable_83ED80C} +}; + +static const struct Subsprite gSubspriteTable_83ED834[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED854[] = { + {4, gSubspriteTable_83ED834} +}; + +static const struct Subsprite gSubspriteTable_83ED85C[] = { + {-32, -8, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -8, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, 0, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, 0, ST_OAM_H_RECTANGLE, 1, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED87C[] = { + {4, gSubspriteTable_83ED85C} +}; + +static const struct Subsprite gSubspriteTable_83ED884[] = { + {-32, -12, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {0, -12, ST_OAM_H_RECTANGLE, 1, 0x4, 3}, + {-32, -4, ST_OAM_H_RECTANGLE, 1, 0x8, 3}, + {0, -4, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, + {-32, 4, ST_OAM_H_RECTANGLE, 1, 0x10, 3}, + {0, 4, ST_OAM_H_RECTANGLE, 1, 0x14, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED8B4[] = { + {6, gSubspriteTable_83ED884} +}; + +static const struct Subsprite gSubspriteTable_83ED8BC[] = { + {-16, -16, ST_OAM_SQUARE, 2, 0x0, 3} +}; + +static const struct Subsprite gSubspriteTable_83ED8C4[] = { + {-8, -8, ST_OAM_SQUARE, 1, 0x10, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED8CC[] = { + {1, gSubspriteTable_83ED8BC}, + {1, gSubspriteTable_83ED8C4} +}; + +static const struct Subsprite gSubspriteTable_83ED8DC[] = { + {-24, -24, ST_OAM_H_RECTANGLE, 1, 0x0, 3}, + {8, -24, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, + {-24, -16, ST_OAM_H_RECTANGLE, 1, 0x6, 3}, + {8, -16, ST_OAM_H_RECTANGLE, 0, 0xa, 3}, + {-24, -8, ST_OAM_H_RECTANGLE, 1, 0xc, 3}, + {8, -8, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {-24, 0, ST_OAM_H_RECTANGLE, 1, 0x12, 3}, + {8, 0, ST_OAM_H_RECTANGLE, 0, 0x16, 3}, + {-24, 8, ST_OAM_H_RECTANGLE, 1, 0x18, 3}, + {8, 8, ST_OAM_H_RECTANGLE, 0, 0x1c, 3}, + {-24, 16, ST_OAM_H_RECTANGLE, 1, 0x1e, 3}, + {8, 16, ST_OAM_H_RECTANGLE, 0, 0x22, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED93C[] = { + 12, gSubspriteTable_83ED8DC +}; + +static const struct Subsprite gSubspriteTable_83ED944[] = { + {-16, -12, ST_OAM_H_RECTANGLE, 2, 0x0, 3}, + {-16, 4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {0, 4, ST_OAM_H_RECTANGLE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED95C[] = { + {3, gSubspriteTable_83ED944} +}; + +static const struct Subsprite gSubspriteTable_83ED964[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED974[] = { + {2, gSubspriteTable_83ED964} +}; + +static const struct Subsprite gSubspriteTable_83ED97C[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x2, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED98C[] = { + {2, gSubspriteTable_83ED97C} +}; + +static const struct Subsprite gSubspriteTable_83ED994[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x4, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xc, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9A4[] = { + {2, gSubspriteTable_83ED994} +}; + +static const struct Subsprite gSubspriteTable_83ED9AC[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9BC[] = { + {2, gSubspriteTable_83ED9AC} +}; + +static const struct Subsprite gSubspriteTable_83ED9C4[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0x8, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9D4[] = { + {2, gSubspriteTable_83ED9C4} +}; + +static const struct Subsprite gSubspriteTable_83ED9DC[] = { + {-4, -8, ST_OAM_SQUARE, 0, 0x2, 3}, + {-4, 0, ST_OAM_SQUARE, 0, 0xa, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83ED9EC[] = { + {2, gSubspriteTable_83ED9DC} +}; + +static const struct Subsprite gSubspriteTable_83ED9F4[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xb, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA04[] = { + {2, gSubspriteTable_83ED9F4} +}; + +static const struct Subsprite gSubspriteTable_83EDA0C[] = { + {-4, -8, ST_OAM_SQUARE, 0, 0x5, 3}, + {-4, 0, ST_OAM_SQUARE, 0, 0xd, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA1C[] = { + {2, gSubspriteTable_83EDA0C} +}; + +static const struct Subsprite gSubspriteTable_83EDA24[] = { + {-8, -8, ST_OAM_H_RECTANGLE, 0, 0x6, 3}, + {-8, 0, ST_OAM_H_RECTANGLE, 0, 0xe, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA34[] = { + {2, gSubspriteTable_83EDA24} +}; + +static const struct Subsprite gSubspriteTable_83EDA3C[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA6C[] = { + {6, gSubspriteTable_83EDA3C} +}; + +static const struct Subsprite gSubspriteTable_83EDA74[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDA8C[] = { + {3, gSubspriteTable_83EDA74} +}; + +static const struct Subsprite gSubspriteTable_83EDA94[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDAC4[] = { + {6, gSubspriteTable_83EDA94} +}; + +static const struct Subsprite gSubspriteTable_83EDACC[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x0, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x2, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0x8, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xa, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x10, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x12, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDAFC[] = { + {6, gSubspriteTable_83EDACC} +}; + +static const struct Subsprite gSubspriteTable_83EDB04[] = { + {-8, -12, ST_OAM_H_RECTANGLE, 0, 0x3, 3}, + {-8, -4, ST_OAM_H_RECTANGLE, 0, 0xb, 3}, + {-8, 4, ST_OAM_H_RECTANGLE, 0, 0x13, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDB1C[] = { + {3, gSubspriteTable_83EDB04} +}; + +static const struct Subsprite gSubspriteTable_83EDB24[] = { + {-12, -12, ST_OAM_H_RECTANGLE, 0, 0x5, 3}, + {4, -12, ST_OAM_SQUARE, 0, 0x7, 3}, + {-12, -4, ST_OAM_H_RECTANGLE, 0, 0xd, 3}, + {4, -4, ST_OAM_SQUARE, 0, 0xf, 3}, + {-12, 4, ST_OAM_H_RECTANGLE, 0, 0x15, 3}, + {4, 4, ST_OAM_SQUARE, 0, 0x17, 3} +}; + +static const struct SubspriteTable gSubspriteTables_83EDB54[] = { + {6, gSubspriteTable_83EDB24} +}; + +static const struct SpriteTemplate *const gUnknown_083EDB5C[] = { + &gSpriteTemplate_83ED57C, + &gSpriteTemplate_83ED594, + &gSpriteTemplate_83ED5AC, + &gSpriteTemplate_83ED5DC, + &gSpriteTemplate_83ED5F4, + &gSpriteTemplate_83ED654, + &gSpriteTemplate_83ED66C, + &gSpriteTemplate_83ED684, + &gSpriteTemplate_83ED69C, + &gSpriteTemplate_83ED6B4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED5C4, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED60C, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED624, + &gSpriteTemplate_83ED63C, + &gSpriteTemplate_83ED63C, + &gSpriteTemplate_83ED63C, + &gDummySpriteTemplate +}; + +static const struct SubspriteTable *const gUnknown_083EDBC4[] = { + gSubspriteTables_83ED804, + gSubspriteTables_83ED82C, + gSubspriteTables_83ED854, + gSubspriteTables_83ED8B4, + NULL, + NULL, + gSubspriteTables_83ED8CC, + NULL, + gSubspriteTables_83ED93C, + gSubspriteTables_83ED95C, + gSubspriteTables_83ED974, + gSubspriteTables_83ED98C, + gSubspriteTables_83ED9A4, + gSubspriteTables_83ED9BC, + gSubspriteTables_83ED9D4, + gSubspriteTables_83ED9EC, + gSubspriteTables_83EDA04, + gSubspriteTables_83EDA1C, + gSubspriteTables_83EDA34, + gSubspriteTables_83EDA6C, + gSubspriteTables_83EDA8C, + gSubspriteTables_83EDAC4, + gSubspriteTables_83EDAFC, + gSubspriteTables_83EDB1C, + gSubspriteTables_83EDB54, + NULL +}; + +static const struct SpriteSheet sSlotMachineSpriteSheets[] = { + {gSlotMachineReelSymbol1Tiles, 0x200, 0}, + {gSlotMachineReelSymbol2Tiles, 0x200, 1}, + {gSlotMachineReelSymbol3Tiles, 0x200, 2}, + {gSlotMachineReelSymbol4Tiles, 0x200, 3}, + {gSlotMachineReelSymbol5Tiles, 0x200, 4}, + {gSlotMachineReelSymbol6Tiles, 0x200, 5}, + {gSlotMachineReelSymbol7Tiles, 0x200, 6}, + {gSlotMachineNumber0Tiles, 0x40, 7}, + {gSlotMachineNumber1Tiles, 0x40, 8}, + {gSlotMachineNumber2Tiles, 0x40, 9}, + {gSlotMachineNumber3Tiles, 0x40, 10}, + {gSlotMachineNumber4Tiles, 0x40, 11}, + {gSlotMachineNumber5Tiles, 0x40, 12}, + {gSlotMachineNumber6Tiles, 0x40, 13}, + {gSlotMachineNumber7Tiles, 0x40, 14}, + {gSlotMachineNumber8Tiles, 0x40, 15}, + {gSlotMachineNumber9Tiles, 0x40, 16}, + {eSlotMachineGfxBuffer + 0x0A00, 0x200, 18}, + {eSlotMachineGfxBuffer + 0x1400, 0x200, 19}, + {eSlotMachineGfxBuffer + 0x1600, 0x300, 20}, + {eSlotMachineGfxBuffer + 0x1900, 0x300, 21}, + {} +}; + +static const struct SpriteSheet gUnknown_083EDCDC = { + eSlotMachineGfxBuffer + 0x0000, 0x800, 17 +}; + +static const u8 *const gUnknown_083EDCE4 = gUnknownPalette_08E997E8; + +#ifdef SAPPHIRE +static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/sapphire_83EDD40.gbapal"); +#elif defined(RUBY) +static const u16 UnknownPalette_83EDCE8[] = INCBIN_U16("graphics/unknown/ruby_83EDCE8.gbapal"); +#endif // RS + +static const u16 *const gUnknown_083EDD08[] = { + UnknownPalette_83EDCE8 + 10, + UnknownPalette_83EDCE8 + 11, + UnknownPalette_83EDCE8 + 12, + UnknownPalette_83EDCE8 + 13, + UnknownPalette_83EDCE8 + 14 +}; + +static const u16 *const gUnknown_083EDD1C[] = { + gUnknown_08E95A18 + 74, + gUnknown_08E95A18 + 75, + gUnknown_08E95A18 + 76, + gUnknown_08E95A18 + 77, + gUnknown_08E95A18 + 78 +}; + +static const u8 gUnknown_083EDD30[] = { + 0x4a, 0x4b, 0x4c, 0x4e, 0x4d +}; + +static const u8 gUnknown_083EDD35[][2] = { + {0, 0}, + {1, 2}, + {3, 4} +}; +static const u8 gUnknown_083EDD3B[] = {1, 2, 2}; + +#ifdef SAPPHIRE +static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/sapphire_83EDD96.gbapal"); +static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDB6.gbapal"); +static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/sapphire_83EDDD6.gbapal"); +#elif defined (RUBY) +static const u16 Unknown_83EDD3E[] = INCBIN_U16("graphics/unknown/ruby_83EDD3E.gbapal"); +static const u16 Unknown_83EDD5E[] = INCBIN_U16("graphics/unknown/ruby_83EDD5E.gbapal"); +static const u16 Unknown_83EDD7E[] = INCBIN_U16("graphics/unknown/ruby_83EDD7E.gbapal"); +#endif // RS + +static const u16 *const gUnknown_083EDDA0[] = { + Unknown_83EDD3E, + Unknown_83EDD5E, + Unknown_83EDD7E +}; + +static const u16 *const gUnknown_083EDDAC = gUnknown_08E95A18 + 16; + +static const u16 Palette_83EDDB0[] = INCBIN_U16("graphics/slot_machine/83EDDB0.gbapal"); +static const u16 Palette_83EDDD0[] = INCBIN_U16("graphics/slot_machine/83EDDD0.gbapal"); +static const u16 Palette_83EDDF0[] = INCBIN_U16("graphics/slot_machine/83EDDF0.gbapal"); + +static const u16 *const gUnknown_083EDE10[] = { + Palette_83EDDB0, + Palette_83EDDD0, + Palette_83EDDF0, + gSlotMachineSpritePalette6 +}; + +static const u16 *const gUnknown_083EDE20 = gSlotMachineSpritePalette6; + +static const u16 gPalette_83EDE24[] = INCBIN_U16("graphics/slot_machine/83EDE24_pal.bin"); + +static const struct SpritePalette gSlotMachineSpritePalettes[] = { + {gSlotMachineSpritePalette0, 0}, + {gSlotMachineSpritePalette1, 1}, + {gSlotMachineSpritePalette2, 2}, + {gSlotMachineSpritePalette3, 3}, + {gSlotMachineSpritePalette4, 4}, + {gSlotMachineSpritePalette5, 5}, + {gSlotMachineSpritePalette6, 6}, + {gSlotMachineSpritePalette4, 7}, + {} +}; + +static const u8 sReelTimeGfx[] = INCBIN_U8("graphics/slot_machine/reel_time.4bpp.lz"); + +static const u16 sReelTimeWindowTilemap[] = INCBIN_U16("graphics/slot_machine/reel_time_window_map.bin"); + +#if DEBUG + +const u8 Str_841B1C4[] = _("SETTEI"); +const u8 Str_841B1CB[] = _("MAWASITA"); +const u8 Str_841B1D4[] = _("MODOSI"); +const u8 Str_841B1DB[] = _("NOMARE"); +const u8 Str_841B1E2[] = _("MAE 7"); +const u8 Str_841B1E8[] = _("LR HENKOU"); +const u8 Str_841B1F3[] = _("START JIDOUSU"); +const u8 Str_841B202[] = _("SELECT SETTEI"); +const u8 Str_841B211[] = _("TYUHSEN"); +const u8 Str_841B219[] = _("CHERRY"); +const u8 Str_841B220[] = _("REPLAY"); +const u8 Str_841B227[] = _("HASUBO"); +const u8 Str_841B22E[] = _("RURIRI"); +const u8 Str_841B235[] = _("INAZU"); +const u8 Str_841B23B[] = _("REG"); +const u8 Str_841B23F[] = _("BIG"); +const u8 Str_841B243[] = _("BD"); +const u8 Str_841B246[] = _("R7"); +const u8 Str_841B249[] = _("B7"); +const u8 Str_841B24C[] = _("A COIN"); +const u8 Str_841B254[] = _("TYUHSEN"); +const u8 Str_841B25C[] = _("UD 100"); +const u8 Str_841B264[] = _("LR 1000"); +const u8 Str_841B26D[] = _("×"); + +// Is this MenuAction2? I'm not sure. +const struct {const u8 *text; void (*func)();} _841B270[] = +{ + {Str_841B219, debug_sub_811B1C4}, + {Str_841B220, debug_sub_811B1EC}, + {Str_841B227, debug_sub_811B210}, + {Str_841B22E, debug_sub_811B238}, + {Str_841B235, debug_sub_811B260}, + {Str_841B23B, debug_sub_811B288}, + {Str_841B23F, debug_sub_811B2B0}, + {Str_841B243, debug_sub_811B2D8}, +}; + +const u8 Str_841B2B0[] = _("·カウントエラーがおきました"); +const u8 Str_841B2BF[] = _("·リールそうさで エラーが おきました"); +const u8 Str_841B2D3[] = _("·フラグオフエラーが おきました"); +const u8 Str_841B2E4[] = _("·ボーナスこやくの エラーが おきました"); + +#endif diff --git a/src/field/start_menu.c b/src/field/start_menu.c index dccf1714e..4904f4a80 100644 --- a/src/field/start_menu.c +++ b/src/field/start_menu.c @@ -28,7 +28,7 @@ #include "strings2.h" #include "task.h" #include "trainer_card.h" -#include "unknown_task.h" +#include "scanline_effect.h" //Menu actions enum { @@ -44,6 +44,11 @@ enum { MENU_ACTION_PLAYER_LINK }; +#if DEBUG +static u32 _debugStartMenu_0 __attribute__((unused)); +static u32 _debugStartMenu_1 __attribute__((unused)); +#endif + static u8 (*saveDialogCallback)(void); static u8 saveDialogTimer; //Number of frames to keep the window on screen after save was completed static bool8 savingComplete; @@ -54,7 +59,7 @@ extern u16 gSpecialVar_Result; extern u8 gUnknown_03004860; -u8 (*gCallback_03004AE8)(void); +u8 (*gMenuCallback)(void); EWRAM_DATA static u8 sStartMenuCursorPos = 0; EWRAM_DATA static u8 sNumStartMenuActions = 0; @@ -132,6 +137,304 @@ static bool32 sub_80719FC(u8 *ptr); static void sub_8071B54(void); static void Task_8071B64(u8 taskId); +#if DEBUG +__attribute__((naked)) +void debug_sub_8075C30() +{ + asm( + " push {lr}\n" + " bl CloseMenu\n" + " bl debug_sub_8075D9C\n" + " mov r0, #0x1\n" + " pop {r1}\n" + " bx r1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075C40() +{ + asm( + " push {r4, r5, r6, r7, lr}\n" + " mov r7, sl\n" + " mov r6, r9\n" + " mov r5, r8\n" + " push {r5, r6, r7}\n" + " lsl r0, r0, #0x18\n" + " lsr r4, r0, #0x18\n" + " lsl r0, r4, #0x2\n" + " add r0, r0, r4\n" + " lsl r0, r0, #0x3\n" + " ldr r1, ._5 @ gTasks\n" + " add r5, r0, r1\n" + " mov r1, #0x0\n" + " ldsh r0, [r5, r1]\n" + " cmp r0, #0x1\n" + " beq ._1 @cond_branch\n" + " cmp r0, #0x1\n" + " bgt ._2 @cond_branch\n" + " cmp r0, #0\n" + " beq ._3 @cond_branch\n" + " b ._18\n" + "._6:\n" + " .align 2, 0\n" + "._5:\n" + " .word gTasks+0x8\n" + "._2:\n" + " cmp r0, #0x2\n" + " beq ._7 @cond_branch\n" + " cmp r0, #0x3\n" + " beq ._8 @cond_branch\n" + " b ._18\n" + "._3:\n" + " bl m4aSoundVSyncOff\n" + " b ._12\n" + "._1:\n" + " ldr r1, ._13 @ 0x4000208\n" + " ldrh r0, [r1]\n" + " mov sl, r0\n" + " mov r0, #0x0\n" + " strh r0, [r1]\n" + " ldr r1, ._13 + 4 @ 0x4000108\n" + " strh r0, [r1]\n" + " mov r0, #0x83\n" + " lsl r0, r0, #0x10\n" + " str r0, [r1]\n" + " ldr r4, ._13 + 8 @ 0xc34f\n" + " mov r9, r4\n" + " ldr r2, ._13 + 12 @ 0x40000b0\n" + " ldr r0, ._13 + 16 @ gScanlineEffectRegBuffers\n" + " mov ip, r0\n" + " ldr r1, ._13 + 20 @ 0xc5ff\n" + " mov r8, r1\n" + " ldr r7, ._13 + 24 @ 0x7fff\n" + " mov r3, r9\n" + " add r3, r3, #0x1\n" + " ldr r6, ._13 + 28 @ 0x4000040\n" + " ldr r4, ._13 + 32 @ 0xa2600001\n" + "._11:\n" + " mov r0, ip\n" + " str r0, [r2]\n" + " str r6, [r2, #0x4]\n" + " str r4, [r2, #0x8]\n" + " ldr r0, [r2, #0x8]\n" + " ldrh r1, [r2, #0xa]\n" + " mov r0, r8\n" + " and r0, r0, r1\n" + " strh r0, [r2, #0xa]\n" + " ldrh r1, [r2, #0xa]\n" + " add r0, r7, #0\n" + " and r0, r0, r1\n" + " strh r0, [r2, #0xa]\n" + " ldrh r0, [r2, #0xa]\n" + " sub r3, r3, #0x1\n" + " cmp r3, #0\n" + " bne ._11 @cond_branch\n" + " mov r3, r9\n" + " add r3, r3, #0x1\n" + " ldr r0, ._13 + 36 @ 0x400010a\n" + " mov r2, #0x0\n" + " strh r2, [r0]\n" + " ldr r1, ._13 + 4 @ 0x4000108\n" + " ldrh r0, [r1]\n" + " ldr r4, ._13 + 40 @ _debugStartMenu_0\n" + " str r0, [r4]\n" + " strh r2, [r1]\n" + " ldr r0, ._13 @ 0x4000208\n" + " mov r1, sl\n" + " strh r1, [r0]\n" + " ldr r4, ._13 + 44 @ _debugStartMenu_1\n" + " str r3, [r4]\n" + " bl m4aSoundVSyncOn\n" + " b ._12\n" + "._14:\n" + " .align 2, 0\n" + "._13:\n" + " .word 0x4000208\n" + " .word 0x4000108\n" + " .word 0xc34f\n" + " .word 0x40000b0\n" + " .word gScanlineEffectRegBuffers\n" + " .word 0xc5ff\n" + " .word 0x7fff\n" + " .word 0x4000040\n" + " .word 0xa2600001\n" + " .word 0x400010a\n" + " .word _debugStartMenu_0\n" + " .word _debugStartMenu_1\n" + "._7:\n" + " mov r0, #0x15\n" + " bl PlaySE\n" + " ldr r0, ._16 @ gStringVar1\n" + " ldr r1, ._16 + 4 @ _debugStartMenu_1\n" + " ldr r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl ConvertIntToDecimalStringN\n" + " ldr r0, ._16 + 8 @ gStringVar2\n" + " ldr r1, ._16 + 12 @ _debugStartMenu_0\n" + " ldr r1, [r1]\n" + " mov r2, #0x1\n" + " mov r3, #0x8\n" + " bl ConvertIntToDecimalStringN\n" + " bl Menu_DisplayDialogueFrame\n" + " ldr r0, ._16 + 16 @ gUnknown_Debug_839B6D8\n" + " mov r1, #0x2\n" + " mov r2, #0xf\n" + " bl Menu_PrintText\n" + "._12:\n" + " ldrh r0, [r5]\n" + " add r0, r0, #0x1\n" + " strh r0, [r5]\n" + " b ._18\n" + "._17:\n" + " .align 2, 0\n" + "._16:\n" + " .word gStringVar1\n" + " .word _debugStartMenu_1\n" + " .word gStringVar2\n" + " .word _debugStartMenu_0\n" + " .word gUnknown_Debug_839B6D8\n" + "._8:\n" + " ldr r0, ._19 @ gMain\n" + " ldrh r1, [r0, #0x2e]\n" + " mov r0, #0x1\n" + " and r0, r0, r1\n" + " cmp r0, #0\n" + " beq ._18 @cond_branch\n" + " bl Menu_EraseScreen\n" + " bl ScriptContext2_Disable\n" + " add r0, r4, #0\n" + " bl DestroyTask\n" + "._18:\n" + " pop {r3, r4, r5}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " mov sl, r5\n" + " pop {r4, r5, r6, r7}\n" + " pop {r0}\n" + " bx r0\n" + "._20:\n" + " .align 2, 0\n" + "._19:\n" + " .word gMain\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075D9C() +{ + asm( + " push {lr}\n" + " ldr r0, ._21 @ debug_sub_8075C40\n" + " mov r1, #0xa\n" + " bl CreateTask\n" + " bl ScriptContext2_Enable\n" + " pop {r0}\n" + " bx r0\n" + "._22:\n" + " .align 2, 0\n" + "._21:\n" + " .word debug_sub_8075C40+1\n" + "\n" + ); +} + +__attribute__((naked)) +void debug_sub_8075DB4() +{ + asm( + " push {r4, r5, r6, lr}\n" + " add r6, r0, #0\n" + " add r5, r1, #0\n" + " add r4, r2, #0\n" + " add r0, r4, #0\n" + " mov r1, #0x4d\n" + " bl __umodsi3\n" + " strb r0, [r6, #0x1]\n" + " add r1, r6, #0\n" + " add r1, r1, #0xc\n" + " add r0, r4, #0\n" + " bl write_word_to_mem\n" + " add r0, r6, #4\n" + " add r1, r5, #0\n" + " bl StringCopy8\n" + " mov r3, #0x7\n" + " mov r4, #0x0\n" + " ldr r0, ._25 @ gSaveBlock1\n" + " ldr r1, ._25 + 4 @ 0x2b28\n" + " add r5, r0, r1\n" + " add r2, r6, #0\n" + " add r2, r2, #0x10\n" + " add r1, r6, #0\n" + " add r1, r1, #0x1c\n" + "._23:\n" + " ldrh r0, [r5]\n" + " strh r0, [r2]\n" + " strh r3, [r1]\n" + " add r0, r3, #6\n" + " strh r0, [r1, #0xc]\n" + " add r3, r3, #0x1\n" + " add r5, r5, #0x2\n" + " add r2, r2, #0x2\n" + " add r1, r1, #0x2\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x5\n" + " ble ._23 @cond_branch\n" + " mov r4, #0x0\n" + "._24:\n" + " mov r0, #0x64\n" + " mul r0, r0, r4\n" + " ldr r1, ._25 + 8 @ gPlayerParty\n" + " add r0, r0, r1\n" + " mov r1, #0x2c\n" + " mul r1, r1, r4\n" + " add r1, r1, #0x34\n" + " add r1, r6, r1\n" + " bl sub_803AF78\n" + " add r4, r4, #0x1\n" + " cmp r4, #0x2\n" + " ble ._24 @cond_branch\n" + " add r0, r6, #0\n" + " bl SetEReaderTrainerChecksum\n" + " pop {r4, r5, r6}\n" + " pop {r0}\n" + " bx r0\n" + "._26:\n" + " .align 2, 0\n" + "._25:\n" + " .word gSaveBlock1\n" + " .word 0x2b28\n" + " .word gPlayerParty\n" + "\n" + ); +} + +__attribute__((naked)) +void unref_sub_8070F90() +{ + asm( + " push {lr}\n" + " ldr r0, ._27 @ 0x801\n" + " bl FlagSet\n" + " mov r0, #0x80\n" + " lsl r0, r0, #0x4\n" + " bl FlagSet\n" + " ldr r0, ._27 + 4 @ 0x802\n" + " bl FlagSet\n" + " pop {r0}\n" + " bx r0\n" + "._28:\n" + " .align 2, 0\n" + "._27:\n" + " .word 0x801\n" + " .word 0x802\n" + "\n" + ); +} +#endif static void BuildStartMenuActions(void) { @@ -193,8 +496,8 @@ static void BuildStartMenuActions_Link(void) static void DisplaySafariBallsWindow(void) { sub_8072C44(gStringVar1, gNumSafariBalls, 12, 1); - MenuDrawTextWindow(0, 0, 10, 5); - MenuPrint(gOtherText_SafariStock, 1, 1); + Menu_DrawStdWindowFrame(0, 0, 10, 5); + Menu_PrintText(gOtherText_SafariStock, 1, 1); } //Prints n menu items starting at *index @@ -204,7 +507,7 @@ static bool32 PrintStartMenuItemsMultistep(s16 *index, u32 n) do { - MenuPrint(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); + Menu_PrintText(sStartMenuItems[sCurrentStartMenuActions[_index]].text, 23, 2 + _index * 2); _index++; if (_index >= sNumStartMenuActions) { @@ -226,7 +529,7 @@ static bool32 InitStartMenuMultistep(s16 *step, s16 *index) (*step)++; break; case 2: - MenuDrawTextWindow(22, 0, 29, sNumStartMenuActions * 2 + 3); + Menu_DrawStdWindowFrame(22, 0, 29, sNumStartMenuActions * 2 + 3); *index = 0; (*step)++; break; @@ -271,7 +574,7 @@ void CreateStartMenuTask(void (*func)(u8)) { u8 taskId; - InitMenuWindow(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); taskId = CreateTask(Task_StartMenu, 0x50); SetTaskFuncWithFollowupFunc(taskId, Task_StartMenu, func); } @@ -283,11 +586,11 @@ void sub_80712B4(u8 taskId) switch (task->data[0]) { case 0: - gCallback_03004AE8 = StartMenu_InputProcessCallback; + gMenuCallback = StartMenu_InputProcessCallback; task->data[0]++; break; case 1: - if (gCallback_03004AE8() == 1) + if (gMenuCallback() == 1) DestroyTask(taskId); break; } @@ -310,12 +613,12 @@ static u8 StartMenu_InputProcessCallback(void) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(-1); + sStartMenuCursorPos = Menu_MoveCursor(-1); } if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - sStartMenuCursorPos = MoveMenuCursor(1); + sStartMenuCursorPos = Menu_MoveCursor(1); } if (gMain.newKeys & A_BUTTON) { @@ -325,11 +628,11 @@ static u8 StartMenu_InputProcessCallback(void) if (GetNationalPokedexCount(0) == 0) return 0; } - gCallback_03004AE8 = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func; - if (gCallback_03004AE8 != StartMenu_SaveCallback && - gCallback_03004AE8 != StartMenu_ExitCallback && - gCallback_03004AE8 != StartMenu_RetireCallback) - fade_screen(1, 0); + gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func; + if (gMenuCallback != StartMenu_SaveCallback && + gMenuCallback != StartMenu_ExitCallback && + gMenuCallback != StartMenu_RetireCallback) + FadeScreen(1, 0); return 0; } if (gMain.newKeys & (START_BUTTON | B_BUTTON)) @@ -345,7 +648,7 @@ static u8 StartMenu_PokedexCallback(void) { if (!gPaletteFade.active) { - IncrementGameStat(0x29); + IncrementGameStat(GAME_STAT_CHECKED_POKEDEX); PlayRainSoundEffect(); SetMainCallback2(CB2_InitPokedex); return 1; @@ -395,7 +698,7 @@ static u8 StartMenu_PlayerCallback(void) if (!gPaletteFade.active) { PlayRainSoundEffect(); - sub_8093110(sub_805469C); + TrainerCard_ShowPlayerCard(sub_805469C); return 1; } return 0; @@ -404,8 +707,8 @@ static u8 StartMenu_PlayerCallback(void) //When player selects SAVE static u8 StartMenu_SaveCallback(void) { - HandleDestroyMenuCursors(); - gCallback_03004AE8 = SaveCallback1; + Menu_DestroyCursor(); + gMenuCallback = SaveCallback1; return 0; } @@ -443,7 +746,7 @@ static u8 StartMenu_PlayerLinkCallback(void) if (!gPaletteFade.active) { PlayRainSoundEffect(); - sub_8093130(gUnknown_03004860, sub_805469C); + TrainerCard_ShowLinkCard(gUnknown_03004860, sub_805469C); return 1; } return 0; @@ -461,7 +764,7 @@ enum static u8 SaveCallback1(void) { sub_807160C(); - gCallback_03004AE8 = SaveCallback2; + gMenuCallback = SaveCallback2; return FALSE; } @@ -473,13 +776,13 @@ static u8 SaveCallback2(void) return FALSE; case SAVE_CANCELED: //Go back to start menu - MenuZeroFillScreen(); + Menu_EraseScreen(); InitStartMenu(); - gCallback_03004AE8 = StartMenu_InputProcessCallback; + gMenuCallback = StartMenu_InputProcessCallback; return FALSE; case SAVE_SUCCESS: case SAVE_ERROR: - MenuZeroFillScreen(); + Menu_EraseScreen(); sub_8064E2C(); ScriptContext2_Disable(); return TRUE; @@ -498,7 +801,7 @@ static u8 RunSaveDialogCallback(void) { if (savingComplete) { - if (!MenuUpdateWindowText()) + if (!Menu_UpdateWindowText()) return 0; } savingComplete = FALSE; @@ -514,7 +817,7 @@ void ScrSpecial_DoSaveDialog(void) static void DisplaySaveMessageWithCallback(const u8 *ptr, u8 (*func)(void)) { StringExpandPlaceholders(gStringVar4, ptr); - MenuDisplayMessageBox(); + Menu_DisplayDialogueFrame(); MenuPrintMessageDefaultCoords(gStringVar4); savingComplete = TRUE; saveDialogCallback = func; @@ -547,7 +850,7 @@ static void sub_8071700(void) static void HideSaveDialog(void) { - MenuZeroFillWindowRect(20, 8, 26, 13); + Menu_EraseWindowRect(20, 8, 26, 13); } static void SaveDialogStartTimeout(void) @@ -579,7 +882,7 @@ static bool8 SaveDialogCheckForTimeoutAndKeypress(void) static u8 SaveDialogCB_DisplayConfirmMessage(void) { - MenuZeroFillScreen(); + Menu_EraseScreen(); HandleDrawSaveWindowInfo(0, 0); DisplaySaveMessageWithCallback(gSaveText_WouldYouLikeToSave, SaveDialogCB_DisplayConfirmYesNoMenu); return SAVE_IN_PROGRESS; @@ -594,7 +897,7 @@ static u8 SaveDialogCB_DisplayConfirmYesNoMenu(void) static u8 SaveDialogCB_ProcessConfirmYesNoMenu(void) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: //YES HideSaveDialog(); @@ -640,7 +943,7 @@ static u8 SaveDialogCB_DisplayOverwriteYesNoMenu(void) static u8 SaveDialogCB_ProcessOverwriteYesNoMenu(void) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: //YES HideSaveDialog(); @@ -664,20 +967,20 @@ static u8 SaveDialogCB_DisplaySavingMessage(void) static u8 SaveDialogCB_DoSave(void) { - bool8 saveSucceeded; + u8 saveStatus; - IncrementGameStat(0); + IncrementGameStat(GAME_STAT_SAVED_GAME); if (gDifferentSaveFile == TRUE) { - saveSucceeded = TrySavingData(DIFFERENT_FILE_SAVE); + saveStatus = Save_WriteData(SAVE_OVERWRITE_DIFFERENT_FILE); gDifferentSaveFile = FALSE; } else { - saveSucceeded = TrySavingData(NORMAL_SAVE); + saveStatus = Save_WriteData(SAVE_NORMAL); } - if (saveSucceeded == TRUE) + if (saveStatus == SAVE_STATUS_OK) { //"(Player) saved the game." DisplaySaveMessageWithCallback(gSaveText_PlayerSavedTheGame, SaveDialogCB_SaveSuccess); @@ -694,7 +997,7 @@ static u8 SaveDialogCB_DoSave(void) static u8 SaveDialogCB_SaveSuccess(void) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { PlaySE(SE_SAVE); saveDialogCallback = SaveDialogCB_ReturnSuccess; @@ -715,7 +1018,7 @@ static u8 SaveDialogCB_ReturnSuccess(void) static u8 SaveDialogCB_SaveError(void) { - if (MenuUpdateWindowText()) + if (Menu_UpdateWindowText()) { PlaySE(SE_BOO); saveDialogCallback = SaveDialogCB_ReturnError; @@ -744,38 +1047,21 @@ static bool32 sub_80719FC(u8 *step) switch (*step) { case 0: - { - u8 *addr; - u32 size; - REG_DISPCNT = 0; SetVBlankCallback(NULL); - remove_some_task(); + ScanlineEffect_Stop(); DmaClear16(3, PLTT, PLTT_SIZE); - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); break; - } case 1: ResetSpriteData(); ResetTasks(); ResetPaletteFade(); - dp12_8087EA4(); + ScanlineEffect_Clear(); break; case 2: - SetUpWindowConfig(&gWindowConfig_81E6CE4); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6CE4); + InitMenuWindow(&gWindowTemplate_81E6CE4); REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_BG0_ON; break; case 3: @@ -821,8 +1107,8 @@ static void Task_8071B64(u8 taskId) switch (*step) { case 0: - MenuDisplayMessageBox(); - MenuPrint(gSystemText_Saving, 2, 15); + Menu_DisplayDialogueFrame(); + Menu_PrintText(gSystemText_Saving, 2, 15); BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); (*step)++; break; diff --git a/src/field/starter_choose.c b/src/field/starter_choose.c index 701d4087a..418488774 100644 --- a/src/field/starter_choose.c +++ b/src/field/starter_choose.c @@ -14,7 +14,7 @@ #include "strings.h" #include "task.h" #include "trig.h" -#include "unknown_task.h" +#include "scanline_effect.h" extern u16 gSpecialVar_Result; extern struct SpriteTemplate gUnknown_02024E8C; @@ -285,7 +285,7 @@ void CB2_ChooseStarter(void) LZ77UnCompVram(&gBirchHelpGfx, (void *)VRAM); LZ77UnCompVram(&gBirchBagTilemap, (void *)(VRAM + 0x3000)); LZ77UnCompVram(&gBirchGrassTilemap, (void *)(VRAM + 0x3800)); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); @@ -294,8 +294,8 @@ void CB2_ChooseStarter(void) LoadCompressedObjectPic(&gUnknown_083F7794[0]); LoadCompressedObjectPic(&gUnknown_083F77A4[0]); LoadSpritePalettes(gUnknown_083F77B4); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); savedIme = REG_IME; @@ -355,8 +355,8 @@ static void MainCallback2(void) static void Task_StarterChoose1(u8 taskId) { CreateStarterPokemonLabel(0xFF, gTasks[taskId].tStarterSelection); - MenuDrawTextWindow(2, 14, 27, 19); - MenuPrint(gOtherText_BirchInTrouble, 3, 15); + Menu_DrawStdWindowFrame(2, 14, 27, 19); + Menu_PrintText(gOtherText_BirchInTrouble, 3, 15); gTasks[taskId].func = Task_StarterChoose2; } @@ -368,7 +368,7 @@ static void Task_StarterChoose2(u8 taskId) { u8 spriteId; - MenuZeroFillWindowRect( + Menu_EraseWindowRect( gStarterChoose_LabelCoords[selection][0], gStarterChoose_LabelCoords[selection][1], gStarterChoose_LabelCoords[selection][0] + 13, @@ -424,9 +424,9 @@ static void Task_StarterChoose3(u8 taskId) static void Task_StarterChoose4(u8 taskId) { PlayCry1(GetStarterPokemon(gTasks[taskId].tStarterSelection), 0); - MenuDrawTextWindow(2, 14, 27, 19); + Menu_DrawStdWindowFrame(2, 14, 27, 19); //"Do you choose this POKEMON?" - MenuPrint(gOtherText_DoYouChoosePoke, 3, 15); + Menu_PrintText(gOtherText_DoYouChoosePoke, 3, 15); DisplayYesNoMenu(21, 7, 1); gTasks[taskId].func = Task_StarterChoose5; } @@ -435,7 +435,7 @@ static void Task_StarterChoose5(u8 taskId) { u8 spriteId; - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: // YES //Return the starter choice and exit. @@ -445,7 +445,7 @@ static void Task_StarterChoose5(u8 taskId) case 1: // NO case -1: // B button PlaySE(SE_SELECT); - MenuZeroFillWindowRect(21, 7, 27, 12); + Menu_EraseWindowRect(21, 7, 27, 12); spriteId = gTasks[taskId].tPkmnSpriteId; FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(gSprites[spriteId].oam.paletteNum)); @@ -498,7 +498,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) if (prevSelection != 0xFF) { //Remove the old Pokemon label - MenuZeroFillWindowRect( + Menu_EraseWindowRect( gStarterChoose_LabelCoords[prevSelection][0], gStarterChoose_LabelCoords[prevSelection][1], gStarterChoose_LabelCoords[prevSelection][0] + 13, @@ -527,7 +527,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) //Copy POKEMON string to label StringCopy(labelText + dstIndex, gOtherText_Poke); - MenuPrint( + Menu_PrintText( labelText, gStarterChoose_LabelCoords[selection][0], gStarterChoose_LabelCoords[selection][1]); @@ -535,7 +535,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) //Copy Pokemon name to label sub_8072C74(labelText + 5, gSpeciesNames[species], 0x6B, 1); - MenuPrint( + Menu_PrintText( labelText, gStarterChoose_LabelCoords[selection][0], gStarterChoose_LabelCoords[selection][1] + 2); @@ -574,7 +574,7 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) adds r3, r1, 0x3\n\ lsls r3, 24\n\ lsrs r3, 24\n\ - bl MenuZeroFillWindowRect\n\ + bl Menu_EraseWindowRect\n\ ldr r0, _0810A964 @ =0x04000040\n\ movs r1, 0\n\ strh r1, [r0]\n\ @@ -649,7 +649,7 @@ _0810A8CA:\n\ mov r0, sp\n\ adds r1, r4, 0\n\ adds r2, r5, 0\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ mov r0, sp\n\ movs r1, 0\n\ movs r2, 0xF\n\ @@ -669,7 +669,7 @@ _0810A8CA:\n\ lsrs r2, 24\n\ mov r0, sp\n\ adds r1, r4, 0\n\ - bl MenuPrint\n\ + bl Menu_PrintText\n\ lsls r0, r4, 3\n\ adds r0, 0x4\n\ lsls r0, 24\n\ diff --git a/src/field/trader.c b/src/field/trader.c index 61cb0b4a2..885557d5a 100644 --- a/src/field/trader.c +++ b/src/field/trader.c @@ -100,7 +100,7 @@ void CreateAvailableDecorationsMenu(u8 taskId) } } - MenuDrawTextWindow(0, 1, 12, numChoices * 2 + 2); + Menu_DrawStdWindowFrame(0, 1, 12, numChoices * 2 + 2); for (i = 0; i < 4; i++) { @@ -108,18 +108,18 @@ void CreateAvailableDecorationsMenu(u8 taskId) { if (trader->unk1[i] > DECOR_REGISTEEL_DOLL) { - MenuPrint(gOtherText_FiveQuestionsAndSlash, 1, numDecorations * 2 + 2); + Menu_PrintText(gOtherText_FiveQuestions, 1, numDecorations * 2 + 2); } else { - MenuPrint(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); + Menu_PrintText(gDecorations[trader->unk1[i]].name, 1, numDecorations * 2 + 2); } numDecorations++; } } - MenuPrint(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); + Menu_PrintText(gOtherText_CancelNoTerminator, 1, numDecorations * 2 + 2); InitMenu(0, 1, 2, numChoices, 0, 11); gTasks[taskId].data[1] = numDecorations; } @@ -135,8 +135,8 @@ void sub_8109B34(u8 taskId, u8 decorationId) gSpecialVar_0x8004 = decorationId; } - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 1, 12, 12); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 1, 12, 12); DestroyTask(taskId); EnableBothScriptContexts(); } @@ -148,17 +148,17 @@ void Task_HandleGetDecorationMenuInput(u8 taskId) if (gMain.newKeys & DPAD_UP) { PlaySE(SE_SELECT); - MoveMenuCursor(-1); + Menu_MoveCursor(-1); } else if (gMain.newKeys & DPAD_DOWN) { PlaySE(SE_SELECT); - MoveMenuCursor(1); + Menu_MoveCursor(1); } else if (gMain.newKeys & A_BUTTON) { PlaySE(SE_SELECT); - gSpecialVar_0x8005 = GetMenuCursorPos(); + gSpecialVar_0x8005 = Menu_GetCursorPos(); if (gTasks[taskId].data[1] == gSpecialVar_0x8005) { sub_8109B34(taskId, 0); @@ -215,10 +215,10 @@ void ScrSpecial_TraderMenuGiveDecoration(void) void sub_8109D04(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); - DestroyVerticalScrollIndicator(0); - DestroyVerticalScrollIndicator(1); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); + DestroyVerticalScrollIndicator(TOP_ARROW); + DestroyVerticalScrollIndicator(BOTTOM_ARROW); sub_80F9520(gUnknown_020388F7, 8); BuyMenuFreeMemory(); if (sub_80FEFA4() == TRUE) @@ -237,8 +237,8 @@ void sub_8109D04(u8 taskId) void sub_8109DAC(u8 taskId) { - HandleDestroyMenuCursors(); - MenuZeroFillWindowRect(0, 0, 29, 19); + Menu_DestroyCursor(); + Menu_EraseWindowRect(0, 0, 29, 19); gSpecialVar_0x8006 = 0; DestroyTask(taskId); EnableBothScriptContexts(); diff --git a/src/field/tv.c b/src/field/tv.c index d7a75a709..8bd36bb9c 100644 --- a/src/field/tv.c +++ b/src/field/tv.c @@ -47,8 +47,6 @@ struct UnkTvStruct s8 var0; }; -extern u8 gUnknown_0300430A[11]; - struct OutbreakPokemon { /*0x00*/ u16 species; @@ -64,7 +62,7 @@ struct TVSaleItem { extern u8 gUnknown_02038694; -extern struct TVSaleItem gUnknown_02038724[3]; +extern struct TVSaleItem gMartPurchaseHistory[3]; struct UnkTvStruct gUnknown_03005D38; @@ -811,7 +809,7 @@ u8 sub_80BDEAC(u8 *a0) return lang; } -void sub_80BDEC8(void) +void PutPokemonTodayCaughtOnAir(void) { u8 i; u16 total; @@ -864,7 +862,7 @@ void sub_80BDEC8(void) sub_80BE138((TVShow *)pokemonToday); pokemonToday->language = GAME_LANGUAGE; pokemonToday->language2 = sub_80BDEAC(pokemonToday->nickname); - StripExtCtrlCodes(pokemonToday->nickname); + Text_StripExtCtrlCodes(pokemonToday->nickname); } } } @@ -966,7 +964,7 @@ void InterviewAfter_BravoTrainerPokemonProfile(void) sub_80BE160((TVShow *)bravoTrainerNew); bravoTrainerNew->language = GAME_LANGUAGE; bravoTrainerNew->var1f = sub_80BDEAC(bravoTrainerNew->pokemonNickname); - StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); + Text_StripExtCtrlCodes(bravoTrainerNew->pokemonNickname); } } @@ -1032,7 +1030,7 @@ void sub_80BE3BC(void) if (gUnknown_03005D38.var0 != -1 && sub_80BF1B4(TVSHOW_SMART_SHOPPER) != 1) { sub_80BF20C(); - if (gUnknown_02038724[0].item_amount >= 20) + if (gMartPurchaseHistory[0].item_amount >= 20) { struct TVShowSmartShopper *smartShopper = &gSaveBlock1.tvShows[gUnknown_03005D38.var0].smartshopperShow; @@ -1041,8 +1039,8 @@ void sub_80BE3BC(void) smartShopper->shopLocation = gMapHeader.regionMapSectionId; for (i=0; i<3; i++) { - smartShopper->itemIds[i] = gUnknown_02038724[i].item_id; - smartShopper->itemAmounts[i] = gUnknown_02038724[i].item_amount; + smartShopper->itemIds[i] = gMartPurchaseHistory[i].item_id; + smartShopper->itemAmounts[i] = gMartPurchaseHistory[i].item_amount; } smartShopper->priceReduced = GetPriceReduction(1); StringCopy(smartShopper->playerName, gSaveBlock2.playerName); @@ -1075,7 +1073,7 @@ void sub_80BE478(void) sub_80BE160((TVShow *)nameRaterShow); nameRaterShow->language = GAME_LANGUAGE; nameRaterShow->pokemonNameLanguage = sub_80BDEAC(nameRaterShow->pokemonName); - StripExtCtrlCodes(nameRaterShow->pokemonName); + Text_StripExtCtrlCodes(nameRaterShow->pokemonName); } } @@ -1138,7 +1136,7 @@ void InterviewAfter_PkmnFanClubOpinions(void) sub_80BE160((TVShow *)fanclubOpinions); fanclubOpinions->language = GAME_LANGUAGE; fanclubOpinions->var0E = sub_80BDEAC(fanclubOpinions->var10); - StripExtCtrlCodes(fanclubOpinions->var10); + Text_StripExtCtrlCodes(fanclubOpinions->var10); } void InterviewAfter_DummyShow4(void) @@ -1646,14 +1644,14 @@ void sub_80BF20C(void) { for (j = i + 1; j < 3; j++) { - if (gUnknown_02038724[i].item_amount < gUnknown_02038724[j].item_amount) + if (gMartPurchaseHistory[i].item_amount < gMartPurchaseHistory[j].item_amount) { - tmpId = gUnknown_02038724[i].item_id; - tmpAmount = gUnknown_02038724[i].item_amount; - gUnknown_02038724[i].item_id = gUnknown_02038724[j].item_id; - gUnknown_02038724[i].item_amount = gUnknown_02038724[j].item_amount; - gUnknown_02038724[j].item_id = tmpId; - gUnknown_02038724[j].item_amount = tmpAmount; + tmpId = gMartPurchaseHistory[i].item_id; + tmpAmount = gMartPurchaseHistory[i].item_amount; + gMartPurchaseHistory[i].item_id = gMartPurchaseHistory[j].item_id; + gMartPurchaseHistory[i].item_amount = gMartPurchaseHistory[j].item_amount; + gMartPurchaseHistory[j].item_id = tmpId; + gMartPurchaseHistory[j].item_amount = tmpAmount; } } } diff --git a/src/field/use_pokeblock.c b/src/field/use_pokeblock.c index 7253ac901..8ea93aab8 100644 --- a/src/field/use_pokeblock.c +++ b/src/field/use_pokeblock.c @@ -104,7 +104,6 @@ static EWRAM_DATA struct Pokeblock *gUnknown_0203930C = NULL; EWRAM_DATA u8 gPokeblockMonID = 0; EWRAM_DATA s16 gPokeblockGain = 0; -extern u16 gKeyRepeatStartDelay; extern u16 gSpecialVar_ItemId; // FIXME: remove after merge of #349 Pokeblock static void launch_c3_walk_stairs_and_run_once(void (*const)(void)); @@ -117,7 +116,7 @@ static void sub_81365A0(void); static void sub_81365C8(void); static void sub_8136638(void); static void sub_81368A4(void); -void sub_8089668(void); +void ScanlineEffect_InitHBlankDmaTransfer(void); static void sub_8136B44(void); static u8 sub_81370E4(u8); static void sub_8136BB8(void); @@ -194,7 +193,7 @@ static void sub_8136264(void) ProcessSpriteCopyRequests(); TransferPlttBuffer(); sub_80F5CDC(6); - sub_8089668(); + ScanlineEffect_InitHBlankDmaTransfer(); } static void launch_c3_walk_stairs_and_run_once(void (*const func)(void)) @@ -228,11 +227,11 @@ static void sub_8136294(void) gUnknown_02039304->unk50++; break; case 3: - SetUpWindowConfig(&gWindowConfig_81E7080); + Text_LoadWindowTemplate(&gWindowTemplate_81E7080); gUnknown_02039304->unk50++; break; case 4: - MultistepInitMenuWindowBegin(&gWindowConfig_81E7080); + MultistepInitMenuWindowBegin(&gWindowTemplate_81E7080); gUnknown_02039304->unk50++; break; case 5: @@ -610,28 +609,28 @@ static void sub_8136BB8(void) GetMonData(&gPlayerParty[sub_81370A4(gUnknown_083DFEC4->unk87DC)], MON_DATA_NICKNAME, gUnknown_02039304->stringBuffer); StringGetEnd10(gUnknown_02039304->stringBuffer); StringAppend(gUnknown_02039304->stringBuffer, gOtherText_GetsAPokeBlock); - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(gUnknown_02039304->stringBuffer, 1, 17); + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(gUnknown_02039304->stringBuffer, 1, 17); DisplayYesNoMenu(23, 10, 1); - MoveMenuCursor(0); + Menu_MoveCursor(0); } static s8 sub_8136C40(void) { - s8 retval = ProcessMenuInputNoWrap(); + s8 retval = Menu_ProcessInputNoWrap(); if ((u8)(retval + 1) < 3) { - MenuZeroFillScreen(); - BasicInitMenuWindow(&gWindowConfig_81E7080); + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7080); } return retval; } static void sub_8136C6C(void) { - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(0, 16, 29, 19); + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); for (gUnknown_02039304->unk53 = 0; gUnknown_02039304->unk53 < 5 && gUnknown_02039304->unk61[gUnknown_02039304->unk53] == 0; gUnknown_02039304->unk53++); if (gUnknown_02039304->unk53 < 5) { @@ -667,21 +666,21 @@ static bool8 sub_8136D00(void) static void sub_8136D60(void) { - BasicInitMenuWindow(&gWindowConfig_81E709C); - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(gOtherText_WontEat, 1, 17); + BasicInitMenuWindow(&gWindowTemplate_81E709C); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(gOtherText_WontEat, 1, 17); } static void sub_8136D8C(void) { - MenuZeroFillScreen(); - BasicInitMenuWindow(&gWindowConfig_81E7080); + Menu_EraseScreen(); + BasicInitMenuWindow(&gWindowTemplate_81E7080); } static void Pokeblock_MenuWindowTextPrint(const u8 *message) { - MenuDrawTextWindow(0, 16, 29, 19); - MenuPrint(message, 1, 17); + Menu_DrawStdWindowFrame(0, 16, 29, 19); + Menu_PrintText(message, 1, 17); } #ifdef NONMATCHING diff --git a/src/field/wallclock.c b/src/field/wallclock.c index 2892d09f9..1f743a61a 100644 --- a/src/field/wallclock.c +++ b/src/field/wallclock.c @@ -10,7 +10,7 @@ #include "strings2.h" #include "task.h" #include "trig.h" -#include "unknown_task.h" +#include "scanline_effect.h" extern u16 gSpecialVar_0x8004; extern u8 gMiscClock_Gfx[]; @@ -190,10 +190,7 @@ static void WallClockVblankCallback(void) static void LoadWallClockGraphics(void) { - u8 *addr; - u32 size; - - SetVBlankCallback(0); + SetVBlankCallback(NULL); REG_DISPCNT = 0; REG_BG3CNT = 0; REG_BG2CNT = 0; @@ -208,19 +205,7 @@ static void LoadWallClockGraphics(void) REG_BG0HOFS = 0; REG_BG0VOFS = 0; - addr = (void *)VRAM; - size = 0x18000; - while (1) - { - DmaFill16(3, 0, addr, 0x1000); - addr += 0x1000; - size -= 0x1000; - if (size <= 0x1000) - { - DmaFill16(3, 0, addr, size); - break; - } - } + DmaFill16Large(3, 0, (void *)(VRAM + 0x0), 0x18000, 0x1000); DmaClear32(3, OAM, OAM_SIZE); DmaClear16(3, PLTT, PLTT_SIZE); @@ -229,15 +214,15 @@ static void LoadWallClockGraphics(void) LoadPalette(gMiscClockMale_Pal, 0, 32); else LoadPalette(gMiscClockFemale_Pal, 0, 32); - remove_some_task(); + ScanlineEffect_Stop(); ResetTasks(); ResetSpriteData(); ResetPaletteFade(); FreeAllSpritePalettes(); LoadCompressedObjectPic(&gUnknown_083F7A90[0]); LoadSpritePalettes(gUnknown_083F7AA0); - SetUpWindowConfig(&gWindowConfig_81E6C3C); - InitMenuWindow(&gWindowConfig_81E6CE4); + Text_LoadWindowTemplate(&gWindowTemplate_81E6C3C); + InitMenuWindow(&gWindowTemplate_81E6CE4); } static void WallClockInit(void) @@ -414,10 +399,10 @@ static void Task_SetClock2(u8 taskId) //Ask player "Is this the correct time?" static void Task_SetClock3(u8 taskId) { - MenuDrawTextWindow(2, 16, 27, 19); - MenuPrint(gOtherText_CorrectTimePrompt, 3, 17); - MenuDrawTextWindow(23, 8, 29, 13); - PrintMenuItems(24, 9, 2, gMenuYesNoItems); + Menu_DrawStdWindowFrame(2, 16, 27, 19); + Menu_PrintText(gOtherText_CorrectTimePrompt, 3, 17); + Menu_DrawStdWindowFrame(23, 8, 29, 13); + Menu_PrintItems(24, 9, 2, gMenuYesNoItems); InitMenu(0, 24, 9, 2, 1, 5); gTasks[taskId].func = Task_SetClock4; } @@ -425,7 +410,7 @@ static void Task_SetClock3(u8 taskId) //Get menu selection static void Task_SetClock4(u8 taskId) { - switch (ProcessMenuInputNoWrap_()) + switch (Menu_ProcessInputNoWrap_()) { case 0: //YES PlaySE(SE_SELECT); @@ -433,10 +418,10 @@ static void Task_SetClock4(u8 taskId) return; case -1: //B button case 1: //NO - HandleDestroyMenuCursors(); + Menu_DestroyCursor(); PlaySE(SE_SELECT); - MenuZeroFillWindowRect(23, 8, 29, 13); - MenuZeroFillWindowRect(2, 16, 27, 19); + Menu_EraseWindowRect(23, 8, 29, 13); + Menu_EraseWindowRect(2, 16, 27, 19); gTasks[taskId].func = Task_SetClock2; //Go back and let player adjust clock } } diff --git a/src/field/wild_encounter.c b/src/field/wild_encounter.c index 4bf83cad8..19778e29b 100644 --- a/src/field/wild_encounter.c +++ b/src/field/wild_encounter.c @@ -3698,13 +3698,13 @@ const u16 gRoute119WaterTileData[] = extern u16 gSpecialVar_Result; extern u8 S_RepelWoreOff[]; -EWRAM_DATA static u8 sWildEncountersDisabled = 0; +EWRAM_DATA u8 sWildEncountersDisabled = 0; EWRAM_DATA static u32 sFeebasRngValue = 0; #define NUM_FEEBAS_SPOTS 6 -static u16 FeebasRandom(void); -static void FeebasSeedRng(u16 seed); +u16 FeebasRandom(void); +void FeebasSeedRng(u16 seed); static bool8 IsWildLevelAllowedByRepel(u8 level); static void ApplyFluteEncounterRateMod(u32 *encRate); @@ -3791,17 +3791,30 @@ static bool8 CheckFeebas(void) return FALSE; } -static u16 FeebasRandom(void) +u16 FeebasRandom(void) { sFeebasRngValue = 12345 + 0x41C64E6D * sFeebasRngValue; return sFeebasRngValue >> 16; } -static void FeebasSeedRng(u16 seed) +void FeebasSeedRng(u16 seed) { sFeebasRngValue = seed; } +#if DEBUG +u16 debug_sub_8092344(u8 arg0) +{ + if (arg0 == 0) + return 131; + if (arg0 == 1) + return 167; + if (arg0 == 2) + return 149; + return 0; +} +#endif + static u8 ChooseWildMonIndex_Land(void) { u8 rand = Random() % 100; @@ -4042,6 +4055,24 @@ static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) return FALSE; } +#if DEBUG +u16 debug_sub_809283C(u16 attempts) +{ + u16 retval = 0; + u16 i = 0; + + while (i < attempts) + { + if (DoWildEncounterRateDiceRoll(320) == TRUE) + retval++; + + i++; + } + + return retval; +} +#endif + static bool8 DoWildEncounterTest(u32 encounterRate, bool8 ignoreAbility) { encounterRate *= 16; @@ -4254,7 +4285,7 @@ void FishingWildEncounter(u8 rod) gWildMonHeaders[GetCurrentMapWildMonHeader()].fishingMonsInfo, rod); } - IncrementGameStat(12); + IncrementGameStat(GAME_STAT_FISHING_CAPTURES); sub_80BEA50(species); BattleSetup_StartWildBattle(); } |